- 论坛徽章:
- 0
|
本帖最后由 lyl19 于 2014-03-13 22:51 编辑
Hi 两位
我会去查看一下那两个文档,不过在DDI0406C_arm_architecture_reference_manual,对于TXE[], C, B组合起来的几种memory属性,确实没有bufferable这个属性,不管SCTLR.TRE是否为1,难道这是一个隐含的属性。
看了asuka的描述,这里还是回归到我的两个疑问
1. 真正使能了ARM_DMA_MEM_BUFFERABLE这个宏,带来的影响是使用L_PTE_MT_BUFFERABLE 分配内存,然后io操作是带mb的,而不使能这个宏,带来的影响是使用L_PTE_MT_UNCACHED,然后io操作是不带mb的。
asuka认为L_PTE_MT_UNCACHED对应的是strong order的,然后不需要mb。但其实在我的系统中,对应下来,L_PTE_MT_UNCACHED是strong的,然后L_PTE_MT_UNCACHED反而是device的。所以我的疑问是
真正使能ARM_DMA_MEM_BUFFERABLE与否,它对应的内存究竟应该是啥样子的(strong order, device ,normal+noncache),才允许io操作是否带mb。这里我们不能通过字面意思来判断这个内存的属性,而应该通过TXE, CB的组合来判断。
2. 如果真是是关掉ARM_DMA_MEM_BUFFERABLE, 使用L_PTE_MT_UNCACHED分配到的是strong order类型的memory, 那么IO操作不带mb,这在ARMv7中这是安全的吗?
这里我还是疑问,因为DDI0406C_arm_architecture_reference_manua中A3.8, Figure A3-5, 我们得知,对strong order类型的memory访问,它是可以保证顺序的,但如果是对不同memory类型的访问,它是不能保证顺序的,
比如说
A=LOAD(addr1).
write32(addr2, A).
因为A操作的对象addr1是在normal memory, 而write32是对strong order的写,但因为ARM_DMA_MEM_BUFFERABLE关掉了,write32函数不带mb了,现在这个驱动还安全吗?因为我们并不能保证这两条 指令的顺序。
我比较纠结这个问题是因为以前发生过因为这个IO操作是否带mb,而引发驱动出问题,而且花了比较长时间才排察。
不知道两位是否理解了我的意思。
Thanks
Roger |
|