linux/drivers/usb/early/xhci-dbc.h
<<
>>
Prefs
   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 */
  19struct 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 */
  55struct xdbc_trb {
  56        __le32 field[4];
  57};
  58
  59struct xdbc_erst_entry {
  60        __le64  seg_addr;
  61        __le32  seg_size;
  62        __le32  __reserved_0;
  63};
  64
  65struct 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
  74struct 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
  82struct 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
  94struct 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 */
 109struct xdbc_segment {
 110        struct xdbc_trb         *trbs;
 111        dma_addr_t              dma;
 112};
 113
 114#define XDBC_TRBS_PER_SEGMENT   256
 115
 116struct 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
 140struct 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 */
 223