/branches/18.06.1/target/linux/generic/pending-4.14/341-MIPS-mm-remove-no-op-dma_map_ops-where-possible.patch |
@@ -0,0 +1,140 @@ |
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 |
@@ -221,6 +221,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 |
@@ -346,6 +347,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 |
@@ -1131,6 +1133,9 @@ config DMA_NONCOHERENT |
bool |
select NEED_DMA_MAP_STATE |
|
+config DMA_UNMAP_POST_FLUSH |
+ bool |
+ |
config NEED_DMA_MAP_STATE |
bool |
|
@@ -1655,6 +1660,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. |
|
@@ -1903,9 +1909,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 |
@@ -1915,6 +1923,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 |
}; |