我已将使用 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
,它可能会在不合格的卡上崩溃,但请尝试一下)。因此,请根据结果编辑您的问题。通过这种方式,人们应该看看类是否是唯一需要修复的值,或者是否还有更多值。