由于cpu cache的影响,设备在进行DMA操作时存在数据一致性的问题,kernel实现了一系列 api来解决dma一致性问题:
include/linux/dma-mapping.h
dma_alloc_coherent/dma_free_coherent:一致性DMA缓冲区申请和释放
dma_map_single/dma_unmap_single:流式DMA映射
dma_map_sg/dma_unmap_sg:聚集/分散式DMA映射
从代码来看,这几个接口都是调用了dma_map_ops中对应的hook函数。dma_map_ops中的函数又是从哪来的呢?
我们知道,SoC上具有DMA功能的设备一般是外设的host,对于驱动来说就是platform_device,顺着of_platform_populate函数,可以找到arch_setup_dma_ops:
可见这里的主角是swiotlb_dma_ops:
__dma_alloc申请page_size倍数大小的连续物理内存
include/linux/dma-mapping.h
dma_alloc_coherent/dma_free_coherent:一致性DMA缓冲区申请和释放
dma_map_single/dma_unmap_single:流式DMA映射
dma_map_sg/dma_unmap_sg:聚集/分散式DMA映射
从代码来看,这几个接口都是调用了dma_map_ops中对应的hook函数。dma_map_ops中的函数又是从哪来的呢?
我们知道,SoC上具有DMA功能的设备一般是外设的host,对于驱动来说就是platform_device,顺着of_platform_populate函数,可以找到arch_setup_dma_ops:
可见这里的主角是swiotlb_dma_ops:
__dma_alloc申请page_size倍数大小的连续物理内存