2016-11-17 1 views
0

프리 스케일 MPC8308에서 PCIe 버스를 루트 컴플렉스로 ​​사용 중이며 엔드 포인트 디바이스는 하나의 256MB 메모리 영역과 단 하나의 BAR 레지스터가있는 ASIC입니다. 장치 구성 공간 레지스터는 "pciutils"패키지를 통해 쉽게 액세스 할 수 있습니다. 처음에는 mmap()을 사용하여 메모리 영역에 액세스하려고 시도했지만 작동하지 않았습니다. 그래서 다음 레벨에서, 나는 리눅스 부팅 후에 커널에로드하는 커널 모듈 인 PCIe 엔드 포인트 장치를위한 장치 드라이버를 준비했습니다. 내 드라이버에서디바이스 활성화 및 메모리 할당을위한 PCIe 드라이버 오류

엔드 포인트 장치는 장치 ID 테이블에서 식별하지만 pci_enable_device()하여 장치를 사용하려는 경우,이 오류 참조 : 나는 PCIe 장치를위한 메모리 영역을 할당 할 때 또한

driver-pci 0000:00:00.0: device not available because of BAR 0 [0x000000-0xfffffff] collisions

pci_request_region()을 사용하면 불가능합니다. 여기

가 작동하지 않습니다 드라이버 코드의 일부입니다

pci_enable_result = pci_enable_device (pdev); 
if (pci_enable_result) 
{ 
    printk(KERN_INFO "PCI enable encountered a problem \n"); 
    return pci_enable_result; 
} 
else 
{ 
    printk(KERN_INFO "PCI enable was succesfull \n"); 
} 

을 그리고 여기에 "dmesg를"의 결과입니다

driver-pci 0000:00:00.0: device not available because of BAR 0 [0x000000-0xfffffff] collisions

PCI enable encountered a problem

driver-pci: probe of 0000:00:00.0 failed with error -22

그것은 주목할 가치가 드라이버에서 내가 할 수있는 그 pci_read_config_dword()pci_write_config_dword()과 같은 기능을 사용하여 올바르게 구성 레지스터를 읽고 쓰십시오.

당신이 생각하는 문제는 무엇입니까? 커널이 커널 모듈 이전에 장치를 초기화하기 때문에 문제가 나타날 수 있습니까? 이 문제가 발생하지 않도록하려면 어떻게해야합니까?

+1

하드웨어가 고장났습니다. 일반적인 작업 시스템에서는 버스 주소 공간에 충돌이 없어야합니다. 그렇지 않으면 다시 할당해야합니다. – 0andriy

+0

@AndyShevchenko, 감사합니다 Andy, 전체 버스 주소와 메모리 영역을 재 할당하려는 경우; 현재 PCI 장치에 할당 된 주소 공간을 제거 할 수있는 방법이 있습니까? –

답변

0

BAR 레지스터 액세스는 일반적으로 소 영역 용입니다. 귀하의 BAR0 크기가 너무 큰 것 같습니다. 적은 메모리 (1MB 미만)로 시도해도 효과가 있습니다.

+0

감사합니다. 그러나 불행히도 BAR0 크기는 구성 가능하지 않습니다. 처음 28 비트는 편집 할 수없고 항상 0 인 읽기 전용 비트이기 때문입니다. 그래서 어떻게 메모리 영역 크기를 바꿀 수 있습니까? –

+0

@FabienM, 사실 그것은 중요하지 않습니다. – 0andriy

관련 문제