[PATCH] drive_info removal outside of arch/i386
[linux-2.6.git] / arch / x86_64 / kernel / setup.c
1 /*
2  *  linux/arch/x86-64/kernel/setup.c
3  *
4  *  Copyright (C) 1995  Linus Torvalds
5  *
6  *  Nov 2001 Dave Jones <davej@suse.de>
7  *  Forked from i386 setup code.
8  *
9  *  $Id$
10  */
11
12 /*
13  * This file handles the architecture-dependent parts of initialization
14  */
15
16 #include <linux/errno.h>
17 #include <linux/sched.h>
18 #include <linux/kernel.h>
19 #include <linux/mm.h>
20 #include <linux/stddef.h>
21 #include <linux/unistd.h>
22 #include <linux/ptrace.h>
23 #include <linux/slab.h>
24 #include <linux/user.h>
25 #include <linux/a.out.h>
26 #include <linux/tty.h>
27 #include <linux/ioport.h>
28 #include <linux/delay.h>
29 #include <linux/config.h>
30 #include <linux/init.h>
31 #include <linux/initrd.h>
32 #include <linux/highmem.h>
33 #include <linux/bootmem.h>
34 #include <linux/module.h>
35 #include <asm/processor.h>
36 #include <linux/console.h>
37 #include <linux/seq_file.h>
38 #include <linux/crash_dump.h>
39 #include <linux/root_dev.h>
40 #include <linux/pci.h>
41 #include <linux/acpi.h>
42 #include <linux/kallsyms.h>
43 #include <linux/edd.h>
44 #include <linux/mmzone.h>
45 #include <linux/kexec.h>
46 #include <linux/cpufreq.h>
47 #include <linux/dmi.h>
48 #include <linux/dma-mapping.h>
49
50 #include <asm/mtrr.h>
51 #include <asm/uaccess.h>
52 #include <asm/system.h>
53 #include <asm/io.h>
54 #include <asm/smp.h>
55 #include <asm/msr.h>
56 #include <asm/desc.h>
57 #include <video/edid.h>
58 #include <asm/e820.h>
59 #include <asm/dma.h>
60 #include <asm/mpspec.h>
61 #include <asm/mmu_context.h>
62 #include <asm/bootsetup.h>
63 #include <asm/proto.h>
64 #include <asm/setup.h>
65 #include <asm/mach_apic.h>
66 #include <asm/numa.h>
67 #include <asm/swiotlb.h>
68 #include <asm/sections.h>
69 #include <asm/gart-mapping.h>
70
71 /*
72  * Machine setup..
73  */
74
75 struct cpuinfo_x86 boot_cpu_data __read_mostly;
76
77 unsigned long mmu_cr4_features;
78
79 int acpi_disabled;
80 EXPORT_SYMBOL(acpi_disabled);
81 #ifdef  CONFIG_ACPI
82 extern int __initdata acpi_ht;
83 extern acpi_interrupt_flags     acpi_sci_flags;
84 int __initdata acpi_force = 0;
85 #endif
86
87 int acpi_numa __initdata;
88
89 /* Boot loader ID as an integer, for the benefit of proc_dointvec */
90 int bootloader_type;
91
92 unsigned long saved_video_mode;
93
94 /*
95  * Setup options
96  */
97 struct screen_info screen_info;
98 struct sys_desc_table_struct {
99         unsigned short length;
100         unsigned char table[0];
101 };
102
103 struct edid_info edid_info;
104 struct e820map e820;
105
106 extern int root_mountflags;
107
108 char command_line[COMMAND_LINE_SIZE];
109
110 struct resource standard_io_resources[] = {
111         { .name = "dma1", .start = 0x00, .end = 0x1f,
112                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
113         { .name = "pic1", .start = 0x20, .end = 0x21,
114                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
115         { .name = "timer0", .start = 0x40, .end = 0x43,
116                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
117         { .name = "timer1", .start = 0x50, .end = 0x53,
118                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
119         { .name = "keyboard", .start = 0x60, .end = 0x6f,
120                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
121         { .name = "dma page reg", .start = 0x80, .end = 0x8f,
122                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
123         { .name = "pic2", .start = 0xa0, .end = 0xa1,
124                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
125         { .name = "dma2", .start = 0xc0, .end = 0xdf,
126                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
127         { .name = "fpu", .start = 0xf0, .end = 0xff,
128                 .flags = IORESOURCE_BUSY | IORESOURCE_IO }
129 };
130
131 #define STANDARD_IO_RESOURCES \
132         (sizeof standard_io_resources / sizeof standard_io_resources[0])
133
134 #define IORESOURCE_RAM (IORESOURCE_BUSY | IORESOURCE_MEM)
135
136 struct resource data_resource = {
137         .name = "Kernel data",
138         .start = 0,
139         .end = 0,
140         .flags = IORESOURCE_RAM,
141 };
142 struct resource code_resource = {
143         .name = "Kernel code",
144         .start = 0,
145         .end = 0,
146         .flags = IORESOURCE_RAM,
147 };
148
149 #define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM)
150
151 static struct resource system_rom_resource = {
152         .name = "System ROM",
153         .start = 0xf0000,
154         .end = 0xfffff,
155         .flags = IORESOURCE_ROM,
156 };
157
158 static struct resource extension_rom_resource = {
159         .name = "Extension ROM",
160         .start = 0xe0000,
161         .end = 0xeffff,
162         .flags = IORESOURCE_ROM,
163 };
164
165 static struct resource adapter_rom_resources[] = {
166         { .name = "Adapter ROM", .start = 0xc8000, .end = 0,
167                 .flags = IORESOURCE_ROM },
168         { .name = "Adapter ROM", .start = 0, .end = 0,
169                 .flags = IORESOURCE_ROM },
170         { .name = "Adapter ROM", .start = 0, .end = 0,
171                 .flags = IORESOURCE_ROM },
172         { .name = "Adapter ROM", .start = 0, .end = 0,
173                 .flags = IORESOURCE_ROM },
174         { .name = "Adapter ROM", .start = 0, .end = 0,
175                 .flags = IORESOURCE_ROM },
176         { .name = "Adapter ROM", .start = 0, .end = 0,
177                 .flags = IORESOURCE_ROM }
178 };
179
180 #define ADAPTER_ROM_RESOURCES \
181         (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
182
183 static struct resource video_rom_resource = {
184         .name = "Video ROM",
185         .start = 0xc0000,
186         .end = 0xc7fff,
187         .flags = IORESOURCE_ROM,
188 };
189
190 static struct resource video_ram_resource = {
191         .name = "Video RAM area",
192         .start = 0xa0000,
193         .end = 0xbffff,
194         .flags = IORESOURCE_RAM,
195 };
196
197 #define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
198
199 static int __init romchecksum(unsigned char *rom, unsigned long length)
200 {
201         unsigned char *p, sum = 0;
202
203         for (p = rom; p < rom + length; p++)
204                 sum += *p;
205         return sum == 0;
206 }
207
208 static void __init probe_roms(void)
209 {
210         unsigned long start, length, upper;
211         unsigned char *rom;
212         int           i;
213
214         /* video rom */
215         upper = adapter_rom_resources[0].start;
216         for (start = video_rom_resource.start; start < upper; start += 2048) {
217                 rom = isa_bus_to_virt(start);
218                 if (!romsignature(rom))
219                         continue;
220
221                 video_rom_resource.start = start;
222
223                 /* 0 < length <= 0x7f * 512, historically */
224                 length = rom[2] * 512;
225
226                 /* if checksum okay, trust length byte */
227                 if (length && romchecksum(rom, length))
228                         video_rom_resource.end = start + length - 1;
229
230                 request_resource(&iomem_resource, &video_rom_resource);
231                 break;
232                         }
233
234         start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
235         if (start < upper)
236                 start = upper;
237
238         /* system rom */
239         request_resource(&iomem_resource, &system_rom_resource);
240         upper = system_rom_resource.start;
241
242         /* check for extension rom (ignore length byte!) */
243         rom = isa_bus_to_virt(extension_rom_resource.start);
244         if (romsignature(rom)) {
245                 length = extension_rom_resource.end - extension_rom_resource.start + 1;
246                 if (romchecksum(rom, length)) {
247                         request_resource(&iomem_resource, &extension_rom_resource);
248                         upper = extension_rom_resource.start;
249                 }
250         }
251
252         /* check for adapter roms on 2k boundaries */
253         for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) {
254                 rom = isa_bus_to_virt(start);
255                 if (!romsignature(rom))
256                         continue;
257
258                 /* 0 < length <= 0x7f * 512, historically */
259                 length = rom[2] * 512;
260
261                 /* but accept any length that fits if checksum okay */
262                 if (!length || start + length > upper || !romchecksum(rom, length))
263                         continue;
264
265                 adapter_rom_resources[i].start = start;
266                 adapter_rom_resources[i].end = start + length - 1;
267                 request_resource(&iomem_resource, &adapter_rom_resources[i]);
268
269                 start = adapter_rom_resources[i++].end & ~2047UL;
270         }
271 }
272
273 static __init void parse_cmdline_early (char ** cmdline_p)
274 {
275         char c = ' ', *to = command_line, *from = COMMAND_LINE;
276         int len = 0;
277         int userdef = 0;
278
279         for (;;) {
280                 if (c != ' ') 
281                         goto next_char; 
282
283 #ifdef  CONFIG_SMP
284                 /*
285                  * If the BIOS enumerates physical processors before logical,
286                  * maxcpus=N at enumeration-time can be used to disable HT.
287                  */
288                 else if (!memcmp(from, "maxcpus=", 8)) {
289                         extern unsigned int maxcpus;
290
291                         maxcpus = simple_strtoul(from + 8, NULL, 0);
292                 }
293 #endif
294 #ifdef CONFIG_ACPI
295                 /* "acpi=off" disables both ACPI table parsing and interpreter init */
296                 if (!memcmp(from, "acpi=off", 8))
297                         disable_acpi();
298
299                 if (!memcmp(from, "acpi=force", 10)) { 
300                         /* add later when we do DMI horrors: */
301                         acpi_force = 1;
302                         acpi_disabled = 0;
303                 }
304
305                 /* acpi=ht just means: do ACPI MADT parsing 
306                    at bootup, but don't enable the full ACPI interpreter */
307                 if (!memcmp(from, "acpi=ht", 7)) { 
308                         if (!acpi_force)
309                                 disable_acpi();
310                         acpi_ht = 1; 
311                 }
312                 else if (!memcmp(from, "pci=noacpi", 10)) 
313                         acpi_disable_pci();
314                 else if (!memcmp(from, "acpi=noirq", 10))
315                         acpi_noirq_set();
316
317                 else if (!memcmp(from, "acpi_sci=edge", 13))
318                         acpi_sci_flags.trigger =  1;
319                 else if (!memcmp(from, "acpi_sci=level", 14))
320                         acpi_sci_flags.trigger = 3;
321                 else if (!memcmp(from, "acpi_sci=high", 13))
322                         acpi_sci_flags.polarity = 1;
323                 else if (!memcmp(from, "acpi_sci=low", 12))
324                         acpi_sci_flags.polarity = 3;
325
326                 /* acpi=strict disables out-of-spec workarounds */
327                 else if (!memcmp(from, "acpi=strict", 11)) {
328                         acpi_strict = 1;
329                 }
330 #ifdef CONFIG_X86_IO_APIC
331                 else if (!memcmp(from, "acpi_skip_timer_override", 24))
332                         acpi_skip_timer_override = 1;
333 #endif
334 #endif
335
336                 if (!memcmp(from, "disable_timer_pin_1", 19))
337                         disable_timer_pin_1 = 1;
338                 if (!memcmp(from, "enable_timer_pin_1", 18))
339                         disable_timer_pin_1 = -1;
340
341                 if (!memcmp(from, "nolapic", 7) ||
342                     !memcmp(from, "disableapic", 11))
343                         disable_apic = 1;
344
345                 /* Don't confuse with noapictimer */
346                 if (!memcmp(from, "noapic", 6) &&
347                         (from[6] == ' ' || from[6] == 0))
348                         skip_ioapic_setup = 1;
349
350                 /* Make sure to not confuse with apic= */
351                 if (!memcmp(from, "apic", 4) &&
352                         (from[4] == ' ' || from[4] == 0)) {
353                         skip_ioapic_setup = 0;
354                         ioapic_force = 1;
355                 }
356                         
357                 if (!memcmp(from, "mem=", 4))
358                         parse_memopt(from+4, &from); 
359
360                 if (!memcmp(from, "memmap=", 7)) {
361                         /* exactmap option is for used defined memory */
362                         if (!memcmp(from+7, "exactmap", 8)) {
363 #ifdef CONFIG_CRASH_DUMP
364                                 /* If we are doing a crash dump, we
365                                  * still need to know the real mem
366                                  * size before original memory map is
367                                  * reset.
368                                  */
369                                 saved_max_pfn = e820_end_of_ram();
370 #endif
371                                 from += 8+7;
372                                 end_pfn_map = 0;
373                                 e820.nr_map = 0;
374                                 userdef = 1;
375                         }
376                         else {
377                                 parse_memmapopt(from+7, &from);
378                                 userdef = 1;
379                         }
380                 }
381
382 #ifdef CONFIG_NUMA
383                 if (!memcmp(from, "numa=", 5))
384                         numa_setup(from+5); 
385 #endif
386
387                 if (!memcmp(from,"iommu=",6)) { 
388                         iommu_setup(from+6); 
389                 }
390
391                 if (!memcmp(from,"oops=panic", 10))
392                         panic_on_oops = 1;
393
394                 if (!memcmp(from, "noexec=", 7))
395                         nonx_setup(from + 7);
396
397 #ifdef CONFIG_KEXEC
398                 /* crashkernel=size@addr specifies the location to reserve for
399                  * a crash kernel.  By reserving this memory we guarantee
400                  * that linux never set's it up as a DMA target.
401                  * Useful for holding code to do something appropriate
402                  * after a kernel panic.
403                  */
404                 else if (!memcmp(from, "crashkernel=", 12)) {
405                         unsigned long size, base;
406                         size = memparse(from+12, &from);
407                         if (*from == '@') {
408                                 base = memparse(from+1, &from);
409                                 /* FIXME: Do I want a sanity check
410                                  * to validate the memory range?
411                                  */
412                                 crashk_res.start = base;
413                                 crashk_res.end   = base + size - 1;
414                         }
415                 }
416 #endif
417
418 #ifdef CONFIG_PROC_VMCORE
419                 /* elfcorehdr= specifies the location of elf core header
420                  * stored by the crashed kernel. This option will be passed
421                  * by kexec loader to the capture kernel.
422                  */
423                 else if(!memcmp(from, "elfcorehdr=", 11))
424                         elfcorehdr_addr = memparse(from+11, &from);
425 #endif
426         next_char:
427                 c = *(from++);
428                 if (!c)
429                         break;
430                 if (COMMAND_LINE_SIZE <= ++len)
431                         break;
432                 *(to++) = c;
433         }
434         if (userdef) {
435                 printk(KERN_INFO "user-defined physical RAM map:\n");
436                 e820_print_map("user");
437         }
438         *to = '\0';
439         *cmdline_p = command_line;
440 }
441
442 #ifndef CONFIG_NUMA
443 static void __init
444 contig_initmem_init(unsigned long start_pfn, unsigned long end_pfn)
445 {
446         unsigned long bootmap_size, bootmap;
447
448         bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT;
449         bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size);
450         if (bootmap == -1L)
451                 panic("Cannot find bootmem map of size %ld\n",bootmap_size);
452         bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn);
453         e820_bootmem_free(NODE_DATA(0), 0, end_pfn << PAGE_SHIFT);
454         reserve_bootmem(bootmap, bootmap_size);
455
456 #endif
457
458 /* Use inline assembly to define this because the nops are defined 
459    as inline assembly strings in the include files and we cannot 
460    get them easily into strings. */
461 asm("\t.data\nk8nops: " 
462     K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6
463     K8_NOP7 K8_NOP8); 
464     
465 extern unsigned char k8nops[];
466 static unsigned char *k8_nops[ASM_NOP_MAX+1] = { 
467      NULL,
468      k8nops,
469      k8nops + 1,
470      k8nops + 1 + 2,
471      k8nops + 1 + 2 + 3,
472      k8nops + 1 + 2 + 3 + 4,
473      k8nops + 1 + 2 + 3 + 4 + 5,
474      k8nops + 1 + 2 + 3 + 4 + 5 + 6,
475      k8nops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
476 }; 
477
478 extern char __vsyscall_0;
479
480 /* Replace instructions with better alternatives for this CPU type.
481
482    This runs before SMP is initialized to avoid SMP problems with
483    self modifying code. This implies that assymetric systems where
484    APs have less capabilities than the boot processor are not handled. 
485    In this case boot with "noreplacement". */ 
486 void apply_alternatives(void *start, void *end) 
487
488         struct alt_instr *a; 
489         int diff, i, k;
490         for (a = start; (void *)a < end; a++) { 
491                 u8 *instr;
492
493                 if (!boot_cpu_has(a->cpuid))
494                         continue;
495
496                 BUG_ON(a->replacementlen > a->instrlen); 
497                 instr = a->instr;
498                 /* vsyscall code is not mapped yet. resolve it manually. */
499                 if (instr >= (u8 *)VSYSCALL_START && instr < (u8*)VSYSCALL_END)
500                         instr = __va(instr - (u8*)VSYSCALL_START + (u8*)__pa_symbol(&__vsyscall_0));
501                 __inline_memcpy(instr, a->replacement, a->replacementlen);
502                 diff = a->instrlen - a->replacementlen; 
503
504                 /* Pad the rest with nops */
505                 for (i = a->replacementlen; diff > 0; diff -= k, i += k) {
506                         k = diff;
507                         if (k > ASM_NOP_MAX)
508                                 k = ASM_NOP_MAX;
509                         __inline_memcpy(instr + i, k8_nops[k], k);
510                 } 
511         }
512
513
514 static int no_replacement __initdata = 0; 
515  
516 void __init alternative_instructions(void)
517 {
518         extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
519         if (no_replacement) 
520                 return;
521         apply_alternatives(__alt_instructions, __alt_instructions_end);
522 }
523
524 static int __init noreplacement_setup(char *s)
525
526      no_replacement = 1; 
527      return 0; 
528
529
530 __setup("noreplacement", noreplacement_setup); 
531
532 #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
533 struct edd edd;
534 #ifdef CONFIG_EDD_MODULE
535 EXPORT_SYMBOL(edd);
536 #endif
537 /**
538  * copy_edd() - Copy the BIOS EDD information
539  *              from boot_params into a safe place.
540  *
541  */
542 static inline void copy_edd(void)
543 {
544      memcpy(edd.mbr_signature, EDD_MBR_SIGNATURE, sizeof(edd.mbr_signature));
545      memcpy(edd.edd_info, EDD_BUF, sizeof(edd.edd_info));
546      edd.mbr_signature_nr = EDD_MBR_SIG_NR;
547      edd.edd_info_nr = EDD_NR;
548 }
549 #else
550 static inline void copy_edd(void)
551 {
552 }
553 #endif
554
555 #define EBDA_ADDR_POINTER 0x40E
556 static void __init reserve_ebda_region(void)
557 {
558         unsigned int addr;
559         /** 
560          * there is a real-mode segmented pointer pointing to the 
561          * 4K EBDA area at 0x40E
562          */
563         addr = *(unsigned short *)phys_to_virt(EBDA_ADDR_POINTER);
564         addr <<= 4;
565         if (addr)
566                 reserve_bootmem_generic(addr, PAGE_SIZE);
567 }
568
569 void __init setup_arch(char **cmdline_p)
570 {
571         unsigned long kernel_end;
572
573         ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
574         screen_info = SCREEN_INFO;
575         edid_info = EDID_INFO;
576         saved_video_mode = SAVED_VIDEO_MODE;
577         bootloader_type = LOADER_TYPE;
578
579 #ifdef CONFIG_BLK_DEV_RAM
580         rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
581         rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
582         rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
583 #endif
584         setup_memory_region();
585         copy_edd();
586
587         if (!MOUNT_ROOT_RDONLY)
588                 root_mountflags &= ~MS_RDONLY;
589         init_mm.start_code = (unsigned long) &_text;
590         init_mm.end_code = (unsigned long) &_etext;
591         init_mm.end_data = (unsigned long) &_edata;
592         init_mm.brk = (unsigned long) &_end;
593
594         code_resource.start = virt_to_phys(&_text);
595         code_resource.end = virt_to_phys(&_etext)-1;
596         data_resource.start = virt_to_phys(&_etext);
597         data_resource.end = virt_to_phys(&_edata)-1;
598
599         parse_cmdline_early(cmdline_p);
600
601         early_identify_cpu(&boot_cpu_data);
602
603         /*
604          * partially used pages are not usable - thus
605          * we are rounding upwards:
606          */
607         end_pfn = e820_end_of_ram();
608
609         check_efer();
610
611         init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT));
612
613         zap_low_mappings(0);
614
615 #ifdef CONFIG_ACPI
616         /*
617          * Initialize the ACPI boot-time table parser (gets the RSDP and SDT).
618          * Call this early for SRAT node setup.
619          */
620         acpi_boot_table_init();
621 #endif
622
623 #ifdef CONFIG_ACPI_NUMA
624         /*
625          * Parse SRAT to discover nodes.
626          */
627         acpi_numa_init();
628 #endif
629
630 #ifdef CONFIG_NUMA
631         numa_initmem_init(0, end_pfn); 
632 #else
633         contig_initmem_init(0, end_pfn);
634 #endif
635
636         /* Reserve direct mapping */
637         reserve_bootmem_generic(table_start << PAGE_SHIFT, 
638                                 (table_end - table_start) << PAGE_SHIFT);
639
640         /* reserve kernel */
641         kernel_end = round_up(__pa_symbol(&_end),PAGE_SIZE);
642         reserve_bootmem_generic(HIGH_MEMORY, kernel_end - HIGH_MEMORY);
643
644         /*
645          * reserve physical page 0 - it's a special BIOS page on many boxes,
646          * enabling clean reboots, SMP operation, laptop functions.
647          */
648         reserve_bootmem_generic(0, PAGE_SIZE);
649
650         /* reserve ebda region */
651         reserve_ebda_region();
652
653 #ifdef CONFIG_SMP
654         /*
655          * But first pinch a few for the stack/trampoline stuff
656          * FIXME: Don't need the extra page at 4K, but need to fix
657          * trampoline before removing it. (see the GDT stuff)
658          */
659         reserve_bootmem_generic(PAGE_SIZE, PAGE_SIZE);
660
661         /* Reserve SMP trampoline */
662         reserve_bootmem_generic(SMP_TRAMPOLINE_BASE, PAGE_SIZE);
663 #endif
664
665 #ifdef CONFIG_ACPI_SLEEP
666        /*
667         * Reserve low memory region for sleep support.
668         */
669        acpi_reserve_bootmem();
670 #endif
671 #ifdef CONFIG_X86_LOCAL_APIC
672         /*
673          * Find and reserve possible boot-time SMP configuration:
674          */
675         find_smp_config();
676 #endif
677 #ifdef CONFIG_BLK_DEV_INITRD
678         if (LOADER_TYPE && INITRD_START) {
679                 if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) {
680                         reserve_bootmem_generic(INITRD_START, INITRD_SIZE);
681                         initrd_start =
682                                 INITRD_START ? INITRD_START + PAGE_OFFSET : 0;
683                         initrd_end = initrd_start+INITRD_SIZE;
684                 }
685                 else {
686                         printk(KERN_ERR "initrd extends beyond end of memory "
687                             "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
688                             (unsigned long)(INITRD_START + INITRD_SIZE),
689                             (unsigned long)(end_pfn << PAGE_SHIFT));
690                         initrd_start = 0;
691                 }
692         }
693 #endif
694 #ifdef CONFIG_KEXEC
695         if (crashk_res.start != crashk_res.end) {
696                 reserve_bootmem(crashk_res.start,
697                         crashk_res.end - crashk_res.start + 1);
698         }
699 #endif
700
701         paging_init();
702
703         check_ioapic();
704
705 #ifdef CONFIG_ACPI
706         /*
707          * Read APIC and some other early information from ACPI tables.
708          */
709         acpi_boot_init();
710 #endif
711
712         init_cpu_to_node();
713
714 #ifdef CONFIG_X86_LOCAL_APIC
715         /*
716          * get boot-time SMP configuration:
717          */
718         if (smp_found_config)
719                 get_smp_config();
720         init_apic_mappings();
721 #endif
722
723         /*
724          * Request address space for all standard RAM and ROM resources
725          * and also for regions reported as reserved by the e820.
726          */
727         probe_roms();
728         e820_reserve_resources(); 
729
730         request_resource(&iomem_resource, &video_ram_resource);
731
732         {
733         unsigned i;
734         /* request I/O space for devices used on all i[345]86 PCs */
735         for (i = 0; i < STANDARD_IO_RESOURCES; i++)
736                 request_resource(&ioport_resource, &standard_io_resources[i]);
737         }
738
739         e820_setup_gap();
740
741 #ifdef CONFIG_GART_IOMMU
742         iommu_hole_init();
743 #endif
744
745 #ifdef CONFIG_VT
746 #if defined(CONFIG_VGA_CONSOLE)
747         conswitchp = &vga_con;
748 #elif defined(CONFIG_DUMMY_CONSOLE)
749         conswitchp = &dummy_con;
750 #endif
751 #endif
752 }
753
754 static int __cpuinit get_model_name(struct cpuinfo_x86 *c)
755 {
756         unsigned int *v;
757
758         if (c->extended_cpuid_level < 0x80000004)
759                 return 0;
760
761         v = (unsigned int *) c->x86_model_id;
762         cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
763         cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
764         cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
765         c->x86_model_id[48] = 0;
766         return 1;
767 }
768
769
770 static void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
771 {
772         unsigned int n, dummy, eax, ebx, ecx, edx;
773
774         n = c->extended_cpuid_level;
775
776         if (n >= 0x80000005) {
777                 cpuid(0x80000005, &dummy, &ebx, &ecx, &edx);
778                 printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
779                         edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
780                 c->x86_cache_size=(ecx>>24)+(edx>>24);
781                 /* On K8 L1 TLB is inclusive, so don't count it */
782                 c->x86_tlbsize = 0;
783         }
784
785         if (n >= 0x80000006) {
786                 cpuid(0x80000006, &dummy, &ebx, &ecx, &edx);
787                 ecx = cpuid_ecx(0x80000006);
788                 c->x86_cache_size = ecx >> 16;
789                 c->x86_tlbsize += ((ebx >> 16) & 0xfff) + (ebx & 0xfff);
790
791                 printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
792                 c->x86_cache_size, ecx & 0xFF);
793         }
794
795         if (n >= 0x80000007)
796                 cpuid(0x80000007, &dummy, &dummy, &dummy, &c->x86_power); 
797         if (n >= 0x80000008) {
798                 cpuid(0x80000008, &eax, &dummy, &dummy, &dummy); 
799                 c->x86_virt_bits = (eax >> 8) & 0xff;
800                 c->x86_phys_bits = eax & 0xff;
801         }
802 }
803
804 #ifdef CONFIG_NUMA
805 static int nearby_node(int apicid)
806 {
807         int i;
808         for (i = apicid - 1; i >= 0; i--) {
809                 int node = apicid_to_node[i];
810                 if (node != NUMA_NO_NODE && node_online(node))
811                         return node;
812         }
813         for (i = apicid + 1; i < MAX_LOCAL_APIC; i++) {
814                 int node = apicid_to_node[i];
815                 if (node != NUMA_NO_NODE && node_online(node))
816                         return node;
817         }
818         return first_node(node_online_map); /* Shouldn't happen */
819 }
820 #endif
821
822 /*
823  * On a AMD dual core setup the lower bits of the APIC id distingush the cores.
824  * Assumes number of cores is a power of two.
825  */
826 static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
827 {
828 #ifdef CONFIG_SMP
829         int cpu = smp_processor_id();
830         unsigned bits;
831 #ifdef CONFIG_NUMA
832         int node = 0;
833         unsigned apicid = phys_proc_id[cpu];
834 #endif
835
836         bits = 0;
837         while ((1 << bits) < c->x86_max_cores)
838                 bits++;
839
840         /* Low order bits define the core id (index of core in socket) */
841         cpu_core_id[cpu] = phys_proc_id[cpu] & ((1 << bits)-1);
842         /* Convert the APIC ID into the socket ID */
843         phys_proc_id[cpu] >>= bits;
844
845 #ifdef CONFIG_NUMA
846         node = phys_proc_id[cpu];
847         if (apicid_to_node[apicid] != NUMA_NO_NODE)
848                 node = apicid_to_node[apicid];
849         if (!node_online(node)) {
850                 /* Two possibilities here:
851                    - The CPU is missing memory and no node was created.
852                    In that case try picking one from a nearby CPU
853                    - The APIC IDs differ from the HyperTransport node IDs
854                    which the K8 northbridge parsing fills in.
855                    Assume they are all increased by a constant offset,
856                    but in the same order as the HT nodeids.
857                    If that doesn't result in a usable node fall back to the
858                    path for the previous case.  */
859                 int ht_nodeid = apicid - (phys_proc_id[0] << bits);
860                 if (ht_nodeid >= 0 &&
861                     apicid_to_node[ht_nodeid] != NUMA_NO_NODE)
862                         node = apicid_to_node[ht_nodeid];
863                 /* Pick a nearby node */
864                 if (!node_online(node))
865                         node = nearby_node(apicid);
866         }
867         numa_set_node(cpu, node);
868
869         printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n",
870                         cpu, c->x86_max_cores, node, cpu_core_id[cpu]);
871 #endif
872 #endif
873 }
874
875 static int __init init_amd(struct cpuinfo_x86 *c)
876 {
877         int r;
878         unsigned level;
879
880 #ifdef CONFIG_SMP
881         unsigned long value;
882
883         /*
884          * Disable TLB flush filter by setting HWCR.FFDIS on K8
885          * bit 6 of msr C001_0015
886          *
887          * Errata 63 for SH-B3 steppings
888          * Errata 122 for all steppings (F+ have it disabled by default)
889          */
890         if (c->x86 == 15) {
891                 rdmsrl(MSR_K8_HWCR, value);
892                 value |= 1 << 6;
893                 wrmsrl(MSR_K8_HWCR, value);
894         }
895 #endif
896
897         /* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
898            3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
899         clear_bit(0*32+31, &c->x86_capability);
900         
901         /* On C+ stepping K8 rep microcode works well for copy/memset */
902         level = cpuid_eax(1);
903         if (c->x86 == 15 && ((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58))
904                 set_bit(X86_FEATURE_REP_GOOD, &c->x86_capability);
905
906         r = get_model_name(c);
907         if (!r) { 
908                 switch (c->x86) { 
909                 case 15:
910                         /* Should distinguish Models here, but this is only
911                            a fallback anyways. */
912                         strcpy(c->x86_model_id, "Hammer");
913                         break; 
914                 } 
915         } 
916         display_cacheinfo(c);
917
918         /* c->x86_power is 8000_0007 edx. Bit 8 is constant TSC */
919         if (c->x86_power & (1<<8))
920                 set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
921
922         if (c->extended_cpuid_level >= 0x80000008) {
923                 c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
924                 if (c->x86_max_cores & (c->x86_max_cores - 1))
925                         c->x86_max_cores = 1;
926
927                 amd_detect_cmp(c);
928         }
929
930         return r;
931 }
932
933 static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
934 {
935 #ifdef CONFIG_SMP
936         u32     eax, ebx, ecx, edx;
937         int     index_msb, core_bits;
938         int     cpu = smp_processor_id();
939
940         cpuid(1, &eax, &ebx, &ecx, &edx);
941
942         c->apicid = phys_pkg_id(0);
943
944         if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
945                 return;
946
947         smp_num_siblings = (ebx & 0xff0000) >> 16;
948
949         if (smp_num_siblings == 1) {
950                 printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
951         } else if (smp_num_siblings > 1 ) {
952
953                 if (smp_num_siblings > NR_CPUS) {
954                         printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
955                         smp_num_siblings = 1;
956                         return;
957                 }
958
959                 index_msb = get_count_order(smp_num_siblings);
960                 phys_proc_id[cpu] = phys_pkg_id(index_msb);
961
962                 printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
963                        phys_proc_id[cpu]);
964
965                 smp_num_siblings = smp_num_siblings / c->x86_max_cores;
966
967                 index_msb = get_count_order(smp_num_siblings) ;
968
969                 core_bits = get_count_order(c->x86_max_cores);
970
971                 cpu_core_id[cpu] = phys_pkg_id(index_msb) &
972                                                ((1 << core_bits) - 1);
973
974                 if (c->x86_max_cores > 1)
975                         printk(KERN_INFO  "CPU: Processor Core ID: %d\n",
976                                cpu_core_id[cpu]);
977         }
978 #endif
979 }
980
981 /*
982  * find out the number of processor cores on the die
983  */
984 static int __cpuinit intel_num_cpu_cores(struct cpuinfo_x86 *c)
985 {
986         unsigned int eax;
987
988         if (c->cpuid_level < 4)
989                 return 1;
990
991         __asm__("cpuid"
992                 : "=a" (eax)
993                 : "0" (4), "c" (0)
994                 : "bx", "dx");
995
996         if (eax & 0x1f)
997                 return ((eax >> 26) + 1);
998         else
999                 return 1;
1000 }
1001
1002 static void srat_detect_node(void)
1003 {
1004 #ifdef CONFIG_NUMA
1005         unsigned node;
1006         int cpu = smp_processor_id();
1007
1008         /* Don't do the funky fallback heuristics the AMD version employs
1009            for now. */
1010         node = apicid_to_node[hard_smp_processor_id()];
1011         if (node == NUMA_NO_NODE)
1012                 node = 0;
1013         numa_set_node(cpu, node);
1014
1015         if (acpi_numa > 0)
1016                 printk(KERN_INFO "CPU %d -> Node %d\n", cpu, node);
1017 #endif
1018 }
1019
1020 static void __cpuinit init_intel(struct cpuinfo_x86 *c)
1021 {
1022         /* Cache sizes */
1023         unsigned n;
1024
1025         init_intel_cacheinfo(c);
1026         n = c->extended_cpuid_level;
1027         if (n >= 0x80000008) {
1028                 unsigned eax = cpuid_eax(0x80000008);
1029                 c->x86_virt_bits = (eax >> 8) & 0xff;
1030                 c->x86_phys_bits = eax & 0xff;
1031                 /* CPUID workaround for Intel 0F34 CPU */
1032                 if (c->x86_vendor == X86_VENDOR_INTEL &&
1033                     c->x86 == 0xF && c->x86_model == 0x3 &&
1034                     c->x86_mask == 0x4)
1035                         c->x86_phys_bits = 36;
1036         }
1037
1038         if (c->x86 == 15)
1039                 c->x86_cache_alignment = c->x86_clflush_size * 2;
1040         if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
1041             (c->x86 == 0x6 && c->x86_model >= 0x0e))
1042                 set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
1043         set_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
1044         c->x86_max_cores = intel_num_cpu_cores(c);
1045
1046         srat_detect_node();
1047 }
1048
1049 static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
1050 {
1051         char *v = c->x86_vendor_id;
1052
1053         if (!strcmp(v, "AuthenticAMD"))
1054                 c->x86_vendor = X86_VENDOR_AMD;
1055         else if (!strcmp(v, "GenuineIntel"))
1056                 c->x86_vendor = X86_VENDOR_INTEL;
1057         else
1058                 c->x86_vendor = X86_VENDOR_UNKNOWN;
1059 }
1060
1061 struct cpu_model_info {
1062         int vendor;
1063         int family;
1064         char *model_names[16];
1065 };
1066
1067 /* Do some early cpuid on the boot CPU to get some parameter that are
1068    needed before check_bugs. Everything advanced is in identify_cpu
1069    below. */
1070 void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
1071 {
1072         u32 tfms;
1073
1074         c->loops_per_jiffy = loops_per_jiffy;
1075         c->x86_cache_size = -1;
1076         c->x86_vendor = X86_VENDOR_UNKNOWN;
1077         c->x86_model = c->x86_mask = 0; /* So far unknown... */
1078         c->x86_vendor_id[0] = '\0'; /* Unset */
1079         c->x86_model_id[0] = '\0';  /* Unset */
1080         c->x86_clflush_size = 64;
1081         c->x86_cache_alignment = c->x86_clflush_size;
1082         c->x86_max_cores = 1;
1083         c->extended_cpuid_level = 0;
1084         memset(&c->x86_capability, 0, sizeof c->x86_capability);
1085
1086         /* Get vendor name */
1087         cpuid(0x00000000, (unsigned int *)&c->cpuid_level,
1088               (unsigned int *)&c->x86_vendor_id[0],
1089               (unsigned int *)&c->x86_vendor_id[8],
1090               (unsigned int *)&c->x86_vendor_id[4]);
1091                 
1092         get_cpu_vendor(c);
1093
1094         /* Initialize the standard set of capabilities */
1095         /* Note that the vendor-specific code below might override */
1096
1097         /* Intel-defined flags: level 0x00000001 */
1098         if (c->cpuid_level >= 0x00000001) {
1099                 __u32 misc;
1100                 cpuid(0x00000001, &tfms, &misc, &c->x86_capability[4],
1101                       &c->x86_capability[0]);
1102                 c->x86 = (tfms >> 8) & 0xf;
1103                 c->x86_model = (tfms >> 4) & 0xf;
1104                 c->x86_mask = tfms & 0xf;
1105                 if (c->x86 == 0xf)
1106                         c->x86 += (tfms >> 20) & 0xff;
1107                 if (c->x86 >= 0x6)
1108                         c->x86_model += ((tfms >> 16) & 0xF) << 4;
1109                 if (c->x86_capability[0] & (1<<19)) 
1110                         c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
1111         } else {
1112                 /* Have CPUID level 0 only - unheard of */
1113                 c->x86 = 4;
1114         }
1115
1116 #ifdef CONFIG_SMP
1117         phys_proc_id[smp_processor_id()] = (cpuid_ebx(1) >> 24) & 0xff;
1118 #endif
1119 }
1120
1121 /*
1122  * This does the hard work of actually picking apart the CPU stuff...
1123  */
1124 void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
1125 {
1126         int i;
1127         u32 xlvl;
1128
1129         early_identify_cpu(c);
1130
1131         /* AMD-defined flags: level 0x80000001 */
1132         xlvl = cpuid_eax(0x80000000);
1133         c->extended_cpuid_level = xlvl;
1134         if ((xlvl & 0xffff0000) == 0x80000000) {
1135                 if (xlvl >= 0x80000001) {
1136                         c->x86_capability[1] = cpuid_edx(0x80000001);
1137                         c->x86_capability[6] = cpuid_ecx(0x80000001);
1138                 }
1139                 if (xlvl >= 0x80000004)
1140                         get_model_name(c); /* Default name */
1141         }
1142
1143         /* Transmeta-defined flags: level 0x80860001 */
1144         xlvl = cpuid_eax(0x80860000);
1145         if ((xlvl & 0xffff0000) == 0x80860000) {
1146                 /* Don't set x86_cpuid_level here for now to not confuse. */
1147                 if (xlvl >= 0x80860001)
1148                         c->x86_capability[2] = cpuid_edx(0x80860001);
1149         }
1150
1151         /*
1152          * Vendor-specific initialization.  In this section we
1153          * canonicalize the feature flags, meaning if there are
1154          * features a certain CPU supports which CPUID doesn't
1155          * tell us, CPUID claiming incorrect flags, or other bugs,
1156          * we handle them here.
1157          *
1158          * At the end of this section, c->x86_capability better
1159          * indicate the features this CPU genuinely supports!
1160          */
1161         switch (c->x86_vendor) {
1162         case X86_VENDOR_AMD:
1163                 init_amd(c);
1164                 break;
1165
1166         case X86_VENDOR_INTEL:
1167                 init_intel(c);
1168                 break;
1169
1170         case X86_VENDOR_UNKNOWN:
1171         default:
1172                 display_cacheinfo(c);
1173                 break;
1174         }
1175
1176         select_idle_routine(c);
1177         detect_ht(c); 
1178
1179         /*
1180          * On SMP, boot_cpu_data holds the common feature set between
1181          * all CPUs; so make sure that we indicate which features are
1182          * common between the CPUs.  The first time this routine gets
1183          * executed, c == &boot_cpu_data.
1184          */
1185         if (c != &boot_cpu_data) {
1186                 /* AND the already accumulated flags with these */
1187                 for (i = 0 ; i < NCAPINTS ; i++)
1188                         boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
1189         }
1190
1191 #ifdef CONFIG_X86_MCE
1192         mcheck_init(c);
1193 #endif
1194         if (c == &boot_cpu_data)
1195                 mtrr_bp_init();
1196         else
1197                 mtrr_ap_init();
1198 #ifdef CONFIG_NUMA
1199         numa_add_cpu(smp_processor_id());
1200 #endif
1201 }
1202  
1203
1204 void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
1205 {
1206         if (c->x86_model_id[0])
1207                 printk("%s", c->x86_model_id);
1208
1209         if (c->x86_mask || c->cpuid_level >= 0) 
1210                 printk(" stepping %02x\n", c->x86_mask);
1211         else
1212                 printk("\n");
1213 }
1214
1215 /*
1216  *      Get CPU information for use by the procfs.
1217  */
1218
1219 static int show_cpuinfo(struct seq_file *m, void *v)
1220 {
1221         struct cpuinfo_x86 *c = v;
1222
1223         /* 
1224          * These flag bits must match the definitions in <asm/cpufeature.h>.
1225          * NULL means this bit is undefined or reserved; either way it doesn't
1226          * have meaning as far as Linux is concerned.  Note that it's important
1227          * to realize there is a difference between this table and CPUID -- if
1228          * applications want to get the raw CPUID data, they should access
1229          * /dev/cpu/<cpu_nr>/cpuid instead.
1230          */
1231         static char *x86_cap_flags[] = {
1232                 /* Intel-defined */
1233                 "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
1234                 "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov",
1235                 "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx",
1236                 "fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", NULL,
1237
1238                 /* AMD-defined */
1239                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1240                 NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
1241                 NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL,
1242                 NULL, "fxsr_opt", "rdtscp", NULL, NULL, "lm", "3dnowext", "3dnow",
1243
1244                 /* Transmeta-defined */
1245                 "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
1246                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1247                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1248                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1249
1250                 /* Other (Linux-defined) */
1251                 "cxmmx", NULL, "cyrix_arr", "centaur_mcr", NULL,
1252                 "constant_tsc", NULL, NULL,
1253                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1254                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1255                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1256
1257                 /* Intel-defined (#2) */
1258                 "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", NULL, "est",
1259                 "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL,
1260                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1261                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1262
1263                 /* VIA/Cyrix/Centaur-defined */
1264                 NULL, NULL, "rng", "rng_en", NULL, NULL, "ace", "ace_en",
1265                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1266                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1267                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1268
1269                 /* AMD-defined (#2) */
1270                 "lahf_lm", "cmp_legacy", "svm", NULL, "cr8_legacy", NULL, NULL, NULL,
1271                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1272                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1273                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1274         };
1275         static char *x86_power_flags[] = { 
1276                 "ts",   /* temperature sensor */
1277                 "fid",  /* frequency id control */
1278                 "vid",  /* voltage id control */
1279                 "ttp",  /* thermal trip */
1280                 "tm",
1281                 "stc",
1282                 NULL,
1283                 /* nothing */   /* constant_tsc - moved to flags */
1284         };
1285
1286
1287 #ifdef CONFIG_SMP
1288         if (!cpu_online(c-cpu_data))
1289                 return 0;
1290 #endif
1291
1292         seq_printf(m,"processor\t: %u\n"
1293                      "vendor_id\t: %s\n"
1294                      "cpu family\t: %d\n"
1295                      "model\t\t: %d\n"
1296                      "model name\t: %s\n",
1297                      (unsigned)(c-cpu_data),
1298                      c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
1299                      c->x86,
1300                      (int)c->x86_model,
1301                      c->x86_model_id[0] ? c->x86_model_id : "unknown");
1302         
1303         if (c->x86_mask || c->cpuid_level >= 0)
1304                 seq_printf(m, "stepping\t: %d\n", c->x86_mask);
1305         else
1306                 seq_printf(m, "stepping\t: unknown\n");
1307         
1308         if (cpu_has(c,X86_FEATURE_TSC)) {
1309                 unsigned int freq = cpufreq_quick_get((unsigned)(c-cpu_data));
1310                 if (!freq)
1311                         freq = cpu_khz;
1312                 seq_printf(m, "cpu MHz\t\t: %u.%03u\n",
1313                              freq / 1000, (freq % 1000));
1314         }
1315
1316         /* Cache size */
1317         if (c->x86_cache_size >= 0) 
1318                 seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
1319         
1320 #ifdef CONFIG_SMP
1321         if (smp_num_siblings * c->x86_max_cores > 1) {
1322                 int cpu = c - cpu_data;
1323                 seq_printf(m, "physical id\t: %d\n", phys_proc_id[cpu]);
1324                 seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[cpu]));
1325                 seq_printf(m, "core id\t\t: %d\n", cpu_core_id[cpu]);
1326                 seq_printf(m, "cpu cores\t: %d\n", c->booted_cores);
1327         }
1328 #endif  
1329
1330         seq_printf(m,
1331                 "fpu\t\t: yes\n"
1332                 "fpu_exception\t: yes\n"
1333                 "cpuid level\t: %d\n"
1334                 "wp\t\t: yes\n"
1335                 "flags\t\t:",
1336                    c->cpuid_level);
1337
1338         { 
1339                 int i; 
1340                 for ( i = 0 ; i < 32*NCAPINTS ; i++ )
1341                         if ( test_bit(i, &c->x86_capability) &&
1342                              x86_cap_flags[i] != NULL )
1343                                 seq_printf(m, " %s", x86_cap_flags[i]);
1344         }
1345                 
1346         seq_printf(m, "\nbogomips\t: %lu.%02lu\n",
1347                    c->loops_per_jiffy/(500000/HZ),
1348                    (c->loops_per_jiffy/(5000/HZ)) % 100);
1349
1350         if (c->x86_tlbsize > 0) 
1351                 seq_printf(m, "TLB size\t: %d 4K pages\n", c->x86_tlbsize);
1352         seq_printf(m, "clflush size\t: %d\n", c->x86_clflush_size);
1353         seq_printf(m, "cache_alignment\t: %d\n", c->x86_cache_alignment);
1354
1355         seq_printf(m, "address sizes\t: %u bits physical, %u bits virtual\n", 
1356                    c->x86_phys_bits, c->x86_virt_bits);
1357
1358         seq_printf(m, "power management:");
1359         {
1360                 unsigned i;
1361                 for (i = 0; i < 32; i++) 
1362                         if (c->x86_power & (1 << i)) {
1363                                 if (i < ARRAY_SIZE(x86_power_flags) &&
1364                                         x86_power_flags[i])
1365                                         seq_printf(m, "%s%s",
1366                                                 x86_power_flags[i][0]?" ":"",
1367                                                 x86_power_flags[i]);
1368                                 else
1369                                         seq_printf(m, " [%d]", i);
1370                         }
1371         }
1372
1373         seq_printf(m, "\n\n");
1374
1375         return 0;
1376 }
1377
1378 static void *c_start(struct seq_file *m, loff_t *pos)
1379 {
1380         return *pos < NR_CPUS ? cpu_data + *pos : NULL;
1381 }
1382
1383 static void *c_next(struct seq_file *m, void *v, loff_t *pos)
1384 {
1385         ++*pos;
1386         return c_start(m, pos);
1387 }
1388
1389 static void c_stop(struct seq_file *m, void *v)
1390 {
1391 }
1392
1393 struct seq_operations cpuinfo_op = {
1394         .start =c_start,
1395         .next = c_next,
1396         .stop = c_stop,
1397         .show = show_cpuinfo,
1398 };
1399
1400 static int __init run_dmi_scan(void)
1401 {
1402         dmi_scan_machine();
1403         return 0;
1404 }
1405 core_initcall(run_dmi_scan);
1406