linux之DMA动态映射指南
DMA动态映射指南
什么样的内存是DMA可用的?
DMA寻址限制
DMA映射类型
使用DMA一致性映射
DMA方向
使用DMA流映射
错误处理
平台相关的问题
如果你只是些一个linux驱动而不需要为内核维护一个体系结构你可以跳过本章。
1)数据结构scatterlist的条件
不要发明新的体系结构相关的scatterlist;使用<asm-generic/scatterlist.h>就可以了。如果体系结构支持IOMMU(包括软件IOMMU),你就需要使能CONFIG_NEED_SG_DMA_LENGTH。
2)ARCH_DMA_MINALIGN
体系结构必须确保kmalloc申请的缓冲区对DMA来说是安全的。驱动及子系统都依赖于此。如果一个体系结构并非是一致性DMA(比如硬件不能保证在处理器缓存中的数据和主内存中的数据时刻保持一致),则必须要设置ARCH_DMA_MINALIGN来确保kmalloc缓冲区不会和其他缓冲区共享一个缓存行。实例请看arch/arm/include/asm/cache.h。
请注意ARCH_DMA_MINALIGN和DMA内存对齐限制相关。你无需担心体系结构数据对齐限制。
3)支持多种类型的IOMMU
如果你的体系结构需要支持多种IOMMU,那么你可以使用 include/linux/asm-generic/dma-mapping-common.h。这是一个支持多种IOMMU的DMA API的库。很多体系结构(x86, powerpc, sh, alpha, ia64, microblaze and sparc)都使用它。选择一个看看如何正确使用该库。如果你想在单一系统中支持多种类型的IOMMU,基于x86 及 powec的实例可以给你帮助。
参考文献
[1] documentation/DMA-API-HOWTO.txt