1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * linux/arch/arm/mm/init.c 3*1da177e4SLinus Torvalds * 4*1da177e4SLinus Torvalds * Copyright (C) 1995-2002 Russell King 5*1da177e4SLinus Torvalds * 6*1da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 7*1da177e4SLinus Torvalds * it under the terms of the GNU General Public License version 2 as 8*1da177e4SLinus Torvalds * published by the Free Software Foundation. 9*1da177e4SLinus Torvalds */ 10*1da177e4SLinus Torvalds #include <linux/config.h> 11*1da177e4SLinus Torvalds #include <linux/kernel.h> 12*1da177e4SLinus Torvalds #include <linux/errno.h> 13*1da177e4SLinus Torvalds #include <linux/ptrace.h> 14*1da177e4SLinus Torvalds #include <linux/swap.h> 15*1da177e4SLinus Torvalds #include <linux/init.h> 16*1da177e4SLinus Torvalds #include <linux/bootmem.h> 17*1da177e4SLinus Torvalds #include <linux/mman.h> 18*1da177e4SLinus Torvalds #include <linux/nodemask.h> 19*1da177e4SLinus Torvalds #include <linux/initrd.h> 20*1da177e4SLinus Torvalds 21*1da177e4SLinus Torvalds #include <asm/mach-types.h> 22*1da177e4SLinus Torvalds #include <asm/hardware.h> 23*1da177e4SLinus Torvalds #include <asm/setup.h> 24*1da177e4SLinus Torvalds #include <asm/tlb.h> 25*1da177e4SLinus Torvalds 26*1da177e4SLinus Torvalds #include <asm/mach/arch.h> 27*1da177e4SLinus Torvalds #include <asm/mach/map.h> 28*1da177e4SLinus Torvalds 29*1da177e4SLinus Torvalds #define TABLE_SIZE (2 * PTRS_PER_PTE * sizeof(pte_t)) 30*1da177e4SLinus Torvalds 31*1da177e4SLinus Torvalds DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); 32*1da177e4SLinus Torvalds 33*1da177e4SLinus Torvalds extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; 34*1da177e4SLinus Torvalds extern void _stext, _text, _etext, __data_start, _end, __init_begin, __init_end; 35*1da177e4SLinus Torvalds extern unsigned long phys_initrd_start; 36*1da177e4SLinus Torvalds extern unsigned long phys_initrd_size; 37*1da177e4SLinus Torvalds 38*1da177e4SLinus Torvalds /* 39*1da177e4SLinus Torvalds * The sole use of this is to pass memory configuration 40*1da177e4SLinus Torvalds * data from paging_init to mem_init. 41*1da177e4SLinus Torvalds */ 42*1da177e4SLinus Torvalds static struct meminfo meminfo __initdata = { 0, }; 43*1da177e4SLinus Torvalds 44*1da177e4SLinus Torvalds /* 45*1da177e4SLinus Torvalds * empty_zero_page is a special page that is used for 46*1da177e4SLinus Torvalds * zero-initialized data and COW. 47*1da177e4SLinus Torvalds */ 48*1da177e4SLinus Torvalds struct page *empty_zero_page; 49*1da177e4SLinus Torvalds 50*1da177e4SLinus Torvalds void show_mem(void) 51*1da177e4SLinus Torvalds { 52*1da177e4SLinus Torvalds int free = 0, total = 0, reserved = 0; 53*1da177e4SLinus Torvalds int shared = 0, cached = 0, slab = 0, node; 54*1da177e4SLinus Torvalds 55*1da177e4SLinus Torvalds printk("Mem-info:\n"); 56*1da177e4SLinus Torvalds show_free_areas(); 57*1da177e4SLinus Torvalds printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); 58*1da177e4SLinus Torvalds 59*1da177e4SLinus Torvalds for_each_online_node(node) { 60*1da177e4SLinus Torvalds struct page *page, *end; 61*1da177e4SLinus Torvalds 62*1da177e4SLinus Torvalds page = NODE_MEM_MAP(node); 63*1da177e4SLinus Torvalds end = page + NODE_DATA(node)->node_spanned_pages; 64*1da177e4SLinus Torvalds 65*1da177e4SLinus Torvalds do { 66*1da177e4SLinus Torvalds total++; 67*1da177e4SLinus Torvalds if (PageReserved(page)) 68*1da177e4SLinus Torvalds reserved++; 69*1da177e4SLinus Torvalds else if (PageSwapCache(page)) 70*1da177e4SLinus Torvalds cached++; 71*1da177e4SLinus Torvalds else if (PageSlab(page)) 72*1da177e4SLinus Torvalds slab++; 73*1da177e4SLinus Torvalds else if (!page_count(page)) 74*1da177e4SLinus Torvalds free++; 75*1da177e4SLinus Torvalds else 76*1da177e4SLinus Torvalds shared += page_count(page) - 1; 77*1da177e4SLinus Torvalds page++; 78*1da177e4SLinus Torvalds } while (page < end); 79*1da177e4SLinus Torvalds } 80*1da177e4SLinus Torvalds 81*1da177e4SLinus Torvalds printk("%d pages of RAM\n", total); 82*1da177e4SLinus Torvalds printk("%d free pages\n", free); 83*1da177e4SLinus Torvalds printk("%d reserved pages\n", reserved); 84*1da177e4SLinus Torvalds printk("%d slab pages\n", slab); 85*1da177e4SLinus Torvalds printk("%d pages shared\n", shared); 86*1da177e4SLinus Torvalds printk("%d pages swap cached\n", cached); 87*1da177e4SLinus Torvalds } 88*1da177e4SLinus Torvalds 89*1da177e4SLinus Torvalds struct node_info { 90*1da177e4SLinus Torvalds unsigned int start; 91*1da177e4SLinus Torvalds unsigned int end; 92*1da177e4SLinus Torvalds int bootmap_pages; 93*1da177e4SLinus Torvalds }; 94*1da177e4SLinus Torvalds 95*1da177e4SLinus Torvalds #define O_PFN_DOWN(x) ((x) >> PAGE_SHIFT) 96*1da177e4SLinus Torvalds #define V_PFN_DOWN(x) O_PFN_DOWN(__pa(x)) 97*1da177e4SLinus Torvalds 98*1da177e4SLinus Torvalds #define O_PFN_UP(x) (PAGE_ALIGN(x) >> PAGE_SHIFT) 99*1da177e4SLinus Torvalds #define V_PFN_UP(x) O_PFN_UP(__pa(x)) 100*1da177e4SLinus Torvalds 101*1da177e4SLinus Torvalds #define PFN_SIZE(x) ((x) >> PAGE_SHIFT) 102*1da177e4SLinus Torvalds #define PFN_RANGE(s,e) PFN_SIZE(PAGE_ALIGN((unsigned long)(e)) - \ 103*1da177e4SLinus Torvalds (((unsigned long)(s)) & PAGE_MASK)) 104*1da177e4SLinus Torvalds 105*1da177e4SLinus Torvalds /* 106*1da177e4SLinus Torvalds * FIXME: We really want to avoid allocating the bootmap bitmap 107*1da177e4SLinus Torvalds * over the top of the initrd. Hopefully, this is located towards 108*1da177e4SLinus Torvalds * the start of a bank, so if we allocate the bootmap bitmap at 109*1da177e4SLinus Torvalds * the end, we won't clash. 110*1da177e4SLinus Torvalds */ 111*1da177e4SLinus Torvalds static unsigned int __init 112*1da177e4SLinus Torvalds find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages) 113*1da177e4SLinus Torvalds { 114*1da177e4SLinus Torvalds unsigned int start_pfn, bank, bootmap_pfn; 115*1da177e4SLinus Torvalds 116*1da177e4SLinus Torvalds start_pfn = V_PFN_UP(&_end); 117*1da177e4SLinus Torvalds bootmap_pfn = 0; 118*1da177e4SLinus Torvalds 119*1da177e4SLinus Torvalds for (bank = 0; bank < mi->nr_banks; bank ++) { 120*1da177e4SLinus Torvalds unsigned int start, end; 121*1da177e4SLinus Torvalds 122*1da177e4SLinus Torvalds if (mi->bank[bank].node != node) 123*1da177e4SLinus Torvalds continue; 124*1da177e4SLinus Torvalds 125*1da177e4SLinus Torvalds start = O_PFN_UP(mi->bank[bank].start); 126*1da177e4SLinus Torvalds end = O_PFN_DOWN(mi->bank[bank].size + 127*1da177e4SLinus Torvalds mi->bank[bank].start); 128*1da177e4SLinus Torvalds 129*1da177e4SLinus Torvalds if (end < start_pfn) 130*1da177e4SLinus Torvalds continue; 131*1da177e4SLinus Torvalds 132*1da177e4SLinus Torvalds if (start < start_pfn) 133*1da177e4SLinus Torvalds start = start_pfn; 134*1da177e4SLinus Torvalds 135*1da177e4SLinus Torvalds if (end <= start) 136*1da177e4SLinus Torvalds continue; 137*1da177e4SLinus Torvalds 138*1da177e4SLinus Torvalds if (end - start >= bootmap_pages) { 139*1da177e4SLinus Torvalds bootmap_pfn = start; 140*1da177e4SLinus Torvalds break; 141*1da177e4SLinus Torvalds } 142*1da177e4SLinus Torvalds } 143*1da177e4SLinus Torvalds 144*1da177e4SLinus Torvalds if (bootmap_pfn == 0) 145*1da177e4SLinus Torvalds BUG(); 146*1da177e4SLinus Torvalds 147*1da177e4SLinus Torvalds return bootmap_pfn; 148*1da177e4SLinus Torvalds } 149*1da177e4SLinus Torvalds 150*1da177e4SLinus Torvalds /* 151*1da177e4SLinus Torvalds * Scan the memory info structure and pull out: 152*1da177e4SLinus Torvalds * - the end of memory 153*1da177e4SLinus Torvalds * - the number of nodes 154*1da177e4SLinus Torvalds * - the pfn range of each node 155*1da177e4SLinus Torvalds * - the number of bootmem bitmap pages 156*1da177e4SLinus Torvalds */ 157*1da177e4SLinus Torvalds static unsigned int __init 158*1da177e4SLinus Torvalds find_memend_and_nodes(struct meminfo *mi, struct node_info *np) 159*1da177e4SLinus Torvalds { 160*1da177e4SLinus Torvalds unsigned int i, bootmem_pages = 0, memend_pfn = 0; 161*1da177e4SLinus Torvalds 162*1da177e4SLinus Torvalds for (i = 0; i < MAX_NUMNODES; i++) { 163*1da177e4SLinus Torvalds np[i].start = -1U; 164*1da177e4SLinus Torvalds np[i].end = 0; 165*1da177e4SLinus Torvalds np[i].bootmap_pages = 0; 166*1da177e4SLinus Torvalds } 167*1da177e4SLinus Torvalds 168*1da177e4SLinus Torvalds for (i = 0; i < mi->nr_banks; i++) { 169*1da177e4SLinus Torvalds unsigned long start, end; 170*1da177e4SLinus Torvalds int node; 171*1da177e4SLinus Torvalds 172*1da177e4SLinus Torvalds if (mi->bank[i].size == 0) { 173*1da177e4SLinus Torvalds /* 174*1da177e4SLinus Torvalds * Mark this bank with an invalid node number 175*1da177e4SLinus Torvalds */ 176*1da177e4SLinus Torvalds mi->bank[i].node = -1; 177*1da177e4SLinus Torvalds continue; 178*1da177e4SLinus Torvalds } 179*1da177e4SLinus Torvalds 180*1da177e4SLinus Torvalds node = mi->bank[i].node; 181*1da177e4SLinus Torvalds 182*1da177e4SLinus Torvalds /* 183*1da177e4SLinus Torvalds * Make sure we haven't exceeded the maximum number of nodes 184*1da177e4SLinus Torvalds * that we have in this configuration. If we have, we're in 185*1da177e4SLinus Torvalds * trouble. (maybe we ought to limit, instead of bugging?) 186*1da177e4SLinus Torvalds */ 187*1da177e4SLinus Torvalds if (node >= MAX_NUMNODES) 188*1da177e4SLinus Torvalds BUG(); 189*1da177e4SLinus Torvalds node_set_online(node); 190*1da177e4SLinus Torvalds 191*1da177e4SLinus Torvalds /* 192*1da177e4SLinus Torvalds * Get the start and end pfns for this bank 193*1da177e4SLinus Torvalds */ 194*1da177e4SLinus Torvalds start = O_PFN_UP(mi->bank[i].start); 195*1da177e4SLinus Torvalds end = O_PFN_DOWN(mi->bank[i].start + mi->bank[i].size); 196*1da177e4SLinus Torvalds 197*1da177e4SLinus Torvalds if (np[node].start > start) 198*1da177e4SLinus Torvalds np[node].start = start; 199*1da177e4SLinus Torvalds 200*1da177e4SLinus Torvalds if (np[node].end < end) 201*1da177e4SLinus Torvalds np[node].end = end; 202*1da177e4SLinus Torvalds 203*1da177e4SLinus Torvalds if (memend_pfn < end) 204*1da177e4SLinus Torvalds memend_pfn = end; 205*1da177e4SLinus Torvalds } 206*1da177e4SLinus Torvalds 207*1da177e4SLinus Torvalds /* 208*1da177e4SLinus Torvalds * Calculate the number of pages we require to 209*1da177e4SLinus Torvalds * store the bootmem bitmaps. 210*1da177e4SLinus Torvalds */ 211*1da177e4SLinus Torvalds for_each_online_node(i) { 212*1da177e4SLinus Torvalds if (np[i].end == 0) 213*1da177e4SLinus Torvalds continue; 214*1da177e4SLinus Torvalds 215*1da177e4SLinus Torvalds np[i].bootmap_pages = bootmem_bootmap_pages(np[i].end - 216*1da177e4SLinus Torvalds np[i].start); 217*1da177e4SLinus Torvalds bootmem_pages += np[i].bootmap_pages; 218*1da177e4SLinus Torvalds } 219*1da177e4SLinus Torvalds 220*1da177e4SLinus Torvalds high_memory = __va(memend_pfn << PAGE_SHIFT); 221*1da177e4SLinus Torvalds 222*1da177e4SLinus Torvalds /* 223*1da177e4SLinus Torvalds * This doesn't seem to be used by the Linux memory 224*1da177e4SLinus Torvalds * manager any more. If we can get rid of it, we 225*1da177e4SLinus Torvalds * also get rid of some of the stuff above as well. 226*1da177e4SLinus Torvalds */ 227*1da177e4SLinus Torvalds max_low_pfn = memend_pfn - O_PFN_DOWN(PHYS_OFFSET); 228*1da177e4SLinus Torvalds max_pfn = memend_pfn - O_PFN_DOWN(PHYS_OFFSET); 229*1da177e4SLinus Torvalds 230*1da177e4SLinus Torvalds return bootmem_pages; 231*1da177e4SLinus Torvalds } 232*1da177e4SLinus Torvalds 233*1da177e4SLinus Torvalds static int __init check_initrd(struct meminfo *mi) 234*1da177e4SLinus Torvalds { 235*1da177e4SLinus Torvalds int initrd_node = -2; 236*1da177e4SLinus Torvalds #ifdef CONFIG_BLK_DEV_INITRD 237*1da177e4SLinus Torvalds unsigned long end = phys_initrd_start + phys_initrd_size; 238*1da177e4SLinus Torvalds 239*1da177e4SLinus Torvalds /* 240*1da177e4SLinus Torvalds * Make sure that the initrd is within a valid area of 241*1da177e4SLinus Torvalds * memory. 242*1da177e4SLinus Torvalds */ 243*1da177e4SLinus Torvalds if (phys_initrd_size) { 244*1da177e4SLinus Torvalds unsigned int i; 245*1da177e4SLinus Torvalds 246*1da177e4SLinus Torvalds initrd_node = -1; 247*1da177e4SLinus Torvalds 248*1da177e4SLinus Torvalds for (i = 0; i < mi->nr_banks; i++) { 249*1da177e4SLinus Torvalds unsigned long bank_end; 250*1da177e4SLinus Torvalds 251*1da177e4SLinus Torvalds bank_end = mi->bank[i].start + mi->bank[i].size; 252*1da177e4SLinus Torvalds 253*1da177e4SLinus Torvalds if (mi->bank[i].start <= phys_initrd_start && 254*1da177e4SLinus Torvalds end <= bank_end) 255*1da177e4SLinus Torvalds initrd_node = mi->bank[i].node; 256*1da177e4SLinus Torvalds } 257*1da177e4SLinus Torvalds } 258*1da177e4SLinus Torvalds 259*1da177e4SLinus Torvalds if (initrd_node == -1) { 260*1da177e4SLinus Torvalds printk(KERN_ERR "initrd (0x%08lx - 0x%08lx) extends beyond " 261*1da177e4SLinus Torvalds "physical memory - disabling initrd\n", 262*1da177e4SLinus Torvalds phys_initrd_start, end); 263*1da177e4SLinus Torvalds phys_initrd_start = phys_initrd_size = 0; 264*1da177e4SLinus Torvalds } 265*1da177e4SLinus Torvalds #endif 266*1da177e4SLinus Torvalds 267*1da177e4SLinus Torvalds return initrd_node; 268*1da177e4SLinus Torvalds } 269*1da177e4SLinus Torvalds 270*1da177e4SLinus Torvalds /* 271*1da177e4SLinus Torvalds * Reserve the various regions of node 0 272*1da177e4SLinus Torvalds */ 273*1da177e4SLinus Torvalds static __init void reserve_node_zero(unsigned int bootmap_pfn, unsigned int bootmap_pages) 274*1da177e4SLinus Torvalds { 275*1da177e4SLinus Torvalds pg_data_t *pgdat = NODE_DATA(0); 276*1da177e4SLinus Torvalds unsigned long res_size = 0; 277*1da177e4SLinus Torvalds 278*1da177e4SLinus Torvalds /* 279*1da177e4SLinus Torvalds * Register the kernel text and data with bootmem. 280*1da177e4SLinus Torvalds * Note that this can only be in node 0. 281*1da177e4SLinus Torvalds */ 282*1da177e4SLinus Torvalds #ifdef CONFIG_XIP_KERNEL 283*1da177e4SLinus Torvalds reserve_bootmem_node(pgdat, __pa(&__data_start), &_end - &__data_start); 284*1da177e4SLinus Torvalds #else 285*1da177e4SLinus Torvalds reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext); 286*1da177e4SLinus Torvalds #endif 287*1da177e4SLinus Torvalds 288*1da177e4SLinus Torvalds /* 289*1da177e4SLinus Torvalds * Reserve the page tables. These are already in use, 290*1da177e4SLinus Torvalds * and can only be in node 0. 291*1da177e4SLinus Torvalds */ 292*1da177e4SLinus Torvalds reserve_bootmem_node(pgdat, __pa(swapper_pg_dir), 293*1da177e4SLinus Torvalds PTRS_PER_PGD * sizeof(pgd_t)); 294*1da177e4SLinus Torvalds 295*1da177e4SLinus Torvalds /* 296*1da177e4SLinus Torvalds * And don't forget to reserve the allocator bitmap, 297*1da177e4SLinus Torvalds * which will be freed later. 298*1da177e4SLinus Torvalds */ 299*1da177e4SLinus Torvalds reserve_bootmem_node(pgdat, bootmap_pfn << PAGE_SHIFT, 300*1da177e4SLinus Torvalds bootmap_pages << PAGE_SHIFT); 301*1da177e4SLinus Torvalds 302*1da177e4SLinus Torvalds /* 303*1da177e4SLinus Torvalds * Hmm... This should go elsewhere, but we really really need to 304*1da177e4SLinus Torvalds * stop things allocating the low memory; ideally we need a better 305*1da177e4SLinus Torvalds * implementation of GFP_DMA which does not assume that DMA-able 306*1da177e4SLinus Torvalds * memory starts at zero. 307*1da177e4SLinus Torvalds */ 308*1da177e4SLinus Torvalds if (machine_is_integrator() || machine_is_cintegrator()) 309*1da177e4SLinus Torvalds res_size = __pa(swapper_pg_dir) - PHYS_OFFSET; 310*1da177e4SLinus Torvalds 311*1da177e4SLinus Torvalds /* 312*1da177e4SLinus Torvalds * These should likewise go elsewhere. They pre-reserve the 313*1da177e4SLinus Torvalds * screen memory region at the start of main system memory. 314*1da177e4SLinus Torvalds */ 315*1da177e4SLinus Torvalds if (machine_is_edb7211()) 316*1da177e4SLinus Torvalds res_size = 0x00020000; 317*1da177e4SLinus Torvalds if (machine_is_p720t()) 318*1da177e4SLinus Torvalds res_size = 0x00014000; 319*1da177e4SLinus Torvalds 320*1da177e4SLinus Torvalds #ifdef CONFIG_SA1111 321*1da177e4SLinus Torvalds /* 322*1da177e4SLinus Torvalds * Because of the SA1111 DMA bug, we want to preserve our 323*1da177e4SLinus Torvalds * precious DMA-able memory... 324*1da177e4SLinus Torvalds */ 325*1da177e4SLinus Torvalds res_size = __pa(swapper_pg_dir) - PHYS_OFFSET; 326*1da177e4SLinus Torvalds #endif 327*1da177e4SLinus Torvalds if (res_size) 328*1da177e4SLinus Torvalds reserve_bootmem_node(pgdat, PHYS_OFFSET, res_size); 329*1da177e4SLinus Torvalds } 330*1da177e4SLinus Torvalds 331*1da177e4SLinus Torvalds /* 332*1da177e4SLinus Torvalds * Register all available RAM in this node with the bootmem allocator. 333*1da177e4SLinus Torvalds */ 334*1da177e4SLinus Torvalds static inline void free_bootmem_node_bank(int node, struct meminfo *mi) 335*1da177e4SLinus Torvalds { 336*1da177e4SLinus Torvalds pg_data_t *pgdat = NODE_DATA(node); 337*1da177e4SLinus Torvalds int bank; 338*1da177e4SLinus Torvalds 339*1da177e4SLinus Torvalds for (bank = 0; bank < mi->nr_banks; bank++) 340*1da177e4SLinus Torvalds if (mi->bank[bank].node == node) 341*1da177e4SLinus Torvalds free_bootmem_node(pgdat, mi->bank[bank].start, 342*1da177e4SLinus Torvalds mi->bank[bank].size); 343*1da177e4SLinus Torvalds } 344*1da177e4SLinus Torvalds 345*1da177e4SLinus Torvalds /* 346*1da177e4SLinus Torvalds * Initialise the bootmem allocator for all nodes. This is called 347*1da177e4SLinus Torvalds * early during the architecture specific initialisation. 348*1da177e4SLinus Torvalds */ 349*1da177e4SLinus Torvalds static void __init bootmem_init(struct meminfo *mi) 350*1da177e4SLinus Torvalds { 351*1da177e4SLinus Torvalds struct node_info node_info[MAX_NUMNODES], *np = node_info; 352*1da177e4SLinus Torvalds unsigned int bootmap_pages, bootmap_pfn, map_pg; 353*1da177e4SLinus Torvalds int node, initrd_node; 354*1da177e4SLinus Torvalds 355*1da177e4SLinus Torvalds bootmap_pages = find_memend_and_nodes(mi, np); 356*1da177e4SLinus Torvalds bootmap_pfn = find_bootmap_pfn(0, mi, bootmap_pages); 357*1da177e4SLinus Torvalds initrd_node = check_initrd(mi); 358*1da177e4SLinus Torvalds 359*1da177e4SLinus Torvalds map_pg = bootmap_pfn; 360*1da177e4SLinus Torvalds 361*1da177e4SLinus Torvalds /* 362*1da177e4SLinus Torvalds * Initialise the bootmem nodes. 363*1da177e4SLinus Torvalds * 364*1da177e4SLinus Torvalds * What we really want to do is: 365*1da177e4SLinus Torvalds * 366*1da177e4SLinus Torvalds * unmap_all_regions_except_kernel(); 367*1da177e4SLinus Torvalds * for_each_node_in_reverse_order(node) { 368*1da177e4SLinus Torvalds * map_node(node); 369*1da177e4SLinus Torvalds * allocate_bootmem_map(node); 370*1da177e4SLinus Torvalds * init_bootmem_node(node); 371*1da177e4SLinus Torvalds * free_bootmem_node(node); 372*1da177e4SLinus Torvalds * } 373*1da177e4SLinus Torvalds * 374*1da177e4SLinus Torvalds * but this is a 2.5-type change. For now, we just set 375*1da177e4SLinus Torvalds * the nodes up in reverse order. 376*1da177e4SLinus Torvalds * 377*1da177e4SLinus Torvalds * (we could also do with rolling bootmem_init and paging_init 378*1da177e4SLinus Torvalds * into one generic "memory_init" type function). 379*1da177e4SLinus Torvalds */ 380*1da177e4SLinus Torvalds np += num_online_nodes() - 1; 381*1da177e4SLinus Torvalds for (node = num_online_nodes() - 1; node >= 0; node--, np--) { 382*1da177e4SLinus Torvalds /* 383*1da177e4SLinus Torvalds * If there are no pages in this node, ignore it. 384*1da177e4SLinus Torvalds * Note that node 0 must always have some pages. 385*1da177e4SLinus Torvalds */ 386*1da177e4SLinus Torvalds if (np->end == 0 || !node_online(node)) { 387*1da177e4SLinus Torvalds if (node == 0) 388*1da177e4SLinus Torvalds BUG(); 389*1da177e4SLinus Torvalds continue; 390*1da177e4SLinus Torvalds } 391*1da177e4SLinus Torvalds 392*1da177e4SLinus Torvalds /* 393*1da177e4SLinus Torvalds * Initialise the bootmem allocator. 394*1da177e4SLinus Torvalds */ 395*1da177e4SLinus Torvalds init_bootmem_node(NODE_DATA(node), map_pg, np->start, np->end); 396*1da177e4SLinus Torvalds free_bootmem_node_bank(node, mi); 397*1da177e4SLinus Torvalds map_pg += np->bootmap_pages; 398*1da177e4SLinus Torvalds 399*1da177e4SLinus Torvalds /* 400*1da177e4SLinus Torvalds * If this is node 0, we need to reserve some areas ASAP - 401*1da177e4SLinus Torvalds * we may use bootmem on node 0 to setup the other nodes. 402*1da177e4SLinus Torvalds */ 403*1da177e4SLinus Torvalds if (node == 0) 404*1da177e4SLinus Torvalds reserve_node_zero(bootmap_pfn, bootmap_pages); 405*1da177e4SLinus Torvalds } 406*1da177e4SLinus Torvalds 407*1da177e4SLinus Torvalds 408*1da177e4SLinus Torvalds #ifdef CONFIG_BLK_DEV_INITRD 409*1da177e4SLinus Torvalds if (phys_initrd_size && initrd_node >= 0) { 410*1da177e4SLinus Torvalds reserve_bootmem_node(NODE_DATA(initrd_node), phys_initrd_start, 411*1da177e4SLinus Torvalds phys_initrd_size); 412*1da177e4SLinus Torvalds initrd_start = __phys_to_virt(phys_initrd_start); 413*1da177e4SLinus Torvalds initrd_end = initrd_start + phys_initrd_size; 414*1da177e4SLinus Torvalds } 415*1da177e4SLinus Torvalds #endif 416*1da177e4SLinus Torvalds 417*1da177e4SLinus Torvalds BUG_ON(map_pg != bootmap_pfn + bootmap_pages); 418*1da177e4SLinus Torvalds } 419*1da177e4SLinus Torvalds 420*1da177e4SLinus Torvalds /* 421*1da177e4SLinus Torvalds * paging_init() sets up the page tables, initialises the zone memory 422*1da177e4SLinus Torvalds * maps, and sets up the zero page, bad page and bad page tables. 423*1da177e4SLinus Torvalds */ 424*1da177e4SLinus Torvalds void __init paging_init(struct meminfo *mi, struct machine_desc *mdesc) 425*1da177e4SLinus Torvalds { 426*1da177e4SLinus Torvalds void *zero_page; 427*1da177e4SLinus Torvalds int node; 428*1da177e4SLinus Torvalds 429*1da177e4SLinus Torvalds bootmem_init(mi); 430*1da177e4SLinus Torvalds 431*1da177e4SLinus Torvalds memcpy(&meminfo, mi, sizeof(meminfo)); 432*1da177e4SLinus Torvalds 433*1da177e4SLinus Torvalds /* 434*1da177e4SLinus Torvalds * allocate the zero page. Note that we count on this going ok. 435*1da177e4SLinus Torvalds */ 436*1da177e4SLinus Torvalds zero_page = alloc_bootmem_low_pages(PAGE_SIZE); 437*1da177e4SLinus Torvalds 438*1da177e4SLinus Torvalds /* 439*1da177e4SLinus Torvalds * initialise the page tables. 440*1da177e4SLinus Torvalds */ 441*1da177e4SLinus Torvalds memtable_init(mi); 442*1da177e4SLinus Torvalds if (mdesc->map_io) 443*1da177e4SLinus Torvalds mdesc->map_io(); 444*1da177e4SLinus Torvalds flush_tlb_all(); 445*1da177e4SLinus Torvalds 446*1da177e4SLinus Torvalds /* 447*1da177e4SLinus Torvalds * initialise the zones within each node 448*1da177e4SLinus Torvalds */ 449*1da177e4SLinus Torvalds for_each_online_node(node) { 450*1da177e4SLinus Torvalds unsigned long zone_size[MAX_NR_ZONES]; 451*1da177e4SLinus Torvalds unsigned long zhole_size[MAX_NR_ZONES]; 452*1da177e4SLinus Torvalds struct bootmem_data *bdata; 453*1da177e4SLinus Torvalds pg_data_t *pgdat; 454*1da177e4SLinus Torvalds int i; 455*1da177e4SLinus Torvalds 456*1da177e4SLinus Torvalds /* 457*1da177e4SLinus Torvalds * Initialise the zone size information. 458*1da177e4SLinus Torvalds */ 459*1da177e4SLinus Torvalds for (i = 0; i < MAX_NR_ZONES; i++) { 460*1da177e4SLinus Torvalds zone_size[i] = 0; 461*1da177e4SLinus Torvalds zhole_size[i] = 0; 462*1da177e4SLinus Torvalds } 463*1da177e4SLinus Torvalds 464*1da177e4SLinus Torvalds pgdat = NODE_DATA(node); 465*1da177e4SLinus Torvalds bdata = pgdat->bdata; 466*1da177e4SLinus Torvalds 467*1da177e4SLinus Torvalds /* 468*1da177e4SLinus Torvalds * The size of this node has already been determined. 469*1da177e4SLinus Torvalds * If we need to do anything fancy with the allocation 470*1da177e4SLinus Torvalds * of this memory to the zones, now is the time to do 471*1da177e4SLinus Torvalds * it. 472*1da177e4SLinus Torvalds */ 473*1da177e4SLinus Torvalds zone_size[0] = bdata->node_low_pfn - 474*1da177e4SLinus Torvalds (bdata->node_boot_start >> PAGE_SHIFT); 475*1da177e4SLinus Torvalds 476*1da177e4SLinus Torvalds /* 477*1da177e4SLinus Torvalds * If this zone has zero size, skip it. 478*1da177e4SLinus Torvalds */ 479*1da177e4SLinus Torvalds if (!zone_size[0]) 480*1da177e4SLinus Torvalds continue; 481*1da177e4SLinus Torvalds 482*1da177e4SLinus Torvalds /* 483*1da177e4SLinus Torvalds * For each bank in this node, calculate the size of the 484*1da177e4SLinus Torvalds * holes. holes = node_size - sum(bank_sizes_in_node) 485*1da177e4SLinus Torvalds */ 486*1da177e4SLinus Torvalds zhole_size[0] = zone_size[0]; 487*1da177e4SLinus Torvalds for (i = 0; i < mi->nr_banks; i++) { 488*1da177e4SLinus Torvalds if (mi->bank[i].node != node) 489*1da177e4SLinus Torvalds continue; 490*1da177e4SLinus Torvalds 491*1da177e4SLinus Torvalds zhole_size[0] -= mi->bank[i].size >> PAGE_SHIFT; 492*1da177e4SLinus Torvalds } 493*1da177e4SLinus Torvalds 494*1da177e4SLinus Torvalds /* 495*1da177e4SLinus Torvalds * Adjust the sizes according to any special 496*1da177e4SLinus Torvalds * requirements for this machine type. 497*1da177e4SLinus Torvalds */ 498*1da177e4SLinus Torvalds arch_adjust_zones(node, zone_size, zhole_size); 499*1da177e4SLinus Torvalds 500*1da177e4SLinus Torvalds free_area_init_node(node, pgdat, zone_size, 501*1da177e4SLinus Torvalds bdata->node_boot_start >> PAGE_SHIFT, zhole_size); 502*1da177e4SLinus Torvalds } 503*1da177e4SLinus Torvalds 504*1da177e4SLinus Torvalds /* 505*1da177e4SLinus Torvalds * finish off the bad pages once 506*1da177e4SLinus Torvalds * the mem_map is initialised 507*1da177e4SLinus Torvalds */ 508*1da177e4SLinus Torvalds memzero(zero_page, PAGE_SIZE); 509*1da177e4SLinus Torvalds empty_zero_page = virt_to_page(zero_page); 510*1da177e4SLinus Torvalds flush_dcache_page(empty_zero_page); 511*1da177e4SLinus Torvalds } 512*1da177e4SLinus Torvalds 513*1da177e4SLinus Torvalds static inline void free_area(unsigned long addr, unsigned long end, char *s) 514*1da177e4SLinus Torvalds { 515*1da177e4SLinus Torvalds unsigned int size = (end - addr) >> 10; 516*1da177e4SLinus Torvalds 517*1da177e4SLinus Torvalds for (; addr < end; addr += PAGE_SIZE) { 518*1da177e4SLinus Torvalds struct page *page = virt_to_page(addr); 519*1da177e4SLinus Torvalds ClearPageReserved(page); 520*1da177e4SLinus Torvalds set_page_count(page, 1); 521*1da177e4SLinus Torvalds free_page(addr); 522*1da177e4SLinus Torvalds totalram_pages++; 523*1da177e4SLinus Torvalds } 524*1da177e4SLinus Torvalds 525*1da177e4SLinus Torvalds if (size && s) 526*1da177e4SLinus Torvalds printk(KERN_INFO "Freeing %s memory: %dK\n", s, size); 527*1da177e4SLinus Torvalds } 528*1da177e4SLinus Torvalds 529*1da177e4SLinus Torvalds /* 530*1da177e4SLinus Torvalds * mem_init() marks the free areas in the mem_map and tells us how much 531*1da177e4SLinus Torvalds * memory is free. This is done after various parts of the system have 532*1da177e4SLinus Torvalds * claimed their memory after the kernel image. 533*1da177e4SLinus Torvalds */ 534*1da177e4SLinus Torvalds void __init mem_init(void) 535*1da177e4SLinus Torvalds { 536*1da177e4SLinus Torvalds unsigned int codepages, datapages, initpages; 537*1da177e4SLinus Torvalds int i, node; 538*1da177e4SLinus Torvalds 539*1da177e4SLinus Torvalds codepages = &_etext - &_text; 540*1da177e4SLinus Torvalds datapages = &_end - &__data_start; 541*1da177e4SLinus Torvalds initpages = &__init_end - &__init_begin; 542*1da177e4SLinus Torvalds 543*1da177e4SLinus Torvalds #ifndef CONFIG_DISCONTIGMEM 544*1da177e4SLinus Torvalds max_mapnr = virt_to_page(high_memory) - mem_map; 545*1da177e4SLinus Torvalds #endif 546*1da177e4SLinus Torvalds 547*1da177e4SLinus Torvalds /* 548*1da177e4SLinus Torvalds * We may have non-contiguous memory. 549*1da177e4SLinus Torvalds */ 550*1da177e4SLinus Torvalds if (meminfo.nr_banks != 1) 551*1da177e4SLinus Torvalds create_memmap_holes(&meminfo); 552*1da177e4SLinus Torvalds 553*1da177e4SLinus Torvalds /* this will put all unused low memory onto the freelists */ 554*1da177e4SLinus Torvalds for_each_online_node(node) { 555*1da177e4SLinus Torvalds pg_data_t *pgdat = NODE_DATA(node); 556*1da177e4SLinus Torvalds 557*1da177e4SLinus Torvalds if (pgdat->node_spanned_pages != 0) 558*1da177e4SLinus Torvalds totalram_pages += free_all_bootmem_node(pgdat); 559*1da177e4SLinus Torvalds } 560*1da177e4SLinus Torvalds 561*1da177e4SLinus Torvalds #ifdef CONFIG_SA1111 562*1da177e4SLinus Torvalds /* now that our DMA memory is actually so designated, we can free it */ 563*1da177e4SLinus Torvalds free_area(PAGE_OFFSET, (unsigned long)swapper_pg_dir, NULL); 564*1da177e4SLinus Torvalds #endif 565*1da177e4SLinus Torvalds 566*1da177e4SLinus Torvalds /* 567*1da177e4SLinus Torvalds * Since our memory may not be contiguous, calculate the 568*1da177e4SLinus Torvalds * real number of pages we have in this system 569*1da177e4SLinus Torvalds */ 570*1da177e4SLinus Torvalds printk(KERN_INFO "Memory:"); 571*1da177e4SLinus Torvalds 572*1da177e4SLinus Torvalds num_physpages = 0; 573*1da177e4SLinus Torvalds for (i = 0; i < meminfo.nr_banks; i++) { 574*1da177e4SLinus Torvalds num_physpages += meminfo.bank[i].size >> PAGE_SHIFT; 575*1da177e4SLinus Torvalds printk(" %ldMB", meminfo.bank[i].size >> 20); 576*1da177e4SLinus Torvalds } 577*1da177e4SLinus Torvalds 578*1da177e4SLinus Torvalds printk(" = %luMB total\n", num_physpages >> (20 - PAGE_SHIFT)); 579*1da177e4SLinus Torvalds printk(KERN_NOTICE "Memory: %luKB available (%dK code, " 580*1da177e4SLinus Torvalds "%dK data, %dK init)\n", 581*1da177e4SLinus Torvalds (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), 582*1da177e4SLinus Torvalds codepages >> 10, datapages >> 10, initpages >> 10); 583*1da177e4SLinus Torvalds 584*1da177e4SLinus Torvalds if (PAGE_SIZE >= 16384 && num_physpages <= 128) { 585*1da177e4SLinus Torvalds extern int sysctl_overcommit_memory; 586*1da177e4SLinus Torvalds /* 587*1da177e4SLinus Torvalds * On a machine this small we won't get 588*1da177e4SLinus Torvalds * anywhere without overcommit, so turn 589*1da177e4SLinus Torvalds * it on by default. 590*1da177e4SLinus Torvalds */ 591*1da177e4SLinus Torvalds sysctl_overcommit_memory = OVERCOMMIT_ALWAYS; 592*1da177e4SLinus Torvalds } 593*1da177e4SLinus Torvalds } 594*1da177e4SLinus Torvalds 595*1da177e4SLinus Torvalds void free_initmem(void) 596*1da177e4SLinus Torvalds { 597*1da177e4SLinus Torvalds if (!machine_is_integrator() && !machine_is_cintegrator()) { 598*1da177e4SLinus Torvalds free_area((unsigned long)(&__init_begin), 599*1da177e4SLinus Torvalds (unsigned long)(&__init_end), 600*1da177e4SLinus Torvalds "init"); 601*1da177e4SLinus Torvalds } 602*1da177e4SLinus Torvalds } 603*1da177e4SLinus Torvalds 604*1da177e4SLinus Torvalds #ifdef CONFIG_BLK_DEV_INITRD 605*1da177e4SLinus Torvalds 606*1da177e4SLinus Torvalds static int keep_initrd; 607*1da177e4SLinus Torvalds 608*1da177e4SLinus Torvalds void free_initrd_mem(unsigned long start, unsigned long end) 609*1da177e4SLinus Torvalds { 610*1da177e4SLinus Torvalds if (!keep_initrd) 611*1da177e4SLinus Torvalds free_area(start, end, "initrd"); 612*1da177e4SLinus Torvalds } 613*1da177e4SLinus Torvalds 614*1da177e4SLinus Torvalds static int __init keepinitrd_setup(char *__unused) 615*1da177e4SLinus Torvalds { 616*1da177e4SLinus Torvalds keep_initrd = 1; 617*1da177e4SLinus Torvalds return 1; 618*1da177e4SLinus Torvalds } 619*1da177e4SLinus Torvalds 620*1da177e4SLinus Torvalds __setup("keepinitrd", keepinitrd_setup); 621*1da177e4SLinus Torvalds #endif 622