
From: Andrey Panin <pazke@donpac.ru>


Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/i386/kernel/acpi/boot.c |  213 +++++++++++++++++++++++++++++++++++
 25-akpm/arch/i386/kernel/dmi_scan.c  |  213 -----------------------------------
 2 files changed, 214 insertions(+), 212 deletions(-)

diff -puN arch/i386/kernel/acpi/boot.c~dmi-port-acpi-boot-code-to-new-dmi-probing arch/i386/kernel/acpi/boot.c
--- 25/arch/i386/kernel/acpi/boot.c~dmi-port-acpi-boot-code-to-new-dmi-probing	Fri May 28 14:28:51 2004
+++ 25-akpm/arch/i386/kernel/acpi/boot.c	Fri May 28 14:28:51 2004
@@ -28,6 +28,7 @@
 #include <linux/acpi.h>
 #include <linux/efi.h>
 #include <linux/irq.h>
+#include <linux/dmi.h>
 #include <asm/pgtable.h>
 #include <asm/io_apic.h>
 #include <asm/apic.h>
@@ -768,6 +769,216 @@ acpi_process_madt(void)
 	return;
 }
 
+
+extern int acpi_force;
+
+static int __init dmi_disable_acpi(struct dmi_system_id *d)
+{
+	if (!acpi_force) {
+		printk(KERN_NOTICE "%s detected: acpi off\n", d->ident);
+		disable_acpi();
+	} else
+		printk(KERN_NOTICE "Warning: DMI blacklist says broken, but acpi forced\n");
+
+	return 0;
+}
+
+/* Limit ACPI to CPU enumeration for HT */
+static int __init force_acpi_ht(struct dmi_system_id *d)
+{
+	if (!acpi_force) {
+		printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident);
+		disable_acpi();
+		acpi_ht = 1;
+	} else
+		printk(KERN_NOTICE "Warning: acpi=force overrules DMI blacklist: acpi=ht\n");
+
+	return 0;
+}
+
+/*
+ * early nForce2 reference BIOS shipped with a
+ * bogus ACPI IRQ0 -> pin2 interrupt override -- ignore it
+ */
+static int __init ignore_timer_override(struct dmi_system_id *d)
+{
+	printk(KERN_NOTICE "%s detected: BIOS IRQ0 pin2 override"
+		" will be ignored\n", d->ident);
+
+	acpi_skip_timer_override = 1;
+	return 0;
+}
+
+/*
+ * If your system is blacklisted here, but you find that acpi=force
+ * works for you, please contact acpi-devel@sourceforge.net
+ */
+static struct dmi_system_id __initdata acpiboot_dmi_table[] = {
+	/* Boxes that need ACPI disabled */
+	{
+		dmi_disable_acpi, "IBM Thinkpad",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
+			DMI_MATCH(DMI_BOARD_NAME, "2629H1G"), },
+	},
+
+	/* Boxes that need acpi=ht */
+	{
+		force_acpi_ht, "FSC Primergy T850",
+		{	DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"), },
+	},
+	{
+		force_acpi_ht, "DELL GX240",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"),
+			DMI_MATCH(DMI_BOARD_NAME, "OptiPlex GX240"), },
+	},
+	{
+		force_acpi_ht, "HP VISUALIZE NT Workstation",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"), },
+	},
+	{
+		force_acpi_ht, "Compaq ProLiant DL380 G2",
+		{	DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380 G2"), },
+	},
+	{
+		force_acpi_ht, "Compaq ProLiant ML530 G2",
+		{	DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant ML530 G2"), },
+	},
+	{
+		force_acpi_ht, "Compaq ProLiant ML350 G3",
+		{	DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant ML350 G3"), },
+	},
+	{
+		force_acpi_ht, "Compaq Workstation W8000",
+		{	DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"), },
+	},
+	{
+		force_acpi_ht, "ASUS P4B266",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+			DMI_MATCH(DMI_BOARD_NAME, "P4B266"), },
+	},
+	{
+		force_acpi_ht, "ASUS P2B-DS",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+			DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"), },
+	},
+	{
+		force_acpi_ht, "ASUS CUR-DLS",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+			DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"), },
+	},
+	{
+		force_acpi_ht, "ABIT i440BX-W83977",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
+			DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"), },
+	},
+	{
+		force_acpi_ht, "IBM Bladecenter",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
+			DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"), },
+	},
+	{
+		force_acpi_ht, "IBM eServer xSeries 360",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
+			DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"), },
+	},
+	{
+		force_acpi_ht, "IBM eserver xSeries 330",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
+			DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"), },
+	},
+	{
+		force_acpi_ht, "IBM eserver xSeries 440",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), },
+	},
+
+	/*
+	 * Systems with nForce2 BIOS timer override bug
+	 * nVidia claims all nForce have timer on pin0,
+	 * and applying this workaround is a NOP on fixed BIOS,
+	 * so prospects are good for replacing these entries
+	 * with something to key of chipset PCI-ID.
+	 */
+	{
+		ignore_timer_override, "Abit NF7-S v2",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"),
+			DMI_MATCH(DMI_BOARD_NAME, "NF7-S/NF7,NF7-V (nVidia-nForce2)"),
+			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
+			DMI_MATCH(DMI_BIOS_DATE, "03/24/2004"), },
+	},
+	{
+		ignore_timer_override, "Asus A7N8X v2",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+			DMI_MATCH(DMI_BOARD_NAME, "A7N8X2.0"),
+			DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7N8X2.0 Deluxe ACPI BIOS Rev 1007"),
+			DMI_MATCH(DMI_BIOS_DATE, "10/06/2003"), },
+	},
+
+	{
+		ignore_timer_override, "Asus A7N8X-X",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+			DMI_MATCH(DMI_BOARD_NAME, "A7N8X-X"),
+			DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7N8X-X ACPI BIOS Rev 1009"),
+			DMI_MATCH(DMI_BIOS_DATE, "2/3/2004"), },
+	},
+	{
+		ignore_timer_override, "MSI K7N2-Delta",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
+			DMI_MATCH(DMI_BOARD_NAME, "MS-6570"),
+			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
+			DMI_MATCH(DMI_BIOS_DATE, "03/29/2004"), },
+	},
+	{
+		ignore_timer_override, "Shuttle SN41G2",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"),
+			DMI_MATCH(DMI_BOARD_NAME, "FN41"),
+			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
+			DMI_MATCH(DMI_BIOS_DATE, "01/14/2004"), },
+	},
+	{
+		ignore_timer_override, "Shuttle AN35N",
+		{	DMI_MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"),
+			DMI_MATCH(DMI_BOARD_NAME, "AN35"),
+			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
+			DMI_MATCH(DMI_BIOS_DATE, "12/05/2003"), },
+	},
+
+	{ },
+};
+
+#define	ACPI_BLACKLIST_CUTOFF_YEAR	2001
+
+static void __init acpi_boot_dmi_check(void)
+{
+	char *bios_date = dmi_get_system_info(DMI_BIOS_DATE);
+
+	if (bios_date) {
+		char *s = strrchr(bios_date, '/');
+
+		if (s) {
+			int disable = 0, year = simple_strtoul(++s, NULL, 0);
+
+			if (year >= 1000)
+				disable = year < ACPI_BLACKLIST_CUTOFF_YEAR;
+			else if (year < 1 || (year > 90 && year <= 99))
+				disable = 1;
+			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");
+				disable_acpi();
+			}
+		}
+	}
+
+	dmi_check_system(acpiboot_dmi_table);
+}
+
 /*
  * acpi_boot_init()
  *  called from setup_arch(), always.
@@ -793,6 +1004,8 @@ acpi_boot_init (void)
 {
 	int error;
 
+	acpi_boot_dmi_check();
+
 	/*
 	 * If acpi_disabled, bail out
 	 * One exception: acpi=ht continues far enough to enumerate LAPICs
diff -puN arch/i386/kernel/dmi_scan.c~dmi-port-acpi-boot-code-to-new-dmi-probing arch/i386/kernel/dmi_scan.c
--- 25/arch/i386/kernel/dmi_scan.c~dmi-port-acpi-boot-code-to-new-dmi-probing	Fri May 28 14:28:51 2004
+++ 25-akpm/arch/i386/kernel/dmi_scan.c	Fri May 28 14:28:51 2004
@@ -290,52 +290,6 @@ static __init int acer_cpufreq_pst(struc
 }
 
 
-#ifdef	CONFIG_ACPI_BOOT
-extern int acpi_force;
-
-static __init __attribute__((unused)) int dmi_disable_acpi(struct dmi_system_id *d)
-{ 
-	if (!acpi_force) { 
-		printk(KERN_NOTICE "%s detected: acpi off\n",d->ident); 
-		disable_acpi();
-	} else { 
-		printk(KERN_NOTICE 
-		       "Warning: DMI blacklist says broken, but acpi forced\n"); 
-	}
-	return 0;
-} 
-
-/*
- * Limit ACPI to CPU enumeration for HT
- */
-static __init __attribute__((unused)) int force_acpi_ht(struct dmi_system_id *d)
-{ 
-	if (!acpi_force) { 
-		printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident); 
-		disable_acpi();
-		acpi_ht = 1; 
-	} else { 
-		printk(KERN_NOTICE 
-		       "Warning: acpi=force overrules DMI blacklist: acpi=ht\n"); 
-	}
-	return 0;
-} 
-
-/*
- * early nForce2 reference BIOS shipped with a
- * bogus ACPI IRQ0 -> pin2 interrupt override -- ignore it
- */
-static __init int ignore_timer_override(struct dmi_system_id *d)
-{
-	extern int acpi_skip_timer_override;
-	printk(KERN_NOTICE "%s detected: BIOS IRQ0 pin2 override"
-		" will be ignored\n", d->ident); 	
-
-	acpi_skip_timer_override = 1;
-	return 0;
-}
-#endif
-
 #ifdef	CONFIG_ACPI_PCI
 static __init int disable_acpi_irq(struct dmi_system_id *d)
 { 
@@ -424,55 +378,6 @@ static __initdata struct dmi_system_id d
 			DMI_MATCH(DMI_BIOS_VERSION, "3A71"),
 			} },
 
