Linux kernel Linux驱动程序DMA传输到以PC为主的PCIe卡

Linux kernel Linux驱动程序DMA传输到以PC为主的PCIe卡,linux-kernel,linux-device-driver,fpga,dma,pci-e,Linux Kernel,Linux Device Driver,Fpga,Dma,Pci E,我正在进行DMA例行程序,将数据从PC传输到PCIe卡上的FPGA。我阅读了DMA-API.txt和LDD3第15章了解详细信息。但是,我不知道如何从PC向PCIe卡上的iomem一致块进行DMA传输。LDD3中PCI的dad样本映射了一个缓冲区,然后告诉卡进行DMA传输,但我需要PC来完成 我已经发现: 请求总线主机 pci_set_master(pdev); 设置DMA掩码 if (dma_set_mask(&(pdev->dev), DMA_BIT_MASK(32)))

我正在进行DMA例行程序,将数据从PC传输到PCIe卡上的FPGA。我阅读了DMA-API.txt和LDD3第15章了解详细信息。但是,我不知道如何从PC向PCIe卡上的iomem一致块进行DMA传输。LDD3中PCI的dad样本映射了一个缓冲区,然后告诉卡进行DMA传输,但我需要PC来完成

我已经发现:

  • 请求总线主机

    pci_set_master(pdev);
    
  • 设置DMA掩码

    if (dma_set_mask(&(pdev->dev), DMA_BIT_MASK(32))) {
        dev_err(&pdev->dev,"No suitable DMA available.\n");
        goto cleanup;
    }
    
  • 请求DMA通道

    if (request_dma(dmachannel, DRIVER_NAME)) {
        dev_err(&pdev->dev,"Could not reserve DMA channel %d.\n", dmachannel);
        goto cleanup;
    }
    
  • 映射用于DMA传输的缓冲区

    dma_handle = pci_map_single(pci_dev, buffer, count, DMA_TO_DEVICE);
    
  • 问题:

    要让PC执行DMA传输而不是卡传输,我必须做什么

    谢谢你的帮助


    首先感谢您的回复。也许我应该更准确地提出我的问题:

  • 据我所知,个人电脑必须有一个DMA控制器。如何访问此DMA控制器以开始传输到PCIe卡中的内存映射IO区域
  • 我们的规范要求PC的DMA控制器启动传输。但是,我只能找到设备执行DMA任务的示例(DMA_mapping.txt,LDD3 ch.15)。有没有一个原因,为什么没有人使用PC的DMA控制器(它仍然有DMA通道)?对我们的项目要求变更规格会更好吗

  • 谢谢你的耐心。

    你说的不是真正的DMA。DMA是指您的设备正在访问内存,而CPU本身不参与(除了PC的内存控制器,它现在通常嵌入到PC的CPU中)。并非所有设备都能做到这一点,如果您使用的是FPGA,那么您的设计中肯定需要某种DMA控制器(即,或类似的控制器)。在您的情况下,只需使用
    iowrite
    调用(即
    iowrite32
    )写入映射的内存区域(即通过
    ioremap\u nocache
    获得的区域),然后使用写入内存屏障
    wmb()
    。您必须写入的I/O栏和地址完全取决于您的设备


    希望能有帮助。祝你好运

    查找DMA_mapping.txt。其中有一个很长的部分告诉您如何设置方向(“DMA方向”,第408行)

    编辑

    好的,既然你编辑了你的问题。。。你的规格错了。您可以设置系统DMA控制器,但这毫无意义,因为它太慢了,正如我在评论中所说的。阅读


    您必须更改FPGA以支持总线主控。我这样做是为了谋生——如果您想转包,请与我联系。

    “从PC传输数据”对外部外围设备有意义,例如“从PC到打印机”。对于内部转账来说,这毫无意义。你可能指的是主存储器。“让PC执行DMA传输”也毫无意义。你可能是指DMA控制器。答:设置DMAC而不是PCI总线主机。“你所说的不是真正的DMA”。。。“那么您的设计中肯定需要某种DMA控制器”——您似乎指的是执行总线主控的(PCI/PCIe)板。外围设备(使用附加DMA控制/握手信号设计)可以通过使用系统的DMA控制器(包括在IBM PC设计中)来利用DMA(而不是编程I/O)。@sawdust是的,你是对的,总线控制它。我有时对正确的符号很不理解。我不认为今天的商品PC有那些DMA控制器,或者它们有吗?PC必须有一个DMAC才能“与IBM PC兼容”。DMA控制器没有那么贵。如果你可以把一个处理器的时钟速度比原来的i8088快350倍以上(包括一个数字协处理器),并且内存比原来的i8088多1000倍以上,那么一个DMAC在“商品PC”中是可以负担得起的。@VladLazarenko:是的,我可以IO写入FPGA的内存块。测试它,它的工作。下一步是让PC的DMA控制器将数据传输到此内存区域,但我所找到的只是关于保留内存缓冲区和让卡的DMA控制器执行此任务的示例(包括DMA_mapping.txt、LDD3第15章)。问题是,如何激活PC的DMA控制器,因为规范文件说,DMA必须来自PC端。名称“DMA”表示您的CPU没有进行活动传输。这立刻意味着其他事情必须为你做。在PC机中有一个“DMA控制器”,但据我所知,它们工作在ISA速度上,对PCI-e没有多大用处。你需要一个DMA控制器,它能为你的目标设备的速度做一些有用的事情;通常,您只需将DMA控制器/总线主控器添加到FPGA设计中并使用它。或者,使用相反的方法——让CPU做活动拷贝。那里的代码告诉我们如何为DMA传输设置缓冲区。LDD3第15章中使用了相同的构造(pci_映射/pci_取消映射),但也有激活pci卡上DMA控制器的指令。因此,我假设这只是将缓冲区标记为“DMA就绪”,并让设备向DMA传输。该方向仅指示DMA控制器应读取或写入缓冲区(或两者兼有)。它没有告诉我(或者至少我没有明白)如何激活PCSDMA控制器。你没有“激活PCSDMA控制器”。在PCIe上进行DMA有两种方法:(1)“系统”DMA和(2)“总线主控”DMA。(1) 这就是历史;这不是一个选择。“系统”DMA控制器仍在您的电脑上,但它位于错误的位置,速度太慢。相反,您的FPGA必须成为总线主控器,并将所需的数据输入或输出。因此,您根据
    DMA_mapping.txt
    设置DMA方向,然后写入卡上的寄存器以启动总线主突发读取(PC输出到FPGA)。查看您的FPGA供应商应用程序注释;从XAPP1052开始。还要注意的是LDD3是非常无用的。上面没有足够的空间。。。谁给你编码的