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