64bit DMA 传输 地址映射问题

zj19921004 2015-10-26 10:55:12
最近在写FPGA的驱动 ,设备通过PCIE进行连接传输的。
DMA传输时 地址是64位的。在此过程中遇到了一些问题。
问题的主要现象是:有的时候数据可以传输成功,有的时候不可以。
期间代码没有动过,后面逻辑有所改变,不知道原因在哪里,所以想请教各位看下DMA代码是否正确
===========================================================================
//DMA 数据传输 方面的代码
//设置相关的设备mask
result=pci_set_dma_mask(pdev,DMA_BIT_MASK(64));
if(result <0 ){
....
}

//申请缓冲区
t_buffer->dma_buffer_tx=pci_alloc_consistent(fpga->pdev, TX_BUFFER_SIZED,&(t_buffer->dma_bus_tx));

申请缓冲区的方式就是直接申请一致性缓冲区,得到的物理地址长度是64位,但是有时高32位位0
DMA就是将地址,长度,写道bar寄存器中,然后开始数据传输
======================================================================================
其他的尝试:
1.流式的方式进行内存映射:
void * virt_addr= __get_free_pages(__GFP_HIGHMEM,4);
dma_addr_t bus_addr=dma_map_single( &fpga->pdev->dev, virt_addr, 16*PAGE_SIZE, DMA_TO_DEVICE);

2.不通过通用的DMA层进行映射
u64 virt_addr= __get_free_pages(GFP_KERNEL,10);
u64 bus_addr= virt_to_bus(virt_addr);

这两种尝试 得到的物理地址为64位 ,高位不为0,但是DMA时,数据也没有传下去

数据传输都是将上面得到的物理地址写到bar中的寄存器 ,然后启动DMA
==================================================================================
配置:
x86 64位
内存100G
...全文
843 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainhurt123 2017-04-11
  • 打赏
  • 举报
回复 1
你好,最近我也遇到了类似的问题,请问当初的问题解决了吗?

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