免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1632 | 回复: 0
打印 上一主题 下一主题

[驱动] 在x86 linux上porting driver 遇到的dma memory不一致的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-12 11:27 |只看该作者 |倒序浏览
前几天在Intel i386 linux PC上移植了一个PCIE Ramdisk的驱动。遇到了分配的DMA区域数据不一致的情况,想不明白,希望得到大家指点:

在PC上通过dma_alloc_coherent()分配了一块区域,分配出来的physical address在0x15000~0x15000+1M区间。按照linux的Documentaion,用这个函数分配的区域能保证数据一致性,而且x86平台本身就有硬件保证让这段区域non-cacheable non-bufferable.
但是测试结果发现,这样分配的区域完全是cacheable 和bufferable的。

测试过程:
PC 往该段内存写入数据。然后让连在PC上的PCIe Device去做DMA read 那段物理地址。发现读出来的数据都是PC写之前的数据,大约过了8s或者通过cl_flush_cache()做cache flush之后,才能读到正确的数据。
而且,Device去做DMA write之后,PC不做invalidate的工作,拿到的数据也是更新前的。

最后在调用dma_alloc_coherent()分配后做个set_memory_uc()将分配的memory 设置为uncacheable, Device 做DMA read前 加入cl_flush_cache()才能保证Device 的DMA 读写 Host Memory数据的一致性。

请问在x86上怎样分配一致性内存区域让DMA去读取呢?为什么在用了通用的DMA 区域分配函数后,得到的内存区域还是cachable bufferable的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP