cdns3-debug.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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 <[email protected]>
  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_L1ENTI)
  28. ret += sprintf(str + ret, "L1 enter ");
  29. if (usb_ists & USB_ISTS_L1EXTI)
  30. ret += sprintf(str + ret, "L1 exit ");
  31. if (usb_ists & USB_ISTS_L2ENTI)
  32. ret += sprintf(str + ret, "L2 enter ");
  33. if (usb_ists & USB_ISTS_L2EXTI)
  34. ret += sprintf(str + ret, "L2 exit ");
  35. if (usb_ists & USB_ISTS_U3EXTI)
  36. ret += sprintf(str + ret, "U3 exit ");
  37. if (usb_ists & USB_ISTS_UWRESI)
  38. ret += sprintf(str + ret, "Warm Reset ");
  39. if (usb_ists & USB_ISTS_UHRESI)
  40. ret += sprintf(str + ret, "Hot Reset ");
  41. if (usb_ists & USB_ISTS_U2RESI)
  42. ret += sprintf(str + ret, "Reset");
  43. return str;
  44. }
  45. static inline char *cdns3_decode_ep_irq(char *str,
  46. u32 ep_sts,
  47. const char *ep_name)
  48. {
  49. int ret;
  50. ret = sprintf(str, "IRQ for %s: %08x ", ep_name, ep_sts);
  51. if (ep_sts & EP_STS_SETUP)
  52. ret += sprintf(str + ret, "SETUP ");
  53. if (ep_sts & EP_STS_IOC)
  54. ret += sprintf(str + ret, "IOC ");
  55. if (ep_sts & EP_STS_ISP)
  56. ret += sprintf(str + ret, "ISP ");
  57. if (ep_sts & EP_STS_DESCMIS)
  58. ret += sprintf(str + ret, "DESCMIS ");
  59. if (ep_sts & EP_STS_STREAMR)
  60. ret += sprintf(str + ret, "STREAMR ");
  61. if (ep_sts & EP_STS_MD_EXIT)
  62. ret += sprintf(str + ret, "MD_EXIT ");
  63. if (ep_sts & EP_STS_TRBERR)
  64. ret += sprintf(str + ret, "TRBERR ");
  65. if (ep_sts & EP_STS_NRDY)
  66. ret += sprintf(str + ret, "NRDY ");
  67. if (ep_sts & EP_STS_PRIME)
  68. ret += sprintf(str + ret, "PRIME ");
  69. if (ep_sts & EP_STS_SIDERR)
  70. ret += sprintf(str + ret, "SIDERRT ");
  71. if (ep_sts & EP_STS_OUTSMM)
  72. ret += sprintf(str + ret, "OUTSMM ");
  73. if (ep_sts & EP_STS_ISOERR)
  74. ret += sprintf(str + ret, "ISOERR ");
  75. if (ep_sts & EP_STS_IOT)
  76. ret += sprintf(str + ret, "IOT ");
  77. return str;
  78. }
  79. static inline char *cdns3_decode_epx_irq(char *str,
  80. char *ep_name,
  81. u32 ep_sts)
  82. {
  83. return cdns3_decode_ep_irq(str, ep_sts, ep_name);
  84. }
  85. static inline char *cdns3_decode_ep0_irq(char *str,
  86. int dir,
  87. u32 ep_sts)
  88. {
  89. return cdns3_decode_ep_irq(str, ep_sts,
  90. dir ? "ep0IN" : "ep0OUT");
  91. }
  92. /**
  93. * Debug a transfer ring.
  94. *
  95. * Prints out all TRBs in the endpoint ring, even those after the Link TRB.
  96. *.
  97. */
  98. static inline char *cdns3_dbg_ring(struct cdns3_endpoint *priv_ep,
  99. struct cdns3_trb *ring, char *str)
  100. {
  101. dma_addr_t addr = priv_ep->trb_pool_dma;
  102. struct cdns3_trb *trb;
  103. int trb_per_sector;
  104. int ret = 0;
  105. int i;
  106. trb_per_sector = GET_TRBS_PER_SEGMENT(priv_ep->type);
  107. trb = &priv_ep->trb_pool[priv_ep->dequeue];
  108. ret += sprintf(str + ret, "\n\t\tRing contents for %s:", priv_ep->name);
  109. ret += sprintf(str + ret,
  110. "\n\t\tRing deq index: %d, trb: %p (virt), 0x%llx (dma)\n",
  111. priv_ep->dequeue, trb,
  112. (unsigned long long)cdns3_trb_virt_to_dma(priv_ep, trb));
  113. trb = &priv_ep->trb_pool[priv_ep->enqueue];
  114. ret += sprintf(str + ret,
  115. "\t\tRing enq index: %d, trb: %p (virt), 0x%llx (dma)\n",
  116. priv_ep->enqueue, trb,
  117. (unsigned long long)cdns3_trb_virt_to_dma(priv_ep, trb));
  118. ret += sprintf(str + ret,
  119. "\t\tfree trbs: %d, CCS=%d, PCS=%d\n",
  120. priv_ep->free_trbs, priv_ep->ccs, priv_ep->pcs);
  121. if (trb_per_sector > TRBS_PER_SEGMENT)
  122. trb_per_sector = TRBS_PER_SEGMENT;
  123. if (trb_per_sector > TRBS_PER_SEGMENT) {
  124. sprintf(str + ret, "\t\tTransfer ring %d too big\n",
  125. trb_per_sector);
  126. return str;
  127. }
  128. for (i = 0; i < trb_per_sector; ++i) {
  129. trb = &ring[i];
  130. ret += sprintf(str + ret,
  131. "\t\t@%pad %08x %08x %08x\n", &addr,
  132. le32_to_cpu(trb->buffer),
  133. le32_to_cpu(trb->length),
  134. le32_to_cpu(trb->control));
  135. addr += sizeof(*trb);
  136. }
  137. return str;
  138. }
  139. #endif /*__LINUX_CDNS3_DEBUG*/