| .. | .. |
|---|
| 17 | 17 | #include <linux/string.h> |
|---|
| 18 | 18 | #include <linux/types.h> |
|---|
| 19 | 19 | #include <linux/init.h> |
|---|
| 20 | | -#include <linux/bootmem.h> |
|---|
| 20 | +#include <linux/memblock.h> |
|---|
| 21 | 21 | #include <linux/gfp.h> |
|---|
| 22 | 22 | |
|---|
| 23 | 23 | #include <asm/setup.h> |
|---|
| .. | .. |
|---|
| 39 | 39 | */ |
|---|
| 40 | 40 | void *empty_zero_page; |
|---|
| 41 | 41 | EXPORT_SYMBOL(empty_zero_page); |
|---|
| 42 | | - |
|---|
| 43 | | -#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) |
|---|
| 44 | | -extern void init_pointer_table(unsigned long ptable); |
|---|
| 45 | | -extern pmd_t *zero_pgtable; |
|---|
| 46 | | -#endif |
|---|
| 47 | 42 | |
|---|
| 48 | 43 | #ifdef CONFIG_MMU |
|---|
| 49 | 44 | |
|---|
| .. | .. |
|---|
| 89 | 84 | * page_alloc get different views of the world. |
|---|
| 90 | 85 | */ |
|---|
| 91 | 86 | unsigned long end_mem = memory_end & PAGE_MASK; |
|---|
| 92 | | - unsigned long zones_size[MAX_NR_ZONES] = { 0, }; |
|---|
| 87 | + unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0, }; |
|---|
| 93 | 88 | |
|---|
| 94 | 89 | high_memory = (void *) end_mem; |
|---|
| 95 | 90 | |
|---|
| 96 | | - empty_zero_page = alloc_bootmem_pages(PAGE_SIZE); |
|---|
| 91 | + empty_zero_page = memblock_alloc(PAGE_SIZE, PAGE_SIZE); |
|---|
| 92 | + if (!empty_zero_page) |
|---|
| 93 | + panic("%s: Failed to allocate %lu bytes align=0x%lx\n", |
|---|
| 94 | + __func__, PAGE_SIZE, PAGE_SIZE); |
|---|
| 97 | 95 | |
|---|
| 98 | 96 | /* |
|---|
| 99 | 97 | * Set up SFC/DFC registers (user data space). |
|---|
| 100 | 98 | */ |
|---|
| 101 | 99 | set_fs (USER_DS); |
|---|
| 102 | 100 | |
|---|
| 103 | | - zones_size[ZONE_DMA] = (end_mem - PAGE_OFFSET) >> PAGE_SHIFT; |
|---|
| 104 | | - free_area_init(zones_size); |
|---|
| 101 | + max_zone_pfn[ZONE_DMA] = end_mem >> PAGE_SHIFT; |
|---|
| 102 | + free_area_init(max_zone_pfn); |
|---|
| 105 | 103 | } |
|---|
| 106 | 104 | |
|---|
| 107 | 105 | #endif /* CONFIG_MMU */ |
|---|
| .. | .. |
|---|
| 122 | 120 | static inline void init_pointer_tables(void) |
|---|
| 123 | 121 | { |
|---|
| 124 | 122 | #if defined(CONFIG_MMU) && !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) |
|---|
| 125 | | - int i; |
|---|
| 123 | + int i, j; |
|---|
| 126 | 124 | |
|---|
| 127 | 125 | /* insert pointer tables allocated so far into the tablelist */ |
|---|
| 128 | | - init_pointer_table((unsigned long)kernel_pg_dir); |
|---|
| 126 | + init_pointer_table(kernel_pg_dir, TABLE_PGD); |
|---|
| 129 | 127 | for (i = 0; i < PTRS_PER_PGD; i++) { |
|---|
| 130 | | - if (pgd_present(kernel_pg_dir[i])) |
|---|
| 131 | | - init_pointer_table(__pgd_page(kernel_pg_dir[i])); |
|---|
| 132 | | - } |
|---|
| 128 | + pud_t *pud = (pud_t *)&kernel_pg_dir[i]; |
|---|
| 129 | + pmd_t *pmd_dir; |
|---|
| 133 | 130 | |
|---|
| 134 | | - /* insert also pointer table that we used to unmap the zero page */ |
|---|
| 135 | | - if (zero_pgtable) |
|---|
| 136 | | - init_pointer_table((unsigned long)zero_pgtable); |
|---|
| 131 | + if (!pud_present(*pud)) |
|---|
| 132 | + continue; |
|---|
| 133 | + |
|---|
| 134 | + pmd_dir = (pmd_t *)pgd_page_vaddr(kernel_pg_dir[i]); |
|---|
| 135 | + init_pointer_table(pmd_dir, TABLE_PMD); |
|---|
| 136 | + |
|---|
| 137 | + for (j = 0; j < PTRS_PER_PMD; j++) { |
|---|
| 138 | + pmd_t *pmd = &pmd_dir[j]; |
|---|
| 139 | + pte_t *pte_dir; |
|---|
| 140 | + |
|---|
| 141 | + if (!pmd_present(*pmd)) |
|---|
| 142 | + continue; |
|---|
| 143 | + |
|---|
| 144 | + pte_dir = (pte_t *)pmd_page_vaddr(*pmd); |
|---|
| 145 | + init_pointer_table(pte_dir, TABLE_PTE); |
|---|
| 146 | + } |
|---|
| 147 | + } |
|---|
| 137 | 148 | #endif |
|---|
| 138 | 149 | } |
|---|
| 139 | 150 | |
|---|
| 140 | 151 | void __init mem_init(void) |
|---|
| 141 | 152 | { |
|---|
| 142 | 153 | /* this will put all memory onto the freelists */ |
|---|
| 143 | | - free_all_bootmem(); |
|---|
| 154 | + memblock_free_all(); |
|---|
| 144 | 155 | init_pointer_tables(); |
|---|
| 145 | 156 | mem_init_print_info(NULL); |
|---|
| 146 | 157 | } |
|---|
| 147 | | - |
|---|
| 148 | | -#ifdef CONFIG_BLK_DEV_INITRD |
|---|
| 149 | | -void free_initrd_mem(unsigned long start, unsigned long end) |
|---|
| 150 | | -{ |
|---|
| 151 | | - free_reserved_area((void *)start, (void *)end, -1, "initrd"); |
|---|
| 152 | | -} |
|---|
| 153 | | -#endif |
|---|