Linux Audio

Check our new training course

Loading...
v6.8
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * Thunderbolt control channel messages
  4 *
  5 * Copyright (C) 2014 Andreas Noever <andreas.noever@gmail.com>
  6 * Copyright (C) 2017, Intel Corporation
  7 */
  8
  9#ifndef _TB_MSGS
 10#define _TB_MSGS
 11
 12#include <linux/types.h>
 13#include <linux/uuid.h>
 14
 15enum tb_cfg_space {
 16	TB_CFG_HOPS = 0,
 17	TB_CFG_PORT = 1,
 18	TB_CFG_SWITCH = 2,
 19	TB_CFG_COUNTERS = 3,
 20};
 21
 22enum tb_cfg_error {
 23	TB_CFG_ERROR_PORT_NOT_CONNECTED = 0,
 24	TB_CFG_ERROR_LINK_ERROR = 1,
 25	TB_CFG_ERROR_INVALID_CONFIG_SPACE = 2,
 26	TB_CFG_ERROR_NO_SUCH_PORT = 4,
 27	TB_CFG_ERROR_ACK_PLUG_EVENT = 7, /* send as reply to TB_CFG_PKG_EVENT */
 28	TB_CFG_ERROR_LOOP = 8,
 29	TB_CFG_ERROR_HEC_ERROR_DETECTED = 12,
 30	TB_CFG_ERROR_FLOW_CONTROL_ERROR = 13,
 31	TB_CFG_ERROR_LOCK = 15,
 32	TB_CFG_ERROR_DP_BW = 32,
 33	TB_CFG_ERROR_ROP_CMPLT = 33,
 34	TB_CFG_ERROR_POP_CMPLT = 34,
 35	TB_CFG_ERROR_PCIE_WAKE = 35,
 36	TB_CFG_ERROR_DP_CON_CHANGE = 36,
 37	TB_CFG_ERROR_DPTX_DISCOVERY = 37,
 38	TB_CFG_ERROR_LINK_RECOVERY = 38,
 39	TB_CFG_ERROR_ASYM_LINK = 39,
 40};
 41
 42/* common header */
 43struct tb_cfg_header {
 44	u32 route_hi:22;
 45	u32 unknown:10; /* highest order bit is set on replies */
 46	u32 route_lo;
 47} __packed;
 48
 49/* additional header for read/write packets */
 50struct tb_cfg_address {
 51	u32 offset:13; /* in dwords */
 52	u32 length:6; /* in dwords */
 53	u32 port:6;
 54	enum tb_cfg_space space:2;
 55	u32 seq:2; /* sequence number  */
 56	u32 zero:3;
 57} __packed;
 58
 59/* TB_CFG_PKG_READ, response for TB_CFG_PKG_WRITE */
 60struct cfg_read_pkg {
 61	struct tb_cfg_header header;
 62	struct tb_cfg_address addr;
 63} __packed;
 64
 65/* TB_CFG_PKG_WRITE, response for TB_CFG_PKG_READ */
 66struct cfg_write_pkg {
 67	struct tb_cfg_header header;
 68	struct tb_cfg_address addr;
 69	u32 data[64]; /* maximum size, tb_cfg_address.length has 6 bits */
 70} __packed;
 71
 72/* TB_CFG_PKG_ERROR */
 73struct cfg_error_pkg {
 74	struct tb_cfg_header header;
 75	enum tb_cfg_error error:8;
 
 76	u32 port:6;
 77	u32 reserved:16;
 
 78	u32 pg:2;
 79} __packed;
 80
 81struct cfg_ack_pkg {
 82	struct tb_cfg_header header;
 83};
 84
 85#define TB_CFG_ERROR_PG_HOT_PLUG	0x2
 86#define TB_CFG_ERROR_PG_HOT_UNPLUG	0x3
 87
 88/* TB_CFG_PKG_EVENT */
 89struct cfg_event_pkg {
 90	struct tb_cfg_header header;
 91	u32 port:6;
 92	u32 zero:25;
 93	bool unplug:1;
 94} __packed;
 95
 96/* TB_CFG_PKG_RESET */
 97struct cfg_reset_pkg {
 98	struct tb_cfg_header header;
 99} __packed;
