http://linux-acpi.bkbits.net/linux-acpi-test-2.6.5 len.brown@intel.com|ChangeSet|20040321053311|58781 len.brown diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c --- a/arch/i386/kernel/acpi/boot.c Sun Mar 21 00:23:54 2004 +++ b/arch/i386/kernel/acpi/boot.c Sun Mar 21 00:23:54 2004 @@ -668,7 +668,7 @@ */ error = acpi_table_init(); if (error) { - acpi_disabled = 1; + disable_acpi(); return error; } @@ -680,7 +680,7 @@ error = acpi_blacklisted(); if (error) { printk(KERN_WARNING PREFIX "BIOS listed in blacklist, disabling ACPI support\n"); - acpi_disabled = 1; + disable_acpi(); return error; } diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c --- a/arch/i386/kernel/dmi_scan.c Sun Mar 21 00:23:53 2004 +++ b/arch/i386/kernel/dmi_scan.c Sun Mar 21 00:23:53 2004 @@ -523,13 +523,13 @@ #ifdef CONFIG_ACPI_BOOT -extern int acpi_disabled, acpi_force; +extern int acpi_force; -static __init __attribute__((unused)) int disable_acpi(struct dmi_blacklist *d) +static __init __attribute__((unused)) int dmi_disable_acpi(struct dmi_blacklist *d) { if (!acpi_force) { printk(KERN_NOTICE "%s detected: acpi off\n",d->ident); - acpi_disabled = 1; + disable_acpi(); } else { printk(KERN_NOTICE "Warning: DMI blacklist says broken, but acpi forced\n"); @@ -537,8 +537,6 @@ return 0; } -extern int acpi_ht; - /* * Limit ACPI to CPU enumeration for HT */ @@ -546,7 +544,7 @@ { if (!acpi_force) { printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident); - acpi_disabled = 1; + disable_acpi(); acpi_ht = 1; } else { printk(KERN_NOTICE @@ -933,7 +931,7 @@ * Boxes that need ACPI disabled */ - { disable_acpi, "IBM Thinkpad", { + { dmi_disable_acpi, "IBM Thinkpad", { MATCH(DMI_BOARD_VENDOR, "IBM"), MATCH(DMI_BOARD_NAME, "2629H1G"), NO_MATCH, NO_MATCH }}, @@ -1063,8 +1061,7 @@ if (disable && !acpi_force) { printk(KERN_NOTICE "ACPI disabled because your bios is from %s and too old\n", s); printk(KERN_NOTICE "You can enable it with acpi=force\n"); - acpi_disabled = 1; - acpi_ht = 0; + disable_acpi(); } } } diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c --- a/arch/i386/kernel/mpparse.c Sun Mar 21 00:23:53 2004 +++ b/arch/i386/kernel/mpparse.c Sun Mar 21 00:23:53 2004 @@ -37,6 +37,7 @@ /* Have we found an MP table */ int smp_found_config; +unsigned int __initdata maxcpus = NR_CPUS; /* * Various Linux-internal data structures created from the @@ -168,8 +169,14 @@ } if (num_processors >= NR_CPUS) { - printk(KERN_WARNING "NR_CPUS limit of %i reached. Cannot " - "boot CPU(apicid 0x%x).\n", NR_CPUS, m->mpc_apicid); + printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached." + " Processor ignored.\n", NR_CPUS); + return; + } + + if (num_processors >= maxcpus) { + printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." + " Processor ignored.\n", maxcpus); return; } num_processors++; diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c --- a/arch/i386/kernel/setup.c Sun Mar 21 00:23:53 2004 +++ b/arch/i386/kernel/setup.c Sun Mar 21 00:23:53 2004 @@ -83,7 +83,6 @@ EXPORT_SYMBOL(acpi_disabled); #ifdef CONFIG_ACPI_BOOT -extern int __initdata acpi_ht; int __initdata acpi_force = 0; #endif @@ -560,17 +559,28 @@ } } +#ifdef CONFIG_SMP + /* + * If the BIOS enumerates physical processors before logical, + * maxcpus=N at enumeration-time can be used to disable HT. + */ + else if (!memcmp(from, "maxcpus=", 8)) { + extern unsigned int maxcpus; + + maxcpus = simple_strtoul(from + 8, NULL, 0); + } +#endif + #ifdef CONFIG_ACPI_BOOT /* "acpi=off" disables both ACPI table parsing and interpreter */ else if (!memcmp(from, "acpi=off", 8)) { - acpi_ht = 0; - acpi_disabled = 1; + disable_acpi(); } /* acpi=force to over-ride black-list */ else if (!memcmp(from, "acpi=force", 10)) { acpi_force = 1; - acpi_ht=1; + acpi_ht = 1; acpi_disabled = 0; } @@ -581,8 +591,9 @@ /* Limit ACPI just to boot-time to enable HT */ else if (!memcmp(from, "acpi=ht", 7)) { + if (!acpi_force) + disable_acpi(); acpi_ht = 1; - if (!acpi_force) acpi_disabled = 1; } /* "pci=noacpi" disables ACPI interrupt routing */ diff -Nru a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c --- a/arch/ia64/kernel/acpi.c Sun Mar 21 00:23:54 2004 +++ b/arch/ia64/kernel/acpi.c Sun Mar 21 00:23:54 2004 @@ -62,8 +62,6 @@ unsigned char acpi_kbd_controller_present = 1; unsigned char acpi_legacy_devices; -int acpi_disabled; /* XXX this shouldn't be needed---we can't boot without ACPI! */ - const char * acpi_get_sysname (void) { diff -Nru a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c --- a/arch/x86_64/kernel/mpparse.c Sun Mar 21 00:23:53 2004 +++ b/arch/x86_64/kernel/mpparse.c Sun Mar 21 00:23:53 2004 @@ -33,6 +33,7 @@ /* Have we found an MP table */ int smp_found_config; +unsigned int __initdata maxcpus = NR_CPUS; int acpi_found_madt; @@ -117,6 +118,17 @@ Dprintk(" Bootup CPU\n"); boot_cpu_id = m->mpc_apicid; } + if (num_processors >= NR_CPUS) { + printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached." + " Processor ignored.\n", NR_CPUS); + return; + } + if (num_processors >= maxcpus) { + printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." + " Processor ignored.\n", maxcpus); + return; + } + num_processors++; if (m->mpc_apicid > MAX_APICS) { diff -Nru a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c --- a/arch/x86_64/kernel/setup.c Sun Mar 21 00:23:53 2004 +++ b/arch/x86_64/kernel/setup.c Sun Mar 21 00:23:53 2004 @@ -201,7 +201,18 @@ for (;;) { if (c != ' ') goto next_char; - + +#ifdef CONFIG_SMP + /* + * If the BIOS enumerates physical processors before logical, + * maxcpus=N at enumeration-time can be used to disable HT. + */ + else if (!memcmp(from, "maxcpus=", 8)) { + extern unsigned int maxcpus; + + maxcpus = simple_strtoul(from + 8, NULL, 0); + } +#endif #ifdef CONFIG_ACPI_BOOT /* "acpi=off" disables both ACPI table parsing and interpreter init */ if (!memcmp(from, "acpi=off", 8)) diff -Nru a/drivers/acpi/bus.c b/drivers/acpi/bus.c --- a/drivers/acpi/bus.c Sun Mar 21 00:23:54 2004 +++ b/drivers/acpi/bus.c Sun Mar 21 00:23:54 2004 @@ -704,29 +704,14 @@ pm_active = 1; else { printk(KERN_INFO PREFIX "APM is already active, exiting\n"); - acpi_disabled = 1; + disable_acpi(); result = -ENODEV; } #endif } else - acpi_disabled = 1; + disable_acpi(); return_VALUE(result); } - -static int __init acpi_setup(char *str) -{ - while (str && *str) { - if (strncmp(str, "off", 3) == 0) - acpi_disabled = 1; - str = strchr(str, ','); - if (str) - str += strspn(str, ", \t"); - } - return 1; -} - subsys_initcall(acpi_init); - -__setup("acpi=", acpi_setup); diff -Nru a/drivers/acpi/numa.c b/drivers/acpi/numa.c --- a/drivers/acpi/numa.c Sun Mar 21 00:23:54 2004 +++ b/drivers/acpi/numa.c Sun Mar 21 00:23:54 2004 @@ -32,12 +32,19 @@ #include #include +#define ACPI_NUMA 0x80000000 +#define _COMPONENT ACPI_NUMA + ACPI_MODULE_NAME ("numa") + extern int __init acpi_table_parse_madt_family (enum acpi_table_id id, unsigned long madt_size, int entry_id, acpi_madt_entry_handler handler, unsigned int max_entries); void __init acpi_table_print_srat_entry ( acpi_table_entry_header *header) { + + ACPI_FUNCTION_NAME ("acpi_table_print_srat_entry"); + if (!header) return; @@ -47,7 +54,7 @@ { struct acpi_table_processor_affinity *p = (struct acpi_table_processor_affinity*) header; - ACPI_DEBUG_PRINT((ACPI_DB_INFO "SRAT Processor (id[0x%02x] eid[0x%02x]) in proximity domain %d %s\n", + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "SRAT Processor (id[0x%02x] eid[0x%02x]) in proximity domain %d %s\n", p->apic_id, p->lsapic_eid, p->proximity_domain, p->flags.enabled?"enabled":"disabled")); } @@ -57,7 +64,7 @@ { struct acpi_table_memory_affinity *p = (struct acpi_table_memory_affinity*) header; - ACPI_DEBUG_PRINT((ACPI_DB_INFO "SRAT Memory (0x%08x%08x length 0x%08x%08x type 0x%x) in proximity domain %d %s%s\n", + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "SRAT Memory (0x%08x%08x length 0x%08x%08x type 0x%x) in proximity domain %d %s%s\n", p->base_addr_hi, p->base_addr_lo, p->length_hi, p->length_lo, p->memory_type, p->proximity_domain, p->flags.enabled ? "enabled" : "disabled", diff -Nru a/drivers/char/sonypi.h b/drivers/char/sonypi.h --- a/drivers/char/sonypi.h Sun Mar 21 00:23:54 2004 +++ b/drivers/char/sonypi.h Sun Mar 21 00:23:54 2004 @@ -396,7 +396,6 @@ } #ifdef CONFIG_ACPI -extern int acpi_disabled; #define SONYPI_ACPI_ACTIVE (!acpi_disabled) #else #define SONYPI_ACPI_ACTIVE 0 diff -Nru a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h --- a/include/acpi/acpi_bus.h Sun Mar 21 00:23:54 2004 +++ b/include/acpi/acpi_bus.h Sun Mar 21 00:23:54 2004 @@ -32,8 +32,6 @@ #define PREFIX "ACPI: " -extern int acpi_disabled; - /* TBD: Make dynamic */ #define ACPI_MAX_HANDLES 10 struct acpi_handle_list { diff -Nru a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h --- a/include/asm-i386/acpi.h Sun Mar 21 00:23:54 2004 +++ b/include/asm-i386/acpi.h Sun Mar 21 00:23:54 2004 @@ -116,6 +116,9 @@ extern int acpi_ioapic; extern int acpi_noirq; extern int acpi_strict; +extern int acpi_disabled; +extern int acpi_ht; +static inline void disable_acpi(void) { acpi_disabled = 1; acpi_ht = 0; } /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ #define FIX_ACPI_PAGES 4 diff -Nru a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h --- a/include/asm-ia64/acpi.h Sun Mar 21 00:23:54 2004 +++ b/include/asm-ia64/acpi.h Sun Mar 21 00:23:54 2004 @@ -88,7 +88,9 @@ #define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ ((Acq) = ia64_acpi_release_global_lock((unsigned int *) GLptr)) +#define acpi_disabled 0 /* ACPI always enabled on IA64 */ #define acpi_strict 1 /* no ACPI spec workarounds on IA64 */ +static inline void disable_acpi(void) { } const char *acpi_get_sysname (void); int acpi_request_vector (u32 int_type); diff -Nru a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h --- a/include/asm-x86_64/acpi.h Sun Mar 21 00:23:54 2004 +++ b/include/asm-x86_64/acpi.h Sun Mar 21 00:23:54 2004 @@ -105,6 +105,9 @@ extern int acpi_ioapic; extern int acpi_noirq; extern int acpi_strict; +extern int acpi_disabled; +extern int acpi_ht; +static inline void disable_acpi(void) { acpi_disabled = 1; acpi_ht = 0; } /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ #define FIX_ACPI_PAGES 4