summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/sh/include/asm/system.h1
-rw-r--r--arch/sh/kernel/head_32.S10
-rw-r--r--arch/sh/mm/init.c21
3 files changed, 24 insertions, 8 deletions
diff --git a/arch/sh/include/asm/system.h b/arch/sh/include/asm/system.h
index de2fc3963c1..6442f1783fe 100644
--- a/arch/sh/include/asm/system.h
+++ b/arch/sh/include/asm/system.h
@@ -137,6 +137,7 @@ extern unsigned int instruction_size(unsigned int insn);
#endif
extern unsigned long cached_to_uncached;
+extern unsigned long uncached_size;
extern struct dentry *sh_debugfs_root;
diff --git a/arch/sh/kernel/head_32.S b/arch/sh/kernel/head_32.S
index e93320135cd..83f2b84b58d 100644
--- a/arch/sh/kernel/head_32.S
+++ b/arch/sh/kernel/head_32.S
@@ -217,11 +217,18 @@ ENTRY(_stext)
__PMB_ITER_BY_SIZE(16)
/*
- * Now that we can access it, update cached_to_uncached.
+ * Now that we can access it, update cached_to_uncached and
+ * uncached_size.
*/
mov.l .Lcached_to_uncached, r0
mov.l r7, @r0
+ mov.l .Luncached_size, r0
+ mov #1, r7
+ shll16 r7
+ shll8 r7
+ mov.l r7, @r0
+
/*
* Clear the remaining PMB entries.
*
@@ -300,5 +307,6 @@ ENTRY(stack_start)
.LFIRST_DATA_ENTRY: .long __MEMORY_START | PMB_V
.LMMUCR: .long MMUCR
.Lcached_to_uncached: .long cached_to_uncached
+.Luncached_size: .long uncached_size
.LMEMORY_SIZE: .long __MEMORY_SIZE
#endif
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c
index f3e23ad075c..a28ff63c17a 100644
--- a/arch/sh/mm/init.c
+++ b/arch/sh/mm/init.c
@@ -27,15 +27,17 @@ pgd_t swapper_pg_dir[PTRS_PER_PGD];
#ifdef CONFIG_SUPERH32
/*
- * Handle trivial transitions between cached and uncached
- * segments, making use of the 1:1 mapping relationship in
- * 512MB lowmem.
- *
* This is the offset of the uncached section from its cached alias.
- * Default value only valid in 29 bit mode, in 32bit mode will be
- * overridden in pmb_init.
+ *
+ * Legacy platforms handle trivial transitions between cached and
+ * uncached segments by making use of the 1:1 mapping relationship in
+ * 512MB lowmem, others via a special uncached mapping.
+ *
+ * Default value only valid in 29 bit mode, in 32bit mode this will be
+ * updated by the early PMB initialization code.
*/
unsigned long cached_to_uncached = P2SEG - P1SEG;
+unsigned long uncached_size = 0x20000000;
#endif
#ifdef CONFIG_MMU
@@ -281,7 +283,8 @@ void __init mem_init(void)
" pkmap : 0x%08lx - 0x%08lx (%4ld kB)\n"
#endif
" vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n"
- " lowmem : 0x%08lx - 0x%08lx (%4ld MB)\n"
+ " lowmem : 0x%08lx - 0x%08lx (%4ld MB) (cached)\n"
+ " : 0x%08lx - 0x%08lx (%4ld MB) (uncached)\n"
" .init : 0x%08lx - 0x%08lx (%4ld kB)\n"
" .data : 0x%08lx - 0x%08lx (%4ld kB)\n"
" .text : 0x%08lx - 0x%08lx (%4ld kB)\n",
@@ -299,6 +302,10 @@ void __init mem_init(void)
(unsigned long)memory_start, (unsigned long)high_memory,
((unsigned long)high_memory - (unsigned long)memory_start) >> 20,
+ (unsigned long)memory_start + cached_to_uncached,
+ (unsigned long)memory_start + cached_to_uncached + uncached_size,
+ uncached_size >> 20,
+
(unsigned long)&__init_begin, (unsigned long)&__init_end,
((unsigned long)&__init_end -
(unsigned long)&__init_begin) >> 10,