1118b2a32SPawel Laszczak /* SPDX-License-Identifier: GPL-2.0 */ 2118b2a32SPawel Laszczak /* 3118b2a32SPawel Laszczak * Cadence CDNSP DRD Driver. 4118b2a32SPawel Laszczak * 5118b2a32SPawel Laszczak * Copyright (C) 2020 Cadence. 6118b2a32SPawel Laszczak * 7118b2a32SPawel Laszczak * Author: Pawel Laszczak <pawell@cadence.com> 8118b2a32SPawel Laszczak * 9118b2a32SPawel Laszczak */ 10118b2a32SPawel Laszczak #ifndef __LINUX_CDNSP_DEBUG 11118b2a32SPawel Laszczak #define __LINUX_CDNSP_DEBUG 12118b2a32SPawel Laszczak 13118b2a32SPawel Laszczak static inline const char *cdnsp_trb_comp_code_string(u8 status) 14118b2a32SPawel Laszczak { 15118b2a32SPawel Laszczak switch (status) { 16118b2a32SPawel Laszczak case COMP_INVALID: 17118b2a32SPawel Laszczak return "Invalid"; 18118b2a32SPawel Laszczak case COMP_SUCCESS: 19118b2a32SPawel Laszczak return "Success"; 20118b2a32SPawel Laszczak case COMP_DATA_BUFFER_ERROR: 21118b2a32SPawel Laszczak return "Data Buffer Error"; 22118b2a32SPawel Laszczak case COMP_BABBLE_DETECTED_ERROR: 23118b2a32SPawel Laszczak return "Babble Detected"; 24118b2a32SPawel Laszczak case COMP_TRB_ERROR: 25118b2a32SPawel Laszczak return "TRB Error"; 26118b2a32SPawel Laszczak case COMP_RESOURCE_ERROR: 27118b2a32SPawel Laszczak return "Resource Error"; 28118b2a32SPawel Laszczak case COMP_NO_SLOTS_AVAILABLE_ERROR: 29118b2a32SPawel Laszczak return "No Slots Available Error"; 30118b2a32SPawel Laszczak case COMP_INVALID_STREAM_TYPE_ERROR: 31118b2a32SPawel Laszczak return "Invalid Stream Type Error"; 32118b2a32SPawel Laszczak case COMP_SLOT_NOT_ENABLED_ERROR: 33118b2a32SPawel Laszczak return "Slot Not Enabled Error"; 34118b2a32SPawel Laszczak case COMP_ENDPOINT_NOT_ENABLED_ERROR: 35118b2a32SPawel Laszczak return "Endpoint Not Enabled Error"; 36118b2a32SPawel Laszczak case COMP_SHORT_PACKET: 37118b2a32SPawel Laszczak return "Short Packet"; 38118b2a32SPawel Laszczak case COMP_RING_UNDERRUN: 39118b2a32SPawel Laszczak return "Ring Underrun"; 40118b2a32SPawel Laszczak case COMP_RING_OVERRUN: 41118b2a32SPawel Laszczak return "Ring Overrun"; 42118b2a32SPawel Laszczak case COMP_VF_EVENT_RING_FULL_ERROR: 43118b2a32SPawel Laszczak return "VF Event Ring Full Error"; 44118b2a32SPawel Laszczak case COMP_PARAMETER_ERROR: 45118b2a32SPawel Laszczak return "Parameter Error"; 46118b2a32SPawel Laszczak case COMP_CONTEXT_STATE_ERROR: 47118b2a32SPawel Laszczak return "Context State Error"; 48118b2a32SPawel Laszczak case COMP_EVENT_RING_FULL_ERROR: 49118b2a32SPawel Laszczak return "Event Ring Full Error"; 50118b2a32SPawel Laszczak case COMP_INCOMPATIBLE_DEVICE_ERROR: 51118b2a32SPawel Laszczak return "Incompatible Device Error"; 52118b2a32SPawel Laszczak case COMP_MISSED_SERVICE_ERROR: 53118b2a32SPawel Laszczak return "Missed Service Error"; 54118b2a32SPawel Laszczak case COMP_COMMAND_RING_STOPPED: 55118b2a32SPawel Laszczak return "Command Ring Stopped"; 56118b2a32SPawel Laszczak case COMP_COMMAND_ABORTED: 57118b2a32SPawel Laszczak return "Command Aborted"; 58118b2a32SPawel Laszczak case COMP_STOPPED: 59118b2a32SPawel Laszczak return "Stopped"; 60118b2a32SPawel Laszczak case COMP_STOPPED_LENGTH_INVALID: 61118b2a32SPawel Laszczak return "Stopped - Length Invalid"; 62118b2a32SPawel Laszczak case COMP_STOPPED_SHORT_PACKET: 63118b2a32SPawel Laszczak return "Stopped - Short Packet"; 64118b2a32SPawel Laszczak case COMP_MAX_EXIT_LATENCY_TOO_LARGE_ERROR: 65118b2a32SPawel Laszczak return "Max Exit Latency Too Large Error"; 66118b2a32SPawel Laszczak case COMP_ISOCH_BUFFER_OVERRUN: 67118b2a32SPawel Laszczak return "Isoch Buffer Overrun"; 68118b2a32SPawel Laszczak case COMP_EVENT_LOST_ERROR: 69118b2a32SPawel Laszczak return "Event Lost Error"; 70118b2a32SPawel Laszczak case COMP_UNDEFINED_ERROR: 71118b2a32SPawel Laszczak return "Undefined Error"; 72118b2a32SPawel Laszczak case COMP_INVALID_STREAM_ID_ERROR: 73118b2a32SPawel Laszczak return "Invalid Stream ID Error"; 74118b2a32SPawel Laszczak default: 75118b2a32SPawel Laszczak return "Unknown!!"; 76118b2a32SPawel Laszczak } 77118b2a32SPawel Laszczak } 78118b2a32SPawel Laszczak 79118b2a32SPawel Laszczak static inline const char *cdnsp_trb_type_string(u8 type) 80118b2a32SPawel Laszczak { 81118b2a32SPawel Laszczak switch (type) { 82118b2a32SPawel Laszczak case TRB_NORMAL: 83118b2a32SPawel Laszczak return "Normal"; 84118b2a32SPawel Laszczak case TRB_SETUP: 85118b2a32SPawel Laszczak return "Setup Stage"; 86118b2a32SPawel Laszczak case TRB_DATA: 87118b2a32SPawel Laszczak return "Data Stage"; 88118b2a32SPawel Laszczak case TRB_STATUS: 89118b2a32SPawel Laszczak return "Status Stage"; 90118b2a32SPawel Laszczak case TRB_ISOC: 91118b2a32SPawel Laszczak return "Isoch"; 92118b2a32SPawel Laszczak case TRB_LINK: 93118b2a32SPawel Laszczak return "Link"; 94118b2a32SPawel Laszczak case TRB_EVENT_DATA: 95118b2a32SPawel Laszczak return "Event Data"; 96118b2a32SPawel Laszczak case TRB_TR_NOOP: 97118b2a32SPawel Laszczak return "No-Op"; 98118b2a32SPawel Laszczak case TRB_ENABLE_SLOT: 99118b2a32SPawel Laszczak return "Enable Slot Command"; 100118b2a32SPawel Laszczak case TRB_DISABLE_SLOT: 101118b2a32SPawel Laszczak return "Disable Slot Command"; 102118b2a32SPawel Laszczak case TRB_ADDR_DEV: 103118b2a32SPawel Laszczak return "Address Device Command"; 104118b2a32SPawel Laszczak case TRB_CONFIG_EP: 105118b2a32SPawel Laszczak return "Configure Endpoint Command"; 106118b2a32SPawel Laszczak case TRB_EVAL_CONTEXT: 107118b2a32SPawel Laszczak return "Evaluate Context Command"; 108118b2a32SPawel Laszczak case TRB_RESET_EP: 109118b2a32SPawel Laszczak return "Reset Endpoint Command"; 110118b2a32SPawel Laszczak case TRB_STOP_RING: 111118b2a32SPawel Laszczak return "Stop Ring Command"; 112118b2a32SPawel Laszczak case TRB_SET_DEQ: 113118b2a32SPawel Laszczak return "Set TR Dequeue Pointer Command"; 114118b2a32SPawel Laszczak case TRB_RESET_DEV: 115118b2a32SPawel Laszczak return "Reset Device Command"; 116118b2a32SPawel Laszczak case TRB_FORCE_HEADER: 117118b2a32SPawel Laszczak return "Force Header Command"; 118118b2a32SPawel Laszczak case TRB_CMD_NOOP: 119118b2a32SPawel Laszczak return "No-Op Command"; 120118b2a32SPawel Laszczak case TRB_TRANSFER: 121118b2a32SPawel Laszczak return "Transfer Event"; 122118b2a32SPawel Laszczak case TRB_COMPLETION: 123118b2a32SPawel Laszczak return "Command Completion Event"; 124118b2a32SPawel Laszczak case TRB_PORT_STATUS: 125118b2a32SPawel Laszczak return "Port Status Change Event"; 126118b2a32SPawel Laszczak case TRB_HC_EVENT: 127118b2a32SPawel Laszczak return "Device Controller Event"; 128118b2a32SPawel Laszczak case TRB_MFINDEX_WRAP: 129118b2a32SPawel Laszczak return "MFINDEX Wrap Event"; 130118b2a32SPawel Laszczak case TRB_ENDPOINT_NRDY: 131118b2a32SPawel Laszczak return "Endpoint Not ready"; 132118b2a32SPawel Laszczak case TRB_HALT_ENDPOINT: 133118b2a32SPawel Laszczak return "Halt Endpoint"; 134118b2a32SPawel Laszczak default: 135118b2a32SPawel Laszczak return "UNKNOWN"; 136118b2a32SPawel Laszczak } 137118b2a32SPawel Laszczak } 138118b2a32SPawel Laszczak 139118b2a32SPawel Laszczak static inline const char *cdnsp_ring_type_string(enum cdnsp_ring_type type) 140118b2a32SPawel Laszczak { 141118b2a32SPawel Laszczak switch (type) { 142118b2a32SPawel Laszczak case TYPE_CTRL: 143118b2a32SPawel Laszczak return "CTRL"; 144118b2a32SPawel Laszczak case TYPE_ISOC: 145118b2a32SPawel Laszczak return "ISOC"; 146118b2a32SPawel Laszczak case TYPE_BULK: 147118b2a32SPawel Laszczak return "BULK"; 148118b2a32SPawel Laszczak case TYPE_INTR: 149118b2a32SPawel Laszczak return "INTR"; 150118b2a32SPawel Laszczak case TYPE_STREAM: 151118b2a32SPawel Laszczak return "STREAM"; 152118b2a32SPawel Laszczak case TYPE_COMMAND: 153118b2a32SPawel Laszczak return "CMD"; 154118b2a32SPawel Laszczak case TYPE_EVENT: 155118b2a32SPawel Laszczak return "EVENT"; 156118b2a32SPawel Laszczak } 157118b2a32SPawel Laszczak 158118b2a32SPawel Laszczak return "UNKNOWN"; 159118b2a32SPawel Laszczak } 160118b2a32SPawel Laszczak 161118b2a32SPawel Laszczak static inline char *cdnsp_slot_state_string(u32 state) 162118b2a32SPawel Laszczak { 163118b2a32SPawel Laszczak switch (state) { 164118b2a32SPawel Laszczak case SLOT_STATE_ENABLED: 165118b2a32SPawel Laszczak return "enabled/disabled"; 166118b2a32SPawel Laszczak case SLOT_STATE_DEFAULT: 167118b2a32SPawel Laszczak return "default"; 168118b2a32SPawel Laszczak case SLOT_STATE_ADDRESSED: 169118b2a32SPawel Laszczak return "addressed"; 170118b2a32SPawel Laszczak case SLOT_STATE_CONFIGURED: 171118b2a32SPawel Laszczak return "configured"; 172118b2a32SPawel Laszczak default: 173118b2a32SPawel Laszczak return "reserved"; 174118b2a32SPawel Laszczak } 175118b2a32SPawel Laszczak } 176118b2a32SPawel Laszczak 177118b2a32SPawel Laszczak static inline const char *cdnsp_decode_trb(char *str, size_t size, u32 field0, 178118b2a32SPawel Laszczak u32 field1, u32 field2, u32 field3) 179118b2a32SPawel Laszczak { 180118b2a32SPawel Laszczak int ep_id = TRB_TO_EP_INDEX(field3) - 1; 181118b2a32SPawel Laszczak int type = TRB_FIELD_TO_TYPE(field3); 182118b2a32SPawel Laszczak unsigned int ep_num; 18303db9289SPawel Laszczak int ret; 184118b2a32SPawel Laszczak u32 temp; 185118b2a32SPawel Laszczak 186118b2a32SPawel Laszczak ep_num = DIV_ROUND_UP(ep_id, 2); 187118b2a32SPawel Laszczak 188118b2a32SPawel Laszczak switch (type) { 189118b2a32SPawel Laszczak case TRB_LINK: 190*b385ef08SLee Jones ret = scnprintf(str, size, 191118b2a32SPawel Laszczak "LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c", 192118b2a32SPawel Laszczak field1, field0, GET_INTR_TARGET(field2), 193118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 194118b2a32SPawel Laszczak field3 & TRB_IOC ? 'I' : 'i', 195118b2a32SPawel Laszczak field3 & TRB_CHAIN ? 'C' : 'c', 196118b2a32SPawel Laszczak field3 & TRB_TC ? 'T' : 't', 197118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 198118b2a32SPawel Laszczak break; 199118b2a32SPawel Laszczak case TRB_TRANSFER: 200118b2a32SPawel Laszczak case TRB_COMPLETION: 201118b2a32SPawel Laszczak case TRB_PORT_STATUS: 202118b2a32SPawel Laszczak case TRB_HC_EVENT: 203*b385ef08SLee Jones ret = scnprintf(str, size, 204118b2a32SPawel Laszczak "ep%d%s(%d) type '%s' TRB %08x%08x status '%s'" 205118b2a32SPawel Laszczak " len %ld slot %ld flags %c:%c", 206118b2a32SPawel Laszczak ep_num, ep_id % 2 ? "out" : "in", 207118b2a32SPawel Laszczak TRB_TO_EP_INDEX(field3), 208118b2a32SPawel Laszczak cdnsp_trb_type_string(type), field1, field0, 209118b2a32SPawel Laszczak cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)), 210118b2a32SPawel Laszczak EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3), 211118b2a32SPawel Laszczak field3 & EVENT_DATA ? 'E' : 'e', 212118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 213118b2a32SPawel Laszczak break; 214118b2a32SPawel Laszczak case TRB_MFINDEX_WRAP: 215*b385ef08SLee Jones ret = scnprintf(str, size, "%s: flags %c", 216118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 217118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 218118b2a32SPawel Laszczak break; 219118b2a32SPawel Laszczak case TRB_SETUP: 220*b385ef08SLee Jones ret = scnprintf(str, size, 221118b2a32SPawel Laszczak "type '%s' bRequestType %02x bRequest %02x " 222118b2a32SPawel Laszczak "wValue %02x%02x wIndex %02x%02x wLength %d " 223118b2a32SPawel Laszczak "length %ld TD size %ld intr %ld Setup ID %ld " 224118b2a32SPawel Laszczak "flags %c:%c:%c", 225118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 226118b2a32SPawel Laszczak field0 & 0xff, 227118b2a32SPawel Laszczak (field0 & 0xff00) >> 8, 228118b2a32SPawel Laszczak (field0 & 0xff000000) >> 24, 229118b2a32SPawel Laszczak (field0 & 0xff0000) >> 16, 230118b2a32SPawel Laszczak (field1 & 0xff00) >> 8, 231118b2a32SPawel Laszczak field1 & 0xff, 232118b2a32SPawel Laszczak (field1 & 0xff000000) >> 16 | 233118b2a32SPawel Laszczak (field1 & 0xff0000) >> 16, 234118b2a32SPawel Laszczak TRB_LEN(field2), GET_TD_SIZE(field2), 235118b2a32SPawel Laszczak GET_INTR_TARGET(field2), 236118b2a32SPawel Laszczak TRB_SETUPID_TO_TYPE(field3), 237118b2a32SPawel Laszczak field3 & TRB_IDT ? 'D' : 'd', 238118b2a32SPawel Laszczak field3 & TRB_IOC ? 'I' : 'i', 239118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 240118b2a32SPawel Laszczak break; 241118b2a32SPawel Laszczak case TRB_DATA: 242*b385ef08SLee Jones ret = scnprintf(str, size, 243118b2a32SPawel Laszczak "type '%s' Buffer %08x%08x length %ld TD size %ld " 244118b2a32SPawel Laszczak "intr %ld flags %c:%c:%c:%c:%c:%c:%c", 245118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 246118b2a32SPawel Laszczak field1, field0, TRB_LEN(field2), 247118b2a32SPawel Laszczak GET_TD_SIZE(field2), 248118b2a32SPawel Laszczak GET_INTR_TARGET(field2), 249118b2a32SPawel Laszczak field3 & TRB_IDT ? 'D' : 'i', 250118b2a32SPawel Laszczak field3 & TRB_IOC ? 'I' : 'i', 251118b2a32SPawel Laszczak field3 & TRB_CHAIN ? 'C' : 'c', 252118b2a32SPawel Laszczak field3 & TRB_NO_SNOOP ? 'S' : 's', 253118b2a32SPawel Laszczak field3 & TRB_ISP ? 'I' : 'i', 254118b2a32SPawel Laszczak field3 & TRB_ENT ? 'E' : 'e', 255118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 256118b2a32SPawel Laszczak break; 257118b2a32SPawel Laszczak case TRB_STATUS: 258*b385ef08SLee Jones ret = scnprintf(str, size, 259118b2a32SPawel Laszczak "Buffer %08x%08x length %ld TD size %ld intr" 260118b2a32SPawel Laszczak "%ld type '%s' flags %c:%c:%c:%c", 261118b2a32SPawel Laszczak field1, field0, TRB_LEN(field2), 262118b2a32SPawel Laszczak GET_TD_SIZE(field2), 263118b2a32SPawel Laszczak GET_INTR_TARGET(field2), 264118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 265118b2a32SPawel Laszczak field3 & TRB_IOC ? 'I' : 'i', 266118b2a32SPawel Laszczak field3 & TRB_CHAIN ? 'C' : 'c', 267118b2a32SPawel Laszczak field3 & TRB_ENT ? 'E' : 'e', 268118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 269118b2a32SPawel Laszczak break; 270118b2a32SPawel Laszczak case TRB_NORMAL: 271118b2a32SPawel Laszczak case TRB_ISOC: 272118b2a32SPawel Laszczak case TRB_EVENT_DATA: 273118b2a32SPawel Laszczak case TRB_TR_NOOP: 274*b385ef08SLee Jones ret = scnprintf(str, size, 275118b2a32SPawel Laszczak "type '%s' Buffer %08x%08x length %ld " 276118b2a32SPawel Laszczak "TD size %ld intr %ld " 277118b2a32SPawel Laszczak "flags %c:%c:%c:%c:%c:%c:%c:%c:%c", 278118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 279118b2a32SPawel Laszczak field1, field0, TRB_LEN(field2), 280118b2a32SPawel Laszczak GET_TD_SIZE(field2), 281118b2a32SPawel Laszczak GET_INTR_TARGET(field2), 282118b2a32SPawel Laszczak field3 & TRB_BEI ? 'B' : 'b', 283118b2a32SPawel Laszczak field3 & TRB_IDT ? 'T' : 't', 284118b2a32SPawel Laszczak field3 & TRB_IOC ? 'I' : 'i', 285118b2a32SPawel Laszczak field3 & TRB_CHAIN ? 'C' : 'c', 286118b2a32SPawel Laszczak field3 & TRB_NO_SNOOP ? 'S' : 's', 287118b2a32SPawel Laszczak field3 & TRB_ISP ? 'I' : 'i', 288118b2a32SPawel Laszczak field3 & TRB_ENT ? 'E' : 'e', 289118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c', 290118b2a32SPawel Laszczak !(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v'); 291118b2a32SPawel Laszczak break; 292118b2a32SPawel Laszczak case TRB_CMD_NOOP: 293118b2a32SPawel Laszczak case TRB_ENABLE_SLOT: 294*b385ef08SLee Jones ret = scnprintf(str, size, "%s: flags %c", 295118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 296118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 297118b2a32SPawel Laszczak break; 298118b2a32SPawel Laszczak case TRB_DISABLE_SLOT: 299*b385ef08SLee Jones ret = scnprintf(str, size, "%s: slot %ld flags %c", 300118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 301118b2a32SPawel Laszczak TRB_TO_SLOT_ID(field3), 302118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 303118b2a32SPawel Laszczak break; 304118b2a32SPawel Laszczak case TRB_ADDR_DEV: 305*b385ef08SLee Jones ret = scnprintf(str, size, 306118b2a32SPawel Laszczak "%s: ctx %08x%08x slot %ld flags %c:%c", 307118b2a32SPawel Laszczak cdnsp_trb_type_string(type), field1, field0, 308118b2a32SPawel Laszczak TRB_TO_SLOT_ID(field3), 309118b2a32SPawel Laszczak field3 & TRB_BSR ? 'B' : 'b', 310118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 311118b2a32SPawel Laszczak break; 312118b2a32SPawel Laszczak case TRB_CONFIG_EP: 313*b385ef08SLee Jones ret = scnprintf(str, size, 314118b2a32SPawel Laszczak "%s: ctx %08x%08x slot %ld flags %c:%c", 315118b2a32SPawel Laszczak cdnsp_trb_type_string(type), field1, field0, 316118b2a32SPawel Laszczak TRB_TO_SLOT_ID(field3), 317118b2a32SPawel Laszczak field3 & TRB_DC ? 'D' : 'd', 318118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 319118b2a32SPawel Laszczak break; 320118b2a32SPawel Laszczak case TRB_EVAL_CONTEXT: 321*b385ef08SLee Jones ret = scnprintf(str, size, 322118b2a32SPawel Laszczak "%s: ctx %08x%08x slot %ld flags %c", 323118b2a32SPawel Laszczak cdnsp_trb_type_string(type), field1, field0, 324118b2a32SPawel Laszczak TRB_TO_SLOT_ID(field3), 325118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 326118b2a32SPawel Laszczak break; 327118b2a32SPawel Laszczak case TRB_RESET_EP: 328118b2a32SPawel Laszczak case TRB_HALT_ENDPOINT: 329*b385ef08SLee Jones ret = scnprintf(str, size, 330118b2a32SPawel Laszczak "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c", 331118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 332118b2a32SPawel Laszczak ep_num, ep_id % 2 ? "out" : "in", 333118b2a32SPawel Laszczak TRB_TO_EP_INDEX(field3), field1, field0, 334118b2a32SPawel Laszczak TRB_TO_SLOT_ID(field3), 335118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 336118b2a32SPawel Laszczak break; 337118b2a32SPawel Laszczak case TRB_STOP_RING: 338*b385ef08SLee Jones ret = scnprintf(str, size, 339118b2a32SPawel Laszczak "%s: ep%d%s(%d) slot %ld sp %d flags %c", 340118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 341118b2a32SPawel Laszczak ep_num, ep_id % 2 ? "out" : "in", 342118b2a32SPawel Laszczak TRB_TO_EP_INDEX(field3), 343118b2a32SPawel Laszczak TRB_TO_SLOT_ID(field3), 344118b2a32SPawel Laszczak TRB_TO_SUSPEND_PORT(field3), 345118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 346118b2a32SPawel Laszczak break; 347118b2a32SPawel Laszczak case TRB_SET_DEQ: 348*b385ef08SLee Jones ret = scnprintf(str, size, 349118b2a32SPawel Laszczak "%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld flags %c", 350118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 351118b2a32SPawel Laszczak ep_num, ep_id % 2 ? "out" : "in", 352118b2a32SPawel Laszczak TRB_TO_EP_INDEX(field3), field1, field0, 353118b2a32SPawel Laszczak TRB_TO_STREAM_ID(field2), 354118b2a32SPawel Laszczak TRB_TO_SLOT_ID(field3), 355118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 356118b2a32SPawel Laszczak break; 357118b2a32SPawel Laszczak case TRB_RESET_DEV: 358*b385ef08SLee Jones ret = scnprintf(str, size, "%s: slot %ld flags %c", 359118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 360118b2a32SPawel Laszczak TRB_TO_SLOT_ID(field3), 361118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 362118b2a32SPawel Laszczak break; 363118b2a32SPawel Laszczak case TRB_ENDPOINT_NRDY: 364118b2a32SPawel Laszczak temp = TRB_TO_HOST_STREAM(field2); 365118b2a32SPawel Laszczak 366*b385ef08SLee Jones ret = scnprintf(str, size, 367118b2a32SPawel Laszczak "%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c", 368118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 369118b2a32SPawel Laszczak ep_num, ep_id % 2 ? "out" : "in", 370118b2a32SPawel Laszczak TRB_TO_EP_INDEX(field3), temp, 371118b2a32SPawel Laszczak temp == STREAM_PRIME_ACK ? "(PRIME)" : "", 372118b2a32SPawel Laszczak temp == STREAM_REJECTED ? "(REJECTED)" : "", 373118b2a32SPawel Laszczak TRB_TO_DEV_STREAM(field0), 374118b2a32SPawel Laszczak field3 & TRB_STAT ? 'S' : 's', 375118b2a32SPawel Laszczak field3 & TRB_CYCLE ? 'C' : 'c'); 376118b2a32SPawel Laszczak break; 377118b2a32SPawel Laszczak default: 378*b385ef08SLee Jones ret = scnprintf(str, size, 379118b2a32SPawel Laszczak "type '%s' -> raw %08x %08x %08x %08x", 380118b2a32SPawel Laszczak cdnsp_trb_type_string(type), 381118b2a32SPawel Laszczak field0, field1, field2, field3); 382118b2a32SPawel Laszczak } 383118b2a32SPawel Laszczak 384*b385ef08SLee Jones if (ret == size - 1) 385*b385ef08SLee Jones pr_info("CDNSP: buffer may be truncated.\n"); 38603db9289SPawel Laszczak 387118b2a32SPawel Laszczak return str; 388118b2a32SPawel Laszczak } 389118b2a32SPawel Laszczak 390118b2a32SPawel Laszczak static inline const char *cdnsp_decode_slot_context(u32 info, u32 info2, 391118b2a32SPawel Laszczak u32 int_target, u32 state) 392118b2a32SPawel Laszczak { 393118b2a32SPawel Laszczak static char str[1024]; 394118b2a32SPawel Laszczak int ret = 0; 395118b2a32SPawel Laszczak u32 speed; 396118b2a32SPawel Laszczak char *s; 397118b2a32SPawel Laszczak 398118b2a32SPawel Laszczak speed = info & DEV_SPEED; 399118b2a32SPawel Laszczak 400118b2a32SPawel Laszczak switch (speed) { 401118b2a32SPawel Laszczak case SLOT_SPEED_FS: 402118b2a32SPawel Laszczak s = "full-speed"; 403118b2a32SPawel Laszczak break; 404118b2a32SPawel Laszczak case SLOT_SPEED_HS: 405118b2a32SPawel Laszczak s = "high-speed"; 406118b2a32SPawel Laszczak break; 407118b2a32SPawel Laszczak case SLOT_SPEED_SS: 408118b2a32SPawel Laszczak s = "super-speed"; 409118b2a32SPawel Laszczak break; 410118b2a32SPawel Laszczak case SLOT_SPEED_SSP: 411118b2a32SPawel Laszczak s = "super-speed plus"; 412118b2a32SPawel Laszczak break; 413118b2a32SPawel Laszczak default: 414118b2a32SPawel Laszczak s = "UNKNOWN speed"; 415118b2a32SPawel Laszczak } 416118b2a32SPawel Laszczak 41716e36101SPawel Laszczak ret = sprintf(str, "%s Ctx Entries %d", 418118b2a32SPawel Laszczak s, (info & LAST_CTX_MASK) >> 27); 419118b2a32SPawel Laszczak 420118b2a32SPawel Laszczak ret += sprintf(str + ret, " [Intr %ld] Addr %ld State %s", 421118b2a32SPawel Laszczak GET_INTR_TARGET(int_target), state & DEV_ADDR_MASK, 422118b2a32SPawel Laszczak cdnsp_slot_state_string(GET_SLOT_STATE(state))); 423118b2a32SPawel Laszczak 424118b2a32SPawel Laszczak return str; 425118b2a32SPawel Laszczak } 426118b2a32SPawel Laszczak 427118b2a32SPawel Laszczak static inline const char *cdnsp_portsc_link_state_string(u32 portsc) 428118b2a32SPawel Laszczak { 429118b2a32SPawel Laszczak switch (portsc & PORT_PLS_MASK) { 430118b2a32SPawel Laszczak case XDEV_U0: 431118b2a32SPawel Laszczak return "U0"; 432118b2a32SPawel Laszczak case XDEV_U1: 433118b2a32SPawel Laszczak return "U1"; 434118b2a32SPawel Laszczak case XDEV_U2: 435118b2a32SPawel Laszczak return "U2"; 436118b2a32SPawel Laszczak case XDEV_U3: 437118b2a32SPawel Laszczak return "U3"; 438118b2a32SPawel Laszczak case XDEV_DISABLED: 439118b2a32SPawel Laszczak return "Disabled"; 440118b2a32SPawel Laszczak case XDEV_RXDETECT: 441118b2a32SPawel Laszczak return "RxDetect"; 442118b2a32SPawel Laszczak case XDEV_INACTIVE: 443118b2a32SPawel Laszczak return "Inactive"; 444118b2a32SPawel Laszczak case XDEV_POLLING: 445118b2a32SPawel Laszczak return "Polling"; 446118b2a32SPawel Laszczak case XDEV_RECOVERY: 447118b2a32SPawel Laszczak return "Recovery"; 448118b2a32SPawel Laszczak case XDEV_HOT_RESET: 449118b2a32SPawel Laszczak return "Hot Reset"; 450118b2a32SPawel Laszczak case XDEV_COMP_MODE: 451118b2a32SPawel Laszczak return "Compliance mode"; 452118b2a32SPawel Laszczak case XDEV_TEST_MODE: 453118b2a32SPawel Laszczak return "Test mode"; 454118b2a32SPawel Laszczak case XDEV_RESUME: 455118b2a32SPawel Laszczak return "Resume"; 456118b2a32SPawel Laszczak default: 457118b2a32SPawel Laszczak break; 458118b2a32SPawel Laszczak } 459118b2a32SPawel Laszczak 460118b2a32SPawel Laszczak return "Unknown"; 461118b2a32SPawel Laszczak } 462118b2a32SPawel Laszczak 463118b2a32SPawel Laszczak static inline const char *cdnsp_decode_portsc(char *str, size_t size, 464118b2a32SPawel Laszczak u32 portsc) 465118b2a32SPawel Laszczak { 466118b2a32SPawel Laszczak int ret; 467118b2a32SPawel Laszczak 468*b385ef08SLee Jones ret = scnprintf(str, size, "%s %s %s Link:%s PortSpeed:%d ", 469118b2a32SPawel Laszczak portsc & PORT_POWER ? "Powered" : "Powered-off", 470118b2a32SPawel Laszczak portsc & PORT_CONNECT ? "Connected" : "Not-connected", 471118b2a32SPawel Laszczak portsc & PORT_PED ? "Enabled" : "Disabled", 472118b2a32SPawel Laszczak cdnsp_portsc_link_state_string(portsc), 473118b2a32SPawel Laszczak DEV_PORT_SPEED(portsc)); 474118b2a32SPawel Laszczak 475118b2a32SPawel Laszczak if (portsc & PORT_RESET) 476*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "In-Reset "); 477118b2a32SPawel Laszczak 478*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "Change: "); 479118b2a32SPawel Laszczak if (portsc & PORT_CSC) 480*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "CSC "); 481118b2a32SPawel Laszczak if (portsc & PORT_WRC) 482*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "WRC "); 483118b2a32SPawel Laszczak if (portsc & PORT_RC) 484*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "PRC "); 485118b2a32SPawel Laszczak if (portsc & PORT_PLC) 486*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "PLC "); 487118b2a32SPawel Laszczak if (portsc & PORT_CEC) 488*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "CEC "); 489*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "Wake: "); 490118b2a32SPawel Laszczak if (portsc & PORT_WKCONN_E) 491*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "WCE "); 492118b2a32SPawel Laszczak if (portsc & PORT_WKDISC_E) 493*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "WDE "); 494118b2a32SPawel Laszczak 495118b2a32SPawel Laszczak return str; 496118b2a32SPawel Laszczak } 497118b2a32SPawel Laszczak 498118b2a32SPawel Laszczak static inline const char *cdnsp_ep_state_string(u8 state) 499118b2a32SPawel Laszczak { 500118b2a32SPawel Laszczak switch (state) { 501118b2a32SPawel Laszczak case EP_STATE_DISABLED: 502118b2a32SPawel Laszczak return "disabled"; 503118b2a32SPawel Laszczak case EP_STATE_RUNNING: 504118b2a32SPawel Laszczak return "running"; 505118b2a32SPawel Laszczak case EP_STATE_HALTED: 506118b2a32SPawel Laszczak return "halted"; 507118b2a32SPawel Laszczak case EP_STATE_STOPPED: 508118b2a32SPawel Laszczak return "stopped"; 509118b2a32SPawel Laszczak case EP_STATE_ERROR: 510118b2a32SPawel Laszczak return "error"; 511118b2a32SPawel Laszczak default: 512118b2a32SPawel Laszczak return "INVALID"; 513118b2a32SPawel Laszczak } 514118b2a32SPawel Laszczak } 515118b2a32SPawel Laszczak 516118b2a32SPawel Laszczak static inline const char *cdnsp_ep_type_string(u8 type) 517118b2a32SPawel Laszczak { 518118b2a32SPawel Laszczak switch (type) { 519118b2a32SPawel Laszczak case ISOC_OUT_EP: 520118b2a32SPawel Laszczak return "Isoc OUT"; 521118b2a32SPawel Laszczak case BULK_OUT_EP: 522118b2a32SPawel Laszczak return "Bulk OUT"; 523118b2a32SPawel Laszczak case INT_OUT_EP: 524118b2a32SPawel Laszczak return "Int OUT"; 525118b2a32SPawel Laszczak case CTRL_EP: 526118b2a32SPawel Laszczak return "Ctrl"; 527118b2a32SPawel Laszczak case ISOC_IN_EP: 528118b2a32SPawel Laszczak return "Isoc IN"; 529118b2a32SPawel Laszczak case BULK_IN_EP: 530118b2a32SPawel Laszczak return "Bulk IN"; 531118b2a32SPawel Laszczak case INT_IN_EP: 532118b2a32SPawel Laszczak return "Int IN"; 533118b2a32SPawel Laszczak default: 534118b2a32SPawel Laszczak return "INVALID"; 535118b2a32SPawel Laszczak } 536118b2a32SPawel Laszczak } 537118b2a32SPawel Laszczak 538118b2a32SPawel Laszczak static inline const char *cdnsp_decode_ep_context(char *str, size_t size, 539118b2a32SPawel Laszczak u32 info, u32 info2, 540118b2a32SPawel Laszczak u64 deq, u32 tx_info) 541118b2a32SPawel Laszczak { 542118b2a32SPawel Laszczak u8 max_pstr, ep_state, interval, ep_type, burst, cerr, mult; 543118b2a32SPawel Laszczak bool lsa, hid; 544118b2a32SPawel Laszczak u16 maxp, avg; 545118b2a32SPawel Laszczak u32 esit; 546118b2a32SPawel Laszczak int ret; 547118b2a32SPawel Laszczak 548118b2a32SPawel Laszczak esit = CTX_TO_MAX_ESIT_PAYLOAD_HI(info) << 16 | 549118b2a32SPawel Laszczak CTX_TO_MAX_ESIT_PAYLOAD_LO(tx_info); 550118b2a32SPawel Laszczak 551118b2a32SPawel Laszczak ep_state = info & EP_STATE_MASK; 552118b2a32SPawel Laszczak max_pstr = CTX_TO_EP_MAXPSTREAMS(info); 553118b2a32SPawel Laszczak interval = CTX_TO_EP_INTERVAL(info); 554118b2a32SPawel Laszczak mult = CTX_TO_EP_MULT(info) + 1; 555118b2a32SPawel Laszczak lsa = !!(info & EP_HAS_LSA); 556118b2a32SPawel Laszczak 557118b2a32SPawel Laszczak cerr = (info2 & (3 << 1)) >> 1; 558118b2a32SPawel Laszczak ep_type = CTX_TO_EP_TYPE(info2); 559118b2a32SPawel Laszczak hid = !!(info2 & (1 << 7)); 560118b2a32SPawel Laszczak burst = CTX_TO_MAX_BURST(info2); 561118b2a32SPawel Laszczak maxp = MAX_PACKET_DECODED(info2); 562118b2a32SPawel Laszczak 563118b2a32SPawel Laszczak avg = EP_AVG_TRB_LENGTH(tx_info); 564118b2a32SPawel Laszczak 565*b385ef08SLee Jones ret = scnprintf(str, size, "State %s mult %d max P. Streams %d %s", 566118b2a32SPawel Laszczak cdnsp_ep_state_string(ep_state), mult, 567118b2a32SPawel Laszczak max_pstr, lsa ? "LSA " : ""); 568118b2a32SPawel Laszczak 569*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, 570118b2a32SPawel Laszczak "interval %d us max ESIT payload %d CErr %d ", 571118b2a32SPawel Laszczak (1 << interval) * 125, esit, cerr); 572118b2a32SPawel Laszczak 573*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, 574118b2a32SPawel Laszczak "Type %s %sburst %d maxp %d deq %016llx ", 575118b2a32SPawel Laszczak cdnsp_ep_type_string(ep_type), hid ? "HID" : "", 576118b2a32SPawel Laszczak burst, maxp, deq); 577118b2a32SPawel Laszczak 578*b385ef08SLee Jones ret += scnprintf(str + ret, size - ret, "avg trb len %d", avg); 579118b2a32SPawel Laszczak 580118b2a32SPawel Laszczak return str; 581118b2a32SPawel Laszczak } 582118b2a32SPawel Laszczak 583118b2a32SPawel Laszczak #endif /*__LINUX_CDNSP_DEBUG*/ 584