- 论坛徽章:
- 0
|
Hi All
大家对这个函数应该不陌生
dma_alloc_coherent
对于ARM, 这个函数是分配一块内存,然后把它的属性定义为"coherent",然后这块内存就不需要再做cacle inv/flush的动作了, dma_alloc_coherent实际上使用下面的宏来定义这块coherent属性。
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
#define pgprot_dmacoherent(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE | L_PTE_XN)
#else
#define pgprot_dmacoherent(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED | L_PTE_XN)
#endif
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
#include <asm/barrier.h>
#define __iormb() rmb()
#define __iowmb() wmb()
#else
#define __iormb() do { } while (0)
#define __iowmb() do { } while (0)
#endif
如果定义CONFIG_ARM_DMA_MEM_BUFFERABLE宏,则dma_alloc_coherent则使用L_PTE_MT_BUFFERABLE来分配这个coherent内存,并且访问外设必须带着mb;
如果不定义这个宏,则使用L_PTE_MT_UNCACHED分配这个coherent内存,并且访问外设不需要带有mb。
我下面有一个例子,在我的ARMv7设置中,TEX=1, 也就是内存的设置需要使用PRRR和NMRR来定义,使能CONFIG_ARM_DMA_MEM_BUFFERABLE后,然后dma_alloc_coherent分配的内存是strong order。这里,我觉得是有疑问的,既然是strong order,这块内存已经确保了访这段内存是顺序的,不会有问题,所以我去掉了mb操作,因此CPU loading下降了,性能也有提高。
因为是V7而且TEX=1, UNCACHED和BUFFERABLE已经失去了它字面的意思。我的疑问是,在CONFIG_ARM_DMA_MEM_BUFFERABLE使能与否的情况下,对应的内存各应该是什么样的呢?因为它决定了这段coherent内存访问是否需要barrier。normal+uncached可以吗?device可以吗?
Thanks |
|