1*2ed98337SAymeric Wibo /*- 2*2ed98337SAymeric Wibo * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*2ed98337SAymeric Wibo * 4*2ed98337SAymeric Wibo * Copyright (c) 2022 Scott Long 5*2ed98337SAymeric Wibo * All rights reserved. 6*2ed98337SAymeric Wibo * 7*2ed98337SAymeric Wibo * Redistribution and use in source and binary forms, with or without 8*2ed98337SAymeric Wibo * modification, are permitted provided that the following conditions 9*2ed98337SAymeric Wibo * are met: 10*2ed98337SAymeric Wibo * 1. Redistributions of source code must retain the above copyright 11*2ed98337SAymeric Wibo * notice, this list of conditions and the following disclaimer. 12*2ed98337SAymeric Wibo * 2. Redistributions in binary form must reproduce the above copyright 13*2ed98337SAymeric Wibo * notice, this list of conditions and the following disclaimer in the 14*2ed98337SAymeric Wibo * documentation and/or other materials provided with the distribution. 15*2ed98337SAymeric Wibo * 16*2ed98337SAymeric Wibo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17*2ed98337SAymeric Wibo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*2ed98337SAymeric Wibo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*2ed98337SAymeric Wibo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20*2ed98337SAymeric Wibo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*2ed98337SAymeric Wibo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*2ed98337SAymeric Wibo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*2ed98337SAymeric Wibo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*2ed98337SAymeric Wibo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*2ed98337SAymeric Wibo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*2ed98337SAymeric Wibo * SUCH DAMAGE. 27*2ed98337SAymeric Wibo * 28*2ed98337SAymeric Wibo * Thunderbolt3/USB4 config space register definitions 29*2ed98337SAymeric Wibo * 30*2ed98337SAymeric Wibo * $FreeBSD$ 31*2ed98337SAymeric Wibo */ 32*2ed98337SAymeric Wibo 33*2ed98337SAymeric Wibo #ifndef _TBCFG_REG_H 34*2ed98337SAymeric Wibo #define _TBCFG_REG_H 35*2ed98337SAymeric Wibo 36*2ed98337SAymeric Wibo /* Config space read request, 6.4.2.3 */ 37*2ed98337SAymeric Wibo struct tb_cfg_read { 38*2ed98337SAymeric Wibo tb_route_t route; 39*2ed98337SAymeric Wibo uint32_t addr_attrs; 40*2ed98337SAymeric Wibo #define TB_CFG_ADDR_SHIFT 0 41*2ed98337SAymeric Wibo #define TB_CFG_ADDR_MASK GENMASK(12,0) 42*2ed98337SAymeric Wibo #define TB_CFG_SIZE_SHIFT 13 43*2ed98337SAymeric Wibo #define TB_CFG_SIZE_MASK GENMASK(18,13) 44*2ed98337SAymeric Wibo #define TB_CFG_ADAPTER_SHIFT 19 45*2ed98337SAymeric Wibo #define TB_CFG_ADAPTER_MASK GENMASK(24,19) 46*2ed98337SAymeric Wibo #define TB_CFG_CS_PATH (0x00 << 25) 47*2ed98337SAymeric Wibo #define TB_CFG_CS_ADAPTER (0x01 << 25) 48*2ed98337SAymeric Wibo #define TB_CFG_CS_ROUTER (0x02 << 25) 49*2ed98337SAymeric Wibo #define TB_CFG_CS_COUNTERS (0x03 << 25) 50*2ed98337SAymeric Wibo #define TB_CFG_SEQ_SHIFT 27 51*2ed98337SAymeric Wibo #define TB_CFG_SEQ_MASK (28,27) 52*2ed98337SAymeric Wibo uint32_t crc; 53*2ed98337SAymeric Wibo }; 54*2ed98337SAymeric Wibo 55*2ed98337SAymeric Wibo /* Config space read request, 6.4.2.4 */ 56*2ed98337SAymeric Wibo struct tb_cfg_read_resp { 57*2ed98337SAymeric Wibo tb_route_t route; 58*2ed98337SAymeric Wibo uint32_t addr_attrs; 59*2ed98337SAymeric Wibo uint32_t data[0]; /* Up to 60 dwords */ 60*2ed98337SAymeric Wibo /* uint32_t crc is at the end */ 61*2ed98337SAymeric Wibo } __packed; 62*2ed98337SAymeric Wibo 63*2ed98337SAymeric Wibo /* Config space write request, 6.4.2.5 */ 64*2ed98337SAymeric Wibo struct tb_cfg_write { 65*2ed98337SAymeric Wibo tb_route_t route; 66*2ed98337SAymeric Wibo uint32_t addr_attrs; 67*2ed98337SAymeric Wibo uint32_t data[0]; /* Up to 60 dwords */ 68*2ed98337SAymeric Wibo /* uint32_t crc is at the end */ 69*2ed98337SAymeric Wibo } __packed; 70*2ed98337SAymeric Wibo 71*2ed98337SAymeric Wibo /* Config space write response, 6.4.2.6 */ 72*2ed98337SAymeric Wibo struct tb_cfg_write_resp { 73*2ed98337SAymeric Wibo tb_route_t route; 74*2ed98337SAymeric Wibo uint32_t addr_attrs; 75*2ed98337SAymeric Wibo uint32_t crc; 76*2ed98337SAymeric Wibo } __packed; 77*2ed98337SAymeric Wibo 78*2ed98337SAymeric Wibo /* Config space event, 6.4.2.7 */ 79*2ed98337SAymeric Wibo struct tb_cfg_notify { 80*2ed98337SAymeric Wibo tb_route_t route; 81*2ed98337SAymeric Wibo uint32_t event_adap; 82*2ed98337SAymeric Wibo #define TB_CFG_EVENT_MASK GENMASK(7,0) 83*2ed98337SAymeric Wibo #define GET_NOTIFY_EVENT(n) ((n)->event_adap & TB_CFG_EVENT_MASK) 84*2ed98337SAymeric Wibo #define TB_CFG_ERR_CONN 0x00 85*2ed98337SAymeric Wibo #define TB_CFG_ERR_LINK 0x01 86*2ed98337SAymeric Wibo #define TB_CFG_ERR_ADDR 0x02 87*2ed98337SAymeric Wibo #define TB_CFG_ERR_ADP 0x04 88*2ed98337SAymeric Wibo #define TB_CFG_ERR_ENUM 0x08 89*2ed98337SAymeric Wibo #define TB_CFG_ERR_NUA 0x09 90*2ed98337SAymeric Wibo #define TB_CFG_ERR_LEN 0x0b 91*2ed98337SAymeric Wibo #define TB_CFG_ERR_HEC 0x0c 92*2ed98337SAymeric Wibo #define TB_CFG_ERR_FC 0x0d 93*2ed98337SAymeric Wibo #define TB_CFG_ERR_PLUG 0x0e 94*2ed98337SAymeric Wibo #define TB_CFG_ERR_LOCK 0x0f 95*2ed98337SAymeric Wibo #define TB_CFG_HP_ACK 0x07 96*2ed98337SAymeric Wibo #define TB_CFG_DP_BW 0x20 97*2ed98337SAymeric Wibo #define TB_CFG_EVENT_ADAPTER_SHIFT 8 98*2ed98337SAymeric Wibo #define TB_CFG_EVENT_ADAPTER_MASK GENMASK(13,8) 99*2ed98337SAymeric Wibo #define GET_NOTIFY_ADAPTER(n) (((n)->event_adap & \ 100*2ed98337SAymeric Wibo TB_CFG_EVENT_ADAPTER_MASK) >> \ 101*2ed98337SAymeric Wibo TB_CFG_EVENT_ADAPTER_SHIFT) 102*2ed98337SAymeric Wibo #define TB_CFG_PG_NONE 0x00000000 103*2ed98337SAymeric Wibo #define TB_CFG_PG_PLUG 0x80000000 104*2ed98337SAymeric Wibo #define TB_CFG_PG_UNPLUG 0xc0000000 105*2ed98337SAymeric Wibo uint32_t crc; 106*2ed98337SAymeric Wibo } __packed; 107*2ed98337SAymeric Wibo 108*2ed98337SAymeric Wibo /* Config space event acknowledgement, 6.4.2.8 */ 109*2ed98337SAymeric Wibo struct tb_cfg_notify_ack { 110*2ed98337SAymeric Wibo tb_route_t route; 111*2ed98337SAymeric Wibo uint32_t crc; 112*2ed98337SAymeric Wibo } __packed; 113*2ed98337SAymeric Wibo 114*2ed98337SAymeric Wibo /* Config space hot plug event, 6.4.2.10 */ 115*2ed98337SAymeric Wibo struct tb_cfg_hotplug { 116*2ed98337SAymeric Wibo tb_route_t route; 117*2ed98337SAymeric Wibo uint32_t adapter_attrs; 118*2ed98337SAymeric Wibo #define TB_CFG_ADPT_MASK GENMASK(5,0) 119*2ed98337SAymeric Wibo #define TB_CFG_UPG_PLUG (0x0 << 31) 120*2ed98337SAymeric Wibo #define TB_CFG_UPG_UNPLUG (0x1 << 31) 121*2ed98337SAymeric Wibo uint32_t crc; 122*2ed98337SAymeric Wibo } __packed; 123*2ed98337SAymeric Wibo 124*2ed98337SAymeric Wibo /* Config space inter-domain request, 6.4.2.11 */ 125*2ed98337SAymeric Wibo struct tb_cfg_xdomain { 126*2ed98337SAymeric Wibo tb_route_t route; 127*2ed98337SAymeric Wibo uint32_t data[0]; 128*2ed98337SAymeric Wibo /* uint32_t crc is at the end */ 129*2ed98337SAymeric Wibo } __packed; 130*2ed98337SAymeric Wibo 131*2ed98337SAymeric Wibo /* Config space inter-domain response, 6.4.2.12 */ 132*2ed98337SAymeric Wibo struct tb_cfg_xdomain_resp { 133*2ed98337SAymeric Wibo tb_route_t route; 134*2ed98337SAymeric Wibo uint32_t data[0]; 135*2ed98337SAymeric Wibo /* uint32_t crc is at the end */ 136*2ed98337SAymeric Wibo } __packed; 137*2ed98337SAymeric Wibo 138*2ed98337SAymeric Wibo /* Config space router basic registers 8.2.1.1 */ 139*2ed98337SAymeric Wibo struct tb_cfg_router { 140*2ed98337SAymeric Wibo uint16_t vendor_id; /* ROUTER_CS_0 */ 141*2ed98337SAymeric Wibo uint16_t product_id; 142*2ed98337SAymeric Wibo uint32_t router_cs_1; /* ROUTER_CS_1 */ 143*2ed98337SAymeric Wibo #define ROUTER_CS1_NEXT_CAP_MASK GENMASK(7,0) 144*2ed98337SAymeric Wibo #define GET_ROUTER_CS_NEXT_CAP(r) (r->router_cs_1 & \ 145*2ed98337SAymeric Wibo ROUTER_CS1_NEXT_CAP_MASK) 146*2ed98337SAymeric Wibo #define ROUTER_CS1_UPSTREAM_SHIFT 8 147*2ed98337SAymeric Wibo #define ROUTER_CS1_UPSTREAM_MASK GENMASK(13,8) 148*2ed98337SAymeric Wibo #define GET_ROUTER_CS_UPSTREAM_ADAP(r) ((r->router_cs_1 & \ 149*2ed98337SAymeric Wibo ROUTER_CS1_UPSTREAM_MASK) >> \ 150*2ed98337SAymeric Wibo ROUTER_CS1_UPSTREAM_SHIFT) 151*2ed98337SAymeric Wibo #define ROUTER_CS1_MAX_SHIFT 14 152*2ed98337SAymeric Wibo #define ROUTER_CS1_MAX_MASK GENMASK(19,14) 153*2ed98337SAymeric Wibo #define GET_ROUTER_CS_MAX_ADAP(r) ((r->router_cs_1 & \ 154*2ed98337SAymeric Wibo ROUTER_CS1_MAX_MASK) >> \ 155*2ed98337SAymeric Wibo ROUTER_CS1_MAX_SHIFT) 156*2ed98337SAymeric Wibo #define ROUTER_CS1_MAX_ADAPTERS 64 157*2ed98337SAymeric Wibo #define ROUTER_CS1_DEPTH_SHIFT 20 158*2ed98337SAymeric Wibo #define ROUTER_CS1_DEPTH_MASK GENMASK(22,20) 159*2ed98337SAymeric Wibo #define GET_ROUTER_CS_DEPTH(r) ((r->router_cs_1 & \ 160*2ed98337SAymeric Wibo ROUTER_CS1_DEPTH_MASK) >> \ 161*2ed98337SAymeric Wibo ROUTER_CS1_DEPTH_SHIFT) 162*2ed98337SAymeric Wibo #define ROUTER_CS1_REVISION_SHIFT 24 163*2ed98337SAymeric Wibo #define ROUTER_CS1_REVISION_MASK GENMASK(31,24) 164*2ed98337SAymeric Wibo #define GET_ROUTER_CS_REVISION ((r->router_cs_1 & \ 165*2ed98337SAymeric Wibo ROUTER_CS1_REVISION_MASK) >> \ 166*2ed98337SAymeric Wibo ROUTER_CS1_REVISION_SHIFT) 167*2ed98337SAymeric Wibo uint32_t topology_lo; /* ROUTER_CS_2 */ 168*2ed98337SAymeric Wibo uint32_t topology_hi; /* ROUTER_CS_3 */ 169*2ed98337SAymeric Wibo #define CFG_TOPOLOGY_VALID (1 << 31) 170*2ed98337SAymeric Wibo uint8_t notification_timeout; /* ROUTER_CS_4 */ 171*2ed98337SAymeric Wibo uint8_t cm_version; 172*2ed98337SAymeric Wibo #define CFG_CM_USB4 0x10 173*2ed98337SAymeric Wibo uint8_t rsrvd1; 174*2ed98337SAymeric Wibo uint8_t usb4_version; 175*2ed98337SAymeric Wibo #define CFG_USB4_V1_0 0x10 176*2ed98337SAymeric Wibo uint32_t flags_cs5; /* ROUTER_CS_5 */ 177*2ed98337SAymeric Wibo #define CFG_CS5_SLP (1 << 0) 178*2ed98337SAymeric Wibo #define CFG_CS5_WOP (1 << 1) 179*2ed98337SAymeric Wibo #define CFG_CS5_WOU (1 << 2) 180*2ed98337SAymeric Wibo #define CFG_CS5_DP (1 << 3) 181*2ed98337SAymeric Wibo #define CFG_CS5_C3S (1 << 23) 182*2ed98337SAymeric Wibo #define CFG_CS5_PTO (1 << 24) 183*2ed98337SAymeric Wibo #define CFG_CS5_UTO (1 << 25) 184*2ed98337SAymeric Wibo #define CFG_CS5_HCO (1 << 26) 185*2ed98337SAymeric Wibo #define CFG_CS5_CV (1 << 31) 186*2ed98337SAymeric Wibo uint32_t flags_cs6; /* ROUTER_CS_6 */ 187*2ed98337SAymeric Wibo #define CFG_CS6_SLPR (1 << 0) 188*2ed98337SAymeric Wibo #define CFG_CS6_TNS (1 << 1) 189*2ed98337SAymeric Wibo #define CFG_CS6_WAKE_PCIE (1 << 2) 190*2ed98337SAymeric Wibo #define CFG_CS6_WAKE_USB3 (1 << 3) 191*2ed98337SAymeric Wibo #define CFG_CS6_WAKE_DP (1 << 4) 192*2ed98337SAymeric Wibo #define CFG_CS6_HCI (1 << 18) 193*2ed98337SAymeric Wibo #define CFG_CS6_RR (1 << 24) 194*2ed98337SAymeric Wibo #define CFG_CS6_CR (1 << 25) 195*2ed98337SAymeric Wibo uint32_t uuid_hi; /* ROUTER_CS_7 */ 196*2ed98337SAymeric Wibo uint32_t uuid_lo; /* ROUTER_CS_8 */ 197*2ed98337SAymeric Wibo uint32_t data[16]; /* ROUTER_CS_9-24 */ 198*2ed98337SAymeric Wibo uint32_t metadata; /* ROUTER_CS_25 */ 199*2ed98337SAymeric Wibo uint32_t opcode_status; /* ROUTER_CS_26 */ 200*2ed98337SAymeric Wibo /* TBD: Opcodes and status */ 201*2ed98337SAymeric Wibo #define CFG_ONS (1 << 30) 202*2ed98337SAymeric Wibo #define CFG_OV (1 << 31) 203*2ed98337SAymeric Wibo } __packed; 204*2ed98337SAymeric Wibo 205*2ed98337SAymeric Wibo #define TB_CFG_CAP_OFFSET_MAX 0xfff 206*2ed98337SAymeric Wibo 207*2ed98337SAymeric Wibo /* Config space router capability header 8.2.1.3/8.2.1.4 */ 208*2ed98337SAymeric Wibo struct tb_cfg_cap_hdr { 209*2ed98337SAymeric Wibo uint8_t next_cap; 210*2ed98337SAymeric Wibo uint8_t cap_id; 211*2ed98337SAymeric Wibo } __packed; 212*2ed98337SAymeric Wibo 213*2ed98337SAymeric Wibo /* Config space router TMU registers 8.2.1.2 */ 214*2ed98337SAymeric Wibo struct tb_cfg_cap_tmu { 215*2ed98337SAymeric Wibo struct tb_cfg_cap_hdr hdr; 216*2ed98337SAymeric Wibo #define TB_CFG_CAP_TMU 0x03 217*2ed98337SAymeric Wibo } __packed; 218*2ed98337SAymeric Wibo 219*2ed98337SAymeric Wibo struct tb_cfg_vsc_cap { 220*2ed98337SAymeric Wibo struct tb_cfg_cap_hdr hdr; 221*2ed98337SAymeric Wibo #define TB_CFG_CAP_VSC 0x05 222*2ed98337SAymeric Wibo uint8_t vsc_id; 223*2ed98337SAymeric Wibo uint8_t len; 224*2ed98337SAymeric Wibo } __packed; 225*2ed98337SAymeric Wibo 226*2ed98337SAymeric Wibo struct tb_cfg_vsec_cap { 227*2ed98337SAymeric Wibo struct tb_cfg_cap_hdr hdr; 228*2ed98337SAymeric Wibo #define TB_CFG_CAP_VSEC 0x05 229*2ed98337SAymeric Wibo uint8_t vsec_id; 230*2ed98337SAymeric Wibo uint8_t len; 231*2ed98337SAymeric Wibo uint16_t vsec_next_cap; 232*2ed98337SAymeric Wibo uint16_t vsec_len; 233*2ed98337SAymeric Wibo } __packed; 234*2ed98337SAymeric Wibo 235*2ed98337SAymeric Wibo union tb_cfg_cap { 236*2ed98337SAymeric Wibo struct tb_cfg_cap_hdr hdr; 237*2ed98337SAymeric Wibo struct tb_cfg_cap_tmu tmu; 238*2ed98337SAymeric Wibo struct tb_cfg_vsc_cap vsc; 239*2ed98337SAymeric Wibo struct tb_cfg_vsec_cap vsec; 240*2ed98337SAymeric Wibo } __packed; 241*2ed98337SAymeric Wibo 242*2ed98337SAymeric Wibo #define TB_CFG_VSC_PLUG 0x01 /* Hot Plug and DROM */ 243*2ed98337SAymeric Wibo 244*2ed98337SAymeric Wibo #define TB_CFG_VSEC_LC 0x06 /* Link Controller */ 245*2ed98337SAymeric Wibo #define TB_LC_DESC 0x02 /* LC Descriptor fields */ 246*2ed98337SAymeric Wibo #define TB_LC_DESC_NUM_LC_MASK GENMASK(3, 0) 247*2ed98337SAymeric Wibo #define TB_LC_DESC_SIZE_SHIFT 8 248*2ed98337SAymeric Wibo #define TB_LC_DESC_SIZE_MASK GENMASK(15, 8) 249*2ed98337SAymeric Wibo #define TB_LC_DESC_PORT_SHIFT 16 250*2ed98337SAymeric Wibo #define TB_LC_DESC_PORT_MASK GENMASK(27, 16) 251*2ed98337SAymeric Wibo #define TB_LC_UUID 0x03 252*2ed98337SAymeric Wibo #define TB_LC_DP_SINK 0x10 /* Display Port config */ 253*2ed98337SAymeric Wibo #define TB_LC_PORT_ATTR 0x8d /* Port attributes */ 254*2ed98337SAymeric Wibo #define TB_LC_PORT_ATTR_BE (1 << 12) /* Bonding enabled */ 255*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL 0x96 /* Sleep control */ 256*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_WOC (1 << 1) 257*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_WOD (1 << 2) 258*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_WOU4 (1 << 5) 259*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_WOP (1 << 6) 260*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_L1C (1 << 16) 261*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_L1D (1 << 17) 262*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_L2C (1 << 20) 263*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_L2D (1 << 21) 264*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_UFP (1 << 30) 265*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_SLP (1 << 31) 266*2ed98337SAymeric Wibo #define TB_LC_POWER 0x740 267*2ed98337SAymeric Wibo 268*2ed98337SAymeric Wibo /* Config space adapter basic registers 8.2.2.1 */ 269*2ed98337SAymeric Wibo struct tb_cfg_adapter { 270*2ed98337SAymeric Wibo uint16_t vendor_id; /* ADP CS0 */ 271*2ed98337SAymeric Wibo uint16_t product_id; 272*2ed98337SAymeric Wibo uint32_t adp_cs1; /* ADP CS1 */ 273*2ed98337SAymeric Wibo #define ADP_CS1_NEXT_CAP_MASK GENMASK(7,0) 274*2ed98337SAymeric Wibo #define GET_ADP_CS_NEXT_CAP(a) (a->adp_cs1 & \ 275*2ed98337SAymeric Wibo ADP_CS1_NEXT_CAP_MASK) 276*2ed98337SAymeric Wibo #define ADP_CS1_COUNTER_SHIFT 8 277*2ed98337SAymeric Wibo #define ADP_CS1_COUNTER_MASK GENMASK(18,8) 278*2ed98337SAymeric Wibo #define GET_ADP_CS_MAX_COUNTERS(a) ((a->adp_cs1 & \ 279*2ed98337SAymeric Wibo ADP_CS1_COUNTER_MASK) >> \ 280*2ed98337SAymeric Wibo ADP_CS1_COUNTER_SHIFT) 281*2ed98337SAymeric Wibo #define CFG_COUNTER_CONFIG_FLAG (1 << 19) 282*2ed98337SAymeric Wibo uint32_t adp_cs2; /* ADP CS2 */ 283*2ed98337SAymeric Wibo #define ADP_CS2_TYPE_MASK GENMASK(23,0) 284*2ed98337SAymeric Wibo #define GET_ADP_CS_TYPE(a) (a->adp_cs2 & ADP_CS2_TYPE_MASK) 285*2ed98337SAymeric Wibo #define ADP_CS2_UNSUPPORTED 0x000000 286*2ed98337SAymeric Wibo #define ADP_CS2_LANE 0x000001 287*2ed98337SAymeric Wibo #define ADP_CS2_HOSTIF 0x000002 288*2ed98337SAymeric Wibo #define ADP_CS2_PCIE_DFP 0x100101 289*2ed98337SAymeric Wibo #define ADP_CS2_PCIE_UFP 0x100102 290*2ed98337SAymeric Wibo #define ADP_CS2_DP_OUT 0x0e0102 291*2ed98337SAymeric Wibo #define ADP_CS2_DP_IN 0x0e0101 292*2ed98337SAymeric Wibo #define ADP_CS2_USB3_DFP 0x200101 293*2ed98337SAymeric Wibo #define ADP_CS2_USB3_UFP 0x200102 294*2ed98337SAymeric Wibo uint32_t adp_cs3; /* ADP CS 3 */ 295*2ed98337SAymeric Wibo #define ADP_CS3_ADP_NUM_SHIFT 20 296*2ed98337SAymeric Wibo #define ADP_CS3_ADP_NUM_MASK GENMASK(25,20) 297*2ed98337SAymeric Wibo #define GET_ADP_CS_ADP_NUM(a) ((a->adp_cs3 & \ 298*2ed98337SAymeric Wibo ADP_CS3_ADP_NUM_MASK) >> \ 299*2ed98337SAymeric Wibo ADP_CS3_ADP_NUM_SHIFT) 300*2ed98337SAymeric Wibo #define CFG_ADP_HEC_ERROR (1 << 29) 301*2ed98337SAymeric Wibo #define CFG_ADP_FC_ERROR (1 << 30) 302*2ed98337SAymeric Wibo #define CFG_ADP_SBC (1 << 31) 303*2ed98337SAymeric Wibo } __packed; 304*2ed98337SAymeric Wibo 305*2ed98337SAymeric Wibo /* Config space lane adapter capability 8.2.2.3 */ 306*2ed98337SAymeric Wibo struct tb_cfg_cap_lane { 307*2ed98337SAymeric Wibo struct tb_cfg_cap_hdr hdr; /* LANE_ADP_CS_0 */ 308*2ed98337SAymeric Wibo #define TB_CFG_CAP_LANE 0x01 309*2ed98337SAymeric Wibo /* Supported link/width/power */ 310*2ed98337SAymeric Wibo uint16_t supp_lwp; 311*2ed98337SAymeric Wibo #define CAP_LANE_LINK_MASK GENMASK(3,0) 312*2ed98337SAymeric Wibo #define CAP_LANE_LINK_GEN3 0x0004 313*2ed98337SAymeric Wibo #define CAP_LANE_LINK_GEN2 0x0008 314*2ed98337SAymeric Wibo #define CAP_LANE_WIDTH_MASK GENMASK(9,4) 315*2ed98337SAymeric Wibo #define CAP_LANE_WIDTH_1X 0x0010 316*2ed98337SAymeric Wibo #define CAP_LANE_WIDTH_2X 0x0020 317*2ed98337SAymeric Wibo #define CAP_LANE_POWER_CL0 0x0400 318*2ed98337SAymeric Wibo #define CAP_LANE_POWER_CL1 0x0800 319*2ed98337SAymeric Wibo #define CAP_LANE_POWER_CL2 0x1000 320*2ed98337SAymeric Wibo /* Target link/width/power */ 321*2ed98337SAymeric Wibo uint16_t targ_lwp; /* LANE_ADP_CS_1 */ 322*2ed98337SAymeric Wibo #define CAP_LANE_TARGET_GEN2 0x0008 323*2ed98337SAymeric Wibo #define CAP_LANE_TARGET_GEN3 0x000c 324*2ed98337SAymeric Wibo #define CAP_LANE_TARGET_SINGLE 0x0010 325*2ed98337SAymeric Wibo #define CAP_LANE_TARGET_DUAL 0x0030 326*2ed98337SAymeric Wibo #define CAP_LANE_DISABLE 0x4000 327*2ed98337SAymeric Wibo #define CAP_LANE_BONDING 0x8000 328*2ed98337SAymeric Wibo /* Current link/width/state */ 329*2ed98337SAymeric Wibo uint16_t current_lws; 330*2ed98337SAymeric Wibo /* Same definitions a supp_lwp for bits 0 - 9 */ 331*2ed98337SAymeric Wibo #define CAP_LANE_STATE_SHIFT 10 332*2ed98337SAymeric Wibo #define CAP_LANE_STATE_MASK GENMASK(13,10) 333*2ed98337SAymeric Wibo #define CAP_LANE_STATE_DISABLE (0x0 << CAP_LANE_STATE_SHIFT) 334*2ed98337SAymeric Wibo #define CAP_LANE_STATE_TRAINING (0x1 << CAP_LANE_STATE_SHIFT) 335*2ed98337SAymeric Wibo #define CAP_LANE_STATE_CL0 (0x2 << CAP_LANE_STATE_SHIFT) 336*2ed98337SAymeric Wibo #define CAP_LANE_STATE_TXCL0 (0x3 << CAP_LANE_STATE_SHIFT) 337*2ed98337SAymeric Wibo #define CAP_LANE_STATE_RXCL0 (0x4 << CAP_LANE_STATE_SHIFT) 338*2ed98337SAymeric Wibo #define CAP_LANE_STATE_CL1 (0x5 << CAP_LANE_STATE_SHIFT) 339*2ed98337SAymeric Wibo #define CAP_LANE_STATE_CL2 (0x6 << CAP_LANE_STATE_SHIFT) 340*2ed98337SAymeric Wibo #define CAP_LANE_STATE_CLD (0x7 << CAP_LANE_STATE_SHIFT) 341*2ed98337SAymeric Wibo #define CAP_LANE_PMS 0x4000 342*2ed98337SAymeric Wibo /* Logical Layer Errors */ 343*2ed98337SAymeric Wibo uint16_t lle; /* LANE_ADP_CS_2 */ 344*2ed98337SAymeric Wibo #define CAP_LANE_LLE_MASK GENMASK(6,0) 345*2ed98337SAymeric Wibo #define CAP_LANE_LLE_ALE 0x01 346*2ed98337SAymeric Wibo #define CAP_LANE_LLE_OSE 0x02 347*2ed98337SAymeric Wibo #define CAP_LANE_LLE_TE 0x04 348*2ed98337SAymeric Wibo #define CAP_LANE_LLE_EBE 0x08 349*2ed98337SAymeric Wibo #define CAP_LANE_LLE_DBE 0x10 350*2ed98337SAymeric Wibo #define CAP_LANE_LLE_RDE 0x20 351*2ed98337SAymeric Wibo #define CAP_LANE_LLE_RST 0x40 352*2ed98337SAymeric Wibo uint16_t lle_enable; 353*2ed98337SAymeric Wibo } __packed; 354*2ed98337SAymeric Wibo 355*2ed98337SAymeric Wibo /* Config space path registers 8.2.3.1 */ 356*2ed98337SAymeric Wibo struct tb_cfg_path { 357*2ed98337SAymeric Wibo } __packed; 358*2ed98337SAymeric Wibo 359*2ed98337SAymeric Wibo /* Config space counter registers 8.2.4 */ 360*2ed98337SAymeric Wibo struct tb_cfg_counters { 361*2ed98337SAymeric Wibo } __packed; 362*2ed98337SAymeric Wibo 363*2ed98337SAymeric Wibo #endif /* _TBCFG_REG_H */ 364