xref: /openbmc/linux/drivers/thunderbolt/tb_msgs.h (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
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