Xilinx官方XDMA驱动解析

最近在搞Xilinx的PCIE板卡的时候,研究了一下linux的xdma驱动代码,在此记录一下学习过程。

环境配置:

X86平台的ubuntu2204,内核版本:6.5.0

使用PCIE2.0 x4的板卡和主机通信

1、准备工作

1.1、下载和编译驱动

驱动下载地址:https://github.com/Xilinx/dma_ip_drivers

笔者选择dma_ip_drivers-2019.2版本进行下载。

Xdma ip的寄存器描述:

https://docs.amd.com/r/zh-CN/pg195-pcie-dma/%E5%AF%84%E5%AD%98%E5%99%A8%E7%A9%BA%E9%97%B4

编译和加载驱动:

cd dma_ip_drivers-2019.2/XDMA/linux-kernel/xdma
make
sudo insmod xdma.ko

2.1、编译和测试应用程序

cd dma_ip_drivers-2019.2/XDMA/linux-kernel/tools
gcc dma_from_device.c dma_from_device
gcc dma_from_device.c -o dma_from_device

// 生成测试文件
dd if=/dev/zero of=test_zero.bin bs=4096 count=1

// 主机发送数据给PCIE板卡
./dma_to_device -d /dev/xdma0_h2c_0 -f ./test_zero.bin -s 4096 -a 0 -c 1 #-a 后面跟的地址是pcie域的地址,逻辑开发人员会告诉你

// 主机读取PCIE板卡数据
./dma_from_device -d /dev/xdma0_c2h_0 -f ./test_zero_get.bin -s 4096 -a 0 -c 1

2、XDMA驱动初始化流程

驱动初始化的重点初始化dma的 传输引擎,还要根据Xilinx官方定义的寄存器来定义和申请传输描述符,最后还要创建用户设备文件点/dev/xdma0_c2h_0、/dev/xdma0_control、/dev/xdma0_events_0等。

3、数据传输流程

以主机向PCIE板卡(H2C)传输数据为例,来分析一下xdma的数据传输流程。

数据传输的过程其实涉及很多东西,包括PCIE、DMA、中断、任务调度、数据同步等很多知识。

下面从代码层面大概分析一下:

当H2C传输完成后,PCIE设备会产生中断,CPU的中断服务程序流程如下:

流程还是很复杂的,笔者用了两周时间才把代码看懂并且把大部分逻辑捋顺,为了能完全理解DMA的操作,还写了DMA相关的例程代码,也参考了Xilinx的XDMA驱动代码,可以看笔者的另一篇文章获取代码:

Linux 流式DMA映射(DMA Streaming Mapping)-CSDN博客

4、总结

本文主要从DMA的角度出发去讨论Xilinx的PCIE传输过程。

值得注意的是,在pcie dma传输数据的过程中,驱动程序会申请两次DMA。第一次是在驱动初始化的时候:

engine->desc = dma_alloc_coherent(&xdev->pdev->dev,
                    XDMA_TRANSFER_MAX_DESC *
                        sizeof(struct xdma_desc),
                    &engine->desc_bus, GFP_KERNEL);

申请的是xdma IP规定的dma描述符,其结构体定义如下:

struct xdma_desc {
    u32 control;
    u32 bytes;      /* transfer length in bytes */
    u32 src_addr_lo;    /* source address (low 32-bit) */
    u32 src_addr_hi;    /* source address (high 32-bit) */
    u32 dst_addr_lo;    /* destination address (low 32-bit) */
    u32 dst_addr_hi;    /* destination address (high 32-bit) */
    /*
     * next descriptor in the single-linked list of descriptors;
     * this is the PCIe (bus) address of the next descriptor in the
     * root complex memory
     */
    u32 next_lo;        /* next desc address (low 32-bit) */
    u32 next_hi;        /* next desc address (high 32-bit) */
} __packed;

把engine->desc_bus直接写到XDMA IP的0H2C SGDMA Descriptor Low Address和H2C SGDMA Descriptor High Address寄存器,然后xdma ip就可以获取到内存中该结构体对应的内容。

第二次申请是在应用程序和pcie设备传输数据的时候,也就是H2C或C2H的时候。驱动程序会根据应用程序申请内存空间大小进行流式dma映射,然后把pcie设备能操作的总线地址写到struct xdma_desc的src_addr_lo、src_addr_hi、dst_addr_lo和dst_addr_hi,要传输的大小写到bytes,这样pcie设备就可以通过XDMA IP的0H2C SGDMA Descriptor Low Address和H2C SGDMA Descriptor High Address寄存器的地址去获取dma的传输信息了。

5、参考资料

Xilinx官方的XDMA驱动代码和寄存器描述文档:

驱动下载地址:https://github.com/Xilinx/dma_ip_drivers

