2013-03-20 3 views
3

사용자 공간에서 PCIe SATA 브리지 용 PCI BAR (# 5)에 액세스하려하지만 mmap()을 BAR에서 /sys/bus/pci/devices/.../resource5을 통해 얻을 때마다 모든 오프셋에서 0xFF가됩니다. 파일. Intel SATA 컨트롤러와 같은 다른 장치는 적절한 데이터로 응답합니다.사용자 공간 PCI BAR 액세스는 모든 오프셋에서 0xFF를 반환합니다.

BAR은 Intel 컨트롤러의 경우와 동일하게 (주소 만 다를 경우) lspci -vv으로 표시됩니다.

Region 5: Memory at f7b10000 (32-bit, non-prefetchable) [size=2K] 

두 디바이스는 ahci 드라이버에 의해 일치되고, SATA 컨트롤러는 다른 작품 - 내가 첨부 된 디스크에 액세스 할 수 있습니다.

사용자 공간에서 액세스하려고하는 중입니다. 지금은 실험적으로 레지스터에서 찌르고 싶기 때문입니다. 이렇게하려면 pcimem의 수정 된 양식을 사용하여 관심있는 레지스터에 액세스하도록 변경했습니다. 그러나 어떤 너무도 일반 pcimem으로, 반환 0xFF의 오프셋 :

pcimem /sys/bus/pci/devices/0000\:01\:00.0/resource5 0 w 

반환을 0xFFFFFFFF ("w"는 "단어"읽기, 따라서 4 바이트를 나타낸다).

다른 장치가있을 때이 장치가 액세스 가능하도록 BAR5를 막는 것은 무엇입니까? PCI BAR에 대한 이러한 종류의 사용자 공간 액세스를 가능하게하는 것이 맞습니까?

답변

1

이것이 얼마나 도움이 될지는 확실하지 않지만 새로운 PCIe FPGA 디바이스 용 드라이버를 작성할 때도 똑같은 것을 보았습니다.

MMAP-ed PCI BAR 메모리 공간은 장치에 오류가 발생하면 0xFFFFFFFF (-1)를 반환합니다. 이 문제를 해결할 수 있었던 유일한 방법은 컴퓨터의 최대 전력 재설정으로 카드를 재설정하는 것이 었습니다.

+0

나는 또한 끔찍한 장치 오류에 대해 생각하고 있었지만 디스크가 보이고 마운트되어 브리지가 작동하므로 바를 읽을 수 없습니다. 몇 번이나 재부팅했지만 매번 동일한 결과가 나타납니다. – Inductiveload

+1

그렇다면 노출 된 BAR 영역이 아닌 사용하지 않는 BAR 영역 일 수 있습니다. –

+0

그러나 사용하려는 하드웨어 모듈 (예 : GPIO, I2C 및 SPI 인터페이스)의 레지스터는 BAR5에 있습니다. 메모리 영역 인 유일한 BAR이며 크기와 수는 데이터 시트가 알리는 것과 일치하며 데이터 시트에는 수십 개의 레지스터가 나열되어 있습니다.이 레지스터는 하드웨어와 바이올린에 액세스 할 수 있어야합니다. – Inductiveload

0

NVMe hdds hotplug 디버깅과 동일한 문제가 발생했습니다. GRUB 프롬프트 전에 PCIe 슬롯에 hdd가있는 경우 해당 슬롯에있는 다른 드라이브를 핫 플러그 ​​할 수 있으며 그렇지 않은 경우 pci_ioremap_bar()는 모두 0xffffffff를 읽는 메모리 영역을 반환합니다. 이상한 똥.