FROM_DEVICE DMA 请求在多 CPU 服务器主板上挂起 Linux

问题描述 投票:0回答:1

我正在开发基于 FPGA 的 PCI Express (PCIe) 设备,该设备应该在 Linux 操作系统下工作,因此我也在编写 Linux 内核驱动程序。该设备的特点之一是它可以使用最简单的机制以 DMA 模式将数据写入 Linux Host RAM:

  1. 设备驱动程序分配内存的连续区域(128 KB)并获取该区域的 dma(总线)地址
  2. 驱动程序将dma地址写入FPGA PCIe设备
  3. FPGA PCIe 设备只是生成内存写入 PCIe 事务,地址从该 dma 地址开始(当然驱动程序设置总线主位)

在装有 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);

到目前为止我在服务器上尝试过的:

  1. 检查了pcie链接,没问题。 CPU可以读/写FPGA寄存器并将数据传输到FPGA
  2. 在 Linux 内核启动期间禁用 IOMMU (iommu=off intel_iommu amd_iommu=off)
  3. 在 BIOS 中禁用 Intel VT-d
  4. 尝试尝试 NUMA(禁用、启用、尝试在不同节点上分配内存 - 靠近设备而不是设备)
  5. 检查不同的 PCIe 插槽、不同的 CPU。现在 FPGA 卡已连接到另一个 PCIe 卡(NIC)正常工作的插槽。

我在谷歌上搜索了很多,甚至与 ChatGPT 讨论了这个问题 - 但没有成功。有什么想法下一步该怎么做吗?

具有一个 CPU 的台式电脑(一切正常)和具有两个 Intel CPU 的两路超微服务器之间有什么区别?

linux-device-driver fpga dma pci-e
1个回答
0
投票

我或多或少有同样的问题。 我有一个正在运行的 Linux 服务器设置(Advantech) 当我在 supermicro linux 基础服务器上构建相同的设置时,我遇到了同样的问题。能够从 FPGA 读取写入寄存器,但 DMA 不起作用

© www.soinside.com 2019 - 2024. All rights reserved.