-#ifdef	CONFIG_ACPI_BOOT
-	/*
-	 * If your system is blacklisted here, but you find that acpi=force
-	 * works for you, please contact acpi-devel@sourceforge.net
-	 */
-
-	/*
-	 *	Boxes that need ACPI disabled
-	 */
-
-	{ dmi_disable_acpi, "IBM Thinkpad", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-			DMI_MATCH(DMI_BOARD_NAME, "2629H1G"),
-			} },
-
-	/*
-	 *	Boxes that need acpi=ht 
-	 */
-
-	{ force_acpi_ht, "FSC Primergy T850", {
-			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),
-			}},
-
-	{ force_acpi_ht, "DELL GX240", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"),
-			DMI_MATCH(DMI_BOARD_NAME, "OptiPlex GX240"),
-			}},
-
-	{ force_acpi_ht, "HP VISUALIZE NT Workstation", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),
-			}},
-
-	{ force_acpi_ht, "Compaq ProLiant DL380 G2", {
-			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380 G2"),
-			}},
-
-	{ force_acpi_ht, "Compaq ProLiant ML530 G2", {
-			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant ML530 G2"),
-			}},
-
-	{ force_acpi_ht, "Compaq ProLiant ML350 G3", {
-			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant ML350 G3"),
-			}},
-
 #ifdef CONFIG_SERIO_I8042
 	{ set_8042_nomux, "Compaq Proliant 8500", {
 			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
@@ -481,95 +386,6 @@ static __initdata struct dmi_system_id d
 			}},
 #endif
 
