|
@@ -32,21 +32,20 @@ extern struct genapic apic_cluster;
|
|
|
extern struct genapic apic_flat;
|
|
|
extern struct genapic apic_physflat;
|
|
|
|
|
|
-struct genapic *genapic = &apic_flat;
|
|
|
-
|
|
|
+struct genapic __read_mostly *genapic = &apic_flat;
|
|
|
|
|
|
/*
|
|
|
* Check the APIC IDs in bios_cpu_apicid and choose the APIC mode.
|
|
|
*/
|
|
|
void __init clustered_apic_check(void)
|
|
|
{
|
|
|
- long i;
|
|
|
+ int i;
|
|
|
u8 clusters, max_cluster;
|
|
|
u8 id;
|
|
|
u8 cluster_cnt[NUM_APIC_CLUSTERS];
|
|
|
int max_apic = 0;
|
|
|
|
|
|
-#if defined(CONFIG_ACPI)
|
|
|
+#ifdef CONFIG_ACPI
|
|
|
/*
|
|
|
* Some x86_64 machines use physical APIC mode regardless of how many
|
|
|
* procs/clusters are present (x86_64 ES7000 is an example).
|
|
@@ -68,20 +67,17 @@ void __init clustered_apic_check(void)
|
|
|
cluster_cnt[APIC_CLUSTERID(id)]++;
|
|
|
}
|
|
|
|
|
|
- /* Don't use clustered mode on AMD platforms. */
|
|
|
+ /*
|
|
|
+ * Don't use clustered mode on AMD platforms, default
|
|
|
+ * to flat logical mode.
|
|
|
+ */
|
|
|
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
|
|
|
- genapic = &apic_physflat;
|
|
|
-#ifndef CONFIG_HOTPLUG_CPU
|
|
|
- /* In the CPU hotplug case we cannot use broadcast mode
|
|
|
- because that opens a race when a CPU is removed.
|
|
|
- Stay at physflat mode in this case.
|
|
|
- It is bad to do this unconditionally though. Once
|
|
|
- we have ACPI platform support for CPU hotplug
|
|
|
- we should detect hotplug capablity from ACPI tables and
|
|
|
- only do this when really needed. -AK */
|
|
|
- if (max_apic <= 8)
|
|
|
- genapic = &apic_flat;
|
|
|
-#endif
|
|
|
+ /*
|
|
|
+ * Switch to physical flat mode if more than 8 APICs
|
|
|
+ * (In the case of 8 CPUs APIC ID goes from 0 to 7):
|
|
|
+ */
|
|
|
+ if (max_apic >= 8)
|
|
|
+ genapic = &apic_physflat;
|
|
|
goto print;
|
|
|
}
|
|
|
|
|
@@ -103,14 +99,9 @@ void __init clustered_apic_check(void)
|
|
|
* (We don't use lowest priority delivery + HW APIC IRQ steering, so
|
|
|
* can ignore the clustered logical case and go straight to physical.)
|
|
|
*/
|
|
|
- if (clusters <= 1 && max_cluster <= 8 && cluster_cnt[0] == max_cluster) {
|
|
|
-#ifdef CONFIG_HOTPLUG_CPU
|
|
|
- /* Don't use APIC shortcuts in CPU hotplug to avoid races */
|
|
|
- genapic = &apic_physflat;
|
|
|
-#else
|
|
|
+ if (clusters <= 1 && max_cluster <= 8 && cluster_cnt[0] == max_cluster)
|
|
|
genapic = &apic_flat;
|
|
|
-#endif
|
|
|
- } else
|
|
|
+ else
|
|
|
genapic = &apic_cluster;
|
|
|
|
|
|
print:
|