1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Thunderbolt driver - Port/Switch config area registers 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Every thunderbolt device consists (logically) of a switch with multiple 6*4882a593Smuzhiyun * ports. Every port contains up to four config regions (HOPS, PORT, SWITCH, 7*4882a593Smuzhiyun * COUNTERS) which are used to configure the device. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Copyright (c) 2014 Andreas Noever <andreas.noever@gmail.com> 10*4882a593Smuzhiyun * Copyright (C) 2018, Intel Corporation 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifndef _TB_REGS 14*4882a593Smuzhiyun #define _TB_REGS 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include <linux/types.h> 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define TB_ROUTE_SHIFT 8 /* number of bits in a port entry of a route */ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* 23*4882a593Smuzhiyun * TODO: should be 63? But we do not know how to receive frames larger than 256 24*4882a593Smuzhiyun * bytes at the frame level. (header + checksum = 16, 60*4 = 240) 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun #define TB_MAX_CONFIG_RW_LENGTH 60 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun enum tb_switch_cap { 29*4882a593Smuzhiyun TB_SWITCH_CAP_TMU = 0x03, 30*4882a593Smuzhiyun TB_SWITCH_CAP_VSE = 0x05, 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun enum tb_switch_vse_cap { 34*4882a593Smuzhiyun TB_VSE_CAP_PLUG_EVENTS = 0x01, /* also EEPROM */ 35*4882a593Smuzhiyun TB_VSE_CAP_TIME2 = 0x03, 36*4882a593Smuzhiyun TB_VSE_CAP_IECS = 0x04, 37*4882a593Smuzhiyun TB_VSE_CAP_LINK_CONTROLLER = 0x06, /* also IECS */ 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun enum tb_port_cap { 41*4882a593Smuzhiyun TB_PORT_CAP_PHY = 0x01, 42*4882a593Smuzhiyun TB_PORT_CAP_POWER = 0x02, 43*4882a593Smuzhiyun TB_PORT_CAP_TIME1 = 0x03, 44*4882a593Smuzhiyun TB_PORT_CAP_ADAP = 0x04, 45*4882a593Smuzhiyun TB_PORT_CAP_VSE = 0x05, 46*4882a593Smuzhiyun TB_PORT_CAP_USB4 = 0x06, 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun enum tb_port_state { 50*4882a593Smuzhiyun TB_PORT_DISABLED = 0, /* tb_cap_phy.disable == 1 */ 51*4882a593Smuzhiyun TB_PORT_CONNECTING = 1, /* retry */ 52*4882a593Smuzhiyun TB_PORT_UP = 2, 53*4882a593Smuzhiyun TB_PORT_UNPLUGGED = 7, 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* capability headers */ 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct tb_cap_basic { 59*4882a593Smuzhiyun u8 next; 60*4882a593Smuzhiyun /* enum tb_cap cap:8; prevent "narrower than values of its type" */ 61*4882a593Smuzhiyun u8 cap; /* if cap == 0x05 then we have a extended capability */ 62*4882a593Smuzhiyun } __packed; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /** 65*4882a593Smuzhiyun * struct tb_cap_extended_short - Switch extended short capability 66*4882a593Smuzhiyun * @next: Pointer to the next capability. If @next and @length are zero 67*4882a593Smuzhiyun * then we have a long cap. 68*4882a593Smuzhiyun * @cap: Base capability ID (see &enum tb_switch_cap) 69*4882a593Smuzhiyun * @vsec_id: Vendor specific capability ID (see &enum switch_vse_cap) 70*4882a593Smuzhiyun * @length: Length of this capability 71*4882a593Smuzhiyun */ 72*4882a593Smuzhiyun struct tb_cap_extended_short { 73*4882a593Smuzhiyun u8 next; 74*4882a593Smuzhiyun u8 cap; 75*4882a593Smuzhiyun u8 vsec_id; 76*4882a593Smuzhiyun u8 length; 77*4882a593Smuzhiyun } __packed; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /** 80*4882a593Smuzhiyun * struct tb_cap_extended_long - Switch extended long capability 81*4882a593Smuzhiyun * @zero1: This field should be zero 82*4882a593Smuzhiyun * @cap: Base capability ID (see &enum tb_switch_cap) 83*4882a593Smuzhiyun * @vsec_id: Vendor specific capability ID (see &enum switch_vse_cap) 84*4882a593Smuzhiyun * @zero2: This field should be zero 85*4882a593Smuzhiyun * @next: Pointer to the next capability 86*4882a593Smuzhiyun * @length: Length of this capability 87*4882a593Smuzhiyun */ 88*4882a593Smuzhiyun struct tb_cap_extended_long { 89*4882a593Smuzhiyun u8 zero1; 90*4882a593Smuzhiyun u8 cap; 91*4882a593Smuzhiyun u8 vsec_id; 92*4882a593Smuzhiyun u8 zero2; 93*4882a593Smuzhiyun u16 next; 94*4882a593Smuzhiyun u16 length; 95*4882a593Smuzhiyun } __packed; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /** 98*4882a593Smuzhiyun * struct tb_cap_any - Structure capable of hold every capability 99*4882a593Smuzhiyun * @basic: Basic capability 100*4882a593Smuzhiyun * @extended_short: Vendor specific capability 101*4882a593Smuzhiyun * @extended_long: Vendor specific extended capability 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun struct tb_cap_any { 104*4882a593Smuzhiyun union { 105*4882a593Smuzhiyun struct tb_cap_basic basic; 106*4882a593Smuzhiyun struct tb_cap_extended_short extended_short; 107*4882a593Smuzhiyun struct tb_cap_extended_long extended_long; 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun } __packed; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /* capabilities */ 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun struct tb_cap_link_controller { 114*4882a593Smuzhiyun struct tb_cap_extended_long cap_header; 115*4882a593Smuzhiyun u32 count:4; /* number of link controllers */ 116*4882a593Smuzhiyun u32 unknown1:4; 117*4882a593Smuzhiyun u32 base_offset:8; /* 118*4882a593Smuzhiyun * offset (into this capability) of the configuration 119*4882a593Smuzhiyun * area of the first link controller 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun u32 length:12; /* link controller configuration area length */ 122*4882a593Smuzhiyun u32 unknown2:4; /* TODO check that length is correct */ 123*4882a593Smuzhiyun } __packed; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun struct tb_cap_phy { 126*4882a593Smuzhiyun struct tb_cap_basic cap_header; 127*4882a593Smuzhiyun u32 unknown1:16; 128*4882a593Smuzhiyun u32 unknown2:14; 129*4882a593Smuzhiyun bool disable:1; 130*4882a593Smuzhiyun u32 unknown3:11; 131*4882a593Smuzhiyun enum tb_port_state state:4; 132*4882a593Smuzhiyun u32 unknown4:2; 133*4882a593Smuzhiyun } __packed; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun struct tb_eeprom_ctl { 136*4882a593Smuzhiyun bool clock:1; /* send pulse to transfer one bit */ 137*4882a593Smuzhiyun bool access_low:1; /* set to 0 before access */ 138*4882a593Smuzhiyun bool data_out:1; /* to eeprom */ 139*4882a593Smuzhiyun bool data_in:1; /* from eeprom */ 140*4882a593Smuzhiyun bool access_high:1; /* set to 1 before access */ 141*4882a593Smuzhiyun bool not_present:1; /* should be 0 */ 142*4882a593Smuzhiyun bool unknown1:1; 143*4882a593Smuzhiyun bool present:1; /* should be 1 */ 144*4882a593Smuzhiyun u32 unknown2:24; 145*4882a593Smuzhiyun } __packed; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun struct tb_cap_plug_events { 148*4882a593Smuzhiyun struct tb_cap_extended_short cap_header; 149*4882a593Smuzhiyun u32 __unknown1:2; 150*4882a593Smuzhiyun u32 plug_events:5; 151*4882a593Smuzhiyun u32 __unknown2:25; 152*4882a593Smuzhiyun u32 __unknown3; 153*4882a593Smuzhiyun u32 __unknown4; 154*4882a593Smuzhiyun struct tb_eeprom_ctl eeprom_ctl; 155*4882a593Smuzhiyun u32 __unknown5[7]; 156*4882a593Smuzhiyun u32 drom_offset; /* 32 bit register, but eeprom addresses are 16 bit */ 157*4882a593Smuzhiyun } __packed; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /* device headers */ 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* Present on port 0 in TB_CFG_SWITCH at address zero. */ 162*4882a593Smuzhiyun struct tb_regs_switch_header { 163*4882a593Smuzhiyun /* DWORD 0 */ 164*4882a593Smuzhiyun u16 vendor_id; 165*4882a593Smuzhiyun u16 device_id; 166*4882a593Smuzhiyun /* DWORD 1 */ 167*4882a593Smuzhiyun u32 first_cap_offset:8; 168*4882a593Smuzhiyun u32 upstream_port_number:6; 169*4882a593Smuzhiyun u32 max_port_number:6; 170*4882a593Smuzhiyun u32 depth:3; 171*4882a593Smuzhiyun u32 __unknown1:1; 172*4882a593Smuzhiyun u32 revision:8; 173*4882a593Smuzhiyun /* DWORD 2 */ 174*4882a593Smuzhiyun u32 route_lo; 175*4882a593Smuzhiyun /* DWORD 3 */ 176*4882a593Smuzhiyun u32 route_hi:31; 177*4882a593Smuzhiyun bool enabled:1; 178*4882a593Smuzhiyun /* DWORD 4 */ 179*4882a593Smuzhiyun u32 plug_events_delay:8; /* 180*4882a593Smuzhiyun * RW, pause between plug events in 181*4882a593Smuzhiyun * milliseconds. Writing 0x00 is interpreted 182*4882a593Smuzhiyun * as 255ms. 183*4882a593Smuzhiyun */ 184*4882a593Smuzhiyun u32 cmuv:8; 185*4882a593Smuzhiyun u32 __unknown4:8; 186*4882a593Smuzhiyun u32 thunderbolt_version:8; 187*4882a593Smuzhiyun } __packed; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun /* USB4 version 1.0 */ 190*4882a593Smuzhiyun #define USB4_VERSION_1_0 0x20 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun #define ROUTER_CS_1 0x01 193*4882a593Smuzhiyun #define ROUTER_CS_4 0x04 194*4882a593Smuzhiyun #define ROUTER_CS_5 0x05 195*4882a593Smuzhiyun #define ROUTER_CS_5_SLP BIT(0) 196*4882a593Smuzhiyun #define ROUTER_CS_5_WOP BIT(1) 197*4882a593Smuzhiyun #define ROUTER_CS_5_WOU BIT(2) 198*4882a593Smuzhiyun #define ROUTER_CS_5_C3S BIT(23) 199*4882a593Smuzhiyun #define ROUTER_CS_5_PTO BIT(24) 200*4882a593Smuzhiyun #define ROUTER_CS_5_UTO BIT(25) 201*4882a593Smuzhiyun #define ROUTER_CS_5_HCO BIT(26) 202*4882a593Smuzhiyun #define ROUTER_CS_5_CV BIT(31) 203*4882a593Smuzhiyun #define ROUTER_CS_6 0x06 204*4882a593Smuzhiyun #define ROUTER_CS_6_SLPR BIT(0) 205*4882a593Smuzhiyun #define ROUTER_CS_6_TNS BIT(1) 206*4882a593Smuzhiyun #define ROUTER_CS_6_WOPS BIT(2) 207*4882a593Smuzhiyun #define ROUTER_CS_6_WOUS BIT(3) 208*4882a593Smuzhiyun #define ROUTER_CS_6_HCI BIT(18) 209*4882a593Smuzhiyun #define ROUTER_CS_6_CR BIT(25) 210*4882a593Smuzhiyun #define ROUTER_CS_7 0x07 211*4882a593Smuzhiyun #define ROUTER_CS_9 0x09 212*4882a593Smuzhiyun #define ROUTER_CS_25 0x19 213*4882a593Smuzhiyun #define ROUTER_CS_26 0x1a 214*4882a593Smuzhiyun #define ROUTER_CS_26_STATUS_MASK GENMASK(29, 24) 215*4882a593Smuzhiyun #define ROUTER_CS_26_STATUS_SHIFT 24 216*4882a593Smuzhiyun #define ROUTER_CS_26_ONS BIT(30) 217*4882a593Smuzhiyun #define ROUTER_CS_26_OV BIT(31) 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* Router TMU configuration */ 220*4882a593Smuzhiyun #define TMU_RTR_CS_0 0x00 221*4882a593Smuzhiyun #define TMU_RTR_CS_0_TD BIT(27) 222*4882a593Smuzhiyun #define TMU_RTR_CS_0_UCAP BIT(30) 223*4882a593Smuzhiyun #define TMU_RTR_CS_1 0x01 224*4882a593Smuzhiyun #define TMU_RTR_CS_1_LOCAL_TIME_NS_MASK GENMASK(31, 16) 225*4882a593Smuzhiyun #define TMU_RTR_CS_1_LOCAL_TIME_NS_SHIFT 16 226*4882a593Smuzhiyun #define TMU_RTR_CS_2 0x02 227*4882a593Smuzhiyun #define TMU_RTR_CS_3 0x03 228*4882a593Smuzhiyun #define TMU_RTR_CS_3_LOCAL_TIME_NS_MASK GENMASK(15, 0) 229*4882a593Smuzhiyun #define TMU_RTR_CS_3_TS_PACKET_INTERVAL_MASK GENMASK(31, 16) 230*4882a593Smuzhiyun #define TMU_RTR_CS_3_TS_PACKET_INTERVAL_SHIFT 16 231*4882a593Smuzhiyun #define TMU_RTR_CS_22 0x16 232*4882a593Smuzhiyun #define TMU_RTR_CS_24 0x18 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun enum tb_port_type { 235*4882a593Smuzhiyun TB_TYPE_INACTIVE = 0x000000, 236*4882a593Smuzhiyun TB_TYPE_PORT = 0x000001, 237*4882a593Smuzhiyun TB_TYPE_NHI = 0x000002, 238*4882a593Smuzhiyun /* TB_TYPE_ETHERNET = 0x020000, lower order bits are not known */ 239*4882a593Smuzhiyun /* TB_TYPE_SATA = 0x080000, lower order bits are not known */ 240*4882a593Smuzhiyun TB_TYPE_DP_HDMI_IN = 0x0e0101, 241*4882a593Smuzhiyun TB_TYPE_DP_HDMI_OUT = 0x0e0102, 242*4882a593Smuzhiyun TB_TYPE_PCIE_DOWN = 0x100101, 243*4882a593Smuzhiyun TB_TYPE_PCIE_UP = 0x100102, 244*4882a593Smuzhiyun TB_TYPE_USB3_DOWN = 0x200101, 245*4882a593Smuzhiyun TB_TYPE_USB3_UP = 0x200102, 246*4882a593Smuzhiyun }; 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun /* Present on every port in TB_CF_PORT at address zero. */ 249*4882a593Smuzhiyun struct tb_regs_port_header { 250*4882a593Smuzhiyun /* DWORD 0 */ 251*4882a593Smuzhiyun u16 vendor_id; 252*4882a593Smuzhiyun u16 device_id; 253*4882a593Smuzhiyun /* DWORD 1 */ 254*4882a593Smuzhiyun u32 first_cap_offset:8; 255*4882a593Smuzhiyun u32 max_counters:11; 256*4882a593Smuzhiyun u32 counters_support:1; 257*4882a593Smuzhiyun u32 __unknown1:4; 258*4882a593Smuzhiyun u32 revision:8; 259*4882a593Smuzhiyun /* DWORD 2 */ 260*4882a593Smuzhiyun enum tb_port_type type:24; 261*4882a593Smuzhiyun u32 thunderbolt_version:8; 262*4882a593Smuzhiyun /* DWORD 3 */ 263*4882a593Smuzhiyun u32 __unknown2:20; 264*4882a593Smuzhiyun u32 port_number:6; 265*4882a593Smuzhiyun u32 __unknown3:6; 266*4882a593Smuzhiyun /* DWORD 4 */ 267*4882a593Smuzhiyun u32 nfc_credits; 268*4882a593Smuzhiyun /* DWORD 5 */ 269*4882a593Smuzhiyun u32 max_in_hop_id:11; 270*4882a593Smuzhiyun u32 max_out_hop_id:11; 271*4882a593Smuzhiyun u32 __unknown4:10; 272*4882a593Smuzhiyun /* DWORD 6 */ 273*4882a593Smuzhiyun u32 __unknown5; 274*4882a593Smuzhiyun /* DWORD 7 */ 275*4882a593Smuzhiyun u32 __unknown6; 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun } __packed; 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /* Basic adapter configuration registers */ 280*4882a593Smuzhiyun #define ADP_CS_4 0x04 281*4882a593Smuzhiyun #define ADP_CS_4_NFC_BUFFERS_MASK GENMASK(9, 0) 282*4882a593Smuzhiyun #define ADP_CS_4_TOTAL_BUFFERS_MASK GENMASK(29, 20) 283*4882a593Smuzhiyun #define ADP_CS_4_TOTAL_BUFFERS_SHIFT 20 284*4882a593Smuzhiyun #define ADP_CS_4_LCK BIT(31) 285*4882a593Smuzhiyun #define ADP_CS_5 0x05 286*4882a593Smuzhiyun #define ADP_CS_5_LCA_MASK GENMASK(28, 22) 287*4882a593Smuzhiyun #define ADP_CS_5_LCA_SHIFT 22 288*4882a593Smuzhiyun #define ADP_CS_5_DHP BIT(31) 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun /* TMU adapter registers */ 291*4882a593Smuzhiyun #define TMU_ADP_CS_3 0x03 292*4882a593Smuzhiyun #define TMU_ADP_CS_3_UDM BIT(29) 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun /* Lane adapter registers */ 295*4882a593Smuzhiyun #define LANE_ADP_CS_0 0x00 296*4882a593Smuzhiyun #define LANE_ADP_CS_0_SUPPORTED_WIDTH_MASK GENMASK(25, 20) 297*4882a593Smuzhiyun #define LANE_ADP_CS_0_SUPPORTED_WIDTH_SHIFT 20 298*4882a593Smuzhiyun #define LANE_ADP_CS_1 0x01 299*4882a593Smuzhiyun #define LANE_ADP_CS_1_TARGET_WIDTH_MASK GENMASK(9, 4) 300*4882a593Smuzhiyun #define LANE_ADP_CS_1_TARGET_WIDTH_SHIFT 4 301*4882a593Smuzhiyun #define LANE_ADP_CS_1_TARGET_WIDTH_SINGLE 0x1 302*4882a593Smuzhiyun #define LANE_ADP_CS_1_TARGET_WIDTH_DUAL 0x3 303*4882a593Smuzhiyun #define LANE_ADP_CS_1_LD BIT(14) 304*4882a593Smuzhiyun #define LANE_ADP_CS_1_LB BIT(15) 305*4882a593Smuzhiyun #define LANE_ADP_CS_1_CURRENT_SPEED_MASK GENMASK(19, 16) 306*4882a593Smuzhiyun #define LANE_ADP_CS_1_CURRENT_SPEED_SHIFT 16 307*4882a593Smuzhiyun #define LANE_ADP_CS_1_CURRENT_SPEED_GEN2 0x8 308*4882a593Smuzhiyun #define LANE_ADP_CS_1_CURRENT_SPEED_GEN3 0x4 309*4882a593Smuzhiyun #define LANE_ADP_CS_1_CURRENT_WIDTH_MASK GENMASK(25, 20) 310*4882a593Smuzhiyun #define LANE_ADP_CS_1_CURRENT_WIDTH_SHIFT 20 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun /* USB4 port registers */ 313*4882a593Smuzhiyun #define PORT_CS_1 0x01 314*4882a593Smuzhiyun #define PORT_CS_1_LENGTH_SHIFT 8 315*4882a593Smuzhiyun #define PORT_CS_1_TARGET_MASK GENMASK(18, 16) 316*4882a593Smuzhiyun #define PORT_CS_1_TARGET_SHIFT 16 317*4882a593Smuzhiyun #define PORT_CS_1_RETIMER_INDEX_SHIFT 20 318*4882a593Smuzhiyun #define PORT_CS_1_WNR_WRITE BIT(24) 319*4882a593Smuzhiyun #define PORT_CS_1_NR BIT(25) 320*4882a593Smuzhiyun #define PORT_CS_1_RC BIT(26) 321*4882a593Smuzhiyun #define PORT_CS_1_PND BIT(31) 322*4882a593Smuzhiyun #define PORT_CS_2 0x02 323*4882a593Smuzhiyun #define PORT_CS_18 0x12 324*4882a593Smuzhiyun #define PORT_CS_18_BE BIT(8) 325*4882a593Smuzhiyun #define PORT_CS_18_TCM BIT(9) 326*4882a593Smuzhiyun #define PORT_CS_18_WOU4S BIT(18) 327*4882a593Smuzhiyun #define PORT_CS_19 0x13 328*4882a593Smuzhiyun #define PORT_CS_19_PC BIT(3) 329*4882a593Smuzhiyun #define PORT_CS_19_PID BIT(4) 330*4882a593Smuzhiyun #define PORT_CS_19_WOC BIT(16) 331*4882a593Smuzhiyun #define PORT_CS_19_WOD BIT(17) 332*4882a593Smuzhiyun #define PORT_CS_19_WOU4 BIT(18) 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun /* Display Port adapter registers */ 335*4882a593Smuzhiyun #define ADP_DP_CS_0 0x00 336*4882a593Smuzhiyun #define ADP_DP_CS_0_VIDEO_HOPID_MASK GENMASK(26, 16) 337*4882a593Smuzhiyun #define ADP_DP_CS_0_VIDEO_HOPID_SHIFT 16 338*4882a593Smuzhiyun #define ADP_DP_CS_0_AE BIT(30) 339*4882a593Smuzhiyun #define ADP_DP_CS_0_VE BIT(31) 340*4882a593Smuzhiyun #define ADP_DP_CS_1_AUX_TX_HOPID_MASK GENMASK(10, 0) 341*4882a593Smuzhiyun #define ADP_DP_CS_1_AUX_RX_HOPID_MASK GENMASK(21, 11) 342*4882a593Smuzhiyun #define ADP_DP_CS_1_AUX_RX_HOPID_SHIFT 11 343*4882a593Smuzhiyun #define ADP_DP_CS_2 0x02 344*4882a593Smuzhiyun #define ADP_DP_CS_2_HDP BIT(6) 345*4882a593Smuzhiyun #define ADP_DP_CS_3 0x03 346*4882a593Smuzhiyun #define ADP_DP_CS_3_HDPC BIT(9) 347*4882a593Smuzhiyun #define DP_LOCAL_CAP 0x04 348*4882a593Smuzhiyun #define DP_REMOTE_CAP 0x05 349*4882a593Smuzhiyun #define DP_STATUS_CTRL 0x06 350*4882a593Smuzhiyun #define DP_STATUS_CTRL_CMHS BIT(25) 351*4882a593Smuzhiyun #define DP_STATUS_CTRL_UF BIT(26) 352*4882a593Smuzhiyun #define DP_COMMON_CAP 0x07 353*4882a593Smuzhiyun /* 354*4882a593Smuzhiyun * DP_COMMON_CAP offsets work also for DP_LOCAL_CAP and DP_REMOTE_CAP 355*4882a593Smuzhiyun * with exception of DPRX done. 356*4882a593Smuzhiyun */ 357*4882a593Smuzhiyun #define DP_COMMON_CAP_RATE_MASK GENMASK(11, 8) 358*4882a593Smuzhiyun #define DP_COMMON_CAP_RATE_SHIFT 8 359*4882a593Smuzhiyun #define DP_COMMON_CAP_RATE_RBR 0x0 360*4882a593Smuzhiyun #define DP_COMMON_CAP_RATE_HBR 0x1 361*4882a593Smuzhiyun #define DP_COMMON_CAP_RATE_HBR2 0x2 362*4882a593Smuzhiyun #define DP_COMMON_CAP_RATE_HBR3 0x3 363*4882a593Smuzhiyun #define DP_COMMON_CAP_LANES_MASK GENMASK(14, 12) 364*4882a593Smuzhiyun #define DP_COMMON_CAP_LANES_SHIFT 12 365*4882a593Smuzhiyun #define DP_COMMON_CAP_1_LANE 0x0 366*4882a593Smuzhiyun #define DP_COMMON_CAP_2_LANES 0x1 367*4882a593Smuzhiyun #define DP_COMMON_CAP_4_LANES 0x2 368*4882a593Smuzhiyun #define DP_COMMON_CAP_DPRX_DONE BIT(31) 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun /* PCIe adapter registers */ 371*4882a593Smuzhiyun #define ADP_PCIE_CS_0 0x00 372*4882a593Smuzhiyun #define ADP_PCIE_CS_0_PE BIT(31) 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun /* USB adapter registers */ 375*4882a593Smuzhiyun #define ADP_USB3_CS_0 0x00 376*4882a593Smuzhiyun #define ADP_USB3_CS_0_V BIT(30) 377*4882a593Smuzhiyun #define ADP_USB3_CS_0_PE BIT(31) 378*4882a593Smuzhiyun #define ADP_USB3_CS_1 0x01 379*4882a593Smuzhiyun #define ADP_USB3_CS_1_CUBW_MASK GENMASK(11, 0) 380*4882a593Smuzhiyun #define ADP_USB3_CS_1_CDBW_MASK GENMASK(23, 12) 381*4882a593Smuzhiyun #define ADP_USB3_CS_1_CDBW_SHIFT 12 382*4882a593Smuzhiyun #define ADP_USB3_CS_1_HCA BIT(31) 383*4882a593Smuzhiyun #define ADP_USB3_CS_2 0x02 384*4882a593Smuzhiyun #define ADP_USB3_CS_2_AUBW_MASK GENMASK(11, 0) 385*4882a593Smuzhiyun #define ADP_USB3_CS_2_ADBW_MASK GENMASK(23, 12) 386*4882a593Smuzhiyun #define ADP_USB3_CS_2_ADBW_SHIFT 12 387*4882a593Smuzhiyun #define ADP_USB3_CS_2_CMR BIT(31) 388*4882a593Smuzhiyun #define ADP_USB3_CS_3 0x03 389*4882a593Smuzhiyun #define ADP_USB3_CS_3_SCALE_MASK GENMASK(5, 0) 390*4882a593Smuzhiyun #define ADP_USB3_CS_4 0x04 391*4882a593Smuzhiyun #define ADP_USB3_CS_4_ALR_MASK GENMASK(6, 0) 392*4882a593Smuzhiyun #define ADP_USB3_CS_4_ALR_20G 0x1 393*4882a593Smuzhiyun #define ADP_USB3_CS_4_ULV BIT(7) 394*4882a593Smuzhiyun #define ADP_USB3_CS_4_MSLR_MASK GENMASK(18, 12) 395*4882a593Smuzhiyun #define ADP_USB3_CS_4_MSLR_SHIFT 12 396*4882a593Smuzhiyun #define ADP_USB3_CS_4_MSLR_20G 0x1 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun /* Hop register from TB_CFG_HOPS. 8 byte per entry. */ 399*4882a593Smuzhiyun struct tb_regs_hop { 400*4882a593Smuzhiyun /* DWORD 0 */ 401*4882a593Smuzhiyun u32 next_hop:11; /* 402*4882a593Smuzhiyun * hop to take after sending the packet through 403*4882a593Smuzhiyun * out_port (on the incoming port of the next switch) 404*4882a593Smuzhiyun */ 405*4882a593Smuzhiyun u32 out_port:6; /* next port of the path (on the same switch) */ 406*4882a593Smuzhiyun u32 initial_credits:8; 407*4882a593Smuzhiyun u32 unknown1:6; /* set to zero */ 408*4882a593Smuzhiyun bool enable:1; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun /* DWORD 1 */ 411*4882a593Smuzhiyun u32 weight:4; 412*4882a593Smuzhiyun u32 unknown2:4; /* set to zero */ 413*4882a593Smuzhiyun u32 priority:3; 414*4882a593Smuzhiyun bool drop_packages:1; 415*4882a593Smuzhiyun u32 counter:11; /* index into TB_CFG_COUNTERS on this port */ 416*4882a593Smuzhiyun bool counter_enable:1; 417*4882a593Smuzhiyun bool ingress_fc:1; 418*4882a593Smuzhiyun bool egress_fc:1; 419*4882a593Smuzhiyun bool ingress_shared_buffer:1; 420*4882a593Smuzhiyun bool egress_shared_buffer:1; 421*4882a593Smuzhiyun bool pending:1; 422*4882a593Smuzhiyun u32 unknown3:3; /* set to zero */ 423*4882a593Smuzhiyun } __packed; 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun /* Common link controller registers */ 426*4882a593Smuzhiyun #define TB_LC_DESC 0x02 427*4882a593Smuzhiyun #define TB_LC_DESC_NLC_MASK GENMASK(3, 0) 428*4882a593Smuzhiyun #define TB_LC_DESC_SIZE_SHIFT 8 429*4882a593Smuzhiyun #define TB_LC_DESC_SIZE_MASK GENMASK(15, 8) 430*4882a593Smuzhiyun #define TB_LC_DESC_PORT_SIZE_SHIFT 16 431*4882a593Smuzhiyun #define TB_LC_DESC_PORT_SIZE_MASK GENMASK(27, 16) 432*4882a593Smuzhiyun #define TB_LC_FUSE 0x03 433*4882a593Smuzhiyun #define TB_LC_SNK_ALLOCATION 0x10 434*4882a593Smuzhiyun #define TB_LC_SNK_ALLOCATION_SNK0_MASK GENMASK(3, 0) 435*4882a593Smuzhiyun #define TB_LC_SNK_ALLOCATION_SNK0_CM 0x1 436*4882a593Smuzhiyun #define TB_LC_SNK_ALLOCATION_SNK1_SHIFT 4 437*4882a593Smuzhiyun #define TB_LC_SNK_ALLOCATION_SNK1_MASK GENMASK(7, 4) 438*4882a593Smuzhiyun #define TB_LC_SNK_ALLOCATION_SNK1_CM 0x1 439*4882a593Smuzhiyun #define TB_LC_POWER 0x740 440*4882a593Smuzhiyun 441*4882a593Smuzhiyun /* Link controller registers */ 442*4882a593Smuzhiyun #define TB_LC_PORT_ATTR 0x8d 443*4882a593Smuzhiyun #define TB_LC_PORT_ATTR_BE BIT(12) 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun #define TB_LC_SX_CTRL 0x96 446*4882a593Smuzhiyun #define TB_LC_SX_CTRL_WOC BIT(1) 447*4882a593Smuzhiyun #define TB_LC_SX_CTRL_WOD BIT(2) 448*4882a593Smuzhiyun #define TB_LC_SX_CTRL_WOU4 BIT(5) 449*4882a593Smuzhiyun #define TB_LC_SX_CTRL_WOP BIT(6) 450*4882a593Smuzhiyun #define TB_LC_SX_CTRL_L1C BIT(16) 451*4882a593Smuzhiyun #define TB_LC_SX_CTRL_L1D BIT(17) 452*4882a593Smuzhiyun #define TB_LC_SX_CTRL_L2C BIT(20) 453*4882a593Smuzhiyun #define TB_LC_SX_CTRL_L2D BIT(21) 454*4882a593Smuzhiyun #define TB_LC_SX_CTRL_UPSTREAM BIT(30) 455*4882a593Smuzhiyun #define TB_LC_SX_CTRL_SLP BIT(31) 456*4882a593Smuzhiyun 457*4882a593Smuzhiyun #endif 458