diff options
author | Paul Mundt <lethal@linux-sh.org> | 2010-02-17 02:28:00 -0500 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2010-02-17 02:28:00 -0500 |
commit | 9edef28653a519bf0a48250f36cce96b1736ec4e (patch) | |
tree | 68049b29e69228fe0cdf26b27a3743928c5e7fdb /arch/sh/mm | |
parent | 51becfd96287b3913b13075699433730984e2f4f (diff) |
sh: uncached mapping helpers.
This adds some helper routines for uncached mapping support. This
simplifies some of the cases where we need to check the uncached mapping
boundaries in addition to giving us a centralized location for building
more complex manipulation on top of.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/mm')
-rw-r--r-- | arch/sh/mm/Makefile | 1 | ||||
-rw-r--r-- | arch/sh/mm/init.c | 21 | ||||
-rw-r--r-- | arch/sh/mm/uncached.c | 28 |
3 files changed, 31 insertions, 19 deletions
diff --git a/arch/sh/mm/Makefile b/arch/sh/mm/Makefile index de714cbd961a..3dc8a8a63822 100644 --- a/arch/sh/mm/Makefile +++ b/arch/sh/mm/Makefile | |||
@@ -36,6 +36,7 @@ obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | |||
36 | obj-$(CONFIG_PMB) += pmb.o | 36 | obj-$(CONFIG_PMB) += pmb.o |
37 | obj-$(CONFIG_NUMA) += numa.o | 37 | obj-$(CONFIG_NUMA) += numa.o |
38 | obj-$(CONFIG_IOREMAP_FIXED) += ioremap_fixed.o | 38 | obj-$(CONFIG_IOREMAP_FIXED) += ioremap_fixed.o |
39 | obj-$(CONFIG_UNCACHED_MAPPING) += uncached.o | ||
39 | 40 | ||
40 | # Special flags for fault_64.o. This puts restrictions on the number of | 41 | # Special flags for fault_64.o. This puts restrictions on the number of |
41 | # caller-save registers that the compiler can target when building this file. | 42 | # caller-save registers that the compiler can target when building this file. |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 58012b6bbe76..08e280d7cc7e 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -26,21 +26,6 @@ | |||
26 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 26 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
27 | pgd_t swapper_pg_dir[PTRS_PER_PGD]; | 27 | pgd_t swapper_pg_dir[PTRS_PER_PGD]; |
28 | 28 | ||
29 | #ifdef CONFIG_UNCACHED_MAPPING | ||
30 | /* | ||
31 | * This is the offset of the uncached section from its cached alias. | ||
32 | * | ||
33 | * Legacy platforms handle trivial transitions between cached and | ||
34 | * uncached segments by making use of the 1:1 mapping relationship in | ||
35 | * 512MB lowmem, others via a special uncached mapping. | ||
36 | * | ||
37 | * Default value only valid in 29 bit mode, in 32bit mode this will be | ||
38 | * updated by the early PMB initialization code. | ||
39 | */ | ||
40 | unsigned long cached_to_uncached = 0x20000000; | ||
41 | unsigned long uncached_size = SZ_512M; | ||
42 | #endif | ||
43 | |||
44 | #ifdef CONFIG_MMU | 29 | #ifdef CONFIG_MMU |
45 | static pte_t *__get_pte_phys(unsigned long addr) | 30 | static pte_t *__get_pte_phys(unsigned long addr) |
46 | { | 31 | { |
@@ -260,7 +245,7 @@ void __init mem_init(void) | |||
260 | memset(empty_zero_page, 0, PAGE_SIZE); | 245 | memset(empty_zero_page, 0, PAGE_SIZE); |
261 | __flush_wback_region(empty_zero_page, PAGE_SIZE); | 246 | __flush_wback_region(empty_zero_page, PAGE_SIZE); |
262 | 247 | ||
263 | /* Initialize the vDSO */ | 248 | uncached_init(); |
264 | vsyscall_init(); | 249 | vsyscall_init(); |
265 | 250 | ||
266 | codesize = (unsigned long) &_etext - (unsigned long) &_text; | 251 | codesize = (unsigned long) &_etext - (unsigned long) &_text; |
@@ -303,9 +288,7 @@ void __init mem_init(void) | |||
303 | ((unsigned long)high_memory - (unsigned long)memory_start) >> 20, | 288 | ((unsigned long)high_memory - (unsigned long)memory_start) >> 20, |
304 | 289 | ||
305 | #ifdef CONFIG_UNCACHED_MAPPING | 290 | #ifdef CONFIG_UNCACHED_MAPPING |
306 | (unsigned long)memory_start + cached_to_uncached, | 291 | uncached_start, uncached_end, uncached_size >> 20, |
307 | (unsigned long)memory_start + cached_to_uncached + uncached_size, | ||
308 | uncached_size >> 20, | ||
309 | #endif | 292 | #endif |
310 | 293 | ||
311 | (unsigned long)&__init_begin, (unsigned long)&__init_end, | 294 | (unsigned long)&__init_begin, (unsigned long)&__init_end, |
diff --git a/arch/sh/mm/uncached.c b/arch/sh/mm/uncached.c new file mode 100644 index 000000000000..807906981d9d --- /dev/null +++ b/arch/sh/mm/uncached.c | |||
@@ -0,0 +1,28 @@ | |||
1 | #include <linux/init.h> | ||
2 | #include <asm/sizes.h> | ||
3 | #include <asm/page.h> | ||
4 | |||
5 | /* | ||
6 | * This is the offset of the uncached section from its cached alias. | ||
7 | * | ||
8 | * Legacy platforms handle trivial transitions between cached and | ||
9 | * uncached segments by making use of the 1:1 mapping relationship in | ||
10 | * 512MB lowmem, others via a special uncached mapping. | ||
11 | * | ||
12 | * Default value only valid in 29 bit mode, in 32bit mode this will be | ||
13 | * updated by the early PMB initialization code. | ||
14 | */ | ||
15 | unsigned long cached_to_uncached = SZ_512M; | ||
16 | unsigned long uncached_size = SZ_512M; | ||
17 | unsigned long uncached_start, uncached_end; | ||
18 | |||
19 | int virt_addr_uncached(unsigned long kaddr) | ||
20 | { | ||
21 | return (kaddr >= uncached_start) && (kaddr < uncached_end); | ||
22 | } | ||
23 | |||
24 | void __init uncached_init(void) | ||
25 | { | ||
26 | uncached_start = memory_end; | ||
27 | uncached_end = uncached_start + uncached_size; | ||
28 | } | ||