1fd3b339cSMika Westerberg /* SPDX-License-Identifier: GPL-2.0 */ 232af9434SMika Westerberg /* 332af9434SMika Westerberg * Thunderbolt control channel messages 432af9434SMika Westerberg * 532af9434SMika Westerberg * Copyright (C) 2014 Andreas Noever <andreas.noever@gmail.com> 632af9434SMika Westerberg * Copyright (C) 2017, Intel Corporation 732af9434SMika Westerberg */ 832af9434SMika Westerberg 932af9434SMika Westerberg #ifndef _TB_MSGS 1032af9434SMika Westerberg #define _TB_MSGS 1132af9434SMika Westerberg 1232af9434SMika Westerberg #include <linux/types.h> 13f67cf491SMika Westerberg #include <linux/uuid.h> 1432af9434SMika Westerberg 1532af9434SMika Westerberg enum tb_cfg_space { 1632af9434SMika Westerberg TB_CFG_HOPS = 0, 1732af9434SMika Westerberg TB_CFG_PORT = 1, 1832af9434SMika Westerberg TB_CFG_SWITCH = 2, 1932af9434SMika Westerberg TB_CFG_COUNTERS = 3, 2032af9434SMika Westerberg }; 2132af9434SMika Westerberg 2232af9434SMika Westerberg enum tb_cfg_error { 2332af9434SMika Westerberg TB_CFG_ERROR_PORT_NOT_CONNECTED = 0, 2432af9434SMika Westerberg TB_CFG_ERROR_LINK_ERROR = 1, 2532af9434SMika Westerberg TB_CFG_ERROR_INVALID_CONFIG_SPACE = 2, 2632af9434SMika Westerberg TB_CFG_ERROR_NO_SUCH_PORT = 4, 2732af9434SMika Westerberg TB_CFG_ERROR_ACK_PLUG_EVENT = 7, /* send as reply to TB_CFG_PKG_EVENT */ 2832af9434SMika Westerberg TB_CFG_ERROR_LOOP = 8, 2932af9434SMika Westerberg TB_CFG_ERROR_HEC_ERROR_DETECTED = 12, 3032af9434SMika Westerberg TB_CFG_ERROR_FLOW_CONTROL_ERROR = 13, 3180e7c5ddSMika Westerberg TB_CFG_ERROR_LOCK = 15, 326ce35635SMika Westerberg TB_CFG_ERROR_DP_BW = 32, 33*235d0194SMika Westerberg TB_CFG_ERROR_ROP_CMPLT = 33, 34*235d0194SMika Westerberg TB_CFG_ERROR_POP_CMPLT = 34, 35*235d0194SMika Westerberg TB_CFG_ERROR_PCIE_WAKE = 35, 36*235d0194SMika Westerberg TB_CFG_ERROR_DP_CON_CHANGE = 36, 37*235d0194SMika Westerberg TB_CFG_ERROR_DPTX_DISCOVERY = 37, 38*235d0194SMika Westerberg TB_CFG_ERROR_LINK_RECOVERY = 38, 39*235d0194SMika Westerberg TB_CFG_ERROR_ASYM_LINK = 39, 4032af9434SMika Westerberg }; 4132af9434SMika Westerberg 4232af9434SMika Westerberg /* common header */ 4332af9434SMika Westerberg struct tb_cfg_header { 4432af9434SMika Westerberg u32 route_hi:22; 4532af9434SMika Westerberg u32 unknown:10; /* highest order bit is set on replies */ 4632af9434SMika Westerberg u32 route_lo; 4732af9434SMika Westerberg } __packed; 4832af9434SMika Westerberg 4932af9434SMika Westerberg /* additional header for read/write packets */ 5032af9434SMika Westerberg struct tb_cfg_address { 5132af9434SMika Westerberg u32 offset:13; /* in dwords */ 5232af9434SMika Westerberg u32 length:6; /* in dwords */ 5332af9434SMika Westerberg u32 port:6; 5432af9434SMika Westerberg enum tb_cfg_space space:2; 5532af9434SMika Westerberg u32 seq:2; /* sequence number */ 5632af9434SMika Westerberg u32 zero:3; 5732af9434SMika Westerberg } __packed; 5832af9434SMika Westerberg 5932af9434SMika Westerberg /* TB_CFG_PKG_READ, response for TB_CFG_PKG_WRITE */ 6032af9434SMika Westerberg struct cfg_read_pkg { 6132af9434SMika Westerberg struct tb_cfg_header header; 6232af9434SMika Westerberg struct tb_cfg_address addr; 6332af9434SMika Westerberg } __packed; 6432af9434SMika Westerberg 6532af9434SMika Westerberg /* TB_CFG_PKG_WRITE, response for TB_CFG_PKG_READ */ 6632af9434SMika Westerberg struct cfg_write_pkg { 6732af9434SMika Westerberg struct tb_cfg_header header; 6832af9434SMika Westerberg struct tb_cfg_address addr; 6932af9434SMika Westerberg u32 data[64]; /* maximum size, tb_cfg_address.length has 6 bits */ 7032af9434SMika Westerberg } __packed; 7132af9434SMika Westerberg 7232af9434SMika Westerberg /* TB_CFG_PKG_ERROR */ 7332af9434SMika Westerberg struct cfg_error_pkg { 7432af9434SMika Westerberg struct tb_cfg_header header; 756ce35635SMika Westerberg enum tb_cfg_error error:8; 7632af9434SMika Westerberg u32 port:6; 776ce35635SMika Westerberg u32 reserved:16; 78210e9f56SMika Westerberg u32 pg:2; 7932af9434SMika Westerberg } __packed; 8032af9434SMika Westerberg 816ce35635SMika Westerberg struct cfg_ack_pkg { 826ce35635SMika Westerberg struct tb_cfg_header header; 836ce35635SMika Westerberg }; 846ce35635SMika Westerberg 85210e9f56SMika Westerberg #define TB_CFG_ERROR_PG_HOT_PLUG 0x2 86210e9f56SMika Westerberg #define TB_CFG_ERROR_PG_HOT_UNPLUG 0x3 87210e9f56SMika Westerberg 8832af9434SMika Westerberg /* TB_CFG_PKG_EVENT */ 8932af9434SMika Westerberg struct cfg_event_pkg { 9032af9434SMika Westerberg struct tb_cfg_header header; 9132af9434SMika Westerberg u32 port:6; 9232af9434SMika Westerberg u32 zero:25; 9332af9434SMika Westerberg bool unplug:1; 9432af9434SMika Westerberg } __packed; 9532af9434SMika Westerberg 9632af9434SMika Westerberg /* TB_CFG_PKG_RESET */ 9732af9434SMika Westerberg struct cfg_reset_pkg { 9832af9434SMika Westerberg struct tb_cfg_header header; 9932af9434SMika Westerberg } __packed; 10032af9434SMika Westerberg 10132af9434SMika Westerberg /* TB_CFG_PKG_PREPARE_TO_SLEEP */ 10232af9434SMika Westerberg struct cfg_pts_pkg { 10332af9434SMika Westerberg struct tb_cfg_header header; 10432af9434SMika Westerberg u32 data; 10532af9434SMika Westerberg } __packed; 10632af9434SMika Westerberg 107f67cf491SMika Westerberg /* ICM messages */ 108f67cf491SMika Westerberg 109f67cf491SMika Westerberg enum icm_pkg_code { 110f67cf491SMika Westerberg ICM_GET_TOPOLOGY = 0x1, 111f67cf491SMika Westerberg ICM_DRIVER_READY = 0x3, 112f67cf491SMika Westerberg ICM_APPROVE_DEVICE = 0x4, 113f67cf491SMika Westerberg ICM_CHALLENGE_DEVICE = 0x5, 114f67cf491SMika Westerberg ICM_ADD_DEVICE_KEY = 0x6, 115f67cf491SMika Westerberg ICM_GET_ROUTE = 0xa, 116d1ff7024SMika Westerberg ICM_APPROVE_XDOMAIN = 0x10, 1174bac471dSRadion Mirchevsky ICM_DISCONNECT_XDOMAIN = 0x11, 1189aaa3b8bSMika Westerberg ICM_PREBOOT_ACL = 0x18, 1199039387eSMika Westerberg ICM_USB4_SWITCH_OP = 0x20, 120f67cf491SMika Westerberg }; 121f67cf491SMika Westerberg 122f67cf491SMika Westerberg enum icm_event_code { 1233cdb9446SMika Westerberg ICM_EVENT_DEVICE_CONNECTED = 0x3, 1243cdb9446SMika Westerberg ICM_EVENT_DEVICE_DISCONNECTED = 0x4, 1253cdb9446SMika Westerberg ICM_EVENT_XDOMAIN_CONNECTED = 0x6, 1263cdb9446SMika Westerberg ICM_EVENT_XDOMAIN_DISCONNECTED = 0x7, 1273cdb9446SMika Westerberg ICM_EVENT_RTD3_VETO = 0xa, 128f67cf491SMika Westerberg }; 129f67cf491SMika Westerberg 130f67cf491SMika Westerberg struct icm_pkg_header { 131f67cf491SMika Westerberg u8 code; 132f67cf491SMika Westerberg u8 flags; 133f67cf491SMika Westerberg u8 packet_id; 134f67cf491SMika Westerberg u8 total_packets; 13580671708SMika Westerberg }; 136f67cf491SMika Westerberg 137f67cf491SMika Westerberg #define ICM_FLAGS_ERROR BIT(0) 138f67cf491SMika Westerberg #define ICM_FLAGS_NO_KEY BIT(1) 139f67cf491SMika Westerberg #define ICM_FLAGS_SLEVEL_SHIFT 3 140f67cf491SMika Westerberg #define ICM_FLAGS_SLEVEL_MASK GENMASK(4, 3) 14191c0c120SMika Westerberg #define ICM_FLAGS_DUAL_LANE BIT(5) 14291c0c120SMika Westerberg #define ICM_FLAGS_SPEED_GEN3 BIT(7) 1439aaa3b8bSMika Westerberg #define ICM_FLAGS_WRITE BIT(7) 144f67cf491SMika Westerberg 145f67cf491SMika Westerberg struct icm_pkg_driver_ready { 146f67cf491SMika Westerberg struct icm_pkg_header hdr; 14780671708SMika Westerberg }; 148f67cf491SMika Westerberg 1499aaa3b8bSMika Westerberg /* Falcon Ridge only messages */ 1503080e197SMika Westerberg 1513080e197SMika Westerberg struct icm_fr_pkg_driver_ready_response { 152f67cf491SMika Westerberg struct icm_pkg_header hdr; 153f67cf491SMika Westerberg u8 romver; 154f67cf491SMika Westerberg u8 ramver; 155f67cf491SMika Westerberg u16 security_level; 15680671708SMika Westerberg }; 157f67cf491SMika Westerberg 1583080e197SMika Westerberg #define ICM_FR_SLEVEL_MASK 0xf 159f67cf491SMika Westerberg 1609aaa3b8bSMika Westerberg /* Falcon Ridge & Alpine Ridge common messages */ 1619aaa3b8bSMika Westerberg 162f67cf491SMika Westerberg struct icm_fr_pkg_get_topology { 163f67cf491SMika Westerberg struct icm_pkg_header hdr; 16480671708SMika Westerberg }; 165f67cf491SMika Westerberg 166f67cf491SMika Westerberg #define ICM_GET_TOPOLOGY_PACKETS 14 167f67cf491SMika Westerberg 168f67cf491SMika Westerberg struct icm_fr_pkg_get_topology_response { 169f67cf491SMika Westerberg struct icm_pkg_header hdr; 170f67cf491SMika Westerberg u32 route_lo; 171f67cf491SMika Westerberg u32 route_hi; 172f67cf491SMika Westerberg u8 first_data; 173f67cf491SMika Westerberg u8 second_data; 174f67cf491SMika Westerberg u8 drom_i2c_address_index; 175f67cf491SMika Westerberg u8 switch_index; 176f67cf491SMika Westerberg u32 reserved[2]; 177f67cf491SMika Westerberg u32 ports[16]; 178f67cf491SMika Westerberg u32 port_hop_info[16]; 17980671708SMika Westerberg }; 180f67cf491SMika Westerberg 181f67cf491SMika Westerberg #define ICM_SWITCH_USED BIT(0) 182f67cf491SMika Westerberg #define ICM_SWITCH_UPSTREAM_PORT_MASK GENMASK(7, 1) 183f67cf491SMika Westerberg #define ICM_SWITCH_UPSTREAM_PORT_SHIFT 1 184f67cf491SMika Westerberg 185f67cf491SMika Westerberg #define ICM_PORT_TYPE_MASK GENMASK(23, 0) 186f67cf491SMika Westerberg #define ICM_PORT_INDEX_SHIFT 24 187f67cf491SMika Westerberg #define ICM_PORT_INDEX_MASK GENMASK(31, 24) 188f67cf491SMika Westerberg 189f67cf491SMika Westerberg struct icm_fr_event_device_connected { 190f67cf491SMika Westerberg struct icm_pkg_header hdr; 1917c39ffe7SChristoph Hellwig uuid_t ep_uuid; 192f67cf491SMika Westerberg u8 connection_key; 193f67cf491SMika Westerberg u8 connection_id; 194f67cf491SMika Westerberg u16 link_info; 195f67cf491SMika Westerberg u32 ep_name[55]; 19680671708SMika Westerberg }; 197f67cf491SMika Westerberg 198f67cf491SMika Westerberg #define ICM_LINK_INFO_LINK_MASK 0x7 199f67cf491SMika Westerberg #define ICM_LINK_INFO_DEPTH_SHIFT 4 200f67cf491SMika Westerberg #define ICM_LINK_INFO_DEPTH_MASK GENMASK(7, 4) 201f67cf491SMika Westerberg #define ICM_LINK_INFO_APPROVED BIT(8) 202cb653eecSMika Westerberg #define ICM_LINK_INFO_REJECTED BIT(9) 20314862ee3SYehezkel Bernat #define ICM_LINK_INFO_BOOT BIT(10) 204f67cf491SMika Westerberg 205f67cf491SMika Westerberg struct icm_fr_pkg_approve_device { 206f67cf491SMika Westerberg struct icm_pkg_header hdr; 2077c39ffe7SChristoph Hellwig uuid_t ep_uuid; 208f67cf491SMika Westerberg u8 connection_key; 209f67cf491SMika Westerberg u8 connection_id; 210f67cf491SMika Westerberg u16 reserved; 21180671708SMika Westerberg }; 212f67cf491SMika Westerberg 213f67cf491SMika Westerberg struct icm_fr_event_device_disconnected { 214f67cf491SMika Westerberg struct icm_pkg_header hdr; 215f67cf491SMika Westerberg u16 reserved; 216f67cf491SMika Westerberg u16 link_info; 21780671708SMika Westerberg }; 218f67cf491SMika Westerberg 219d1ff7024SMika Westerberg struct icm_fr_event_xdomain_connected { 220d1ff7024SMika Westerberg struct icm_pkg_header hdr; 221d1ff7024SMika Westerberg u16 reserved; 222d1ff7024SMika Westerberg u16 link_info; 223d1ff7024SMika Westerberg uuid_t remote_uuid; 224d1ff7024SMika Westerberg uuid_t local_uuid; 225d1ff7024SMika Westerberg u32 local_route_hi; 226d1ff7024SMika Westerberg u32 local_route_lo; 227d1ff7024SMika Westerberg u32 remote_route_hi; 228d1ff7024SMika Westerberg u32 remote_route_lo; 229d1ff7024SMika Westerberg }; 230d1ff7024SMika Westerberg 231d1ff7024SMika Westerberg struct icm_fr_event_xdomain_disconnected { 232d1ff7024SMika Westerberg struct icm_pkg_header hdr; 233d1ff7024SMika Westerberg u16 reserved; 234d1ff7024SMika Westerberg u16 link_info; 235d1ff7024SMika Westerberg uuid_t remote_uuid; 236d1ff7024SMika Westerberg }; 237d1ff7024SMika Westerberg 238f67cf491SMika Westerberg struct icm_fr_pkg_add_device_key { 239f67cf491SMika Westerberg struct icm_pkg_header hdr; 2407c39ffe7SChristoph Hellwig uuid_t ep_uuid; 241f67cf491SMika Westerberg u8 connection_key; 242f67cf491SMika Westerberg u8 connection_id; 243f67cf491SMika Westerberg u16 reserved; 244f67cf491SMika Westerberg u32 key[8]; 24580671708SMika Westerberg }; 246f67cf491SMika Westerberg 247f67cf491SMika Westerberg struct icm_fr_pkg_add_device_key_response { 248f67cf491SMika Westerberg struct icm_pkg_header hdr; 2497c39ffe7SChristoph Hellwig uuid_t ep_uuid; 250f67cf491SMika Westerberg u8 connection_key; 251f67cf491SMika Westerberg u8 connection_id; 252f67cf491SMika Westerberg u16 reserved; 25380671708SMika Westerberg }; 254f67cf491SMika Westerberg 255f67cf491SMika Westerberg struct icm_fr_pkg_challenge_device { 256f67cf491SMika Westerberg struct icm_pkg_header hdr; 2577c39ffe7SChristoph Hellwig uuid_t ep_uuid; 258f67cf491SMika Westerberg u8 connection_key; 259f67cf491SMika Westerberg u8 connection_id; 260f67cf491SMika Westerberg u16 reserved; 261f67cf491SMika Westerberg u32 challenge[8]; 26280671708SMika Westerberg }; 263f67cf491SMika Westerberg 264f67cf491SMika Westerberg struct icm_fr_pkg_challenge_device_response { 265f67cf491SMika Westerberg struct icm_pkg_header hdr; 2667c39ffe7SChristoph Hellwig uuid_t ep_uuid; 267f67cf491SMika Westerberg u8 connection_key; 268f67cf491SMika Westerberg u8 connection_id; 269f67cf491SMika Westerberg u16 reserved; 270f67cf491SMika Westerberg u32 challenge[8]; 271f67cf491SMika Westerberg u32 response[8]; 27280671708SMika Westerberg }; 273f67cf491SMika Westerberg 274d1ff7024SMika Westerberg struct icm_fr_pkg_approve_xdomain { 275d1ff7024SMika Westerberg struct icm_pkg_header hdr; 276d1ff7024SMika Westerberg u16 reserved; 277d1ff7024SMika Westerberg u16 link_info; 278d1ff7024SMika Westerberg uuid_t remote_uuid; 279d1ff7024SMika Westerberg u16 transmit_path; 280d1ff7024SMika Westerberg u16 transmit_ring; 281d1ff7024SMika Westerberg u16 receive_path; 282d1ff7024SMika Westerberg u16 receive_ring; 283d1ff7024SMika Westerberg }; 284d1ff7024SMika Westerberg 285d1ff7024SMika Westerberg struct icm_fr_pkg_approve_xdomain_response { 286d1ff7024SMika Westerberg struct icm_pkg_header hdr; 287d1ff7024SMika Westerberg u16 reserved; 288d1ff7024SMika Westerberg u16 link_info; 289d1ff7024SMika Westerberg uuid_t remote_uuid; 290d1ff7024SMika Westerberg u16 transmit_path; 291d1ff7024SMika Westerberg u16 transmit_ring; 292d1ff7024SMika Westerberg u16 receive_path; 293d1ff7024SMika Westerberg u16 receive_ring; 294d1ff7024SMika Westerberg }; 295d1ff7024SMika Westerberg 296f67cf491SMika Westerberg /* Alpine Ridge only messages */ 297f67cf491SMika Westerberg 2989aaa3b8bSMika Westerberg struct icm_ar_pkg_driver_ready_response { 2999aaa3b8bSMika Westerberg struct icm_pkg_header hdr; 3009aaa3b8bSMika Westerberg u8 romver; 3019aaa3b8bSMika Westerberg u8 ramver; 3029aaa3b8bSMika Westerberg u16 info; 3039aaa3b8bSMika Westerberg }; 3049aaa3b8bSMika Westerberg 3052d8ff0b5SMika Westerberg #define ICM_AR_FLAGS_RTD3 BIT(6) 3062d8ff0b5SMika Westerberg 3079aaa3b8bSMika Westerberg #define ICM_AR_INFO_SLEVEL_MASK GENMASK(3, 0) 3089aaa3b8bSMika Westerberg #define ICM_AR_INFO_BOOT_ACL_SHIFT 7 3099aaa3b8bSMika Westerberg #define ICM_AR_INFO_BOOT_ACL_MASK GENMASK(11, 7) 3109aaa3b8bSMika Westerberg #define ICM_AR_INFO_BOOT_ACL_SUPPORTED BIT(13) 3119aaa3b8bSMika Westerberg 312f67cf491SMika Westerberg struct icm_ar_pkg_get_route { 313f67cf491SMika Westerberg struct icm_pkg_header hdr; 314f67cf491SMika Westerberg u16 reserved; 315f67cf491SMika Westerberg u16 link_info; 31680671708SMika Westerberg }; 317f67cf491SMika Westerberg 318f67cf491SMika Westerberg struct icm_ar_pkg_get_route_response { 319f67cf491SMika Westerberg struct icm_pkg_header hdr; 320f67cf491SMika Westerberg u16 reserved; 321f67cf491SMika Westerberg u16 link_info; 322f67cf491SMika Westerberg u32 route_hi; 323f67cf491SMika Westerberg u32 route_lo; 32480671708SMika Westerberg }; 325f67cf491SMika Westerberg 3269aaa3b8bSMika Westerberg struct icm_ar_boot_acl_entry { 3279aaa3b8bSMika Westerberg u32 uuid_lo; 3289aaa3b8bSMika Westerberg u32 uuid_hi; 3299aaa3b8bSMika Westerberg }; 3309aaa3b8bSMika Westerberg 3319aaa3b8bSMika Westerberg #define ICM_AR_PREBOOT_ACL_ENTRIES 16 3329aaa3b8bSMika Westerberg 3339aaa3b8bSMika Westerberg struct icm_ar_pkg_preboot_acl { 3349aaa3b8bSMika Westerberg struct icm_pkg_header hdr; 3359aaa3b8bSMika Westerberg struct icm_ar_boot_acl_entry acl[ICM_AR_PREBOOT_ACL_ENTRIES]; 3369aaa3b8bSMika Westerberg }; 3379aaa3b8bSMika Westerberg 3389aaa3b8bSMika Westerberg struct icm_ar_pkg_preboot_acl_response { 3399aaa3b8bSMika Westerberg struct icm_pkg_header hdr; 3409aaa3b8bSMika Westerberg struct icm_ar_boot_acl_entry acl[ICM_AR_PREBOOT_ACL_ENTRIES]; 3419aaa3b8bSMika Westerberg }; 3429aaa3b8bSMika Westerberg 3434bac471dSRadion Mirchevsky /* Titan Ridge messages */ 3444bac471dSRadion Mirchevsky 3454bac471dSRadion Mirchevsky struct icm_tr_pkg_driver_ready_response { 3464bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 3474bac471dSRadion Mirchevsky u16 reserved1; 3484bac471dSRadion Mirchevsky u16 info; 3494bac471dSRadion Mirchevsky u32 nvm_version; 3504bac471dSRadion Mirchevsky u16 device_id; 3514bac471dSRadion Mirchevsky u16 reserved2; 3524bac471dSRadion Mirchevsky }; 3534bac471dSRadion Mirchevsky 3542d8ff0b5SMika Westerberg #define ICM_TR_FLAGS_RTD3 BIT(6) 3552d8ff0b5SMika Westerberg 3564bac471dSRadion Mirchevsky #define ICM_TR_INFO_SLEVEL_MASK GENMASK(2, 0) 3579039387eSMika Westerberg #define ICM_TR_INFO_PROTO_VERSION_MASK GENMASK(6, 4) 3589039387eSMika Westerberg #define ICM_TR_INFO_PROTO_VERSION_SHIFT 4 3594bac471dSRadion Mirchevsky #define ICM_TR_INFO_BOOT_ACL_SHIFT 7 3604bac471dSRadion Mirchevsky #define ICM_TR_INFO_BOOT_ACL_MASK GENMASK(12, 7) 3614bac471dSRadion Mirchevsky 3624bac471dSRadion Mirchevsky struct icm_tr_event_device_connected { 3634bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 3644bac471dSRadion Mirchevsky uuid_t ep_uuid; 3654bac471dSRadion Mirchevsky u32 route_hi; 3664bac471dSRadion Mirchevsky u32 route_lo; 3674bac471dSRadion Mirchevsky u8 connection_id; 3684bac471dSRadion Mirchevsky u8 reserved; 3694bac471dSRadion Mirchevsky u16 link_info; 3704bac471dSRadion Mirchevsky u32 ep_name[55]; 3714bac471dSRadion Mirchevsky }; 3724bac471dSRadion Mirchevsky 3734bac471dSRadion Mirchevsky struct icm_tr_event_device_disconnected { 3744bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 3754bac471dSRadion Mirchevsky u32 route_hi; 3764bac471dSRadion Mirchevsky u32 route_lo; 3774bac471dSRadion Mirchevsky }; 3784bac471dSRadion Mirchevsky 3794bac471dSRadion Mirchevsky struct icm_tr_event_xdomain_connected { 3804bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 3814bac471dSRadion Mirchevsky u16 reserved; 3824bac471dSRadion Mirchevsky u16 link_info; 3834bac471dSRadion Mirchevsky uuid_t remote_uuid; 3844bac471dSRadion Mirchevsky uuid_t local_uuid; 3854bac471dSRadion Mirchevsky u32 local_route_hi; 3864bac471dSRadion Mirchevsky u32 local_route_lo; 3874bac471dSRadion Mirchevsky u32 remote_route_hi; 3884bac471dSRadion Mirchevsky u32 remote_route_lo; 3894bac471dSRadion Mirchevsky }; 3904bac471dSRadion Mirchevsky 3914bac471dSRadion Mirchevsky struct icm_tr_event_xdomain_disconnected { 3924bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 3934bac471dSRadion Mirchevsky u32 route_hi; 3944bac471dSRadion Mirchevsky u32 route_lo; 3954bac471dSRadion Mirchevsky uuid_t remote_uuid; 3964bac471dSRadion Mirchevsky }; 3974bac471dSRadion Mirchevsky 3984bac471dSRadion Mirchevsky struct icm_tr_pkg_approve_device { 3994bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 4004bac471dSRadion Mirchevsky uuid_t ep_uuid; 4014bac471dSRadion Mirchevsky u32 route_hi; 4024bac471dSRadion Mirchevsky u32 route_lo; 4034bac471dSRadion Mirchevsky u8 connection_id; 4044bac471dSRadion Mirchevsky u8 reserved1[3]; 4054bac471dSRadion Mirchevsky }; 4064bac471dSRadion Mirchevsky 4074bac471dSRadion Mirchevsky struct icm_tr_pkg_add_device_key { 4084bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 4094bac471dSRadion Mirchevsky uuid_t ep_uuid; 4104bac471dSRadion Mirchevsky u32 route_hi; 4114bac471dSRadion Mirchevsky u32 route_lo; 4124bac471dSRadion Mirchevsky u8 connection_id; 4134bac471dSRadion Mirchevsky u8 reserved[3]; 4144bac471dSRadion Mirchevsky u32 key[8]; 4154bac471dSRadion Mirchevsky }; 4164bac471dSRadion Mirchevsky 4174bac471dSRadion Mirchevsky struct icm_tr_pkg_challenge_device { 4184bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 4194bac471dSRadion Mirchevsky uuid_t ep_uuid; 4204bac471dSRadion Mirchevsky u32 route_hi; 4214bac471dSRadion Mirchevsky u32 route_lo; 4224bac471dSRadion Mirchevsky u8 connection_id; 4234bac471dSRadion Mirchevsky u8 reserved[3]; 4244bac471dSRadion Mirchevsky u32 challenge[8]; 4254bac471dSRadion Mirchevsky }; 4264bac471dSRadion Mirchevsky 4274bac471dSRadion Mirchevsky struct icm_tr_pkg_approve_xdomain { 4284bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 4294bac471dSRadion Mirchevsky u32 route_hi; 4304bac471dSRadion Mirchevsky u32 route_lo; 4314bac471dSRadion Mirchevsky uuid_t remote_uuid; 4324bac471dSRadion Mirchevsky u16 transmit_path; 4334bac471dSRadion Mirchevsky u16 transmit_ring; 4344bac471dSRadion Mirchevsky u16 receive_path; 4354bac471dSRadion Mirchevsky u16 receive_ring; 4364bac471dSRadion Mirchevsky }; 4374bac471dSRadion Mirchevsky 4384bac471dSRadion Mirchevsky struct icm_tr_pkg_disconnect_xdomain { 4394bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 4404bac471dSRadion Mirchevsky u8 stage; 4414bac471dSRadion Mirchevsky u8 reserved[3]; 4424bac471dSRadion Mirchevsky u32 route_hi; 4434bac471dSRadion Mirchevsky u32 route_lo; 4444bac471dSRadion Mirchevsky uuid_t remote_uuid; 4454bac471dSRadion Mirchevsky }; 4464bac471dSRadion Mirchevsky 4474bac471dSRadion Mirchevsky struct icm_tr_pkg_challenge_device_response { 4484bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 4494bac471dSRadion Mirchevsky uuid_t ep_uuid; 4504bac471dSRadion Mirchevsky u32 route_hi; 4514bac471dSRadion Mirchevsky u32 route_lo; 4524bac471dSRadion Mirchevsky u8 connection_id; 4534bac471dSRadion Mirchevsky u8 reserved[3]; 4544bac471dSRadion Mirchevsky u32 challenge[8]; 4554bac471dSRadion Mirchevsky u32 response[8]; 4564bac471dSRadion Mirchevsky }; 4574bac471dSRadion Mirchevsky 4584bac471dSRadion Mirchevsky struct icm_tr_pkg_add_device_key_response { 4594bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 4604bac471dSRadion Mirchevsky uuid_t ep_uuid; 4614bac471dSRadion Mirchevsky u32 route_hi; 4624bac471dSRadion Mirchevsky u32 route_lo; 4634bac471dSRadion Mirchevsky u8 connection_id; 4644bac471dSRadion Mirchevsky u8 reserved[3]; 4654bac471dSRadion Mirchevsky }; 4664bac471dSRadion Mirchevsky 4674bac471dSRadion Mirchevsky struct icm_tr_pkg_approve_xdomain_response { 4684bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 4694bac471dSRadion Mirchevsky u32 route_hi; 4704bac471dSRadion Mirchevsky u32 route_lo; 4714bac471dSRadion Mirchevsky uuid_t remote_uuid; 4724bac471dSRadion Mirchevsky u16 transmit_path; 4734bac471dSRadion Mirchevsky u16 transmit_ring; 4744bac471dSRadion Mirchevsky u16 receive_path; 4754bac471dSRadion Mirchevsky u16 receive_ring; 4764bac471dSRadion Mirchevsky }; 4774bac471dSRadion Mirchevsky 4784bac471dSRadion Mirchevsky struct icm_tr_pkg_disconnect_xdomain_response { 4794bac471dSRadion Mirchevsky struct icm_pkg_header hdr; 4804bac471dSRadion Mirchevsky u8 stage; 4814bac471dSRadion Mirchevsky u8 reserved[3]; 4824bac471dSRadion Mirchevsky u32 route_hi; 4834bac471dSRadion Mirchevsky u32 route_lo; 4844bac471dSRadion Mirchevsky uuid_t remote_uuid; 4854bac471dSRadion Mirchevsky }; 4864bac471dSRadion Mirchevsky 4873cdb9446SMika Westerberg /* Ice Lake messages */ 4883cdb9446SMika Westerberg 4893cdb9446SMika Westerberg struct icm_icl_event_rtd3_veto { 4903cdb9446SMika Westerberg struct icm_pkg_header hdr; 4913cdb9446SMika Westerberg u32 veto_reason; 4923cdb9446SMika Westerberg }; 4933cdb9446SMika Westerberg 4949039387eSMika Westerberg /* USB4 ICM messages */ 4959039387eSMika Westerberg 4969039387eSMika Westerberg struct icm_usb4_switch_op { 4979039387eSMika Westerberg struct icm_pkg_header hdr; 4989039387eSMika Westerberg u32 route_hi; 4999039387eSMika Westerberg u32 route_lo; 5009039387eSMika Westerberg u32 metadata; 5019039387eSMika Westerberg u16 opcode; 5029039387eSMika Westerberg u16 data_len_valid; 5039039387eSMika Westerberg u32 data[16]; 5049039387eSMika Westerberg }; 5059039387eSMika Westerberg 5069039387eSMika Westerberg #define ICM_USB4_SWITCH_DATA_LEN_MASK GENMASK(3, 0) 5079039387eSMika Westerberg #define ICM_USB4_SWITCH_DATA_VALID BIT(4) 5089039387eSMika Westerberg 5099039387eSMika Westerberg struct icm_usb4_switch_op_response { 5109039387eSMika Westerberg struct icm_pkg_header hdr; 5119039387eSMika Westerberg u32 route_hi; 5129039387eSMika Westerberg u32 route_lo; 5139039387eSMika Westerberg u32 metadata; 5149039387eSMika Westerberg u16 opcode; 5159039387eSMika Westerberg u16 status; 5169039387eSMika Westerberg u32 data[16]; 5179039387eSMika Westerberg }; 5189039387eSMika Westerberg 519d1ff7024SMika Westerberg /* XDomain messages */ 520d1ff7024SMika Westerberg 521d1ff7024SMika Westerberg struct tb_xdomain_header { 522d1ff7024SMika Westerberg u32 route_hi; 523d1ff7024SMika Westerberg u32 route_lo; 524d1ff7024SMika Westerberg u32 length_sn; 525d1ff7024SMika Westerberg }; 526d1ff7024SMika Westerberg 527d1ff7024SMika Westerberg #define TB_XDOMAIN_LENGTH_MASK GENMASK(5, 0) 528d1ff7024SMika Westerberg #define TB_XDOMAIN_SN_MASK GENMASK(28, 27) 529d1ff7024SMika Westerberg #define TB_XDOMAIN_SN_SHIFT 27 530d1ff7024SMika Westerberg 531d1ff7024SMika Westerberg enum tb_xdp_type { 532d1ff7024SMika Westerberg UUID_REQUEST_OLD = 1, 533d1ff7024SMika Westerberg UUID_RESPONSE = 2, 534d1ff7024SMika Westerberg PROPERTIES_REQUEST, 535d1ff7024SMika Westerberg PROPERTIES_RESPONSE, 536d1ff7024SMika Westerberg PROPERTIES_CHANGED_REQUEST, 537d1ff7024SMika Westerberg PROPERTIES_CHANGED_RESPONSE, 538d1ff7024SMika Westerberg ERROR_RESPONSE, 539d1ff7024SMika Westerberg UUID_REQUEST = 12, 5408e1de704SMika Westerberg LINK_STATE_STATUS_REQUEST = 15, 5418e1de704SMika Westerberg LINK_STATE_STATUS_RESPONSE, 5428e1de704SMika Westerberg LINK_STATE_CHANGE_REQUEST, 5438e1de704SMika Westerberg LINK_STATE_CHANGE_RESPONSE, 544d1ff7024SMika Westerberg }; 545d1ff7024SMika Westerberg 546d1ff7024SMika Westerberg struct tb_xdp_header { 547d1ff7024SMika Westerberg struct tb_xdomain_header xd_hdr; 548d1ff7024SMika Westerberg uuid_t uuid; 549d1ff7024SMika Westerberg u32 type; 550d1ff7024SMika Westerberg }; 551d1ff7024SMika Westerberg 55219813551SKees Cook struct tb_xdp_error_response { 55319813551SKees Cook struct tb_xdp_header hdr; 55419813551SKees Cook u32 error; 55519813551SKees Cook }; 55619813551SKees Cook 5578e1de704SMika Westerberg struct tb_xdp_link_state_status { 5588e1de704SMika Westerberg struct tb_xdp_header hdr; 5598e1de704SMika Westerberg }; 5608e1de704SMika Westerberg 5618e1de704SMika Westerberg struct tb_xdp_link_state_status_response { 5628e1de704SMika Westerberg union { 5638e1de704SMika Westerberg struct tb_xdp_error_response err; 5648e1de704SMika Westerberg struct { 5658e1de704SMika Westerberg struct tb_xdp_header hdr; 5668e1de704SMika Westerberg u32 status; 5678e1de704SMika Westerberg u8 slw; 5688e1de704SMika Westerberg u8 tlw; 5698e1de704SMika Westerberg u8 sls; 5708e1de704SMika Westerberg u8 tls; 5718e1de704SMika Westerberg }; 5728e1de704SMika Westerberg }; 5738e1de704SMika Westerberg }; 5748e1de704SMika Westerberg 5758e1de704SMika Westerberg struct tb_xdp_link_state_change { 5768e1de704SMika Westerberg struct tb_xdp_header hdr; 5778e1de704SMika Westerberg u8 tlw; 5788e1de704SMika Westerberg u8 tls; 5798e1de704SMika Westerberg u16 reserved; 5808e1de704SMika Westerberg }; 5818e1de704SMika Westerberg 5828e1de704SMika Westerberg struct tb_xdp_link_state_change_response { 5838e1de704SMika Westerberg union { 5848e1de704SMika Westerberg struct tb_xdp_error_response err; 5858e1de704SMika Westerberg struct { 5868e1de704SMika Westerberg struct tb_xdp_header hdr; 5878e1de704SMika Westerberg u32 status; 5888e1de704SMika Westerberg }; 5898e1de704SMika Westerberg }; 5908e1de704SMika Westerberg }; 5918e1de704SMika Westerberg 5923b4b3235SMika Westerberg struct tb_xdp_uuid { 5933b4b3235SMika Westerberg struct tb_xdp_header hdr; 5943b4b3235SMika Westerberg }; 5953b4b3235SMika Westerberg 5963b4b3235SMika Westerberg struct tb_xdp_uuid_response { 59719813551SKees Cook union { 59819813551SKees Cook struct tb_xdp_error_response err; 59919813551SKees Cook struct { 6003b4b3235SMika Westerberg struct tb_xdp_header hdr; 6013b4b3235SMika Westerberg uuid_t src_uuid; 6023b4b3235SMika Westerberg u32 src_route_hi; 6033b4b3235SMika Westerberg u32 src_route_lo; 6043b4b3235SMika Westerberg }; 60519813551SKees Cook }; 60619813551SKees Cook }; 6073b4b3235SMika Westerberg 608d1ff7024SMika Westerberg struct tb_xdp_properties { 609d1ff7024SMika Westerberg struct tb_xdp_header hdr; 610d1ff7024SMika Westerberg uuid_t src_uuid; 611d1ff7024SMika Westerberg uuid_t dst_uuid; 612d1ff7024SMika Westerberg u16 offset; 613d1ff7024SMika Westerberg u16 reserved; 614d1ff7024SMika Westerberg }; 615d1ff7024SMika Westerberg 616d1ff7024SMika Westerberg struct tb_xdp_properties_response { 61719813551SKees Cook union { 61819813551SKees Cook struct tb_xdp_error_response err; 61919813551SKees Cook struct { 620d1ff7024SMika Westerberg struct tb_xdp_header hdr; 621d1ff7024SMika Westerberg uuid_t src_uuid; 622d1ff7024SMika Westerberg uuid_t dst_uuid; 623d1ff7024SMika Westerberg u16 offset; 624d1ff7024SMika Westerberg u16 data_length; 625d1ff7024SMika Westerberg u32 generation; 62619813551SKees Cook u32 data[]; 62719813551SKees Cook }; 62819813551SKees Cook }; 629d1ff7024SMika Westerberg }; 630d1ff7024SMika Westerberg 631d1ff7024SMika Westerberg /* 632d1ff7024SMika Westerberg * Max length of data array single XDomain property response is allowed 633d1ff7024SMika Westerberg * to carry. 634d1ff7024SMika Westerberg */ 635d1ff7024SMika Westerberg #define TB_XDP_PROPERTIES_MAX_DATA_LENGTH \ 636d1ff7024SMika Westerberg (((256 - 4 - sizeof(struct tb_xdp_properties_response))) / 4) 637d1ff7024SMika Westerberg 638d1ff7024SMika Westerberg /* Maximum size of the total property block in dwords we allow */ 639d1ff7024SMika Westerberg #define TB_XDP_PROPERTIES_MAX_LENGTH 500 640d1ff7024SMika Westerberg 641d1ff7024SMika Westerberg struct tb_xdp_properties_changed { 642d1ff7024SMika Westerberg struct tb_xdp_header hdr; 643d1ff7024SMika Westerberg uuid_t src_uuid; 644d1ff7024SMika Westerberg }; 645d1ff7024SMika Westerberg 646d1ff7024SMika Westerberg struct tb_xdp_properties_changed_response { 64719813551SKees Cook union { 64819813551SKees Cook struct tb_xdp_error_response err; 649d1ff7024SMika Westerberg struct tb_xdp_header hdr; 650d1ff7024SMika Westerberg }; 65119813551SKees Cook }; 652d1ff7024SMika Westerberg 653d1ff7024SMika Westerberg enum tb_xdp_error { 654d1ff7024SMika Westerberg ERROR_SUCCESS, 655d1ff7024SMika Westerberg ERROR_UNKNOWN_PACKET, 656d1ff7024SMika Westerberg ERROR_UNKNOWN_DOMAIN, 657d1ff7024SMika Westerberg ERROR_NOT_SUPPORTED, 658d1ff7024SMika Westerberg ERROR_NOT_READY, 659d1ff7024SMika Westerberg }; 660d1ff7024SMika Westerberg 66132af9434SMika Westerberg #endif 662