#ifndef _TBCFG_REG_H
#define _TBCFG_REG_H
struct tb_cfg_read {
tb_route_t route;
uint32_t addr_attrs;
#define TB_CFG_ADDR_SHIFT 0
#define TB_CFG_ADDR_MASK GENMASK(12,0)
#define TB_CFG_SIZE_SHIFT 13
#define TB_CFG_SIZE_MASK GENMASK(18,13)
#define TB_CFG_ADAPTER_SHIFT 19
#define TB_CFG_ADAPTER_MASK GENMASK(24,19)
#define TB_CFG_CS_PATH (0x00 << 25)
#define TB_CFG_CS_ADAPTER (0x01 << 25)
#define TB_CFG_CS_ROUTER (0x02 << 25)
#define TB_CFG_CS_COUNTERS (0x03 << 25)
#define TB_CFG_SEQ_SHIFT 27
#define TB_CFG_SEQ_MASK (28,27)
uint32_t crc;
};
struct tb_cfg_read_resp {
tb_route_t route;
uint32_t addr_attrs;
uint32_t data[0];
} __packed;
struct tb_cfg_write {
tb_route_t route;
uint32_t addr_attrs;
uint32_t data[0];
} __packed;
struct tb_cfg_write_resp {
tb_route_t route;
uint32_t addr_attrs;
uint32_t crc;
} __packed;
struct tb_cfg_notify {
tb_route_t route;
uint32_t event_adap;
#define TB_CFG_EVENT_MASK GENMASK(7,0)
#define GET_NOTIFY_EVENT(n) ((n)->event_adap & TB_CFG_EVENT_MASK)
#define TB_CFG_ERR_CONN 0x00
#define TB_CFG_ERR_LINK 0x01
#define TB_CFG_ERR_ADDR 0x02
#define TB_CFG_ERR_ADP 0x04
#define TB_CFG_ERR_ENUM 0x08
#define TB_CFG_ERR_NUA 0x09
#define TB_CFG_ERR_LEN 0x0b
#define TB_CFG_ERR_HEC 0x0c
#define TB_CFG_ERR_FC 0x0d
#define TB_CFG_ERR_PLUG 0x0e
#define TB_CFG_ERR_LOCK 0x0f
#define TB_CFG_HP_ACK 0x07
#define TB_CFG_DP_BW 0x20
#define TB_CFG_EVENT_ADAPTER_SHIFT 8
#define TB_CFG_EVENT_ADAPTER_MASK GENMASK(13,8)
#define GET_NOTIFY_ADAPTER(n) (((n)->event_adap & \
TB_CFG_EVENT_ADAPTER_MASK) >> \
TB_CFG_EVENT_ADAPTER_SHIFT)
#define TB_CFG_PG_NONE 0x00000000
#define TB_CFG_PG_PLUG 0x80000000
#define TB_CFG_PG_UNPLUG 0xc0000000
uint32_t crc;
} __packed;
struct tb_cfg_notify_ack {
tb_route_t route;
uint32_t crc;
} __packed;
struct tb_cfg_hotplug {
tb_route_t route;
uint32_t adapter_attrs;
#define TB_CFG_ADPT_MASK GENMASK(5,0)
#define TB_CFG_UPG_PLUG (0x0 << 31)
#define TB_CFG_UPG_UNPLUG (0x1 << 31)
uint32_t crc;
} __packed;
struct tb_cfg_xdomain {
tb_route_t route;
uint32_t data[0];
} __packed;
struct tb_cfg_xdomain_resp {
tb_route_t route;
uint32_t data[0];
} __packed;
struct tb_cfg_router {
uint16_t vendor_id;
uint16_t product_id;
uint32_t router_cs_1;
#define ROUTER_CS1_NEXT_CAP_MASK GENMASK(7,0)
#define GET_ROUTER_CS_NEXT_CAP(r) (r->router_cs_1 & \
ROUTER_CS1_NEXT_CAP_MASK)
#define ROUTER_CS1_UPSTREAM_SHIFT 8
#define ROUTER_CS1_UPSTREAM_MASK GENMASK(13,8)
#define GET_ROUTER_CS_UPSTREAM_ADAP(r) ((r->router_cs_1 & \
ROUTER_CS1_UPSTREAM_MASK) >> \
ROUTER_CS1_UPSTREAM_SHIFT)
#define ROUTER_CS1_MAX_SHIFT 14
#define ROUTER_CS1_MAX_MASK GENMASK(19,14)
#define GET_ROUTER_CS_MAX_ADAP(r) ((r->router_cs_1 & \
ROUTER_CS1_MAX_MASK) >> \
ROUTER_CS1_MAX_SHIFT)
#define ROUTER_CS1_MAX_ADAPTERS 64
#define ROUTER_CS1_DEPTH_SHIFT 20
#define ROUTER_CS1_DEPTH_MASK GENMASK(22,20)
#define GET_ROUTER_CS_DEPTH(r) ((r->router_cs_1 & \
ROUTER_CS1_DEPTH_MASK) >> \
ROUTER_CS1_DEPTH_SHIFT)
#define ROUTER_CS1_REVISION_SHIFT 24
#define ROUTER_CS1_REVISION_MASK GENMASK(31,24)
#define GET_ROUTER_CS_REVISION ((r->router_cs_1 & \
ROUTER_CS1_REVISION_MASK) >> \
ROUTER_CS1_REVISION_SHIFT)
uint32_t topology_lo;
uint32_t topology_hi;
#define CFG_TOPOLOGY_VALID (1 << 31)
uint8_t notification_timeout;
uint8_t cm_version;
#define CFG_CM_USB4 0x10
uint8_t rsrvd1;
uint8_t usb4_version;
#define CFG_USB4_V1_0 0x10
uint32_t flags_cs5;
#define CFG_CS5_SLP (1 << 0)
#define CFG_CS5_WOP (1 << 1)
#define CFG_CS5_WOU (1 << 2)
#define CFG_CS5_DP (1 << 3)
#define CFG_CS5_C3S (1 << 23)
#define CFG_CS5_PTO (1 << 24)
#define CFG_CS5_UTO (1 << 25)
#define CFG_CS5_HCO (1 << 26)
#define CFG_CS5_CV (1 << 31)
uint32_t flags_cs6;
#define CFG_CS6_SLPR (1 << 0)
#define CFG_CS6_TNS (1 << 1)
#define CFG_CS6_WAKE_PCIE (1 << 2)
#define CFG_CS6_WAKE_USB3 (1 << 3)
#define CFG_CS6_WAKE_DP (1 << 4)
#define CFG_CS6_HCI (1 << 18)
#define CFG_CS6_RR (1 << 24)
#define CFG_CS6_CR (1 << 25)
uint32_t uuid_hi;
uint32_t uuid_lo;
uint32_t data[16];
uint32_t metadata;
uint32_t opcode_status;
#define CFG_ONS (1 << 30)
#define CFG_OV (1 << 31)
} __packed;
#define TB_CFG_CAP_OFFSET_MAX 0xfff
struct tb_cfg_cap_hdr {
uint8_t next_cap;
uint8_t cap_id;
} __packed;
struct tb_cfg_cap_tmu {
struct tb_cfg_cap_hdr hdr;
#define TB_CFG_CAP_TMU 0x03
} __packed;
struct tb_cfg_vsc_cap {
struct tb_cfg_cap_hdr hdr;
#define TB_CFG_CAP_VSC 0x05
uint8_t vsc_id;
uint8_t len;
} __packed;
struct tb_cfg_vsec_cap {
struct tb_cfg_cap_hdr hdr;
#define TB_CFG_CAP_VSEC 0x05
uint8_t vsec_id;
uint8_t len;
uint16_t vsec_next_cap;
uint16_t vsec_len;
} __packed;
union tb_cfg_cap {
struct tb_cfg_cap_hdr hdr;
struct tb_cfg_cap_tmu tmu;
struct tb_cfg_vsc_cap vsc;
struct tb_cfg_vsec_cap vsec;
} __packed;
#define TB_CFG_VSC_PLUG 0x01
#define TB_CFG_VSEC_LC 0x06
#define TB_LC_DESC 0x02
#define TB_LC_DESC_NUM_LC_MASK GENMASK(3, 0)
#define TB_LC_DESC_SIZE_SHIFT 8
#define TB_LC_DESC_SIZE_MASK GENMASK(15, 8)
#define TB_LC_DESC_PORT_SHIFT 16
#define TB_LC_DESC_PORT_MASK GENMASK(27, 16)
#define TB_LC_UUID 0x03
#define TB_LC_DP_SINK 0x10
#define TB_LC_PORT_ATTR 0x8d
#define TB_LC_PORT_ATTR_BE (1 << 12)
#define TB_LC_SX_CTRL 0x96
#define TB_LC_SX_CTRL_WOC (1 << 1)
#define TB_LC_SX_CTRL_WOD (1 << 2)
#define TB_LC_SX_CTRL_WOU4 (1 << 5)
#define TB_LC_SX_CTRL_WOP (1 << 6)
#define TB_LC_SX_CTRL_L1C (1 << 16)
#define TB_LC_SX_CTRL_L1D (1 << 17)
#define TB_LC_SX_CTRL_L2C (1 << 20)
#define TB_LC_SX_CTRL_L2D (1 << 21)
#define TB_LC_SX_CTRL_UFP (1 << 30)
#define TB_LC_SX_CTRL_SLP (1 << 31)
#define TB_LC_POWER 0x740
struct tb_cfg_adapter {
uint16_t vendor_id;
uint16_t product_id;
uint32_t adp_cs1;
#define ADP_CS1_NEXT_CAP_MASK GENMASK(7,0)
#define GET_ADP_CS_NEXT_CAP(a) (a->adp_cs1 & \
ADP_CS1_NEXT_CAP_MASK)
#define ADP_CS1_COUNTER_SHIFT 8
#define ADP_CS1_COUNTER_MASK GENMASK(18,8)
#define GET_ADP_CS_MAX_COUNTERS(a) ((a->adp_cs1 & \
ADP_CS1_COUNTER_MASK) >> \
ADP_CS1_COUNTER_SHIFT)
#define CFG_COUNTER_CONFIG_FLAG (1 << 19)
uint32_t adp_cs2;
#define ADP_CS2_TYPE_MASK GENMASK(23,0)
#define GET_ADP_CS_TYPE(a) (a->adp_cs2 & ADP_CS2_TYPE_MASK)
#define ADP_CS2_UNSUPPORTED 0x000000
#define ADP_CS2_LANE 0x000001
#define ADP_CS2_HOSTIF 0x000002
#define ADP_CS2_PCIE_DFP 0x100101
#define ADP_CS2_PCIE_UFP 0x100102
#define ADP_CS2_DP_OUT 0x0e0102
#define ADP_CS2_DP_IN 0x0e0101
#define ADP_CS2_USB3_DFP 0x200101
#define ADP_CS2_USB3_UFP 0x200102
uint32_t adp_cs3;
#define ADP_CS3_ADP_NUM_SHIFT 20
#define ADP_CS3_ADP_NUM_MASK GENMASK(25,20)
#define GET_ADP_CS_ADP_NUM(a) ((a->adp_cs3 & \
ADP_CS3_ADP_NUM_MASK) >> \
ADP_CS3_ADP_NUM_SHIFT)
#define CFG_ADP_HEC_ERROR (1 << 29)
#define CFG_ADP_FC_ERROR (1 << 30)
#define CFG_ADP_SBC (1 << 31)
} __packed;
struct tb_cfg_cap_lane {
struct tb_cfg_cap_hdr hdr;
#define TB_CFG_CAP_LANE 0x01
uint16_t supp_lwp;
#define CAP_LANE_LINK_MASK GENMASK(3,0)
#define CAP_LANE_LINK_GEN3 0x0004
#define CAP_LANE_LINK_GEN2 0x0008
#define CAP_LANE_WIDTH_MASK GENMASK(9,4)
#define CAP_LANE_WIDTH_1X 0x0010
#define CAP_LANE_WIDTH_2X 0x0020
#define CAP_LANE_POWER_CL0 0x0400
#define CAP_LANE_POWER_CL1 0x0800
#define CAP_LANE_POWER_CL2 0x1000
uint16_t targ_lwp;
#define CAP_LANE_TARGET_GEN2 0x0008
#define CAP_LANE_TARGET_GEN3 0x000c
#define CAP_LANE_TARGET_SINGLE 0x0010
#define CAP_LANE_TARGET_DUAL 0x0030
#define CAP_LANE_DISABLE 0x4000
#define CAP_LANE_BONDING 0x8000
uint16_t current_lws;
#define CAP_LANE_STATE_SHIFT 10
#define CAP_LANE_STATE_MASK GENMASK(13,10)
#define CAP_LANE_STATE_DISABLE (0x0 << CAP_LANE_STATE_SHIFT)
#define CAP_LANE_STATE_TRAINING (0x1 << CAP_LANE_STATE_SHIFT)
#define CAP_LANE_STATE_CL0 (0x2 << CAP_LANE_STATE_SHIFT)
#define CAP_LANE_STATE_TXCL0 (0x3 << CAP_LANE_STATE_SHIFT)
#define CAP_LANE_STATE_RXCL0 (0x4 << CAP_LANE_STATE_SHIFT)
#define CAP_LANE_STATE_CL1 (0x5 << CAP_LANE_STATE_SHIFT)
#define CAP_LANE_STATE_CL2 (0x6 << CAP_LANE_STATE_SHIFT)
#define CAP_LANE_STATE_CLD (0x7 << CAP_LANE_STATE_SHIFT)
#define CAP_LANE_PMS 0x4000
uint16_t lle;
#define CAP_LANE_LLE_MASK GENMASK(6,0)
#define CAP_LANE_LLE_ALE 0x01
#define CAP_LANE_LLE_OSE 0x02
#define CAP_LANE_LLE_TE 0x04
#define CAP_LANE_LLE_EBE 0x08
#define CAP_LANE_LLE_DBE 0x10
#define CAP_LANE_LLE_RDE 0x20
#define CAP_LANE_LLE_RST 0x40
uint16_t lle_enable;
} __packed;
struct tb_cfg_path {
} __packed;
struct tb_cfg_counters {
} __packed;
#endif