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

Commit 69c252ff authored by Suresh Siddha's avatar Suresh Siddha Committed by Ingo Molnar
Browse files

x86, apic: Clean up bigsmp apic selection code



Make generic_bigsmp_probe() return struct apic *. This will
avoid exporting apic_bigsmp, which will be consistent with
others.

Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Tested-by: default avatarCyrill Gorcunov <gorcunov@openvz.org>
Cc: steiner@sgi.com
Cc: gorcunov@openvz.org
Cc: yinghai@kernel.org
Link: http://lkml.kernel.org/r/20110521005526.252703851@sbsiddha-MOBL3.sc.intel.com


Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 8b37e880
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -500,7 +500,7 @@ static inline void default_wait_for_init_deassert(atomic_t *deassert)
	return;
}

extern void generic_bigsmp_probe(void);
extern struct apic *generic_bigsmp_probe(void);


#ifdef CONFIG_X86_LOCAL_APIC
+8 −0
Original line number Diff line number Diff line
@@ -255,4 +255,12 @@ struct apic apic_bigsmp = {
	.x86_32_early_logical_apicid	= bigsmp_early_logical_apicid,
};

struct apic * __init generic_bigsmp_probe(void)
{
	if (probe_bigsmp())
		return &apic_bigsmp;

	return NULL;
}

apic_driver(apic_bigsmp);
+23 −29
Original line number Diff line number Diff line
@@ -52,31 +52,6 @@ static int __init print_ipi_mode(void)
}
late_initcall(print_ipi_mode);

void __init default_setup_apic_routing(void)
{
	int version = apic_version[boot_cpu_physical_apicid];

	if (num_possible_cpus() > 8) {
		switch (boot_cpu_data.x86_vendor) {
		case X86_VENDOR_INTEL:
			if (!APIC_XAPIC(version)) {
				def_to_bigsmp = 0;
				break;
			}
			/* If P4 and above fall through */
		case X86_VENDOR_AMD:
			def_to_bigsmp = 1;
		}
	}

#ifdef CONFIG_X86_BIGSMP
	generic_bigsmp_probe();
#endif

	if (apic->setup_apic_routing)
		apic->setup_apic_routing();
}

static int default_x86_32_early_logical_apicid(int cpu)
{
	return 1 << cpu;
@@ -224,24 +199,43 @@ static int __init parse_apic(char *arg)
}
early_param("apic", parse_apic);

void __init generic_bigsmp_probe(void)
void __init default_setup_apic_routing(void)
{
	int version = apic_version[boot_cpu_physical_apicid];

	if (num_possible_cpus() > 8) {
		switch (boot_cpu_data.x86_vendor) {
		case X86_VENDOR_INTEL:
			if (!APIC_XAPIC(version)) {
				def_to_bigsmp = 0;
				break;
			}
			/* If P4 and above fall through */
		case X86_VENDOR_AMD:
			def_to_bigsmp = 1;
		}
	}

#ifdef CONFIG_X86_BIGSMP
	/*
	 * This routine is used to switch to bigsmp mode when
	 * This is used to switch to bigsmp mode when
	 * - There is no apic= option specified by the user
	 * - generic_apic_probe() has chosen apic_default as the sub_arch
	 * - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support
	 */

	if (!cmdline_apic && apic == &apic_default) {
		if (apic_bigsmp.probe()) {
			apic = &apic_bigsmp;
		struct apic *bigsmp = generic_bigsmp_probe();
		if (bigsmp) {
			apic = bigsmp;
			printk(KERN_INFO "Overriding APIC driver with %s\n",
			       apic->name);
		}
	}
#endif

	if (apic->setup_apic_routing)
		apic->setup_apic_routing();
}

void __init generic_apic_probe(void)