Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Cadence USBSS DRD Driver.
0004  * Debug header file.
0005  *
0006  * Copyright (C) 2018-2019 Cadence.
0007  *
0008  * Author: Pawel Laszczak <pawell@cadence.com>
0009  */
0010 #ifndef __LINUX_CDNS3_DEBUG
0011 #define __LINUX_CDNS3_DEBUG
0012 
0013 #include "core.h"
0014 
0015 static inline char *cdns3_decode_usb_irq(char *str,
0016                      enum usb_device_speed speed,
0017                      u32 usb_ists)
0018 {
0019     int ret;
0020 
0021     ret = sprintf(str, "IRQ %08x = ", usb_ists);
0022 
0023     if (usb_ists & (USB_ISTS_CON2I | USB_ISTS_CONI)) {
0024         ret += sprintf(str + ret, "Connection %s\n",
0025                    usb_speed_string(speed));
0026     }
0027     if (usb_ists & USB_ISTS_DIS2I || usb_ists & USB_ISTS_DISI)
0028         ret += sprintf(str + ret, "Disconnection ");
0029     if (usb_ists & USB_ISTS_L2ENTI)
0030         ret += sprintf(str + ret, "suspended ");
0031     if (usb_ists & USB_ISTS_L1ENTI)
0032         ret += sprintf(str + ret, "L1 enter ");
0033     if (usb_ists & USB_ISTS_L1EXTI)
0034         ret += sprintf(str + ret, "L1 exit ");
0035     if (usb_ists & USB_ISTS_L2ENTI)
0036         ret += sprintf(str + ret, "L2 enter ");
0037     if (usb_ists & USB_ISTS_L2EXTI)
0038         ret += sprintf(str + ret, "L2 exit ");
0039     if (usb_ists & USB_ISTS_U3EXTI)
0040         ret += sprintf(str + ret, "U3 exit ");
0041     if (usb_ists & USB_ISTS_UWRESI)
0042         ret += sprintf(str + ret, "Warm Reset ");
0043     if (usb_ists & USB_ISTS_UHRESI)
0044         ret += sprintf(str + ret, "Hot Reset ");
0045     if (usb_ists & USB_ISTS_U2RESI)
0046         ret += sprintf(str + ret, "Reset");
0047 
0048     return str;
0049 }
0050 
0051 static inline  char *cdns3_decode_ep_irq(char *str,
0052                      u32 ep_sts,
0053                      const char *ep_name)
0054 {
0055     int ret;
0056 
0057     ret = sprintf(str, "IRQ for %s: %08x ", ep_name, ep_sts);
0058 
0059     if (ep_sts & EP_STS_SETUP)
0060         ret += sprintf(str + ret, "SETUP ");
0061     if (ep_sts & EP_STS_IOC)
0062         ret += sprintf(str + ret, "IOC ");
0063     if (ep_sts & EP_STS_ISP)
0064         ret += sprintf(str + ret, "ISP ");
0065     if (ep_sts & EP_STS_DESCMIS)
0066         ret += sprintf(str + ret, "DESCMIS ");
0067     if (ep_sts & EP_STS_STREAMR)
0068         ret += sprintf(str + ret, "STREAMR ");
0069     if (ep_sts & EP_STS_MD_EXIT)
0070         ret += sprintf(str + ret, "MD_EXIT ");
0071     if (ep_sts & EP_STS_TRBERR)
0072         ret += sprintf(str + ret, "TRBERR ");
0073     if (ep_sts & EP_STS_NRDY)
0074         ret += sprintf(str + ret, "NRDY ");
0075     if (ep_sts & EP_STS_PRIME)
0076         ret += sprintf(str + ret, "PRIME ");
0077     if (ep_sts & EP_STS_SIDERR)
0078         ret += sprintf(str + ret, "SIDERRT ");
0079     if (ep_sts & EP_STS_OUTSMM)
0080         ret += sprintf(str + ret, "OUTSMM ");
0081     if (ep_sts & EP_STS_ISOERR)
0082         ret += sprintf(str + ret, "ISOERR ");
0083     if (ep_sts & EP_STS_IOT)
0084         ret += sprintf(str + ret, "IOT ");
0085 
0086     return str;
0087 }
0088 
0089 static inline char *cdns3_decode_epx_irq(char *str,
0090                      char *ep_name,
0091                      u32 ep_sts)
0092 {
0093     return cdns3_decode_ep_irq(str, ep_sts, ep_name);
0094 }
0095 
0096 static inline char *cdns3_decode_ep0_irq(char *str,
0097                      int dir,
0098                      u32 ep_sts)
0099 {
0100     return cdns3_decode_ep_irq(str, ep_sts,
0101                    dir ? "ep0IN" : "ep0OUT");
0102 }
0103 
0104 /**
0105  * Debug a transfer ring.
0106  *
0107  * Prints out all TRBs in the endpoint ring, even those after the Link TRB.
0108  *.
0109  */
0110 static inline char *cdns3_dbg_ring(struct cdns3_endpoint *priv_ep,
0111                    struct cdns3_trb *ring, char *str)
0112 {
0113     dma_addr_t addr = priv_ep->trb_pool_dma;
0114     struct cdns3_trb *trb;
0115     int trb_per_sector;
0116     int ret = 0;
0117     int i;
0118 
0119     trb_per_sector = GET_TRBS_PER_SEGMENT(priv_ep->type);
0120 
0121     trb = &priv_ep->trb_pool[priv_ep->dequeue];
0122     ret += sprintf(str + ret, "\n\t\tRing contents for %s:", priv_ep->name);
0123 
0124     ret += sprintf(str + ret,
0125                "\n\t\tRing deq index: %d, trb: %p (virt), 0x%llx (dma)\n",
0126                priv_ep->dequeue, trb,
0127                (unsigned long long)cdns3_trb_virt_to_dma(priv_ep, trb));
0128 
0129     trb = &priv_ep->trb_pool[priv_ep->enqueue];
0130     ret += sprintf(str + ret,
0131                "\t\tRing enq index: %d, trb: %p (virt), 0x%llx (dma)\n",
0132                priv_ep->enqueue, trb,
0133                (unsigned long long)cdns3_trb_virt_to_dma(priv_ep, trb));
0134 
0135     ret += sprintf(str + ret,
0136                "\t\tfree trbs: %d, CCS=%d, PCS=%d\n",
0137                priv_ep->free_trbs, priv_ep->ccs, priv_ep->pcs);
0138 
0139     if (trb_per_sector > TRBS_PER_SEGMENT)
0140         trb_per_sector = TRBS_PER_SEGMENT;
0141 
0142     if (trb_per_sector > TRBS_PER_SEGMENT) {
0143         sprintf(str + ret, "\t\tTransfer ring %d too big\n",
0144             trb_per_sector);
0145         return str;
0146     }
0147 
0148     for (i = 0; i < trb_per_sector; ++i) {
0149         trb = &ring[i];
0150         ret += sprintf(str + ret,
0151             "\t\t@%pad %08x %08x %08x\n", &addr,
0152             le32_to_cpu(trb->buffer),
0153             le32_to_cpu(trb->length),
0154             le32_to_cpu(trb->control));
0155         addr += sizeof(*trb);
0156     }
0157 
0158     return str;
0159 }
0160 
0161 #endif /*__LINUX_CDNS3_DEBUG*/