.. | .. |
---|
7 | 7 | * for more details. |
---|
8 | 8 | */ |
---|
9 | 9 | |
---|
10 | | -#include <linux/bootmem.h> |
---|
| 10 | +#include <linux/dma-map-ops.h> |
---|
| 11 | +#include <linux/memblock.h> |
---|
11 | 12 | #include <linux/init.h> |
---|
12 | 13 | #include <linux/kernel.h> |
---|
13 | | -#include <linux/memblock.h> |
---|
14 | 14 | #include <linux/mm.h> /* mem_init */ |
---|
15 | 15 | #include <linux/initrd.h> |
---|
16 | 16 | #include <linux/pagemap.h> |
---|
.. | .. |
---|
46 | 46 | EXPORT_SYMBOL(memory_size); |
---|
47 | 47 | unsigned long lowmem_size; |
---|
48 | 48 | |
---|
49 | | -#ifdef CONFIG_HIGHMEM |
---|
50 | | -pte_t *kmap_pte; |
---|
51 | | -EXPORT_SYMBOL(kmap_pte); |
---|
52 | | -pgprot_t kmap_prot; |
---|
53 | | -EXPORT_SYMBOL(kmap_prot); |
---|
54 | | - |
---|
55 | | -static inline pte_t *virt_to_kpte(unsigned long vaddr) |
---|
56 | | -{ |
---|
57 | | - return pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), |
---|
58 | | - vaddr), vaddr); |
---|
59 | | -} |
---|
| 49 | +EXPORT_SYMBOL(min_low_pfn); |
---|
| 50 | +EXPORT_SYMBOL(max_low_pfn); |
---|
60 | 51 | |
---|
61 | 52 | static void __init highmem_init(void) |
---|
62 | 53 | { |
---|
63 | 54 | pr_debug("%x\n", (u32)PKMAP_BASE); |
---|
64 | 55 | map_page(PKMAP_BASE, 0, 0); /* XXX gross */ |
---|
65 | 56 | pkmap_page_table = virt_to_kpte(PKMAP_BASE); |
---|
66 | | - |
---|
67 | | - kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN)); |
---|
68 | | - kmap_prot = PAGE_KERNEL; |
---|
69 | 57 | } |
---|
70 | 58 | |
---|
71 | 59 | static void highmem_setup(void) |
---|
.. | .. |
---|
109 | 97 | #endif |
---|
110 | 98 | |
---|
111 | 99 | /* We don't have holes in memory map */ |
---|
112 | | - free_area_init_nodes(zones_size); |
---|
| 100 | + free_area_init(zones_size); |
---|
113 | 101 | } |
---|
114 | 102 | |
---|
115 | 103 | void __init setup_memory(void) |
---|
116 | 104 | { |
---|
117 | | - struct memblock_region *reg; |
---|
118 | | - |
---|
119 | 105 | #ifndef CONFIG_MMU |
---|
120 | 106 | u32 kernel_align_start, kernel_align_size; |
---|
| 107 | + phys_addr_t start, end; |
---|
| 108 | + u64 i; |
---|
121 | 109 | |
---|
122 | 110 | /* Find main memory where is the kernel */ |
---|
123 | | - for_each_memblock(memory, reg) { |
---|
124 | | - memory_start = (u32)reg->base; |
---|
125 | | - lowmem_size = reg->size; |
---|
| 111 | + for_each_mem_range(i, &start, &end) { |
---|
| 112 | + memory_start = start; |
---|
| 113 | + lowmem_size = end - start; |
---|
126 | 114 | if ((memory_start <= (u32)_text) && |
---|
127 | 115 | ((u32)_text <= (memory_start + lowmem_size - 1))) { |
---|
128 | 116 | memory_size = lowmem_size; |
---|
.. | .. |
---|
170 | 158 | pr_info("%s: max_low_pfn: %#lx\n", __func__, max_low_pfn); |
---|
171 | 159 | pr_info("%s: max_pfn: %#lx\n", __func__, max_pfn); |
---|
172 | 160 | |
---|
173 | | - /* Add active regions with valid PFNs */ |
---|
174 | | - for_each_memblock(memory, reg) { |
---|
175 | | - unsigned long start_pfn, end_pfn; |
---|
176 | | - |
---|
177 | | - start_pfn = memblock_region_memory_base_pfn(reg); |
---|
178 | | - end_pfn = memblock_region_memory_end_pfn(reg); |
---|
179 | | - memblock_set_node(start_pfn << PAGE_SHIFT, |
---|
180 | | - (end_pfn - start_pfn) << PAGE_SHIFT, |
---|
181 | | - &memblock.memory, 0); |
---|
182 | | - } |
---|
183 | | - |
---|
184 | | - /* XXX need to clip this if using highmem? */ |
---|
185 | | - sparse_memory_present_with_active_regions(0); |
---|
186 | | - |
---|
187 | 161 | paging_init(); |
---|
188 | | -} |
---|
189 | | - |
---|
190 | | -#ifdef CONFIG_BLK_DEV_INITRD |
---|
191 | | -void free_initrd_mem(unsigned long start, unsigned long end) |
---|
192 | | -{ |
---|
193 | | - free_reserved_area((void *)start, (void *)end, -1, "initrd"); |
---|
194 | | -} |
---|
195 | | -#endif |
---|
196 | | - |
---|
197 | | -void free_initmem(void) |
---|
198 | | -{ |
---|
199 | | - free_initmem_default(-1); |
---|
200 | 162 | } |
---|
201 | 163 | |
---|
202 | 164 | void __init mem_init(void) |
---|
.. | .. |
---|
204 | 166 | high_memory = (void *)__va(memory_start + lowmem_size - 1); |
---|
205 | 167 | |
---|
206 | 168 | /* this will put all memory onto the freelists */ |
---|
207 | | - free_all_bootmem(); |
---|
| 169 | + memblock_free_all(); |
---|
208 | 170 | #ifdef CONFIG_HIGHMEM |
---|
209 | 171 | highmem_setup(); |
---|
210 | 172 | #endif |
---|
211 | 173 | |
---|
212 | 174 | mem_init_print_info(NULL); |
---|
213 | | -#ifdef CONFIG_MMU |
---|
214 | | - pr_info("Kernel virtual memory layout:\n"); |
---|
215 | | - pr_info(" * 0x%08lx..0x%08lx : fixmap\n", FIXADDR_START, FIXADDR_TOP); |
---|
216 | | -#ifdef CONFIG_HIGHMEM |
---|
217 | | - pr_info(" * 0x%08lx..0x%08lx : highmem PTEs\n", |
---|
218 | | - PKMAP_BASE, PKMAP_ADDR(LAST_PKMAP)); |
---|
219 | | -#endif /* CONFIG_HIGHMEM */ |
---|
220 | | - pr_info(" * 0x%08lx..0x%08lx : early ioremap\n", |
---|
221 | | - ioremap_bot, ioremap_base); |
---|
222 | | - pr_info(" * 0x%08lx..0x%08lx : vmalloc & ioremap\n", |
---|
223 | | - (unsigned long)VMALLOC_START, VMALLOC_END); |
---|
224 | | -#endif |
---|
225 | 175 | mem_init_done = 1; |
---|
226 | 176 | } |
---|
227 | 177 | |
---|
.. | .. |
---|
355 | 305 | /* This will also cause that unflatten device tree will be allocated |
---|
356 | 306 | * inside 768MB limit */ |
---|
357 | 307 | memblock_set_current_limit(memory_start + lowmem_size - 1); |
---|
| 308 | + |
---|
| 309 | + parse_early_param(); |
---|
| 310 | + |
---|
| 311 | + /* CMA initialization */ |
---|
| 312 | + dma_contiguous_reserve(memory_start + lowmem_size - 1); |
---|
358 | 313 | } |
---|
359 | 314 | |
---|
360 | 315 | /* This is only called until mem_init is done. */ |
---|
.. | .. |
---|
364 | 319 | * Mem start + kernel_tlb -> here is limit |
---|
365 | 320 | * because of mem mapping from head.S |
---|
366 | 321 | */ |
---|
367 | | - return __va(memblock_alloc_base(PAGE_SIZE, PAGE_SIZE, |
---|
368 | | - memory_start + kernel_tlb)); |
---|
| 322 | + return memblock_alloc_try_nid_raw(PAGE_SIZE, PAGE_SIZE, |
---|
| 323 | + MEMBLOCK_LOW_LIMIT, memory_start + kernel_tlb, |
---|
| 324 | + NUMA_NO_NODE); |
---|
369 | 325 | } |
---|
370 | 326 | |
---|
371 | 327 | #endif /* CONFIG_MMU */ |
---|
.. | .. |
---|
374 | 330 | { |
---|
375 | 331 | void *p; |
---|
376 | 332 | |
---|
377 | | - if (mem_init_done) |
---|
| 333 | + if (mem_init_done) { |
---|
378 | 334 | p = kzalloc(size, mask); |
---|
379 | | - else { |
---|
380 | | - p = alloc_bootmem(size); |
---|
381 | | - if (p) |
---|
382 | | - memset(p, 0, size); |
---|
| 335 | + } else { |
---|
| 336 | + p = memblock_alloc(size, SMP_CACHE_BYTES); |
---|
| 337 | + if (!p) |
---|
| 338 | + panic("%s: Failed to allocate %zu bytes\n", |
---|
| 339 | + __func__, size); |
---|
383 | 340 | } |
---|
| 341 | + |
---|
384 | 342 | return p; |
---|
385 | 343 | } |
---|