PCIe-Treiberfehler zum Aktivieren des Geräts und zum Zuordnen von Speicher

743
user664886

Ich verwende den PCIe-Bus auf der Freescale MPC8308 (als Root-Komplex), und das Endgerät ist ein ASIC mit nur einem 256 MB-Speicherbereich und nur einem BAR-Register. Die Gerätekonfigurationsraumregister sind über das Paket "pciutils" leicht zugänglich. Zuerst versuchte ich, auf den Speicherbereich zuzugreifen, mmap()aber es funktionierte nicht. Auf der nächsten Stufe habe ich einen Gerätetreiber für das PCIe-Endgerät vorbereitet, ein Kernel-Modul, das ich nach dem Booten von Linux in den Kernel lade.

In meinem Treiber wird das Endgerät aus der Geräte-ID-Tabelle identifiziert. Wenn ich das Gerät jedoch aktivieren möchte, wird der folgende pci_enable_device()Fehler angezeigt :

driver-pci 0000: 00: 00.0: Gerät nicht verfügbar wegen Kollisionen von BAR 0 [0x000000-0xfffffff]

Auch wenn ich dem PCIe-Gerät einen Speicherbereich zuweisen möchte pci_request_region(), ist dies nicht möglich.

Hier ist der Teil des Treibercodes, der nicht funktioniert:

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"); } 

Und hier ist das Ergebnis in "dmesg":

driver-pci 0000: 00: 00.0: Gerät nicht verfügbar wegen Kollisionen von BAR 0 [0x000000-0xfffffff]

Bei der PCI-Aktivierung ist ein Problem aufgetreten

driver-pci: Probe von 0000: 00: 00.0 schlug mit Fehler -22 fehl

Es ist erwähnenswert, dass ich im Treiber Konfigurationsregister mit Funktionen wie pci_read_config_dword()und richtig lesen und schreiben kann pci_write_config_dword().

Was denkst du, was ist das Problem? Ist es möglich, dass das Problem auftritt, weil der Kernel das Gerät vor dem Kernelmodul initialisiert? Was soll ich tun, um dies zu verhindern?

1

0 Antworten auf die Frage