diff options
Diffstat (limited to 'arch/xtensa/mm/mmu.c')
-rw-r--r-- | arch/xtensa/mm/mmu.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/arch/xtensa/mm/mmu.c b/arch/xtensa/mm/mmu.c index 861203e958da..3429b483d9f8 100644 --- a/arch/xtensa/mm/mmu.c +++ b/arch/xtensa/mm/mmu.c | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Extracted from init.c | 4 | * Extracted from init.c |
5 | */ | 5 | */ |
6 | #include <linux/bootmem.h> | ||
6 | #include <linux/percpu.h> | 7 | #include <linux/percpu.h> |
7 | #include <linux/init.h> | 8 | #include <linux/init.h> |
8 | #include <linux/string.h> | 9 | #include <linux/string.h> |
@@ -16,9 +17,44 @@ | |||
16 | #include <asm/initialize_mmu.h> | 17 | #include <asm/initialize_mmu.h> |
17 | #include <asm/io.h> | 18 | #include <asm/io.h> |
18 | 19 | ||
20 | #if defined(CONFIG_HIGHMEM) | ||
21 | static void * __init init_pmd(unsigned long vaddr) | ||
22 | { | ||
23 | pgd_t *pgd = pgd_offset_k(vaddr); | ||
24 | pmd_t *pmd = pmd_offset(pgd, vaddr); | ||
25 | |||
26 | if (pmd_none(*pmd)) { | ||
27 | unsigned i; | ||
28 | pte_t *pte = alloc_bootmem_low_pages(PAGE_SIZE); | ||
29 | |||
30 | for (i = 0; i < 1024; i++) | ||
31 | pte_clear(NULL, 0, pte + i); | ||
32 | |||
33 | set_pmd(pmd, __pmd(((unsigned long)pte) & PAGE_MASK)); | ||
34 | BUG_ON(pte != pte_offset_kernel(pmd, 0)); | ||
35 | pr_debug("%s: vaddr: 0x%08lx, pmd: 0x%p, pte: 0x%p\n", | ||
36 | __func__, vaddr, pmd, pte); | ||
37 | return pte; | ||
38 | } else { | ||
39 | return pte_offset_kernel(pmd, 0); | ||
40 | } | ||
41 | } | ||
42 | |||
43 | static void __init fixedrange_init(void) | ||
44 | { | ||
45 | BUILD_BUG_ON(FIXADDR_SIZE > PMD_SIZE); | ||
46 | init_pmd(__fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK); | ||
47 | } | ||
48 | #endif | ||
49 | |||
19 | void __init paging_init(void) | 50 | void __init paging_init(void) |
20 | { | 51 | { |
21 | memset(swapper_pg_dir, 0, PAGE_SIZE); | 52 | memset(swapper_pg_dir, 0, PAGE_SIZE); |
53 | #ifdef CONFIG_HIGHMEM | ||
54 | fixedrange_init(); | ||
55 | pkmap_page_table = init_pmd(PKMAP_BASE); | ||
56 | kmap_init(); | ||
57 | #endif | ||
22 | } | 58 | } |
23 | 59 | ||
24 | /* | 60 | /* |