summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-08-15 09:23:07 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-08-15 09:23:07 +0000
commit42482772a14032314d4d03571c4ea4f77e44a2df (patch)
tree6864c8d969134283e73c35fa5ee36df299c7df7a
parentd4d056e34dc530ddd6992962a09cb352ee939f35 (diff)
kernel: improve dma ops inlining patches
Signed-off-by: Felix Fietkau <nbd@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@37790 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--target/linux/generic/patches-3.10/130-mips_remove_plat_dma_functions.patch68
-rw-r--r--target/linux/generic/patches-3.10/131-improve_noncoherent_dma_checks.patch89
-rw-r--r--target/linux/generic/patches-3.10/132-mips_inline_dma_ops.patch (renamed from target/linux/generic/patches-3.10/131-mips_inline_dma_ops.patch)40
3 files changed, 157 insertions, 40 deletions
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 76a3584274..958841da1a 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 <nbd@openwrt.org>
-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 <nbd@openwrt.org>
---
---- 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 <nbd@openwrt.org>
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 0000000000..c18e7a3e21
--- /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 <nbd@openwrt.org>
+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 <nbd@openwrt.org>
+---
+ 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 <dma-coherence.h>
+
++#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
index 7ab008086d..b72bb620fd 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 <nbd@openwrt.org>
-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 <nbd@openwrt.org>
---
+ 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 <nbd@openwrt.org>
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 <nbd@openwrt.org>
}
--- 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 <nbd@openwrt.org>
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 <nbd@openwrt.org>
{
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 <nbd@openwrt.org>
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 <nbd@openwrt.org>
{
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 <nbd@openwrt.org>
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 <nbd@openwrt.org>
{
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 <nbd@openwrt.org>
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);