Tôi đang cố gắng chuyển DMA hoạt động giữa FPGA và máy Linux x86_64.DMA PCIe đọc chuyển từ PC sang FPGA
Về phía máy tính tôi đang làm khởi này:
//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();
Địa chỉ xe buýt là một địa chỉ 64bits. Về phía FPGA TLP tôi gửi ra cho đọc trong tổng số 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)
Việc hoàn thành mà tôi nhận lại từ máy PC là:
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"
rất cơ bản là một kết thúc không có dữ liệu và với trạng thái Yêu cầu không được hỗ trợ. Tôi không nghĩ rằng có điều gì đó sai trái trong quá trình xây dựng TLP nhưng tôi cũng không thấy có vấn đề gì về phía tài xế. Hạt nhân tôi đang sử dụng có báo cáo lỗi PCIe được bật nhưng tôi không thấy gì trong đầu ra dmesg. Có gì sai? Hoặc, có cách nào để tìm lý do tại sao tôi nhận được Yêu cầu không được hỗ trợ đó Hoàn thành không?
Marco
Bạn có thể so sánh mã của mình với các trình điều khiển PCIe mở khác như Riffa 2.x hoặc XilliBus về cách sử dụng hàm hạt nhân cho DMA. – Paebbels