在 Debian 下安装 PCIe 至 PCI 可逆桥会导致“未分类设备”

在 Debian 下安装 PCIe 至 PCI 可逆桥会导致“未分类设备”

我已将使用 Pericom Semiconductor PI7C9X111SL 芯片的 PCIe 至 PCI 可逆桥安装到 Debian 计算机中。该 PCIe 卡拥有 2 个新的 PCI 卡插槽。该桥的 PCI ID 似乎是 12d8:e111。这些是(“Pericom”、“PI7C9X111SL”、“12d8”和“e111”)都列在 Linux PCI 文本文件中:

/usr/share/misc/pci.ids 

作为:

12d8  Pericom Semiconductor
e111  PI7C9X111SL PCIe-to-PCI Reversible Bridge

无论如何,当我输入“lspci -knn”时,我会看到以下行:

04:00.0 Non-VGA unclassified device [0000]: Pericom Semiconductor PI7C9X111SL PCIe-to-PCI Reversible Bridge [12d8:e111] (rev 02)

所以看起来 Debian 不知道如何处理这个 PCIe 卡。我想不出我的下一步行动。此计算机上的所有 Debian 软件包都是最新的。我正在运行 Debian 9.0 并且“uname -a”给出:

Linux ##### 4.9.0-1-amd64 #1 SMP Debian 4.9.6-3 (2017-01-28) x86_64 GNU/Linux

稍后添加...

启动 Debian 计算机后,我在 dmesg 中发现了以下相关日志:

[    0.220250] pci 0000:03:00.0: disabling ASPM on pre-1.1 PCIe device.  You can enable it with 'pcie_aspm=force'
[    0.220256] pci 0000:00:0c.0: PCI bridge to [bus 03]
[    0.220258] pci 0000:00:0c.0:   bridge window [io  0xa000-0xafff]
[    0.220260] pci 0000:00:0c.0:   bridge window [mem 0xfde00000-0xfdefffff]
[    0.220262] pci 0000:00:0c.0:   bridge window [mem 0xfdd00000-0xfddfffff 64bit pref]
[    0.224007] pci 0000:04:00.0: [12d8:e111] type 01 class 0xffffff
[    0.224011] pci 0000:04:00.0: ignoring class 0xffffff (doesn't match header type 01)

稍后添加,使用以下命令:

lspci -s 04:00.0 -xxx

我得到这样的回应:

04:00.0 Non-VGA unclassified device: Pericom Semiconductor PI7C9X111SL PCIe-to-PCI Reversible Bridge (rev ff)
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

我的假设是电路板制造商没有正确对芯片进行编程(如“根本不对其进行编程”)。我不确定在上面的数据中是否找到了“类”。如果它是上面数据中的位置。但考虑到类和以上数据都是 0xff,它看起来确实有罪。

奇怪的意外行为(一旦弄清楚,我将尝试编辑这个问题)。

如果我重复该命令:

lspci -s 04:00.0 -xxx

我得到了不同的结果。也许命令(或 PCI 桥)正在循环访问 EEPROM 存储器的不同页面,每个页面长 256 个字节?这似乎不太可能。或者,也许读取 EEPROM 并不可靠。而失败模式就是读回0xff。这更有意义。如果我读回 EEPROM 足够多,我最终会得到一个相当大的响应:

04:00.0 Non-VGA unclassified device: Pericom Semiconductor PI7C9X111SL PCIe-to-PCI Reversible Bridge (rev 02)
00: d8 12 11 e1 00 00 10 00 02 00 04 06 00 00 01 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 01 01 a0 02
20: 00 00 00 00 01 00 01 00 00 00 00 00 00 00 00 00
30: 00 00 00 00 80 00 00 00 00 00 00 00 00 01 00 00
40: 20 00 20 09 00 00 00 00 1f 80 40 00 00 00 00 00
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 08 00 b8 00 00 00 00
70: 80 00 00 00 00 00 00 00 00 00 00 d0 00 00 00 00
80: 07 90 00 00 f8 ff 00 00 10 00 10 00 10 00 10 00
90: 01 a8 43 c8 00 00 00 00 00 00 00 00 00 00 00 00
a0: 04 b0 00 00 ff ff ff ff ff ff ff ff ff ff ff ff
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

如果属实,则读取 EEPROM 不可靠,与 Pericom 芯片的其他通信可能存在问题。为了测试这一点,我现在想知道可以采取什么措施来缓解这个问题?如果可能的话,也许减慢/改变 PCIe 总线时钟?

答案1

部分答案:我可以告诉你出了什么问题,但我不知道如何解决它。

在 Linux 内核源代码中查找错误消息会导致drivers/pci/probe.c,这需要卡 (1) 的 PCIPCI_HEADER_TYPE_BRIDGE具有类PCI_CLASS_BRIDGE_PCI(0x0604)。但是您的 PCI 卡具有 0xffff 类(即,制造商/经销商未正确设置该类),因此驱动程序认为有些东西可疑,并且宁愿不使用此桥。如果桥没有由正确的驱动程序初始化,那么您当然不会看到其后面的任何卡。

解决这个问题的方法是(1)修补内核以为您的卡设置例外,或者(2)为该卡提供适当的类别。

谷歌搜索找到了该芯片的数据表这里,所以原则上我们拥有修复它所需的所有信息。关于配置寄存器映射 (6.1) 的部分表示该数据存储在 EEPROM 中,并针对 I2C 分别给出了以下注释。 SMBUS 访问:

注 1:当启用伪装时,它是可预加载的。
注 2:VPD 操作期间通过 I2C 读取/写入 VPD 数据。

因此,必须有可能以某种方式覆盖这些值。第 10 节对此有更多详细信息,但问题是 I2C/SMBus 是否首先连接到某处 - 因为它位于 PCIe 卡上,可能没有。然而,查看第 6.3.91/92 节,看起来可以通过 VPD 寄存器写入 EEPROM。弄清楚如何准确地做到这一点需要更多的工作,并且可能需要一个自己编写的 C 程序。

编辑:好像有一个文件vpd/sys/用于此类写访问。请查看是否/sys/bus/pci/devices/0000:04:00.0/存在并且在某处调用了一个文件vpd,或者是否由于错误的类而丢失了该文件。如果存在这样的文件,请hexdump -C对其进行操作,并使用结果编辑您的问题。

无论如何,在执行此操作之前,应该查看其余的配置空间值。您可以使用lspci -s 04:00.0 -x, 和lspci -s 04:00.0 -xxx来完成完整转储。 (手册页-xxx中有一个关于使用的警告lspci,它可能会在不合格的卡上崩溃,但请尝试一下)。因此,请根据结果编辑您的问题。通过这种方式,人们应该看看类是否是唯一需要修复的值,或者是否还有更多值。

相关内容