我有一台带有 Supermicro C9Z390-PGW 主板的服务器,我需要为其添加 Thunderbolt 3 连接,因此我购买了 Gigabyte GC-Titan Ridge Rev 2.0 附加卡。但是,打开机器后它没有显示,lspci
如果我插入 Thunderbolt 设备,虽然该设备确实通电,但 Linux 无法识别新设备。
答案1
网上有很多针对此类问题的指南,但其中很多已经过时了,所以希望这对在 2021 年以上遇到此问题的人有所帮助。这些说明在带有 Linux 内核 5.11 的 Ubuntu 21.04 上进行了测试,可能不适用于旧内核(缺少补丁)。
这里的问题是,许多主板 BIOS 无法正确初始化 Thunderbolt 控制器,因此 Linux 无法使用它们。具体来说,BIOS 需要执行两个功能:
- 打开 Thunderbolt 控制器的电源,以便 Linux 可以识别它
- 为要添加的任何热插拔设备保留 PCIe 总线号
幸运的是,这两种问题都可以解决,无需制造商提供 BIOS 更新。对于第一个问题,附加卡有 GPIO,如果桥接,将强制为 Thunderbolt 控制器供电。在 GC-Titan Ridge Rev 2.0 卡上,桥接的适当引脚是引脚 3 和 5(从底部/左侧开始计算)。这是正确的桥接引脚的图片。在其他卡上,GPIO 的引脚排列可能不同。在尝试此操作之前,请确保您的卡匹配,因为错误的桥接可能会损坏您的设备。(当然,切勿在设备通电时尝试进行任何桥接)。
完成后,如果您启动服务器,雷电控制器应该会出现在 PCIe 中:
$ lspci | grep "USB controller"
37:00.0 USB controller: Intel Corporation JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 4C 2018] (rev 06)
然而,热插拔可能仍然不起作用,并导致如下错误:
No bus number available for hot-added bridge.
这是上面的问题 #2。要修复此问题,我们需要更改内核参数以保留热插拔设备的总线号。这可以通过编辑GRUB_CMDLINE_LINUX_DEFAULT
并/etc/default/grub
随后运行来实现sudo update-grub
。
具体来说,对于我们的问题,我们可以添加以下内容GRUB_CMDLINE_LINUX_DEFAULT
:
pci=assign-busses,realloc,hpbussize=0x10,hpmmiosize=128M,hpmmioprefsize=1G
这些选项如下:
assign-busses
- 强制覆盖固件所做的 PCIe 总线分配(这会导致无法为雷电设备分配任何总线)realloc
- 强制重新分配 PCIe 桥接范围hpbussize
- 为热插拔预留的总线数量。这取决于您要添加的设备。我将其设置为0x10
上述值,这似乎很合理,但如果您再次看到总线数量不足错误,则可能需要增加此值。hpmmiosize
- 为热插拔的 PCIe 设备保留的非预取地址空间量。这同样取决于您要添加的设备。这将设置为 128M,但如果您有大量设备或具有较大 BAR 的设备,则可能需要增加此值。将此值设置得太大可能会耗尽可用的 PCIe MMIO 空间并阻止设备正常工作。hpmmioprefsize
- 与其他参数类似,不同之处在于这会为 PCIe 条预分配可预取内存 (MMIO_PREF)。这是独立的,设备通常需要比常规 MMIO 空间更多的 MMIO_PREF 空间。
请注意,在内核版本 5.6 之前,hpmmiosize
和hpmmioprefsize
曾经只是简单地hpmemsize
,它会覆盖两者,但很容易陷入hpmmiosize
太大而无法容纳的情况,而桥接器后面的设备实际上只需要更多MMIO_PREF
空间,因此参数被拆分。
编写该内核补丁的人还有一个指南,可让此补丁适用于较旧的内核和其他带有适当内核补丁的附加卡,我将在此处提供链接:https://egpu.io/forums/thunderbolt-enclosures/pdf-guide-and-patches-for-making-linux-v5-3-kernel-to-work-with-thunderbolt-3-add-in-card/。
附录
以下是有关连接器桥接工作原理的更多信息。我们桥接的连接器称为 THB-C 连接器或 TBHEADER。它没有记录,但从公共主板文档中,我们可以看到引脚排列是
5 Force Power (Thunderbolt Controller POC_GPIO_3 aka TBT_FORCE_PWR)
4 Plug Event (Thunderbolt Controller GPIO_5 aka TBT_CIO_PLUG_EVENT#)
3 S3 Sleep Indication (Thunderbolt Controller POC_GPIO_5 aka TBT_SLP_S3#)
2 S4_S5 (Not much info on this, potentially wired to RESET_N on the Thunderbolt controller)
1 GND
S3 睡眠指示通常似乎只是连接到常规主板 SLP3# 信号(在主板侧),而其他两个连接到 PCH GPIO。具体来说,这些控制器似乎实现了一种省电模式,在这种模式下,它们停止解码 PCIe 事务到 NHI,而 NHI 是 Linux 驱动程序正在寻找的 PCIe 设备。因此,我们在这里所做的实际上是强制引脚Force Power
为高电平(这有效,因为 TBT_SLP_S3# 恰好在设备侧处于上拉状态),这会强制控制器不进入省电模式(即任何 3.3V 电源可能都可以在这里使用,但如果您在主板上找到一个,您可能需要串联一个电阻以确保安全)。
总体而言,这种桥接在没有特殊雷电接头的主板上应该是完全安全的,但如果设备插入雷电桥,系统可能会出现 S3 睡眠状态无法正常运行的问题。