Commit 3b33553b authored by Ingo Molnar's avatar Ingo Molnar

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: default avatarIngo Molnar <mingo@elte.hu>
parent 520b9617
...@@ -1297,6 +1297,11 @@ void __init e820_reserve_resources(void) ...@@ -1297,6 +1297,11 @@ void __init e820_reserve_resources(void)
} }
} }
/*
* Non-standard memory setup can be specified via this quirk:
*/
char * (*arch_memory_setup_quirk)(void);
char *__init default_machine_specific_memory_setup(void) char *__init default_machine_specific_memory_setup(void)
{ {
char *who = "BIOS-e820"; char *who = "BIOS-e820";
...@@ -1337,6 +1342,12 @@ char *__init default_machine_specific_memory_setup(void) ...@@ -1337,6 +1342,12 @@ char *__init default_machine_specific_memory_setup(void)
char *__init __attribute__((weak)) machine_specific_memory_setup(void) char *__init __attribute__((weak)) machine_specific_memory_setup(void)
{ {
if (arch_memory_setup_quirk) {
char *who = arch_memory_setup_quirk();
if (who)
return who;
}
return default_machine_specific_memory_setup(); return default_machine_specific_memory_setup();
} }
......
...@@ -725,13 +725,23 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) ...@@ -725,13 +725,23 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type)
static struct intel_mp_floating *mpf_found; static struct intel_mp_floating *mpf_found;
/*
* Machine specific quirk for finding the SMP config before other setup
* activities destroy the table:
*/
int (*mach_get_smp_config_quirk)(unsigned int early);
/* /*
* Scan the memory blocks for an SMP configuration block. * Scan the memory blocks for an SMP configuration block.
*/ */
static void __init __get_smp_config(unsigned early) static void __init __get_smp_config(unsigned int early)
{ {
struct intel_mp_floating *mpf = mpf_found; struct intel_mp_floating *mpf = mpf_found;
if (mach_get_smp_config_quirk) {
if (mach_get_smp_config_quirk(early))
return;
}
if (acpi_lapic && early) if (acpi_lapic && early)
return; return;
/* /*
...@@ -889,10 +899,16 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, ...@@ -889,10 +899,16 @@ static int __init smp_scan_config(unsigned long base, unsigned long length,
return 0; return 0;
} }
static void __init __find_smp_config(unsigned reserve) int (*mach_find_smp_config_quirk)(unsigned int reserve);
static void __init __find_smp_config(unsigned int reserve)
{ {
unsigned int address; unsigned int address;
if (mach_find_smp_config_quirk) {
if (mach_find_smp_config_quirk(reserve))
return;
}
/* /*
* FIXME: Linux assumes you have 640K of base ram.. * FIXME: Linux assumes you have 640K of base ram..
* this continues the error... * this continues the error...
......
...@@ -596,6 +596,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -596,6 +596,7 @@ void __init setup_arch(char **cmdline_p)
{ {
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
visws_early_detect();
pre_setup_arch_hook(); pre_setup_arch_hook();
early_cpu_init(); early_cpu_init();
#else #else
......
...@@ -8,6 +8,23 @@ ...@@ -8,6 +8,23 @@
/* Interrupt control for vSMPowered x86_64 systems */ /* Interrupt control for vSMPowered x86_64 systems */
void vsmp_init(void); void vsmp_init(void);
#ifdef CONFIG_X86_VISWS
extern void visws_early_detect(void);
#else
static inline void visws_early_detect(void) { }
#endif
/*
* Any setup quirks to be performed?
*/
extern int (*arch_time_init_quirk)(void);
extern int (*arch_pre_intr_init_quirk)(void);
extern int (*arch_intr_init_quirk)(void);
extern int (*arch_trap_init_quirk)(void);
extern char * (*arch_memory_setup_quirk)(void);
extern int (*mach_get_smp_config_quirk)(unsigned int early);
extern int (*mach_find_smp_config_quirk)(unsigned int reserve);
#ifndef CONFIG_PARAVIRT #ifndef CONFIG_PARAVIRT
#define paravirt_post_allocator_init() do {} while (0) #define paravirt_post_allocator_init() do {} while (0)
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment