root/drivers/usb/early/xhci-dbc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */