162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Thunderbolt control channel messages 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2014 Andreas Noever <andreas.noever@gmail.com> 662306a36Sopenharmony_ci * Copyright (C) 2017, Intel Corporation 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef _TB_MSGS 1062306a36Sopenharmony_ci#define _TB_MSGS 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/types.h> 1362306a36Sopenharmony_ci#include <linux/uuid.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cienum tb_cfg_space { 1662306a36Sopenharmony_ci TB_CFG_HOPS = 0, 1762306a36Sopenharmony_ci TB_CFG_PORT = 1, 1862306a36Sopenharmony_ci TB_CFG_SWITCH = 2, 1962306a36Sopenharmony_ci TB_CFG_COUNTERS = 3, 2062306a36Sopenharmony_ci}; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cienum tb_cfg_error { 2362306a36Sopenharmony_ci TB_CFG_ERROR_PORT_NOT_CONNECTED = 0, 2462306a36Sopenharmony_ci TB_CFG_ERROR_LINK_ERROR = 1, 2562306a36Sopenharmony_ci TB_CFG_ERROR_INVALID_CONFIG_SPACE = 2, 2662306a36Sopenharmony_ci TB_CFG_ERROR_NO_SUCH_PORT = 4, 2762306a36Sopenharmony_ci TB_CFG_ERROR_ACK_PLUG_EVENT = 7, /* send as reply to TB_CFG_PKG_EVENT */ 2862306a36Sopenharmony_ci TB_CFG_ERROR_LOOP = 8, 2962306a36Sopenharmony_ci TB_CFG_ERROR_HEC_ERROR_DETECTED = 12, 3062306a36Sopenharmony_ci TB_CFG_ERROR_FLOW_CONTROL_ERROR = 13, 3162306a36Sopenharmony_ci TB_CFG_ERROR_LOCK = 15, 3262306a36Sopenharmony_ci TB_CFG_ERROR_DP_BW = 32, 3362306a36Sopenharmony_ci TB_CFG_ERROR_ROP_CMPLT = 33, 3462306a36Sopenharmony_ci TB_CFG_ERROR_POP_CMPLT = 34, 3562306a36Sopenharmony_ci TB_CFG_ERROR_PCIE_WAKE = 35, 3662306a36Sopenharmony_ci TB_CFG_ERROR_DP_CON_CHANGE = 36, 3762306a36Sopenharmony_ci TB_CFG_ERROR_DPTX_DISCOVERY = 37, 3862306a36Sopenharmony_ci TB_CFG_ERROR_LINK_RECOVERY = 38, 3962306a36Sopenharmony_ci TB_CFG_ERROR_ASYM_LINK = 39, 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/* common header */ 4362306a36Sopenharmony_cistruct tb_cfg_header { 4462306a36Sopenharmony_ci u32 route_hi:22; 4562306a36Sopenharmony_ci u32 unknown:10; /* highest order bit is set on replies */ 4662306a36Sopenharmony_ci u32 route_lo; 4762306a36Sopenharmony_ci} __packed; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* additional header for read/write packets */ 5062306a36Sopenharmony_cistruct tb_cfg_address { 5162306a36Sopenharmony_ci u32 offset:13; /* in dwords */ 5262306a36Sopenharmony_ci u32 length:6; /* in dwords */ 5362306a36Sopenharmony_ci u32 port:6; 5462306a36Sopenharmony_ci enum tb_cfg_space space:2; 5562306a36Sopenharmony_ci u32 seq:2; /* sequence number */ 5662306a36Sopenharmony_ci u32 zero:3; 5762306a36Sopenharmony_ci} __packed; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* TB_CFG_PKG_READ, response for TB_CFG_PKG_WRITE */ 6062306a36Sopenharmony_cistruct cfg_read_pkg { 6162306a36Sopenharmony_ci struct tb_cfg_header header; 6262306a36Sopenharmony_ci struct tb_cfg_address addr; 6362306a36Sopenharmony_ci} __packed; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* TB_CFG_PKG_WRITE, response for TB_CFG_PKG_READ */ 6662306a36Sopenharmony_cistruct cfg_write_pkg { 6762306a36Sopenharmony_ci struct tb_cfg_header header; 6862306a36Sopenharmony_ci struct tb_cfg_address addr; 6962306a36Sopenharmony_ci u32 data[64]; /* maximum size, tb_cfg_address.length has 6 bits */ 7062306a36Sopenharmony_ci} __packed; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* TB_CFG_PKG_ERROR */ 7362306a36Sopenharmony_cistruct cfg_error_pkg { 7462306a36Sopenharmony_ci struct tb_cfg_header header; 7562306a36Sopenharmony_ci enum tb_cfg_error error:8; 7662306a36Sopenharmony_ci u32 port:6; 7762306a36Sopenharmony_ci u32 reserved:16; 7862306a36Sopenharmony_ci u32 pg:2; 7962306a36Sopenharmony_ci} __packed; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistruct cfg_ack_pkg { 8262306a36Sopenharmony_ci struct tb_cfg_header header; 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define TB_CFG_ERROR_PG_HOT_PLUG 0x2 8662306a36Sopenharmony_ci#define TB_CFG_ERROR_PG_HOT_UNPLUG 0x3 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/* TB_CFG_PKG_EVENT */ 8962306a36Sopenharmony_cistruct cfg_event_pkg { 9062306a36Sopenharmony_ci struct tb_cfg_header header; 9162306a36Sopenharmony_ci u32 port:6; 9262306a36Sopenharmony_ci u32 zero:25; 9362306a36Sopenharmony_ci bool unplug:1; 9462306a36Sopenharmony_ci} __packed; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* TB_CFG_PKG_RESET */ 9762306a36Sopenharmony_cistruct cfg_reset_pkg { 9862306a36Sopenharmony_ci struct tb_cfg_header header; 9962306a36Sopenharmony_ci} __packed; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* TB_CFG_PKG_PREPARE_TO_SLEEP */ 10262306a36Sopenharmony_cistruct cfg_pts_pkg { 10362306a36Sopenharmony_ci struct tb_cfg_header header; 10462306a36Sopenharmony_ci u32 data; 10562306a36Sopenharmony_ci} __packed; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/* ICM messages */ 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cienum icm_pkg_code { 11062306a36Sopenharmony_ci ICM_GET_TOPOLOGY = 0x1, 11162306a36Sopenharmony_ci ICM_DRIVER_READY = 0x3, 11262306a36Sopenharmony_ci ICM_APPROVE_DEVICE = 0x4, 11362306a36Sopenharmony_ci ICM_CHALLENGE_DEVICE = 0x5, 11462306a36Sopenharmony_ci ICM_ADD_DEVICE_KEY = 0x6, 11562306a36Sopenharmony_ci ICM_GET_ROUTE = 0xa, 11662306a36Sopenharmony_ci ICM_APPROVE_XDOMAIN = 0x10, 11762306a36Sopenharmony_ci ICM_DISCONNECT_XDOMAIN = 0x11, 11862306a36Sopenharmony_ci ICM_PREBOOT_ACL = 0x18, 11962306a36Sopenharmony_ci ICM_USB4_SWITCH_OP = 0x20, 12062306a36Sopenharmony_ci}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cienum icm_event_code { 12362306a36Sopenharmony_ci ICM_EVENT_DEVICE_CONNECTED = 0x3, 12462306a36Sopenharmony_ci ICM_EVENT_DEVICE_DISCONNECTED = 0x4, 12562306a36Sopenharmony_ci ICM_EVENT_XDOMAIN_CONNECTED = 0x6, 12662306a36Sopenharmony_ci ICM_EVENT_XDOMAIN_DISCONNECTED = 0x7, 12762306a36Sopenharmony_ci ICM_EVENT_RTD3_VETO = 0xa, 12862306a36Sopenharmony_ci}; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_cistruct icm_pkg_header { 13162306a36Sopenharmony_ci u8 code; 13262306a36Sopenharmony_ci u8 flags; 13362306a36Sopenharmony_ci u8 packet_id; 13462306a36Sopenharmony_ci u8 total_packets; 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#define ICM_FLAGS_ERROR BIT(0) 13862306a36Sopenharmony_ci#define ICM_FLAGS_NO_KEY BIT(1) 13962306a36Sopenharmony_ci#define ICM_FLAGS_SLEVEL_SHIFT 3 14062306a36Sopenharmony_ci#define ICM_FLAGS_SLEVEL_MASK GENMASK(4, 3) 14162306a36Sopenharmony_ci#define ICM_FLAGS_DUAL_LANE BIT(5) 14262306a36Sopenharmony_ci#define ICM_FLAGS_SPEED_GEN3 BIT(7) 14362306a36Sopenharmony_ci#define ICM_FLAGS_WRITE BIT(7) 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistruct icm_pkg_driver_ready { 14662306a36Sopenharmony_ci struct icm_pkg_header hdr; 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/* Falcon Ridge only messages */ 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistruct icm_fr_pkg_driver_ready_response { 15262306a36Sopenharmony_ci struct icm_pkg_header hdr; 15362306a36Sopenharmony_ci u8 romver; 15462306a36Sopenharmony_ci u8 ramver; 15562306a36Sopenharmony_ci u16 security_level; 15662306a36Sopenharmony_ci}; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci#define ICM_FR_SLEVEL_MASK 0xf 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci/* Falcon Ridge & Alpine Ridge common messages */ 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistruct icm_fr_pkg_get_topology { 16362306a36Sopenharmony_ci struct icm_pkg_header hdr; 16462306a36Sopenharmony_ci}; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci#define ICM_GET_TOPOLOGY_PACKETS 14 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_cistruct icm_fr_pkg_get_topology_response { 16962306a36Sopenharmony_ci struct icm_pkg_header hdr; 17062306a36Sopenharmony_ci u32 route_lo; 17162306a36Sopenharmony_ci u32 route_hi; 17262306a36Sopenharmony_ci u8 first_data; 17362306a36Sopenharmony_ci u8 second_data; 17462306a36Sopenharmony_ci u8 drom_i2c_address_index; 17562306a36Sopenharmony_ci u8 switch_index; 17662306a36Sopenharmony_ci u32 reserved[2]; 17762306a36Sopenharmony_ci u32 ports[16]; 17862306a36Sopenharmony_ci u32 port_hop_info[16]; 17962306a36Sopenharmony_ci}; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci#define ICM_SWITCH_USED BIT(0) 18262306a36Sopenharmony_ci#define ICM_SWITCH_UPSTREAM_PORT_MASK GENMASK(7, 1) 18362306a36Sopenharmony_ci#define ICM_SWITCH_UPSTREAM_PORT_SHIFT 1 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci#define ICM_PORT_TYPE_MASK GENMASK(23, 0) 18662306a36Sopenharmony_ci#define ICM_PORT_INDEX_SHIFT 24 18762306a36Sopenharmony_ci#define ICM_PORT_INDEX_MASK GENMASK(31, 24) 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistruct icm_fr_event_device_connected { 19062306a36Sopenharmony_ci struct icm_pkg_header hdr; 19162306a36Sopenharmony_ci uuid_t ep_uuid; 19262306a36Sopenharmony_ci u8 connection_key; 19362306a36Sopenharmony_ci u8 connection_id; 19462306a36Sopenharmony_ci u16 link_info; 19562306a36Sopenharmony_ci u32 ep_name[55]; 19662306a36Sopenharmony_ci}; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#define ICM_LINK_INFO_LINK_MASK 0x7 19962306a36Sopenharmony_ci#define ICM_LINK_INFO_DEPTH_SHIFT 4 20062306a36Sopenharmony_ci#define ICM_LINK_INFO_DEPTH_MASK GENMASK(7, 4) 20162306a36Sopenharmony_ci#define ICM_LINK_INFO_APPROVED BIT(8) 20262306a36Sopenharmony_ci#define ICM_LINK_INFO_REJECTED BIT(9) 20362306a36Sopenharmony_ci#define ICM_LINK_INFO_BOOT BIT(10) 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistruct icm_fr_pkg_approve_device { 20662306a36Sopenharmony_ci struct icm_pkg_header hdr; 20762306a36Sopenharmony_ci uuid_t ep_uuid; 20862306a36Sopenharmony_ci u8 connection_key; 20962306a36Sopenharmony_ci u8 connection_id; 21062306a36Sopenharmony_ci u16 reserved; 21162306a36Sopenharmony_ci}; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_cistruct icm_fr_event_device_disconnected { 21462306a36Sopenharmony_ci struct icm_pkg_header hdr; 21562306a36Sopenharmony_ci u16 reserved; 21662306a36Sopenharmony_ci u16 link_info; 21762306a36Sopenharmony_ci}; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistruct icm_fr_event_xdomain_connected { 22062306a36Sopenharmony_ci struct icm_pkg_header hdr; 22162306a36Sopenharmony_ci u16 reserved; 22262306a36Sopenharmony_ci u16 link_info; 22362306a36Sopenharmony_ci uuid_t remote_uuid; 22462306a36Sopenharmony_ci uuid_t local_uuid; 22562306a36Sopenharmony_ci u32 local_route_hi; 22662306a36Sopenharmony_ci u32 local_route_lo; 22762306a36Sopenharmony_ci u32 remote_route_hi; 22862306a36Sopenharmony_ci u32 remote_route_lo; 22962306a36Sopenharmony_ci}; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_cistruct icm_fr_event_xdomain_disconnected { 23262306a36Sopenharmony_ci struct icm_pkg_header hdr; 23362306a36Sopenharmony_ci u16 reserved; 23462306a36Sopenharmony_ci u16 link_info; 23562306a36Sopenharmony_ci uuid_t remote_uuid; 23662306a36Sopenharmony_ci}; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistruct icm_fr_pkg_add_device_key { 23962306a36Sopenharmony_ci struct icm_pkg_header hdr; 24062306a36Sopenharmony_ci uuid_t ep_uuid; 24162306a36Sopenharmony_ci u8 connection_key; 24262306a36Sopenharmony_ci u8 connection_id; 24362306a36Sopenharmony_ci u16 reserved; 24462306a36Sopenharmony_ci u32 key[8]; 24562306a36Sopenharmony_ci}; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_cistruct icm_fr_pkg_add_device_key_response { 24862306a36Sopenharmony_ci struct icm_pkg_header hdr; 24962306a36Sopenharmony_ci uuid_t ep_uuid; 25062306a36Sopenharmony_ci u8 connection_key; 25162306a36Sopenharmony_ci u8 connection_id; 25262306a36Sopenharmony_ci u16 reserved; 25362306a36Sopenharmony_ci}; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistruct icm_fr_pkg_challenge_device { 25662306a36Sopenharmony_ci struct icm_pkg_header hdr; 25762306a36Sopenharmony_ci uuid_t ep_uuid; 25862306a36Sopenharmony_ci u8 connection_key; 25962306a36Sopenharmony_ci u8 connection_id; 26062306a36Sopenharmony_ci u16 reserved; 26162306a36Sopenharmony_ci u32 challenge[8]; 26262306a36Sopenharmony_ci}; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cistruct icm_fr_pkg_challenge_device_response { 26562306a36Sopenharmony_ci struct icm_pkg_header hdr; 26662306a36Sopenharmony_ci uuid_t ep_uuid; 26762306a36Sopenharmony_ci u8 connection_key; 26862306a36Sopenharmony_ci u8 connection_id; 26962306a36Sopenharmony_ci u16 reserved; 27062306a36Sopenharmony_ci u32 challenge[8]; 27162306a36Sopenharmony_ci u32 response[8]; 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistruct icm_fr_pkg_approve_xdomain { 27562306a36Sopenharmony_ci struct icm_pkg_header hdr; 27662306a36Sopenharmony_ci u16 reserved; 27762306a36Sopenharmony_ci u16 link_info; 27862306a36Sopenharmony_ci uuid_t remote_uuid; 27962306a36Sopenharmony_ci u16 transmit_path; 28062306a36Sopenharmony_ci u16 transmit_ring; 28162306a36Sopenharmony_ci u16 receive_path; 28262306a36Sopenharmony_ci u16 receive_ring; 28362306a36Sopenharmony_ci}; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistruct icm_fr_pkg_approve_xdomain_response { 28662306a36Sopenharmony_ci struct icm_pkg_header hdr; 28762306a36Sopenharmony_ci u16 reserved; 28862306a36Sopenharmony_ci u16 link_info; 28962306a36Sopenharmony_ci uuid_t remote_uuid; 29062306a36Sopenharmony_ci u16 transmit_path; 29162306a36Sopenharmony_ci u16 transmit_ring; 29262306a36Sopenharmony_ci u16 receive_path; 29362306a36Sopenharmony_ci u16 receive_ring; 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci/* Alpine Ridge only messages */ 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistruct icm_ar_pkg_driver_ready_response { 29962306a36Sopenharmony_ci struct icm_pkg_header hdr; 30062306a36Sopenharmony_ci u8 romver; 30162306a36Sopenharmony_ci u8 ramver; 30262306a36Sopenharmony_ci u16 info; 30362306a36Sopenharmony_ci}; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci#define ICM_AR_FLAGS_RTD3 BIT(6) 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci#define ICM_AR_INFO_SLEVEL_MASK GENMASK(3, 0) 30862306a36Sopenharmony_ci#define ICM_AR_INFO_BOOT_ACL_SHIFT 7 30962306a36Sopenharmony_ci#define ICM_AR_INFO_BOOT_ACL_MASK GENMASK(11, 7) 31062306a36Sopenharmony_ci#define ICM_AR_INFO_BOOT_ACL_SUPPORTED BIT(13) 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistruct icm_ar_pkg_get_route { 31362306a36Sopenharmony_ci struct icm_pkg_header hdr; 31462306a36Sopenharmony_ci u16 reserved; 31562306a36Sopenharmony_ci u16 link_info; 31662306a36Sopenharmony_ci}; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistruct icm_ar_pkg_get_route_response { 31962306a36Sopenharmony_ci struct icm_pkg_header hdr; 32062306a36Sopenharmony_ci u16 reserved; 32162306a36Sopenharmony_ci u16 link_info; 32262306a36Sopenharmony_ci u32 route_hi; 32362306a36Sopenharmony_ci u32 route_lo; 32462306a36Sopenharmony_ci}; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_cistruct icm_ar_boot_acl_entry { 32762306a36Sopenharmony_ci u32 uuid_lo; 32862306a36Sopenharmony_ci u32 uuid_hi; 32962306a36Sopenharmony_ci}; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci#define ICM_AR_PREBOOT_ACL_ENTRIES 16 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistruct icm_ar_pkg_preboot_acl { 33462306a36Sopenharmony_ci struct icm_pkg_header hdr; 33562306a36Sopenharmony_ci struct icm_ar_boot_acl_entry acl[ICM_AR_PREBOOT_ACL_ENTRIES]; 33662306a36Sopenharmony_ci}; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistruct icm_ar_pkg_preboot_acl_response { 33962306a36Sopenharmony_ci struct icm_pkg_header hdr; 34062306a36Sopenharmony_ci struct icm_ar_boot_acl_entry acl[ICM_AR_PREBOOT_ACL_ENTRIES]; 34162306a36Sopenharmony_ci}; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci/* Titan Ridge messages */ 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_cistruct icm_tr_pkg_driver_ready_response { 34662306a36Sopenharmony_ci struct icm_pkg_header hdr; 34762306a36Sopenharmony_ci u16 reserved1; 34862306a36Sopenharmony_ci u16 info; 34962306a36Sopenharmony_ci u32 nvm_version; 35062306a36Sopenharmony_ci u16 device_id; 35162306a36Sopenharmony_ci u16 reserved2; 35262306a36Sopenharmony_ci}; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci#define ICM_TR_FLAGS_RTD3 BIT(6) 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci#define ICM_TR_INFO_SLEVEL_MASK GENMASK(2, 0) 35762306a36Sopenharmony_ci#define ICM_TR_INFO_PROTO_VERSION_MASK GENMASK(6, 4) 35862306a36Sopenharmony_ci#define ICM_TR_INFO_PROTO_VERSION_SHIFT 4 35962306a36Sopenharmony_ci#define ICM_TR_INFO_BOOT_ACL_SHIFT 7 36062306a36Sopenharmony_ci#define ICM_TR_INFO_BOOT_ACL_MASK GENMASK(12, 7) 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistruct icm_tr_event_device_connected { 36362306a36Sopenharmony_ci struct icm_pkg_header hdr; 36462306a36Sopenharmony_ci uuid_t ep_uuid; 36562306a36Sopenharmony_ci u32 route_hi; 36662306a36Sopenharmony_ci u32 route_lo; 36762306a36Sopenharmony_ci u8 connection_id; 36862306a36Sopenharmony_ci u8 reserved; 36962306a36Sopenharmony_ci u16 link_info; 37062306a36Sopenharmony_ci u32 ep_name[55]; 37162306a36Sopenharmony_ci}; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_cistruct icm_tr_event_device_disconnected { 37462306a36Sopenharmony_ci struct icm_pkg_header hdr; 37562306a36Sopenharmony_ci u32 route_hi; 37662306a36Sopenharmony_ci u32 route_lo; 37762306a36Sopenharmony_ci}; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_cistruct icm_tr_event_xdomain_connected { 38062306a36Sopenharmony_ci struct icm_pkg_header hdr; 38162306a36Sopenharmony_ci u16 reserved; 38262306a36Sopenharmony_ci u16 link_info; 38362306a36Sopenharmony_ci uuid_t remote_uuid; 38462306a36Sopenharmony_ci uuid_t local_uuid; 38562306a36Sopenharmony_ci u32 local_route_hi; 38662306a36Sopenharmony_ci u32 local_route_lo; 38762306a36Sopenharmony_ci u32 remote_route_hi; 38862306a36Sopenharmony_ci u32 remote_route_lo; 38962306a36Sopenharmony_ci}; 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_cistruct icm_tr_event_xdomain_disconnected { 39262306a36Sopenharmony_ci struct icm_pkg_header hdr; 39362306a36Sopenharmony_ci u32 route_hi; 39462306a36Sopenharmony_ci u32 route_lo; 39562306a36Sopenharmony_ci uuid_t remote_uuid; 39662306a36Sopenharmony_ci}; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_cistruct icm_tr_pkg_approve_device { 39962306a36Sopenharmony_ci struct icm_pkg_header hdr; 40062306a36Sopenharmony_ci uuid_t ep_uuid; 40162306a36Sopenharmony_ci u32 route_hi; 40262306a36Sopenharmony_ci u32 route_lo; 40362306a36Sopenharmony_ci u8 connection_id; 40462306a36Sopenharmony_ci u8 reserved1[3]; 40562306a36Sopenharmony_ci}; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_cistruct icm_tr_pkg_add_device_key { 40862306a36Sopenharmony_ci struct icm_pkg_header hdr; 40962306a36Sopenharmony_ci uuid_t ep_uuid; 41062306a36Sopenharmony_ci u32 route_hi; 41162306a36Sopenharmony_ci u32 route_lo; 41262306a36Sopenharmony_ci u8 connection_id; 41362306a36Sopenharmony_ci u8 reserved[3]; 41462306a36Sopenharmony_ci u32 key[8]; 41562306a36Sopenharmony_ci}; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_cistruct icm_tr_pkg_challenge_device { 41862306a36Sopenharmony_ci struct icm_pkg_header hdr; 41962306a36Sopenharmony_ci uuid_t ep_uuid; 42062306a36Sopenharmony_ci u32 route_hi; 42162306a36Sopenharmony_ci u32 route_lo; 42262306a36Sopenharmony_ci u8 connection_id; 42362306a36Sopenharmony_ci u8 reserved[3]; 42462306a36Sopenharmony_ci u32 challenge[8]; 42562306a36Sopenharmony_ci}; 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_cistruct icm_tr_pkg_approve_xdomain { 42862306a36Sopenharmony_ci struct icm_pkg_header hdr; 42962306a36Sopenharmony_ci u32 route_hi; 43062306a36Sopenharmony_ci u32 route_lo; 43162306a36Sopenharmony_ci uuid_t remote_uuid; 43262306a36Sopenharmony_ci u16 transmit_path; 43362306a36Sopenharmony_ci u16 transmit_ring; 43462306a36Sopenharmony_ci u16 receive_path; 43562306a36Sopenharmony_ci u16 receive_ring; 43662306a36Sopenharmony_ci}; 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistruct icm_tr_pkg_disconnect_xdomain { 43962306a36Sopenharmony_ci struct icm_pkg_header hdr; 44062306a36Sopenharmony_ci u8 stage; 44162306a36Sopenharmony_ci u8 reserved[3]; 44262306a36Sopenharmony_ci u32 route_hi; 44362306a36Sopenharmony_ci u32 route_lo; 44462306a36Sopenharmony_ci uuid_t remote_uuid; 44562306a36Sopenharmony_ci}; 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_cistruct icm_tr_pkg_challenge_device_response { 44862306a36Sopenharmony_ci struct icm_pkg_header hdr; 44962306a36Sopenharmony_ci uuid_t ep_uuid; 45062306a36Sopenharmony_ci u32 route_hi; 45162306a36Sopenharmony_ci u32 route_lo; 45262306a36Sopenharmony_ci u8 connection_id; 45362306a36Sopenharmony_ci u8 reserved[3]; 45462306a36Sopenharmony_ci u32 challenge[8]; 45562306a36Sopenharmony_ci u32 response[8]; 45662306a36Sopenharmony_ci}; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_cistruct icm_tr_pkg_add_device_key_response { 45962306a36Sopenharmony_ci struct icm_pkg_header hdr; 46062306a36Sopenharmony_ci uuid_t ep_uuid; 46162306a36Sopenharmony_ci u32 route_hi; 46262306a36Sopenharmony_ci u32 route_lo; 46362306a36Sopenharmony_ci u8 connection_id; 46462306a36Sopenharmony_ci u8 reserved[3]; 46562306a36Sopenharmony_ci}; 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_cistruct icm_tr_pkg_approve_xdomain_response { 46862306a36Sopenharmony_ci struct icm_pkg_header hdr; 46962306a36Sopenharmony_ci u32 route_hi; 47062306a36Sopenharmony_ci u32 route_lo; 47162306a36Sopenharmony_ci uuid_t remote_uuid; 47262306a36Sopenharmony_ci u16 transmit_path; 47362306a36Sopenharmony_ci u16 transmit_ring; 47462306a36Sopenharmony_ci u16 receive_path; 47562306a36Sopenharmony_ci u16 receive_ring; 47662306a36Sopenharmony_ci}; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_cistruct icm_tr_pkg_disconnect_xdomain_response { 47962306a36Sopenharmony_ci struct icm_pkg_header hdr; 48062306a36Sopenharmony_ci u8 stage; 48162306a36Sopenharmony_ci u8 reserved[3]; 48262306a36Sopenharmony_ci u32 route_hi; 48362306a36Sopenharmony_ci u32 route_lo; 48462306a36Sopenharmony_ci uuid_t remote_uuid; 48562306a36Sopenharmony_ci}; 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci/* Ice Lake messages */ 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_cistruct icm_icl_event_rtd3_veto { 49062306a36Sopenharmony_ci struct icm_pkg_header hdr; 49162306a36Sopenharmony_ci u32 veto_reason; 49262306a36Sopenharmony_ci}; 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci/* USB4 ICM messages */ 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_cistruct icm_usb4_switch_op { 49762306a36Sopenharmony_ci struct icm_pkg_header hdr; 49862306a36Sopenharmony_ci u32 route_hi; 49962306a36Sopenharmony_ci u32 route_lo; 50062306a36Sopenharmony_ci u32 metadata; 50162306a36Sopenharmony_ci u16 opcode; 50262306a36Sopenharmony_ci u16 data_len_valid; 50362306a36Sopenharmony_ci u32 data[16]; 50462306a36Sopenharmony_ci}; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci#define ICM_USB4_SWITCH_DATA_LEN_MASK GENMASK(3, 0) 50762306a36Sopenharmony_ci#define ICM_USB4_SWITCH_DATA_VALID BIT(4) 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_cistruct icm_usb4_switch_op_response { 51062306a36Sopenharmony_ci struct icm_pkg_header hdr; 51162306a36Sopenharmony_ci u32 route_hi; 51262306a36Sopenharmony_ci u32 route_lo; 51362306a36Sopenharmony_ci u32 metadata; 51462306a36Sopenharmony_ci u16 opcode; 51562306a36Sopenharmony_ci u16 status; 51662306a36Sopenharmony_ci u32 data[16]; 51762306a36Sopenharmony_ci}; 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci/* XDomain messages */ 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_cistruct tb_xdomain_header { 52262306a36Sopenharmony_ci u32 route_hi; 52362306a36Sopenharmony_ci u32 route_lo; 52462306a36Sopenharmony_ci u32 length_sn; 52562306a36Sopenharmony_ci}; 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci#define TB_XDOMAIN_LENGTH_MASK GENMASK(5, 0) 52862306a36Sopenharmony_ci#define TB_XDOMAIN_SN_MASK GENMASK(28, 27) 52962306a36Sopenharmony_ci#define TB_XDOMAIN_SN_SHIFT 27 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cienum tb_xdp_type { 53262306a36Sopenharmony_ci UUID_REQUEST_OLD = 1, 53362306a36Sopenharmony_ci UUID_RESPONSE = 2, 53462306a36Sopenharmony_ci PROPERTIES_REQUEST, 53562306a36Sopenharmony_ci PROPERTIES_RESPONSE, 53662306a36Sopenharmony_ci PROPERTIES_CHANGED_REQUEST, 53762306a36Sopenharmony_ci PROPERTIES_CHANGED_RESPONSE, 53862306a36Sopenharmony_ci ERROR_RESPONSE, 53962306a36Sopenharmony_ci UUID_REQUEST = 12, 54062306a36Sopenharmony_ci LINK_STATE_STATUS_REQUEST = 15, 54162306a36Sopenharmony_ci LINK_STATE_STATUS_RESPONSE, 54262306a36Sopenharmony_ci LINK_STATE_CHANGE_REQUEST, 54362306a36Sopenharmony_ci LINK_STATE_CHANGE_RESPONSE, 54462306a36Sopenharmony_ci}; 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_cistruct tb_xdp_header { 54762306a36Sopenharmony_ci struct tb_xdomain_header xd_hdr; 54862306a36Sopenharmony_ci uuid_t uuid; 54962306a36Sopenharmony_ci u32 type; 55062306a36Sopenharmony_ci}; 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_cistruct tb_xdp_error_response { 55362306a36Sopenharmony_ci struct tb_xdp_header hdr; 55462306a36Sopenharmony_ci u32 error; 55562306a36Sopenharmony_ci}; 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_cistruct tb_xdp_link_state_status { 55862306a36Sopenharmony_ci struct tb_xdp_header hdr; 55962306a36Sopenharmony_ci}; 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_cistruct tb_xdp_link_state_status_response { 56262306a36Sopenharmony_ci union { 56362306a36Sopenharmony_ci struct tb_xdp_error_response err; 56462306a36Sopenharmony_ci struct { 56562306a36Sopenharmony_ci struct tb_xdp_header hdr; 56662306a36Sopenharmony_ci u32 status; 56762306a36Sopenharmony_ci u8 slw; 56862306a36Sopenharmony_ci u8 tlw; 56962306a36Sopenharmony_ci u8 sls; 57062306a36Sopenharmony_ci u8 tls; 57162306a36Sopenharmony_ci }; 57262306a36Sopenharmony_ci }; 57362306a36Sopenharmony_ci}; 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_cistruct tb_xdp_link_state_change { 57662306a36Sopenharmony_ci struct tb_xdp_header hdr; 57762306a36Sopenharmony_ci u8 tlw; 57862306a36Sopenharmony_ci u8 tls; 57962306a36Sopenharmony_ci u16 reserved; 58062306a36Sopenharmony_ci}; 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_cistruct tb_xdp_link_state_change_response { 58362306a36Sopenharmony_ci union { 58462306a36Sopenharmony_ci struct tb_xdp_error_response err; 58562306a36Sopenharmony_ci struct { 58662306a36Sopenharmony_ci struct tb_xdp_header hdr; 58762306a36Sopenharmony_ci u32 status; 58862306a36Sopenharmony_ci }; 58962306a36Sopenharmony_ci }; 59062306a36Sopenharmony_ci}; 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_cistruct tb_xdp_uuid { 59362306a36Sopenharmony_ci struct tb_xdp_header hdr; 59462306a36Sopenharmony_ci}; 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_cistruct tb_xdp_uuid_response { 59762306a36Sopenharmony_ci union { 59862306a36Sopenharmony_ci struct tb_xdp_error_response err; 59962306a36Sopenharmony_ci struct { 60062306a36Sopenharmony_ci struct tb_xdp_header hdr; 60162306a36Sopenharmony_ci uuid_t src_uuid; 60262306a36Sopenharmony_ci u32 src_route_hi; 60362306a36Sopenharmony_ci u32 src_route_lo; 60462306a36Sopenharmony_ci }; 60562306a36Sopenharmony_ci }; 60662306a36Sopenharmony_ci}; 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_cistruct tb_xdp_properties { 60962306a36Sopenharmony_ci struct tb_xdp_header hdr; 61062306a36Sopenharmony_ci uuid_t src_uuid; 61162306a36Sopenharmony_ci uuid_t dst_uuid; 61262306a36Sopenharmony_ci u16 offset; 61362306a36Sopenharmony_ci u16 reserved; 61462306a36Sopenharmony_ci}; 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_cistruct tb_xdp_properties_response { 61762306a36Sopenharmony_ci union { 61862306a36Sopenharmony_ci struct tb_xdp_error_response err; 61962306a36Sopenharmony_ci struct { 62062306a36Sopenharmony_ci struct tb_xdp_header hdr; 62162306a36Sopenharmony_ci uuid_t src_uuid; 62262306a36Sopenharmony_ci uuid_t dst_uuid; 62362306a36Sopenharmony_ci u16 offset; 62462306a36Sopenharmony_ci u16 data_length; 62562306a36Sopenharmony_ci u32 generation; 62662306a36Sopenharmony_ci u32 data[]; 62762306a36Sopenharmony_ci }; 62862306a36Sopenharmony_ci }; 62962306a36Sopenharmony_ci}; 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci/* 63262306a36Sopenharmony_ci * Max length of data array single XDomain property response is allowed 63362306a36Sopenharmony_ci * to carry. 63462306a36Sopenharmony_ci */ 63562306a36Sopenharmony_ci#define TB_XDP_PROPERTIES_MAX_DATA_LENGTH \ 63662306a36Sopenharmony_ci (((256 - 4 - sizeof(struct tb_xdp_properties_response))) / 4) 63762306a36Sopenharmony_ci 63862306a36Sopenharmony_ci/* Maximum size of the total property block in dwords we allow */ 63962306a36Sopenharmony_ci#define TB_XDP_PROPERTIES_MAX_LENGTH 500 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_cistruct tb_xdp_properties_changed { 64262306a36Sopenharmony_ci struct tb_xdp_header hdr; 64362306a36Sopenharmony_ci uuid_t src_uuid; 64462306a36Sopenharmony_ci}; 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_cistruct tb_xdp_properties_changed_response { 64762306a36Sopenharmony_ci union { 64862306a36Sopenharmony_ci struct tb_xdp_error_response err; 64962306a36Sopenharmony_ci struct tb_xdp_header hdr; 65062306a36Sopenharmony_ci }; 65162306a36Sopenharmony_ci}; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_cienum tb_xdp_error { 65462306a36Sopenharmony_ci ERROR_SUCCESS, 65562306a36Sopenharmony_ci ERROR_UNKNOWN_PACKET, 65662306a36Sopenharmony_ci ERROR_UNKNOWN_DOMAIN, 65762306a36Sopenharmony_ci ERROR_NOT_SUPPORTED, 65862306a36Sopenharmony_ci ERROR_NOT_READY, 65962306a36Sopenharmony_ci}; 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ci#endif 662