Linux 内核无法为 PCIe 桥后面的可预取 PCIE 设备创建地址

Linux 内核无法为 PCIe 桥后面的可预取 PCIE 设备创建地址

我的问题是:

我无法从具有两个不同 Linux 设备的 PCIe 桥后面的可预取端点设备获取 BAR 寻址。它们都运行内核版本 4.9.x。有人能帮我吗?

这是我到目前为止所做的:

1-我是有能力的获取地址可预取设备我的设备没有 PCIe 桥接器。虽然我无法对可预取设备执行读/写操作,但我不怀疑它来自等式的根复合体一侧。不过,我可以稍后为此建立一个主题。

2-我是有能力的获取地址不可预取设备没有 PCIe 桥。我还可以对它们进行内存操作。

3-我是无法获取地址PCIe 桥后面的单个可预取设备。我怀疑这可能是我遇到麻烦的主要原因。

4-我是有能力的获取地址PCIe 桥后面有多个不可预取设备。我还可以对两者执行内存操作。

5-我是无法获取地址同一 PCIe 桥后面的可预取和不可预取设备

我从实验中得出的结论:

案例 2 消除了对不可预取设备的怀疑。案例 4 澄清了 PCIE 桥的嫌疑。因此,我怀疑内核无法使用 PCIe 桥后面的可预取内存。我需要它。

剩下的事情在实验5中

当我使用 时lspci,我可以成功获取两个设备的供应商 ID、设备 ID 和设备类型,但它们的内存映射尚未完成。并且与这些设备相关的文件没有出现/sys/bus/pci_express/devices(我猜这是在这种情况下预期的)

以下是我在 dmesg 上找到的与设备相关的内容:

Device 0000:03:00.0,这是另一张具有端点功能的 Linux 卡,具有 8 MB + 8 MB 可预取内存和多媒体设备。

[    2.496007] pci 0000:03:00.0: [104c:b005] type 00 class 0x048000
[    2.496065] pci 0000:03:00.0: reg 0x10: [mem 0x00000000-0x007fffff]
[    2.496099] pci 0000:03:00.0: reg 0x14: [mem 0x00000000-0x007fffff pref]
[    2.496268] pci 0000:03:00.0: Max Payload Size set to 128 (was 256, max 256)
[    2.496605] iommu: Adding device 0000:03:00.0 to group 59
[    2.496610] arm-smmu: forcing sodev map for 0000:03:00.0
[    2.510188] pci 0000:03:00.0: BAR 0: no space for [mem size 0x00800000]
[    2.510192] pci 0000:03:00.0: BAR 0: failed to assign [mem size 0x00800000]
[    2.510196] pci 0000:03:00.0: BAR 1: no space for [mem size 0x00800000 pref]
[    2.510200] pci 0000:03:00.0: BAR 1: failed to assign [mem size 0x00800000 pref]
[    2.510942] pci 0000:03:00.0: Signaling PME through PCIe PME interrupt

Device 0000:04:00.0,是具有端点功能的 FPGA,具有 64 MB 不可预取存储器,作为未分配类设备。

[    2.497054] pci 0000:04:00.0: [1172:e001] type 00 class 0xff0000
[    2.497114] pci 0000:04:00.0: reg 0x10: [mem 0x00000000-0x03ffffff]
[    2.497691] iommu: Adding device 0000:04:00.0 to group 60
[    2.497696] arm-smmu: forcing sodev map for 0000:04:00.0
[    2.510254] pci 0000:04:00.0: BAR 0: no space for [mem size 0x04000000]
[    2.510259] pci 0000:04:00.0: BAR 0: failed to assign [mem size 0x04000000]
[    2.510949] pci 0000:04:00.0: Signaling PME through PCIe PME interrupt

dmesg 输出指出我要搜索根复合体卡的内存功能,但是我在数据表中发现它的功能远远超出了我的预期。不可预取为 127MB,可预取为 +800MB。

所以,我被困在这一点上。你说的任何话现在都可以帮助我,因为我觉得我无事可做。任何建议都会受到赞赏,答案会很棒,如果你们需要更多信息,我可以改进我的问题。

相关内容