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