From e27f67b30a5c1a838fd4dc7762f43d41361ae4e2 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 15 Aug 2013 09:23:07 +0000 Subject: [PATCH] kernel: improve dma ops inlining patches Signed-off-by: Felix Fietkau SVN-Revision: 37790 --- .../130-mips_remove_plat_dma_functions.patch | 68 ++++++++------ .../131-improve_noncoherent_dma_checks.patch | 89 +++++++++++++++++++ ...ps.patch => 132-mips_inline_dma_ops.patch} | 40 ++++++--- 3 files changed, 157 insertions(+), 40 deletions(-) create mode 100644 target/linux/generic/patches-3.10/131-improve_noncoherent_dma_checks.patch rename target/linux/generic/patches-3.10/{131-mips_inline_dma_ops.patch => 132-mips_inline_dma_ops.patch} (93%) diff --git a/target/linux/generic/patches-3.10/130-mips_remove_plat_dma_functions.patch b/target/linux/generic/patches-3.10/130-mips_remove_plat_dma_functions.patch index 76a35842749c..958841da1af6 100644 --- a/target/linux/generic/patches-3.10/130-mips_remove_plat_dma_functions.patch +++ b/target/linux/generic/patches-3.10/130-mips_remove_plat_dma_functions.patch @@ -1,35 +1,20 @@ +From 151c4e4a06b0b8d16c2fd392bb0e33868b12357f Mon Sep 17 00:00:00 2001 From: Felix Fietkau -Subject: [PATCH 1/2] MIPS: remove unnecessary platform dma helper functions +Date: Mon, 12 Aug 2013 12:45:52 +0200 +Subject: [PATCH] MIPS: remove unnecessary platform dma helper functions Signed-off-by: Felix Fietkau --- ---- a/arch/mips/mm/dma-default.c -+++ b/arch/mips/mm/dma-default.c -@@ -289,7 +289,6 @@ static void mips_dma_sync_single_for_cpu - static void mips_dma_sync_single_for_device(struct device *dev, - dma_addr_t dma_handle, size_t size, enum dma_data_direction direction) - { -- plat_extra_sync_for_device(dev); - if (!plat_device_is_coherent(dev)) - __dma_sync(dma_addr_to_page(dev, dma_handle), - dma_handle & ~PAGE_MASK, size, direction); -@@ -323,7 +322,7 @@ static void mips_dma_sync_sg_for_device( - - int mips_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) - { -- return plat_dma_mapping_error(dev, dma_addr); -+ return 0; - } - - int mips_dma_supported(struct device *dev, u64 mask) -@@ -336,7 +335,6 @@ void dma_cache_sync(struct device *dev, - { - BUG_ON(direction == DMA_NONE); - -- plat_extra_sync_for_device(dev); - if (!plat_device_is_coherent(dev)) - __dma_sync_virtual(vaddr, size, direction); - } + arch/mips/include/asm/mach-cavium-octeon/dma-coherence.h | 12 ------------ + arch/mips/include/asm/mach-generic/dma-coherence.h | 10 ---------- + arch/mips/include/asm/mach-ip27/dma-coherence.h | 10 ---------- + arch/mips/include/asm/mach-ip32/dma-coherence.h | 11 ----------- + arch/mips/include/asm/mach-jazz/dma-coherence.h | 10 ---------- + arch/mips/include/asm/mach-loongson/dma-coherence.h | 10 ---------- + arch/mips/include/asm/mach-powertv/dma-coherence.h | 10 ---------- + arch/mips/mm/dma-default.c | 4 +--- + 8 files changed, 1 insertion(+), 76 deletions(-) + --- a/arch/mips/include/asm/mach-cavium-octeon/dma-coherence.h +++ b/arch/mips/include/asm/mach-cavium-octeon/dma-coherence.h @@ -46,22 +46,11 @@ static inline int plat_dma_supported(str @@ -170,3 +155,30 @@ Signed-off-by: Felix Fietkau static inline int plat_device_is_coherent(struct device *dev) { return 0; +--- a/arch/mips/mm/dma-default.c ++++ b/arch/mips/mm/dma-default.c +@@ -289,7 +289,6 @@ static void mips_dma_sync_single_for_cpu + static void mips_dma_sync_single_for_device(struct device *dev, + dma_addr_t dma_handle, size_t size, enum dma_data_direction direction) + { +- plat_extra_sync_for_device(dev); + if (!plat_device_is_coherent(dev)) + __dma_sync(dma_addr_to_page(dev, dma_handle), + dma_handle & ~PAGE_MASK, size, direction); +@@ -323,7 +322,7 @@ static void mips_dma_sync_sg_for_device( + + int mips_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) + { +- return plat_dma_mapping_error(dev, dma_addr); ++ return 0; + } + + int mips_dma_supported(struct device *dev, u64 mask) +@@ -336,7 +335,6 @@ void dma_cache_sync(struct device *dev, + { + BUG_ON(direction == DMA_NONE); + +- plat_extra_sync_for_device(dev); + if (!plat_device_is_coherent(dev)) + __dma_sync_virtual(vaddr, size, direction); + } diff --git a/target/linux/generic/patches-3.10/131-improve_noncoherent_dma_checks.patch b/target/linux/generic/patches-3.10/131-improve_noncoherent_dma_checks.patch new file mode 100644 index 000000000000..c18e7a3e21d3 --- /dev/null +++ b/target/linux/generic/patches-3.10/131-improve_noncoherent_dma_checks.patch @@ -0,0 +1,89 @@ +From d593f8fc627f8cdaee9c14e4d22b0770a09baaf1 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Thu, 15 Aug 2013 10:47:47 +0200 +Subject: [PATCH] MIPS: improve checks for noncoherent DMA + +Only one MIPS development board actually supports enabling/disabling DMA +coherency at runtime, so it's not a good idea to push the overhead of +checking that configuration setting onto every other supported target as +well. + +Signed-off-by: Felix Fietkau +--- + arch/mips/Kconfig | 6 +++++- + arch/mips/include/asm/dma-coherence.h | 7 +++++++ + arch/mips/include/asm/mach-generic/dma-coherence.h | 4 ---- + arch/mips/mm/dma-default.c | 2 ++ + 4 files changed, 14 insertions(+), 5 deletions(-) + +--- a/arch/mips/Kconfig ++++ b/arch/mips/Kconfig +@@ -296,7 +296,7 @@ config MIPS_MALTA + select CEVT_R4K + select CSRC_R4K + select CSRC_GIC +- select DMA_NONCOHERENT ++ select DMA_MAYBE_COHERENT + select GENERIC_ISA_DMA + select HAVE_PCSPKR_PLATFORM + select IRQ_CPU +@@ -947,6 +947,10 @@ config FW_CFE + config ARCH_DMA_ADDR_T_64BIT + def_bool (HIGHMEM && 64BIT_PHYS_ADDR) || 64BIT + ++config DMA_MAYBE_COHERENT ++ select DMA_NONCOHERENT ++ bool ++ + config DMA_COHERENT + bool + +--- a/arch/mips/include/asm/dma-coherence.h ++++ b/arch/mips/include/asm/dma-coherence.h +@@ -9,7 +9,14 @@ + #ifndef __ASM_DMA_COHERENCE_H + #define __ASM_DMA_COHERENCE_H + ++#ifdef CONFIG_DMA_MAYBE_COHERENT + extern int coherentio; + extern int hw_coherentio; ++#elif defined(CONFIG_DMA_COHERENT) ++#define coherentio 1 ++#else ++#define coherentio 0 ++#endif ++#define hw_coherentio 0 + + #endif +--- a/arch/mips/include/asm/mach-generic/dma-coherence.h ++++ b/arch/mips/include/asm/mach-generic/dma-coherence.h +@@ -49,11 +49,7 @@ static inline int plat_dma_supported(str + + static inline int plat_device_is_coherent(struct device *dev) + { +-#ifdef CONFIG_DMA_COHERENT +- return 1; +-#else + return coherentio; +-#endif + } + + #endif /* __ASM_MACH_GENERIC_DMA_COHERENCE_H */ +--- a/arch/mips/mm/dma-default.c ++++ b/arch/mips/mm/dma-default.c +@@ -22,6 +22,7 @@ + + #include + ++#ifdef CONFIG_DMA_MAYBE_COHERENT + int coherentio = 0; /* User defined DMA coherency from command line. */ + EXPORT_SYMBOL_GPL(coherentio); + int hw_coherentio = 0; /* Actual hardware supported DMA coherency setting. */ +@@ -41,6 +42,7 @@ static int __init setnocoherentio(char * + return 0; + } + early_param("nocoherentio", setnocoherentio); ++#endif + + static inline struct page *dma_addr_to_page(struct device *dev, + dma_addr_t dma_addr) diff --git a/target/linux/generic/patches-3.10/131-mips_inline_dma_ops.patch b/target/linux/generic/patches-3.10/132-mips_inline_dma_ops.patch similarity index 93% rename from target/linux/generic/patches-3.10/131-mips_inline_dma_ops.patch rename to target/linux/generic/patches-3.10/132-mips_inline_dma_ops.patch index 7ab008086d31..b72bb620fdaa 100644 --- a/target/linux/generic/patches-3.10/131-mips_inline_dma_ops.patch +++ b/target/linux/generic/patches-3.10/132-mips_inline_dma_ops.patch @@ -1,5 +1,7 @@ +From 2c58080407554e1bac8fd50d23cb02420524caed Mon Sep 17 00:00:00 2001 From: Felix Fietkau -Subject: [PATCH 2/2] MIPS: partially inline dma ops +Date: Mon, 12 Aug 2013 12:50:22 +0200 +Subject: [PATCH] MIPS: partially inline dma ops Several DMA ops are no-op on many platforms, and the indirection through the mips_dma_map_ops function table is causing the compiler to emit @@ -10,9 +12,14 @@ based system), and also slightly reduces code size of a few drivers. Signed-off-by: Felix Fietkau --- + arch/mips/Kconfig | 4 + + arch/mips/include/asm/dma-mapping.h | 360 +++++++++++++++++++++++++++++++++++- + arch/mips/mm/dma-default.c | 163 ++-------------- + 3 files changed, 373 insertions(+), 154 deletions(-) + --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -1426,6 +1426,7 @@ config CPU_CAVIUM_OCTEON +@@ -1430,6 +1430,7 @@ config CPU_CAVIUM_OCTEON select LIBFDT select USE_OF select USB_EHCI_BIG_ENDIAN_MMIO @@ -20,7 +27,7 @@ Signed-off-by: Felix Fietkau help The Cavium Octeon processor is a highly integrated chip containing many ethernet hardware widgets for networking tasks. The processor -@@ -1646,6 +1647,9 @@ config SYS_HAS_CPU_XLR +@@ -1650,6 +1651,9 @@ config SYS_HAS_CPU_XLR config SYS_HAS_CPU_XLP bool @@ -444,9 +451,18 @@ Signed-off-by: Felix Fietkau } --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c -@@ -42,26 +42,6 @@ static int __init setnocoherentio(char * - } +@@ -24,7 +24,7 @@ + + #ifdef CONFIG_DMA_MAYBE_COHERENT + int coherentio = 0; /* User defined DMA coherency from command line. */ +-EXPORT_SYMBOL_GPL(coherentio); ++EXPORT_SYMBOL(coherentio); + int hw_coherentio = 0; /* Actual hardware supported DMA coherency setting. */ + + static int __init setcoherentio(char *str) +@@ -44,26 +44,6 @@ static int __init setnocoherentio(char * early_param("nocoherentio", setnocoherentio); + #endif -static inline struct page *dma_addr_to_page(struct device *dev, - dma_addr_t dma_addr) @@ -471,7 +487,7 @@ Signed-off-by: Felix Fietkau static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp) { gfp_t dma_flag; -@@ -117,8 +97,9 @@ void *dma_alloc_noncoherent(struct devic +@@ -119,8 +99,9 @@ void *dma_alloc_noncoherent(struct devic } EXPORT_SYMBOL(dma_alloc_noncoherent); @@ -483,7 +499,7 @@ Signed-off-by: Felix Fietkau { void *ret; -@@ -142,6 +123,7 @@ static void *mips_dma_alloc_coherent(str +@@ -144,6 +125,7 @@ static void *mips_dma_alloc_coherent(str return ret; } @@ -491,7 +507,7 @@ Signed-off-by: Felix Fietkau void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr, -@@ -152,8 +134,8 @@ void dma_free_noncoherent(struct device +@@ -154,8 +136,8 @@ void dma_free_noncoherent(struct device } EXPORT_SYMBOL(dma_free_noncoherent); @@ -502,7 +518,7 @@ Signed-off-by: Felix Fietkau { unsigned long addr = (unsigned long) vaddr; int order = get_order(size); -@@ -168,6 +150,7 @@ static void mips_dma_free_coherent(struc +@@ -170,6 +152,7 @@ static void mips_dma_free_coherent(struc free_pages(addr, get_order(size)); } @@ -510,7 +526,7 @@ Signed-off-by: Felix Fietkau static inline void __dma_sync_virtual(void *addr, size_t size, enum dma_data_direction direction) -@@ -196,8 +179,8 @@ static inline void __dma_sync_virtual(vo +@@ -198,8 +181,8 @@ static inline void __dma_sync_virtual(vo * If highmem is not configured then the bulk of this loop gets * optimized out. */ @@ -521,7 +537,7 @@ Signed-off-by: Felix Fietkau { size_t left = size; -@@ -226,109 +209,7 @@ static inline void __dma_sync(struct pag +@@ -228,109 +211,7 @@ static inline void __dma_sync(struct pag left -= len; } while (left); } @@ -632,7 +648,7 @@ Signed-off-by: Felix Fietkau void dma_cache_sync(struct device *dev, void *vaddr, size_t size, enum dma_data_direction direction) -@@ -341,23 +222,10 @@ void dma_cache_sync(struct device *dev, +@@ -343,23 +224,10 @@ void dma_cache_sync(struct device *dev, EXPORT_SYMBOL(dma_cache_sync); -- 2.30.2