diff options
Diffstat (limited to 'arch/hexagon/mm/init.c')
-rw-r--r-- | arch/hexagon/mm/init.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/arch/hexagon/mm/init.c b/arch/hexagon/mm/init.c index 69ffcfd28794..2561d259a296 100644 --- a/arch/hexagon/mm/init.c +++ b/arch/hexagon/mm/init.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Memory subsystem initialization for Hexagon | 2 | * Memory subsystem initialization for Hexagon |
3 | * | 3 | * |
4 | * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. | 4 | * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 and | 7 | * it under the terms of the GNU General Public License version 2 and |
@@ -31,9 +31,10 @@ | |||
31 | * Define a startpg just past the end of the kernel image and a lastpg | 31 | * Define a startpg just past the end of the kernel image and a lastpg |
32 | * that corresponds to the end of real or simulated platform memory. | 32 | * that corresponds to the end of real or simulated platform memory. |
33 | */ | 33 | */ |
34 | #define bootmem_startpg (PFN_UP(((unsigned long) _end) - PAGE_OFFSET)) | 34 | #define bootmem_startpg (PFN_UP(((unsigned long) _end) - PAGE_OFFSET + PHYS_OFFSET)) |
35 | 35 | ||
36 | unsigned long bootmem_lastpg; /* Should be set by platform code */ | 36 | unsigned long bootmem_lastpg; /* Should be set by platform code */ |
37 | unsigned long __phys_offset; /* physical kernel offset >> 12 */ | ||
37 | 38 | ||
38 | /* Set as variable to limit PMD copies */ | 39 | /* Set as variable to limit PMD copies */ |
39 | int max_kernel_seg = 0x303; | 40 | int max_kernel_seg = 0x303; |
@@ -44,7 +45,6 @@ unsigned long zero_page_mask; | |||
44 | /* indicate pfn's of high memory */ | 45 | /* indicate pfn's of high memory */ |
45 | unsigned long highstart_pfn, highend_pfn; | 46 | unsigned long highstart_pfn, highend_pfn; |
46 | 47 | ||
47 | /* struct mmu_gather defined in asm-generic.h; */ | ||
48 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 48 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
49 | 49 | ||
50 | /* Default cache attribute for newly created page tables */ | 50 | /* Default cache attribute for newly created page tables */ |
@@ -71,7 +71,7 @@ void __init mem_init(void) | |||
71 | { | 71 | { |
72 | /* No idea where this is actually declared. Seems to evade LXR. */ | 72 | /* No idea where this is actually declared. Seems to evade LXR. */ |
73 | totalram_pages += free_all_bootmem(); | 73 | totalram_pages += free_all_bootmem(); |
74 | num_physpages = bootmem_lastpg; /* seriously, what? */ | 74 | num_physpages = bootmem_lastpg-ARCH_PFN_OFFSET; |
75 | 75 | ||
76 | printk(KERN_INFO "totalram_pages = %ld\n", totalram_pages); | 76 | printk(KERN_INFO "totalram_pages = %ld\n", totalram_pages); |
77 | 77 | ||
@@ -193,6 +193,9 @@ void __init setup_arch_memory(void) | |||
193 | * This needs to change for highmem setups. | 193 | * This needs to change for highmem setups. |
194 | */ | 194 | */ |
195 | 195 | ||
196 | /* Prior to this, bootmem_lastpg is actually mem size */ | ||
197 | bootmem_lastpg += ARCH_PFN_OFFSET; | ||
198 | |||
196 | /* Memory size needs to be a multiple of 16M */ | 199 | /* Memory size needs to be a multiple of 16M */ |
197 | bootmem_lastpg = PFN_DOWN((bootmem_lastpg << PAGE_SHIFT) & | 200 | bootmem_lastpg = PFN_DOWN((bootmem_lastpg << PAGE_SHIFT) & |
198 | ~((BIG_KERNEL_PAGE_SIZE) - 1)); | 201 | ~((BIG_KERNEL_PAGE_SIZE) - 1)); |
@@ -201,12 +204,15 @@ void __init setup_arch_memory(void) | |||
201 | * Reserve the top DMA_RESERVE bytes of RAM for DMA (uncached) | 204 | * Reserve the top DMA_RESERVE bytes of RAM for DMA (uncached) |
202 | * memory allocation | 205 | * memory allocation |
203 | */ | 206 | */ |
204 | bootmap_size = init_bootmem(bootmem_startpg, bootmem_lastpg - | 207 | |
205 | PFN_DOWN(DMA_RESERVED_BYTES)); | 208 | max_low_pfn = bootmem_lastpg - PFN_DOWN(DMA_RESERVED_BYTES); |
209 | min_low_pfn = ARCH_PFN_OFFSET; | ||
210 | bootmap_size = init_bootmem_node(NODE_DATA(0), bootmem_startpg, min_low_pfn, max_low_pfn); | ||
206 | 211 | ||
207 | printk(KERN_INFO "bootmem_startpg: 0x%08lx\n", bootmem_startpg); | 212 | printk(KERN_INFO "bootmem_startpg: 0x%08lx\n", bootmem_startpg); |
208 | printk(KERN_INFO "bootmem_lastpg: 0x%08lx\n", bootmem_lastpg); | 213 | printk(KERN_INFO "bootmem_lastpg: 0x%08lx\n", bootmem_lastpg); |
209 | printk(KERN_INFO "bootmap_size: %d\n", bootmap_size); | 214 | printk(KERN_INFO "bootmap_size: %d\n", bootmap_size); |
215 | printk(KERN_INFO "min_low_pfn: 0x%08lx\n", min_low_pfn); | ||
210 | printk(KERN_INFO "max_low_pfn: 0x%08lx\n", max_low_pfn); | 216 | printk(KERN_INFO "max_low_pfn: 0x%08lx\n", max_low_pfn); |
211 | 217 | ||
212 | /* | 218 | /* |
@@ -221,14 +227,17 @@ void __init setup_arch_memory(void) | |||
221 | /* this actually only goes to the end of the first gig */ | 227 | /* this actually only goes to the end of the first gig */ |
222 | segtable_end = segtable + (1<<(30-22)); | 228 | segtable_end = segtable + (1<<(30-22)); |
223 | 229 | ||
224 | /* Move forward to the start of empty pages */ | 230 | /* |
225 | segtable += bootmem_lastpg >> (22-PAGE_SHIFT); | 231 | * Move forward to the start of empty pages; take into account |
232 | * phys_offset shift. | ||
233 | */ | ||
226 | 234 | ||
235 | segtable += (bootmem_lastpg-ARCH_PFN_OFFSET)>>(22-PAGE_SHIFT); | ||
227 | { | 236 | { |
228 | int i; | 237 | int i; |
229 | 238 | ||
230 | for (i = 1 ; i <= DMA_RESERVE ; i++) | 239 | for (i = 1 ; i <= DMA_RESERVE ; i++) |
231 | segtable[-i] = ((segtable[-i] & __HVM_PTE_PGMASK_4MB) | 240 | segtable[-i] = ((segtable[-i] & __HVM_PTE_PGMASK_4MB) |
232 | | __HVM_PTE_R | __HVM_PTE_W | __HVM_PTE_X | 241 | | __HVM_PTE_R | __HVM_PTE_W | __HVM_PTE_X |
233 | | __HEXAGON_C_UNC << 6 | 242 | | __HEXAGON_C_UNC << 6 |
234 | | __HVM_PDE_S_4MB); | 243 | | __HVM_PDE_S_4MB); |
@@ -256,7 +265,7 @@ void __init setup_arch_memory(void) | |||
256 | * Free all the memory that wasn't taken up by the bootmap, the DMA | 265 | * Free all the memory that wasn't taken up by the bootmap, the DMA |
257 | * reserve, or kernel itself. | 266 | * reserve, or kernel itself. |
258 | */ | 267 | */ |
259 | free_bootmem(PFN_PHYS(bootmem_startpg)+bootmap_size, | 268 | free_bootmem(PFN_PHYS(bootmem_startpg) + bootmap_size, |
260 | PFN_PHYS(bootmem_lastpg - bootmem_startpg) - bootmap_size - | 269 | PFN_PHYS(bootmem_lastpg - bootmem_startpg) - bootmap_size - |
261 | DMA_RESERVED_BYTES); | 270 | DMA_RESERVED_BYTES); |
262 | 271 | ||