# This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/04/22 23:31:42-04:00 len.brown@intel.com # [ACPI] Workaround "_BBN 0" BIOS bug # enhance "pci=noacpi" to skip ACPI PCI configuration and interrupt config # add "acpi=noirq" to skip just ACPI interrupt config # http://bugzilla.kernel.org/show_bug.cgi?id=1662 # # include/asm-x86_64/acpi.h # 2004/04/22 23:28:40-04:00 len.brown@intel.com +15 -1 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # include/asm-ia64/acpi.h # 2004/04/22 23:28:40-04:00 len.brown@intel.com +1 -0 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # include/asm-i386/acpi.h # 2004/04/22 23:28:40-04:00 len.brown@intel.com +14 -1 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # drivers/acpi/pci_root.c # 2004/04/22 23:28:40-04:00 len.brown@intel.com +9 -1 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # drivers/acpi/pci_link.c # 2004/04/22 23:28:40-04:00 len.brown@intel.com +1 -1 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # arch/x86_64/kernel/setup.c # 2004/04/22 23:28:40-04:00 len.brown@intel.com +6 -4 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # arch/i386/kernel/setup.c # 2004/04/22 23:28:40-04:00 len.brown@intel.com +6 -2 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # arch/i386/kernel/dmi_scan.c # 2004/04/22 23:28:40-04:00 len.brown@intel.com +17 -3 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # arch/i386/kernel/acpi/boot.c # 2004/04/22 23:28:40-04:00 len.brown@intel.com +6 -0 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # Documentation/kernel-parameters.txt # 2004/04/22 23:28:40-04:00 len.brown@intel.com +6 -4 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt --- a/Documentation/kernel-parameters.txt Thu Apr 22 23:31:49 2004 +++ b/Documentation/kernel-parameters.txt Thu Apr 22 23:31:49 2004 @@ -91,13 +91,14 @@ acpi= [HW,ACPI] Advanced Configuration and Power Interface Format: { force | off | ht | strict } - force -- enables ACPI for systems with default off - off -- disabled ACPI for systems with default on + force -- enable ACPI if default was off + off -- disable ACPI if default was on + noirq -- do not use ACPI for IRQ routing ht -- run only enough ACPI to enable Hyper Threading strict -- Be less tolerant of platforms that are not strictly ACPI specification compliant. - See also Documentation/pm.txt. + See also Documentation/pm.txt, pci=noacpi acpi_sleep= [HW,ACPI] Sleep options Format: { s3_bios, s3_mode } @@ -835,7 +836,8 @@ and Omnibook XE3 notebooks. This will have no effect if ACPI IRQ routing is enabled. - noacpi [IA-32] Do not use ACPI for IRQ routing. + noacpi [IA-32] Do not use ACPI for IRQ routing + or for PCI scanning. pcmv= [HW,PCMCIA] BadgePAD 4 diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c --- a/arch/i386/kernel/acpi/boot.c Thu Apr 22 23:31:49 2004 +++ b/arch/i386/kernel/acpi/boot.c Thu Apr 22 23:31:49 2004 @@ -53,7 +53,13 @@ #define PREFIX "ACPI: " +#ifdef CONFIG_ACPI_PCI int acpi_noirq __initdata; /* skip ACPI IRQ initialization */ +int acpi_pci_disabled __initdata; /* skip ACPI PCI scan and IRQ initialization */ +#else +int acpi_noirq __initdata = 1; +int acpi_pci_disabled __initdata = 1; +#endif int acpi_ht __initdata = 1; /* enable HT */ int acpi_lapic; diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c --- a/arch/i386/kernel/dmi_scan.c Thu Apr 22 23:31:49 2004 +++ b/arch/i386/kernel/dmi_scan.c Thu Apr 22 23:31:49 2004 @@ -531,12 +531,18 @@ #endif #ifdef CONFIG_ACPI_PCI +static __init int disable_acpi_irq(struct dmi_blacklist *d) +{ + printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n", d->ident); + acpi_noirq_set(); + return 0; +} static __init int disable_acpi_pci(struct dmi_blacklist *d) { printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", d->ident); - acpi_noirq_set(); + acpi_disable_pci(); return 0; -} +} #endif /* @@ -1007,13 +1013,21 @@ * Boxes that need ACPI PCI IRQ routing disabled */ - { disable_acpi_pci, "ASUS A7V", { + { disable_acpi_irq, "ASUS A7V", { MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"), MATCH(DMI_BOARD_NAME, ""), /* newer BIOS, Revision 1011, does work */ MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), NO_MATCH }}, + /* + * Boxes that need ACPI PCI IRQ routing and PCI scan disabled + */ + { disable_acpi_pci, "ASUS PR-DLS", { /* _BBN 0 bug */ + MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + MATCH(DMI_BOARD_NAME, "PR-DLS"), + MATCH(DMI_BIOS_VERSION, "ASUS PR-DLS ACPI BIOS Revision 1010"), + MATCH(DMI_BIOS_DATE, "03/21/2003") }}, #endif { NULL, } diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c --- a/arch/i386/kernel/setup.c Thu Apr 22 23:31:49 2004 +++ b/arch/i386/kernel/setup.c Thu Apr 22 23:31:49 2004 @@ -596,9 +596,13 @@ disable_acpi(); acpi_ht = 1; } - - /* "pci=noacpi" disables ACPI interrupt routing */ + + /* "pci=noacpi" disable ACPI IRQ routing and PCI scan */ else if (!memcmp(from, "pci=noacpi", 10)) { + acpi_disable_pci(); + } + /* "acpi=noirq" disables ACPI interrupt routing */ + else if (!memcmp(from, "acpi=noirq", 10)) { acpi_noirq_set(); } diff -Nru a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c --- a/arch/x86_64/kernel/setup.c Thu Apr 22 23:31:49 2004 +++ b/arch/x86_64/kernel/setup.c Thu Apr 22 23:31:49 2004 @@ -64,8 +64,8 @@ unsigned long mmu_cr4_features; EXPORT_SYMBOL_GPL(mmu_cr4_features); -int acpi_disabled = 0; - +int acpi_disabled; +EXPORT_SYMBOL(acpi_disabled); #ifdef CONFIG_ACPI_BOOT extern int __initdata acpi_ht; extern acpi_interrupt_flags acpi_sci_flags; @@ -217,7 +217,7 @@ #ifdef CONFIG_ACPI_BOOT /* "acpi=off" disables both ACPI table parsing and interpreter init */ if (!memcmp(from, "acpi=off", 8)) - acpi_disabled = 1; + disable_acpi(); if (!memcmp(from, "acpi=force", 10)) { /* add later when we do DMI horrors: */ @@ -231,7 +231,9 @@ acpi_ht = 1; } else if (!memcmp(from, "pci=noacpi", 10)) - acpi_noirq_set(); + acpi_disable_pci(); + else if (!memcmp(from, "acpi=noirq", 10)) + acpi_noirq_set(); else if (!memcmp(from, "acpi_sci=edge", 13)) acpi_sci_flags.trigger = 1; diff -Nru a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c --- a/drivers/acpi/pci_link.c Thu Apr 22 23:31:49 2004 +++ b/drivers/acpi/pci_link.c Thu Apr 22 23:31:49 2004 @@ -793,7 +793,7 @@ { ACPI_FUNCTION_TRACE("acpi_pci_link_init"); - if (acpi_disabled) + if (acpi_pci_disabled) return_VALUE(0); acpi_link.count = 0; diff -Nru a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c --- a/drivers/acpi/pci_root.c Thu Apr 22 23:31:49 2004 +++ b/drivers/acpi/pci_root.c Thu Apr 22 23:31:49 2004 @@ -119,6 +119,7 @@ { int result = 0; struct acpi_pci_root *root = NULL; + struct acpi_pci_root *tmp; acpi_status status = AE_OK; unsigned long value = 0; acpi_handle handle = NULL; @@ -186,6 +187,13 @@ goto end; } + /* Some systems have wrong _BBN */ + list_for_each_entry(tmp, &acpi_pci_roots, node) { + if ((tmp->id.segment == root->id.segment) + && (tmp->id.bus == root->id.bus)) + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, + "Wrong _BBN value, please reboot and using option 'pci=noacpi'\n")); + } /* * Device & Function * ----------------- @@ -272,7 +280,7 @@ { ACPI_FUNCTION_TRACE("acpi_pci_root_init"); - if (acpi_disabled) + if (acpi_pci_disabled) return_VALUE(0); /* DEBUG: diff -Nru a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h --- a/include/asm-i386/acpi.h Thu Apr 22 23:31:49 2004 +++ b/include/asm-i386/acpi.h Thu Apr 22 23:31:49 2004 @@ -109,7 +109,14 @@ extern int acpi_strict; extern int acpi_disabled; extern int acpi_ht; -static inline void disable_acpi(void) { acpi_disabled = 1; acpi_ht = 0; } +extern int acpi_pci_disabled; +static inline void disable_acpi(void) +{ + acpi_disabled = 1; + acpi_ht = 0; + acpi_pci_disabled = 1; + acpi_noirq = 1; +} /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ #define FIX_ACPI_PAGES 4 @@ -144,9 +151,15 @@ #ifdef CONFIG_ACPI_PCI static inline void acpi_noirq_set(void) { acpi_noirq = 1; } +static inline void acpi_disable_pci(void) +{ + acpi_pci_disabled = 1; + acpi_noirq_set(); +} extern int acpi_irq_balance_set(char *str); #else static inline void acpi_noirq_set(void) { } +static inline void acpi_disable_pci(void) { } static inline int acpi_irq_balance_set(char *str) { return 0; } #endif diff -Nru a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h --- a/include/asm-ia64/acpi.h Thu Apr 22 23:31:49 2004 +++ b/include/asm-ia64/acpi.h Thu Apr 22 23:31:49 2004 @@ -89,6 +89,7 @@ ((Acq) = ia64_acpi_release_global_lock((unsigned int *) GLptr)) #define acpi_disabled 0 /* ACPI always enabled on IA64 */ +#define acpi_pci_disabled 0 /* ACPI PCI always enabled on IA64 */ #define acpi_strict 1 /* no ACPI spec workarounds on IA64 */ static inline void disable_acpi(void) { } diff -Nru a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h --- a/include/asm-x86_64/acpi.h Thu Apr 22 23:31:49 2004 +++ b/include/asm-x86_64/acpi.h Thu Apr 22 23:31:49 2004 @@ -106,8 +106,15 @@ extern int acpi_noirq; extern int acpi_strict; extern int acpi_disabled; +extern int acpi_pci_disabled; extern int acpi_ht; -static inline void disable_acpi(void) { acpi_disabled = 1; acpi_ht = 0; } +static inline void disable_acpi(void) +{ + acpi_disabled = 1; + acpi_ht = 0; + acpi_pci_disabled = 1; + acpi_noirq = 1; +} /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ #define FIX_ACPI_PAGES 4 @@ -121,9 +128,15 @@ #ifdef CONFIG_ACPI_PCI static inline void acpi_noirq_set(void) { acpi_noirq = 1; } +static inline void acpi_disable_pci(void) +{ + acpi_pci_disabled = 1; + acpi_noirq_set(); +} extern int acpi_irq_balance_set(char *str); #else static inline void acpi_noirq_set(void) { } +static inline void acpi_disable_pci(void) { } static inline int acpi_irq_balance_set(char *str) { return 0; } #endif @@ -144,6 +157,7 @@ #define boot_cpu_physical_apicid boot_cpu_id extern int acpi_disabled; +extern int acpi_pci_disabled; #define dmi_broken (0) #define BROKEN_ACPI_Sx 0x0001