kernel: improve dma ops inlining patches
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 37790
This commit is contained in:
parent
e8d6de95b3
commit
e27f67b30a
3 changed files with 157 additions and 40 deletions
|
@ -1,35 +1,20 @@
|
||||||
|
From 151c4e4a06b0b8d16c2fd392bb0e33868b12357f Mon Sep 17 00:00:00 2001
|
||||||
From: Felix Fietkau <nbd@openwrt.org>
|
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>
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
---
|
---
|
||||||
--- a/arch/mips/mm/dma-default.c
|
arch/mips/include/asm/mach-cavium-octeon/dma-coherence.h | 12 ------------
|
||||||
+++ b/arch/mips/mm/dma-default.c
|
arch/mips/include/asm/mach-generic/dma-coherence.h | 10 ----------
|
||||||
@@ -289,7 +289,6 @@ static void mips_dma_sync_single_for_cpu
|
arch/mips/include/asm/mach-ip27/dma-coherence.h | 10 ----------
|
||||||
static void mips_dma_sync_single_for_device(struct device *dev,
|
arch/mips/include/asm/mach-ip32/dma-coherence.h | 11 -----------
|
||||||
dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
|
arch/mips/include/asm/mach-jazz/dma-coherence.h | 10 ----------
|
||||||
{
|
arch/mips/include/asm/mach-loongson/dma-coherence.h | 10 ----------
|
||||||
- plat_extra_sync_for_device(dev);
|
arch/mips/include/asm/mach-powertv/dma-coherence.h | 10 ----------
|
||||||
if (!plat_device_is_coherent(dev))
|
arch/mips/mm/dma-default.c | 4 +---
|
||||||
__dma_sync(dma_addr_to_page(dev, dma_handle),
|
8 files changed, 1 insertion(+), 76 deletions(-)
|
||||||
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);
|
|
||||||
}
|
|
||||||
--- a/arch/mips/include/asm/mach-cavium-octeon/dma-coherence.h
|
--- a/arch/mips/include/asm/mach-cavium-octeon/dma-coherence.h
|
||||||
+++ b/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
|
@@ -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)
|
static inline int plat_device_is_coherent(struct device *dev)
|
||||||
{
|
{
|
||||||
return 0;
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
|
@ -1,5 +1,7 @@
|
||||||
|
From 2c58080407554e1bac8fd50d23cb02420524caed Mon Sep 17 00:00:00 2001
|
||||||
From: Felix Fietkau <nbd@openwrt.org>
|
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
|
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
|
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>
|
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
|
--- a/arch/mips/Kconfig
|
||||||
+++ b/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 LIBFDT
|
||||||
select USE_OF
|
select USE_OF
|
||||||
select USB_EHCI_BIG_ENDIAN_MMIO
|
select USB_EHCI_BIG_ENDIAN_MMIO
|
||||||
|
@ -20,7 +27,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
help
|
help
|
||||||
The Cavium Octeon processor is a highly integrated chip containing
|
The Cavium Octeon processor is a highly integrated chip containing
|
||||||
many ethernet hardware widgets for networking tasks. The processor
|
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
|
config SYS_HAS_CPU_XLP
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
@ -444,9 +451,18 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
}
|
}
|
||||||
--- a/arch/mips/mm/dma-default.c
|
--- a/arch/mips/mm/dma-default.c
|
||||||
+++ b/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);
|
early_param("nocoherentio", setnocoherentio);
|
||||||
|
#endif
|
||||||
|
|
||||||
-static inline struct page *dma_addr_to_page(struct device *dev,
|
-static inline struct page *dma_addr_to_page(struct device *dev,
|
||||||
- dma_addr_t dma_addr)
|
- 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)
|
static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
|
||||||
{
|
{
|
||||||
gfp_t dma_flag;
|
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);
|
EXPORT_SYMBOL(dma_alloc_noncoherent);
|
||||||
|
|
||||||
|
@ -483,7 +499,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
{
|
{
|
||||||
void *ret;
|
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;
|
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,
|
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);
|
EXPORT_SYMBOL(dma_free_noncoherent);
|
||||||
|
|
||||||
|
@ -502,7 +518,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
{
|
{
|
||||||
unsigned long addr = (unsigned long) vaddr;
|
unsigned long addr = (unsigned long) vaddr;
|
||||||
int order = get_order(size);
|
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));
|
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,
|
static inline void __dma_sync_virtual(void *addr, size_t size,
|
||||||
enum dma_data_direction direction)
|
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
|
* If highmem is not configured then the bulk of this loop gets
|
||||||
* optimized out.
|
* optimized out.
|
||||||
*/
|
*/
|
||||||
|
@ -521,7 +537,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
{
|
{
|
||||||
size_t left = size;
|
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;
|
left -= len;
|
||||||
} while (left);
|
} 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,
|
void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||||
enum dma_data_direction direction)
|
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);
|
EXPORT_SYMBOL(dma_cache_sync);
|
||||||
|
|
Loading…
Reference in a new issue