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