如何将CPU的DMA地址写入FPGA(PCIe Endpoint)?

How to write CPU's DMA address to FPGA (PCIe Endpoint)?

我正在尝试使用流式 DMA 映射将 DMA 添加到我的 PCIe Linux 驱动程序。 FPGA(端点)为 DMA 配置了 BAR4,在我的设置函数中我做了(按顺序):

pci_set_master()
pci_enable_msi()
pci_set_dma_mask()
pci_set_consistent_dma_mask()
__get_free_pages()
dma_addr = pci_map_single(..., PCI_DMA_FROMDEVICE)

此时我不知道如何告诉 FPGA 我的 DMA 地址 dma_addr 是从 pci_map_single() 返回的。我是否使用 pci_write_config_dword()dma_addr 写入 BAR4?在使用 DMA 时,必须有某种方式告诉 FPGA 它需要写入哪里,或者我在这里完全遗漏了什么?

要 read/write PCIe 的 BARx 中的数据,您必须使用函数映射 BARx: void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);

例如您可以按照以下方式操作:

/* declare the bar4 buffer */
static volatile u32 __iomem * bar4;

/* map the bar4 */
bar4 = pcim_iomap(&pdev->dev, 4, BAR4_SIZE);

bar4[DMA_VECTOR_REGISTER_ADDRESS] = dma_addr;

kernel Documentation 中查看有关 BARx/MMIO 的更多文档。

DMA_VECTOR_REGISTER_ADDRESS 的地址取决于您的 FPGA 架构。正如我在评论中看到的那样,您使用的是 CycloneV GT。您应该查看 CRA(配置寄存器访问)寄存器。 在 CycloneV GX PCIe Hard ip for Avalon-MM(第 83 页)上,DMA 向量的寄存器地址从 0x1000 开始(Avalon-MM-to-PCI Express 地址转换 Table)。