1 // SPDX-License-Identifier: GPL-2.0
3 * Thunderbolt driver - quirks
5 * Copyright (c) 2020 Mario Limonciello <mario.limonciello@dell.com>
10 static void quirk_force_power_link(struct tb_switch
*sw
)
12 sw
->quirks
|= QUIRK_FORCE_POWER_LINK_CONTROLLER
;
13 tb_sw_dbg(sw
, "forcing power to link controller\n");
16 static void quirk_dp_credit_allocation(struct tb_switch
*sw
)
18 if (sw
->credit_allocation
&& sw
->min_dp_main_credits
== 56) {
19 sw
->min_dp_main_credits
= 18;
20 tb_sw_dbg(sw
, "quirked DP main: %u\n", sw
->min_dp_main_credits
);
24 static void quirk_clx_disable(struct tb_switch
*sw
)
26 sw
->quirks
|= QUIRK_NO_CLX
;
27 tb_sw_dbg(sw
, "disabling CL states\n");
30 static void quirk_usb3_maximum_bandwidth(struct tb_switch
*sw
)
34 if (tb_switch_is_icm(sw
))
37 tb_switch_for_each_port(sw
, port
) {
38 if (!tb_port_is_usb3_down(port
))
41 tb_port_dbg(port
, "USB3 maximum bandwidth limited to %u Mb/s\n",
46 static void quirk_block_rpm_in_redrive(struct tb_switch
*sw
)
48 sw
->quirks
|= QUIRK_KEEP_POWER_IN_DP_REDRIVE
;
49 tb_sw_dbg(sw
, "preventing runtime PM in DP redrive mode\n");
57 void (*hook
)(struct tb_switch
*sw
);
60 static const struct tb_quirk tb_quirks
[] = {
61 /* Dell WD19TB supports self-authentication on unplug */
62 { 0x0000, 0x0000, 0x00d4, 0xb070, quirk_force_power_link
},
63 { 0x0000, 0x0000, 0x00d4, 0xb071, quirk_force_power_link
},
65 * Intel Goshen Ridge NVM 27 and before report wrong number of
68 { 0x8087, 0x0b26, 0x0000, 0x0000, quirk_dp_credit_allocation
},
70 * Limit the maximum USB3 bandwidth for the following Intel USB4
71 * host routers due to a hardware issue.
73 { 0x8087, PCI_DEVICE_ID_INTEL_ADL_NHI0
, 0x0000, 0x0000,
74 quirk_usb3_maximum_bandwidth
},
75 { 0x8087, PCI_DEVICE_ID_INTEL_ADL_NHI1
, 0x0000, 0x0000,
76 quirk_usb3_maximum_bandwidth
},
77 { 0x8087, PCI_DEVICE_ID_INTEL_RPL_NHI0
, 0x0000, 0x0000,
78 quirk_usb3_maximum_bandwidth
},
79 { 0x8087, PCI_DEVICE_ID_INTEL_RPL_NHI1
, 0x0000, 0x0000,
80 quirk_usb3_maximum_bandwidth
},
81 { 0x8087, PCI_DEVICE_ID_INTEL_MTL_M_NHI0
, 0x0000, 0x0000,
82 quirk_usb3_maximum_bandwidth
},
83 { 0x8087, PCI_DEVICE_ID_INTEL_MTL_P_NHI0
, 0x0000, 0x0000,
84 quirk_usb3_maximum_bandwidth
},
85 { 0x8087, PCI_DEVICE_ID_INTEL_MTL_P_NHI1
, 0x0000, 0x0000,
86 quirk_usb3_maximum_bandwidth
},
87 { 0x8087, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI
, 0x0000, 0x0000,
88 quirk_usb3_maximum_bandwidth
},
89 { 0x8087, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI
, 0x0000, 0x0000,
90 quirk_usb3_maximum_bandwidth
},
91 { 0x8087, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HUB_80G_BRIDGE
, 0x0000, 0x0000,
92 quirk_usb3_maximum_bandwidth
},
93 { 0x8087, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HUB_40G_BRIDGE
, 0x0000, 0x0000,
94 quirk_usb3_maximum_bandwidth
},
96 * Block Runtime PM in DP redrive mode for Intel Barlow Ridge host
99 { 0x8087, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI
, 0x0000, 0x0000,
100 quirk_block_rpm_in_redrive
},
101 { 0x8087, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI
, 0x0000, 0x0000,
102 quirk_block_rpm_in_redrive
},
104 * CLx is not supported on AMD USB4 Yellow Carp and Pink Sardine platforms.
106 { 0x0438, 0x0208, 0x0000, 0x0000, quirk_clx_disable
},
107 { 0x0438, 0x0209, 0x0000, 0x0000, quirk_clx_disable
},
108 { 0x0438, 0x020a, 0x0000, 0x0000, quirk_clx_disable
},
109 { 0x0438, 0x020b, 0x0000, 0x0000, quirk_clx_disable
},
113 * tb_check_quirks() - Check for quirks to apply
114 * @sw: Thunderbolt switch
116 * Apply any quirks for the Thunderbolt controller.
118 void tb_check_quirks(struct tb_switch
*sw
)
122 for (i
= 0; i
< ARRAY_SIZE(tb_quirks
); i
++) {
123 const struct tb_quirk
*q
= &tb_quirks
[i
];
125 if (q
->hw_vendor_id
&& q
->hw_vendor_id
!= sw
->config
.vendor_id
)
127 if (q
->hw_device_id
&& q
->hw_device_id
!= sw
->config
.device_id
)
129 if (q
->vendor
&& q
->vendor
!= sw
->vendor
)
131 if (q
->device
&& q
->device
!= sw
->device
)
134 tb_sw_dbg(sw
, "running %ps\n", q
->hook
);