怎样刷cache
在涉及到DMA的驱动中当你对DMA的buffer进行了修改后,通常需要刷cache(当然有不需要刷cache的情况,不过我不分析它)。怎样刷cache —— 调用dma_sync_sg_for_device或它的兄弟姐妹(仔细看一下那个头文件,自然之道需要的是哪一个)。
刷cache的实现
以dma_sync_sg_for_device为例,阅读代码发现其真正其作用的是调用这两个函数:dmac_map_area和outer_clean_range。这两个函数都有其兄弟姐妹,是两个系列函数。它们分别是对两个全局结构体成员的包装,这两个全局结构体就是在setup.c中的cpu_cache和outer_cache。
在函数setup_processor中:
#ifdef MULTI_CACHE
cpu_cache = *list->cache;
#endif
而outer_cache的初始化,见arch/arm/mm/Makefile中的一段:
obj-$(CONFIG_CACHE_FEROCEON_L2) += cache-feroceon-l2.o
obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o
obj-$(CONFIG_CACHE_XSC3L2) += cache-xsc3l2.o
obj-$(CONFIG_CACHE_TAUROS2) += cache-tauros2.o