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, 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이며 할당되지 않은 클래스 장치로 프리페치할 수 없는 64MB 메모리를 가지고 있습니다.

[    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입니다.

그래서 저는 이 시점에서 막혔습니다. 내가 할 일이 없다고 느끼기 때문에 당신이 말할 수 있는 모든 것이 지금 당장 나에게 도움이 될 것입니다. 어떤 제안이라도 감사하게 생각하고 답변해 주시면 더 많은 정보가 필요하시면 제 질문을 개선해 드리겠습니다.

관련 정보