diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-07-10 11:30:40 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-10 12:55:31 -0400 |
commit | 3b33553badcde952adcf3b3ba5faae38d7d85071 (patch) | |
tree | e6f20de95b23a54689776e772ad25561ae109b69 | |
parent | 520b9617ab4aea764ddfc5d58cae21c16b3318e1 (diff) |
x86: add early quirk support
Add early quirks support.
In preparation of enabling the generic architecture to boot on a VISWS.
This will allow us to remove the VISWS subarch and all its complications.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/kernel/e820.c | 11 | ||||
-rw-r--r-- | arch/x86/kernel/mpparse.c | 20 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 1 | ||||
-rw-r--r-- | include/asm-x86/setup.h | 17 |
4 files changed, 47 insertions, 2 deletions
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 9836a079cfd9..269d367d2ace 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
@@ -1297,6 +1297,11 @@ void __init e820_reserve_resources(void) | |||
1297 | } | 1297 | } |
1298 | } | 1298 | } |
1299 | 1299 | ||
1300 | /* | ||
1301 | * Non-standard memory setup can be specified via this quirk: | ||
1302 | */ | ||
1303 | char * (*arch_memory_setup_quirk)(void); | ||
1304 | |||
1300 | char *__init default_machine_specific_memory_setup(void) | 1305 | char *__init default_machine_specific_memory_setup(void) |
1301 | { | 1306 | { |
1302 | char *who = "BIOS-e820"; | 1307 | char *who = "BIOS-e820"; |
@@ -1337,6 +1342,12 @@ char *__init default_machine_specific_memory_setup(void) | |||
1337 | 1342 | ||
1338 | char *__init __attribute__((weak)) machine_specific_memory_setup(void) | 1343 | char *__init __attribute__((weak)) machine_specific_memory_setup(void) |
1339 | { | 1344 | { |
1345 | if (arch_memory_setup_quirk) { | ||
1346 | char *who = arch_memory_setup_quirk(); | ||
1347 | |||
1348 | if (who) | ||
1349 | return who; | ||
1350 | } | ||
1340 | return default_machine_specific_memory_setup(); | 1351 | return default_machine_specific_memory_setup(); |
1341 | } | 1352 | } |
1342 | 1353 | ||
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 8b6b1e05c306..3b25e49380c6 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
@@ -726,12 +726,22 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) | |||
726 | static struct intel_mp_floating *mpf_found; | 726 | static struct intel_mp_floating *mpf_found; |
727 | 727 | ||
728 | /* | 728 | /* |
729 | * Machine specific quirk for finding the SMP config before other setup | ||
730 | * activities destroy the table: | ||
731 | */ | ||
732 | int (*mach_get_smp_config_quirk)(unsigned int early); | ||
733 | |||
734 | /* | ||
729 | * Scan the memory blocks for an SMP configuration block. | 735 | * Scan the memory blocks for an SMP configuration block. |
730 | */ | 736 | */ |
731 | static void __init __get_smp_config(unsigned early) | 737 | static void __init __get_smp_config(unsigned int early) |
732 | { | 738 | { |
733 | struct intel_mp_floating *mpf = mpf_found; | 739 | struct intel_mp_floating *mpf = mpf_found; |
734 | 740 | ||
741 | if (mach_get_smp_config_quirk) { | ||
742 | if (mach_get_smp_config_quirk(early)) | ||
743 | return; | ||
744 | } | ||
735 | if (acpi_lapic && early) | 745 | if (acpi_lapic && early) |
736 | return; | 746 | return; |
737 | /* | 747 | /* |
@@ -889,10 +899,16 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, | |||
889 | return 0; | 899 | return 0; |
890 | } | 900 | } |
891 | 901 | ||
892 | static void __init __find_smp_config(unsigned reserve) | 902 | int (*mach_find_smp_config_quirk)(unsigned int reserve); |
903 | |||
904 | static void __init __find_smp_config(unsigned int reserve) | ||
893 | { | 905 | { |
894 | unsigned int address; | 906 | unsigned int address; |
895 | 907 | ||
908 | if (mach_find_smp_config_quirk) { | ||
909 | if (mach_find_smp_config_quirk(reserve)) | ||
910 | return; | ||
911 | } | ||
896 | /* | 912 | /* |
897 | * FIXME: Linux assumes you have 640K of base ram.. | 913 | * FIXME: Linux assumes you have 640K of base ram.. |
898 | * this continues the error... | 914 | * this continues the error... |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index a7c3471ea17c..cb3db406247c 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -596,6 +596,7 @@ void __init setup_arch(char **cmdline_p) | |||
596 | { | 596 | { |
597 | #ifdef CONFIG_X86_32 | 597 | #ifdef CONFIG_X86_32 |
598 | memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); | 598 | memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); |
599 | visws_early_detect(); | ||
599 | pre_setup_arch_hook(); | 600 | pre_setup_arch_hook(); |
600 | early_cpu_init(); | 601 | early_cpu_init(); |
601 | #else | 602 | #else |
diff --git a/include/asm-x86/setup.h b/include/asm-x86/setup.h index 1d121c632d9e..1ad7eae0d9be 100644 --- a/include/asm-x86/setup.h +++ b/include/asm-x86/setup.h | |||
@@ -8,6 +8,23 @@ | |||
8 | /* Interrupt control for vSMPowered x86_64 systems */ | 8 | /* Interrupt control for vSMPowered x86_64 systems */ |
9 | void vsmp_init(void); | 9 | void vsmp_init(void); |
10 | 10 | ||
11 | #ifdef CONFIG_X86_VISWS | ||
12 | extern void visws_early_detect(void); | ||
13 | #else | ||
14 | static inline void visws_early_detect(void) { } | ||
15 | #endif | ||
16 | |||
17 | /* | ||
18 | * Any setup quirks to be performed? | ||
19 | */ | ||
20 | extern int (*arch_time_init_quirk)(void); | ||
21 | extern int (*arch_pre_intr_init_quirk)(void); | ||
22 | extern int (*arch_intr_init_quirk)(void); | ||
23 | extern int (*arch_trap_init_quirk)(void); | ||
24 | extern char * (*arch_memory_setup_quirk)(void); | ||
25 | extern int (*mach_get_smp_config_quirk)(unsigned int early); | ||
26 | extern int (*mach_find_smp_config_quirk)(unsigned int reserve); | ||
27 | |||
11 | #ifndef CONFIG_PARAVIRT | 28 | #ifndef CONFIG_PARAVIRT |
12 | #define paravirt_post_allocator_init() do {} while (0) | 29 | #define paravirt_post_allocator_init() do {} while (0) |
13 | #endif | 30 | #endif |