我試圖讓DMA傳輸的FPGA和x86_64的Linux機器之間的工作。DMA的PCIe讀從PC轉移到FPGA
在PC端我這樣做初始化:
//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();
總線地址是64位地址。 在FPGA側TLP我送出去的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)
,我回來從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"
所以基本上沒有一個完成數據和狀態不支持的請求。 我不認爲有什麼不對的TLP的建設,但我看不出在駕駛員側的任何問題,無論是。 我正在使用的內核啓用了PCIe錯誤報告,但是我在dmesg輸出中看不到任何內容。 有什麼問題?或者,有沒有辦法找到爲什麼我得到不受支持的請求 完成?
Marco
你可以你的代碼比較如何使用內核功能DMA等開放的PCIe驅動器,如裏法2.x或XilliBus。 – Paebbels