Sto cercando di ottenere il trasferimento DMA tra un FPGA e una macchina Linux x86_64.Trasferimento di lettura DMA PCIe da PC a FPGA
Sul lato PC che sto facendo questa inizializzazione:
//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();
L'indirizzo bus è un indirizzo 64bit. Sul lato FPGA TLP Mando per la lettura di 1 DW:
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)
Il completamento che torno dal PC è:
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"
in modo sostanzialmente un completamento senza dati e con lo stato Richiesta non supportata. Non penso che ci sia qualcosa di sbagliato nella costruzione del TLP ma non riesco a vedere alcun problema sul lato del driver. Il kernel che sto utilizzando ha la segnalazione errori PCIe abilitata ma non vedo nulla nell'output di dmesg. Cosa c'è che non va? Oppure, c'è un modo per scoprire perché ottengo il completamento Richiesta non supportata?
Marco
È possibile confrontare il proprio codice con altri driver PCIe aperti come Riffa 2.xo XilliBus su come utilizzare la funzione kernel per DMA. – Paebbels