Intel systems with more than 8 CPUs require that the APIC is configured

in clustered mode with the apic=bigsmp kernel parameter. This patch does
the APIC mode selection automatically without needing to manually specify
the kernel paremeter.

(KAF note: I see the patch is also present in Linux 2.6.14.2)

Signed-off-by: Nitin Kamble <nitin.a.kamble@intel.com>
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
This commit is contained in:
kaf24@firebug.cl.cam.ac.uk committed 2005-11-23 12:11:05 +01:00
1 parent 9d401b35f0
commit 39fcc013ef
7 files changed
+39 -3

No files matched your search

+2 -1
View File
@@ -602,7 +602,8 @@ acpi_process_madt(void)
error = acpi_parse_madt_lapic_entries();
if (!error) {
acpi_lapic = 1;
generic_bigsmp_probe();
/*
* Parse MADT IO-APIC entries
*/
+4 -1
View File
@@ -45,7 +45,10 @@ static struct dmi_system_id __initdata bigsmp_dmi_table[] = {
static __init int probe_bigsmp(void)
{
dmi_check_system(bigsmp_dmi_table);
if (def_to_bigsmp)
dmi_bigsmp = 1;
else
dmi_check_system(bigsmp_dmi_table);
return dmi_bigsmp;
}
+20 -1
View File
@@ -29,6 +29,25 @@ struct genapic *apic_probe[] __initdata = {
NULL,
};
static int cmdline_apic;
void __init generic_bigsmp_probe(void)
{
/*
* This routine is used to switch to bigsmp mode when
* - There is no apic= option specified by the user
* - generic_apic_probe() has choosen apic_default as the sub_arch
* - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support
*/
if (!cmdline_apic && genapic == &apic_default)
if (apic_bigsmp.probe()) {
genapic = &apic_bigsmp;
printk(KERN_INFO "Overriding APIC driver with %s\n",
genapic->name);
}
}
static void __init genapic_apic_force(char *str)
{
int i;
@@ -41,7 +60,7 @@ custom_param("apic", genapic_apic_force);
void __init generic_apic_probe(void)
{
int i;
int changed = (genapic != NULL);
int changed = cmdline_apic = (genapic != NULL);
for (i = 0; !changed && apic_probe[i]; i++) {
if (apic_probe[i]->probe()) {
+9
View File
@@ -63,6 +63,8 @@ int nr_ioapics;
int pic_mode;
unsigned long mp_lapic_addr;
unsigned int def_to_bigsmp;
/* Processor that is doing the boot up */
unsigned int boot_cpu_physical_apicid = -1U;
unsigned int boot_cpu_logical_apicid = -1U;
@@ -213,6 +215,13 @@ void __init MP_processor_info (struct mpc_config_processor *m)
ver = 0x10;
}
apic_version[m->mpc_apicid] = ver;
if ((num_processors > 8) &&
APIC_XAPIC(ver) &&
(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL))
def_to_bigsmp = 1;
else
def_to_bigsmp = 0;
bios_cpu_apicid[num_processors - 1] = m->mpc_apicid;
}
+1
View File
@@ -16,6 +16,7 @@
#define GET_APIC_VERSION(x) ((x)&0xFF)
#define GET_APIC_MAXLVT(x) (((x)>>16)&0xFF)
#define APIC_INTEGRATED(x) ((x)&0xF0)
#define APIC_XAPIC(x) ((x) >= 0x14)
#define APIC_TASKPRI 0x80
#define APIC_TPRI_MASK 0xFF
#define APIC_ARBPRI 0x90
@@ -28,4 +28,6 @@
#define enable_apic_mode (genapic->enable_apic_mode)
#define phys_pkg_id (genapic->phys_pkg_id)
extern void generic_bigsmp_probe(void);
#endif /* __ASM_MACH_APIC_H */
+1
View File
@@ -11,6 +11,7 @@ extern int mp_bus_id_to_local [MAX_MP_BUSSES];
extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES];
extern unsigned int def_to_bigsmp;
extern unsigned int boot_cpu_physical_apicid;
extern int smp_found_config;
extern void find_smp_config (void);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.