Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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 *who = "BIOS-e820";
@@ -1337,6 +1342,12 @@ char *__init default_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();
}

+18 −2
Original line number Diff line number Diff line
@@ -725,13 +725,23 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type)

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.
 */
static void __init __get_smp_config(unsigned early)
static void __init __get_smp_config(unsigned int early)
{
	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)
		return;
	/*
@@ -889,10 +899,16 @@ static int __init smp_scan_config(unsigned long base, unsigned long length,
	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;

	if (mach_find_smp_config_quirk) {
		if (mach_find_smp_config_quirk(reserve))
			return;
	}
	/*
	 * FIXME: Linux assumes you have 640K of base ram..
	 * this continues the error...
+1 −0
Original line number Diff line number Diff line
@@ -596,6 +596,7 @@ void __init setup_arch(char **cmdline_p)
{
#ifdef CONFIG_X86_32
	memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
	visws_early_detect();
	pre_setup_arch_hook();
	early_cpu_init();
#else
+17 −0
Original line number Diff line number Diff line
@@ -8,6 +8,23 @@
/* Interrupt control for vSMPowered x86_64 systems */
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
#define paravirt_post_allocator_init()	do {} while (0)
#endif