我正在开发基于 FPGA 的 PCI Express (PCIe) 设备,该设备应该在 Linux 操作系统下工作,因此我也在编写 Linux 内核驱动程序。该设备的特点之一是它可以使用最简单的机制以 DMA 模式将数据写入 Linux Host RAM:
在装有 Ubuntu 操作系统的简单台式单 CPU 电脑上,一切运行良好。但是,当我尝试在具有两个物理 Intel CPU 的 Supermicro 服务器上运行相同的代码(rtl 和驱动程序/linux 应用程序)时,计算机在我的设备生成的内存写入转换处挂起。
这是驱动程序的一些代码
// I am using 64 bit dma addressing
if (!dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)))
printk(KERN_WARNING "%s: using 64bit DMA addressing\n", DRIVER_NAME);
...
// memory allocation and mapping
struct page *dma_pages;
dma_pages = alloc_pages_node(NUMA_NO_NODE, GFP_ATOMIC | __GFP_NOWARN | __GFP_COMP | __GFP_MEMALLOC, mem_order);
virt_addr = (unsigned long)page_address(dma_pages);
# this dma address goes to fpga
dma_addr = dma_map_single(&fpga_dev->pdev->dev, virt_addr, size, DMA_BIDIRECTIONAL);
到目前为止我在服务器上尝试过的:
我在谷歌上搜索了很多,甚至与 ChatGPT 讨论了这个问题 - 但没有成功。有什么想法下一步该怎么做吗?
具有一个 CPU 的台式电脑(一切正常)和具有两个 Intel CPU 的两路超微服务器之间有什么区别?
我或多或少有同样的问题。 我有一个正在运行的 Linux 服务器设置(Advantech) 当我在 supermicro linux 基础服务器上构建相同的设置时,我遇到了同样的问题。能够从 FPGA 读取写入寄存器,但 DMA 不起作用