kernel: improve dma ops inlining patches

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 37790
This commit is contained in:
Felix Fietkau 2013-08-15 09:23:07 +00:00
parent e8d6de95b3
commit e27f67b30a
3 changed files with 157 additions and 40 deletions

View File

@ -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);
}

View File

@ -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)

View File

@ -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);