Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 53727
b: refs/heads/master
c: 07c7c47
h: refs/heads/master
i:
  53725: 4d71b8f
  53723: 1c7b11d
  53719: 932d9a0
  53711: df4501b
  53695: 1bb4f08
v: v3
  • Loading branch information
Ingo Molnar authored and Andi Kleen committed May 2, 2007
1 parent 1b38442 commit 074a11d
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 58 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f18d397e6aa5cde638d164b1d519c3ee903f4867
refs/heads/master: 07c7c4744400f93a7c52b32159c31d823e1747a5
71 changes: 15 additions & 56 deletions trunk/arch/x86_64/kernel/genapic.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,24 @@
#include <linux/threads.h>
#include <linux/cpumask.h>
#include <linux/string.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/ctype.h>
#include <linux/init.h>
#include <linux/module.h>

#include <asm/smp.h>
#include <asm/ipi.h>

#if defined(CONFIG_ACPI)
#ifdef CONFIG_ACPI
#include <acpi/acpi_bus.h>
#endif

/* which logical CPU number maps to which CPU (physical APIC ID) */
u8 x86_cpu_to_apicid[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID };
u8 x86_cpu_to_apicid[NR_CPUS] __read_mostly
= { [0 ... NR_CPUS-1] = BAD_APICID };
EXPORT_SYMBOL(x86_cpu_to_apicid);
u8 x86_cpu_to_log_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };

extern struct genapic apic_cluster;
extern struct genapic apic_flat;
extern struct genapic apic_physflat;
u8 x86_cpu_to_log_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };

struct genapic __read_mostly *genapic = &apic_flat;

Expand All @@ -39,76 +37,37 @@ struct genapic __read_mostly *genapic = &apic_flat;
*/
void __init clustered_apic_check(void)
{
int i;
u8 clusters, max_cluster;
unsigned int i, max_apic = 0;
u8 id;
u8 cluster_cnt[NUM_APIC_CLUSTERS];
int max_apic = 0;

#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).
* Quirk: some x86_64 machines can only use physical APIC mode
* regardless of how many processors are present (x86_64 ES7000
* is an example).
*/
if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID)
if (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL) {
genapic = &apic_cluster;
goto print;
}
if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID &&
(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL))
genapic = &apic_physflat;
#endif

memset(cluster_cnt, 0, sizeof(cluster_cnt));
for (i = 0; i < NR_CPUS; i++) {
id = bios_cpu_apicid[i];
if (id == BAD_APICID)
continue;
if (id > max_apic)
max_apic = id;
cluster_cnt[APIC_CLUSTERID(id)]++;
}

/*
* Don't use clustered mode on AMD platforms, default
* to flat logical mode.
*/
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
/*
* 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;
}

clusters = 0;
max_cluster = 0;

for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
if (cluster_cnt[i] > 0) {
++clusters;
if (cluster_cnt[i] > max_cluster)
max_cluster = cluster_cnt[i];
}
}

/*
* If we have clusters <= 1 and CPUs <= 8 in cluster 0, then flat mode,
* else if max_cluster <= 4 and cluster_cnt[15] == 0, clustered logical
* else physical mode.
* (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)
if (max_apic < 8)
genapic = &apic_flat;
else
genapic = &apic_cluster;
genapic = &apic_physflat;

print:
printk(KERN_INFO "Setting APIC routing to %s\n", genapic->name);
}

/* Same for both flat and clustered. */
/* Same for both flat and physical. */

void send_IPI_self(int vector)
{
Expand Down
4 changes: 3 additions & 1 deletion trunk/include/asm-x86_64/genapic.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ struct genapic {
unsigned int (*phys_pkg_id)(int index_msb);
};


extern struct genapic *genapic;

extern struct genapic apic_flat;
extern struct genapic apic_physflat;

#endif

0 comments on commit 074a11d

Please sign in to comment.