diff --git a/target/linux/oxnas/patches-4.4/010-arm_introduce-dma-fiq-irq-broadcast.patch b/target/linux/oxnas/patches-4.4/010-arm_introduce-dma-fiq-irq-broadcast.patch index b59c06e2ab..024675e599 100644 --- a/target/linux/oxnas/patches-4.4/010-arm_introduce-dma-fiq-irq-broadcast.patch +++ b/target/linux/oxnas/patches-4.4/010-arm_introduce-dma-fiq-irq-broadcast.patch @@ -4,15 +4,17 @@ #define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range) #define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range) #define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range) -+#ifndef CONFIG_DMA_CACHE_FIQ_BROADCAST - #define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area) +-#define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area) - #define dmac_flush_range __glue(_CACHE,_dma_flush_range) +-#define dmac_flush_range __glue(_CACHE,_dma_flush_range) ++#ifndef CONFIG_DMA_CACHE_FIQ_BROADCAST ++# define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area) ++# define dmac_flush_range __glue(_CACHE,_dma_flush_range) +#else -+#define __cpuc_flush_dcache_area __glue(fiq,_flush_kern_dcache_area) ++# define __cpuc_flush_dcache_area __glue(fiq,_flush_kern_dcache_area) ++# define dmac_flush_range __glue(fiq,_dma_flush_range) ++#endif + -+#define dmac_flush_range __glue(fiq,_dma_flush_range) -+#endif /* CONFIG_DMA_CACHE_FIQ_BROADCAST */ #endif #endif @@ -38,15 +40,23 @@ --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c -@@ -329,7 +329,11 @@ void flush_dcache_page(struct page *page +@@ -319,6 +319,7 @@ void __sync_icache_dcache(pte_t pteval) + void flush_dcache_page(struct page *page) + { + struct address_space *mapping; ++ bool skip_broadcast = true; + + /* + * The zero page is never written to, so never has any dirty +@@ -329,7 +330,10 @@ void flush_dcache_page(struct page *page mapping = page_mapping(page); +- if (!cache_ops_need_broadcast() && +#ifndef CONFIG_DMA_CACHE_FIQ_BROADCAST - if (!cache_ops_need_broadcast() && -+#else -+ if ( ++ skip_broadcast = !cache_ops_need_broadcast(); +#endif ++ if (skip_broadcast && mapping && !page_mapped(page)) clear_bit(PG_dcache_clean, &page->flags); else { @@ -56,13 +66,15 @@ #include #ifndef MULTI_CACHE +-#define dmac_map_area __glue(_CACHE,_dma_map_area) +-#define dmac_unmap_area __glue(_CACHE,_dma_unmap_area) +#ifndef CONFIG_DMA_CACHE_FIQ_BROADCAST - #define dmac_map_area __glue(_CACHE,_dma_map_area) - #define dmac_unmap_area __glue(_CACHE,_dma_unmap_area) ++# define dmac_map_area __glue(_CACHE,_dma_map_area) ++# define dmac_unmap_area __glue(_CACHE,_dma_unmap_area) +#else -+#define dmac_map_area __glue(fiq,_dma_map_area) -+#define dmac_unmap_area __glue(fiq,_dma_unmap_area) -+#endif /* CONFIG_DMA_CACHE_FIQ_BROADCAST */ ++# define dmac_map_area __glue(fiq,_dma_map_area) ++# define dmac_unmap_area __glue(fiq,_dma_unmap_area) ++#endif /* * These are private to the dma-mapping API. Do not use directly.