2017-09-28 23 views
0

여기에 PCIe가 연결된 FPGA 장치와 드라이버가있는 Linux 4.4 (필자는 같은 방식으로 실패한 구형 커널에서 작업하곤했습니다) 및 자체 설계의 드라이버 . 이들은 정상적인 조건에서 잘 작동하지만, 이제는 핫 플러그 ​​조건에서 작동하도록 노력합니다. 이것은 실제 하드웨어 핫 플러그가 아니며, 내가 시도한 것은 보통 디바이스의 sysfs 디렉토리에있는 echo 1 >remove이고 나중에는 echo 1 >/sys/bus/pci/rescan입니다. 제거/다시 스캔 후 pci_enable_device()가 실패 함

장치가 다시 나타납니다 후

내 드라이버의 초기화를 기록하면서 실패하는 pci_enable_device() 호출

otscan 0000:02:00.0: can't enable device: BAR 0 [mem 0xf7e01000-0xf7e013ff] not claimed 
otscan 0000:02:00.0: can't enable device: BAR 1 [mem 0xf7e00000-0xf7e00fff] not claimed 
otscan 0000:02:00.0: can't enable device: BAR 2 [mem 0xf0200000-0xf020ffff 64bit pref] not claimed 

는 (일반적으로는 처음으로 미 청구 자원 후에 중지 것,하지만 난에 가서 사실이 확인을 수정 한 모든 BAR은 청구되지 않습니다.)

여기에서 "소유권이 주장되지 않음"은 struct resource이 존재하지만 부모가 없으므로 내가 수집 한 것에서 request_resource()이 호출되지 않았 음을 의미합니다. 나는 초기화 루틴이 장치를 사용하지 못하게되어 중단되기 전에 많은 일을하지 않으므로 이것이 드라이버 문제라고 생각하지 않습니다.

이것은 FPGA (하드 IP PCIe 코어가있는 Altera Cyclone V)와 내가 잘못 처리 한 것 (예 : 버스 리셋 처리 중)을 남겨 둡니다. 그 컴퓨터의 다른 PCIe 장치는 sysfs를 통해 다시 작동 할 때 작동합니다.

저는 잠시 파고 들었지만 왜 리눅스에서 장치를 다르게 취급하는지 알지 못했습니다. 내 장치의 가능한 속성 중 Linux에서 내 장치의 BAR에 request_resource()을 호출하지 않기로 결정했을 수 있습니까?

+0

나는 과거에 같은 문제를 보았으며 리소스의 크기와 관련이 있다고 생각했습니다 (저는 512KiB 영역을 가졌습니다). 그러나 당신은 더 작습니다. 나는 그것의 바닥에 결코 도착하지 않았다. –

답변

0

내가 원인을 찾은 것 같습니다. 장치를 부팅 할 때 제대로 작동 한 PCIe 코어 구성에서 클래스 코드가 0 (유효하지 않음)으로 남았습니다. 합리적인 가격 (제 경우에는 멀티미디어 비디오 장치의 경우 0x40000, "등록되지 않은 장치"의 경우 0xff0000도 사용됨) 또한 핫 플러그에서 작동합니다.

리눅스는 부분 코드가 0 인 디바이스를 부분적으로 만 처리합니다.