diff options
Diffstat (limited to 'arch/x86/kernel/setup.c')
-rw-r--r-- | arch/x86/kernel/setup.c | 131 |
1 files changed, 34 insertions, 97 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 63f32d220ef2..e09f0e2c14b5 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/screen_info.h> | 27 | #include <linux/screen_info.h> |
28 | #include <linux/ioport.h> | 28 | #include <linux/ioport.h> |
29 | #include <linux/acpi.h> | 29 | #include <linux/acpi.h> |
30 | #include <linux/sfi.h> | ||
30 | #include <linux/apm_bios.h> | 31 | #include <linux/apm_bios.h> |
31 | #include <linux/initrd.h> | 32 | #include <linux/initrd.h> |
32 | #include <linux/bootmem.h> | 33 | #include <linux/bootmem.h> |
@@ -66,6 +67,7 @@ | |||
66 | 67 | ||
67 | #include <linux/percpu.h> | 68 | #include <linux/percpu.h> |
68 | #include <linux/crash_dump.h> | 69 | #include <linux/crash_dump.h> |
70 | #include <linux/tboot.h> | ||
69 | 71 | ||
70 | #include <video/edid.h> | 72 | #include <video/edid.h> |
71 | 73 | ||
@@ -108,10 +110,6 @@ | |||
108 | #include <asm/numa_64.h> | 110 | #include <asm/numa_64.h> |
109 | #endif | 111 | #endif |
110 | 112 | ||
111 | #ifndef ARCH_SETUP | ||
112 | #define ARCH_SETUP | ||
113 | #endif | ||
114 | |||
115 | /* | 113 | /* |
116 | * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries. | 114 | * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries. |
117 | * The direct mapping extends to max_pfn_mapped, so that we can directly access | 115 | * The direct mapping extends to max_pfn_mapped, so that we can directly access |
@@ -133,9 +131,9 @@ int default_cpu_present_to_apicid(int mps_cpu) | |||
133 | return __default_cpu_present_to_apicid(mps_cpu); | 131 | return __default_cpu_present_to_apicid(mps_cpu); |
134 | } | 132 | } |
135 | 133 | ||
136 | int default_check_phys_apicid_present(int boot_cpu_physical_apicid) | 134 | int default_check_phys_apicid_present(int phys_apicid) |
137 | { | 135 | { |
138 | return __default_check_phys_apicid_present(boot_cpu_physical_apicid); | 136 | return __default_check_phys_apicid_present(phys_apicid); |
139 | } | 137 | } |
140 | #endif | 138 | #endif |
141 | 139 | ||
@@ -171,13 +169,6 @@ static struct resource bss_resource = { | |||
171 | 169 | ||
172 | 170 | ||
173 | #ifdef CONFIG_X86_32 | 171 | #ifdef CONFIG_X86_32 |
174 | static struct resource video_ram_resource = { | ||
175 | .name = "Video RAM area", | ||
176 | .start = 0xa0000, | ||
177 | .end = 0xbffff, | ||
178 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
179 | }; | ||
180 | |||
181 | /* cpu data as detected by the assembly code in head.S */ | 172 | /* cpu data as detected by the assembly code in head.S */ |
182 | struct cpuinfo_x86 new_cpu_data __cpuinitdata = {0, 0, 0, 0, -1, 1, 0, 0, -1}; | 173 | struct cpuinfo_x86 new_cpu_data __cpuinitdata = {0, 0, 0, 0, -1, 1, 0, 0, -1}; |
183 | /* common cpu data for all cpus */ | 174 | /* common cpu data for all cpus */ |
@@ -605,7 +596,7 @@ static struct resource standard_io_resources[] = { | |||
605 | .flags = IORESOURCE_BUSY | IORESOURCE_IO } | 596 | .flags = IORESOURCE_BUSY | IORESOURCE_IO } |
606 | }; | 597 | }; |
607 | 598 | ||
608 | static void __init reserve_standard_io_resources(void) | 599 | void __init reserve_standard_io_resources(void) |
609 | { | 600 | { |
610 | int i; | 601 | int i; |
611 | 602 | ||
@@ -637,10 +628,6 @@ static int __init setup_elfcorehdr(char *arg) | |||
637 | early_param("elfcorehdr", setup_elfcorehdr); | 628 | early_param("elfcorehdr", setup_elfcorehdr); |
638 | #endif | 629 | #endif |
639 | 630 | ||
640 | static struct x86_quirks default_x86_quirks __initdata; | ||
641 | |||
642 | struct x86_quirks *x86_quirks __initdata = &default_x86_quirks; | ||
643 | |||
644 | #ifdef CONFIG_X86_RESERVE_LOW_64K | 631 | #ifdef CONFIG_X86_RESERVE_LOW_64K |
645 | static int __init dmi_low_memory_corruption(const struct dmi_system_id *d) | 632 | static int __init dmi_low_memory_corruption(const struct dmi_system_id *d) |
646 | { | 633 | { |
@@ -757,7 +744,7 @@ void __init setup_arch(char **cmdline_p) | |||
757 | } | 744 | } |
758 | #endif | 745 | #endif |
759 | 746 | ||
760 | ARCH_SETUP | 747 | x86_init.oem.arch_setup(); |
761 | 748 | ||
762 | setup_memory_map(); | 749 | setup_memory_map(); |
763 | parse_setup_data(); | 750 | parse_setup_data(); |
@@ -796,6 +783,16 @@ void __init setup_arch(char **cmdline_p) | |||
796 | strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); | 783 | strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); |
797 | *cmdline_p = command_line; | 784 | *cmdline_p = command_line; |
798 | 785 | ||
786 | #ifdef CONFIG_X86_64 | ||
787 | /* | ||
788 | * Must call this twice: Once just to detect whether hardware doesn't | ||
789 | * support NX (so that the early EHCI debug console setup can safely | ||
790 | * call set_fixmap(), and then again after parsing early parameters to | ||
791 | * honor the respective command line option. | ||
792 | */ | ||
793 | check_efer(); | ||
794 | #endif | ||
795 | |||
799 | parse_early_param(); | 796 | parse_early_param(); |
800 | 797 | ||
801 | #ifdef CONFIG_X86_64 | 798 | #ifdef CONFIG_X86_64 |
@@ -833,11 +830,9 @@ void __init setup_arch(char **cmdline_p) | |||
833 | * VMware detection requires dmi to be available, so this | 830 | * VMware detection requires dmi to be available, so this |
834 | * needs to be done after dmi_scan_machine, for the BP. | 831 | * needs to be done after dmi_scan_machine, for the BP. |
835 | */ | 832 | */ |
836 | init_hypervisor(&boot_cpu_data); | 833 | init_hypervisor_platform(); |
837 | 834 | ||
838 | #ifdef CONFIG_X86_32 | 835 | x86_init.resources.probe_roms(); |
839 | probe_roms(); | ||
840 | #endif | ||
841 | 836 | ||
842 | /* after parse_early_param, so could debug it */ | 837 | /* after parse_early_param, so could debug it */ |
843 | insert_resource(&iomem_resource, &code_resource); | 838 | insert_resource(&iomem_resource, &code_resource); |
@@ -972,10 +967,11 @@ void __init setup_arch(char **cmdline_p) | |||
972 | kvmclock_init(); | 967 | kvmclock_init(); |
973 | #endif | 968 | #endif |
974 | 969 | ||
975 | paravirt_pagetable_setup_start(swapper_pg_dir); | 970 | x86_init.paging.pagetable_setup_start(swapper_pg_dir); |
976 | paging_init(); | 971 | paging_init(); |
977 | paravirt_pagetable_setup_done(swapper_pg_dir); | 972 | x86_init.paging.pagetable_setup_done(swapper_pg_dir); |
978 | paravirt_post_allocator_init(); | 973 | |
974 | tboot_probe(); | ||
979 | 975 | ||
980 | #ifdef CONFIG_X86_64 | 976 | #ifdef CONFIG_X86_64 |
981 | map_vsyscall(); | 977 | map_vsyscall(); |
@@ -990,13 +986,13 @@ void __init setup_arch(char **cmdline_p) | |||
990 | */ | 986 | */ |
991 | acpi_boot_init(); | 987 | acpi_boot_init(); |
992 | 988 | ||
993 | #if defined(CONFIG_X86_MPPARSE) || defined(CONFIG_X86_VISWS) | 989 | sfi_init(); |
990 | |||
994 | /* | 991 | /* |
995 | * get boot-time SMP configuration: | 992 | * get boot-time SMP configuration: |
996 | */ | 993 | */ |
997 | if (smp_found_config) | 994 | if (smp_found_config) |
998 | get_smp_config(); | 995 | get_smp_config(); |
999 | #endif | ||
1000 | 996 | ||
1001 | prefill_possible_map(); | 997 | prefill_possible_map(); |
1002 | 998 | ||
@@ -1015,10 +1011,7 @@ void __init setup_arch(char **cmdline_p) | |||
1015 | e820_reserve_resources(); | 1011 | e820_reserve_resources(); |
1016 | e820_mark_nosave_regions(max_low_pfn); | 1012 | e820_mark_nosave_regions(max_low_pfn); |
1017 | 1013 | ||
1018 | #ifdef CONFIG_X86_32 | 1014 | x86_init.resources.reserve_resources(); |
1019 | request_resource(&iomem_resource, &video_ram_resource); | ||
1020 | #endif | ||
1021 | reserve_standard_io_resources(); | ||
1022 | 1015 | ||
1023 | e820_setup_gap(); | 1016 | e820_setup_gap(); |
1024 | 1017 | ||
@@ -1030,78 +1023,22 @@ void __init setup_arch(char **cmdline_p) | |||
1030 | conswitchp = &dummy_con; | 1023 | conswitchp = &dummy_con; |
1031 | #endif | 1024 | #endif |
1032 | #endif | 1025 | #endif |
1026 | x86_init.oem.banner(); | ||
1033 | } | 1027 | } |
1034 | 1028 | ||
1035 | #ifdef CONFIG_X86_32 | 1029 | #ifdef CONFIG_X86_32 |
1036 | 1030 | ||
1037 | /** | 1031 | static struct resource video_ram_resource = { |
1038 | * x86_quirk_intr_init - post gate setup interrupt initialisation | 1032 | .name = "Video RAM area", |
1039 | * | 1033 | .start = 0xa0000, |
1040 | * Description: | 1034 | .end = 0xbffff, |
1041 | * Fill in any interrupts that may have been left out by the general | 1035 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM |
1042 | * init_IRQ() routine. interrupts having to do with the machine rather | ||
1043 | * than the devices on the I/O bus (like APIC interrupts in intel MP | ||
1044 | * systems) are started here. | ||
1045 | **/ | ||
1046 | void __init x86_quirk_intr_init(void) | ||
1047 | { | ||
1048 | if (x86_quirks->arch_intr_init) { | ||
1049 | if (x86_quirks->arch_intr_init()) | ||
1050 | return; | ||
1051 | } | ||
1052 | } | ||
1053 | |||
1054 | /** | ||
1055 | * x86_quirk_trap_init - initialise system specific traps | ||
1056 | * | ||
1057 | * Description: | ||
1058 | * Called as the final act of trap_init(). Used in VISWS to initialise | ||
1059 | * the various board specific APIC traps. | ||
1060 | **/ | ||
1061 | void __init x86_quirk_trap_init(void) | ||
1062 | { | ||
1063 | if (x86_quirks->arch_trap_init) { | ||
1064 | if (x86_quirks->arch_trap_init()) | ||
1065 | return; | ||
1066 | } | ||
1067 | } | ||
1068 | |||
1069 | static struct irqaction irq0 = { | ||
1070 | .handler = timer_interrupt, | ||
1071 | .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER, | ||
1072 | .name = "timer" | ||
1073 | }; | 1036 | }; |
1074 | 1037 | ||
1075 | /** | 1038 | void __init i386_reserve_resources(void) |
1076 | * x86_quirk_pre_time_init - do any specific initialisations before. | ||
1077 | * | ||
1078 | **/ | ||
1079 | void __init x86_quirk_pre_time_init(void) | ||
1080 | { | 1039 | { |
1081 | if (x86_quirks->arch_pre_time_init) | 1040 | request_resource(&iomem_resource, &video_ram_resource); |
1082 | x86_quirks->arch_pre_time_init(); | 1041 | reserve_standard_io_resources(); |
1083 | } | 1042 | } |
1084 | 1043 | ||
1085 | /** | ||
1086 | * x86_quirk_time_init - do any specific initialisations for the system timer. | ||
1087 | * | ||
1088 | * Description: | ||
1089 | * Must plug the system timer interrupt source at HZ into the IRQ listed | ||
1090 | * in irq_vectors.h:TIMER_IRQ | ||
1091 | **/ | ||
1092 | void __init x86_quirk_time_init(void) | ||
1093 | { | ||
1094 | if (x86_quirks->arch_time_init) { | ||
1095 | /* | ||
1096 | * A nonzero return code does not mean failure, it means | ||
1097 | * that the architecture quirk does not want any | ||
1098 | * generic (timer) setup to be performed after this: | ||
1099 | */ | ||
1100 | if (x86_quirks->arch_time_init()) | ||
1101 | return; | ||
1102 | } | ||
1103 | |||
1104 | irq0.mask = cpumask_of_cpu(0); | ||
1105 | setup_irq(0, &irq0); | ||
1106 | } | ||
1107 | #endif /* CONFIG_X86_32 */ | 1044 | #endif /* CONFIG_X86_32 */ |