在 MSI TRX40 主板上启用 SR-IOV

最近继续折腾很早之前买的线程撕裂者(装机回顾)。主板用的是MSI TRX40 PRO 10G,BIOS里有IOMMU选项,显卡直通也一直正常所以没多想。直到最近想折腾一下网卡SR-IOV,然后GG:

1
2
root# echo 1 > /sys/bus/pci/devices/0000:21:00.0/sriov_numvfs
kernel: cxgb4 0000:21:00.0: Parent bridge 20:03.1 doesn't support ARI; can't instantiate Virtual Functions

提示系统不支持 ARI (Alternative Routing-ID Interpretation)。看下PCIE根端口的状态,确实没开:

1
2
3
4
5
root# lspci -vv -s 20:03.1
20:03.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Starship/Matisse GPP Bridge (prog-if 00 [Normal decode])
Capabilities: [58] Express (v2) Root Port (Slot+), IntMsgNum 0
DevCap2: FRS- LN System CLS Not Supported, TPHComp+ ExtTPHComp- ARIFwd-
DevCtl2: Completion Timeout: 65ms to 210ms, TimeoutDis- ARIFwd-

在网上搜了一圈以后发现这个设置应该在一个叫AMD CBS的菜单里,然而这块主板并没有……

于是开始折腾“破解”BIOS设置,终于在浪费N个小时后发现一个叫 Universal AMD Form Browser (github) 的工具。尝试了一下确实可用。在CBS的NBIO菜单里把"ARI Support"和"ARI Enumeration"都Enable后就可以看到 ARIFwd 的减号变加号了。于是重新尝试,然而再次失败:

1
kernel: cxgb4 0000:21:00.0: not enough MMIO resources for SR-IOV

因为这个ARI功能是我们hack出来的,所以目测BIOS没有正确给VF预留足够的地址空间。只需要在内核参数加上pci=realloc,让Linux重新分配地址空间即可。