debug.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Cadence USBSS DRD Driver.
  4. * Debug header file.
  5. *
  6. * Copyright (C) 2018-2019 Cadence.
  7. *
  8. * Author: Pawel Laszczak <pawell@cadence.com>
  9. */
  10. #ifndef __LINUX_CDNS3_DEBUG
  11. #define __LINUX_CDNS3_DEBUG
  12. #include "core.h"
  13. static inline char *cdns3_decode_usb_irq(char *str,
  14. enum usb_device_speed speed,
  15. u32 usb_ists)
  16. {
  17. int ret;
  18. ret = sprintf(str, "IRQ %08x = ", usb_ists);
  19. if (usb_ists & (USB_ISTS_CON2I | USB_ISTS_CONI)) {
  20. ret += sprintf(str + ret, "Connection %s\n",
  21. usb_speed_string(speed));
  22. }
  23. if (usb_ists & USB_ISTS_DIS2I || usb_ists & USB_ISTS_DISI)
  24. ret += sprintf(str + ret, "Disconnection ");
  25. if (usb_ists & USB_ISTS_L2ENTI)
  26. ret += sprintf(str + ret, "suspended ");
  27. if (usb_ists & USB_ISTS_L2EXTI)
  28. ret += sprintf(str + ret, "L2 exit ");
  29. if (usb_ists & USB_ISTS_U3EXTI)
  30. ret += sprintf(str + ret, "U3 exit ");
  31. if (usb_ists & USB_ISTS_UWRESI)
  32. ret += sprintf(str + ret, "Warm Reset ");
  33. if (usb_ists & USB_ISTS_UHRESI)
  34. ret += sprintf(str + ret, "Hot Reset ");
  35. if (usb_ists & USB_ISTS_U2RESI)
  36. ret += sprintf(str + ret, "Reset");
  37. return str;
  38. }
  39. static inline char *cdns3_decode_ep_irq(char *str,
  40. u32 ep_sts,
  41. const char *ep_name)
  42. {
  43. int ret;
  44. ret = sprintf(str, "IRQ for %s: %08x ", ep_name, ep_sts);
  45. if (ep_sts & EP_STS_SETUP)
  46. ret += sprintf(str + ret, "SETUP ");
  47. if (ep_sts & EP_STS_IOC)
  48. ret += sprintf(str + ret, "IOC ");
  49. if (ep_sts & EP_STS_ISP)
  50. ret += sprintf(str + ret, "ISP ");
  51. if (ep_sts & EP_STS_DESCMIS)
  52. ret += sprintf(str + ret, "DESCMIS ");
  53. if (ep_sts & EP_STS_STREAMR)
  54. ret += sprintf(str + ret, "STREAMR ");
  55. if (ep_sts & EP_STS_MD_EXIT)
  56. ret += sprintf(str + ret, "MD_EXIT ");
  57. if (ep_sts & EP_STS_TRBERR)
  58. ret += sprintf(str + ret, "TRBERR ");
  59. if (ep_sts & EP_STS_NRDY)
  60. ret += sprintf(str + ret, "NRDY ");
  61. if (ep_sts & EP_STS_PRIME)
  62. ret += sprintf(str + ret, "PRIME ");
  63. if (ep_sts & EP_STS_SIDERR)
  64. ret += sprintf(str + ret, "SIDERRT ");
  65. if (ep_sts & EP_STS_OUTSMM)
  66. ret += sprintf(str + ret, "OUTSMM ");
  67. if (ep_sts & EP_STS_ISOERR)
  68. ret += sprintf(str + ret, "ISOERR ");
  69. if (ep_sts & EP_STS_IOT)
  70. ret += sprintf(str + ret, "IOT ");
  71. return str;
  72. }
  73. static inline char *cdns3_decode_epx_irq(char *str,
  74. char *ep_name,
  75. u32 ep_sts)
  76. {
  77. return cdns3_decode_ep_irq(str, ep_sts, ep_name);
  78. }
  79. static inline char *cdns3_decode_ep0_irq(char *str,
  80. int dir,
  81. u32 ep_sts)
  82. {
  83. return cdns3_decode_ep_irq(str, ep_sts,
  84. dir ? "ep0IN" : "ep0OUT");
  85. }
  86. /**
  87. * Debug a transfer ring.
  88. *
  89. * Prints out all TRBs in the endpoint ring, even those after the Link TRB.
  90. *.
  91. */
  92. static inline char *cdns3_dbg_ring(struct cdns3_endpoint *priv_ep,
  93. struct cdns3_trb *ring, char *str)
  94. {
  95. dma_addr_t addr = priv_ep->trb_pool_dma;
  96. struct cdns3_trb *trb;
  97. int trb_per_sector;
  98. int ret = 0;
  99. int i;
  100. trb_per_sector = GET_TRBS_PER_SEGMENT(priv_ep->type);
  101. trb = &priv_ep->trb_pool[priv_ep->dequeue];
  102. ret += sprintf(str + ret, "\n\t\tRing contents for %s:", priv_ep->name);
  103. ret += sprintf(str + ret,
  104. "\n\t\tRing deq index: %d, trb: %p (virt), 0x%llx (dma)\n",
  105. priv_ep->dequeue, trb,
  106. (unsigned long long)cdns3_trb_virt_to_dma(priv_ep, trb));
  107. trb = &priv_ep->trb_pool[priv_ep->enqueue];
  108. ret += sprintf(str + ret,
  109. "\t\tRing enq index: %d, trb: %p (virt), 0x%llx (dma)\n",
  110. priv_ep->enqueue, trb,
  111. (unsigned long long)cdns3_trb_virt_to_dma(priv_ep, trb));
  112. ret += sprintf(str + ret,
  113. "\t\tfree trbs: %d, CCS=%d, PCS=%d\n",
  114. priv_ep->free_trbs, priv_ep->ccs, priv_ep->pcs);
  115. if (trb_per_sector > TRBS_PER_SEGMENT)
  116. trb_per_sector = TRBS_PER_SEGMENT;
  117. if (trb_per_sector > TRBS_PER_SEGMENT) {
  118. sprintf(str + ret, "\t\tTo big transfer ring %d\n",
  119. trb_per_sector);
  120. return str;
  121. }
  122. for (i = 0; i < trb_per_sector; ++i) {
  123. trb = &ring[i];
  124. ret += sprintf(str + ret,
  125. "\t\t@%pad %08x %08x %08x\n", &addr,
  126. le32_to_cpu(trb->buffer),
  127. le32_to_cpu(trb->length),
  128. le32_to_cpu(trb->control));
  129. addr += sizeof(*trb);
  130. }
  131. return str;
  132. }
  133. void cdns3_dbg(struct cdns3_device *priv_dev, const char *fmt, ...);
  134. #ifdef CONFIG_DEBUG_FS
  135. void cdns3_debugfs_init(struct cdns3 *cdns);
  136. void cdns3_debugfs_exit(struct cdns3 *cdns);
  137. #else
  138. void cdns3_debugfs_init(struct cdns3 *cdns);
  139. { }
  140. void cdns3_debugfs_exit(struct cdns3 *cdns);
  141. { }
  142. #endif
  143. #endif /*__LINUX_CDNS3_DEBUG*/