summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2015-10-23 11:06:56 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2015-11-03 07:27:44 +0100
commitb792124a7dd30f03b9ad0e06589b5b58ed930d3b (patch)
tree9811bbbc0b5bb5baade7d32309ced5b3c59046df /arch
parent6b127d4f189c03f4417f6185de1aeb55b1706f94 (diff)
downloadbarebox-b792124a7dd30f03b9ad0e06589b5b58ed930d3b.tar.gz
barebox-b792124a7dd30f03b9ad0e06589b5b58ed930d3b.tar.xz
rework remap_range
remap_range is for remapping regions with different cache attributes. It is implemented for ARM and PowerPC only, the other architectures only provide stubs. Currently the new cache attributes are passed in an architecture specific way and the attributes have to be retrieved by calls to mmu_get_pte_cached_flags() and mmu_get_pte_uncached_flags(). Make this simpler by providing architecture independent flags which can be directly passed to remap_range() Also provide a MAP_ARCH_DEFAULT flag and a arch_can_remap() function. The MAP_ARCH_DEFAULT defaults to whatever caching type the architecture has as default. the arch_can_remap() function returns true if the architecture can change the cache attributes, false otherwise. This allows the memtest code to better find out what it has to do. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/cpu/mmu.c30
-rw-r--r--arch/arm/include/asm/mmu.h23
-rw-r--r--arch/blackfin/include/asm/mmu.h14
-rw-r--r--arch/mips/include/asm/mmu.h14
-rw-r--r--arch/nios2/include/asm/mmu.h14
-rw-r--r--arch/openrisc/include/asm/mmu.h14
-rw-r--r--arch/ppc/cpu-85xx/mmu.c26
-rw-r--r--arch/ppc/include/asm/mmu.h24
-rw-r--r--arch/sandbox/include/asm/mmu.h14
-rw-r--r--arch/x86/include/asm/mmu.h14
10 files changed, 48 insertions, 139 deletions
diff --git a/arch/arm/cpu/mmu.c b/arch/arm/cpu/mmu.c
index 470b448957..81c23947b7 100644
--- a/arch/arm/cpu/mmu.c
+++ b/arch/arm/cpu/mmu.c
@@ -20,7 +20,7 @@
#include <common.h>
#include <dma-dir.h>
#include <init.h>
-#include <asm/mmu.h>
+#include <mmu.h>
#include <errno.h>
#include <linux/sizes.h>
#include <asm/memory.h>
@@ -81,16 +81,6 @@ static uint32_t pte_flags_uncached;
#define PTE_MASK ((1 << 12) - 1)
-uint32_t mmu_get_pte_cached_flags()
-{
- return pte_flags_cached;
-}
-
-uint32_t mmu_get_pte_uncached_flags()
-{
- return pte_flags_uncached;
-}
-
static void arm_mmu_not_initialized_error(void)
{
/*
@@ -173,24 +163,38 @@ static void dma_inv_range(unsigned long start, unsigned long end)
__dma_inv_range(start, end);
}
-void remap_range(void *_start, size_t size, uint32_t flags)
+int arch_remap_range(void *_start, size_t size, unsigned flags)
{
unsigned long start = (unsigned long)_start;
u32 *p;
int numentries, i;
+ u32 pte_flags;
+
+ switch (flags) {
+ case MAP_CACHED:
+ pte_flags = pte_flags_cached;
+ break;
+ case MAP_UNCACHED:
+ pte_flags = pte_flags_uncached;
+ break;
+ default:
+ return -EINVAL;
+ }
numentries = size >> PAGE_SHIFT;
p = find_pte(start);
for (i = 0; i < numentries; i++) {
p[i] &= ~PTE_MASK;
- p[i] |= flags | PTE_TYPE_SMALL;
+ p[i] |= pte_flags | PTE_TYPE_SMALL;
}
dma_flush_range((unsigned long)p,
(unsigned long)p + numentries * sizeof(u32));
tlb_invalidate();
+
+ return 0;
}
void *map_io_sections(unsigned long phys, void *_start, size_t size)
diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h
index 3b19e9ef3c..8de6544657 100644
--- a/arch/arm/include/asm/mmu.h
+++ b/arch/arm/include/asm/mmu.h
@@ -27,32 +27,17 @@ static inline void setup_dma_coherent(unsigned long offset)
}
#ifdef CONFIG_MMU
-void remap_range(void *_start, size_t size, uint32_t flags);
+#define ARCH_HAS_REMAP
+#define MAP_ARCH_DEFAULT MAP_CACHED
+int arch_remap_range(void *_start, size_t size, unsigned flags);
void *map_io_sections(unsigned long physaddr, void *start, size_t size);
-uint32_t mmu_get_pte_cached_flags(void);
-uint32_t mmu_get_pte_uncached_flags(void);
-
#else
-
-static inline void remap_range(void *_start, size_t size, uint32_t flags)
-{
-}
-
+#define MAP_ARCH_DEFAULT MAP_UNCACHED
static inline void *map_io_sections(unsigned long phys, void *start, size_t size)
{
return (void *)phys;
}
-static inline uint32_t mmu_get_pte_cached_flags(void)
-{
- return 0;
-}
-
-static inline uint32_t mmu_get_pte_uncached_flags(void)
-{
- return 0;
-}
-
#endif
#ifdef CONFIG_CACHE_L2X0
diff --git a/arch/blackfin/include/asm/mmu.h b/arch/blackfin/include/asm/mmu.h
index bf654206ac..95af871420 100644
--- a/arch/blackfin/include/asm/mmu.h
+++ b/arch/blackfin/include/asm/mmu.h
@@ -1,18 +1,6 @@
#ifndef __ASM_MMU_H
#define __ASM_MMU_H
-static inline void remap_range(void *_start, size_t size, uint32_t flags)
-{
-}
-
-static inline uint32_t mmu_get_pte_cached_flags(void)
-{
- return 0;
-}
-
-static inline uint32_t mmu_get_pte_uncached_flags(void)
-{
- return 0;
-}
+#define MAP_ARCH_DEFAULT MAP_UNCACHED
#endif /* __ASM_MMU_H */
diff --git a/arch/mips/include/asm/mmu.h b/arch/mips/include/asm/mmu.h
index bf654206ac..95af871420 100644
--- a/arch/mips/include/asm/mmu.h
+++ b/arch/mips/include/asm/mmu.h
@@ -1,18 +1,6 @@
#ifndef __ASM_MMU_H
#define __ASM_MMU_H
-static inline void remap_range(void *_start, size_t size, uint32_t flags)
-{
-}
-
-static inline uint32_t mmu_get_pte_cached_flags(void)
-{
- return 0;
-}
-
-static inline uint32_t mmu_get_pte_uncached_flags(void)
-{
- return 0;
-}
+#define MAP_ARCH_DEFAULT MAP_UNCACHED
#endif /* __ASM_MMU_H */
diff --git a/arch/nios2/include/asm/mmu.h b/arch/nios2/include/asm/mmu.h
index bf654206ac..95af871420 100644
--- a/arch/nios2/include/asm/mmu.h
+++ b/arch/nios2/include/asm/mmu.h
@@ -1,18 +1,6 @@
#ifndef __ASM_MMU_H
#define __ASM_MMU_H
-static inline void remap_range(void *_start, size_t size, uint32_t flags)
-{
-}
-
-static inline uint32_t mmu_get_pte_cached_flags(void)
-{
- return 0;
-}
-
-static inline uint32_t mmu_get_pte_uncached_flags(void)
-{
- return 0;
-}
+#define MAP_ARCH_DEFAULT MAP_UNCACHED
#endif /* __ASM_MMU_H */
diff --git a/arch/openrisc/include/asm/mmu.h b/arch/openrisc/include/asm/mmu.h
index bf654206ac..95af871420 100644
--- a/arch/openrisc/include/asm/mmu.h
+++ b/arch/openrisc/include/asm/mmu.h
@@ -1,18 +1,6 @@
#ifndef __ASM_MMU_H
#define __ASM_MMU_H
-static inline void remap_range(void *_start, size_t size, uint32_t flags)
-{
-}
-
-static inline uint32_t mmu_get_pte_cached_flags(void)
-{
- return 0;
-}
-
-static inline uint32_t mmu_get_pte_uncached_flags(void)
-{
- return 0;
-}
+#define MAP_ARCH_DEFAULT MAP_UNCACHED
#endif /* __ASM_MMU_H */
diff --git a/arch/ppc/cpu-85xx/mmu.c b/arch/ppc/cpu-85xx/mmu.c
index 7e86e6b2b6..6b93c3e8db 100644
--- a/arch/ppc/cpu-85xx/mmu.c
+++ b/arch/ppc/cpu-85xx/mmu.c
@@ -14,17 +14,29 @@
#include <common.h>
#include <asm/cache.h>
+#include <mmu.h>
#include <mach/mmu.h>
-void remap_range(void *_start, size_t size, uint32_t flags)
+int arch_remap_range(void *_start, size_t size, unsigned flags)
{
- uint32_t ptr, start, tsize, valid, wimge;
+ uint32_t ptr, start, tsize, valid, wimge, pte_flags;
unsigned long epn;
phys_addr_t rpn = 0;
int esel = 0;
+ switch (flags) {
+ case MAP_UNCACHED:
+ pte_flags = MAS2_I;
+ break;
+ case MAP_CACHED:
+ pte_flags = 0;
+ break;
+ default:
+ return -EINVAL;
+ }
+
ptr = start = (uint32_t)_start;
- wimge = flags | MAS2_M;
+ wimge = pte_flags | MAS2_M;
while (ptr < (start + size)) {
esel = e500_find_tlb_idx((void *)ptr, 1);
@@ -41,14 +53,6 @@ void remap_range(void *_start, size_t size, uint32_t flags)
/* convert tsize to bytes to increment address. */
ptr += (1ULL << ((tsize) + 10));
}
-}
-uint32_t mmu_get_pte_cached_flags(void)
-{
return 0;
}
-
-uint32_t mmu_get_pte_uncached_flags(void)
-{
- return MAS2_I;
-}
diff --git a/arch/ppc/include/asm/mmu.h b/arch/ppc/include/asm/mmu.h
index 6e15975545..c691de1c77 100644
--- a/arch/ppc/include/asm/mmu.h
+++ b/arch/ppc/include/asm/mmu.h
@@ -557,25 +557,13 @@ extern int write_bat(ppc_bat_t bat, unsigned long upper, unsigned long lower);
#ifndef __ASSEMBLY__
+#define MAP_ARCH_DEFAULT MAP_CACHED
+
#ifdef CONFIG_MMU
-void remap_range(void *_start, size_t size, uint32_t flags);
-uint32_t mmu_get_pte_cached_flags(void);
-uint32_t mmu_get_pte_uncached_flags(void);
-#else
-static inline void remap_range(void *_start, size_t size, uint32_t flags)
-{
-}
-
-static inline uint32_t mmu_get_pte_cached_flags(void)
-{
- return 0;
-}
-
-static inline uint32_t mmu_get_pte_uncached_flags(void)
-{
- return 0;
-}
-#endif /* CONFIG_MMU */
+#define ARCH_HAS_REMAP
+int arch_remap_range(void *_start, size_t size, unsigned flags);
+#endif
+
#endif
#endif /* _PPC_MMU_H_ */
diff --git a/arch/sandbox/include/asm/mmu.h b/arch/sandbox/include/asm/mmu.h
index bf654206ac..95af871420 100644
--- a/arch/sandbox/include/asm/mmu.h
+++ b/arch/sandbox/include/asm/mmu.h
@@ -1,18 +1,6 @@
#ifndef __ASM_MMU_H
#define __ASM_MMU_H
-static inline void remap_range(void *_start, size_t size, uint32_t flags)
-{
-}
-
-static inline uint32_t mmu_get_pte_cached_flags(void)
-{
- return 0;
-}
-
-static inline uint32_t mmu_get_pte_uncached_flags(void)
-{
- return 0;
-}
+#define MAP_ARCH_DEFAULT MAP_UNCACHED
#endif /* __ASM_MMU_H */
diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h
index bf654206ac..95af871420 100644
--- a/arch/x86/include/asm/mmu.h
+++ b/arch/x86/include/asm/mmu.h
@@ -1,18 +1,6 @@
#ifndef __ASM_MMU_H
#define __ASM_MMU_H
-static inline void remap_range(void *_start, size_t size, uint32_t flags)
-{
-}
-
-static inline uint32_t mmu_get_pte_cached_flags(void)
-{
- return 0;
-}
-
-static inline uint32_t mmu_get_pte_uncached_flags(void)
-{
- return 0;
-}
+#define MAP_ARCH_DEFAULT MAP_UNCACHED
#endif /* __ASM_MMU_H */