1 From: Felix Fietkau <nbd@nbd.name>
2 Date: Tue, 5 Dec 2017 12:46:01 +0100
3 Subject: [PATCH] MIPS: mm: remove no-op dma_map_ops where possible
5 If no post-DMA flush is required, and the platform does not provide
6 plat_unmap_dma_mem(), there is no need to include unmap or sync_for_cpu
9 With this patch they are compiled out to improve icache footprint
10 on devices that handle lots of DMA traffic (especially network routers).
12 Signed-off-by: Felix Fietkau <nbd@nbd.name>
15 --- a/arch/mips/Kconfig
16 +++ b/arch/mips/Kconfig
17 @@ -220,6 +220,7 @@ config BMIPS_GENERIC
20 select DMA_NONCOHERENT
21 + select DMA_UNMAP_POST_FLUSH
22 select SYS_SUPPORTS_32BIT_KERNEL
23 select SYS_SUPPORTS_LITTLE_ENDIAN
24 select SYS_SUPPORTS_BIG_ENDIAN
25 @@ -345,6 +346,7 @@ config MACH_JAZZ
27 select DEFAULT_SGI_PARTITION if CPU_BIG_ENDIAN
28 select GENERIC_ISA_DMA
29 + select DMA_UNMAP_POST_FLUSH
30 select HAVE_PCSPKR_PLATFORM
33 @@ -1127,6 +1129,9 @@ config DMA_NONCOHERENT
35 select NEED_DMA_MAP_STATE
37 +config DMA_UNMAP_POST_FLUSH
40 config NEED_DMA_MAP_STATE
43 @@ -1651,6 +1656,7 @@ config CPU_R10000
44 select CPU_SUPPORTS_64BIT_KERNEL
45 select CPU_SUPPORTS_HIGHMEM
46 select CPU_SUPPORTS_HUGEPAGES
47 + select DMA_UNMAP_POST_FLUSH
49 MIPS Technologies R10000-series processors.
51 @@ -1899,9 +1905,11 @@ config SYS_HAS_CPU_MIPS32_R3_5
54 config SYS_HAS_CPU_MIPS32_R5
55 + select DMA_UNMAP_POST_FLUSH
58 config SYS_HAS_CPU_MIPS32_R6
59 + select DMA_UNMAP_POST_FLUSH
62 config SYS_HAS_CPU_MIPS64_R1
63 @@ -1911,6 +1919,7 @@ config SYS_HAS_CPU_MIPS64_R2
66 config SYS_HAS_CPU_MIPS64_R6
67 + select DMA_UNMAP_POST_FLUSH
70 config SYS_HAS_CPU_R3000
71 --- a/arch/mips/mm/dma-default.c
72 +++ b/arch/mips/mm/dma-default.c
73 @@ -267,8 +267,9 @@ static inline void __dma_sync(struct pag
77 -static void mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
78 - size_t size, enum dma_data_direction direction, unsigned long attrs)
79 +static void __maybe_unused
80 +mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size,
81 + enum dma_data_direction direction, unsigned long attrs)
83 if (cpu_needs_post_dma_flush(dev) && !(attrs & DMA_ATTR_SKIP_CPU_SYNC))
84 __dma_sync(dma_addr_to_page(dev, dma_addr),
85 @@ -308,9 +309,10 @@ static dma_addr_t mips_dma_map_page(stru
86 return plat_map_dma_mem_page(dev, page) + offset;
89 -static void mips_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
90 - int nhwentries, enum dma_data_direction direction,
91 - unsigned long attrs)
92 +static void __maybe_unused
93 +mips_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
94 + int nhwentries, enum dma_data_direction direction,
95 + unsigned long attrs)
98 struct scatterlist *sg;
99 @@ -325,8 +327,9 @@ static void mips_dma_unmap_sg(struct dev
103 -static void mips_dma_sync_single_for_cpu(struct device *dev,
104 - dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
105 +static void __maybe_unused
106 +mips_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
107 + size_t size, enum dma_data_direction direction)
109 if (cpu_needs_post_dma_flush(dev))
110 __dma_sync(dma_addr_to_page(dev, dma_handle),
111 @@ -342,9 +345,9 @@ static void mips_dma_sync_single_for_dev
112 dma_handle & ~PAGE_MASK, size, direction);
115 -static void mips_dma_sync_sg_for_cpu(struct device *dev,
116 - struct scatterlist *sglist, int nelems,
117 - enum dma_data_direction direction)
118 +static void __maybe_unused
119 +mips_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sglist,
120 + int nelems, enum dma_data_direction direction)
123 struct scatterlist *sg;
124 @@ -394,12 +397,14 @@ static const struct dma_map_ops mips_def
125 .free = mips_dma_free_coherent,
126 .mmap = mips_dma_mmap,
127 .map_page = mips_dma_map_page,
128 - .unmap_page = mips_dma_unmap_page,
129 .map_sg = mips_dma_map_sg,
130 +#ifdef CONFIG_DMA_UNMAP_POST_FLUSH
131 + .unmap_page = mips_dma_unmap_page,
132 .unmap_sg = mips_dma_unmap_sg,
133 .sync_single_for_cpu = mips_dma_sync_single_for_cpu,
134 - .sync_single_for_device = mips_dma_sync_single_for_device,
135 .sync_sg_for_cpu = mips_dma_sync_sg_for_cpu,
137 + .sync_single_for_device = mips_dma_sync_single_for_device,
138 .sync_sg_for_device = mips_dma_sync_sg_for_device,
139 .dma_supported = mips_dma_supported