mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-11 08:18:47 +00:00
x86, apic: Use probe routines to simplify apic selection
Use the unused probe routine in the apic driver to finalize the apic model selection. This cleans up the default_setup_apic_routing() and this probe routine in future can also be used for doing any apic model specific initialisation. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Acked-by: Cyrill Gorcunov <gorcunov@openvz.org> Cc: steiner@sgi.com Cc: yinghai@kernel.org Link: http://lkml.kernel.org/r/20110519234637.247458931@sbsiddha-MOBL3.sc.intel.com Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
8f18c9711e
commit
9ebd680bd0
@ -312,10 +312,18 @@ physflat_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
||||
return per_cpu(x86_cpu_to_apicid, cpu);
|
||||
}
|
||||
|
||||
static int physflat_probe(void)
|
||||
{
|
||||
if (apic == &apic_physflat || num_possible_cpus() > 8)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct apic apic_physflat = {
|
||||
|
||||
.name = "physical flat",
|
||||
.probe = NULL,
|
||||
.probe = physflat_probe,
|
||||
.acpi_madt_oem_check = physflat_acpi_madt_oem_check,
|
||||
.apic_id_registered = flat_apic_id_registered,
|
||||
|
||||
|
@ -54,26 +54,18 @@ static int apicid_phys_pkg_id(int initial_apic_id, int index_msb)
|
||||
*/
|
||||
void __init default_setup_apic_routing(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
enable_IR_x2apic();
|
||||
|
||||
#ifdef CONFIG_X86_X2APIC
|
||||
if (x2apic_mode
|
||||
#ifdef CONFIG_X86_UV
|
||||
&& apic != &apic_x2apic_uv_x
|
||||
#endif
|
||||
) {
|
||||
if (x2apic_phys)
|
||||
apic = &apic_x2apic_phys;
|
||||
else
|
||||
apic = &apic_x2apic_cluster;
|
||||
for (i = 0; apic_probe[i]; ++i) {
|
||||
if (apic_probe[i]->probe()) {
|
||||
apic = apic_probe[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (apic == &apic_flat && num_possible_cpus() > 8)
|
||||
apic = &apic_physflat;
|
||||
|
||||
printk(KERN_INFO "Setting APIC routing to %s\n", apic->name);
|
||||
printk(KERN_INFO "APIC routing finalized to %s.\n", apic->name);
|
||||
|
||||
if (is_vsmp_box()) {
|
||||
/* need to update phys_pkg_id */
|
||||
|
@ -184,10 +184,15 @@ static void init_x2apic_ldr(void)
|
||||
per_cpu(x86_cpu_to_logical_apicid, cpu) = apic_read(APIC_LDR);
|
||||
}
|
||||
|
||||
static int x2apic_cluster_probe(void)
|
||||
{
|
||||
return x2apic_mode;
|
||||
}
|
||||
|
||||
struct apic apic_x2apic_cluster = {
|
||||
|
||||
.name = "cluster x2apic",
|
||||
.probe = NULL,
|
||||
.probe = x2apic_cluster_probe,
|
||||
.acpi_madt_oem_check = x2apic_acpi_madt_oem_check,
|
||||
.apic_id_registered = x2apic_apic_id_registered,
|
||||
|
||||
|
@ -173,10 +173,18 @@ static void init_x2apic_ldr(void)
|
||||
{
|
||||
}
|
||||
|
||||
static int x2apic_phys_probe(void)
|
||||
{
|
||||
if (x2apic_mode && x2apic_phys)
|
||||
return 1;
|
||||
|
||||
return apic == &apic_x2apic_phys;
|
||||
}
|
||||
|
||||
struct apic apic_x2apic_phys = {
|
||||
|
||||
.name = "physical x2apic",
|
||||
.probe = NULL,
|
||||
.probe = x2apic_phys_probe,
|
||||
.acpi_madt_oem_check = x2apic_acpi_madt_oem_check,
|
||||
.apic_id_registered = x2apic_apic_id_registered,
|
||||
|
||||
|
@ -326,10 +326,15 @@ static void uv_send_IPI_self(int vector)
|
||||
apic_write(APIC_SELF_IPI, vector);
|
||||
}
|
||||
|
||||
static int uv_probe(void)
|
||||
{
|
||||
return apic == &apic_x2apic_uv_x;
|
||||
}
|
||||
|
||||
struct apic __refdata apic_x2apic_uv_x = {
|
||||
|
||||
.name = "UV large system",
|
||||
.probe = NULL,
|
||||
.probe = uv_probe,
|
||||
.acpi_madt_oem_check = uv_acpi_madt_oem_check,
|
||||
.apic_id_registered = uv_apic_id_registered,
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user