Я пытаюсь заставить работать передачу DMA между FPGA и машиной Linux x86_64.
На стороне ПК я выполняю эту инициализацию:
//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)
Завершение, которое я получаю от ПК, выглядит следующим образом:
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"
так что в основном завершение без данных и со статусом Unsupported Request. Я не думаю, что что-то не так с конструкцией TLP, но и со стороны водителя я не вижу никаких проблем. В ядре, которое я использую, включен отчет об ошибках PCIe, но я ничего не вижу в выводе dmesg. Что случилось? Или есть способ узнать, почему я получаю это неподдерживаемое завершение запроса?
Марко