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 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 */ 43 struct 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 */ 50 struct 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 */ 60 struct 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 */ 66 struct 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 */ 73 struct 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 81 struct 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 */ 89 struct 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 */ 97 struct cfg_reset_pkg { 98 struct tb_cfg_header header; 99 } __packed; 100 101 /* ICM messages */ 102 103 enum 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 116 enum 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 124 struct 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 139 struct icm_pkg_driver_ready { 140 struct icm_pkg_header hdr; 141 }; 142 143 /* Falcon Ridge only messages */ 144 145 struct 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 156 struct icm_fr_pkg_get_topology { 157 struct icm_pkg_header hdr; 158 }; 159 160 #define ICM_GET_TOPOLOGY_PACKETS 14 161 162 struct 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 183 struct 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 199 struct 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 207 struct icm_fr_event_device_disconnected { 208 struct icm_pkg_header hdr; 209 u16 reserved; 210 u16 link_info; 211 }; 212 213 struct 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 225 struct 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 232 struct 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 241 struct 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 249 struct 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 258 struct 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 268 struct 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 279 struct 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 292 struct 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 306 struct icm_ar_pkg_get_route { 307 struct icm_pkg_header hdr; 308 u16 reserved; 309 u16 link_info; 310 }; 311 312 struct 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 320 struct icm_ar_boot_acl_entry { 321 u32 uuid_lo; 322 u32 uuid_hi; 323 }; 324 325 #define ICM_AR_PREBOOT_ACL_ENTRIES 16 326 327 struct 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 332 struct 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 339 struct 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 356 struct 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 367 struct icm_tr_event_device_disconnected { 368 struct icm_pkg_header hdr; 369 u32 route_hi; 370 u32 route_lo; 371 }; 372 373 struct 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 385 struct 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 392 struct 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 401 struct 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 411 struct 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 421 struct 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 432 struct 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 441 struct 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 452 struct 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 461 struct 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 472 struct 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 483 struct icm_icl_event_rtd3_veto { 484 struct icm_pkg_header hdr; 485 u32 veto_reason; 486 }; 487 488 /* USB4 ICM messages */ 489 490 struct 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 503 struct 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 515 struct 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 525 enum 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 540 struct tb_xdp_header { 541 struct tb_xdomain_header xd_hdr; 542 uuid_t uuid; 543 u32 type; 544 }; 545 546 struct tb_xdp_error_response { 547 struct tb_xdp_header hdr; 548 u32 error; 549 }; 550 551 struct tb_xdp_link_state_status { 552 struct tb_xdp_header hdr; 553 }; 554 555 struct 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 569 struct tb_xdp_link_state_change { 570 struct tb_xdp_header hdr; 571 u8 tlw; 572 u8 tls; 573 u16 reserved; 574 }; 575 576 struct 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 586 struct tb_xdp_uuid { 587 struct tb_xdp_header hdr; 588 }; 589 590 struct 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 602 struct 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 610 struct 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 635 struct tb_xdp_properties_changed { 636 struct tb_xdp_header hdr; 637 uuid_t src_uuid; 638 }; 639 640 struct tb_xdp_properties_changed_response { 641 union { 642 struct tb_xdp_error_response err; 643 struct tb_xdp_header hdr; 644 }; 645 }; 646 647 enum 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 656