Ich versuche, DMA-Transfer arbeiten zwischen einem FPGA und einem x86_64 Linux-Rechner.DMA PCIe lesen Übertragung von PC zu FPGA
Auf der PC-Seite Ich mache diese Initialisierung:
//driver probe
...
pci_set_master(dev); //set endpoint as master
result = pci_set_dma_mask(dev, 0xffffffffffffffff); //set as 64bit capable
...
//read
pagePointer = __get_free_page(__GFP_HIGHMEM); //get 1 page
temp_addr = dma_map_page(&myPCIDev->dev,pagePointer,0,PAGE_SIZE,DMA_TO_DEVICE);
printk(KERN_WARNING "[%s]Page address: 0x%lx Bus address: 0x%lx\n",DEVICE_NAME,pagePointer,temp_addr);
writeq(cpu_to_be64(temp_addr),bar0Addr); //send address to FPGA
wmb();
writeq(cpu_to_be64(1),bar1Addr); //start trasnfer
wmb();
Die Bus-Adresse ist eine 64-Bit-Adresse. Auf der Seite FPGA die TLP Ich sende von 1 DW für das Auslesen:
Fmt: "001"
Type: "00000"
R|TC|R|Attr|R|TH : "00000000"
TD|EP|Attr|AT : "000000"
Length : "0000000001"
Requester ID
Tag : "00000000"
Byte Enable : "00001111";
Address : (address from dma map page)
Die Fertigstellung, die ich vom PC zurück ist:
Fmt: "000"
Type: "01010"
R|TC|R|Attr|R|TH : "00000000"
TD|EP|Attr|AT : "000000"
Length : "0000000000"
Completer ID
Compl Status|BCM : "0010"
Length : "0000000000";
Requester ID
Tag : "00000000"
R|Lower address : "00000000"
so dass im Grunde ein Abschluss ohne Daten und mit dem Status Nicht unterstützte Anfrage. Ich glaube nicht, dass etwas an der Konstruktion des TLP falsch ist, aber ich sehe auch kein Problem auf der Treiberseite. Der Kernel, den ich verwende, hat die PCIe-Fehlerberichterstattung aktiviert, aber ich sehe nichts in der dmesg-Ausgabe. Was ist los? Oder gibt es eine Möglichkeit zu finden, warum ich diese nicht unterstützte Anfrage Completion bekomme?
Marco
Sie könnten Ihren Code mit anderen offenen PCIe-Treibern wie Riffa 2.x oder XilliBus vergleichen, um die Kernel-Funktion für DMA zu verwenden. – Paebbels