我在飛思卡爾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()
等功能正確讀寫配置寄存器。
您認爲什麼問題?是否有可能出現問題,因爲內核在內核模塊之前初始化設備?我應該怎麼做才能防止這種情況發生?
您的硬件壞了。在通常的工作系統中,您必須確保總線地址空間中沒有衝突。否則,你需要重新分配它。 – 0andriy
@AndyShevchenko,謝謝安迪,如果我想重新分配整個總線地址和內存區域;有什麼辦法可以刪除PCI設備當前分配的地址空間嗎? –