100
101/* TB_CFG_PKG_PREPARE_TO_SLEEP */
102struct cfg_pts_pkg {
103	struct tb_cfg_header header;
104	u32 data;
105} __packed;
106
107/* ICM messages */
108
109enum icm_pkg_code {
110	ICM_GET_TOPOLOGY = 0x1,
111	ICM_DRIVER_READY = 0x3,
112	ICM_APPROVE_DEVICE = 0x4,
113	ICM_CHALLENGE_DEVICE = 0x5,
114	ICM_ADD_DEVICE_KEY = 0x6,
115	ICM_GET_ROUTE = 0xa,
116	ICM_APPROVE_XDOMAIN = 0x10,
117	ICM_DISCONNECT_XDOMAIN = 0x11,
118	ICM_PREBOOT_ACL = 0x18,
119	ICM_USB4_SWITCH_OP = 0x20,
120};
121
122enum icm_event_code {
123	ICM_EVENT_DEVICE_CONNECTED = 0x3,
124	ICM_EVENT_DEVICE_DISCONNECTED = 0x4,
125	ICM_EVENT_XDOMAIN_CONNECTED = 0x6,
126	ICM_EVENT_XDOMAIN_DISCONNECTED = 0x7,
127	ICM_EVENT_RTD3_VETO = 0xa,
128};
129
130struct icm_pkg_header {
131	u8 code;
132	u8 flags;
133	u8 packet_id;
134	u8 total_packets;
135};
136
137#define ICM_FLAGS_ERROR			BIT(0)
138#define ICM_FLAGS_NO_KEY		BIT(1)
139#define ICM_FLAGS_SLEVEL_SHIFT		3
140#define ICM_FLAGS_SLEVEL_MASK		GENMASK(4, 3)
141#define ICM_FLAGS_DUAL_LANE		BIT(5)
142#define ICM_FLAGS_SPEED_GEN3		BIT(7)
143#define ICM_FLAGS_WRITE			BIT(7)
144
145struct icm_pkg_driver_ready {
146	struct icm_pkg_header hdr;
147};
148
149/* Falcon Ridge only messages */
150
151struct icm_fr_pkg_driver_ready_response {
152	struct icm_pkg_header hdr;
153	u8 romver;
154	u8 ramver;
155	u16 security_level;
156};
157
158#define ICM_FR_SLEVEL_MASK		0xf
159
160/* Falcon Ridge & Alpine Ridge common messages */
161
162struct icm_fr_pkg_get_topology {
163	struct icm_pkg_header hdr;
164};
165
166#define ICM_GET_TOPOLOGY_PACKETS	14
167
168struct icm_fr_pkg_get_topology_response {
169	struct icm_pkg_header hdr;
170	u32 route_lo;
171	u32 route_hi;
172	u8 first_data;
173	u8 second_data;
174	u8 drom_i2c_address_index;
175	u8 switch_index;
176	u32 reserved[2];
177	u32 ports[16];
178	u32 port_hop_info[16];
179};
180
181#define ICM_SWITCH_USED			BIT(0)
182#define ICM_SWITCH_UPSTREAM_PORT_MASK	GENMASK(7, 1)
183#define ICM_SWITCH_UPSTREAM_PORT_SHIFT	1
184
185#define ICM_PORT_TYPE_MASK		GENMASK(23, 0)
186#define ICM_PORT_INDEX_SHIFT		24
187#define ICM_PORT_INDEX_MASK		GENMASK(31, 24)
188
189struct icm_fr_event_device_connected {
190	struct icm_pkg_header hdr;
191	uuid_t ep_uuid;
192	u8 connection_key;
193	u8 connection_id;
194	u16 link_info;
195	u32 ep_name[55];
196};
197
198#define ICM_LINK_INFO_LINK_MASK		0x7
199#define ICM_LINK_INFO_DEPTH_SHIFT	4
200#define ICM_LINK_INFO_DEPTH_MASK	GENMASK(7, 4)
201#define ICM_LINK_INFO_APPROVED		BIT(8)
202#define ICM_LINK_INFO_REJECTED		BIT(9)
203#define ICM_LINK_INFO_BOOT		BIT(10)
204
205struct icm_fr_pkg_approve_device {
206	struct icm_pkg_header hdr;
207	uuid_t ep_uuid;
208	u8 connection_key;
209	u8 connection_id;
210	u16 reserved;
211};
212
213struct icm_fr_event_device_disconnected {
214	struct icm_pkg_header hdr;
215	u16 reserved;
216	u16 link_info;
217};
218
219struct icm_fr_event_xdomain_connected {
220	struct icm_pkg_header hdr;
221	u16 reserved;
222	u16 link_info;
223	uuid_t remote_uuid;
224	uuid_t local_uuid;
225	u32 local_route_hi;
226	u32 local_route_lo;
227	u32 remote_route_hi;
228	u32 remote_route_lo;
229};
230
231struct icm_fr_event_xdomain_disconnected {
232	struct icm_pkg_header hdr;
233	u16 reserved;
234	u16 link_info;
235	uuid_t remote_uuid;
236};
237
238struct icm_fr_pkg_add_device_key {
239	struct icm_pkg_header hdr;
240	uuid_t ep_uuid;
241	u8 connection_key;
242	u8 connection_id;
243	u16 reserved;
244	u32 key[8];
245};
246
247struct icm_fr_pkg_add_device_key_response {
248	struct icm_pkg_header hdr;
249	uuid_t ep_uuid;
250	u8 connection_key;
251	u8 connection_id;
252	u16 reserved;
253};
254
255struct icm_fr_pkg_challenge_device {
256	struct icm_pkg_header hdr;
257	uuid_t ep_uuid;
258	u8 connection_key;
259	u8 connection_id;
260	u16 reserved;
261	u32 challenge[8];
262};
263
264struct icm_fr_pkg_challenge_device_response {
265	struct icm_pkg_header hdr;
266	uuid_t ep_uuid;
267	u8 connection_key;
268	u8 connection_id;
269	u16 reserved;
270	u32 challenge[8];
271	u32 response[8];
272};
273
274struct icm_fr_pkg_approve_xdomain {
275	struct icm_pkg_header hdr;
276	u16 reserved;
277	u16 link_info;
278	uuid_t remote_uuid;
279	u16 transmit_path;
280	u16 transmit_ring;
281	u16 receive_path;
282	u16 receive_ring;
283};
284
285struct icm_fr_pkg_approve_xdomain_response {
286	struct icm_pkg_header hdr;
287	u16 reserved;
288	u16 link_info;
289	uuid_t remote_uuid;
290	u16 transmit_path;
291	u16 transmit_ring;
292	u16 receive_path;
293	u16 receive_ring;
294};
295
296/* Alpine Ridge only messages */
297
298struct icm_ar_pkg_driver_ready_response {
299	struct icm_pkg_header hdr;
300	u8 romver;
301	u8 ramver;
302	u16 info;
303};
304
305#define ICM_AR_FLAGS_RTD3		BIT(6)
306
307#define ICM_AR_INFO_SLEVEL_MASK		GENMASK(3, 0)
308#define ICM_AR_INFO_BOOT_ACL_SHIFT	7
309#define ICM_AR_INFO_BOOT_ACL_MASK	GENMASK(11, 7)
310#define ICM_AR_INFO_BOOT_ACL_SUPPORTED	BIT(13)
311
312struct icm_ar_pkg_get_route {
313	struct icm_pkg_header hdr;
314	u16 reserved;
315	u16 link_info;
316};
317
318struct icm_ar_pkg_get_route_response {
319	struct icm_pkg_header hdr;
320	u16 reserved;
321	u16 link_info;
322	u32 route_hi;
323	u32 route_lo;
324};
325
326struct icm_ar_boot_acl_entry {
327	u32 uuid_lo;
328	u32 uuid_hi;
329};
330
331#define ICM_AR_PREBOOT_ACL_ENTRIES	16
332
333struct icm_ar_pkg_preboot_acl {
334	struct icm_pkg_header hdr;
335	struct icm_ar_boot_acl_entry acl[ICM_AR_PREBOOT_ACL_ENTRIES];
336};
337
338struct icm_ar_pkg_preboot_acl_response {
339	struct icm_pkg_header hdr;
340	struct icm_ar_boot_acl_entry acl[ICM_AR_PREBOOT_ACL_ENTRIES];
341};
342
343/* Titan Ridge messages */
344
345struct icm_tr_pkg_driver_ready_response {
346	struct icm_pkg_header hdr;
347	u16 reserved1;
348	u16 info;
349	u32 nvm_version;
350	u16 device_id;
351	u16 reserved2;
352};
353
354#define ICM_TR_FLAGS_RTD3		BIT(6)
355
356#define ICM_TR_INFO_SLEVEL_MASK		GENMASK(2, 0)
357#define ICM_TR_INFO_PROTO_VERSION_MASK	GENMASK(6, 4)
358#define ICM_TR_INFO_PROTO_VERSION_SHIFT	4
359#define ICM_TR_INFO_BOOT_ACL_SHIFT	7
360#define ICM_TR_INFO_BOOT_ACL_MASK	GENMASK(12, 7)
361
362struct icm_tr_event_device_connected {
363	struct icm_pkg_header hdr;
364	uuid_t ep_uuid;
365	u32 route_hi;
366	u32 route_lo;
367	u8 connection_id;
368	u8 reserved;
369	u16 link_info;
370	u32 ep_name[55];
371};
372
373struct icm_tr_event_device_disconnected {
374	struct icm_pkg_header hdr;
375	u32 route_hi;
376	u32 route_lo;
377};
378
379struct icm_tr_event_xdomain_connected {
380	struct icm_pkg_header hdr;
381	u16 reserved;
382	u16 link_info;
383	uuid_t remote_uuid;
384	uuid_t local_uuid;
385	u32 local_route_hi;
386	u32 local_route_lo;
387	u32 remote_route_hi;
388	u32 remote_route_lo;
389};
390
391struct icm_tr_event_xdomain_disconnected {
392	struct icm_pkg_header hdr;
393	u32 route_hi;
394	u32 route_lo;
395	uuid_t remote_uuid;
396};
397
398struct icm_tr_pkg_approve_device {
399	struct icm_pkg_header hdr;
400	uuid_t ep_uuid;
401	u32 route_hi;
402	u32 route_lo;
403	u8 connection_id;
404	u8 reserved1[3];
405};
406
407struct icm_tr_pkg_add_device_key {
408	struct icm_pkg_header hdr;
409	uuid_t ep_uuid;
410	u32 route_hi;
411	u32 route_lo;
412	u8 connection_id;
413	u8 reserved[3];
414	u32 key[8];
415};
416
417struct icm_tr_pkg_challenge_device {
418	struct icm_pkg_header hdr;
419	uuid_t ep_uuid;
420	u32 route_hi;
421	u32 route_lo;
422	u8 connection_id;
423	u8 reserved[3];
424	u32 challenge[8];
425};
426
427struct icm_tr_pkg_approve_xdomain {
428	struct icm_pkg_header hdr;
429	u32 route_hi;
430	u32 route_lo;
431	uuid_t remote_uuid;
432	u16 transmit_path;
433	u16 transmit_ring;
434	u16 receive_path;
435	u16 receive_ring;
436};
437
438struct icm_tr_pkg_disconnect_xdomain {
439	struct icm_pkg_header hdr;
440	u8 stage;
441	u8 reserved[3];
442	u32 route_hi;
443	u32 route_lo;
444	uuid_t remote_uuid;
445};
446
447struct icm_tr_pkg_challenge_device_response {
448	struct icm_pkg_header hdr;
449	uuid_t ep_uuid;
450	u32 route_hi;
451	u32 route_lo;
452	u8 connection_id;
453	u8 reserved[3];
454	u32 challenge[8];
455	u32 response[8];
456};
457
458struct icm_tr_pkg_add_device_key_response {
459	struct icm_pkg_header hdr;
460	uuid_t ep_uuid;
461	u32 route_hi;
462	u32 route_lo;
463	u8 connection_id;
464	u8 reserved[3];
465};
466
467struct icm_tr_pkg_approve_xdomain_response {
468	struct icm_pkg_header hdr;
469	u32 route_hi;
470	u32 route_lo;
471	uuid_t remote_uuid;
472	u16 transmit_path;
473	u16 transmit_ring;
474	u16 receive_path;
475	u16 receive_ring;
476};
477
478struct icm_tr_pkg_disconnect_xdomain_response {
479	struct icm_pkg_header hdr;
480	u8 stage;
481	u8 reserved[3];
482	u32 route_hi;
483	u32 route_lo;
484	uuid_t remote_uuid;
485};
486
487/* Ice Lake messages */
488
489struct icm_icl_event_rtd3_veto {
490	struct icm_pkg_header hdr;
491	u32 veto_reason;
492};
493
494/* USB4 ICM messages */
495
496struct icm_usb4_switch_op {
497	struct icm_pkg_header hdr;
498	u32 route_hi;
499	u32 route_lo;
500	u32 metadata;
501	u16 opcode;
502	u16 data_len_valid;
503	u32 data[16];
504};
505
506#define ICM_USB4_SWITCH_DATA_LEN_MASK	GENMASK(3, 0)
507#define ICM_USB4_SWITCH_DATA_VALID	BIT(4)
508
509struct icm_usb4_switch_op_response {
510	struct icm_pkg_header hdr;
511	u32 route_hi;
512	u32 route_lo;
513	u32 metadata;
514	u16 opcode;
515	u16 status;
516	u32 data[16];
517};
518
519/* XDomain messages */
520
521struct tb_xdomain_header {
522	u32 route_hi;
523	u32 route_lo;
524	u32 length_sn;
525};
526
527#define TB_XDOMAIN_LENGTH_MASK	GENMASK(5, 0)
528#define TB_XDOMAIN_SN_MASK	GENMASK(28, 27)
529#define TB_XDOMAIN_SN_SHIFT	27
530
531enum tb_xdp_type {
532	UUID_REQUEST_OLD = 1,
533	UUID_RESPONSE = 2,
534	PROPERTIES_REQUEST,
535	PROPERTIES_RESPONSE,
536	PROPERTIES_CHANGED_REQUEST,
537	PROPERTIES_CHANGED_RESPONSE,
538	ERROR_RESPONSE,
539	UUID_REQUEST = 12,
540	LINK_STATE_STATUS_REQUEST = 15,
541	LINK_STATE_STATUS_RESPONSE,
542	LINK_STATE_CHANGE_REQUEST,
543	LINK_STATE_CHANGE_RESPONSE,
544};
545
546struct tb_xdp_header {
547	struct tb_xdomain_header xd_hdr;
548	uuid_t uuid;
549	u32 type;
550};
551
552struct tb_xdp_error_response {
553	struct tb_xdp_header hdr;
554	u32 error;
555};
556
557struct tb_xdp_link_state_status {
558	struct tb_xdp_header hdr;
559};
560
561struct tb_xdp_link_state_status_response {
562	union {
563		struct tb_xdp_error_response err;
564		struct {
565			struct tb_xdp_header hdr;
566			u32 status;
567			u8 slw;
568			u8 tlw;
569			u8 sls;
570			u8 tls;
571		};
572	};
573};
574
575struct tb_xdp_link_state_change {
576	struct tb_xdp_header hdr;
577	u8 tlw;
578	u8 tls;
579	u16 reserved;
580};
581
582struct tb_xdp_link_state_change_response {
583	union {
584		struct tb_xdp_error_response err;
585		struct {
586			struct tb_xdp_header hdr;
587			u32 status;
588		};
589	};
590};
591
592struct tb_xdp_uuid {
593	struct tb_xdp_header hdr;
594};
595
596struct tb_xdp_uuid_response {
597	union {
598		struct tb_xdp_error_response err;
599		struct {
600			struct tb_xdp_header hdr;
601			uuid_t src_uuid;
602			u32 src_route_hi;
603			u32 src_route_lo;
604		};
605	};
606};
607
608struct tb_xdp_properties {
609	struct tb_xdp_header hdr;
610	uuid_t src_uuid;
611	uuid_t dst_uuid;
612	u16 offset;
613	u16 reserved;
614};
615
616struct tb_xdp_properties_response {
617	union {
618		struct tb_xdp_error_response err;
619		struct {
620			struct tb_xdp_header hdr;
621			uuid_t src_uuid;
622			uuid_t dst_uuid;
623			u16 offset;
624			u16 data_length;
625			u32 generation;
626			u32 data[];
627		};
628	};
629};
630
631/*
632 * Max length of data array single XDomain property response is allowed
633 * to carry.
634 */
635#define TB_XDP_PROPERTIES_MAX_DATA_LENGTH	\
636	(((256 - 4 - sizeof(struct tb_xdp_properties_response))) / 4)
637
638/* Maximum size of the total property block in dwords we allow */
639#define TB_XDP_PROPERTIES_MAX_LENGTH		500
640
641struct tb_xdp_properties_changed {
642	struct tb_xdp_header hdr;
643	uuid_t src_uuid;
644};
645
646struct tb_xdp_properties_changed_response {
647	union {
648		struct tb_xdp_error_response err;
649		struct tb_xdp_header hdr;
650	};
651};
652
653enum tb_xdp_error {
654	ERROR_SUCCESS,
655	ERROR_UNKNOWN_PACKET,
656	ERROR_UNKNOWN_DOMAIN,
657	ERROR_NOT_SUPPORTED,
658	ERROR_NOT_READY,
659};
660
661#endif
v6.2
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * Thunderbolt control channel messages
  4 *
  5 * Copyright (C) 2014 Andreas Noever <andreas.noever@gmail.com>
  6 * Copyright (C) 2017, Intel Corporation
  7 */
  8
  9#ifndef _TB_MSGS
 10#define _TB_MSGS
 11
 12#include <linux/types.h>
 13#include <linux/uuid.h>
 14
 15enum tb_cfg_space {
 16	TB_CFG_HOPS = 0,
 17	TB_CFG_PORT = 1,
 18	TB_CFG_SWITCH = 2,
 19	TB_CFG_COUNTERS = 3,
 20};
 21
 22enum tb_cfg_error {
 23	TB_CFG_ERROR_PORT_NOT_CONNECTED = 0,
 24	TB_CFG_ERROR_LINK_ERROR = 1,
 25	TB_CFG_ERROR_INVALID_CONFIG_SPACE = 2,
 26	TB_CFG_ERROR_NO_SUCH_PORT = 4,
 27	TB_CFG_ERROR_ACK_PLUG_EVENT = 7, /* send as reply to TB_CFG_PKG_EVENT */
 28	TB_CFG_ERROR_LOOP = 8,
 29	TB_CFG_ERROR_HEC_ERROR_DETECTED = 12,
 30	TB_CFG_ERROR_FLOW_CONTROL_ERROR = 13,
 31	TB_CFG_ERROR_LOCK = 15,
 
 
 
 
 
 
 
 
 32};
 33
 34/* common header */
 35struct tb_cfg_header {
 36	u32 route_hi:22;
 37	u32 unknown:10; /* highest order bit is set on replies */
 38	u32 route_lo;
 39} __packed;
 40
 41/* additional header for read/write packets */
 42struct tb_cfg_address {
 43	u32 offset:13; /* in dwords */
 44	u32 length:6; /* in dwords */
 45	u32 port:6;
 46	enum tb_cfg_space space:2;
 47	u32 seq:2; /* sequence number  */
 48	u32 zero:3;
 49} __packed;
 50
 51/* TB_CFG_PKG_READ, response for TB_CFG_PKG_WRITE */
 52struct cfg_read_pkg {
 53	struct tb_cfg_header header;
 54	struct tb_cfg_address addr;
 55} __packed;
 56
 57/* TB_CFG_PKG_WRITE, response for TB_CFG_PKG_READ */
 58struct cfg_write_pkg {
 59	struct tb_cfg_header header;
 60	struct tb_cfg_address addr;
 61	u32 data[64]; /* maximum size, tb_cfg_address.length has 6 bits */
 62} __packed;
 63
 64/* TB_CFG_PKG_ERROR */
 65struct cfg_error_pkg {
 66	struct tb_cfg_header header;
 67	enum tb_cfg_error error:4;
 68	u32 zero1:4;
 69	u32 port:6;
 70	u32 zero2:2; /* Both should be zero, still they are different fields. */
 71	u32 zero3:14;
 72	u32 pg:2;
 73} __packed;
 
 
 
 
 74
 75#define TB_CFG_ERROR_PG_HOT_PLUG	0x2
 76#define TB_CFG_ERROR_PG_HOT_UNPLUG	0x3
 77
 78/* TB_CFG_PKG_EVENT */
 79struct cfg_event_pkg {
 80	struct tb_cfg_header header;
 81	u32 port:6;
 82	u32 zero:25;
 83	bool unplug:1;
 84} __packed;
 85
 86/* TB_CFG_PKG_RESET */
 87struct cfg_reset_pkg {
 88	struct tb_cfg_header header;
 89} __packed;
 90
 91/* TB_CFG_PKG_PREPARE_TO_SLEEP */
 92struct cfg_pts_pkg {
 93	struct tb_cfg_header header;
 94	u32 data;
 95} __packed;
 96
 97/* ICM messages */
 98
 99enum icm_pkg_code {
100	ICM_GET_TOPOLOGY = 0x1,
101	ICM_DRIVER_READY = 0x3,
102	ICM_APPROVE_DEVICE = 0x4,
103	ICM_CHALLENGE_DEVICE = 0x5,
104	ICM_ADD_DEVICE_KEY = 0x6,
105	ICM_GET_ROUTE = 0xa,
106	ICM_APPROVE_XDOMAIN = 0x10,
107	ICM_DISCONNECT_XDOMAIN = 0x11,
108	ICM_PREBOOT_ACL = 0x18,
109	ICM_USB4_SWITCH_OP = 0x20,
110};
111
112enum icm_event_code {
113	ICM_EVENT_DEVICE_CONNECTED = 0x3,
114	ICM_EVENT_DEVICE_DISCONNECTED = 0x4,
115	ICM_EVENT_XDOMAIN_CONNECTED = 0x6,
116	ICM_EVENT_XDOMAIN_DISCONNECTED = 0x7,
117	ICM_EVENT_RTD3_VETO = 0xa,
118};
119
120struct icm_pkg_header {
121	u8 code;
122	u8 flags;
123	u8 packet_id;
124	u8 total_packets;
125};
126
127#define ICM_FLAGS_ERROR			BIT(0)
128#define ICM_FLAGS_NO_KEY		BIT(1)
129#define ICM_FLAGS_SLEVEL_SHIFT		3
130#define ICM_FLAGS_SLEVEL_MASK		GENMASK(4, 3)
131#define ICM_FLAGS_DUAL_LANE		BIT(5)
132#define ICM_FLAGS_SPEED_GEN3		BIT(7)
133#define ICM_FLAGS_WRITE			BIT(7)
134
135struct icm_pkg_driver_ready {
136	struct icm_pkg_header hdr;
137};
138
139/* Falcon Ridge only messages */
140
141struct icm_fr_pkg_driver_ready_response {
142	struct icm_pkg_header hdr;
143	u8 romver;
144	u8 ramver;
145	u16 security_level;
146};
147
148#define ICM_FR_SLEVEL_MASK		0xf
149
150/* Falcon Ridge & Alpine Ridge common messages */
151
152struct icm_fr_pkg_get_topology {
153	struct icm_pkg_header hdr;
154};
155
156#define ICM_GET_TOPOLOGY_PACKETS	14
157
158struct icm_fr_pkg_get_topology_response {
159	struct icm_pkg_header hdr;
160	u32 route_lo;
161	u32 route_hi;
162	u8 first_data;
163	u8 second_data;
164	u8 drom_i2c_address_index;
165	u8 switch_index;
166	u32 reserved[2];
167	u32 ports[16];
168	u32 port_hop_info[16];
169};
170
171#define ICM_SWITCH_USED			BIT(0)
172#define ICM_SWITCH_UPSTREAM_PORT_MASK	GENMASK(7, 1)
173#define ICM_SWITCH_UPSTREAM_PORT_SHIFT	1
174
175#define ICM_PORT_TYPE_MASK		GENMASK(23, 0)
176#define ICM_PORT_INDEX_SHIFT		24
177#define ICM_PORT_INDEX_MASK		GENMASK(31, 24)
178
179struct icm_fr_event_device_connected {
180	struct icm_pkg_header hdr;
181	uuid_t ep_uuid;
182	u8 connection_key;
183	u8 connection_id;
184	u16 link_info;
185	u32 ep_name[55];
186};
187
188#define ICM_LINK_INFO_LINK_MASK		0x7
189#define ICM_LINK_INFO_DEPTH_SHIFT	4
190#define ICM_LINK_INFO_DEPTH_MASK	GENMASK(7, 4)
191#define ICM_LINK_INFO_APPROVED		BIT(8)
192#define ICM_LINK_INFO_REJECTED		BIT(9)
193#define ICM_LINK_INFO_BOOT		BIT(10)
194
195struct icm_fr_pkg_approve_device {
196	struct icm_pkg_header hdr;
197	uuid_t ep_uuid;
198	u8 connection_key;
199	u8 connection_id;
200	u16 reserved;
201};
202
203struct icm_fr_event_device_disconnected {
204	struct icm_pkg_header hdr;
205	u16 reserved;
206	u16 link_info;
207};
208
209struct icm_fr_event_xdomain_connected {
210	struct icm_pkg_header hdr;
211	u16 reserved;
212	u16 link_info;
213	uuid_t remote_uuid;
214	uuid_t local_uuid;
215	u32 local_route_hi;
216	u32 local_route_lo;
217	u32 remote_route_hi;
218	u32 remote_route_lo;
219};
220
221struct icm_fr_event_xdomain_disconnected {
222	struct icm_pkg_header hdr;
223	u16 reserved;
224	u16 link_info;
225	uuid_t remote_uuid;
226};
227
228struct icm_fr_pkg_add_device_key {
229	struct icm_pkg_header hdr;
230	uuid_t ep_uuid;
231	u8 connection_key;
232	u8 connection_id;
233	u16 reserved;
234	u32 key[8];
235};
236
237struct icm_fr_pkg_add_device_key_response {
238	struct icm_pkg_header hdr;
239	uuid_t ep_uuid;
240	u8 connection_key;
241	u8 connection_id;
242	u16 reserved;
243};
244
245struct icm_fr_pkg_challenge_device {
246	struct icm_pkg_header hdr;
247	uuid_t ep_uuid;
248	u8 connection_key;
249	u8 connection_id;
250	u16 reserved;
251	u32 challenge[8];
252};
253
254struct icm_fr_pkg_challenge_device_response {
255	struct icm_pkg_header hdr;
256	uuid_t ep_uuid;
257	u8 connection_key;
258	u8 connection_id;
259	u16 reserved;
260	u32 challenge[8];
261	u32 response[8];
262};
263
264struct icm_fr_pkg_approve_xdomain {
265	struct icm_pkg_header hdr;
266	u16 reserved;
267	u16 link_info;
268	uuid_t remote_uuid;
269	u16 transmit_path;
270	u16 transmit_ring;
271	u16 receive_path;
272	u16 receive_ring;
273};
274
275struct icm_fr_pkg_approve_xdomain_response {
276	struct icm_pkg_header hdr;
277	u16 reserved;
278	u16 link_info;
279	uuid_t remote_uuid;
280	u16 transmit_path;
281	u16 transmit_ring;
282	u16 receive_path;
283	u16 receive_ring;
284};
285
286/* Alpine Ridge only messages */
287
288struct icm_ar_pkg_driver_ready_response {
289	struct icm_pkg_header hdr;
290	u8 romver;
291	u8 ramver;
292	u16 info;
293};
294
295#define ICM_AR_FLAGS_RTD3		BIT(6)
296
297#define ICM_AR_INFO_SLEVEL_MASK		GENMASK(3, 0)
298#define ICM_AR_INFO_BOOT_ACL_SHIFT	7
299#define ICM_AR_INFO_BOOT_ACL_MASK	GENMASK(11, 7)
300#define ICM_AR_INFO_BOOT_ACL_SUPPORTED	BIT(13)
301
302struct icm_ar_pkg_get_route {
303	struct icm_pkg_header hdr;
304	u16 reserved;
305	u16 link_info;
306};
307
308struct icm_ar_pkg_get_route_response {
309	struct icm_pkg_header hdr;
310	u16 reserved;
311	u16 link_info;
312	u32 route_hi;
313	u32 route_lo;
314};
315
316struct icm_ar_boot_acl_entry {
317	u32 uuid_lo;
318	u32 uuid_hi;
319};
320
321#define ICM_AR_PREBOOT_ACL_ENTRIES	16
322
323struct icm_ar_pkg_preboot_acl {
324	struct icm_pkg_header hdr;
325	struct icm_ar_boot_acl_entry acl[ICM_AR_PREBOOT_ACL_ENTRIES];
326};
327
328struct icm_ar_pkg_preboot_acl_response {
329	struct icm_pkg_header hdr;
330	struct icm_ar_boot_acl_entry acl[ICM_AR_PREBOOT_ACL_ENTRIES];
331};
332
333/* Titan Ridge messages */
334
335struct icm_tr_pkg_driver_ready_response {
336	struct icm_pkg_header hdr;
337	u16 reserved1;
338	u16 info;
339	u32 nvm_version;
340	u16 device_id;
341	u16 reserved2;
342};
343
344#define ICM_TR_FLAGS_RTD3		BIT(6)
345
346#define ICM_TR_INFO_SLEVEL_MASK		GENMASK(2, 0)
347#define ICM_TR_INFO_PROTO_VERSION_MASK	GENMASK(6, 4)
348#define ICM_TR_INFO_PROTO_VERSION_SHIFT	4
349#define ICM_TR_INFO_BOOT_ACL_SHIFT	7
350#define ICM_TR_INFO_BOOT_ACL_MASK	GENMASK(12, 7)
351
352struct icm_tr_event_device_connected {
353	struct icm_pkg_header hdr;
354	uuid_t ep_uuid;
355	u32 route_hi;
356	u32 route_lo;
357	u8 connection_id;
358	u8 reserved;
359	u16 link_info;
360	u32 ep_name[55];
361};
362
363struct icm_tr_event_device_disconnected {
364	struct icm_pkg_header hdr;
365	u32 route_hi;
366	u32 route_lo;
367};
368
369struct icm_tr_event_xdomain_connected {
370	struct icm_pkg_header hdr;
371	u16 reserved;
372	u16 link_info;
373	uuid_t remote_uuid;
374	uuid_t local_uuid;
375	u32 local_route_hi;
376	u32 local_route_lo;
377	u32 remote_route_hi;
378	u32 remote_route_lo;
379};
380
381struct icm_tr_event_xdomain_disconnected {
382	struct icm_pkg_header hdr;
383	u32 route_hi;
384	u32 route_lo;
385	uuid_t remote_uuid;
386};
387
388struct icm_tr_pkg_approve_device {
389	struct icm_pkg_header hdr;
390	uuid_t ep_uuid;
391	u32 route_hi;
392	u32 route_lo;
393	u8 connection_id;
394	u8 reserved1[3];
395};
396
397struct icm_tr_pkg_add_device_key {
398	struct icm_pkg_header hdr;
399	uuid_t ep_uuid;
400	u32 route_hi;
401	u32 route_lo;
402	u8 connection_id;
403	u8 reserved[3];
404	u32 key[8];
405};
406
407struct icm_tr_pkg_challenge_device {
408	struct icm_pkg_header hdr;
409	uuid_t ep_uuid;
410	u32 route_hi;
411	u32 route_lo;
412	u8 connection_id;
413	u8 reserved[3];
414	u32 challenge[8];
415};
416
417struct icm_tr_pkg_approve_xdomain {
418	struct icm_pkg_header hdr;
419	u32 route_hi;
420	u32 route_lo;
421	uuid_t remote_uuid;
422	u16 transmit_path;
423	u16 transmit_ring;
424	u16 receive_path;
425	u16 receive_ring;
426};
427
428struct icm_tr_pkg_disconnect_xdomain {
429	struct icm_pkg_header hdr;
430	u8 stage;
431	u8 reserved[3];
432	u32 route_hi;
433	u32 route_lo;
434	uuid_t remote_uuid;
435};
436
437struct icm_tr_pkg_challenge_device_response {
438	struct icm_pkg_header hdr;
439	uuid_t ep_uuid;
440	u32 route_hi;
441	u32 route_lo;
442	u8 connection_id;
443	u8 reserved[3];
444	u32 challenge[8];
445	u32 response[8];
446};
447
448struct icm_tr_pkg_add_device_key_response {
449	struct icm_pkg_header hdr;
450	uuid_t ep_uuid;
451	u32 route_hi;
452	u32 route_lo;
453	u8 connection_id;
454	u8 reserved[3];
455};
456
457struct icm_tr_pkg_approve_xdomain_response {
458	struct icm_pkg_header hdr;
459	u32 route_hi;
460	u32 route_lo;
461	uuid_t remote_uuid;
462	u16 transmit_path;
463	u16 transmit_ring;
464	u16 receive_path;
465	u16 receive_ring;
466};
467
468struct icm_tr_pkg_disconnect_xdomain_response {
469	struct icm_pkg_header hdr;
470	u8 stage;
471	u8 reserved[3];
472	u32 route_hi;
473	u32 route_lo;
474	uuid_t remote_uuid;
475};
476
477/* Ice Lake messages */
478
479struct icm_icl_event_rtd3_veto {
480	struct icm_pkg_header hdr;
481	u32 veto_reason;
482};
483
484/* USB4 ICM messages */
485
486struct icm_usb4_switch_op {
487	struct icm_pkg_header hdr;
488	u32 route_hi;
489	u32 route_lo;
490	u32 metadata;
491	u16 opcode;
492	u16 data_len_valid;
493	u32 data[16];
494};
495
496#define ICM_USB4_SWITCH_DATA_LEN_MASK	GENMASK(3, 0)
497#define ICM_USB4_SWITCH_DATA_VALID	BIT(4)
498
499struct icm_usb4_switch_op_response {
500	struct icm_pkg_header hdr;
501	u32 route_hi;
502	u32 route_lo;
503	u32 metadata;
504	u16 opcode;
505	u16 status;
506	u32 data[16];
507};
508
509/* XDomain messages */
510
511struct tb_xdomain_header {
512	u32 route_hi;
513	u32 route_lo;
514	u32 length_sn;
515};
516
517#define TB_XDOMAIN_LENGTH_MASK	GENMASK(5, 0)
518#define TB_XDOMAIN_SN_MASK	GENMASK(28, 27)
519#define TB_XDOMAIN_SN_SHIFT	27
520
521enum tb_xdp_type {
522	UUID_REQUEST_OLD = 1,
523	UUID_RESPONSE = 2,
524	PROPERTIES_REQUEST,
525	PROPERTIES_RESPONSE,
526	PROPERTIES_CHANGED_REQUEST,
527	PROPERTIES_CHANGED_RESPONSE,
528	ERROR_RESPONSE,
529	UUID_REQUEST = 12,
530	LINK_STATE_STATUS_REQUEST = 15,
531	LINK_STATE_STATUS_RESPONSE,
532	LINK_STATE_CHANGE_REQUEST,
533	LINK_STATE_CHANGE_RESPONSE,
534};
535
536struct tb_xdp_header {
537	struct tb_xdomain_header xd_hdr;
538	uuid_t uuid;
539	u32 type;
540};
541
542struct tb_xdp_error_response {
543	struct tb_xdp_header hdr;
544	u32 error;
545};
546
547struct tb_xdp_link_state_status {
548	struct tb_xdp_header hdr;
549};
550
551struct tb_xdp_link_state_status_response {
552	union {
553		struct tb_xdp_error_response err;
554		struct {
555			struct tb_xdp_header hdr;
556			u32 status;
557			u8 slw;
558			u8 tlw;
559			u8 sls;
560			u8 tls;
561		};
562	};
563};
564
565struct tb_xdp_link_state_change {
566	struct tb_xdp_header hdr;
567	u8 tlw;
568	u8 tls;
569	u16 reserved;
570};
571
572struct tb_xdp_link_state_change_response {
573	union {
574		struct tb_xdp_error_response err;
575		struct {
576			struct tb_xdp_header hdr;
577			u32 status;
578		};
579	};
580};
581
582struct tb_xdp_uuid {
583	struct tb_xdp_header hdr;
584};
585
586struct tb_xdp_uuid_response {
587	union {
588		struct tb_xdp_error_response err;
589		struct {
590			struct tb_xdp_header hdr;
591			uuid_t src_uuid;
592			u32 src_route_hi;
593			u32 src_route_lo;
594		};
595	};
596};
597
598struct tb_xdp_properties {
599	struct tb_xdp_header hdr;
600	uuid_t src_uuid;
601	uuid_t dst_uuid;
602	u16 offset;
603	u16 reserved;
604};
605
606struct tb_xdp_properties_response {
607	union {
608		struct tb_xdp_error_response err;
609		struct {
610			struct tb_xdp_header hdr;
611			uuid_t src_uuid;
612			uuid_t dst_uuid;
613			u16 offset;
614			u16 data_length;
615			u32 generation;
616			u32 data[];
617		};
618	};
619};
620
621/*
622 * Max length of data array single XDomain property response is allowed
623 * to carry.
624 */
625#define TB_XDP_PROPERTIES_MAX_DATA_LENGTH	\
626	(((256 - 4 - sizeof(struct tb_xdp_properties_response))) / 4)
627
628/* Maximum size of the total property block in dwords we allow */
629#define TB_XDP_PROPERTIES_MAX_LENGTH		500
630
631struct tb_xdp_properties_changed {
632	struct tb_xdp_header hdr;
633	uuid_t src_uuid;
634};
635
636struct tb_xdp_properties_changed_response {
637	union {
638		struct tb_xdp_error_response err;
639		struct tb_xdp_header hdr;
640	};
641};
642
643enum tb_xdp_error {
644	ERROR_SUCCESS,
645	ERROR_UNKNOWN_PACKET,
646	ERROR_UNKNOWN_DOMAIN,
647	ERROR_NOT_SUPPORTED,
648	ERROR_NOT_READY,
649};
650
651#endif