笔者选择dma_ip_drivers-2019.2版本进行下载。

Xdma ip的寄存器描述:

https://docs.amd.com/r/zh-CN/pg195-pcie-dma/%E5%AF%84%E5%AD%98%E5%99%A8%E7%A9%BA%E9%97%B4

xilliix pcie dma 驱动 (基于 xilnx xdma ip核 4.0 的WDF驱动) --- # XDMA Windows Driver This project is Xilinx's sample Windows driver for 'DMA/Bridge Subsystem for PCI Express v4.0' (XDMA) IP. *Please note that this driver and associated software are supplied to give a basic generic reference implementation only. Customers may have specific use-cases and/or requirements for which this driver is not suitable.* ### Dependencies * Target machine running Windows 7 or Windows 10 * Development machine running Windows 7 (or later) * Visual Studio 2015 (or later) installed on development machine * Windows Driver Kit (WDK) version 1703 (or later) installed on development machine ## Directory Structure ``` / |__ build/ - Generated directory containing build output binaries. |__ exe/ - Contains sample client application source code. | |__ simple_dma/ - Sample code for AXI-MM configured XDMA IP. | |__ streaming_dma/ - Sample code for AXI-ST configured XDMA IP. | |__ user_events/ - Sample code for access to user event interrupts. | |__ xdma_info/ - Utility application which prints out the XDMA core ip | | configuration. | |__ xdma_rw/ - Utility for reading/writing to/from xdma device nodes such | | as control, user, bypass, h2c_0, c2h_0 etc. | |__ xdma_test/ - Basic test application which performs H2C/C2H transfers on | all present channels. |__ inc/ - Contains public API header file for XDMA driver. |__ libxdma/ - Static kernel library for XDMA IP. |__ sys/ - Reference driver source code which uses libxdma |__ README.md - This file. |__ XDMA.sln - Visual Studio Solution. ```
### 回答1: Xilinx PCIe XDMA驱动是一种用于支持Xilinx FPGA板卡的驱动程序,可实现快速数据传输和DMA操作。该驱动程序支持Linux和Windows操作系统,用户可以从Xilinx官网上下载对应版本的驱动程序进行安装和使用。用户也可以参考Xilinx提供的文档和示例代码来了解和使用该驱动程序。 ### 回答2: Xilinx PCIe XDMA驱动Xilinx公司开发的一种PCI Express(PCIe)中传输数据的一种驱动程序,可以用于连接Xilinx FPGA和主机处理器之间的数据传输。该驱动提供了一种高效、低延迟的数据传输解决方案,可以大幅提高系统性能并实现高速数据流的传输。 Xilinx PCIe XDMA驱动有以下特点: 1. 高带宽:该驱动内部采用了多通道数据传输的方式,能够实现高带宽数据传输。 2. 低延迟:通过有效的进程和线程管理技术,该驱动能够大幅减少数据传输的延迟,从而提高系统的响应速度。 3. 灵活性强:该驱动支持多种协议、多种数据格式,并允许在不同协议和数据格式之间灵活切换,使得系统具有更好的兼容性和扩展性。 4. 易于部署:该驱动可以快速的安装和配置,而且可以很容易的与其他系统集成。 总之,Xilinx PCIe XDMA驱动是一种高效、灵活、可靠、易于部署的驱动程序。它的出现使得数据传输变得更加高效和有序,可广泛应用于各种高速数据处理和传输场合。 ### 回答3: Xilinx PCIe XDMA驱动是一种高效的驱动程序,用于操作Xilinx FPGA设备及其PCIe接口,实现高速数据传输的功能。该驱动程序采用了DMA(直接内存访问)技术,通过将数据从主机内存直接传输到FPGA内存,避免了CPU处理过程中的繁琐的数据拷贝过程,从而大大提高了数据传输的速度和效率。在数据传输中,Xilinx PCIe XDMA驱动能够实现分散和聚集的操作,提高数据传输的灵活性和效率。 作为一种高效的驱动程序,Xilinx PCIe XDMA驱动具有较多的优势,如:支持各类Xilinx FPGA板卡,方便用户的选择和使用;有完整的API和用户手册,支持用户进行快速集成和开发,降低开发难度;完全符合PCIe规范,保障了高速通信的可靠性和稳定性;支持多个DMA通道同时传输数据,提高数据传输的并行度和效率;支持用户自定义中断,在数据传输过程中能够及时发现异常情况,保证数据的准确性和可靠性。 总之,Xilinx PCIe XDMA驱动是一种为Xilinx FPGA设备量身定制的高效、可靠、灵活的驱动程序,它的出现为用户提供了更加便于选择和集成的Xilinx FPGA系统解决方案,实现了高速数据传输的应用需求,将为未来的硬件加速应用提供更为丰富的技术支持和发展空间。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值