From: Felix Fietkau <nbd@nbd.name> Date: Tue, 5 Dec 2017 12:46:01 +0100 Subject: [PATCH] MIPS: mm: remove no-op dma_map_ops where possible If no post-DMA flush is required, and the platform does not provide plat_unmap_dma_mem(), there is no need to include unmap or sync_for_cpu ops. With this patch they are compiled out to improve icache footprint on devices that handle lots of DMA traffic (especially network routers). Signed-off-by: Felix Fietkau <nbd@nbd.name> --- --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -220,6 +220,7 @@ config BMIPS_GENERIC select BRCMSTB_L2_IRQ select IRQ_MIPS_CPU select DMA_NONCOHERENT + select DMA_UNMAP_POST_FLUSH select SYS_SUPPORTS_32BIT_KERNEL select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_BIG_ENDIAN @@ -345,6 +346,7 @@ config MACH_JAZZ select CSRC_R4K select DEFAULT_SGI_PARTITION if CPU_BIG_ENDIAN select GENERIC_ISA_DMA + select DMA_UNMAP_POST_FLUSH select HAVE_PCSPKR_PLATFORM select IRQ_MIPS_CPU select I8253 @@ -1127,6 +1129,9 @@ config DMA_NONCOHERENT bool select NEED_DMA_MAP_STATE +config DMA_UNMAP_POST_FLUSH + bool + config NEED_DMA_MAP_STATE bool @@ -1651,6 +1656,7 @@ config CPU_R10000 select CPU_SUPPORTS_64BIT_KERNEL select CPU_SUPPORTS_HIGHMEM select CPU_SUPPORTS_HUGEPAGES + select DMA_UNMAP_POST_FLUSH help MIPS Technologies R10000-series processors. @@ -1899,9 +1905,11 @@ config SYS_HAS_CPU_MIPS32_R3_5 bool config SYS_HAS_CPU_MIPS32_R5 + select DMA_UNMAP_POST_FLUSH bool config SYS_HAS_CPU_MIPS32_R6 + select DMA_UNMAP_POST_FLUSH bool config SYS_HAS_CPU_MIPS64_R1 @@ -1911,6 +1919,7 @@ config SYS_HAS_CPU_MIPS64_R2 bool config SYS_HAS_CPU_MIPS64_R6 + select DMA_UNMAP_POST_FLUSH bool config SYS_HAS_CPU_R3000 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c @@ -267,8 +267,9 @@ static inline void __dma_sync(struct pag } while (left); } -static void mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr, - size_t size, enum dma_data_direction direction, unsigned long attrs) +static void __maybe_unused +mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, + enum dma_data_direction direction, unsigned long attrs) { if (cpu_needs_post_dma_flush(dev) && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) __dma_sync(dma_addr_to_page(dev, dma_addr), @@ -308,9 +309,10 @@ static dma_addr_t mips_dma_map_page(stru return plat_map_dma_mem_page(dev, page) + offset; } -static void mips_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, - int nhwentries, enum dma_data_direction direction, - unsigned long attrs) +static void __maybe_unused +mips_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, + int nhwentries, enum dma_data_direction direction, + unsigned long attrs) { int i; struct scatterlist *sg; @@ -325,8 +327,9 @@ static void mips_dma_unmap_sg(struct dev } } -static void mips_dma_sync_single_for_cpu(struct device *dev, - dma_addr_t dma_handle, size_t size, enum dma_data_direction direction) +static void __maybe_unused +mips_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, + size_t size, enum dma_data_direction direction) { if (cpu_needs_post_dma_flush(dev)) __dma_sync(dma_addr_to_page(dev, dma_handle), @@ -342,9 +345,9 @@ static void mips_dma_sync_single_for_dev dma_handle & ~PAGE_MASK, size, direction); } -static void mips_dma_sync_sg_for_cpu(struct device *dev, - struct scatterlist *sglist, int nelems, - enum dma_data_direction direction) +static void __maybe_unused +mips_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sglist, + int nelems, enum dma_data_direction direction) { int i; struct scatterlist *sg; @@ -394,12 +397,14 @@ static const struct dma_map_ops mips_def .free = mips_dma_free_coherent, .mmap = mips_dma_mmap, .map_page = mips_dma_map_page, - .unmap_page = mips_dma_unmap_page, .map_sg = mips_dma_map_sg, +#ifdef CONFIG_DMA_UNMAP_POST_FLUSH + .unmap_page = mips_dma_unmap_page, .unmap_sg = mips_dma_unmap_sg, .sync_single_for_cpu = mips_dma_sync_single_for_cpu, - .sync_single_for_device = mips_dma_sync_single_for_device, .sync_sg_for_cpu = mips_dma_sync_sg_for_cpu, +#endif + .sync_single_for_device = mips_dma_sync_single_for_device, .sync_sg_for_device = mips_dma_sync_sg_for_device, .dma_supported = mips_dma_supported };