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

时间:2016-03-04 02:02:26

标签: linux driver dma pci-e memory-mapping

我正在尝试使用流式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()返回的。我是否使用dma_addrpci_write_config_dword()写入BAR4?必须有一些方法告诉FPGA在使用DMA时需要写入什么,或者我在这里完全遗漏了什么?

1 个答案:

答案 0 :(得分:1)

要读取/写入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到PCI Express地址转换表)。