[PATCH] i386: Replace i386 open-coded cmdline parsing with
[pandora-kernel.git] / arch / i386 / kernel / setup.c
1 /*
2  *  linux/arch/i386/kernel/setup.c
3  *
4  *  Copyright (C) 1995  Linus Torvalds
5  *
6  *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
7  *
8  *  Memory region support
9  *      David Parsons <orc@pell.chi.il.us>, July-August 1999
10  *
11  *  Added E820 sanitization routine (removes overlapping memory regions);
12  *  Brian Moyle <bmoyle@mvista.com>, February 2001
13  *
14  * Moved CPU detection code to cpu/${cpu}.c
15  *    Patrick Mochel <mochel@osdl.org>, March 2002
16  *
17  *  Provisions for empty E820 memory regions (reported by certain BIOSes).
18  *  Alex Achenbach <xela@slit.de>, December 2002.
19  *
20  */
21
22 /*
23  * This file handles the architecture-dependent parts of initialization
24  */
25
26 #include <linux/sched.h>
27 #include <linux/mm.h>
28 #include <linux/mmzone.h>
29 #include <linux/screen_info.h>
30 #include <linux/ioport.h>
31 #include <linux/acpi.h>
32 #include <linux/apm_bios.h>
33 #include <linux/initrd.h>
34 #include <linux/bootmem.h>
35 #include <linux/seq_file.h>
36 #include <linux/platform_device.h>
37 #include <linux/console.h>
38 #include <linux/mca.h>
39 #include <linux/root_dev.h>
40 #include <linux/highmem.h>
41 #include <linux/module.h>
42 #include <linux/efi.h>
43 #include <linux/init.h>
44 #include <linux/edd.h>
45 #include <linux/nodemask.h>
46 #include <linux/kexec.h>
47 #include <linux/crash_dump.h>
48 #include <linux/dmi.h>
49 #include <linux/pfn.h>
50
51 #include <video/edid.h>
52
53 #include <asm/apic.h>
54 #include <asm/e820.h>
55 #include <asm/mpspec.h>
56 #include <asm/setup.h>
57 #include <asm/arch_hooks.h>
58 #include <asm/sections.h>
59 #include <asm/io_apic.h>
60 #include <asm/ist.h>
61 #include <asm/io.h>
62 #include <setup_arch.h>
63 #include <bios_ebda.h>
64
65 /* Forward Declaration. */
66 void __init find_max_pfn(void);
67
68 /* This value is set up by the early boot code to point to the value
69    immediately after the boot time page tables.  It contains a *physical*
70    address, and must not be in the .bss segment! */
71 unsigned long init_pg_tables_end __initdata = ~0UL;
72
73 int disable_pse __devinitdata = 0;
74
75 /*
76  * Machine setup..
77  */
78
79 #ifdef CONFIG_EFI
80 int efi_enabled = 0;
81 EXPORT_SYMBOL(efi_enabled);
82 #endif
83
84 /* cpu data as detected by the assembly code in head.S */
85 struct cpuinfo_x86 new_cpu_data __initdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
86 /* common cpu data for all cpus */
87 struct cpuinfo_x86 boot_cpu_data __read_mostly = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
88 EXPORT_SYMBOL(boot_cpu_data);
89
90 unsigned long mmu_cr4_features;
91
92 #ifdef  CONFIG_ACPI
93         int acpi_disabled = 0;
94 #else
95         int acpi_disabled = 1;
96 #endif
97 EXPORT_SYMBOL(acpi_disabled);
98
99 /* for MCA, but anyone else can use it if they want */
100 unsigned int machine_id;
101 #ifdef CONFIG_MCA
102 EXPORT_SYMBOL(machine_id);
103 #endif
104 unsigned int machine_submodel_id;
105 unsigned int BIOS_revision;
106 unsigned int mca_pentium_flag;
107
108 /* For PCI or other memory-mapped resources */
109 unsigned long pci_mem_start = 0x10000000;
110 #ifdef CONFIG_PCI
111 EXPORT_SYMBOL(pci_mem_start);
112 #endif
113
114 /* Boot loader ID as an integer, for the benefit of proc_dointvec */
115 int bootloader_type;
116
117 /* user-defined highmem size */
118 static unsigned int highmem_pages = -1;
119
120 /*
121  * Setup options
122  */
123 struct drive_info_struct { char dummy[32]; } drive_info;
124 #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || \
125     defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE)
126 EXPORT_SYMBOL(drive_info);
127 #endif
128 struct screen_info screen_info;
129 EXPORT_SYMBOL(screen_info);
130 struct apm_info apm_info;
131 EXPORT_SYMBOL(apm_info);
132 struct sys_desc_table_struct {
133         unsigned short length;
134         unsigned char table[0];
135 };
136 struct edid_info edid_info;
137 EXPORT_SYMBOL_GPL(edid_info);
138 struct ist_info ist_info;
139 #if defined(CONFIG_X86_SPEEDSTEP_SMI) || \
140         defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE)
141 EXPORT_SYMBOL(ist_info);
142 #endif
143 struct e820map e820;
144
145 extern void early_cpu_init(void);
146 extern int root_mountflags;
147
148 unsigned long saved_videomode;
149
150 #define RAMDISK_IMAGE_START_MASK        0x07FF
151 #define RAMDISK_PROMPT_FLAG             0x8000
152 #define RAMDISK_LOAD_FLAG               0x4000  
153
154 static char command_line[COMMAND_LINE_SIZE];
155
156 unsigned char __initdata boot_params[PARAM_SIZE];
157
158 static struct resource data_resource = {
159         .name   = "Kernel data",
160         .start  = 0,
161         .end    = 0,
162         .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
163 };
164
165 static struct resource code_resource = {
166         .name   = "Kernel code",
167         .start  = 0,
168         .end    = 0,
169         .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
170 };
171
172 static struct resource system_rom_resource = {
173         .name   = "System ROM",
174         .start  = 0xf0000,
175         .end    = 0xfffff,
176         .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
177 };
178
179 static struct resource extension_rom_resource = {
180         .name   = "Extension ROM",
181         .start  = 0xe0000,
182         .end    = 0xeffff,
183         .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
184 };
185
186 static struct resource adapter_rom_resources[] = { {
187         .name   = "Adapter ROM",
188         .start  = 0xc8000,
189         .end    = 0,
190         .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
191 }, {
192         .name   = "Adapter ROM",
193         .start  = 0,
194         .end    = 0,
195         .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
196 }, {
197         .name   = "Adapter ROM",
198         .start  = 0,
199         .end    = 0,
200         .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
201 }, {
202         .name   = "Adapter ROM",
203         .start  = 0,
204         .end    = 0,
205         .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
206 }, {
207         .name   = "Adapter ROM",
208         .start  = 0,
209         .end    = 0,
210         .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
211 }, {
212         .name   = "Adapter ROM",
213         .start  = 0,
214         .end    = 0,
215         .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
216 } };
217
218 #define ADAPTER_ROM_RESOURCES \
219         (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
220
221 static struct resource video_rom_resource = {
222         .name   = "Video ROM",
223         .start  = 0xc0000,
224         .end    = 0xc7fff,
225         .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
226 };
227
228 static struct resource video_ram_resource = {
229         .name   = "Video RAM area",
230         .start  = 0xa0000,
231         .end    = 0xbffff,
232         .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
233 };
234
235 static struct resource standard_io_resources[] = { {
236         .name   = "dma1",
237         .start  = 0x0000,
238         .end    = 0x001f,
239         .flags  = IORESOURCE_BUSY | IORESOURCE_IO
240 }, {
241         .name   = "pic1",
242         .start  = 0x0020,
243         .end    = 0x0021,
244         .flags  = IORESOURCE_BUSY | IORESOURCE_IO
245 }, {
246         .name   = "timer0",
247         .start  = 0x0040,
248         .end    = 0x0043,
249         .flags  = IORESOURCE_BUSY | IORESOURCE_IO
250 }, {
251         .name   = "timer1",
252         .start  = 0x0050,
253         .end    = 0x0053,
254         .flags  = IORESOURCE_BUSY | IORESOURCE_IO
255 }, {
256         .name   = "keyboard",
257         .start  = 0x0060,
258         .end    = 0x006f,
259         .flags  = IORESOURCE_BUSY | IORESOURCE_IO
260 }, {
261         .name   = "dma page reg",
262         .start  = 0x0080,
263         .end    = 0x008f,
264         .flags  = IORESOURCE_BUSY | IORESOURCE_IO
265 }, {
266         .name   = "pic2",
267         .start  = 0x00a0,
268         .end    = 0x00a1,
269         .flags  = IORESOURCE_BUSY | IORESOURCE_IO
270 }, {
271         .name   = "dma2",
272         .start  = 0x00c0,
273         .end    = 0x00df,
274         .flags  = IORESOURCE_BUSY | IORESOURCE_IO
275 }, {
276         .name   = "fpu",
277         .start  = 0x00f0,
278         .end    = 0x00ff,
279         .flags  = IORESOURCE_BUSY | IORESOURCE_IO
280 } };
281
282 #define STANDARD_IO_RESOURCES \
283         (sizeof standard_io_resources / sizeof standard_io_resources[0])
284
285 #define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
286
287 static int __init romchecksum(unsigned char *rom, unsigned long length)
288 {
289         unsigned char *p, sum = 0;
290
291         for (p = rom; p < rom + length; p++)
292                 sum += *p;
293         return sum == 0;
294 }
295
296 static void __init probe_roms(void)
297 {
298         unsigned long start, length, upper;
299         unsigned char *rom;
300         int           i;
301
302         /* video rom */
303         upper = adapter_rom_resources[0].start;
304         for (start = video_rom_resource.start; start < upper; start += 2048) {
305                 rom = isa_bus_to_virt(start);
306                 if (!romsignature(rom))
307                         continue;
308
309                 video_rom_resource.start = start;
310
311                 /* 0 < length <= 0x7f * 512, historically */
312                 length = rom[2] * 512;
313
314                 /* if checksum okay, trust length byte */
315                 if (length && romchecksum(rom, length))
316                         video_rom_resource.end = start + length - 1;
317
318                 request_resource(&iomem_resource, &video_rom_resource);
319                 break;
320         }
321
322         start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
323         if (start < upper)
324                 start = upper;
325
326         /* system rom */
327         request_resource(&iomem_resource, &system_rom_resource);
328         upper = system_rom_resource.start;
329
330         /* check for extension rom (ignore length byte!) */
331         rom = isa_bus_to_virt(extension_rom_resource.start);
332         if (romsignature(rom)) {
333                 length = extension_rom_resource.end - extension_rom_resource.start + 1;
334                 if (romchecksum(rom, length)) {
335                         request_resource(&iomem_resource, &extension_rom_resource);
336                         upper = extension_rom_resource.start;
337                 }
338         }
339
340         /* check for adapter roms on 2k boundaries */
341         for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) {
342                 rom = isa_bus_to_virt(start);
343                 if (!romsignature(rom))
344                         continue;
345
346                 /* 0 < length <= 0x7f * 512, historically */
347                 length = rom[2] * 512;
348
349                 /* but accept any length that fits if checksum okay */
350                 if (!length || start + length > upper || !romchecksum(rom, length))
351                         continue;
352
353                 adapter_rom_resources[i].start = start;
354                 adapter_rom_resources[i].end = start + length - 1;
355                 request_resource(&iomem_resource, &adapter_rom_resources[i]);
356
357                 start = adapter_rom_resources[i++].end & ~2047UL;
358         }
359 }
360
361 static void __init limit_regions(unsigned long long size)
362 {
363         unsigned long long current_addr = 0;
364         int i;
365
366         if (efi_enabled) {
367                 efi_memory_desc_t *md;
368                 void *p;
369
370                 for (p = memmap.map, i = 0; p < memmap.map_end;
371                         p += memmap.desc_size, i++) {
372                         md = p;
373                         current_addr = md->phys_addr + (md->num_pages << 12);
374                         if (md->type == EFI_CONVENTIONAL_MEMORY) {
375                                 if (current_addr >= size) {
376                                         md->num_pages -=
377                                                 (((current_addr-size) + PAGE_SIZE-1) >> PAGE_SHIFT);
378                                         memmap.nr_map = i + 1;
379                                         return;
380                                 }
381                         }
382                 }
383         }
384         for (i = 0; i < e820.nr_map; i++) {
385                 current_addr = e820.map[i].addr + e820.map[i].size;
386                 if (current_addr < size)
387                         continue;
388
389                 if (e820.map[i].type != E820_RAM)
390                         continue;
391
392                 if (e820.map[i].addr >= size) {
393                         /*
394                          * This region starts past the end of the
395                          * requested size, skip it completely.
396                          */
397                         e820.nr_map = i;
398                 } else {
399                         e820.nr_map = i + 1;
400                         e820.map[i].size -= current_addr - size;
401                 }
402                 return;
403         }
404 }
405
406 void __init add_memory_region(unsigned long long start,
407                               unsigned long long size, int type)
408 {
409         int x;
410
411         if (!efi_enabled) {
412                 x = e820.nr_map;
413
414                 if (x == E820MAX) {
415                     printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
416                     return;
417                 }
418
419                 e820.map[x].addr = start;
420                 e820.map[x].size = size;
421                 e820.map[x].type = type;
422                 e820.nr_map++;
423         }
424 } /* add_memory_region */
425
426 #define E820_DEBUG      1
427
428 static void __init print_memory_map(char *who)
429 {
430         int i;
431
432         for (i = 0; i < e820.nr_map; i++) {
433                 printk(" %s: %016Lx - %016Lx ", who,
434                         e820.map[i].addr,
435                         e820.map[i].addr + e820.map[i].size);
436                 switch (e820.map[i].type) {
437                 case E820_RAM:  printk("(usable)\n");
438                                 break;
439                 case E820_RESERVED:
440                                 printk("(reserved)\n");
441                                 break;
442                 case E820_ACPI:
443                                 printk("(ACPI data)\n");
444                                 break;
445                 case E820_NVS:
446                                 printk("(ACPI NVS)\n");
447                                 break;
448                 default:        printk("type %lu\n", e820.map[i].type);
449                                 break;
450                 }
451         }
452 }
453
454 /*
455  * Sanitize the BIOS e820 map.
456  *
457  * Some e820 responses include overlapping entries.  The following 
458  * replaces the original e820 map with a new one, removing overlaps.
459  *
460  */
461 struct change_member {
462         struct e820entry *pbios; /* pointer to original bios entry */
463         unsigned long long addr; /* address for this change point */
464 };
465 static struct change_member change_point_list[2*E820MAX] __initdata;
466 static struct change_member *change_point[2*E820MAX] __initdata;
467 static struct e820entry *overlap_list[E820MAX] __initdata;
468 static struct e820entry new_bios[E820MAX] __initdata;
469
470 int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
471 {
472         struct change_member *change_tmp;
473         unsigned long current_type, last_type;
474         unsigned long long last_addr;
475         int chgidx, still_changing;
476         int overlap_entries;
477         int new_bios_entry;
478         int old_nr, new_nr, chg_nr;
479         int i;
480
481         /*
482                 Visually we're performing the following (1,2,3,4 = memory types)...
483
484                 Sample memory map (w/overlaps):
485                    ____22__________________
486                    ______________________4_
487                    ____1111________________
488                    _44_____________________
489                    11111111________________
490                    ____________________33__
491                    ___________44___________
492                    __________33333_________
493                    ______________22________
494                    ___________________2222_
495                    _________111111111______
496                    _____________________11_
497                    _________________4______
498
499                 Sanitized equivalent (no overlap):
500                    1_______________________
501                    _44_____________________
502                    ___1____________________
503                    ____22__________________
504                    ______11________________
505                    _________1______________
506                    __________3_____________
507                    ___________44___________
508                    _____________33_________
509                    _______________2________
510                    ________________1_______
511                    _________________4______
512                    ___________________2____
513                    ____________________33__
514                    ______________________4_
515         */
516
517         /* if there's only one memory region, don't bother */
518         if (*pnr_map < 2)
519                 return -1;
520
521         old_nr = *pnr_map;
522
523         /* bail out if we find any unreasonable addresses in bios map */
524         for (i=0; i<old_nr; i++)
525                 if (biosmap[i].addr + biosmap[i].size < biosmap[i].addr)
526                         return -1;
527
528         /* create pointers for initial change-point information (for sorting) */
529         for (i=0; i < 2*old_nr; i++)
530                 change_point[i] = &change_point_list[i];
531
532         /* record all known change-points (starting and ending addresses),
533            omitting those that are for empty memory regions */
534         chgidx = 0;
535         for (i=0; i < old_nr; i++)      {
536                 if (biosmap[i].size != 0) {
537                         change_point[chgidx]->addr = biosmap[i].addr;
538                         change_point[chgidx++]->pbios = &biosmap[i];
539                         change_point[chgidx]->addr = biosmap[i].addr + biosmap[i].size;
540                         change_point[chgidx++]->pbios = &biosmap[i];
541                 }
542         }
543         chg_nr = chgidx;        /* true number of change-points */
544
545         /* sort change-point list by memory addresses (low -> high) */
546         still_changing = 1;
547         while (still_changing)  {
548                 still_changing = 0;
549                 for (i=1; i < chg_nr; i++)  {
550                         /* if <current_addr> > <last_addr>, swap */
551                         /* or, if current=<start_addr> & last=<end_addr>, swap */
552                         if ((change_point[i]->addr < change_point[i-1]->addr) ||
553                                 ((change_point[i]->addr == change_point[i-1]->addr) &&
554                                  (change_point[i]->addr == change_point[i]->pbios->addr) &&
555                                  (change_point[i-1]->addr != change_point[i-1]->pbios->addr))
556                            )
557                         {
558                                 change_tmp = change_point[i];
559                                 change_point[i] = change_point[i-1];
560                                 change_point[i-1] = change_tmp;
561                                 still_changing=1;
562                         }
563                 }
564         }
565
566         /* create a new bios memory map, removing overlaps */
567         overlap_entries=0;       /* number of entries in the overlap table */
568         new_bios_entry=0;        /* index for creating new bios map entries */
569         last_type = 0;           /* start with undefined memory type */
570         last_addr = 0;           /* start with 0 as last starting address */
571         /* loop through change-points, determining affect on the new bios map */
572         for (chgidx=0; chgidx < chg_nr; chgidx++)
573         {
574                 /* keep track of all overlapping bios entries */
575                 if (change_point[chgidx]->addr == change_point[chgidx]->pbios->addr)
576                 {
577                         /* add map entry to overlap list (> 1 entry implies an overlap) */
578                         overlap_list[overlap_entries++]=change_point[chgidx]->pbios;
579                 }
580                 else
581                 {
582                         /* remove entry from list (order independent, so swap with last) */
583                         for (i=0; i<overlap_entries; i++)
584                         {
585                                 if (overlap_list[i] == change_point[chgidx]->pbios)
586                                         overlap_list[i] = overlap_list[overlap_entries-1];
587                         }
588                         overlap_entries--;
589                 }
590                 /* if there are overlapping entries, decide which "type" to use */
591                 /* (larger value takes precedence -- 1=usable, 2,3,4,4+=unusable) */
592                 current_type = 0;
593                 for (i=0; i<overlap_entries; i++)
594                         if (overlap_list[i]->type > current_type)
595                                 current_type = overlap_list[i]->type;
596                 /* continue building up new bios map based on this information */
597                 if (current_type != last_type)  {
598                         if (last_type != 0)      {
599                                 new_bios[new_bios_entry].size =
600                                         change_point[chgidx]->addr - last_addr;
601                                 /* move forward only if the new size was non-zero */
602                                 if (new_bios[new_bios_entry].size != 0)
603                                         if (++new_bios_entry >= E820MAX)
604                                                 break;  /* no more space left for new bios entries */
605                         }
606                         if (current_type != 0)  {
607                                 new_bios[new_bios_entry].addr = change_point[chgidx]->addr;
608                                 new_bios[new_bios_entry].type = current_type;
609                                 last_addr=change_point[chgidx]->addr;
610                         }
611                         last_type = current_type;
612                 }
613         }
614         new_nr = new_bios_entry;   /* retain count for new bios entries */
615
616         /* copy new bios mapping into original location */
617         memcpy(biosmap, new_bios, new_nr*sizeof(struct e820entry));
618         *pnr_map = new_nr;
619
620         return 0;
621 }
622
623 /*
624  * Copy the BIOS e820 map into a safe place.
625  *
626  * Sanity-check it while we're at it..
627  *
628  * If we're lucky and live on a modern system, the setup code
629  * will have given us a memory map that we can use to properly
630  * set up memory.  If we aren't, we'll fake a memory map.
631  *
632  * We check to see that the memory map contains at least 2 elements
633  * before we'll use it, because the detection code in setup.S may
634  * not be perfect and most every PC known to man has two memory
635  * regions: one from 0 to 640k, and one from 1mb up.  (The IBM
636  * thinkpad 560x, for example, does not cooperate with the memory
637  * detection code.)
638  */
639 int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
640 {
641         /* Only one memory region (or negative)? Ignore it */
642         if (nr_map < 2)
643                 return -1;
644
645         do {
646                 unsigned long long start = biosmap->addr;
647                 unsigned long long size = biosmap->size;
648                 unsigned long long end = start + size;
649                 unsigned long type = biosmap->type;
650
651                 /* Overflow in 64 bits? Ignore the memory map. */
652                 if (start > end)
653                         return -1;
654
655                 /*
656                  * Some BIOSes claim RAM in the 640k - 1M region.
657                  * Not right. Fix it up.
658                  */
659                 if (type == E820_RAM) {
660                         if (start < 0x100000ULL && end > 0xA0000ULL) {
661                                 if (start < 0xA0000ULL)
662                                         add_memory_region(start, 0xA0000ULL-start, type);
663                                 if (end <= 0x100000ULL)
664                                         continue;
665                                 start = 0x100000ULL;
666                                 size = end - start;
667                         }
668                 }
669                 add_memory_region(start, size, type);
670         } while (biosmap++,--nr_map);
671         return 0;
672 }
673
674 #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
675 struct edd edd;
676 #ifdef CONFIG_EDD_MODULE
677 EXPORT_SYMBOL(edd);
678 #endif
679 /**
680  * copy_edd() - Copy the BIOS EDD information
681  *              from boot_params into a safe place.
682  *
683  */
684 static inline void copy_edd(void)
685 {
686      memcpy(edd.mbr_signature, EDD_MBR_SIGNATURE, sizeof(edd.mbr_signature));
687      memcpy(edd.edd_info, EDD_BUF, sizeof(edd.edd_info));
688      edd.mbr_signature_nr = EDD_MBR_SIG_NR;
689      edd.edd_info_nr = EDD_NR;
690 }
691 #else
692 static inline void copy_edd(void)
693 {
694 }
695 #endif
696
697 static int __initdata user_defined_memmap = 0;
698
699 /*
700  * "mem=nopentium" disables the 4MB page tables.
701  * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
702  * to <mem>, overriding the bios size.
703  * "memmap=XXX[KkmM]@XXX[KkmM]" defines a memory region from
704  * <start> to <start>+<mem>, overriding the bios size.
705  *
706  * HPA tells me bootloaders need to parse mem=, so no new
707  * option should be mem=  [also see Documentation/i386/boot.txt]
708  */
709 static int __init parse_mem(char *arg)
710 {
711         if (!arg)
712                 return -EINVAL;
713
714         if (strcmp(arg, "nopentium") == 0) {
715                 clear_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability);
716                 disable_pse = 1;
717         } else {
718                 /* If the user specifies memory size, we
719                  * limit the BIOS-provided memory map to
720                  * that size. exactmap can be used to specify
721                  * the exact map. mem=number can be used to
722                  * trim the existing memory map.
723                  */
724                 unsigned long long mem_size;
725  
726                 mem_size = memparse(arg, &arg);
727                 limit_regions(mem_size);
728                 user_defined_memmap = 1;
729         }
730         return 0;
731 }
732 early_param("mem", parse_mem);
733
734 static int __init parse_memmap(char *arg)
735 {
736         if (!arg)
737                 return -EINVAL;
738
739         if (strcmp(arg, "exactmap") == 0) {
740 #ifdef CONFIG_CRASH_DUMP
741                 /* If we are doing a crash dump, we
742                  * still need to know the real mem
743                  * size before original memory map is
744                  * reset.
745                  */
746                 find_max_pfn();
747                 saved_max_pfn = max_pfn;
748 #endif
749                 e820.nr_map = 0;
750                 user_defined_memmap = 1;
751         } else {
752                 /* If the user specifies memory size, we
753                  * limit the BIOS-provided memory map to
754                  * that size. exactmap can be used to specify
755                  * the exact map. mem=number can be used to
756                  * trim the existing memory map.
757                  */
758                 unsigned long long start_at, mem_size;
759
760                 mem_size = memparse(arg, &arg);
761                 if (*arg == '@') {
762                         start_at = memparse(arg+1, &arg);
763                         add_memory_region(start_at, mem_size, E820_RAM);
764                 } else if (*arg == '#') {
765                         start_at = memparse(arg+1, &arg);
766                         add_memory_region(start_at, mem_size, E820_ACPI);
767                 } else if (*arg == '$') {
768                         start_at = memparse(arg+1, &arg);
769                         add_memory_region(start_at, mem_size, E820_RESERVED);
770                 } else {
771                         limit_regions(mem_size);
772                         user_defined_memmap = 1;
773                 }
774         }
775         return 0;
776 }
777 early_param("memmap", parse_memmap);
778
779 #ifdef CONFIG_PROC_VMCORE
780 /* elfcorehdr= specifies the location of elf core header
781  * stored by the crashed kernel.
782  */
783 static int __init parse_elfcorehdr(char *arg)
784 {
785         if (!arg)
786                 return -EINVAL;
787
788         elfcorehdr_addr = memparse(arg, &arg);
789         return 0;
790 }
791 early_param("elfcorehdr", parse_elfcorehdr);
792 #endif /* CONFIG_PROC_VMCORE */
793
794 /*
795  * highmem=size forces highmem to be exactly 'size' bytes.
796  * This works even on boxes that have no highmem otherwise.
797  * This also works to reduce highmem size on bigger boxes.
798  */
799 static int __init parse_highmem(char *arg)
800 {
801         if (!arg)
802                 return -EINVAL;
803
804         highmem_pages = memparse(arg, &arg) >> PAGE_SHIFT;
805         return 0;
806 }
807 early_param("highmem", parse_highmem);
808
809 /*
810  * vmalloc=size forces the vmalloc area to be exactly 'size'
811  * bytes. This can be used to increase (or decrease) the
812  * vmalloc area - the default is 128m.
813  */
814 static int __init parse_vmalloc(char *arg)
815 {
816         if (!arg)
817                 return -EINVAL;
818
819         __VMALLOC_RESERVE = memparse(arg, &arg);
820         return 0;
821 }
822 early_param("vmalloc", parse_vmalloc);
823
824 /*
825  * Callback for efi_memory_walk.
826  */
827 static int __init
828 efi_find_max_pfn(unsigned long start, unsigned long end, void *arg)
829 {
830         unsigned long *max_pfn = arg, pfn;
831
832         if (start < end) {
833                 pfn = PFN_UP(end -1);
834                 if (pfn > *max_pfn)
835                         *max_pfn = pfn;
836         }
837         return 0;
838 }
839
840 static int __init
841 efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
842 {
843         memory_present(0, start, end);
844         return 0;
845 }
846
847  /*
848   * This function checks if the entire range <start,end> is mapped with type.
849   *
850   * Note: this function only works correct if the e820 table is sorted and
851   * not-overlapping, which is the case
852   */
853 int __init
854 e820_all_mapped(unsigned long s, unsigned long e, unsigned type)
855 {
856         u64 start = s;
857         u64 end = e;
858         int i;
859         for (i = 0; i < e820.nr_map; i++) {
860                 struct e820entry *ei = &e820.map[i];
861                 if (type && ei->type != type)
862                         continue;
863                 /* is the region (part) in overlap with the current region ?*/
864                 if (ei->addr >= end || ei->addr + ei->size <= start)
865                         continue;
866                 /* if the region is at the beginning of <start,end> we move
867                  * start to the end of the region since it's ok until there
868                  */
869                 if (ei->addr <= start)
870                         start = ei->addr + ei->size;
871                 /* if start is now at or beyond end, we're done, full
872                  * coverage */
873                 if (start >= end)
874                         return 1; /* we're done */
875         }
876         return 0;
877 }
878
879 /*
880  * Find the highest page frame number we have available
881  */
882 void __init find_max_pfn(void)
883 {
884         int i;
885
886         max_pfn = 0;
887         if (efi_enabled) {
888                 efi_memmap_walk(efi_find_max_pfn, &max_pfn);
889                 efi_memmap_walk(efi_memory_present_wrapper, NULL);
890                 return;
891         }
892
893         for (i = 0; i < e820.nr_map; i++) {
894                 unsigned long start, end;
895                 /* RAM? */
896                 if (e820.map[i].type != E820_RAM)
897                         continue;
898                 start = PFN_UP(e820.map[i].addr);
899                 end = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
900                 if (start >= end)
901                         continue;
902                 if (end > max_pfn)
903                         max_pfn = end;
904                 memory_present(0, start, end);
905         }
906 }
907
908 /*
909  * Determine low and high memory ranges:
910  */
911 unsigned long __init find_max_low_pfn(void)
912 {
913         unsigned long max_low_pfn;
914
915         max_low_pfn = max_pfn;
916         if (max_low_pfn > MAXMEM_PFN) {
917                 if (highmem_pages == -1)
918                         highmem_pages = max_pfn - MAXMEM_PFN;
919                 if (highmem_pages + MAXMEM_PFN < max_pfn)
920                         max_pfn = MAXMEM_PFN + highmem_pages;
921                 if (highmem_pages + MAXMEM_PFN > max_pfn) {
922                         printk("only %luMB highmem pages available, ignoring highmem size of %uMB.\n", pages_to_mb(max_pfn - MAXMEM_PFN), pages_to_mb(highmem_pages));
923                         highmem_pages = 0;
924                 }
925                 max_low_pfn = MAXMEM_PFN;
926 #ifndef CONFIG_HIGHMEM
927                 /* Maximum memory usable is what is directly addressable */
928                 printk(KERN_WARNING "Warning only %ldMB will be used.\n",
929                                         MAXMEM>>20);
930                 if (max_pfn > MAX_NONPAE_PFN)
931                         printk(KERN_WARNING "Use a PAE enabled kernel.\n");
932                 else
933                         printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n");
934                 max_pfn = MAXMEM_PFN;
935 #else /* !CONFIG_HIGHMEM */
936 #ifndef CONFIG_X86_PAE
937                 if (max_pfn > MAX_NONPAE_PFN) {
938                         max_pfn = MAX_NONPAE_PFN;
939                         printk(KERN_WARNING "Warning only 4GB will be used.\n");
940                         printk(KERN_WARNING "Use a PAE enabled kernel.\n");
941                 }
942 #endif /* !CONFIG_X86_PAE */
943 #endif /* !CONFIG_HIGHMEM */
944         } else {
945                 if (highmem_pages == -1)
946                         highmem_pages = 0;
947 #ifdef CONFIG_HIGHMEM
948                 if (highmem_pages >= max_pfn) {
949                         printk(KERN_ERR "highmem size specified (%uMB) is bigger than pages available (%luMB)!.\n", pages_to_mb(highmem_pages), pages_to_mb(max_pfn));
950                         highmem_pages = 0;
951                 }
952                 if (highmem_pages) {
953                         if (max_low_pfn-highmem_pages < 64*1024*1024/PAGE_SIZE){
954                                 printk(KERN_ERR "highmem size %uMB results in smaller than 64MB lowmem, ignoring it.\n", pages_to_mb(highmem_pages));
955                                 highmem_pages = 0;
956                         }
957                         max_low_pfn -= highmem_pages;
958                 }
959 #else
960                 if (highmem_pages)
961                         printk(KERN_ERR "ignoring highmem size on non-highmem kernel!\n");
962 #endif
963         }
964         return max_low_pfn;
965 }
966
967 /*
968  * Free all available memory for boot time allocation.  Used
969  * as a callback function by efi_memory_walk()
970  */
971
972 static int __init
973 free_available_memory(unsigned long start, unsigned long end, void *arg)
974 {
975         /* check max_low_pfn */
976         if (start >= (max_low_pfn << PAGE_SHIFT))
977                 return 0;
978         if (end >= (max_low_pfn << PAGE_SHIFT))
979                 end = max_low_pfn << PAGE_SHIFT;
980         if (start < end)
981                 free_bootmem(start, end - start);
982
983         return 0;
984 }
985 /*
986  * Register fully available low RAM pages with the bootmem allocator.
987  */
988 static void __init register_bootmem_low_pages(unsigned long max_low_pfn)
989 {
990         int i;
991
992         if (efi_enabled) {
993                 efi_memmap_walk(free_available_memory, NULL);
994                 return;
995         }
996         for (i = 0; i < e820.nr_map; i++) {
997                 unsigned long curr_pfn, last_pfn, size;
998                 /*
999                  * Reserve usable low memory
1000                  */
1001                 if (e820.map[i].type != E820_RAM)
1002                         continue;
1003                 /*
1004                  * We are rounding up the start address of usable memory:
1005                  */
1006                 curr_pfn = PFN_UP(e820.map[i].addr);
1007                 if (curr_pfn >= max_low_pfn)
1008                         continue;
1009                 /*
1010                  * ... and at the end of the usable range downwards:
1011                  */
1012                 last_pfn = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
1013
1014                 if (last_pfn > max_low_pfn)
1015                         last_pfn = max_low_pfn;
1016
1017                 /*
1018                  * .. finally, did all the rounding and playing
1019                  * around just make the area go away?
1020                  */
1021                 if (last_pfn <= curr_pfn)
1022                         continue;
1023
1024                 size = last_pfn - curr_pfn;
1025                 free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size));
1026         }
1027 }
1028
1029 /*
1030  * workaround for Dell systems that neglect to reserve EBDA
1031  */
1032 static void __init reserve_ebda_region(void)
1033 {
1034         unsigned int addr;
1035         addr = get_bios_ebda();
1036         if (addr)
1037                 reserve_bootmem(addr, PAGE_SIZE);       
1038 }
1039
1040 #ifndef CONFIG_NEED_MULTIPLE_NODES
1041 void __init setup_bootmem_allocator(void);
1042 static unsigned long __init setup_memory(void)
1043 {
1044         /*
1045          * partially used pages are not usable - thus
1046          * we are rounding upwards:
1047          */
1048         min_low_pfn = PFN_UP(init_pg_tables_end);
1049
1050         find_max_pfn();
1051
1052         max_low_pfn = find_max_low_pfn();
1053
1054 #ifdef CONFIG_HIGHMEM
1055         highstart_pfn = highend_pfn = max_pfn;
1056         if (max_pfn > max_low_pfn) {
1057                 highstart_pfn = max_low_pfn;
1058         }
1059         printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
1060                 pages_to_mb(highend_pfn - highstart_pfn));
1061         num_physpages = highend_pfn;
1062         high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1;
1063 #else
1064         num_physpages = max_low_pfn;
1065         high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1;
1066 #endif
1067 #ifdef CONFIG_FLATMEM
1068         max_mapnr = num_physpages;
1069 #endif
1070         printk(KERN_NOTICE "%ldMB LOWMEM available.\n",
1071                         pages_to_mb(max_low_pfn));
1072
1073         setup_bootmem_allocator();
1074
1075         return max_low_pfn;
1076 }
1077
1078 void __init zone_sizes_init(void)
1079 {
1080         unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
1081         unsigned int max_dma, low;
1082
1083         max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
1084         low = max_low_pfn;
1085
1086         if (low < max_dma)
1087                 zones_size[ZONE_DMA] = low;
1088         else {
1089                 zones_size[ZONE_DMA] = max_dma;
1090                 zones_size[ZONE_NORMAL] = low - max_dma;
1091 #ifdef CONFIG_HIGHMEM
1092                 zones_size[ZONE_HIGHMEM] = highend_pfn - low;
1093 #endif
1094         }
1095         free_area_init(zones_size);
1096 }
1097 #else
1098 extern unsigned long __init setup_memory(void);
1099 extern void zone_sizes_init(void);
1100 #endif /* !CONFIG_NEED_MULTIPLE_NODES */
1101
1102 void __init setup_bootmem_allocator(void)
1103 {
1104         unsigned long bootmap_size;
1105         /*
1106          * Initialize the boot-time allocator (with low memory only):
1107          */
1108         bootmap_size = init_bootmem(min_low_pfn, max_low_pfn);
1109
1110         register_bootmem_low_pages(max_low_pfn);
1111
1112         /*
1113          * Reserve the bootmem bitmap itself as well. We do this in two
1114          * steps (first step was init_bootmem()) because this catches
1115          * the (very unlikely) case of us accidentally initializing the
1116          * bootmem allocator with an invalid RAM area.
1117          */
1118         reserve_bootmem(__PHYSICAL_START, (PFN_PHYS(min_low_pfn) +
1119                          bootmap_size + PAGE_SIZE-1) - (__PHYSICAL_START));
1120
1121         /*
1122          * reserve physical page 0 - it's a special BIOS page on many boxes,
1123          * enabling clean reboots, SMP operation, laptop functions.
1124          */
1125         reserve_bootmem(0, PAGE_SIZE);
1126
1127         /* reserve EBDA region, it's a 4K region */
1128         reserve_ebda_region();
1129
1130     /* could be an AMD 768MPX chipset. Reserve a page  before VGA to prevent
1131        PCI prefetch into it (errata #56). Usually the page is reserved anyways,
1132        unless you have no PS/2 mouse plugged in. */
1133         if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
1134             boot_cpu_data.x86 == 6)
1135              reserve_bootmem(0xa0000 - 4096, 4096);
1136
1137 #ifdef CONFIG_SMP
1138         /*
1139          * But first pinch a few for the stack/trampoline stuff
1140          * FIXME: Don't need the extra page at 4K, but need to fix
1141          * trampoline before removing it. (see the GDT stuff)
1142          */
1143         reserve_bootmem(PAGE_SIZE, PAGE_SIZE);
1144 #endif
1145 #ifdef CONFIG_ACPI_SLEEP
1146         /*
1147          * Reserve low memory region for sleep support.
1148          */
1149         acpi_reserve_bootmem();
1150 #endif
1151 #ifdef CONFIG_X86_FIND_SMP_CONFIG
1152         /*
1153          * Find and reserve possible boot-time SMP configuration:
1154          */
1155         find_smp_config();
1156 #endif
1157
1158 #ifdef CONFIG_BLK_DEV_INITRD
1159         if (LOADER_TYPE && INITRD_START) {
1160                 if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
1161                         reserve_bootmem(INITRD_START, INITRD_SIZE);
1162                         initrd_start =
1163                                 INITRD_START ? INITRD_START + PAGE_OFFSET : 0;
1164                         initrd_end = initrd_start+INITRD_SIZE;
1165                 }
1166                 else {
1167                         printk(KERN_ERR "initrd extends beyond end of memory "
1168                             "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
1169                             INITRD_START + INITRD_SIZE,
1170                             max_low_pfn << PAGE_SHIFT);
1171                         initrd_start = 0;
1172                 }
1173         }
1174 #endif
1175 #ifdef CONFIG_KEXEC
1176         if (crashk_res.start != crashk_res.end)
1177                 reserve_bootmem(crashk_res.start,
1178                         crashk_res.end - crashk_res.start + 1);
1179 #endif
1180 }
1181
1182 /*
1183  * The node 0 pgdat is initialized before all of these because
1184  * it's needed for bootmem.  node>0 pgdats have their virtual
1185  * space allocated before the pagetables are in place to access
1186  * them, so they can't be cleared then.
1187  *
1188  * This should all compile down to nothing when NUMA is off.
1189  */
1190 void __init remapped_pgdat_init(void)
1191 {
1192         int nid;
1193
1194         for_each_online_node(nid) {
1195                 if (nid != 0)
1196                         memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
1197         }
1198 }
1199
1200 /*
1201  * Request address space for all standard RAM and ROM resources
1202  * and also for regions reported as reserved by the e820.
1203  */
1204 static void __init
1205 legacy_init_iomem_resources(struct resource *code_resource, struct resource *data_resource)
1206 {
1207         int i;
1208
1209         probe_roms();
1210         for (i = 0; i < e820.nr_map; i++) {
1211                 struct resource *res;
1212 #ifndef CONFIG_RESOURCES_64BIT
1213                 if (e820.map[i].addr + e820.map[i].size > 0x100000000ULL)
1214                         continue;
1215 #endif
1216                 res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
1217                 switch (e820.map[i].type) {
1218                 case E820_RAM:  res->name = "System RAM"; break;
1219                 case E820_ACPI: res->name = "ACPI Tables"; break;
1220                 case E820_NVS:  res->name = "ACPI Non-volatile Storage"; break;
1221                 default:        res->name = "reserved";
1222                 }
1223                 res->start = e820.map[i].addr;
1224                 res->end = res->start + e820.map[i].size - 1;
1225                 res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
1226                 if (request_resource(&iomem_resource, res)) {
1227                         kfree(res);
1228                         continue;
1229                 }
1230                 if (e820.map[i].type == E820_RAM) {
1231                         /*
1232                          *  We don't know which RAM region contains kernel data,
1233                          *  so we try it repeatedly and let the resource manager
1234                          *  test it.
1235                          */
1236                         request_resource(res, code_resource);
1237                         request_resource(res, data_resource);
1238 #ifdef CONFIG_KEXEC
1239                         request_resource(res, &crashk_res);
1240 #endif
1241                 }
1242         }
1243 }
1244
1245 /*
1246  * Request address space for all standard resources
1247  *
1248  * This is called just before pcibios_init(), which is also a
1249  * subsys_initcall, but is linked in later (in arch/i386/pci/common.c).
1250  */
1251 static int __init request_standard_resources(void)
1252 {
1253         int i;
1254
1255         printk("Setting up standard PCI resources\n");
1256         if (efi_enabled)
1257                 efi_initialize_iomem_resources(&code_resource, &data_resource);
1258         else
1259                 legacy_init_iomem_resources(&code_resource, &data_resource);
1260
1261         /* EFI systems may still have VGA */
1262         request_resource(&iomem_resource, &video_ram_resource);
1263
1264         /* request I/O space for devices used on all i[345]86 PCs */
1265         for (i = 0; i < STANDARD_IO_RESOURCES; i++)
1266                 request_resource(&ioport_resource, &standard_io_resources[i]);
1267         return 0;
1268 }
1269
1270 subsys_initcall(request_standard_resources);
1271
1272 static void __init register_memory(void)
1273 {
1274         unsigned long gapstart, gapsize, round;
1275         unsigned long long last;
1276         int i;
1277
1278         /*
1279          * Search for the bigest gap in the low 32 bits of the e820
1280          * memory space.
1281          */
1282         last = 0x100000000ull;
1283         gapstart = 0x10000000;
1284         gapsize = 0x400000;
1285         i = e820.nr_map;
1286         while (--i >= 0) {
1287                 unsigned long long start = e820.map[i].addr;
1288                 unsigned long long end = start + e820.map[i].size;
1289
1290                 /*
1291                  * Since "last" is at most 4GB, we know we'll
1292                  * fit in 32 bits if this condition is true
1293                  */
1294                 if (last > end) {
1295                         unsigned long gap = last - end;
1296
1297                         if (gap > gapsize) {
1298                                 gapsize = gap;
1299                                 gapstart = end;
1300                         }
1301                 }
1302                 if (start < last)
1303                         last = start;
1304         }
1305
1306         /*
1307          * See how much we want to round up: start off with
1308          * rounding to the next 1MB area.
1309          */
1310         round = 0x100000;
1311         while ((gapsize >> 4) > round)
1312                 round += round;
1313         /* Fun with two's complement */
1314         pci_mem_start = (gapstart + round) & -round;
1315
1316         printk("Allocating PCI resources starting at %08lx (gap: %08lx:%08lx)\n",
1317                 pci_mem_start, gapstart, gapsize);
1318 }
1319
1320 #ifdef CONFIG_MCA
1321 static void set_mca_bus(int x)
1322 {
1323         MCA_bus = x;
1324 }
1325 #else
1326 static void set_mca_bus(int x) { }
1327 #endif
1328
1329 /*
1330  * Determine if we were loaded by an EFI loader.  If so, then we have also been
1331  * passed the efi memmap, systab, etc., so we should use these data structures
1332  * for initialization.  Note, the efi init code path is determined by the
1333  * global efi_enabled. This allows the same kernel image to be used on existing
1334  * systems (with a traditional BIOS) as well as on EFI systems.
1335  */
1336 void __init setup_arch(char **cmdline_p)
1337 {
1338         unsigned long max_low_pfn;
1339
1340         memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
1341         pre_setup_arch_hook();
1342         early_cpu_init();
1343
1344         /*
1345          * FIXME: This isn't an official loader_type right
1346          * now but does currently work with elilo.
1347          * If we were configured as an EFI kernel, check to make
1348          * sure that we were loaded correctly from elilo and that
1349          * the system table is valid.  If not, then initialize normally.
1350          */
1351 #ifdef CONFIG_EFI
1352         if ((LOADER_TYPE == 0x50) && EFI_SYSTAB)
1353                 efi_enabled = 1;
1354 #endif
1355
1356         ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
1357         drive_info = DRIVE_INFO;
1358         screen_info = SCREEN_INFO;
1359         edid_info = EDID_INFO;
1360         apm_info.bios = APM_BIOS_INFO;
1361         ist_info = IST_INFO;
1362         saved_videomode = VIDEO_MODE;
1363         if( SYS_DESC_TABLE.length != 0 ) {
1364                 set_mca_bus(SYS_DESC_TABLE.table[3] & 0x2);
1365                 machine_id = SYS_DESC_TABLE.table[0];
1366                 machine_submodel_id = SYS_DESC_TABLE.table[1];
1367                 BIOS_revision = SYS_DESC_TABLE.table[2];
1368         }
1369         bootloader_type = LOADER_TYPE;
1370
1371 #ifdef CONFIG_BLK_DEV_RAM
1372         rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
1373         rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
1374         rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
1375 #endif
1376         ARCH_SETUP
1377         if (efi_enabled)
1378                 efi_init();
1379         else {
1380                 printk(KERN_INFO "BIOS-provided physical RAM map:\n");
1381                 print_memory_map(machine_specific_memory_setup());
1382         }
1383
1384         copy_edd();
1385
1386         if (!MOUNT_ROOT_RDONLY)
1387                 root_mountflags &= ~MS_RDONLY;
1388         init_mm.start_code = (unsigned long) _text;
1389         init_mm.end_code = (unsigned long) _etext;
1390         init_mm.end_data = (unsigned long) _edata;
1391         init_mm.brk = init_pg_tables_end + PAGE_OFFSET;
1392
1393         code_resource.start = virt_to_phys(_text);
1394         code_resource.end = virt_to_phys(_etext)-1;
1395         data_resource.start = virt_to_phys(_etext);
1396         data_resource.end = virt_to_phys(_edata)-1;
1397
1398         parse_early_param();
1399
1400         if (user_defined_memmap) {
1401                 printk(KERN_INFO "user-defined physical RAM map:\n");
1402                 print_memory_map("user");
1403         }
1404
1405         strlcpy(command_line, saved_command_line, COMMAND_LINE_SIZE);
1406         *cmdline_p = command_line;
1407
1408         max_low_pfn = setup_memory();
1409
1410         /*
1411          * NOTE: before this point _nobody_ is allowed to allocate
1412          * any memory using the bootmem allocator.  Although the
1413          * alloctor is now initialised only the first 8Mb of the kernel
1414          * virtual address space has been mapped.  All allocations before
1415          * paging_init() has completed must use the alloc_bootmem_low_pages()
1416          * variant (which allocates DMA'able memory) and care must be taken
1417          * not to exceed the 8Mb limit.
1418          */
1419
1420 #ifdef CONFIG_SMP
1421         smp_alloc_memory(); /* AP processor realmode stacks in low memory*/
1422 #endif
1423         paging_init();
1424         remapped_pgdat_init();
1425         sparse_init();
1426         zone_sizes_init();
1427
1428         /*
1429          * NOTE: at this point the bootmem allocator is fully available.
1430          */
1431
1432         dmi_scan_machine();
1433
1434 #ifdef CONFIG_X86_GENERICARCH
1435         generic_apic_probe();
1436 #endif  
1437         if (efi_enabled)
1438                 efi_map_memmap();
1439
1440 #ifdef CONFIG_ACPI
1441         /*
1442          * Parse the ACPI tables for possible boot-time SMP configuration.
1443          */
1444         acpi_boot_table_init();
1445 #endif
1446
1447 #ifdef CONFIG_X86_IO_APIC
1448         check_acpi_pci();       /* Checks more than just ACPI actually */
1449 #endif
1450
1451 #ifdef CONFIG_ACPI
1452         acpi_boot_init();
1453
1454 #if defined(CONFIG_SMP) && defined(CONFIG_X86_PC)
1455         if (def_to_bigsmp)
1456                 printk(KERN_WARNING "More than 8 CPUs detected and "
1457                         "CONFIG_X86_PC cannot handle it.\nUse "
1458                         "CONFIG_X86_GENERICARCH or CONFIG_X86_BIGSMP.\n");
1459 #endif
1460 #endif
1461 #ifdef CONFIG_X86_LOCAL_APIC
1462         if (smp_found_config)
1463                 get_smp_config();
1464 #endif
1465
1466         register_memory();
1467
1468 #ifdef CONFIG_VT
1469 #if defined(CONFIG_VGA_CONSOLE)
1470         if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
1471                 conswitchp = &vga_con;
1472 #elif defined(CONFIG_DUMMY_CONSOLE)
1473         conswitchp = &dummy_con;
1474 #endif
1475 #endif
1476         tsc_init();
1477 }
1478
1479 static __init int add_pcspkr(void)
1480 {
1481         struct platform_device *pd;
1482         int ret;
1483
1484         pd = platform_device_alloc("pcspkr", -1);
1485         if (!pd)
1486                 return -ENOMEM;
1487
1488         ret = platform_device_add(pd);
1489         if (ret)
1490                 platform_device_put(pd);
1491
1492         return ret;
1493 }
1494 device_initcall(add_pcspkr);
1495
1496 /*
1497  * Local Variables:
1498  * mode:c
1499  * c-file-style:"k&r"
1500  * c-basic-offset:8
1501  * End:
1502  */