1
2
3
4
5
6
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#define NVM_MIN_SIZE SZ_32K
22#define NVM_MAX_SIZE SZ_512K
23
24
25#define NVM_DEVID 0x05
26#define NVM_VERSION 0x08
27#define NVM_FLASH_SIZE 0x45
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47struct tb_nvm {
48 struct device *dev;
49 u8 major;
50 u8 minor;
51 int id;
52 struct nvmem_device *active;
53 struct nvmem_device *non_active;
54 void *buf;
55 size_t buf_data_size;
56 bool authenticating;
57 bool flushed;
58};
59
60#define TB_SWITCH_KEY_SIZE 32
61#define TB_SWITCH_MAX_DEPTH 6
62#define USB4_SWITCH_MAX_DEPTH 5
63
64
65
66
67
68
69
70
71
72
73
74enum tb_switch_tmu_rate {
75 TB_SWITCH_TMU_RATE_OFF = 0,
76 TB_SWITCH_TMU_RATE_HIFI = 16,
77 TB_SWITCH_TMU_RATE_NORMAL = 1000,
78};
79
80
81
82
83
84
85
86
87
88
89struct tb_switch_tmu {
90 int cap;
91 bool has_ucap;
92 enum tb_switch_tmu_rate rate;
93 bool unidirectional;
94};
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144struct tb_switch {
145 struct device dev;
146 struct tb_regs_switch_header config;
147 struct tb_port *ports;
148 struct tb_dma_port *dma_port;
149 struct tb_switch_tmu tmu;
150 struct tb *tb;
151 u64 uid;
152 uuid_t *uuid;
153 u16 vendor;
154 u16 device;
155 const char *vendor_name;
156 const char *device_name;
157 unsigned int link_speed;
158 unsigned int link_width;
159 bool link_usb4;
160 unsigned int generation;
161 int cap_plug_events;
162 int cap_lc;
163 bool is_unplugged;
164 u8 *drom;
165 struct tb_nvm *nvm;
166 bool no_nvm_upgrade;
167 bool safe_mode;
168 bool boot;
169 bool rpm;
170 unsigned int authorized;
171 enum tb_security_level security_level;
172 struct dentry *debugfs_dir;
173 u8 *key;
174 u8 connection_id;
175 u8 connection_key;
176 u8 link;
177 u8 depth;
178 struct completion rpm_complete;
179 unsigned long quirks;
180};
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205struct tb_port {
206 struct tb_regs_port_header config;
207 struct tb_switch *sw;
208 struct tb_port *remote;
209 struct tb_xdomain *xdomain;
210 int cap_phy;
211 int cap_tmu;
212 int cap_adap;
213 int cap_usb4;
214 u8 port;
215 bool disabled;
216 bool bonded;
217 struct tb_port *dual_link_port;
218 u8 link_nr:1;
219 struct ida in_hopids;
220 struct ida out_hopids;
221 struct list_head list;
222};
223
224
225
226
227
228
229
230
231
232
233
234
235struct tb_retimer {
236 struct device dev;
237 struct tb *tb;
238 u8 index;
239 u32 vendor;
240 u32 device;
241 struct tb_port *port;
242 struct tb_nvm *nvm;
243 u32 auth_status;
244};
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270struct tb_path_hop {
271 struct tb_port *in_port;
272 struct tb_port *out_port;
273 int in_hop_index;
274 int in_counter_index;
275 int next_hop_index;
276 unsigned int initial_credits;
277};
278
279
280
281
282
283
284
285
286
287enum tb_path_port {
288 TB_PATH_NONE = 0,
289 TB_PATH_SOURCE = 1,
290 TB_PATH_INTERNAL = 2,
291 TB_PATH_DESTINATION = 4,
292 TB_PATH_ALL = 7,
293};
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317struct tb_path {
318 struct tb *tb;
319 const char *name;
320 int nfc_credits;
321 enum tb_path_port ingress_shared_buffer;
322 enum tb_path_port egress_shared_buffer;
323 enum tb_path_port ingress_fc_enable;
324 enum tb_path_port egress_fc_enable;
325
326 unsigned int priority:3;
327 int weight:4;
328 bool drop_packages;
329 bool activated;
330 bool clear_fc;
331 struct tb_path_hop *hops;
332 int path_length;
333};
334
335
336#define TB_PATH_MIN_HOPID 8
337
338
339
340
341#define TB_PATH_MAX_HOPS (7 * 2)
342
343
344#define TB_WAKE_ON_CONNECT BIT(0)
345#define TB_WAKE_ON_DISCONNECT BIT(1)
346#define TB_WAKE_ON_USB4 BIT(2)
347#define TB_WAKE_ON_USB3 BIT(3)
348#define TB_WAKE_ON_PCIE BIT(4)
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385struct tb_cm_ops {
386 int (*driver_ready)(struct tb *tb);
387 int (*start)(struct tb *tb);
388 void (*stop)(struct tb *tb);
389 int (*suspend_noirq)(struct tb *tb);
390 int (*resume_noirq)(struct tb *tb);
391 int (*suspend)(struct tb *tb);
392 int (*freeze_noirq)(struct tb *tb);
393 int (*thaw_noirq)(struct tb *tb);
394 void (*complete)(struct tb *tb);
395 int (*runtime_suspend)(struct tb *tb);
396 int (*runtime_resume)(struct tb *tb);
397 int (*runtime_suspend_switch)(struct tb_switch *sw);
398 int (*runtime_resume_switch)(struct tb_switch *sw);
399 void (*handle_event)(struct tb *tb, enum tb_cfg_pkg_type,
400 const void *buf, size_t size);
401 int (*get_boot_acl)(struct tb *tb, uuid_t *uuids, size_t nuuids);
402 int (*set_boot_acl)(struct tb *tb, const uuid_t *uuids, size_t nuuids);
403 int (*disapprove_switch)(struct tb *tb, struct tb_switch *sw);
404 int (*approve_switch)(struct tb *tb, struct tb_switch *sw);
405 int (*add_switch_key)(struct tb *tb, struct tb_switch *sw);
406 int (*challenge_switch_key)(struct tb *tb, struct tb_switch *sw,
407 const u8 *challenge, u8 *response);
408 int (*disconnect_pcie_paths)(struct tb *tb);
409 int (*approve_xdomain_paths)(struct tb *tb, struct tb_xdomain *xd,
410 int transmit_path, int transmit_ring,
411 int receive_path, int receive_ring);
412 int (*disconnect_xdomain_paths)(struct tb *tb, struct tb_xdomain *xd,
413 int transmit_path, int transmit_ring,
414 int receive_path, int receive_ring);
415 int (*usb4_switch_op)(struct tb_switch *sw, u16 opcode, u32 *metadata,
416 u8 *status, const void *tx_data, size_t tx_data_len,
417 void *rx_data, size_t rx_data_len);
418 int (*usb4_switch_nvm_authenticate_status)(struct tb_switch *sw,
419 u32 *status);
420};
421
422static inline void *tb_priv(struct tb *tb)
423{
424 return (void *)tb->privdata;
425}
426
427#define TB_AUTOSUSPEND_DELAY 15000
428
429
430
431
432
433
434
435
436
437
438
439
440
441static inline struct tb_port *tb_upstream_port(struct tb_switch *sw)
442{
443 return &sw->ports[sw->config.upstream_port_number];
444}
445
446
447
448
449
450
451
452
453static inline bool tb_is_upstream_port(const struct tb_port *port)
454{
455 const struct tb_port *upstream_port = tb_upstream_port(port->sw);
456 return port == upstream_port || port->dual_link_port == upstream_port;
457}
458
459static inline u64 tb_route(const struct tb_switch *sw)
460{
461 return ((u64) sw->config.route_hi) << 32 | sw->config.route_lo;
462}
463
464static inline struct tb_port *tb_port_at(u64 route, struct tb_switch *sw)
465{
466 u8 port;
467
468 port = route >> (sw->config.depth * 8);
469 if (WARN_ON(port > sw->config.max_port_number))
470 return NULL;
471 return &sw->ports[port];
472}
473
474
475
476
477
478
479
480static inline bool tb_port_has_remote(const struct tb_port *port)
481{
482 if (tb_is_upstream_port(port))
483 return false;
484 if (!port->remote)
485 return false;
486 if (port->dual_link_port && port->link_nr)
487 return false;
488
489 return true;
490}
491
492static inline bool tb_port_is_null(const struct tb_port *port)
493{
494 return port && port->port && port->config.type == TB_TYPE_PORT;
495}
496
497static inline bool tb_port_is_nhi(const struct tb_port *port)
498{
499 return port && port->config.type == TB_TYPE_NHI;
500}
501
502static inline bool tb_port_is_pcie_down(const struct tb_port *port)
503{
504 return port && port->config.type == TB_TYPE_PCIE_DOWN;
505}
506
507static inline bool tb_port_is_pcie_up(const struct tb_port *port)
508{
509 return port && port->config.type == TB_TYPE_PCIE_UP;
510}
511
512static inline bool tb_port_is_dpin(const struct tb_port *port)
513{
514 return port && port->config.type == TB_TYPE_DP_HDMI_IN;
515}
516
517static inline bool tb_port_is_dpout(const struct tb_port *port)
518{
519 return port && port->config.type == TB_TYPE_DP_HDMI_OUT;
520}
521
522static inline bool tb_port_is_usb3_down(const struct tb_port *port)
523{
524 return port && port->config.type == TB_TYPE_USB3_DOWN;
525}
526
527static inline bool tb_port_is_usb3_up(const struct tb_port *port)
528{
529 return port && port->config.type == TB_TYPE_USB3_UP;
530}
531
532static inline int tb_sw_read(struct tb_switch *sw, void *buffer,
533 enum tb_cfg_space space, u32 offset, u32 length)
534{
535 if (sw->is_unplugged)
536 return -ENODEV;
537 return tb_cfg_read(sw->tb->ctl,
538 buffer,
539 tb_route(sw),
540 0,
541 space,
542 offset,
543 length);
544}
545
546static inline int tb_sw_write(struct tb_switch *sw, const void *buffer,
547 enum tb_cfg_space space, u32 offset, u32 length)
548{
549 if (sw->is_unplugged)
550 return -ENODEV;
551 return tb_cfg_write(sw->tb->ctl,
552 buffer,
553 tb_route(sw),
554 0,
555 space,
556 offset,
557 length);
558}
559
560static inline int tb_port_read(struct tb_port *port, void *buffer,
561 enum tb_cfg_space space, u32 offset, u32 length)
562{
563 if (port->sw->is_unplugged)
564 return -ENODEV;
565 return tb_cfg_read(port->sw->tb->ctl,
566 buffer,
567 tb_route(port->sw),
568 port->port,
569 space,
570 offset,
571 length);
572}
573
574static inline int tb_port_write(struct tb_port *port, const void *buffer,
575 enum tb_cfg_space space, u32 offset, u32 length)
576{
577 if (port->sw->is_unplugged)
578 return -ENODEV;
579 return tb_cfg_write(port->sw->tb->ctl,
580 buffer,
581 tb_route(port->sw),
582 port->port,
583 space,
584 offset,
585 length);
586}
587
588#define tb_err(tb, fmt, arg...) dev_err(&(tb)->nhi->pdev->dev, fmt, ## arg)
589#define tb_WARN(tb, fmt, arg...) dev_WARN(&(tb)->nhi->pdev->dev, fmt, ## arg)
590#define tb_warn(tb, fmt, arg...) dev_warn(&(tb)->nhi->pdev->dev, fmt, ## arg)
591#define tb_info(tb, fmt, arg...) dev_info(&(tb)->nhi->pdev->dev, fmt, ## arg)
592#define tb_dbg(tb, fmt, arg...) dev_dbg(&(tb)->nhi->pdev->dev, fmt, ## arg)
593
594#define __TB_SW_PRINT(level, sw, fmt, arg...) \
595 do { \
596 const struct tb_switch *__sw = (sw); \
597 level(__sw->tb, "%llx: " fmt, \
598 tb_route(__sw), ## arg); \
599 } while (0)
600#define tb_sw_WARN(sw, fmt, arg...) __TB_SW_PRINT(tb_WARN, sw, fmt, ##arg)
601#define tb_sw_warn(sw, fmt, arg...) __TB_SW_PRINT(tb_warn, sw, fmt, ##arg)
602#define tb_sw_info(sw, fmt, arg...) __TB_SW_PRINT(tb_info, sw, fmt, ##arg)
603#define tb_sw_dbg(sw, fmt, arg...) __TB_SW_PRINT(tb_dbg, sw, fmt, ##arg)
604
605#define __TB_PORT_PRINT(level, _port, fmt, arg...) \
606 do { \
607 const struct tb_port *__port = (_port); \
608 level(__port->sw->tb, "%llx:%x: " fmt, \
609 tb_route(__port->sw), __port->port, ## arg); \
610 } while (0)
611#define tb_port_WARN(port, fmt, arg...) \
612 __TB_PORT_PRINT(tb_WARN, port, fmt, ##arg)
613#define tb_port_warn(port, fmt, arg...) \
614 __TB_PORT_PRINT(tb_warn, port, fmt, ##arg)
615#define tb_port_info(port, fmt, arg...) \
616 __TB_PORT_PRINT(tb_info, port, fmt, ##arg)
617#define tb_port_dbg(port, fmt, arg...) \
618 __TB_PORT_PRINT(tb_dbg, port, fmt, ##arg)
619
620struct tb *icm_probe(struct tb_nhi *nhi);
621struct tb *tb_probe(struct tb_nhi *nhi);
622
623extern struct device_type tb_domain_type;
624extern struct device_type tb_retimer_type;
625extern struct device_type tb_switch_type;
626
627int tb_domain_init(void);
628void tb_domain_exit(void);
629int tb_xdomain_init(void);
630void tb_xdomain_exit(void);
631
632struct tb *tb_domain_alloc(struct tb_nhi *nhi, int timeout_msec, size_t privsize);
633int tb_domain_add(struct tb *tb);
634void tb_domain_remove(struct tb *tb);
635int tb_domain_suspend_noirq(struct tb *tb);
636int tb_domain_resume_noirq(struct tb *tb);
637int tb_domain_suspend(struct tb *tb);
638int tb_domain_freeze_noirq(struct tb *tb);
639int tb_domain_thaw_noirq(struct tb *tb);
640void tb_domain_complete(struct tb *tb);
641int tb_domain_runtime_suspend(struct tb *tb);
642int tb_domain_runtime_resume(struct tb *tb);
643int tb_domain_disapprove_switch(struct tb *tb, struct tb_switch *sw);
644int tb_domain_approve_switch(struct tb *tb, struct tb_switch *sw);
645int tb_domain_approve_switch_key(struct tb *tb, struct tb_switch *sw);
646int tb_domain_challenge_switch_key(struct tb *tb, struct tb_switch *sw);
647int tb_domain_disconnect_pcie_paths(struct tb *tb);
648int tb_domain_approve_xdomain_paths(struct tb *tb, struct tb_xdomain *xd,
649 int transmit_path, int transmit_ring,
650 int receive_path, int receive_ring);
651int tb_domain_disconnect_xdomain_paths(struct tb *tb, struct tb_xdomain *xd,
652 int transmit_path, int transmit_ring,
653 int receive_path, int receive_ring);
654int tb_domain_disconnect_all_paths(struct tb *tb);
655
656static inline struct tb *tb_domain_get(struct tb *tb)
657{
658 if (tb)
659 get_device(&tb->dev);
660 return tb;
661}
662
663static inline void tb_domain_put(struct tb *tb)
664{
665 put_device(&tb->dev);
666}
667
668struct tb_nvm *tb_nvm_alloc(struct device *dev);
669int tb_nvm_add_active(struct tb_nvm *nvm, size_t size, nvmem_reg_read_t reg_read);
670int tb_nvm_write_buf(struct tb_nvm *nvm, unsigned int offset, void *val,
671 size_t bytes);
672int tb_nvm_add_non_active(struct tb_nvm *nvm, size_t size,
673 nvmem_reg_write_t reg_write);
674void tb_nvm_free(struct tb_nvm *nvm);
675void tb_nvm_exit(void);
676
677struct tb_switch *tb_switch_alloc(struct tb *tb, struct device *parent,
678 u64 route);
679struct tb_switch *tb_switch_alloc_safe_mode(struct tb *tb,
680 struct device *parent, u64 route);
681int tb_switch_configure(struct tb_switch *sw);
682int tb_switch_add(struct tb_switch *sw);
683void tb_switch_remove(struct tb_switch *sw);
684void tb_switch_suspend(struct tb_switch *sw, bool runtime);
685int tb_switch_resume(struct tb_switch *sw);
686int tb_switch_reset(struct tb_switch *sw);
687void tb_sw_set_unplugged(struct tb_switch *sw);
688struct tb_port *tb_switch_find_port(struct tb_switch *sw,
689 enum tb_port_type type);
690struct tb_switch *tb_switch_find_by_link_depth(struct tb *tb, u8 link,
691 u8 depth);
692struct tb_switch *tb_switch_find_by_uuid(struct tb *tb, const uuid_t *uuid);
693struct tb_switch *tb_switch_find_by_route(struct tb *tb, u64 route);
694
695
696
697
698
699
700
701
702#define tb_switch_for_each_port(sw, p) \
703 for ((p) = &(sw)->ports[1]; \
704 (p) <= &(sw)->ports[(sw)->config.max_port_number]; (p)++)
705
706static inline struct tb_switch *tb_switch_get(struct tb_switch *sw)
707{
708 if (sw)
709 get_device(&sw->dev);
710 return sw;
711}
712
713static inline void tb_switch_put(struct tb_switch *sw)
714{
715 put_device(&sw->dev);
716}
717
718static inline bool tb_is_switch(const struct device *dev)
719{
720 return dev->type == &tb_switch_type;
721}
722
723static inline struct tb_switch *tb_to_switch(struct device *dev)
724{
725 if (tb_is_switch(dev))
726 return container_of(dev, struct tb_switch, dev);
727 return NULL;
728}
729
730static inline struct tb_switch *tb_switch_parent(struct tb_switch *sw)
731{
732 return tb_to_switch(sw->dev.parent);
733}
734
735static inline bool tb_switch_is_light_ridge(const struct tb_switch *sw)
736{
737 return sw->config.vendor_id == PCI_VENDOR_ID_INTEL &&
738 sw->config.device_id == PCI_DEVICE_ID_INTEL_LIGHT_RIDGE;
739}
740
741static inline bool tb_switch_is_eagle_ridge(const struct tb_switch *sw)
742{
743 return sw->config.vendor_id == PCI_VENDOR_ID_INTEL &&
744 sw->config.device_id == PCI_DEVICE_ID_INTEL_EAGLE_RIDGE;
745}
746
747static inline bool tb_switch_is_cactus_ridge(const struct tb_switch *sw)
748{
749 if (sw->config.vendor_id == PCI_VENDOR_ID_INTEL) {
750 switch (sw->config.device_id) {
751 case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_2C:
752 case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C:
753 return true;
754 }
755 }
756 return false;
757}
758
759static inline bool tb_switch_is_falcon_ridge(const struct tb_switch *sw)
760{
761 if (sw->config.vendor_id == PCI_VENDOR_ID_INTEL) {
762 switch (sw->config.device_id) {
763 case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_BRIDGE:
764 case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_BRIDGE:
765 return true;
766 }
767 }
768 return false;
769}
770
771static inline bool tb_switch_is_alpine_ridge(const struct tb_switch *sw)
772{
773 if (sw->config.vendor_id == PCI_VENDOR_ID_INTEL) {
774 switch (sw->config.device_id) {
775 case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_2C_BRIDGE:
776 case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_LP_BRIDGE:
777 case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_4C_BRIDGE:
778 case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_2C_BRIDGE:
779 return true;
780 }
781 }
782 return false;
783}
784
785static inline bool tb_switch_is_titan_ridge(const struct tb_switch *sw)
786{
787 if (sw->config.vendor_id == PCI_VENDOR_ID_INTEL) {
788 switch (sw->config.device_id) {
789 case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_BRIDGE:
790 case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_BRIDGE:
791 case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_BRIDGE:
792 return true;
793 }
794 }
795 return false;
796}
797
798
799
800
801
802
803
804static inline bool tb_switch_is_usb4(const struct tb_switch *sw)
805{
806 return sw->config.thunderbolt_version == USB4_VERSION_1_0;
807}
808
809
810
811
812
813
814
815
816
817
818static inline bool tb_switch_is_icm(const struct tb_switch *sw)
819{
820 return !sw->config.enabled;
821}
822
823int tb_switch_lane_bonding_enable(struct tb_switch *sw);
824void tb_switch_lane_bonding_disable(struct tb_switch *sw);
825int tb_switch_configure_link(struct tb_switch *sw);
826void tb_switch_unconfigure_link(struct tb_switch *sw);
827
828bool tb_switch_query_dp_resource(struct tb_switch *sw, struct tb_port *in);
829int tb_switch_alloc_dp_resource(struct tb_switch *sw, struct tb_port *in);
830void tb_switch_dealloc_dp_resource(struct tb_switch *sw, struct tb_port *in);
831
832int tb_switch_tmu_init(struct tb_switch *sw);
833int tb_switch_tmu_post_time(struct tb_switch *sw);
834int tb_switch_tmu_disable(struct tb_switch *sw);
835int tb_switch_tmu_enable(struct tb_switch *sw);
836
837static inline bool tb_switch_tmu_is_enabled(const struct tb_switch *sw)
838{
839 return sw->tmu.rate == TB_SWITCH_TMU_RATE_HIFI &&
840 !sw->tmu.unidirectional;
841}
842
843int tb_wait_for_port(struct tb_port *port, bool wait_if_unplugged);
844int tb_port_add_nfc_credits(struct tb_port *port, int credits);
845int tb_port_clear_counter(struct tb_port *port, int counter);
846int tb_port_unlock(struct tb_port *port);
847int tb_port_enable(struct tb_port *port);
848int tb_port_disable(struct tb_port *port);
849int tb_port_alloc_in_hopid(struct tb_port *port, int hopid, int max_hopid);
850void tb_port_release_in_hopid(struct tb_port *port, int hopid);
851int tb_port_alloc_out_hopid(struct tb_port *port, int hopid, int max_hopid);
852void tb_port_release_out_hopid(struct tb_port *port, int hopid);
853struct tb_port *tb_next_port_on_path(struct tb_port *start, struct tb_port *end,
854 struct tb_port *prev);
855
856
857
858
859
860
861
862
863
864#define tb_for_each_port_on_path(src, dst, p) \
865 for ((p) = tb_next_port_on_path((src), (dst), NULL); (p); \
866 (p) = tb_next_port_on_path((src), (dst), (p)))
867
868int tb_port_get_link_speed(struct tb_port *port);
869int tb_port_get_link_width(struct tb_port *port);
870int tb_port_state(struct tb_port *port);
871int tb_port_lane_bonding_enable(struct tb_port *port);
872void tb_port_lane_bonding_disable(struct tb_port *port);
873
874int tb_switch_find_vse_cap(struct tb_switch *sw, enum tb_switch_vse_cap vsec);
875int tb_switch_find_cap(struct tb_switch *sw, enum tb_switch_cap cap);
876int tb_switch_next_cap(struct tb_switch *sw, unsigned int offset);
877int tb_port_find_cap(struct tb_port *port, enum tb_port_cap cap);
878int tb_port_next_cap(struct tb_port *port, unsigned int offset);
879bool tb_port_is_enabled(struct tb_port *port);
880
881bool tb_usb3_port_is_enabled(struct tb_port *port);
882int tb_usb3_port_enable(struct tb_port *port, bool enable);
883
884bool tb_pci_port_is_enabled(struct tb_port *port);
885int tb_pci_port_enable(struct tb_port *port, bool enable);
886
887int tb_dp_port_hpd_is_active(struct tb_port *port);
888int tb_dp_port_hpd_clear(struct tb_port *port);
889int tb_dp_port_set_hops(struct tb_port *port, unsigned int video,
890 unsigned int aux_tx, unsigned int aux_rx);
891bool tb_dp_port_is_enabled(struct tb_port *port);
892int tb_dp_port_enable(struct tb_port *port, bool enable);
893
894struct tb_path *tb_path_discover(struct tb_port *src, int src_hopid,
895 struct tb_port *dst, int dst_hopid,
896 struct tb_port **last, const char *name);
897struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid,
898 struct tb_port *dst, int dst_hopid, int link_nr,
899 const char *name);
900void tb_path_free(struct tb_path *path);
901int tb_path_activate(struct tb_path *path);
902void tb_path_deactivate(struct tb_path *path);
903bool tb_path_is_invalid(struct tb_path *path);
904bool tb_path_port_on_path(const struct tb_path *path,
905 const struct tb_port *port);
906
907int tb_drom_read(struct tb_switch *sw);
908int tb_drom_read_uid_only(struct tb_switch *sw, u64 *uid);
909
910int tb_lc_read_uuid(struct tb_switch *sw, u32 *uuid);
911int tb_lc_configure_port(struct tb_port *port);
912void tb_lc_unconfigure_port(struct tb_port *port);
913int tb_lc_configure_xdomain(struct tb_port *port);
914void tb_lc_unconfigure_xdomain(struct tb_port *port);
915int tb_lc_start_lane_initialization(struct tb_port *port);
916int tb_lc_set_wake(struct tb_switch *sw, unsigned int flags);
917int tb_lc_set_sleep(struct tb_switch *sw);
918bool tb_lc_lane_bonding_possible(struct tb_switch *sw);
919bool tb_lc_dp_sink_query(struct tb_switch *sw, struct tb_port *in);
920int tb_lc_dp_sink_alloc(struct tb_switch *sw, struct tb_port *in);
921int tb_lc_dp_sink_dealloc(struct tb_switch *sw, struct tb_port *in);
922int tb_lc_force_power(struct tb_switch *sw);
923
924static inline int tb_route_length(u64 route)
925{
926 return (fls64(route) + TB_ROUTE_SHIFT - 1) / TB_ROUTE_SHIFT;
927}
928
929
930
931
932
933
934
935
936static inline u64 tb_downstream_route(struct tb_port *port)
937{
938 return tb_route(port->sw)
939 | ((u64) port->port << (port->sw->config.depth * 8));
940}
941
942bool tb_is_xdomain_enabled(void);
943bool tb_xdomain_handle_request(struct tb *tb, enum tb_cfg_pkg_type type,
944 const void *buf, size_t size);
945struct tb_xdomain *tb_xdomain_alloc(struct tb *tb, struct device *parent,
946 u64 route, const uuid_t *local_uuid,
947 const uuid_t *remote_uuid);
948void tb_xdomain_add(struct tb_xdomain *xd);
949void tb_xdomain_remove(struct tb_xdomain *xd);
950struct tb_xdomain *tb_xdomain_find_by_link_depth(struct tb *tb, u8 link,
951 u8 depth);
952
953int tb_retimer_scan(struct tb_port *port);
954void tb_retimer_remove_all(struct tb_port *port);
955
956static inline bool tb_is_retimer(const struct device *dev)
957{
958 return dev->type == &tb_retimer_type;
959}
960
961static inline struct tb_retimer *tb_to_retimer(struct device *dev)
962{
963 if (tb_is_retimer(dev))
964 return container_of(dev, struct tb_retimer, dev);
965 return NULL;
966}
967
968int usb4_switch_setup(struct tb_switch *sw);
969int usb4_switch_read_uid(struct tb_switch *sw, u64 *uid);
970int usb4_switch_drom_read(struct tb_switch *sw, unsigned int address, void *buf,
971 size_t size);
972bool usb4_switch_lane_bonding_possible(struct tb_switch *sw);
973int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags);
974int usb4_switch_set_sleep(struct tb_switch *sw);
975int usb4_switch_nvm_sector_size(struct tb_switch *sw);
976int usb4_switch_nvm_read(struct tb_switch *sw, unsigned int address, void *buf,
977 size_t size);
978int usb4_switch_nvm_write(struct tb_switch *sw, unsigned int address,
979 const void *buf, size_t size);
980int usb4_switch_nvm_authenticate(struct tb_switch *sw);
981int usb4_switch_nvm_authenticate_status(struct tb_switch *sw, u32 *status);
982bool usb4_switch_query_dp_resource(struct tb_switch *sw, struct tb_port *in);
983int usb4_switch_alloc_dp_resource(struct tb_switch *sw, struct tb_port *in);
984int usb4_switch_dealloc_dp_resource(struct tb_switch *sw, struct tb_port *in);
985struct tb_port *usb4_switch_map_pcie_down(struct tb_switch *sw,
986 const struct tb_port *port);
987struct tb_port *usb4_switch_map_usb3_down(struct tb_switch *sw,
988 const struct tb_port *port);
989
990int usb4_port_unlock(struct tb_port *port);
991int usb4_port_configure(struct tb_port *port);
992void usb4_port_unconfigure(struct tb_port *port);
993int usb4_port_configure_xdomain(struct tb_port *port);
994void usb4_port_unconfigure_xdomain(struct tb_port *port);
995int usb4_port_enumerate_retimers(struct tb_port *port);
996
997int usb4_port_retimer_read(struct tb_port *port, u8 index, u8 reg, void *buf,
998 u8 size);
999int usb4_port_retimer_write(struct tb_port *port, u8 index, u8 reg,
1000 const void *buf, u8 size);
1001int usb4_port_retimer_is_last(struct tb_port *port, u8 index);
1002int usb4_port_retimer_nvm_sector_size(struct tb_port *port, u8 index);
1003int usb4_port_retimer_nvm_write(struct tb_port *port, u8 index,
1004 unsigned int address, const void *buf,
1005 size_t size);
1006int usb4_port_retimer_nvm_authenticate(struct tb_port *port, u8 index);
1007int usb4_port_retimer_nvm_authenticate_status(struct tb_port *port, u8 index,
1008 u32 *status);
1009int usb4_port_retimer_nvm_read(struct tb_port *port, u8 index,
1010 unsigned int address, void *buf, size_t size);
1011
1012int usb4_usb3_port_max_link_rate(struct tb_port *port);
1013int usb4_usb3_port_actual_link_rate(struct tb_port *port);
1014int usb4_usb3_port_allocated_bandwidth(struct tb_port *port, int *upstream_bw,
1015 int *downstream_bw);
1016int usb4_usb3_port_allocate_bandwidth(struct tb_port *port, int *upstream_bw,
1017 int *downstream_bw);
1018int usb4_usb3_port_release_bandwidth(struct tb_port *port, int *upstream_bw,
1019 int *downstream_bw);
1020
1021
1022#define QUIRK_FORCE_POWER_LINK_CONTROLLER BIT(0)
1023
1024void tb_check_quirks(struct tb_switch *sw);
1025
1026#ifdef CONFIG_ACPI
1027void tb_acpi_add_links(struct tb_nhi *nhi);
1028
1029bool tb_acpi_is_native(void);
1030bool tb_acpi_may_tunnel_usb3(void);
1031bool tb_acpi_may_tunnel_dp(void);
1032bool tb_acpi_may_tunnel_pcie(void);
1033bool tb_acpi_is_xdomain_allowed(void);
1034#else
1035static inline void tb_acpi_add_links(struct tb_nhi *nhi) { }
1036
1037static inline bool tb_acpi_is_native(void) { return true; }
1038static inline bool tb_acpi_may_tunnel_usb3(void) { return true; }
1039static inline bool tb_acpi_may_tunnel_dp(void) { return true; }
1040static inline bool tb_acpi_may_tunnel_pcie(void) { return true; }
1041static inline bool tb_acpi_is_xdomain_allowed(void) { return true; }
1042#endif
1043
1044#ifdef CONFIG_DEBUG_FS
1045void tb_debugfs_init(void);
1046void tb_debugfs_exit(void);
1047void tb_switch_debugfs_init(struct tb_switch *sw);
1048void tb_switch_debugfs_remove(struct tb_switch *sw);
1049void tb_service_debugfs_init(struct tb_service *svc);
1050void tb_service_debugfs_remove(struct tb_service *svc);
1051#else
1052static inline void tb_debugfs_init(void) { }
1053static inline void tb_debugfs_exit(void) { }
1054static inline void tb_switch_debugfs_init(struct tb_switch *sw) { }
1055static inline void tb_switch_debugfs_remove(struct tb_switch *sw) { }
1056static inline void tb_service_debugfs_init(struct tb_service *svc) { }
1057static inline void tb_service_debugfs_remove(struct tb_service *svc) { }
1058#endif
1059
1060#ifdef CONFIG_USB4_KUNIT_TEST
1061int tb_test_init(void);
1062void tb_test_exit(void);
1063#else
1064static inline int tb_test_init(void) { return 0; }
1065static inline void tb_test_exit(void) { }
1066#endif
1067
1068#endif
1069