来自用户空间总线错误的Linux DMA

时间:2017-01-03 09:27:07

标签: linux kernel driver xilinx dma

我正在遵循此框架https://forums.xilinx.com/xlnx/attachments/xlnx/ELINUX/10693/1/Linux%20DMA%20from%20User%20Space-public.pdf来使用DMA执行数据传输。我没有使用AXI DMA 分散聚集,传输流循环回接收 流。我正在使用的代码如下:dma_proxy.cdma_proxy.hdma_proxy_test.c。 我试图改变u32 for u64,因为我在64位系统中工作。 dma_proxy内核模块正常工作并正确执行INTERNAL_TEST,但是当我在用户应用程序上映射它们后尝试读取/写入dma缓冲区时,我收到此错误:

DMA proxy test
[  397.889331] Unhandled fault: level 3 address size fault (0x92000043) at 0x0000007f94d4b004
Bus error

根据框架的说法,当我导出内核页面表时,我应该在内核映射区域上观察DMA缓冲区,但是我在vmalloc()上获得了它:

0xffffff80012c5000-0xffffff80012cd000          32K     RW NX SHD AF            UXN MEM/NORMAL-NC
0xffffff80012ce000-0xffffff80015cf000        3076K     RW NX SHD AF            UXN MEM/NORMAL-NC
0xffffff80015d0000-0xffffff80015d8000          32K     RW NX SHD AF            UXN MEM/NORMAL-NC
0xffffff80015d9000-0xffffff80018da000        3076K     RW NX SHD AF            UXN MEM/NORMAL-NC

这些文件来自这篇文章:https://forums.xilinx.com/t5/Embedded-Linux/BRAM-DMA-transfer-limitation/m-p/555953#M11603 我在Xilinx(Zynq Ultrascale +)的zcu102评估板上运行。

任何想法??

1 个答案:

答案 0 :(得分:0)

我已经在Xilinx Suppornt的帮助下解决了我的问题。它是驱动程序代码mmap函数,它使用dma_common_mmap而不是dma_mmap_coherent,它应该用于映射dmam_alloc_coherent分配的内存区域。