我正在尝试使用流式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_addr
将pci_write_config_dword()
写入BAR4?必须有一些方法告诉FPGA在使用DMA时需要写入什么,或者我在这里完全遗漏了什么?
答案 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地址转换表)。