我如何控制 pci 设备的安装位置?

我如何控制 pci 设备的安装位置?

我有一台机器,在 PCI Express 插槽中有多张捕获卡。为了便于解决问题,我希望在将设备插入或从机器上拔出时,这些设备按其物理位置的顺序显示在操作系统上。以下是我从命令中获取的设备列表lspci | grep lackmagic

0a:00.0 Multimedia video controller: Blackmagic Design Device a117
0d:00.0 Multimedia video controller: Blackmagic Design Device a117
10:00.0 Multimedia video controller: Blackmagic Design Device a117
18:00.0 Multimedia video controller: Blackmagic Design Device a117
1b:00.0 Multimedia video controller: Blackmagic Design Device a117
1e:00.0 Multimedia video controller: Blackmagic Design Device a117
21:00.0 Multimedia video controller: Blackmagic Design Device a117
24:00.0 Multimedia video controller: Blackmagic Design Device a117

以下 是 我 的 相关 内容dmesg | grep lackmagic.

[   16.105068] blackmagic: module license 'Proprietary' taints kernel.
[   16.110742] blackmagic: Loading driver (version: 8.0.1rc4)
[   16.111152] blackmagic_driver 0000:0a:00.0: PCI INT A -> GSI 28 (level, low) -> IRQ 28
[   16.111163] blackmagic_driver 0000:0a:00.0: setting latency timer to 64
[   16.111215] blackmagic_driver 0000:0a:00.0: setting latency timer to 64
[   18.248018] blackmagic: Successfully loaded device "blackmagic0" [pci@0000:0a:00.0]
[   18.248136] blackmagic_driver 0000:10:00.0: PCI INT A -> GSI 26 (level, low) -> IRQ 26
[   18.248142] blackmagic_driver 0000:10:00.0: setting latency timer to 64
[   18.248175] blackmagic_driver 0000:10:00.0: setting latency timer to 64
[   20.372321] blackmagic: Successfully loaded device "blackmagic1" [pci@0000:10:00.0]
[   20.372483] blackmagic_driver 0000:0d:00.0: PCI INT A -> GSI 30 (level, low) -> IRQ 30
[   20.372489] blackmagic_driver 0000:0d:00.0: setting latency timer to 64
[   20.372520] blackmagic_driver 0000:0d:00.0: setting latency timer to 64
[   22.497786] blackmagic: Successfully loaded device "blackmagic2" [pci@0000:0d:00.0]
[   22.497929] blackmagic_driver 0000:18:00.0: PCI INT A -> GSI 52 (level, low) -> IRQ 52
[   22.497937] blackmagic_driver 0000:18:00.0: setting latency timer to 64
[   22.497976] blackmagic_driver 0000:18:00.0: setting latency timer to 64
[   24.621774] blackmagic: Successfully loaded device "blackmagic3" [pci@0000:18:00.0]
[   24.621906] blackmagic_driver 0000:21:00.0: PCI INT A -> GSI 48 (level, low) -> IRQ 48
[   24.621912] blackmagic_driver 0000:21:00.0: setting latency timer to 64
[   24.621946] blackmagic_driver 0000:21:00.0: setting latency timer to 64
[   26.745616] blackmagic: Successfully loaded device "blackmagic4" [pci@0000:21:00.0]
[   26.745737] blackmagic_driver 0000:24:00.0: PCI INT A -> GSI 54 (level, low) -> IRQ 54
[   26.745742] blackmagic_driver 0000:24:00.0: setting latency timer to 64
[   26.745775] blackmagic_driver 0000:24:00.0: setting latency timer to 64
[   28.870874] blackmagic: Successfully loaded device "blackmagic5" [pci@0000:24:00.0]
[   28.870994] blackmagic_driver 0000:1e:00.0: PCI INT A -> GSI 55 (level, low) -> IRQ 55
[   28.871001] blackmagic_driver 0000:1e:00.0: setting latency timer to 64
[   28.871036] blackmagic_driver 0000:1e:00.0: setting latency timer to 64
[   30.995130] blackmagic: Successfully loaded device "blackmagic6" [pci@0000:1e:00.0]
[   30.995277] blackmagic_driver 0000:1b:00.0: PCI INT A -> GSI 56 (level, low) -> IRQ 56
[   30.995284] blackmagic_driver 0000:1b:00.0: setting latency timer to 64
[   30.995326] blackmagic_driver 0000:1b:00.0: setting latency timer to 64
[   33.118817] blackmagic: Successfully loaded device "blackmagic7" [pci@0000:1b:00.0]

目前,如果我取出,比如说,卡 3,那么我将没有 blackmagic0 blackmagic1 blackmagic2 blackmagic4 blackmagic5 blackmagic6 blackmagic7,而是它们被重新映射,以便我拥有剩下的 7 个设备blackmagic0-6

  1. 这些数字像 0a:00.0 是什么?它们是否与 PCI 插槽的物理地址相关,即,当我摆弄其他 PCI 设备或在操作系统的启动过程中进行更改时,我是否可以合理地期望这些数字不会改变?

  2. 我可以控制卡的安装位置吗,这样/dev/blackmagic3当我查看机器时,它将与位于后面第四个的设备相对应?最好当我移除一张卡时,其他卡的地址不会重新映射到较低的数字?我听说这可能可以通过 udev 规则实现。

  3. 失败2,是否可以可靠且重复地确定设备名称到其物理位置的映射,以便我可以使用符号链接对它们重新排序?

我正在使用 Ubuntu 11.04。

编辑: 一些进一步的信息,这是文件的当前内容/etc/udev/rules.d/20-blackmagic.rules

KERNEL=="blackmagic[0-9]*", NAME="blackmagic/card%n", MODE="0666", GROUP="video", RUN+="/usr/lib64/blackmagic/BlackmagicPreferencesStartup %n", OPTIONS="last_rule"
KERNEL=="blackmagic_serial[0-9]*", NAME="blackmagic/serial%n", MODE="0666", GROUP="video", OPTIONS="last_rule"

答案1

像“0a:00.0”这样的数字是与 PCI 插槽关联的 PCI 总线地址。这些是一致的映射 - 给定插槽中的卡将始终具有相同的 PCI 总线地址。

设备将按照出现的顺序进行枚举,因此如果您删除设备,它将按照您的建议重新排列列表。您可能能够使用 udev 更改此行为,但创建符号链接可能更容易。

您可以凭经验确定哪个 PCI 地址映射到哪个插槽(例如,将卡放入插槽 1,记录总线地址,重复),或者如果您非常幸运,则“biosdecode”输出中包含的总线地址到插槽的映射实际上会很有用。它在我见过的大多数主板上都没有用,因为它有重复的插槽名称,或者它们实际上与背面的任何逻辑顺序不对应。但是,一旦您自己计算出映射,它就不会改变。

无论如何,查看 biosdecode 和 dmidecode -t slot 的输出,您可能会发现一些有用的东西。否则,请手动进行映射。

(此外,PCI 映射可能会发生变化 - 如果您更改 BIOS 或 BIOS 选项,则可能会导致设备以不同的方式枚举。例如,如果板载 USB 控制器出现在 0b:00.00,并且您的 PCI 设备出现在 0a:00.0 和 0c:00.0,并且您禁用 USB 控制器,则可能会导致 0c:00.0 设备向下移至 0b:00.0。也可能不会。您的里程可能会有所不同)

相关内容