brintos

brintos / linux-shallow public Read only

0
0
Text · 12.4 KiB · a1670a9 Raw
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