656 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Thunderbolt control channel messages4 *5 * Copyright (C) 2014 Andreas Noever <andreas.noever@gmail.com>6 * Copyright (C) 2017, Intel Corporation7 */8 9#ifndef _TB_MSGS10#define _TB_MSGS11 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 0x286#define TB_CFG_ERROR_PG_HOT_UNPLUG 0x387 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 3134#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 0xf153 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 14161 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 1178 179#define ICM_PORT_TYPE_MASK GENMASK(23, 0)180#define ICM_PORT_INDEX_SHIFT 24181#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 0x7193#define ICM_LINK_INFO_DEPTH_SHIFT 4194#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 7303#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 16326 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 4353#define ICM_TR_INFO_BOOT_ACL_SHIFT 7354#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 27524 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 allowed627 * 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 500634 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#endif656