2016-11-17 50 views
0

我在飛思卡爾MPC8308上使用PCIe總線(作爲根聯合體),端點設備是隻有一個256 MB內存區域和一個BAR寄存器的ASIC。設備配置空間寄存器可以通過「pciutils」包輕鬆訪問。起初,我試圖通過使用mmap()訪問內存區域,但它不起作用。因此,在下一級,我爲PCIe端點設備準備了一個設備驅動程序,它是在Linux引導後加載到內核中的內核模塊。用於啓用設備和分配內存的PCIe驅動程序錯誤

在我的司機端點設備,從設備ID表確定,但我想啓用由pci_enable_device()設備,我看到這個錯誤:

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

此外,當我想分配內存區域的PCIe設備通過使用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,謝謝安迪,如果我想重新分配整個總線地址和內存區域;有什麼辦法可以刪除PCI設備當前分配的地址空間嗎? –

回答

0

BAR寄存器的訪問通常是針對小區域的。你的BAR0尺寸似乎太大了。嘗試使用較少的內存(小於1MB),它應該可以工作。

+0

謝謝。但不幸的是BAR0的大小是不可配置的,因爲它的前28位是隻讀位,不能被編輯並且總是爲零。所以如何改變內存區域大小? –

+0

@FabienM,其實沒關係。 – 0andriy

相關問題