Linux 无法识别 Supermicro 主板上的 Thunderbolt 3 (Titan Ridge) 卡

Ken*_*her 4 linux pci-express supermicro thunderbolt

我有一台配备 Supermicro C9Z390-PGW 主板的服务器,需要添加 Thunderbolt 3 连接,因此我购买了 Gigabyte GC-Titan Ridge Rev 2.0 附加卡。但是,在打开机器电源后,它不会出现lspci,如果我插入 Thunderbolt 设备,当该设备确实通电时,Linux 无法识别新设备。

Ken*_*her 9

对于此类问题,网上有很多指南,但其中很多都已经过时,因此希望这对在 >= 2021 年遇到此问题的人有所帮助。这些说明已在具有 Linux 内核 5.11 的 Ubuntu 21.04 上进行了测试,可能不适用到较旧的内核(缺少补丁)。

\n

这里的问题是许多主板 BIOS 没有正确初始化 Thunderbolt 控制器,因此 Linux 无法使用它们。具体来说,BIOS 需要执行两个功能:

\n
    \n
  1. 打开 Thunderbolt 控制器电源,以便 Linux 能够识别它
  2. \n
  3. 为要添加的任何热插拔设备预留 PCIe 总线编号
  4. \n
\n

幸运的是,这两个问题都可以解决,无需制造商提供 BIOS 更新。对于第一个问题,附加卡具有 GPIO,如果桥接,将强制为 Thunderbolt 控制器供电。在 GC-Titan Ridge Rev 2.0 卡上,桥接的适当引脚是引脚 3 和 5(从底部/左侧开始计数)。这是要桥接的正确引脚的图片。在其他卡上,GPIO 的引脚排列可能不同。在尝试此操作之前,请务必确保您的卡匹配,因为不正确的桥接可能会损坏您的设备。(当然,切勿在设备开机时尝试进行任何桥接)。

\n

\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2 \xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2 \xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0桥接这些引脚

\n

完成此操作后,如果启动服务器,Thunderbolt 控制器应显示在 PCIe 中:

\n
$ lspci | grep "USB controller"\n37:00.0 USB controller: Intel Corporation JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 4C 2018] (rev 06)\n
Run Code Online (Sandbox Code Playgroud)\n

然而,热插拔可能仍然无法工作,导致如下错误:

\n
No bus number available for hot-added bridge.\n
Run Code Online (Sandbox Code Playgroud)\n

这是上面的问题#2。为了解决这个问题,我们需要更改内核参数\n为热插拔设备保留总线编号。GRUB_CMDLINE_LINUX_DEFAULT这可以通过编辑\ n/etc/default/grub然后运行来完成sudo update-grub

\n

特别是,对于我们的问题,我们可以添加以下内容GRUB_CMDLINE_LINUX_DEFAULT

\n
pci=assign-busses,realloc,hpbussize=0x10,hpmmiosize=128M,hpmmioprefsize=1G\n
Run Code Online (Sandbox Code Playgroud)\n

这些选项如下:

\n
    \n
  • assign-busses- 强制覆盖固件所做的 PCIe 总线分配(这将无法将任何总线分配给 Thunderbolt 设备)
  • \n
  • realloc- 强制重新分配 PCIe 桥接范围
  • \n
  • hpbussize- 为热插拔预留的总线数量。这取决于您要添加的设备。我将其设置为0x10上面的值,这似乎很合理,但如果您再次看到总线编号错误,您可能需要更改此设置。
  • \n
  • hpmmiosize- 为热插拔 PCIe 设备保留的不可预取地址空间量。这又取决于您要添加的设备。这将其设置为 128M,但如果您有大量设备,或者具有较大 BAR 的设备,您可能需要增加此值。将此值设置得太大可能会耗尽可用的 PCIe MMIO 空间并阻止设备正常工作。
  • \n
  • hpmmioprefsize- 与其他参数类似,不同之处在于此参数为 PCIe bar 预先分配可预取内存 (MMIO_PREF)。这是独立的,设备通常需要比常规 MMIO 空间更多的 MMIO_PREF 空间。
  • \n
\n

请注意,在内核版本 5.6 之前,hpmmiosize过去hpmmioprefsize是 simple hpmemsize,这会覆盖两者,但很容易陷入hpmmiosize太大而无法容纳的情况,而桥后面的设备实际上只需要更多MMIO_PREF空间,因此参数被拆分。

\n

编写上述内核补丁的人还提供了一个指南,可以使该功能适用​​于旧内核和其他带有适当内核补丁的附加卡,我将在此处链接:https ://egpu.io/forums/thunderbolt-enclosures/pdf -guide-and-patches-for-making-linux-v5-3-kernel-to-work-with-thunderbolt-3-add-in-card/

\n

附录

\n

以下是有关连接器桥接工作原理的更多信息。我们桥接的连接器称为 THB-C 连接器或 TBHEADER。它没有记录,但从公共主板文档中,我们可以看到引脚排列是

\n
5 Force Power (Thunderbolt Controller POC_GPIO_3 aka TBT_FORCE_PWR)\n4 Plug Event (Thunderbolt Controller GPIO_5 aka TBT_CIO_PLUG_EVENT#)\n3 S3 Sleep Indication (Thunderbolt Controller POC_GPIO_5 aka TBT_SLP_S3#)\n2 S4_S5 (Not much info on this, potentially wired to RESET_N on the Thunderbolt controller)\n1 GND\n
Run Code Online (Sandbox Code Playgroud)\n

S3 睡眠指示通常仅连接到常规主板 SLP3# 信号(在主板侧),而其他两个则连接到 PCH GPIO。特别是,这些控制器似乎实现了一种省电模式,在该模式下,它们停止解码到 NHI 的 PCIe 事务,NHI 是 Linux 驱动程序正在寻找的 PCIe 设备。因此,我们在这里所做的实际上是强制引脚Force Power拉高(这是有效的,因为 TBT_SLP_S3# 恰好位于设备端的上拉状态),这迫使控制器保持在省电模式之外(即任何 3.3 V源可能会在这里做,但如果你在主板上找到一个,你可能需要串联一个电阻以确保安全)。

\n

总的来说,这种桥接在没有特殊雷电接头的主板上似乎是完全安全的,尽管如果设备插入雷电桥,系统可能会出现 S3 睡眠状态无法正常运行的问题。

\n