# 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, "<A7V>"),
 			/* 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
