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