Skip to content

Commit

Permalink
[PATCH] x86: sutomatically enable bigsmp when we have more than 8 CPUs
Browse files Browse the repository at this point in the history
i386 generic subarchitecture requires explicit dmi strings or command line
to enable bigsmp mode.  The patch below removes that restriction, and uses
bigsmp as soon as it finds more than 8 logical CPUs, Intel processors and
xAPIC support.

Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Venkatesh Pallipadi authored and Linus Torvalds committed Sep 5, 2005
1 parent 484b90c commit 911a62d
Show file tree
Hide file tree
Showing 8 changed files with 47 additions and 2 deletions.
3 changes: 3 additions & 0 deletions arch/i386/kernel/acpi/boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,9 @@ acpi_process_madt(void)
if (!error) {
acpi_lapic = 1;

#ifdef CONFIG_X86_GENERICARCH
generic_bigsmp_probe();
#endif
/*
* Parse MADT IO-APIC entries
*/
Expand Down
9 changes: 9 additions & 0 deletions arch/i386/kernel/mpparse.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ int nr_ioapics;
int pic_mode;
unsigned long mp_lapic_addr;

unsigned int def_to_bigsmp = 0;

/* Processor that is doing the boot up */
unsigned int boot_cpu_physical_apicid = -1U;
/* Internal processor count */
Expand Down Expand Up @@ -213,6 +215,13 @@ static 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;
}

Expand Down
8 changes: 7 additions & 1 deletion arch/i386/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -1585,8 +1585,14 @@ void __init setup_arch(char **cmdline_p)
*/
acpi_boot_table_init();
acpi_boot_init();
#endif

#if defined(CONFIG_SMP) && defined(CONFIG_X86_PC)
if (def_to_bigsmp)
printk(KERN_WARNING "More than 8 CPUs detected and "
"CONFIG_X86_PC cannot handle it.\nUse "
"CONFIG_X86_GENERICARCH or CONFIG_X86_BIGSMP.\n");
#endif
#endif
#ifdef CONFIG_X86_LOCAL_APIC
if (smp_found_config)
get_smp_config();
Expand Down
5 changes: 4 additions & 1 deletion arch/i386/mach-generic/bigsmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,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;
}

Expand Down
20 changes: 20 additions & 0 deletions arch/i386/mach-generic/probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,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);
}
}

void __init generic_apic_probe(char *command_line)
{
char *s;
Expand All @@ -52,6 +71,7 @@ void __init generic_apic_probe(char *command_line)
if (!changed)
printk(KERN_ERR "Unknown genapic `%s' specified.\n", s);
*p = old;
cmdline_apic = changed;
}
for (i = 0; !changed && apic_probe[i]; i++) {
if (apic_probe[i]->probe()) {
Expand Down
1 change: 1 addition & 0 deletions include/asm-i386/apicdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions include/asm-i386/mach-generic/mach_apic.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 change: 1 addition & 0 deletions include/asm-i386/mpspec.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 911a62d

Please sign in to comment.