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