-	{ force_acpi_ht, "Compaq Workstation W8000", {
-			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),
-			}},
-
-	{ force_acpi_ht, "ASUS P4B266", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-			DMI_MATCH(DMI_BOARD_NAME, "P4B266"),
-			}},
-
-	{ force_acpi_ht, "ASUS P2B-DS", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-			DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"),
-			}},
-
-	{ force_acpi_ht, "ASUS CUR-DLS", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-			DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"),
-			}},
-
-	{ force_acpi_ht, "ABIT i440BX-W83977", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
-			DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
-			}},
-
-	{ force_acpi_ht, "IBM Bladecenter", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-			DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),
-			}},
-
-	{ force_acpi_ht, "IBM eServer xSeries 360", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-			DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),
-			}},
-
-	{ force_acpi_ht, "IBM eserver xSeries 330", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-			DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),
-			}},
-
-	{ force_acpi_ht, "IBM eserver xSeries 440", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
-			}},
-
-	/*
-	 * Systems with nForce2 BIOS timer override bug
-	 * nVidia claims all nForce have timer on pin0,
-	 * and applying this workaround is a NOP on fixed BIOS,
-	 * so prospects are good for replacing these entries
-	 * with something to key of chipset PCI-ID.
-	 */
-	{ ignore_timer_override, "Abit NF7-S v2", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"),
-			DMI_MATCH(DMI_BOARD_NAME, "NF7-S/NF7,NF7-V (nVidia-nForce2)"),
-			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
-			DMI_MATCH(DMI_BIOS_DATE, "03/24/2004") }},
-
-	{ ignore_timer_override, "Asus A7N8X v2", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-			DMI_MATCH(DMI_BOARD_NAME, "A7N8X2.0"),
-			DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7N8X2.0 Deluxe ACPI BIOS Rev 1007"),
-			DMI_MATCH(DMI_BIOS_DATE, "10/06/2003") }},
-
-	{ ignore_timer_override, "Asus A7N8X-X", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-			DMI_MATCH(DMI_BOARD_NAME, "A7N8X-X"),
-			DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7N8X-X ACPI BIOS Rev 1009"),
-			DMI_MATCH(DMI_BIOS_DATE, "2/3/2004") }},
-
-	{ ignore_timer_override, "MSI K7N2-Delta", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
-			DMI_MATCH(DMI_BOARD_NAME, "MS-6570"),
-			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
-			DMI_MATCH(DMI_BIOS_DATE, "03/29/2004") }},
-
-	{ ignore_timer_override, "Shuttle SN41G2", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"),
-			DMI_MATCH(DMI_BOARD_NAME, "FN41"),
-			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
-			DMI_MATCH(DMI_BIOS_DATE, "01/14/2004") }},
-
-	{ ignore_timer_override, "Shuttle AN35N", {
-			DMI_MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"),
-			DMI_MATCH(DMI_BOARD_NAME, "AN35"),
-			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
-			DMI_MATCH(DMI_BIOS_DATE, "12/05/2003") }},
-#endif	// CONFIG_ACPI_BOOT
-
 #ifdef	CONFIG_ACPI_PCI
 	/*
 	 *	Boxes that need ACPI PCI IRQ routing disabled
@@ -645,33 +461,6 @@ char * dmi_get_system_info(int field)
 EXPORT_SYMBOL(dmi_get_system_info);
 
 
-static __init void dmi_check_blacklist(void)
-{
-#ifdef	CONFIG_ACPI_BOOT
-#define	ACPI_BLACKLIST_CUTOFF_YEAR	2001
-
-	if (dmi_ident[DMI_BIOS_DATE]) {
-		char *s = strrchr(dmi_ident[DMI_BIOS_DATE], '/');
-		if (s) {
-			int disable = 0, year = simple_strtoul(++s, NULL, 0);
-
-			if (year >= 1000)
-				disable = year < ACPI_BLACKLIST_CUTOFF_YEAR;
-			else if (year < 1 || (year > 90 && year <= 99))
-				disable = 1;
-			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");
-				disable_acpi();
-			}
-		}
-	}
-#endif
-	dmi_check_system(dmi_blacklist);
-}
-
-	
-
 /*
  *	Process a DMI table entry. Right now all we care about are the BIOS
  *	and machine entries. For 2.5 we should pull the smbus controller info
@@ -727,7 +516,7 @@ static void __init dmi_decode(struct dmi
 void __init dmi_scan_machine(void)
 {
 	if (!dmi_iterate(dmi_decode))
-		dmi_check_blacklist();
+		dmi_check_system(dmi_blacklist);
 	else
 		printk(KERN_INFO "DMI not present.\n");
 }
_
