Linuxカーネルは、PCIeブリッ​​ジの背後にあるプリフェッチ可能なPCIEデバイスのアドレスを生成できません。

Linuxカーネルは、PCIeブリッ​​ジの背後にあるプリフェッチ可能なPCIEデバイスのアドレスを生成できません。

私の質問は次のとおりです

2つの異なる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で見つけたものは次のとおりです。

デバイス0000:03:00.0、8MB + 8MBプリフェッチ可能メモリ、マルチメディアデバイスを備えた別のエンドポイント対応Linuxカード。

[    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です。

それで私はこの時点で詰まっていました。私がすることがないと感じているので、あなたが言うことができるすべてが今すぐ私に役立ちます。どんな提案でも感謝して回答していただければ、より多くの情報が必要な場合は私の質問を改善させていただきます。

ベストアンサー1

おすすめ記事