1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * xhci-dbc.h - xHCI debug capability early driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2016 Intel Corporation 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Author: Lu Baolu <baolu.lu@linux.intel.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __LINUX_XHCI_DBC_H 11*4882a593Smuzhiyun #define __LINUX_XHCI_DBC_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/types.h> 14*4882a593Smuzhiyun #include <linux/usb/ch9.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* 17*4882a593Smuzhiyun * xHCI Debug Capability Register interfaces: 18*4882a593Smuzhiyun */ 19*4882a593Smuzhiyun struct xdbc_regs { 20*4882a593Smuzhiyun __le32 capability; 21*4882a593Smuzhiyun __le32 doorbell; 22*4882a593Smuzhiyun __le32 ersts; /* Event Ring Segment Table Size*/ 23*4882a593Smuzhiyun __le32 __reserved_0; /* 0c~0f reserved bits */ 24*4882a593Smuzhiyun __le64 erstba; /* Event Ring Segment Table Base Address */ 25*4882a593Smuzhiyun __le64 erdp; /* Event Ring Dequeue Pointer */ 26*4882a593Smuzhiyun __le32 control; 27*4882a593Smuzhiyun __le32 status; 28*4882a593Smuzhiyun __le32 portsc; /* Port status and control */ 29*4882a593Smuzhiyun __le32 __reserved_1; /* 2b~28 reserved bits */ 30*4882a593Smuzhiyun __le64 dccp; /* Debug Capability Context Pointer */ 31*4882a593Smuzhiyun __le32 devinfo1; /* Device Descriptor Info Register 1 */ 32*4882a593Smuzhiyun __le32 devinfo2; /* Device Descriptor Info Register 2 */ 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define DEBUG_MAX_BURST(p) (((p) >> 16) & 0xff) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define CTRL_DBC_RUN BIT(0) 38*4882a593Smuzhiyun #define CTRL_PORT_ENABLE BIT(1) 39*4882a593Smuzhiyun #define CTRL_HALT_OUT_TR BIT(2) 40*4882a593Smuzhiyun #define CTRL_HALT_IN_TR BIT(3) 41*4882a593Smuzhiyun #define CTRL_DBC_RUN_CHANGE BIT(4) 42*4882a593Smuzhiyun #define CTRL_DBC_ENABLE BIT(31) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define DCST_DEBUG_PORT(p) (((p) >> 24) & 0xff) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define PORTSC_CONN_STATUS BIT(0) 47*4882a593Smuzhiyun #define PORTSC_CONN_CHANGE BIT(17) 48*4882a593Smuzhiyun #define PORTSC_RESET_CHANGE BIT(21) 49*4882a593Smuzhiyun #define PORTSC_LINK_CHANGE BIT(22) 50*4882a593Smuzhiyun #define PORTSC_CONFIG_CHANGE BIT(23) 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* 53*4882a593Smuzhiyun * xHCI Debug Capability data structures: 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun struct xdbc_trb { 56*4882a593Smuzhiyun __le32 field[4]; 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun struct xdbc_erst_entry { 60*4882a593Smuzhiyun __le64 seg_addr; 61*4882a593Smuzhiyun __le32 seg_size; 62*4882a593Smuzhiyun __le32 __reserved_0; 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun struct xdbc_info_context { 66*4882a593Smuzhiyun __le64 string0; 67*4882a593Smuzhiyun __le64 manufacturer; 68*4882a593Smuzhiyun __le64 product; 69*4882a593Smuzhiyun __le64 serial; 70*4882a593Smuzhiyun __le32 length; 71*4882a593Smuzhiyun __le32 __reserved_0[7]; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct xdbc_ep_context { 75*4882a593Smuzhiyun __le32 ep_info1; 76*4882a593Smuzhiyun __le32 ep_info2; 77*4882a593Smuzhiyun __le64 deq; 78*4882a593Smuzhiyun __le32 tx_info; 79*4882a593Smuzhiyun __le32 __reserved_0[11]; 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct xdbc_context { 83*4882a593Smuzhiyun struct xdbc_info_context info; 84*4882a593Smuzhiyun struct xdbc_ep_context out; 85*4882a593Smuzhiyun struct xdbc_ep_context in; 86*4882a593Smuzhiyun }; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define XDBC_INFO_CONTEXT_SIZE 48 89*4882a593Smuzhiyun #define XDBC_MAX_STRING_LENGTH 64 90*4882a593Smuzhiyun #define XDBC_STRING_MANUFACTURER "Linux Foundation" 91*4882a593Smuzhiyun #define XDBC_STRING_PRODUCT "Linux USB GDB Target" 92*4882a593Smuzhiyun #define XDBC_STRING_SERIAL "0001" 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct xdbc_strings { 95*4882a593Smuzhiyun char string0[XDBC_MAX_STRING_LENGTH]; 96*4882a593Smuzhiyun char manufacturer[XDBC_MAX_STRING_LENGTH]; 97*4882a593Smuzhiyun char product[XDBC_MAX_STRING_LENGTH]; 98*4882a593Smuzhiyun char serial[XDBC_MAX_STRING_LENGTH]; 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define XDBC_PROTOCOL 1 /* GNU Remote Debug Command Set */ 102*4882a593Smuzhiyun #define XDBC_VENDOR_ID 0x1d6b /* Linux Foundation 0x1d6b */ 103*4882a593Smuzhiyun #define XDBC_PRODUCT_ID 0x0011 /* __le16 idProduct; device 0011 */ 104*4882a593Smuzhiyun #define XDBC_DEVICE_REV 0x0010 /* 0.10 */ 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* 107*4882a593Smuzhiyun * xHCI Debug Capability software state structures: 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun struct xdbc_segment { 110*4882a593Smuzhiyun struct xdbc_trb *trbs; 111*4882a593Smuzhiyun dma_addr_t dma; 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun #define XDBC_TRBS_PER_SEGMENT 256 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun struct xdbc_ring { 117*4882a593Smuzhiyun struct xdbc_segment *segment; 118*4882a593Smuzhiyun struct xdbc_trb *enqueue; 119*4882a593Smuzhiyun struct xdbc_trb *dequeue; 120*4882a593Smuzhiyun u32 cycle_state; 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* 124*4882a593Smuzhiyun * These are the "Endpoint ID" (also known as "Context Index") values for the 125*4882a593Smuzhiyun * OUT Transfer Ring and the IN Transfer Ring of a Debug Capability Context data 126*4882a593Smuzhiyun * structure. 127*4882a593Smuzhiyun * According to the "eXtensible Host Controller Interface for Universal Serial 128*4882a593Smuzhiyun * Bus (xHCI)" specification, section "7.6.3.2 Endpoint Contexts and Transfer 129*4882a593Smuzhiyun * Rings", these should be 0 and 1, and those are the values AMD machines give 130*4882a593Smuzhiyun * you; but Intel machines seem to use the formula from section "4.5.1 Device 131*4882a593Smuzhiyun * Context Index", which is supposed to be used for the Device Context only. 132*4882a593Smuzhiyun * Luckily the values from Intel don't overlap with those from AMD, so we can 133*4882a593Smuzhiyun * just test for both. 134*4882a593Smuzhiyun */ 135*4882a593Smuzhiyun #define XDBC_EPID_OUT 0 136*4882a593Smuzhiyun #define XDBC_EPID_IN 1 137*4882a593Smuzhiyun #define XDBC_EPID_OUT_INTEL 2 138*4882a593Smuzhiyun #define XDBC_EPID_IN_INTEL 3 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun struct xdbc_state { 141*4882a593Smuzhiyun u16 vendor; 142*4882a593Smuzhiyun u16 device; 143*4882a593Smuzhiyun u32 bus; 144*4882a593Smuzhiyun u32 dev; 145*4882a593Smuzhiyun u32 func; 146*4882a593Smuzhiyun void __iomem *xhci_base; 147*4882a593Smuzhiyun u64 xhci_start; 148*4882a593Smuzhiyun size_t xhci_length; 149*4882a593Smuzhiyun int port_number; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /* DbC register base */ 152*4882a593Smuzhiyun struct xdbc_regs __iomem *xdbc_reg; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun /* DbC table page */ 155*4882a593Smuzhiyun dma_addr_t table_dma; 156*4882a593Smuzhiyun void *table_base; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun /* event ring segment table */ 159*4882a593Smuzhiyun dma_addr_t erst_dma; 160*4882a593Smuzhiyun size_t erst_size; 161*4882a593Smuzhiyun void *erst_base; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun /* event ring segments */ 164*4882a593Smuzhiyun struct xdbc_ring evt_ring; 165*4882a593Smuzhiyun struct xdbc_segment evt_seg; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /* debug capability contexts */ 168*4882a593Smuzhiyun dma_addr_t dbcc_dma; 169*4882a593Smuzhiyun size_t dbcc_size; 170*4882a593Smuzhiyun void *dbcc_base; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* descriptor strings */ 173*4882a593Smuzhiyun dma_addr_t string_dma; 174*4882a593Smuzhiyun size_t string_size; 175*4882a593Smuzhiyun void *string_base; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun /* bulk OUT endpoint */ 178*4882a593Smuzhiyun struct xdbc_ring out_ring; 179*4882a593Smuzhiyun struct xdbc_segment out_seg; 180*4882a593Smuzhiyun void *out_buf; 181*4882a593Smuzhiyun dma_addr_t out_dma; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* bulk IN endpoint */ 184*4882a593Smuzhiyun struct xdbc_ring in_ring; 185*4882a593Smuzhiyun struct xdbc_segment in_seg; 186*4882a593Smuzhiyun void *in_buf; 187*4882a593Smuzhiyun dma_addr_t in_dma; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun u32 flags; 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* spinlock for early_xdbc_write() reentrancy */ 192*4882a593Smuzhiyun raw_spinlock_t lock; 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define XDBC_PCI_MAX_BUSES 256 196*4882a593Smuzhiyun #define XDBC_PCI_MAX_DEVICES 32 197*4882a593Smuzhiyun #define XDBC_PCI_MAX_FUNCTION 8 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define XDBC_TABLE_ENTRY_SIZE 64 200*4882a593Smuzhiyun #define XDBC_ERST_ENTRY_NUM 1 201*4882a593Smuzhiyun #define XDBC_DBCC_ENTRY_NUM 3 202*4882a593Smuzhiyun #define XDBC_STRING_ENTRY_NUM 4 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun /* Bits definitions for xdbc_state.flags: */ 205*4882a593Smuzhiyun #define XDBC_FLAGS_INITIALIZED BIT(0) 206*4882a593Smuzhiyun #define XDBC_FLAGS_IN_STALL BIT(1) 207*4882a593Smuzhiyun #define XDBC_FLAGS_OUT_STALL BIT(2) 208*4882a593Smuzhiyun #define XDBC_FLAGS_IN_PROCESS BIT(3) 209*4882a593Smuzhiyun #define XDBC_FLAGS_OUT_PROCESS BIT(4) 210*4882a593Smuzhiyun #define XDBC_FLAGS_CONFIGURED BIT(5) 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define XDBC_MAX_PACKET 1024 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun /* Door bell target: */ 215*4882a593Smuzhiyun #define OUT_EP_DOORBELL 0 216*4882a593Smuzhiyun #define IN_EP_DOORBELL 1 217*4882a593Smuzhiyun #define DOOR_BELL_TARGET(p) (((p) & 0xff) << 8) 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun #define xdbc_read64(regs) xhci_read_64(NULL, (regs)) 220*4882a593Smuzhiyun #define xdbc_write64(val, regs) xhci_write_64(NULL, (val), (regs)) 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun #endif /* __LINUX_XHCI_DBC_H */ 223