Commit 9ebd680b authored by Suresh Siddha's avatar Suresh Siddha Committed by Ingo Molnar

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: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Acked-by: default avatarCyrill Gorcunov <gorcunov@openvz.org>
Cc: steiner@sgi.com
Cc: yinghai@kernel.org
Link: http://lkml.kernel.org/r/20110519234637.247458931@sbsiddha-MOBL3.sc.intel.comSigned-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 8f18c971
...@@ -312,10 +312,18 @@ physflat_cpu_mask_to_apicid_and(const struct cpumask *cpumask, ...@@ -312,10 +312,18 @@ physflat_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
return per_cpu(x86_cpu_to_apicid, cpu); 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 = { struct apic apic_physflat = {
.name = "physical flat", .name = "physical flat",
.probe = NULL, .probe = physflat_probe,
.acpi_madt_oem_check = physflat_acpi_madt_oem_check, .acpi_madt_oem_check = physflat_acpi_madt_oem_check,
.apic_id_registered = flat_apic_id_registered, .apic_id_registered = flat_apic_id_registered,
......
...@@ -54,26 +54,18 @@ static int apicid_phys_pkg_id(int initial_apic_id, int index_msb) ...@@ -54,26 +54,18 @@ static int apicid_phys_pkg_id(int initial_apic_id, int index_msb)
*/ */
void __init default_setup_apic_routing(void) void __init default_setup_apic_routing(void)
{ {
int i;
enable_IR_x2apic(); enable_IR_x2apic();
#ifdef CONFIG_X86_X2APIC for (i = 0; apic_probe[i]; ++i) {
if (x2apic_mode if (apic_probe[i]->probe()) {
#ifdef CONFIG_X86_UV apic = apic_probe[i];
&& apic != &apic_x2apic_uv_x break;
#endif }
) {
if (x2apic_phys)
apic = &apic_x2apic_phys;
else
apic = &apic_x2apic_cluster;
} }
#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()) { if (is_vsmp_box()) {
/* need to update phys_pkg_id */ /* need to update phys_pkg_id */
......
...@@ -184,10 +184,15 @@ static void init_x2apic_ldr(void) ...@@ -184,10 +184,15 @@ static void init_x2apic_ldr(void)
per_cpu(x86_cpu_to_logical_apicid, cpu) = apic_read(APIC_LDR); 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 = { struct apic apic_x2apic_cluster = {
.name = "cluster x2apic", .name = "cluster x2apic",
.probe = NULL, .probe = x2apic_cluster_probe,
.acpi_madt_oem_check = x2apic_acpi_madt_oem_check, .acpi_madt_oem_check = x2apic_acpi_madt_oem_check,
.apic_id_registered = x2apic_apic_id_registered, .apic_id_registered = x2apic_apic_id_registered,
......
...@@ -173,10 +173,18 @@ static void init_x2apic_ldr(void) ...@@ -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 = { struct apic apic_x2apic_phys = {
.name = "physical x2apic", .name = "physical x2apic",
.probe = NULL, .probe = x2apic_phys_probe,
.acpi_madt_oem_check = x2apic_acpi_madt_oem_check, .acpi_madt_oem_check = x2apic_acpi_madt_oem_check,
.apic_id_registered = x2apic_apic_id_registered, .apic_id_registered = x2apic_apic_id_registered,
......
...@@ -326,10 +326,15 @@ static void uv_send_IPI_self(int vector) ...@@ -326,10 +326,15 @@ static void uv_send_IPI_self(int vector)
apic_write(APIC_SELF_IPI, 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 = { struct apic __refdata apic_x2apic_uv_x = {
.name = "UV large system", .name = "UV large system",
.probe = NULL, .probe = uv_probe,
.acpi_madt_oem_check = uv_acpi_madt_oem_check, .acpi_madt_oem_check = uv_acpi_madt_oem_check,
.apic_id_registered = uv_apic_id_registered, .apic_id_registered = uv_apic_id_registered,
......
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