1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Thunderbolt driver - bus logic (NHI independent) 4 * 5 * Copyright (c) 2014 Andreas Noever <andreas.noever@gmail.com> 6 * Copyright (C) 2018, Intel Corporation 7 */ 8 9 #ifndef TB_H_ 10 #define TB_H_ 11 12 #include <linux/nvmem-provider.h> 13 #include <linux/pci.h> 14 #include <linux/thunderbolt.h> 15 #include <linux/uuid.h> 16 17 #include "tb_regs.h" 18 #include "ctl.h" 19 #include "dma_port.h" 20 21 /** 22 * struct tb_switch_nvm - Structure holding switch NVM information 23 * @major: Major version number of the active NVM portion 24 * @minor: Minor version number of the active NVM portion 25 * @id: Identifier used with both NVM portions 26 * @active: Active portion NVMem device 27 * @non_active: Non-active portion NVMem device 28 * @buf: Buffer where the NVM image is stored before it is written to 29 * the actual NVM flash device 30 * @buf_data_size: Number of bytes actually consumed by the new NVM 31 * image 32 * @authenticating: The switch is authenticating the new NVM 33 */ 34 struct tb_switch_nvm { 35 u8 major; 36 u8 minor; 37 int id; 38 struct nvmem_device *active; 39 struct nvmem_device *non_active; 40 void *buf; 41 size_t buf_data_size; 42 bool authenticating; 43 }; 44 45 #define TB_SWITCH_KEY_SIZE 32 46 #define TB_SWITCH_MAX_DEPTH 6 47 48 /** 49 * struct tb_switch - a thunderbolt switch 50 * @dev: Device for the switch 51 * @config: Switch configuration 52 * @ports: Ports in this switch 53 * @dma_port: If the switch has port supporting DMA configuration based 54 * mailbox this will hold the pointer to that (%NULL 55 * otherwise). If set it also means the switch has 56 * upgradeable NVM. 57 * @tb: Pointer to the domain the switch belongs to 58 * @uid: Unique ID of the switch 59 * @uuid: UUID of the switch (or %NULL if not supported) 60 * @vendor: Vendor ID of the switch 61 * @device: Device ID of the switch 62 * @vendor_name: Name of the vendor (or %NULL if not known) 63 * @device_name: Name of the device (or %NULL if not known) 64 * @link_speed: Speed of the link in Gb/s 65 * @link_width: Width of the link (1 or 2) 66 * @generation: Switch Thunderbolt generation 67 * @cap_plug_events: Offset to the plug events capability (%0 if not found) 68 * @cap_lc: Offset to the link controller capability (%0 if not found) 69 * @is_unplugged: The switch is going away 70 * @drom: DROM of the switch (%NULL if not found) 71 * @nvm: Pointer to the NVM if the switch has one (%NULL otherwise) 72 * @no_nvm_upgrade: Prevent NVM upgrade of this switch 73 * @safe_mode: The switch is in safe-mode 74 * @boot: Whether the switch was already authorized on boot or not 75 * @rpm: The switch supports runtime PM 76 * @authorized: Whether the switch is authorized by user or policy 77 * @security_level: Switch supported security level 78 * @key: Contains the key used to challenge the device or %NULL if not 79 * supported. Size of the key is %TB_SWITCH_KEY_SIZE. 80 * @connection_id: Connection ID used with ICM messaging 81 * @connection_key: Connection key used with ICM messaging 82 * @link: Root switch link this switch is connected (ICM only) 83 * @depth: Depth in the chain this switch is connected (ICM only) 84 * @rpm_complete: Completion used to wait for runtime resume to 85 * complete (ICM only) 86 * 87 * When the switch is being added or removed to the domain (other 88 * switches) you need to have domain lock held. 89 */ 90 struct tb_switch { 91 struct device dev; 92 struct tb_regs_switch_header config; 93 struct tb_port *ports; 94 struct tb_dma_port *dma_port; 95 struct tb *tb; 96 u64 uid; 97 uuid_t *uuid; 98 u16 vendor; 99 u16 device; 100 const char *vendor_name; 101 const char *device_name; 102 unsigned int link_speed; 103 unsigned int link_width; 104 unsigned int generation; 105 int cap_plug_events; 106 int cap_lc; 107 bool is_unplugged; 108 u8 *drom; 109 struct tb_switch_nvm *nvm; 110 bool no_nvm_upgrade; 111 bool safe_mode; 112 bool boot; 113 bool rpm; 114 unsigned int authorized; 115 enum tb_security_level security_level; 116 u8 *key; 117 u8 connection_id; 118 u8 connection_key; 119 u8 link; 120 u8 depth; 121 struct completion rpm_complete; 122 }; 123 124 /** 125 * struct tb_port - a thunderbolt port, part of a tb_switch 126 * @config: Cached port configuration read from registers 127 * @sw: Switch the port belongs to 128 * @remote: Remote port (%NULL if not connected) 129 * @xdomain: Remote host (%NULL if not connected) 130 * @cap_phy: Offset, zero if not found 131 * @cap_adap: Offset of the adapter specific capability (%0 if not present) 132 * @port: Port number on switch 133 * @disabled: Disabled by eeprom 134 * @bonded: true if the port is bonded (two lanes combined as one) 135 * @dual_link_port: If the switch is connected using two ports, points 136 * to the other port. 137 * @link_nr: Is this primary or secondary port on the dual_link. 138 * @in_hopids: Currently allocated input HopIDs 139 * @out_hopids: Currently allocated output HopIDs 140 * @list: Used to link ports to DP resources list 141 */ 142 struct tb_port { 143 struct tb_regs_port_header config; 144 struct tb_switch *sw; 145 struct tb_port *remote; 146 struct tb_xdomain *xdomain; 147 int cap_phy; 148 int cap_adap; 149 u8 port; 150 bool disabled; 151 bool bonded; 152 struct tb_port *dual_link_port; 153 u8 link_nr:1; 154 struct ida in_hopids; 155 struct ida out_hopids; 156 struct list_head list; 157 }; 158 159 /** 160 * struct tb_path_hop - routing information for a tb_path 161 * @in_port: Ingress port of a switch 162 * @out_port: Egress port of a switch where the packet is routed out 163 * (must be on the same switch than @in_port) 164 * @in_hop_index: HopID where the path configuration entry is placed in 165 * the path config space of @in_port. 166 * @in_counter_index: Used counter index (not used in the driver 167 * currently, %-1 to disable) 168 * @next_hop_index: HopID of the packet when it is routed out from @out_port 169 * @initial_credits: Number of initial flow control credits allocated for 170 * the path 171 * 172 * Hop configuration is always done on the IN port of a switch. 173 * in_port and out_port have to be on the same switch. Packets arriving on 174 * in_port with "hop" = in_hop_index will get routed to through out_port. The 175 * next hop to take (on out_port->remote) is determined by 176 * next_hop_index. When routing packet to another switch (out->remote is 177 * set) the @next_hop_index must match the @in_hop_index of that next 178 * hop to make routing possible. 179 * 180 * in_counter_index is the index of a counter (in TB_CFG_COUNTERS) on the in 181 * port. 182 */ 183 struct tb_path_hop { 184 struct tb_port *in_port; 185 struct tb_port *out_port; 186 int in_hop_index; 187 int in_counter_index; 188 int next_hop_index; 189 unsigned int initial_credits; 190 }; 191 192 /** 193 * enum tb_path_port - path options mask 194 * @TB_PATH_NONE: Do not activate on any hop on path 195 * @TB_PATH_SOURCE: Activate on the first hop (out of src) 196 * @TB_PATH_INTERNAL: Activate on the intermediate hops (not the first/last) 197 * @TB_PATH_DESTINATION: Activate on the last hop (into dst) 198 * @TB_PATH_ALL: Activate on all hops on the path 199 */ 200 enum tb_path_port { 201 TB_PATH_NONE = 0, 202 TB_PATH_SOURCE = 1, 203 TB_PATH_INTERNAL = 2, 204 TB_PATH_DESTINATION = 4, 205 TB_PATH_ALL = 7, 206 }; 207 208 /** 209 * struct tb_path - a unidirectional path between two ports 210 * @tb: Pointer to the domain structure 211 * @name: Name of the path (used for debugging) 212 * @nfc_credits: Number of non flow controlled credits allocated for the path 213 * @ingress_shared_buffer: Shared buffering used for ingress ports on the path 214 * @egress_shared_buffer: Shared buffering used for egress ports on the path 215 * @ingress_fc_enable: Flow control for ingress ports on the path 216 * @egress_fc_enable: Flow control for egress ports on the path 217 * @priority: Priority group if the path 218 * @weight: Weight of the path inside the priority group 219 * @drop_packages: Drop packages from queue tail or head 220 * @activated: Is the path active 221 * @clear_fc: Clear all flow control from the path config space entries 222 * when deactivating this path 223 * @hops: Path hops 224 * @path_length: How many hops the path uses 225 * 226 * A path consists of a number of hops (see &struct tb_path_hop). To 227 * establish a PCIe tunnel two paths have to be created between the two 228 * PCIe ports. 229 */ 230 struct tb_path { 231 struct tb *tb; 232 const char *name; 233 int nfc_credits; 234 enum tb_path_port ingress_shared_buffer; 235 enum tb_path_port egress_shared_buffer; 236 enum tb_path_port ingress_fc_enable; 237 enum tb_path_port egress_fc_enable; 238 239 unsigned int priority:3; 240 int weight:4; 241 bool drop_packages; 242 bool activated; 243 bool clear_fc; 244 struct tb_path_hop *hops; 245 int path_length; 246 }; 247 248 /* HopIDs 0-7 are reserved by the Thunderbolt protocol */ 249 #define TB_PATH_MIN_HOPID 8 250 #define TB_PATH_MAX_HOPS 7 251 252 /** 253 * struct tb_cm_ops - Connection manager specific operations vector 254 * @driver_ready: Called right after control channel is started. Used by 255 * ICM to send driver ready message to the firmware. 256 * @start: Starts the domain 257 * @stop: Stops the domain 258 * @suspend_noirq: Connection manager specific suspend_noirq 259 * @resume_noirq: Connection manager specific resume_noirq 260 * @suspend: Connection manager specific suspend 261 * @complete: Connection manager specific complete 262 * @runtime_suspend: Connection manager specific runtime_suspend 263 * @runtime_resume: Connection manager specific runtime_resume 264 * @runtime_suspend_switch: Runtime suspend a switch 265 * @runtime_resume_switch: Runtime resume a switch 266 * @handle_event: Handle thunderbolt event 267 * @get_boot_acl: Get boot ACL list 268 * @set_boot_acl: Set boot ACL list 269 * @approve_switch: Approve switch 270 * @add_switch_key: Add key to switch 271 * @challenge_switch_key: Challenge switch using key 272 * @disconnect_pcie_paths: Disconnects PCIe paths before NVM update 273 * @approve_xdomain_paths: Approve (establish) XDomain DMA paths 274 * @disconnect_xdomain_paths: Disconnect XDomain DMA paths 275 */ 276 struct tb_cm_ops { 277 int (*driver_ready)(struct tb *tb); 278 int (*start)(struct tb *tb); 279 void (*stop)(struct tb *tb); 280 int (*suspend_noirq)(struct tb *tb); 281 int (*resume_noirq)(struct tb *tb); 282 int (*suspend)(struct tb *tb); 283 void (*complete)(struct tb *tb); 284 int (*runtime_suspend)(struct tb *tb); 285 int (*runtime_resume)(struct tb *tb); 286 int (*runtime_suspend_switch)(struct tb_switch *sw); 287 int (*runtime_resume_switch)(struct tb_switch *sw); 288 void (*handle_event)(struct tb *tb, enum tb_cfg_pkg_type, 289 const void *buf, size_t size); 290 int (*get_boot_acl)(struct tb *tb, uuid_t *uuids, size_t nuuids); 291 int (*set_boot_acl)(struct tb *tb, const uuid_t *uuids, size_t nuuids); 292 int (*approve_switch)(struct tb *tb, struct tb_switch *sw); 293 int (*add_switch_key)(struct tb *tb, struct tb_switch *sw); 294 int (*challenge_switch_key)(struct tb *tb, struct tb_switch *sw, 295 const u8 *challenge, u8 *response); 296 int (*disconnect_pcie_paths)(struct tb *tb); 297 int (*approve_xdomain_paths)(struct tb *tb, struct tb_xdomain *xd); 298 int (*disconnect_xdomain_paths)(struct tb *tb, struct tb_xdomain *xd); 299 }; 300 301 static inline void *tb_priv(struct tb *tb) 302 { 303 return (void *)tb->privdata; 304 } 305 306 #define TB_AUTOSUSPEND_DELAY 15000 /* ms */ 307 308 /* helper functions & macros */ 309 310 /** 311 * tb_upstream_port() - return the upstream port of a switch 312 * 313 * Every switch has an upstream port (for the root switch it is the NHI). 314 * 315 * During switch alloc/init tb_upstream_port()->remote may be NULL, even for 316 * non root switches (on the NHI port remote is always NULL). 317 * 318 * Return: Returns the upstream port of the switch. 319 */ 320 static inline struct tb_port *tb_upstream_port(struct tb_switch *sw) 321 { 322 return &sw->ports[sw->config.upstream_port_number]; 323 } 324 325 /** 326 * tb_is_upstream_port() - Is the port upstream facing 327 * @port: Port to check 328 * 329 * Returns true if @port is upstream facing port. In case of dual link 330 * ports both return true. 331 */ 332 static inline bool tb_is_upstream_port(const struct tb_port *port) 333 { 334 const struct tb_port *upstream_port = tb_upstream_port(port->sw); 335 return port == upstream_port || port->dual_link_port == upstream_port; 336 } 337 338 static inline u64 tb_route(const struct tb_switch *sw) 339 { 340 return ((u64) sw->config.route_hi) << 32 | sw->config.route_lo; 341 } 342 343 static inline struct tb_port *tb_port_at(u64 route, struct tb_switch *sw) 344 { 345 u8 port; 346 347 port = route >> (sw->config.depth * 8); 348 if (WARN_ON(port > sw->config.max_port_number)) 349 return NULL; 350 return &sw->ports[port]; 351 } 352 353 /** 354 * tb_port_has_remote() - Does the port have switch connected downstream 355 * @port: Port to check 356 * 357 * Returns true only when the port is primary port and has remote set. 358 */ 359 static inline bool tb_port_has_remote(const struct tb_port *port) 360 { 361 if (tb_is_upstream_port(port)) 362 return false; 363 if (!port->remote) 364 return false; 365 if (port->dual_link_port && port->link_nr) 366 return false; 367 368 return true; 369 } 370 371 static inline bool tb_port_is_null(const struct tb_port *port) 372 { 373 return port && port->port && port->config.type == TB_TYPE_PORT; 374 } 375 376 static inline bool tb_port_is_pcie_down(const struct tb_port *port) 377 { 378 return port && port->config.type == TB_TYPE_PCIE_DOWN; 379 } 380 381 static inline bool tb_port_is_pcie_up(const struct tb_port *port) 382 { 383 return port && port->config.type == TB_TYPE_PCIE_UP; 384 } 385 386 static inline bool tb_port_is_dpin(const struct tb_port *port) 387 { 388 return port && port->config.type == TB_TYPE_DP_HDMI_IN; 389 } 390 391 static inline bool tb_port_is_dpout(const struct tb_port *port) 392 { 393 return port && port->config.type == TB_TYPE_DP_HDMI_OUT; 394 } 395 396 static inline int tb_sw_read(struct tb_switch *sw, void *buffer, 397 enum tb_cfg_space space, u32 offset, u32 length) 398 { 399 if (sw->is_unplugged) 400 return -ENODEV; 401 return tb_cfg_read(sw->tb->ctl, 402 buffer, 403 tb_route(sw), 404 0, 405 space, 406 offset, 407 length); 408 } 409 410 static inline int tb_sw_write(struct tb_switch *sw, const void *buffer, 411 enum tb_cfg_space space, u32 offset, u32 length) 412 { 413 if (sw->is_unplugged) 414 return -ENODEV; 415 return tb_cfg_write(sw->tb->ctl, 416 buffer, 417 tb_route(sw), 418 0, 419 space, 420 offset, 421 length); 422 } 423 424 static inline int tb_port_read(struct tb_port *port, void *buffer, 425 enum tb_cfg_space space, u32 offset, u32 length) 426 { 427 if (port->sw->is_unplugged) 428 return -ENODEV; 429 return tb_cfg_read(port->sw->tb->ctl, 430 buffer, 431 tb_route(port->sw), 432 port->port, 433 space, 434 offset, 435 length); 436 } 437 438 static inline int tb_port_write(struct tb_port *port, const void *buffer, 439 enum tb_cfg_space space, u32 offset, u32 length) 440 { 441 if (port->sw->is_unplugged) 442 return -ENODEV; 443 return tb_cfg_write(port->sw->tb->ctl, 444 buffer, 445 tb_route(port->sw), 446 port->port, 447 space, 448 offset, 449 length); 450 } 451 452 #define tb_err(tb, fmt, arg...) dev_err(&(tb)->nhi->pdev->dev, fmt, ## arg) 453 #define tb_WARN(tb, fmt, arg...) dev_WARN(&(tb)->nhi->pdev->dev, fmt, ## arg) 454 #define tb_warn(tb, fmt, arg...) dev_warn(&(tb)->nhi->pdev->dev, fmt, ## arg) 455 #define tb_info(tb, fmt, arg...) dev_info(&(tb)->nhi->pdev->dev, fmt, ## arg) 456 #define tb_dbg(tb, fmt, arg...) dev_dbg(&(tb)->nhi->pdev->dev, fmt, ## arg) 457 458 #define __TB_SW_PRINT(level, sw, fmt, arg...) \ 459 do { \ 460 const struct tb_switch *__sw = (sw); \ 461 level(__sw->tb, "%llx: " fmt, \ 462 tb_route(__sw), ## arg); \ 463 } while (0) 464 #define tb_sw_WARN(sw, fmt, arg...) __TB_SW_PRINT(tb_WARN, sw, fmt, ##arg) 465 #define tb_sw_warn(sw, fmt, arg...) __TB_SW_PRINT(tb_warn, sw, fmt, ##arg) 466 #define tb_sw_info(sw, fmt, arg...) __TB_SW_PRINT(tb_info, sw, fmt, ##arg) 467 #define tb_sw_dbg(sw, fmt, arg...) __TB_SW_PRINT(tb_dbg, sw, fmt, ##arg) 468 469 #define __TB_PORT_PRINT(level, _port, fmt, arg...) \ 470 do { \ 471 const struct tb_port *__port = (_port); \ 472 level(__port->sw->tb, "%llx:%x: " fmt, \ 473 tb_route(__port->sw), __port->port, ## arg); \ 474 } while (0) 475 #define tb_port_WARN(port, fmt, arg...) \ 476 __TB_PORT_PRINT(tb_WARN, port, fmt, ##arg) 477 #define tb_port_warn(port, fmt, arg...) \ 478 __TB_PORT_PRINT(tb_warn, port, fmt, ##arg) 479 #define tb_port_info(port, fmt, arg...) \ 480 __TB_PORT_PRINT(tb_info, port, fmt, ##arg) 481 #define tb_port_dbg(port, fmt, arg...) \ 482 __TB_PORT_PRINT(tb_dbg, port, fmt, ##arg) 483 484 struct tb *icm_probe(struct tb_nhi *nhi); 485 struct tb *tb_probe(struct tb_nhi *nhi); 486 487 extern struct device_type tb_domain_type; 488 extern struct device_type tb_switch_type; 489 490 int tb_domain_init(void); 491 void tb_domain_exit(void); 492 void tb_switch_exit(void); 493 int tb_xdomain_init(void); 494 void tb_xdomain_exit(void); 495 496 struct tb *tb_domain_alloc(struct tb_nhi *nhi, size_t privsize); 497 int tb_domain_add(struct tb *tb); 498 void tb_domain_remove(struct tb *tb); 499 int tb_domain_suspend_noirq(struct tb *tb); 500 int tb_domain_resume_noirq(struct tb *tb); 501 int tb_domain_suspend(struct tb *tb); 502 void tb_domain_complete(struct tb *tb); 503 int tb_domain_runtime_suspend(struct tb *tb); 504 int tb_domain_runtime_resume(struct tb *tb); 505 int tb_domain_approve_switch(struct tb *tb, struct tb_switch *sw); 506 int tb_domain_approve_switch_key(struct tb *tb, struct tb_switch *sw); 507 int tb_domain_challenge_switch_key(struct tb *tb, struct tb_switch *sw); 508 int tb_domain_disconnect_pcie_paths(struct tb *tb); 509 int tb_domain_approve_xdomain_paths(struct tb *tb, struct tb_xdomain *xd); 510 int tb_domain_disconnect_xdomain_paths(struct tb *tb, struct tb_xdomain *xd); 511 int tb_domain_disconnect_all_paths(struct tb *tb); 512 513 static inline struct tb *tb_domain_get(struct tb *tb) 514 { 515 if (tb) 516 get_device(&tb->dev); 517 return tb; 518 } 519 520 static inline void tb_domain_put(struct tb *tb) 521 { 522 put_device(&tb->dev); 523 } 524 525 struct tb_switch *tb_switch_alloc(struct tb *tb, struct device *parent, 526 u64 route); 527 struct tb_switch *tb_switch_alloc_safe_mode(struct tb *tb, 528 struct device *parent, u64 route); 529 int tb_switch_configure(struct tb_switch *sw); 530 int tb_switch_add(struct tb_switch *sw); 531 void tb_switch_remove(struct tb_switch *sw); 532 void tb_switch_suspend(struct tb_switch *sw); 533 int tb_switch_resume(struct tb_switch *sw); 534 int tb_switch_reset(struct tb *tb, u64 route); 535 void tb_sw_set_unplugged(struct tb_switch *sw); 536 struct tb_switch *tb_switch_find_by_link_depth(struct tb *tb, u8 link, 537 u8 depth); 538 struct tb_switch *tb_switch_find_by_uuid(struct tb *tb, const uuid_t *uuid); 539 struct tb_switch *tb_switch_find_by_route(struct tb *tb, u64 route); 540 541 /** 542 * tb_switch_for_each_port() - Iterate over each switch port 543 * @sw: Switch whose ports to iterate 544 * @p: Port used as iterator 545 * 546 * Iterates over each switch port skipping the control port (port %0). 547 */ 548 #define tb_switch_for_each_port(sw, p) \ 549 for ((p) = &(sw)->ports[1]; \ 550 (p) <= &(sw)->ports[(sw)->config.max_port_number]; (p)++) 551 552 static inline struct tb_switch *tb_switch_get(struct tb_switch *sw) 553 { 554 if (sw) 555 get_device(&sw->dev); 556 return sw; 557 } 558 559 static inline void tb_switch_put(struct tb_switch *sw) 560 { 561 put_device(&sw->dev); 562 } 563 564 static inline bool tb_is_switch(const struct device *dev) 565 { 566 return dev->type == &tb_switch_type; 567 } 568 569 static inline struct tb_switch *tb_to_switch(struct device *dev) 570 { 571 if (tb_is_switch(dev)) 572 return container_of(dev, struct tb_switch, dev); 573 return NULL; 574 } 575 576 static inline struct tb_switch *tb_switch_parent(struct tb_switch *sw) 577 { 578 return tb_to_switch(sw->dev.parent); 579 } 580 581 static inline bool tb_switch_is_light_ridge(const struct tb_switch *sw) 582 { 583 return sw->config.device_id == PCI_DEVICE_ID_INTEL_LIGHT_RIDGE; 584 } 585 586 static inline bool tb_switch_is_eagle_ridge(const struct tb_switch *sw) 587 { 588 return sw->config.device_id == PCI_DEVICE_ID_INTEL_EAGLE_RIDGE; 589 } 590 591 static inline bool tb_switch_is_cactus_ridge(const struct tb_switch *sw) 592 { 593 switch (sw->config.device_id) { 594 case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_2C: 595 case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C: 596 return true; 597 default: 598 return false; 599 } 600 } 601 602 static inline bool tb_switch_is_falcon_ridge(const struct tb_switch *sw) 603 { 604 switch (sw->config.device_id) { 605 case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_BRIDGE: 606 case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_BRIDGE: 607 return true; 608 default: 609 return false; 610 } 611 } 612 613 static inline bool tb_switch_is_alpine_ridge(const struct tb_switch *sw) 614 { 615 switch (sw->config.device_id) { 616 case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_2C_BRIDGE: 617 case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_LP_BRIDGE: 618 case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_4C_BRIDGE: 619 case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_2C_BRIDGE: 620 return true; 621 default: 622 return false; 623 } 624 } 625 626 static inline bool tb_switch_is_titan_ridge(const struct tb_switch *sw) 627 { 628 switch (sw->config.device_id) { 629 case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_BRIDGE: 630 case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_BRIDGE: 631 case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_BRIDGE: 632 return true; 633 default: 634 return false; 635 } 636 } 637 638 /** 639 * tb_switch_is_icm() - Is the switch handled by ICM firmware 640 * @sw: Switch to check 641 * 642 * In case there is a need to differentiate whether ICM firmware or SW CM 643 * is handling @sw this function can be called. It is valid to call this 644 * after tb_switch_alloc() and tb_switch_configure() has been called 645 * (latter only for SW CM case). 646 */ 647 static inline bool tb_switch_is_icm(const struct tb_switch *sw) 648 { 649 return !sw->config.enabled; 650 } 651 652 int tb_switch_lane_bonding_enable(struct tb_switch *sw); 653 void tb_switch_lane_bonding_disable(struct tb_switch *sw); 654 655 bool tb_switch_query_dp_resource(struct tb_switch *sw, struct tb_port *in); 656 int tb_switch_alloc_dp_resource(struct tb_switch *sw, struct tb_port *in); 657 void tb_switch_dealloc_dp_resource(struct tb_switch *sw, struct tb_port *in); 658 659 int tb_wait_for_port(struct tb_port *port, bool wait_if_unplugged); 660 int tb_port_add_nfc_credits(struct tb_port *port, int credits); 661 int tb_port_set_initial_credits(struct tb_port *port, u32 credits); 662 int tb_port_clear_counter(struct tb_port *port, int counter); 663 int tb_port_alloc_in_hopid(struct tb_port *port, int hopid, int max_hopid); 664 void tb_port_release_in_hopid(struct tb_port *port, int hopid); 665 int tb_port_alloc_out_hopid(struct tb_port *port, int hopid, int max_hopid); 666 void tb_port_release_out_hopid(struct tb_port *port, int hopid); 667 struct tb_port *tb_next_port_on_path(struct tb_port *start, struct tb_port *end, 668 struct tb_port *prev); 669 670 int tb_switch_find_vse_cap(struct tb_switch *sw, enum tb_switch_vse_cap vsec); 671 int tb_port_find_cap(struct tb_port *port, enum tb_port_cap cap); 672 bool tb_port_is_enabled(struct tb_port *port); 673 674 bool tb_pci_port_is_enabled(struct tb_port *port); 675 int tb_pci_port_enable(struct tb_port *port, bool enable); 676 677 int tb_dp_port_hpd_is_active(struct tb_port *port); 678 int tb_dp_port_hpd_clear(struct tb_port *port); 679 int tb_dp_port_set_hops(struct tb_port *port, unsigned int video, 680 unsigned int aux_tx, unsigned int aux_rx); 681 bool tb_dp_port_is_enabled(struct tb_port *port); 682 int tb_dp_port_enable(struct tb_port *port, bool enable); 683 684 struct tb_path *tb_path_discover(struct tb_port *src, int src_hopid, 685 struct tb_port *dst, int dst_hopid, 686 struct tb_port **last, const char *name); 687 struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid, 688 struct tb_port *dst, int dst_hopid, int link_nr, 689 const char *name); 690 void tb_path_free(struct tb_path *path); 691 int tb_path_activate(struct tb_path *path); 692 void tb_path_deactivate(struct tb_path *path); 693 bool tb_path_is_invalid(struct tb_path *path); 694 bool tb_path_switch_on_path(const struct tb_path *path, 695 const struct tb_switch *sw); 696 697 int tb_drom_read(struct tb_switch *sw); 698 int tb_drom_read_uid_only(struct tb_switch *sw, u64 *uid); 699 700 int tb_lc_read_uuid(struct tb_switch *sw, u32 *uuid); 701 int tb_lc_configure_link(struct tb_switch *sw); 702 void tb_lc_unconfigure_link(struct tb_switch *sw); 703 int tb_lc_set_sleep(struct tb_switch *sw); 704 bool tb_lc_lane_bonding_possible(struct tb_switch *sw); 705 bool tb_lc_dp_sink_query(struct tb_switch *sw, struct tb_port *in); 706 int tb_lc_dp_sink_alloc(struct tb_switch *sw, struct tb_port *in); 707 int tb_lc_dp_sink_dealloc(struct tb_switch *sw, struct tb_port *in); 708 709 static inline int tb_route_length(u64 route) 710 { 711 return (fls64(route) + TB_ROUTE_SHIFT - 1) / TB_ROUTE_SHIFT; 712 } 713 714 /** 715 * tb_downstream_route() - get route to downstream switch 716 * 717 * Port must not be the upstream port (otherwise a loop is created). 718 * 719 * Return: Returns a route to the switch behind @port. 720 */ 721 static inline u64 tb_downstream_route(struct tb_port *port) 722 { 723 return tb_route(port->sw) 724 | ((u64) port->port << (port->sw->config.depth * 8)); 725 } 726 727 bool tb_xdomain_handle_request(struct tb *tb, enum tb_cfg_pkg_type type, 728 const void *buf, size_t size); 729 struct tb_xdomain *tb_xdomain_alloc(struct tb *tb, struct device *parent, 730 u64 route, const uuid_t *local_uuid, 731 const uuid_t *remote_uuid); 732 void tb_xdomain_add(struct tb_xdomain *xd); 733 void tb_xdomain_remove(struct tb_xdomain *xd); 734 struct tb_xdomain *tb_xdomain_find_by_link_depth(struct tb *tb, u8 link, 735 u8 depth); 736 737 #endif 738