lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1310994528-26276-4-git-send-email-prarit@redhat.com>
Date:	Mon, 18 Jul 2011 09:08:17 -0400
From:	Prarit Bhargava <prarit@...hat.com>
To:	linux-kernel@...r.kernel.org
Cc:	Prarit Bhargava <prarit@...hat.com>, linux-ia64@...r.kernel.org,
	x86@...nel.org
Subject: [PATCH 03/34] arch specific changes for SMBIOS and System Firmware

As part of the new SMBIOS and System Firmware code:

- add in ia64 and x86 calls to initialize SMBIOS
- Replace old dmi* structures and functions with new sysfw* and smbios*
structures and functions in individual drivers
- cleanup sysfw_id lookup tables
- cleanup of includes for dmi.h and mod_devicetable.h which were included in
some files that did not need them

Cc: linux-ia64@...r.kernel.org
Cc: x86@...nel.org
Signed-off-by: Prarit Bhargava <prarit@...hat.com>
---
 arch/ia64/kernel/setup.c           |    8 +-
 arch/x86/include/asm/mmconfig.h    |    4 +-
 arch/x86/include/asm/pci_x86.h     |    6 +-
 arch/x86/kernel/acpi/boot.c        |  177 ++++++++--------
 arch/x86/kernel/acpi/sleep.c       |    1 -
 arch/x86/kernel/apic/apic.c        |   20 +-
 arch/x86/kernel/apic/bigsmp_32.c   |   37 ++--
 arch/x86/kernel/apm_32.c           |  391 ++++++++++++++++++++++--------------
 arch/x86/kernel/cpu/amd.c          |    2 +-
 arch/x86/kernel/cpu/vmware.c       |   17 ++-
 arch/x86/kernel/io_delay.c         |   42 ++--
 arch/x86/kernel/mmconf-fam10h_64.c |   28 ++--
 arch/x86/kernel/probe_roms.c       |    1 -
 arch/x86/kernel/process.c          |    8 +-
 arch/x86/kernel/reboot.c           |  132 +++++++------
 arch/x86/kernel/setup.c            |   14 +-
 arch/x86/kernel/tsc.c              |   16 +-
 arch/x86/pci/acpi.c                |   18 +-
 arch/x86/pci/broadcom_bus.c        |    1 -
 arch/x86/pci/common.c              |  163 ++++++++--------
 arch/x86/pci/direct.c              |    7 +-
 arch/x86/pci/fixup.c               |   33 ++--
 arch/x86/pci/init.c                |    4 +-
 arch/x86/pci/irq.c                 |   26 ++--
 arch/x86/pci/mmconfig-shared.c     |   10 +-
 arch/x86/pci/mrst.c                |    1 -
 drivers/cpufreq/acpi-cpufreq.c     |   16 +-
 drivers/cpufreq/powernow-k7.c      |   14 +-
 28 files changed, 657 insertions(+), 540 deletions(-)

diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
index 5e2c724..e170fcc 100644
--- a/arch/ia64/kernel/setup.c
+++ b/arch/ia64/kernel/setup.c
@@ -36,7 +36,7 @@
 #include <linux/string.h>
 #include <linux/threads.h>
 #include <linux/screen_info.h>
-#include <linux/dmi.h>
+#include <linux/smbios.h>
 #include <linux/serial.h>
 #include <linux/serial_core.h>
 #include <linux/efi.h>
@@ -1043,9 +1043,9 @@ check_bugs (void)
 			       (unsigned long) __end___mckinley_e9_bundles);
 }
 
-static int __init run_dmi_scan(void)
+static int __init run_smbios_scan(void)
 {
-	dmi_scan_machine();
+	smbios_init();
 	return 0;
 }
-core_initcall(run_dmi_scan);
+core_initcall(run_smbios_scan);
diff --git a/arch/x86/include/asm/mmconfig.h b/arch/x86/include/asm/mmconfig.h
index 9b119da..1831965 100644
--- a/arch/x86/include/asm/mmconfig.h
+++ b/arch/x86/include/asm/mmconfig.h
@@ -3,10 +3,10 @@
 
 #ifdef CONFIG_PCI_MMCONFIG
 extern void __cpuinit fam10h_check_enable_mmcfg(void);
-extern void __cpuinit check_enable_amd_mmconf_dmi(void);
+extern void __cpuinit check_enable_amd_pci_mmconf(void);
 #else
 static inline void fam10h_check_enable_mmcfg(void) { }
-static inline void check_enable_amd_mmconf_dmi(void) { }
+static inline void check_enable_amd_pci_mmconf(void) { }
 #endif
 
 #endif /* _ASM_X86_MMCONFIG_H */
diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h
index 7045267..28e3f3a 100644
--- a/arch/x86/include/asm/pci_x86.h
+++ b/arch/x86/include/asm/pci_x86.h
@@ -39,7 +39,7 @@ enum pci_bf_sort_state {
 	pci_bf_sort_default,
 	pci_force_nobf,
 	pci_force_bf,
-	pci_dmi_bf,
+	pci_smbios_bf,
 };
 
 /* pci-i386.c */
@@ -109,8 +109,8 @@ extern bool port_cf9_safe;
 extern int pci_direct_probe(void);
 extern void pci_direct_init(int type);
 extern void pci_pcbios_init(void);
-extern void __init dmi_check_pciprobe(void);
-extern void __init dmi_check_skip_isa_align(void);
+extern void __init smbios_check_pciprobe(void);
+extern void __init smbios_check_skip_isa_align(void);
 
 /* some common used subsys_initcalls */
 extern int __init pci_acpi_init(void);
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 4558f0d..180d4c7 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -29,7 +29,7 @@
 #include <linux/efi.h>
 #include <linux/cpumask.h>
 #include <linux/module.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/irq.h>
 #include <linux/slab.h>
 #include <linux/bootmem.h>
@@ -1294,7 +1294,7 @@ static void __init acpi_process_madt(void)
 	return;
 }
 
-static int __init disable_acpi_irq(const struct dmi_system_id *d)
+static int __init disable_acpi_irq(const struct sysfw_id *d)
 {
 	if (!acpi_force) {
 		printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n",
@@ -1304,7 +1304,7 @@ static int __init disable_acpi_irq(const struct dmi_system_id *d)
 	return 0;
 }
 
-static int __init disable_acpi_pci(const struct dmi_system_id *d)
+static int __init disable_acpi_pci(const struct sysfw_id *d)
 {
 	if (!acpi_force) {
 		printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n",
@@ -1314,14 +1314,14 @@ static int __init disable_acpi_pci(const struct dmi_system_id *d)
 	return 0;
 }
 
-static int __init dmi_disable_acpi(const struct dmi_system_id *d)
+static int __init id_disable_acpi(const struct sysfw_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");
+		printk(KERN_NOTICE "Warning: SMBIOS blacklist says broken, "
+		       "but acpi forced\n");
 	}
 	return 0;
 }
@@ -1329,7 +1329,8 @@ static int __init dmi_disable_acpi(const struct dmi_system_id *d)
 /*
  * Force ignoring BIOS IRQ0 pin2 override
  */
-static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
+static int __init
+id_ignore_irq0_timer_override(const struct sysfw_id *d)
 {
 	/*
 	 * The ati_ixp4x0_rev() early PCI quirk should have set
@@ -1348,33 +1349,32 @@ static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
  * If your system is blacklisted here, but you find that acpi=force
  * works for you, please contact linux-acpi@...r.kernel.org
  */
-static struct dmi_system_id __initdata acpi_dmi_table[] = {
+static struct sysfw_id __initdata acpi_id_table[] = {
 	/*
 	 * Boxes that need ACPI disabled
 	 */
 	{
-	 .callback = dmi_disable_acpi,
-	 .ident = "IBM Thinkpad",
-	 .matches = {
-		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-		     DMI_MATCH(DMI_BOARD_NAME, "2629H1G"),
-		     },
+		.callback = id_disable_acpi,
+		.ident = "IBM Thinkpad",
+		.matches = {
+			     SYSFW_MATCH(SYSFW_BOARD_VENDOR, "IBM"),
+			     SYSFW_MATCH(SYSFW_BOARD_NAME, "2629H1G"),
+		},
 	 },
-
 	/*
 	 * Boxes that need ACPI PCI IRQ routing disabled
 	 */
 	{
-	 .callback = disable_acpi_irq,
-	 .ident = "ASUS A7V",
-	 .matches = {
-		     DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
-		     DMI_MATCH(DMI_BOARD_NAME, "<A7V>"),
-		     /* newer BIOS, Revision 1011, does work */
-		     DMI_MATCH(DMI_BIOS_VERSION,
-			       "ASUS A7V ACPI BIOS Revision 1007"),
-		     },
-	 },
+		.callback = disable_acpi_irq,
+		.ident = "ASUS A7V",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "ASUSTeK Computer INC"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "<A7V>"),
+			/* newer BIOS, Revision 1011, does work */
+			SYSFW_MATCH(SYSFW_BIOS_VERSION,
+				    "ASUS A7V ACPI BIOS Revision 1007"),
+			},
+	},
 	{
 		/*
 		 * Latest BIOS for IBM 600E (1.16) has bad pcinum
@@ -1382,48 +1382,49 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
 		 * interrupt links to work. DSDT fix is in bug 5966.
 		 * 2645, 2646 model numbers are shared with 600/600E/600X
 		 */
-	 .callback = disable_acpi_irq,
-	 .ident = "IBM Thinkpad 600 Series 2645",
-	 .matches = {
-		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-		     DMI_MATCH(DMI_BOARD_NAME, "2645"),
-		     },
-	 },
+		.callback = disable_acpi_irq,
+		.ident = "IBM Thinkpad 600 Series 2645",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "IBM"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "2645"),
+		},
+	},
 	{
-	 .callback = disable_acpi_irq,
-	 .ident = "IBM Thinkpad 600 Series 2646",
-	 .matches = {
-		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-		     DMI_MATCH(DMI_BOARD_NAME, "2646"),
-		     },
-	 },
+		.callback = disable_acpi_irq,
+		.ident = "IBM Thinkpad 600 Series 2646",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "IBM"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "2646"),
+		},
+	},
 	/*
 	 * Boxes that need ACPI PCI IRQ routing and PCI scan disabled
 	 */
 	{			/* _BBN 0 bug */
-	 .callback = disable_acpi_pci,
-	 .ident = "ASUS PR-DLS",
-	 .matches = {
-		     DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-		     DMI_MATCH(DMI_BOARD_NAME, "PR-DLS"),
-		     DMI_MATCH(DMI_BIOS_VERSION,
-			       "ASUS PR-DLS ACPI BIOS Revision 1010"),
-		     DMI_MATCH(DMI_BIOS_DATE, "03/21/2003")
-		     },
-	 },
+		.callback = disable_acpi_pci,
+		.ident = "ASUS PR-DLS",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR,
+				    "ASUSTeK Computer INC."),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "PR-DLS"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION,
+				    "ASUS PR-DLS ACPI BIOS Revision 1010"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "03/21/2003")
+		},
+	},
 	{
-	 .callback = disable_acpi_pci,
-	 .ident = "Acer TravelMate 36x Laptop",
-	 .matches = {
-		     DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
-		     DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
-		     },
-	 },
+		.callback = disable_acpi_pci,
+		.ident = "Acer TravelMate 36x Laptop",
+		.matches = {
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Acer"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "TravelMate 360"),
+			},
+		},
 	{}
 };
 
-/* second table for DMI checks that should run after early-quirks */
-static struct dmi_system_id __initdata acpi_dmi_table_late[] = {
+/* second table for SMBIOS checks that should run after early-quirks */
+static struct sysfw_id __initdata acpi_id_late[] = {
 	/*
 	 * HP laptops which use a DSDT reporting as HP/SB400/10000,
 	 * which includes some code which overrides all temperature
@@ -1435,37 +1436,37 @@ static struct dmi_system_id __initdata acpi_dmi_table_late[] = {
 	 * override in that cases.
 	 */
 	{
-	 .callback = dmi_ignore_irq0_timer_override,
-	 .ident = "HP nx6115 laptop",
-	 .matches = {
-		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-		     DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6115"),
-		     },
-	 },
+		.callback = id_ignore_irq0_timer_override,
+		.ident = "HP nx6115 laptop",
+		.matches = {
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Hewlett-Packard"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "HP Compaq nx6115"),
+		},
+	},
 	{
-	 .callback = dmi_ignore_irq0_timer_override,
-	 .ident = "HP NX6125 laptop",
-	 .matches = {
-		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-		     DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6125"),
-		     },
-	 },
+		.callback = id_ignore_irq0_timer_override,
+		.ident = "HP NX6125 laptop",
+		.matches = {
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Hewlett-Packard"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "HP Compaq nx6125"),
+		},
+	},
 	{
-	 .callback = dmi_ignore_irq0_timer_override,
-	 .ident = "HP NX6325 laptop",
-	 .matches = {
-		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-		     DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"),
-		     },
-	 },
+		.callback = id_ignore_irq0_timer_override,
+		.ident = "HP NX6325 laptop",
+		.matches = {
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Hewlett-Packard"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "HP Compaq nx6325"),
+		},
+	},
 	{
-	 .callback = dmi_ignore_irq0_timer_override,
-	 .ident = "HP 6715b laptop",
-	 .matches = {
-		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-		     DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"),
-		     },
-	 },
+		.callback = id_ignore_irq0_timer_override,
+		.ident = "HP 6715b laptop",
+		.matches = {
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Hewlett-Packard"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "HP Compaq 6715b"),
+		},
+	},
 	{}
 };
 
@@ -1490,7 +1491,7 @@ static struct dmi_system_id __initdata acpi_dmi_table_late[] = {
 
 void __init acpi_boot_table_init(void)
 {
-	dmi_check_system(acpi_dmi_table);
+	sysfw_callback(acpi_id_table);
 
 	/*
 	 * If acpi_disabled, bail out
@@ -1541,7 +1542,7 @@ int __init early_acpi_boot_init(void)
 int __init acpi_boot_init(void)
 {
 	/* those are executed after early-quirks are executed */
-	dmi_check_system(acpi_dmi_table_late);
+	sysfw_callback(acpi_id_late);
 
 	/*
 	 * If acpi_disabled, bail out
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 103b6ab..c96b82d 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -8,7 +8,6 @@
 #include <linux/acpi.h>
 #include <linux/bootmem.h>
 #include <linux/memblock.h>
-#include <linux/dmi.h>
 #include <linux/cpumask.h>
 #include <asm/segment.h>
 #include <asm/desc.h>
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index b9338b8..a3a176d 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -30,7 +30,7 @@
 #include <linux/dmar.h>
 #include <linux/init.h>
 #include <linux/cpu.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/smp.h>
 #include <linux/mm.h>
 
@@ -162,7 +162,7 @@ early_param("nox2apic", setup_nox2apic);
 
 unsigned long mp_lapic_addr;
 int disable_apic;
-/* Disable local APIC timer from the kernel commandline or via dmi quirk */
+/* Disable local APIC timer from the kernel commandline or via smbios quirk */
 static int disable_apic_timer __initdata;
 /* Local APIC timer works in C2 */
 int local_apic_timer_c2_ok;
@@ -2231,7 +2231,7 @@ static int __cpuinit apic_cluster_num(void)
 static int __cpuinitdata multi_checked;
 static int __cpuinitdata multi;
 
-static int __cpuinit set_multi(const struct dmi_system_id *d)
+static int __cpuinit set_multi(const struct sysfw_id *d)
 {
 	if (multi)
 		return 0;
@@ -2240,24 +2240,24 @@ static int __cpuinit set_multi(const struct dmi_system_id *d)
 	return 0;
 }
 
-static const __cpuinitconst struct dmi_system_id multi_dmi_table[] = {
+static const __cpuinitconst struct sysfw_id set_multi_table[] = {
 	{
 		.callback = set_multi,
 		.ident = "IBM System Summit2",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Summit2"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "IBM"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Summit2"),
 		},
 	},
 	{}
 };
 
-static void __cpuinit dmi_check_multi(void)
+static void __cpuinit check_set_multi(void)
 {
 	if (multi_checked)
 		return;
 
-	dmi_check_system(multi_dmi_table);
+	sysfw_callback(set_multi_table);
 	multi_checked = 1;
 }
 
@@ -2267,11 +2267,11 @@ static void __cpuinit dmi_check_multi(void)
  * Thus far, the major user of this is IBM's Summit2 series:
  * Clustered boxes may have unsynced TSC problems if they are
  * multi-chassis.
- * Use DMI to check them
+ * Use SMBIOS to check them
  */
 __cpuinit int apic_is_clustered_box(void)
 {
-	dmi_check_multi();
+	check_set_multi();
 	if (multi)
 		return 1;
 
diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c
index efd737e..76bee5d 100644
--- a/arch/x86/kernel/apic/bigsmp_32.c
+++ b/arch/x86/kernel/apic/bigsmp_32.c
@@ -7,7 +7,7 @@
 #include <linux/cpumask.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/smp.h>
 
 #include <asm/apicdef.h>
@@ -151,30 +151,35 @@ static void bigsmp_send_IPI_all(int vector)
 	bigsmp_send_IPI_mask(cpu_online_mask, vector);
 }
 
-static int dmi_bigsmp; /* can be set by dmi scanners */
+static int smbios_bigsmp; /* can be set by smbios scanners */
 
-static int hp_ht_bigsmp(const struct dmi_system_id *d)
+static int hp_ht_bigsmp(const struct sysfw_id *d)
 {
 	printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident);
-	dmi_bigsmp = 1;
+	smbios_bigsmp = 1;
 
 	return 0;
 }
 
 
-static const struct dmi_system_id bigsmp_dmi_table[] = {
-	{ hp_ht_bigsmp, "HP ProLiant DL760 G2",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "HP"),
-			DMI_MATCH(DMI_BIOS_VERSION, "P44-"),
+static const struct sysfw_id bigsmp_id_table[] = {
+	{
+		.callback = hp_ht_bigsmp,
+		.ident = "HP ProLiant DL760 G2",
+		{
+			SYSFW_MATCH(SYSFW_BIOS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "P44-"),
 		}
 	},
-
-	{ hp_ht_bigsmp, "HP ProLiant DL740",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "HP"),
-			DMI_MATCH(DMI_BIOS_VERSION, "P47-"),
+	{
+		.callback = hp_ht_bigsmp,
+		.ident = "HP ProLiant DL740",
+		{
+			SYSFW_MATCH(SYSFW_BIOS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "P47-"),
 		}
 	},
-	{ } /* NULL entry stops DMI scanning */
+	{} /* NULL entry stops SMBIOS scanning */
 };
 
 static void bigsmp_vector_allocation_domain(int cpu, struct cpumask *retmask)
@@ -186,11 +191,11 @@ static void bigsmp_vector_allocation_domain(int cpu, struct cpumask *retmask)
 static int probe_bigsmp(void)
 {
 	if (def_to_bigsmp)
-		dmi_bigsmp = 1;
+		smbios_bigsmp = 1;
 	else
-		dmi_check_system(bigsmp_dmi_table);
+		sysfw_callback(bigsmp_id_table);
 
-	return dmi_bigsmp;
+	return smbios_bigsmp;
 }
 
 static struct apic apic_bigsmp = {
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
index 965a766..dd804ef 100644
--- a/arch/x86/kernel/apm_32.c
+++ b/arch/x86/kernel/apm_32.c
@@ -223,7 +223,7 @@
 #include <linux/kernel.h>
 #include <linux/freezer.h>
 #include <linux/smp.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/suspend.h>
 #include <linux/kthread.h>
 #include <linux/jiffies.h>
@@ -1931,7 +1931,7 @@ static struct miscdevice apm_device = {
 
 
 /* Simple "print if true" callback */
-static int __init print_if_true(const struct dmi_system_id *d)
+static int __init print_if_true(const struct sysfw_id *d)
 {
 	printk("%s\n", d->ident);
 	return 0;
@@ -1941,7 +1941,7 @@ static int __init print_if_true(const struct dmi_system_id *d)
  * Some Bioses enable the PS/2 mouse (touchpad) at resume, even if it was
  * disabled before the suspend. Linux used to get terribly confused by that.
  */
-static int __init broken_ps2_resume(const struct dmi_system_id *d)
+static int __init broken_ps2_resume(const struct sysfw_id *d)
 {
 	printk(KERN_INFO "%s machine detected. Mousepad Resume Bug "
 	       "workaround hopefully not needed.\n", d->ident);
@@ -1949,7 +1949,7 @@ static int __init broken_ps2_resume(const struct dmi_system_id *d)
 }
 
 /* Some bioses have a broken protected mode poweroff and need to use realmode */
-static int __init set_realmode_power_off(const struct dmi_system_id *d)
+static int __init set_realmode_power_off(const struct sysfw_id *d)
 {
 	if (apm_info.realmode_power_off == 0) {
 		apm_info.realmode_power_off = 1;
@@ -1960,7 +1960,7 @@ static int __init set_realmode_power_off(const struct dmi_system_id *d)
 }
 
 /* Some laptops require interrupts to be enabled during APM calls */
-static int __init set_apm_ints(const struct dmi_system_id *d)
+static int __init set_apm_ints(const struct sysfw_id *d)
 {
 	if (apm_info.allow_ints == 0) {
 		apm_info.allow_ints = 1;
@@ -1971,7 +1971,7 @@ static int __init set_apm_ints(const struct dmi_system_id *d)
 }
 
 /* Some APM bioses corrupt memory or just plain do not work */
-static int __init apm_is_horked(const struct dmi_system_id *d)
+static int __init apm_is_horked(const struct sysfw_id *d)
 {
 	if (apm_info.disabled == 0) {
 		apm_info.disabled = 1;
@@ -1981,7 +1981,7 @@ static int __init apm_is_horked(const struct dmi_system_id *d)
 	return 0;
 }
 
-static int __init apm_is_horked_d850md(const struct dmi_system_id *d)
+static int __init apm_is_horked_d850md(const struct sysfw_id *d)
 {
 	if (apm_info.disabled == 0) {
 		apm_info.disabled = 1;
@@ -1994,7 +1994,7 @@ static int __init apm_is_horked_d850md(const struct dmi_system_id *d)
 }
 
 /* Some APM bioses hang on APM idle calls */
-static int __init apm_likes_to_melt(const struct dmi_system_id *d)
+static int __init apm_likes_to_melt(const struct sysfw_id *d)
 {
 	if (apm_info.forbid_idle == 0) {
 		apm_info.forbid_idle = 1;
@@ -2019,7 +2019,7 @@ static int __init apm_likes_to_melt(const struct dmi_system_id *d)
  *	Phoenix A04  08/24/2000 is known bad (Dell Inspiron 5000e)
  *	Phoenix A07  09/29/2000 is known good (Dell Inspiron 5000)
  */
-static int __init broken_apm_power(const struct dmi_system_id *d)
+static int __init broken_apm_power(const struct sysfw_id *d)
 {
 	apm_info.get_power_status_broken = 1;
 	printk(KERN_WARNING "BIOS strings suggest APM bugs, "
@@ -2031,7 +2031,7 @@ static int __init broken_apm_power(const struct dmi_system_id *d)
  * This bios swaps the APM minute reporting bytes over (Many sony laptops
  * have this problem).
  */
-static int __init swab_apm_power_in_minutes(const struct dmi_system_id *d)
+static int __init swab_apm_power_in_minutes(const struct sysfw_id *d)
 {
 	apm_info.get_power_status_swabinminutes = 1;
 	printk(KERN_WARNING "BIOS strings suggest APM reports battery life "
@@ -2039,215 +2039,314 @@ static int __init swab_apm_power_in_minutes(const struct dmi_system_id *d)
 	return 0;
 }
 
-static struct dmi_system_id __initdata apm_dmi_table[] = {
+static struct sysfw_id __initdata apm_id_table[] = {
 	{
-		print_if_true,
+		.callback = print_if_true,
 		KERN_WARNING "IBM T23 - BIOS 1.03b+ and controller firmware 1.02+ may be needed for Linux APM.",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
-			DMI_MATCH(DMI_BIOS_VERSION, "1AET38WW (1.01b)"), },
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR, "IBM"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "1AET38WW (1.01b)"),
+		},
 	},
 	{	/* Handle problems with APM on the C600 */
-		broken_ps2_resume, "Dell Latitude C600",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Latitude C600"), },
+		.callback = broken_ps2_resume,
+		.ident = "Dell Latitude C600",
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Latitude C600")
+		},
 	},
 	{	/* Allow interrupts during suspend on Dell Latitude laptops*/
-		set_apm_ints, "Dell Latitude",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Latitude C510"), }
+		.callback = set_apm_ints,
+		.ident = "Dell Latitude",
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR,
+				    "Dell Computer Corporation"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Latitude C510"),
+		},
 	},
 	{	/* APM crashes */
-		apm_is_horked, "Dell Inspiron 2500",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 2500"),
-			DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "A11"), },
+		.callback = apm_is_horked,
+		.ident = "Dell Inspiron 2500",
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR,
+				    "Dell Computer Corporation"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Inspiron 2500"),
+			SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "A11"), },
 	},
 	{	/* Allow interrupts during suspend on Dell Inspiron laptops*/
-		set_apm_ints, "Dell Inspiron", {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 4000"), },
+		.callback = set_apm_ints,
+		.ident = "Dell Inspiron", {
+			SYSFW_MATCH(SYSFW_SYS_VENDOR,
+				    "Dell Computer Corporation"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Inspiron 4000"),
+		},
 	},
 	{	/* Handle problems with APM on Inspiron 5000e */
-		broken_apm_power, "Dell Inspiron 5000e",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "A04"),
-			DMI_MATCH(DMI_BIOS_DATE, "08/24/2000"), },
+		.callback = broken_apm_power,
+		.ident = "Dell Inspiron 5000e",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "A04"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "08/24/2000"),
+		},
 	},
 	{	/* Handle problems with APM on Inspiron 2500 */
-		broken_apm_power, "Dell Inspiron 2500",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "A12"),
-			DMI_MATCH(DMI_BIOS_DATE, "02/04/2002"), },
+		.callback = broken_apm_power,
+		.ident = "Dell Inspiron 2500",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				     "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "A12"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "02/04/2002"),
+		},
 	},
 	{	/* APM crashes */
-		apm_is_horked, "Dell Dimension 4100",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "XPS-Z"),
-			DMI_MATCH(DMI_BIOS_VENDOR, "Intel Corp."),
-			DMI_MATCH(DMI_BIOS_VERSION, "A11"), },
+		.callback = apm_is_horked,
+		.ident = "Dell Dimension 4100",
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR,
+				    "Dell Computer Corporation"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "XPS-Z"),
+			SYSFW_MATCH(SYSFW_BIOS_VENDOR, "Intel Corp."),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "A11"),
+		},
 	},
 	{	/* Allow interrupts during suspend on Compaq Laptops*/
-		set_apm_ints, "Compaq 12XL125",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Compaq PC"),
-			DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "4.06"), },
+		.callback = set_apm_ints,
+		.ident = "Compaq 12XL125",
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR, "Compaq"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Compaq PC"),
+			SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "4.06"),
+		},
 	},
 	{	/* Allow interrupts during APM or the clock goes slow */
-		set_apm_ints, "ASUSTeK",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "L8400K series Notebook PC"), },
+		.callback = set_apm_ints,
+		.ident = "ASUSTeK",
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR,
+				    "ASUSTeK Computer Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME,
+				    "L8400K series Notebook PC"),
+		},
 	},
 	{	/* APM blows on shutdown */
-		apm_is_horked, "ABIT KX7-333[R]",
-		{	DMI_MATCH(DMI_BOARD_VENDOR, "ABIT"),
-			DMI_MATCH(DMI_BOARD_NAME, "VT8367-8233A (KX7-333[R])"), },
+		.callback = apm_is_horked,
+		.ident = "ABIT KX7-333[R]",
+		{	SYSFW_MATCH(SYSFW_BOARD_VENDOR, "ABIT"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME,
+				    "VT8367-8233A (KX7-333[R])"), },
 	},
 	{	/* APM crashes */
-		apm_is_horked, "Trigem Delhi3",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "TriGem Computer, Inc"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Delhi3"), },
+		.callback = apm_is_horked,
+		.ident = "Trigem Delhi3",
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR, "TriGem Computer, Inc"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Delhi3"),
+		},
 	},
 	{	/* APM crashes */
-		apm_is_horked, "Fujitsu-Siemens",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "hoenix/FUJITSU SIEMENS"),
-			DMI_MATCH(DMI_BIOS_VERSION, "Version1.01"), },
+		.callback = apm_is_horked,
+		.ident = "Fujitsu-Siemens",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "hoenix/FUJITSU SIEMENS"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "Version1.01")
+		},
 	},
 	{	/* APM crashes */
-		apm_is_horked_d850md, "Intel D850MD",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Intel Corp."),
-			DMI_MATCH(DMI_BIOS_VERSION, "MV85010A.86A.0016.P07.0201251536"), },
+		.callback = apm_is_horked_d850md,
+		.ident = "Intel D850MD",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR, "Intel Corp."),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION,
+				    "MV85010A.86A.0016.P07.0201251536"),
+		},
 	},
 	{	/* APM crashes */
-		apm_is_horked, "Intel D810EMO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Intel Corp."),
-			DMI_MATCH(DMI_BIOS_VERSION, "MO81010A.86A.0008.P04.0004170800"), },
+		.callback = apm_is_horked,
+		.ident = "Intel D810EMO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR, "Intel Corp."),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION,
+				    "MO81010A.86A.0008.P04.0004170800"),
+		},
 	},
 	{	/* APM crashes */
-		apm_is_horked, "Dell XPS-Z",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Intel Corp."),
-			DMI_MATCH(DMI_BIOS_VERSION, "A11"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "XPS-Z"), },
+		.callback = apm_is_horked,
+		.ident = "Dell XPS-Z",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR, "Intel Corp."),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "A11"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "XPS-Z"),
+		},
 	},
 	{	/* APM crashes */
-		apm_is_horked, "Sharp PC-PJ/AX",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "SHARP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PC-PJ/AX"),
-			DMI_MATCH(DMI_BIOS_VENDOR, "SystemSoft"),
-			DMI_MATCH(DMI_BIOS_VERSION, "Version R2.08"), },
+		.callback = apm_is_horked,
+		.ident = "Sharp PC-PJ/AX",
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR, "SHARP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "PC-PJ/AX"),
+			SYSFW_MATCH(SYSFW_BIOS_VENDOR, "SystemSoft"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "Version R2.08"),
+		},
 	},
 	{	/* APM crashes */
-		apm_is_horked, "Dell Inspiron 2500",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 2500"),
-			DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "A11"), },
+		.callback = apm_is_horked,
+		.ident = "Dell Inspiron 2500",
+		{	SYSFW_MATCH(SYSFW_SYS_VENDOR,
+				    "Dell Computer Corporation"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Inspiron 2500"),
+			SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "A11"),
+		},
 	},
 	{	/* APM idle hangs */
-		apm_likes_to_melt, "Jabil AMD",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
-			DMI_MATCH(DMI_BIOS_VERSION, "0AASNP06"), },
+		.callback = apm_likes_to_melt,
+		.ident = "Jabil AMD",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "American Megatrends Inc."),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "0AASNP06"),
+		},
 	},
 	{	/* APM idle hangs */
-		apm_likes_to_melt, "AMI Bios",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
-			DMI_MATCH(DMI_BIOS_VERSION, "0AASNP05"), },
+		.callback = apm_likes_to_melt,
+		.ident = "AMI Bios",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "American Megatrends Inc."),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "0AASNP05"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-N505X(DE) */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0206H"),
-			DMI_MATCH(DMI_BIOS_DATE, "08/23/99"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0206H"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "08/23/99"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-N505VX */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "W2K06H0"),
-			DMI_MATCH(DMI_BIOS_DATE, "02/03/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "W2K06H0"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "02/03/00"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-XG29 */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0117A0"),
-			DMI_MATCH(DMI_BIOS_DATE, "04/25/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0117A0"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "04/25/00"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-Z600NE */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0121Z1"),
-			DMI_MATCH(DMI_BIOS_DATE, "05/11/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0121Z1"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "05/11/00"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-Z600NE */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "WME01Z1"),
-			DMI_MATCH(DMI_BIOS_DATE, "08/11/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "WME01Z1"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "08/11/00"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-Z600LEK(DE) */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0206Z3"),
-			DMI_MATCH(DMI_BIOS_DATE, "12/25/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0206Z3"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "12/25/00"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-Z505LS */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0203D0"),
-			DMI_MATCH(DMI_BIOS_DATE, "05/12/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0203D0"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "05/12/00"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-Z505LS */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0203Z3"),
-			DMI_MATCH(DMI_BIOS_DATE, "08/25/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0203Z3"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "08/25/00"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-Z505LS (with updated BIOS) */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0209Z3"),
-			DMI_MATCH(DMI_BIOS_DATE, "05/12/01"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0209Z3"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "05/12/01"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-F104K */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0204K2"),
-			DMI_MATCH(DMI_BIOS_DATE, "08/28/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0204K2"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "08/28/00"),
+		},
 	},
 
 	{	/* Handle problems with APM on Sony Vaio PCG-C1VN/C1VE */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0208P1"),
-			DMI_MATCH(DMI_BIOS_DATE, "11/09/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0208P1"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "11/09/00"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-C1VE */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "R0204P1"),
-			DMI_MATCH(DMI_BIOS_DATE, "09/12/00"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "R0204P1"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "09/12/00"),
+		},
 	},
 	{	/* Handle problems with APM on Sony Vaio PCG-C1VE */
-		swab_apm_power_in_minutes, "Sony VAIO",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
-			DMI_MATCH(DMI_BIOS_VERSION, "WXPO1Z3"),
-			DMI_MATCH(DMI_BIOS_DATE, "10/26/01"), },
+		.callback = swab_apm_power_in_minutes,
+		.ident = "Sony VAIO",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Phoenix Technologies LTD"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "WXPO1Z3"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "10/26/01"),
+		},
 	},
 	{	/* broken PM poweroff bios */
-		set_realmode_power_off, "Award Software v4.60 PGMA",
-		{	DMI_MATCH(DMI_BIOS_VENDOR, "Award Software International, Inc."),
-			DMI_MATCH(DMI_BIOS_VERSION, "4.60 PGMA"),
-			DMI_MATCH(DMI_BIOS_DATE, "134526184"), },
+		.callback = set_realmode_power_off,
+		.ident = "Award Software v4.60 PGMA",
+		{	SYSFW_MATCH(SYSFW_BIOS_VENDOR,
+				    "Award Software International, Inc."),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "4.60 PGMA"),
+			SYSFW_MATCH(SYSFW_BIOS_DATE, "134526184"),
+		},
 	},
 
 	/* Generic per vendor APM settings  */
 
 	{	/* Allow interrupts during suspend on IBM laptops */
-		set_apm_ints, "IBM",
-		{	DMI_MATCH(DMI_SYS_VENDOR, "IBM"), },
+		.callback = set_apm_ints,
+		.ident = "IBM",
+		{
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "IBM"),
+		},
 	},
-
-	{ }
+	{}
 };
 
 /*
@@ -2265,7 +2364,7 @@ static int __init apm_init(void)
 	struct desc_struct *gdt;
 	int err;
 
-	dmi_check_system(apm_dmi_table);
+	sysfw_callback(apm_id_table);
 
 	if (apm_info.bios.version == 0 || paravirt_enabled() || machine_is_olpc()) {
 		printk(KERN_INFO "apm: BIOS not found.\n");
@@ -2288,7 +2387,7 @@ static int __init apm_init(void)
 		apm_info.get_power_status_broken = 1;
 	if (realmode_power_off)
 		apm_info.realmode_power_off = 1;
-	/* User can override, but default is to trust DMI */
+	/* User can override, but default is to trust SMBIOS */
 	if (apm_disabled != -1)
 		apm_info.disabled = apm_disabled;
 
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index b13ed39..79fd786 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -587,7 +587,7 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
 	if (c->x86 == 0x10) {
 		/* do this for boot cpu */
 		if (c == &boot_cpu_data)
-			check_enable_amd_mmconf_dmi();
+			check_enable_amd_pci_mmconf();
 
 		fam10h_check_enable_mmcfg();
 	}
diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
index d22d0c4..e427451 100644
--- a/arch/x86/kernel/cpu/vmware.c
+++ b/arch/x86/kernel/cpu/vmware.c
@@ -21,7 +21,7 @@
  *
  */
 
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/module.h>
 #include <asm/div64.h>
 #include <asm/x86_init.h>
@@ -85,8 +85,18 @@ static void __init vmware_platform_setup(void)
 		       "Failed to get TSC freq from the hypervisor\n");
 }
 
+static struct sysfw_id vmware_id_table[] = {
+	{
+		 .ident = "VMware",
+		.matches = {
+			SYSFW_MATCH(SYSFW_PRODUCT_SERIAL, "VMWare"),
+		},
+	},
+	{},
+};
+
 /*
- * While checking the dmi string information, just checking the product
+ * While checking the smbios string information, just checking the product
  * serial key should be enough, as this will always have a VMware
  * specific string when running under VMware hypervisor.
  */
@@ -100,8 +110,7 @@ static bool __init vmware_platform(void)
 		      &hyper_vendor_id[1], &hyper_vendor_id[2]);
 		if (!memcmp(hyper_vendor_id, "VMwareVMware", 12))
 			return true;
-	} else if (dmi_available && dmi_name_in_serial("VMware") &&
-		   __vmware_platform())
+	} else if (sysfw_callback(vmware_id_table) && __vmware_platform())
 		return true;
 
 	return false;
diff --git a/arch/x86/kernel/io_delay.c b/arch/x86/kernel/io_delay.c
index a979b5b..27c0390 100644
--- a/arch/x86/kernel/io_delay.c
+++ b/arch/x86/kernel/io_delay.c
@@ -1,7 +1,7 @@
 /*
  * I/O delay strategies for inb_p/outb_p
  *
- * Allow for a DMI based override of port 0x80, needed for certain HP laptops
+ * Allow for a SMBIOS based override of port 0x80, needed for certain HP laptops
  * and possibly other systems. Also allow for the gradual elimination of
  * outb_p/inb_p API uses.
  */
@@ -9,7 +9,7 @@
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/io.h>
 
 int io_delay_type __read_mostly = CONFIG_DEFAULT_IO_DELAY_TYPE;
@@ -44,7 +44,7 @@ void native_io_delay(void)
 }
 EXPORT_SYMBOL(native_io_delay);
 
-static int __init dmi_io_delay_0xed_port(const struct dmi_system_id *id)
+static int __init io_delay_0xed_port(const struct sysfw_id *id)
 {
 	if (io_delay_type == CONFIG_IO_DELAY_TYPE_0X80) {
 		pr_notice("%s: using 0xed I/O delay port\n", id->ident);
@@ -58,54 +58,54 @@ static int __init dmi_io_delay_0xed_port(const struct dmi_system_id *id)
  * Quirk table for systems that misbehave (lock up, etc.) if port
  * 0x80 is used:
  */
-static struct dmi_system_id __initdata io_delay_0xed_port_dmi_table[] = {
+static struct sysfw_id __initdata io_delay_0xed_port_table[] = {
 	{
-		.callback	= dmi_io_delay_0xed_port,
+		.callback	= io_delay_0xed_port,
 		.ident		= "Compaq Presario V6000",
 		.matches	= {
-			DMI_MATCH(DMI_BOARD_VENDOR,	"Quanta"),
-			DMI_MATCH(DMI_BOARD_NAME,	"30B7")
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR,	"Quanta"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME,	"30B7")
 		}
 	},
 	{
-		.callback	= dmi_io_delay_0xed_port,
+		.callback	= io_delay_0xed_port,
 		.ident		= "HP Pavilion dv9000z",
 		.matches	= {
-			DMI_MATCH(DMI_BOARD_VENDOR,	"Quanta"),
-			DMI_MATCH(DMI_BOARD_NAME,	"30B9")
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR,	"Quanta"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME,	"30B9")
 		}
 	},
 	{
-		.callback	= dmi_io_delay_0xed_port,
+		.callback	= io_delay_0xed_port,
 		.ident		= "HP Pavilion dv6000",
 		.matches	= {
-			DMI_MATCH(DMI_BOARD_VENDOR,	"Quanta"),
-			DMI_MATCH(DMI_BOARD_NAME,	"30B8")
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR,	"Quanta"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME,	"30B8")
 		}
 	},
 	{
-		.callback	= dmi_io_delay_0xed_port,
+		.callback	= io_delay_0xed_port,
 		.ident		= "HP Pavilion tx1000",
 		.matches	= {
-			DMI_MATCH(DMI_BOARD_VENDOR,	"Quanta"),
-			DMI_MATCH(DMI_BOARD_NAME,	"30BF")
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR,	"Quanta"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME,	"30BF")
 		}
 	},
 	{
-		.callback	= dmi_io_delay_0xed_port,
+		.callback	= io_delay_0xed_port,
 		.ident		= "Presario F700",
 		.matches	= {
-			DMI_MATCH(DMI_BOARD_VENDOR,	"Quanta"),
-			DMI_MATCH(DMI_BOARD_NAME,	"30D3")
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR,	"Quanta"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME,	"30D3")
 		}
 	},
-	{ }
+	{}
 };
 
 void __init io_delay_init(void)
 {
 	if (!io_delay_override)
-		dmi_check_system(io_delay_0xed_port_dmi_table);
+		sysfw_callback(io_delay_0xed_port_table);
 }
 
 static int __init io_delay_param(char *s)
diff --git a/arch/x86/kernel/mmconf-fam10h_64.c b/arch/x86/kernel/mmconf-fam10h_64.c
index ac861b8..f24400a 100644
--- a/arch/x86/kernel/mmconf-fam10h_64.c
+++ b/arch/x86/kernel/mmconf-fam10h_64.c
@@ -6,7 +6,7 @@
 #include <linux/mm.h>
 #include <linux/string.h>
 #include <linux/pci.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/range.h>
 
 #include <asm/pci-direct.h>
@@ -213,25 +213,25 @@ void __cpuinit fam10h_check_enable_mmcfg(void)
 	wrmsrl(address, val);
 }
 
-static int __init set_check_enable_amd_mmconf(const struct dmi_system_id *d)
+static int __init set_check_enable_amd_mmconf(const struct sysfw_id *d)
 {
-        pci_probe |= PCI_CHECK_ENABLE_AMD_MMCONF;
-        return 0;
+	pci_probe |= PCI_CHECK_ENABLE_AMD_MMCONF;
+	return 0;
 }
 
-static const struct dmi_system_id __initconst mmconf_dmi_table[] = {
-        {
-                .callback = set_check_enable_amd_mmconf,
-                .ident = "Sun Microsystems Machine",
-                .matches = {
-                        DMI_MATCH(DMI_SYS_VENDOR, "Sun Microsystems"),
-                },
-        },
+static const struct sysfw_id __initconst mmconf_id_table[] = {
+	{
+		.callback = set_check_enable_amd_mmconf,
+		.ident = "Sun Microsystems Machine",
+		.matches = {
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Sun Microsystems"),
+		},
+	},
 	{}
 };
 
 /* Called from a __cpuinit function, but only on the BSP. */
-void __ref check_enable_amd_mmconf_dmi(void)
+void __ref check_enable_amd_pci_mmconf(void)
 {
-	dmi_check_system(mmconf_dmi_table);
+	sysfw_callback(mmconf_id_table);
 }
diff --git a/arch/x86/kernel/probe_roms.c b/arch/x86/kernel/probe_roms.c
index ba0a4cc..e36d641 100644
--- a/arch/x86/kernel/probe_roms.c
+++ b/arch/x86/kernel/probe_roms.c
@@ -7,7 +7,6 @@
 #include <linux/console.h>
 #include <linux/init.h>
 #include <linux/edd.h>
-#include <linux/dmi.h>
 #include <linux/pfn.h>
 #include <linux/pci.h>
 #include <asm/pci-direct.h>
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index e1ba8cb..c1d7c54 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -10,7 +10,7 @@
 #include <linux/clockchips.h>
 #include <linux/random.h>
 #include <linux/user-return-notifier.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/utsname.h>
 #include <trace/events/power.h>
 #include <linux/hw_breakpoint.h>
@@ -94,15 +94,15 @@ void show_regs_common(void)
 {
 	const char *vendor, *product, *board;
 
-	vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+	vendor = sysfw_lookup(SYSFW_SYS_VENDOR);
 	if (!vendor)
 		vendor = "";
-	product = dmi_get_system_info(DMI_PRODUCT_NAME);
+	product = sysfw_lookup(SYSFW_PRODUCT_NAME);
 	if (!product)
 		product = "";
 
 	/* Board Name is optional */
-	board = dmi_get_system_info(DMI_BOARD_NAME);
+	board = sysfw_lookup(SYSFW_BOARD_NAME);
 
 	printk(KERN_CONT "\n");
 	printk(KERN_DEFAULT "Pid: %d, comm: %.20s %s %s %.*s",
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index 4f0d46f..b3837c5 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -3,7 +3,7 @@
 #include <linux/init.h>
 #include <linux/pm.h>
 #include <linux/efi.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/sched.h>
 #include <linux/tboot.h>
 #include <linux/delay.h>
@@ -127,7 +127,7 @@ __setup("reboot=", reboot_setup);
  * Some machines require the "reboot=b"  commandline option,
  * this quirk makes that automatic.
  */
-static int __init set_bios_reboot(const struct dmi_system_id *d)
+static int __init set_bios_reboot(const struct sysfw_id *d)
 {
 	if (reboot_type != BOOT_BIOS) {
 		reboot_type = BOOT_BIOS;
@@ -136,178 +136,186 @@ static int __init set_bios_reboot(const struct dmi_system_id *d)
 	return 0;
 }
 
-static struct dmi_system_id __initdata reboot_dmi_table[] = {
+static struct sysfw_id __initdata reboot_id_table[] = {
 	{	/* Handle problems with rebooting on Dell E520's */
 		.callback = set_bios_reboot,
 		.ident = "Dell E520",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM061"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Dell DM061"),
 		},
 	},
 	{	/* Handle problems with rebooting on Dell 1300's */
 		.callback = set_bios_reboot,
 		.ident = "Dell PowerEdge 1300",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1300/"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR,
+				    "Dell Computer Corporation"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "PowerEdge 1300/"),
 		},
 	},
 	{	/* Handle problems with rebooting on Dell 300's */
 		.callback = set_bios_reboot,
 		.ident = "Dell PowerEdge 300",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 300/"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR,
+				    "Dell Computer Corporation"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "PowerEdge 300/"),
 		},
 	},
 	{       /* Handle problems with rebooting on Dell Optiplex 745's SFF*/
 		.callback = set_bios_reboot,
 		.ident = "Dell OptiPlex 745",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 745"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "OptiPlex 745"),
 		},
 	},
 	{       /* Handle problems with rebooting on Dell Optiplex 745's DFF*/
 		.callback = set_bios_reboot,
 		.ident = "Dell OptiPlex 745",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 745"),
-			DMI_MATCH(DMI_BOARD_NAME, "0MM599"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "OptiPlex 745"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "0MM599"),
 		},
 	},
 	{       /* Handle problems with rebooting on Dell Optiplex 745 with 0KW626 */
 		.callback = set_bios_reboot,
 		.ident = "Dell OptiPlex 745",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 745"),
-			DMI_MATCH(DMI_BOARD_NAME, "0KW626"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "OptiPlex 745"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "0KW626"),
 		},
 	},
 	{   /* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */
 		.callback = set_bios_reboot,
 		.ident = "Dell OptiPlex 330",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"),
-			DMI_MATCH(DMI_BOARD_NAME, "0KP561"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "OptiPlex 330"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "0KP561"),
 		},
 	},
 	{   /* Handle problems with rebooting on Dell Optiplex 360 with 0T656F */
 		.callback = set_bios_reboot,
 		.ident = "Dell OptiPlex 360",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 360"),
-			DMI_MATCH(DMI_BOARD_NAME, "0T656F"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "OptiPlex 360"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "0T656F"),
 		},
 	},
 	{	/* Handle problems with rebooting on Dell OptiPlex 760 with 0G919G*/
 		.callback = set_bios_reboot,
 		.ident = "Dell OptiPlex 760",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 760"),
-			DMI_MATCH(DMI_BOARD_NAME, "0G919G"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "OptiPlex 760"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "0G919G"),
 		},
 	},
 	{	/* Handle problems with rebooting on Dell 2400's */
 		.callback = set_bios_reboot,
 		.ident = "Dell PowerEdge 2400",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR,
+				    "Dell Computer Corporation"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "PowerEdge 2400"),
 		},
 	},
 	{	/* Handle problems with rebooting on Dell T5400's */
 		.callback = set_bios_reboot,
 		.ident = "Dell Precision T5400",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME,
+				    "Precision WorkStation T5400"),
 		},
 	},
 	{	/* Handle problems with rebooting on Dell T7400's */
 		.callback = set_bios_reboot,
 		.ident = "Dell Precision T7400",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T7400"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME,
+				    "Precision WorkStation T7400"),
 		},
 	},
 	{	/* Handle problems with rebooting on HP laptops */
 		.callback = set_bios_reboot,
 		.ident = "HP Compaq Laptop",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Hewlett-Packard"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "HP Compaq"),
 		},
 	},
 	{	/* Handle problems with rebooting on Dell XPS710 */
 		.callback = set_bios_reboot,
 		.ident = "Dell XPS710",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Dell XPS710"),
 		},
 	},
 	{	/* Handle problems with rebooting on Dell DXP061 */
 		.callback = set_bios_reboot,
 		.ident = "Dell DXP061",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Dell DXP061"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Dell DXP061"),
 		},
 	},
 	{	/* Handle problems with rebooting on Sony VGN-Z540N */
 		.callback = set_bios_reboot,
 		.ident = "Sony VGN-Z540N",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-Z540N"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Sony Corporation"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "VGN-Z540N"),
 		},
 	},
 	{	/* Handle problems with rebooting on CompuLab SBC-FITPC2 */
 		.callback = set_bios_reboot,
 		.ident = "CompuLab SBC-FITPC2",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "CompuLab"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "SBC-FITPC2"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "CompuLab"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "SBC-FITPC2"),
 		},
 	},
 	{       /* Handle problems with rebooting on ASUS P4S800 */
 		.callback = set_bios_reboot,
 		.ident = "ASUS P4S800",
 		.matches = {
-			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-			DMI_MATCH(DMI_BOARD_NAME, "P4S800"),
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR,
+				    "ASUSTeK Computer INC."),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "P4S800"),
 		},
 	},
 	{	/* Handle problems with rebooting on VersaLogic Menlow boards */
 		.callback = set_bios_reboot,
 		.ident = "VersaLogic Menlow based board",
 		.matches = {
-			DMI_MATCH(DMI_BOARD_VENDOR, "VersaLogic Corporation"),
-			DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"),
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR,
+				    "VersaLogic Corporation"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME,
+				    "VersaLogic Menlow board"),
 		},
 	},
 	{ /* Handle reboot issue on Acer Aspire one */
 		.callback = set_bios_reboot,
 		.ident = "Acer Aspire One A110",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "AOA110"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Acer"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "AOA110"),
 		},
 	},
-	{ }
+	{}
 };
 
 static int __init reboot_init(void)
 {
-	dmi_check_system(reboot_dmi_table);
+	sysfw_callback(reboot_id_table);
 	return 0;
 }
 core_initcall(reboot_init);
@@ -376,7 +384,7 @@ EXPORT_SYMBOL(machine_real_restart);
 /*
  * Some Apple MacBook and MacBookPro's needs reboot=p to be able to reboot
  */
-static int __init set_pci_reboot(const struct dmi_system_id *d)
+static int __init set_pci_reboot(const struct sysfw_id *d)
 {
 	if (reboot_type != BOOT_CF9) {
 		reboot_type = BOOT_CF9;
@@ -386,45 +394,45 @@ static int __init set_pci_reboot(const struct dmi_system_id *d)
 	return 0;
 }
 
-static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
+static struct sysfw_id __initdata pci_reboot_id_table[] = {
 	{	/* Handle problems with rebooting on Apple MacBook5 */
 		.callback = set_pci_reboot,
 		.ident = "Apple MacBook5",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Apple Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "MacBook5"),
 		},
 	},
 	{	/* Handle problems with rebooting on Apple MacBookPro5 */
 		.callback = set_pci_reboot,
 		.ident = "Apple MacBookPro5",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Apple Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "MacBookPro5"),
 		},
 	},
 	{	/* Handle problems with rebooting on Apple Macmini3,1 */
 		.callback = set_pci_reboot,
 		.ident = "Apple Macmini3,1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "Macmini3,1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Apple Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Macmini3,1"),
 		},
 	},
 	{	/* Handle problems with rebooting on the iMac9,1. */
 		.callback = set_pci_reboot,
 		.ident = "Apple iMac9,1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Apple Inc."),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "iMac9,1"),
 		},
 	},
-	{ }
+	{}
 };
 
 static int __init pci_reboot_init(void)
 {
-	dmi_check_system(pci_reboot_dmi_table);
+	sysfw_callback(pci_reboot_id_table);
 	return 0;
 }
 core_initcall(pci_reboot_init);
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index afaf384..8b74838 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -44,7 +44,7 @@
 #include <linux/iscsi_ibft.h>
 #include <linux/nodemask.h>
 #include <linux/kexec.h>
-#include <linux/dmi.h>
+#include <linux/smbios.h>
 #include <linux/pfn.h>
 #include <linux/pci.h>
 #include <asm/pci-direct.h>
@@ -81,7 +81,7 @@
 #include <asm/timer.h>
 #include <asm/i8259.h>
 #include <asm/sections.h>
-#include <asm/dmi.h>
+#include <asm/smbios.h>
 #include <asm/io_apic.h>
 #include <asm/ist.h>
 #include <asm/setup_arch.h>
@@ -123,8 +123,8 @@
 unsigned long max_low_pfn_mapped;
 unsigned long max_pfn_mapped;
 
-#ifdef CONFIG_DMI
-RESERVE_BRK(dmi_alloc, 65536);
+#ifdef CONFIG_SMBIOS
+RESERVE_BRK(smbios_alloc, SMBIOS_SIZE);
 #endif
 
 
@@ -834,11 +834,11 @@ void __init setup_arch(char **cmdline_p)
 	if (efi_enabled)
 		efi_init();
 
-	dmi_scan_machine();
+	smbios_init();
 
 	/*
-	 * VMware detection requires dmi to be available, so this
-	 * needs to be done after dmi_scan_machine, for the BP.
+	 * VMware detection requires smbios to be available, so this
+	 * needs to be done after smbios_init(), for the BP.
 	 */
 	init_hypervisor_platform();
 
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 6cc6922..36c4160 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -5,7 +5,7 @@
 #include <linux/timer.h>
 #include <linux/acpi_pmtmr.h>
 #include <linux/cpufreq.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/delay.h>
 #include <linux/clocksource.h>
 #include <linux/percpu.h>
@@ -800,22 +800,22 @@ void mark_tsc_unstable(char *reason)
 
 EXPORT_SYMBOL_GPL(mark_tsc_unstable);
 
-static int __init dmi_mark_tsc_unstable(const struct dmi_system_id *d)
+static int __init quirk_mark_tsc_unstable(const struct sysfw_id *d)
 {
 	printk(KERN_NOTICE "%s detected: marking TSC unstable.\n",
-			d->ident);
+	       d->ident);
 	tsc_unstable = 1;
 	return 0;
 }
 
 /* List of systems that have known TSC problems */
-static struct dmi_system_id __initdata bad_tsc_dmi_table[] = {
+static struct sysfw_id __initdata bad_tsc_table[] = {
 	{
-		.callback = dmi_mark_tsc_unstable,
+		.callback = quirk_mark_tsc_unstable,
 		.ident = "IBM Thinkpad 380XD",
 		.matches = {
-			DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-			DMI_MATCH(DMI_BOARD_NAME, "2635FA0"),
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "IBM"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "2635FA0"),
 		},
 	},
 	{}
@@ -1011,7 +1011,7 @@ void __init tsc_init(void)
 
 	use_tsc_delay();
 	/* Check and install the TSC clocksource */
-	dmi_check_system(bad_tsc_dmi_table);
+	sysfw_callback(bad_tsc_table);
 
 	if (unsynchronized_tsc())
 		mark_tsc_unstable("TSCs unsynchronized");
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 68c3c13..51517a1 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -2,7 +2,7 @@
 #include <linux/acpi.h>
 #include <linux/init.h>
 #include <linux/irq.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/slab.h>
 #include <asm/numa.h>
 #include <asm/pci_x86.h>
@@ -18,20 +18,20 @@ struct pci_root_info {
 
 static bool pci_use_crs = true;
 
-static int __init set_use_crs(const struct dmi_system_id *id)
+static int __init set_use_crs(const struct sysfw_id *id)
 {
 	pci_use_crs = true;
 	return 0;
 }
 
-static const struct dmi_system_id pci_use_crs_table[] __initconst = {
+static const struct sysfw_id pci_use_crs_table[] __initconst = {
 	/* http://bugzilla.kernel.org/show_bug.cgi?id=14183 */
 	{
 		.callback = set_use_crs,
 		.ident = "IBM System x3800",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "x3800"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "IBM"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "x3800"),
 		},
 	},
 	/* https://bugzilla.kernel.org/show_bug.cgi?id=16007 */
@@ -40,7 +40,7 @@ static const struct dmi_system_id pci_use_crs_table[] __initconst = {
 		.callback = set_use_crs,
 		.ident = "ASRock ALiveSATA2-GLAN",
 		.matches = {
-			DMI_MATCH(DMI_PRODUCT_NAME, "ALiveSATA2-GLAN"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ALiveSATA2-GLAN"),
                 },
         },
 	{}
@@ -48,12 +48,10 @@ static const struct dmi_system_id pci_use_crs_table[] __initconst = {
 
 void __init pci_acpi_crs_quirks(void)
 {
-	int year;
-
-	if (dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL) && year < 2008)
+	if (!(sysfw_get_date() >= 20080000))
 		pci_use_crs = false;
 
-	dmi_check_system(pci_use_crs_table);
+	sysfw_callback(pci_use_crs_table);
 
 	/*
 	 * If the user specifies "pci=use_crs" or "pci=nocrs" explicitly, that
diff --git a/arch/x86/pci/broadcom_bus.c b/arch/x86/pci/broadcom_bus.c
index ab8269b..c332b7b 100644
--- a/arch/x86/pci/broadcom_bus.c
+++ b/arch/x86/pci/broadcom_bus.c
@@ -11,7 +11,6 @@
 
 #include <linux/acpi.h>
 #include <linux/delay.h>
-#include <linux/dmi.h>
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <asm/pci_x86.h>
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 5fe7502..ee193bd 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -8,7 +8,8 @@
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
-#include <linux/dmi.h>
+#include <linux/smbios.h>
+#include <linux/sysfw.h>
 #include <linux/slab.h>
 
 #include <asm/acpi.h>
@@ -79,14 +80,15 @@ struct pci_ops pci_root_ops = {
  */
 DEFINE_RAW_SPINLOCK(pci_config_lock);
 
-static int __devinit can_skip_ioresource_align(const struct dmi_system_id *d)
+static int __devinit can_skip_ioresource_align(const struct sysfw_id *d)
 {
 	pci_probe |= PCI_CAN_SKIP_ISA_ALIGN;
 	printk(KERN_INFO "PCI: %s detected, can skip ISA alignment\n", d->ident);
 	return 0;
 }
 
-static const struct dmi_system_id can_skip_pciprobe_dmi_table[] __devinitconst = {
+static const struct sysfw_id
+can_skip_pciprobe_smbios_table[] __devinitconst = {
 /*
  * Systems where PCI IO resource ISA alignment can be skipped
  * when the ISA enable bit in the bridge control is not set
@@ -95,32 +97,32 @@ static const struct dmi_system_id can_skip_pciprobe_dmi_table[] __devinitconst =
 		.callback = can_skip_ioresource_align,
 		.ident = "IBM System x3800",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "x3800"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "IBM"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "x3800"),
 		},
 	},
 	{
 		.callback = can_skip_ioresource_align,
 		.ident = "IBM System x3850",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "x3850"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "IBM"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "x3850"),
 		},
 	},
 	{
 		.callback = can_skip_ioresource_align,
 		.ident = "IBM System x3950",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "x3950"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "IBM"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "x3950"),
 		},
 	},
 	{}
 };
 
-void __init dmi_check_skip_isa_align(void)
+void __init smbios_check_skip_isa_align(void)
 {
-	dmi_check_system(can_skip_pciprobe_dmi_table);
+	sysfw_callback(can_skip_pciprobe_smbios_table);
 }
 
 static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
@@ -173,32 +175,37 @@ void __devinit pcibios_fixup_bus(struct pci_bus *b)
 }
 
 /*
- * Only use DMI information to set this if nothing was passed
+ * Only use SMBIOS information to set this if nothing was passed
  * on the kernel command line (which was parsed earlier).
  */
 
-static int __devinit set_bf_sort(const struct dmi_system_id *d)
+static int __devinit set_bf_sort(const struct sysfw_id *d)
 {
 	if (pci_bf_sort == pci_bf_sort_default) {
-		pci_bf_sort = pci_dmi_bf;
+		pci_bf_sort = pci_smbios_bf;
 		printk(KERN_INFO "PCI: %s detected, enabling pci=bfsort.\n", d->ident);
 	}
 	return 0;
 }
 
-static void __devinit read_dmi_type_b1(const struct dmi_header *dm,
-				       void *private_data)
+static int __devinit dell_sort_method_decode(const union smbios_struct *ss,
+					     void *data)
 {
-	u8 *d = (u8 *)dm + 4;
+	u8 *p;
+	const struct sysfw_id *d = (const struct sysfw_id *)data;
 
-	if (dm->type != 0xB1)
-		return;
-	switch (((*(u32 *)d) >> 9) & 0x03) {
+	if ((ss->header.type) != 0xb1)
+		return SMBIOS_WALK_CONTINUE;
+
+	p = (u8 *)ss + 4;
+	switch (((*(u32 *)p) >> 9) & 0x03) {
 	case 0x00:
-		printk(KERN_INFO "dmi type 0xB1 record - unknown flag\n");
+		printk(KERN_INFO "smbios type 0xB1 record - unknown flag\n");
 		break;
 	case 0x01: /* set pci=bfsort */
 		smbios_type_b1_flag = 1;
+		set_bf_sort(d);
+		return SMBIOS_WALK_STOP;
 		break;
 	case 0x02: /* do not set pci=bfsort */
 		smbios_type_b1_flag = 2;
@@ -206,24 +213,22 @@ static void __devinit read_dmi_type_b1(const struct dmi_header *dm,
 	default:
 		break;
 	}
-}
 
-static int __devinit find_sort_method(const struct dmi_system_id *d)
-{
-	dmi_walk(read_dmi_type_b1, NULL);
+	return SMBIOS_WALK_STOP;
 
-	if (smbios_type_b1_flag == 1) {
-		set_bf_sort(d);
-		return 0;
-	}
-	return -1;
+}
+static int __devinit find_sort_method(const struct sysfw_id *d)
+{
+	if (smbios_walk(dell_sort_method_decode, (void *)d))
+		return 1;
+	return 0;
 }
 
 /*
  * Enable renumbering of PCI bus# ranges to reach all PCI busses (Cardbus)
  */
 #ifdef __i386__
-static int __devinit assign_all_busses(const struct dmi_system_id *d)
+static int __devinit assign_all_busses(const struct sysfw_id *d)
 {
 	pci_probe |= PCI_ASSIGN_ALL_BUSSES;
 	printk(KERN_INFO "%s detected: enabling PCI bus# renumbering"
@@ -232,7 +237,7 @@ static int __devinit assign_all_busses(const struct dmi_system_id *d)
 }
 #endif
 
-static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
+static const struct sysfw_id __devinitconst pciprobe_smbios_table[] = {
 #ifdef __i386__
 /*
  * Laptops which need pci=assign-busses to see Cardbus cards
@@ -241,8 +246,8 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
 		.callback = assign_all_busses,
 		.ident = "Samsung X20 Laptop",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Samsung Electronics"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "SX20S"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Samsung Electronics"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "SX20S"),
 		},
 	},
 #endif		/* __i386__ */
@@ -250,151 +255,151 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
 		.callback = find_sort_method,
 		.ident = "Dell System",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell Inc"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "Dell PowerEdge 1950",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1950"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "PowerEdge 1950"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "Dell PowerEdge 1955",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1955"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "PowerEdge 1955"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "Dell PowerEdge 2900",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2900"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "PowerEdge 2900"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "Dell PowerEdge 2950",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2950"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "PowerEdge 2950"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "Dell PowerEdge R900",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R900"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Dell"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "PowerEdge R900"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL20p G3",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL20p G3"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL20p G3"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL20p G4",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL20p G4"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL20p G4"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL30p G1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL30p G1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL30p G1"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL25p G1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL25p G1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL25p G1"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL35p G1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL35p G1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL35p G1"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL45p G1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL45p G1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL45p G1"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL45p G2",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL45p G2"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL45p G2"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL460c G1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL460c G1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL460c G1"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL465c G1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL465c G1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL465c G1"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL480c G1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL480c G1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL480c G1"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant BL685c G1",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL685c G1"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant BL685c G1"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant DL360",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL360"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant DL360"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant DL380",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant DL380"),
 		},
 	},
 #ifdef __i386__
@@ -402,8 +407,8 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
 		.callback = assign_all_busses,
 		.ident = "Compaq EVO N800c",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "EVO N800c"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Compaq"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "EVO N800c"),
 		},
 	},
 #endif
@@ -411,24 +416,24 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant DL385 G2",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL385 G2"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant DL385 G2"),
 		},
 	},
 	{
 		.callback = set_bf_sort,
 		.ident = "HP ProLiant DL585 G2",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL585 G2"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "HP"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "ProLiant DL585 G2"),
 		},
 	},
 	{}
 };
 
-void __init dmi_check_pciprobe(void)
+void __init smbios_check_pciprobe(void)
 {
-	dmi_check_system(pciprobe_dmi_table);
+	sysfw_callback(pciprobe_smbios_table);
 }
 
 struct pci_bus * __devinit pcibios_scan_root(int busnum)
diff --git a/arch/x86/pci/direct.c b/arch/x86/pci/direct.c
index e6fd847..217d788 100644
--- a/arch/x86/pci/direct.c
+++ b/arch/x86/pci/direct.c
@@ -4,7 +4,7 @@
 
 #include <linux/pci.h>
 #include <linux/init.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <asm/pci_x86.h>
 
 /*
@@ -192,14 +192,13 @@ struct pci_raw_ops pci_direct_conf2 = {
 static int __init pci_sanity_check(struct pci_raw_ops *o)
 {
 	u32 x = 0;
-	int year, devfn;
+	int devfn;
 
 	if (pci_probe & PCI_NO_CHECKS)
 		return 1;
 	/* Assume Type 1 works for newer systems.
 	   This handles machines that don't have anything on PCI Bus 0. */
-	dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL);
-	if (year >= 2001)
+	if (sysfw_get_date() >= 20010000)
 		return 1;
 
 	for (devfn = 0; devfn < 0x100; devfn++) {
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
index 6dd8955..381c136 100644
--- a/arch/x86/pci/fixup.c
+++ b/arch/x86/pci/fixup.c
@@ -3,7 +3,7 @@
  */
 
 #include <linux/delay.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <asm/pci_x86.h>
@@ -356,12 +356,12 @@ static void __devinit pci_fixup_video(struct pci_dev *pdev)
 DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video);
 
 
-static const struct dmi_system_id __devinitconst msi_k8t_dmi_table[] = {
+static const struct sysfw_id __devinitconst msi_k8t_quirk_table[] = {
 	{
 		.ident = "MSI-K8T-Neo2Fir",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "MSI"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "MS-6702E"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "MSI"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "MS-6702E"),
 		},
 	},
 	{}
@@ -375,12 +375,12 @@ static const struct dmi_system_id __devinitconst msi_k8t_dmi_table[] = {
  * the corresponding register-value to enable the soundcard.
  *
  * The soundcard is only enabled, if the mainborad is identified
- * via DMI-tables and the soundcard is detected to be off.
+ * via SMBIOS tables and the soundcard is detected to be off.
  */
 static void __devinit pci_fixup_msi_k8t_onboard_sound(struct pci_dev *dev)
 {
 	unsigned char val;
-	if (!dmi_check_system(msi_k8t_dmi_table))
+	if (!sysfw_callback(msi_k8t_quirk_table))
 		return; /* only applies to MSI K8T Neo2-FIR */
 
 	pci_read_config_byte(dev, 0x50, &val);
@@ -413,34 +413,35 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237,
  */
 static u16 toshiba_line_size;
 
-static const struct dmi_system_id __devinitconst toshiba_ohci1394_dmi_table[] = {
+static const struct sysfw_id __devinitconst
+toshiba_ohci1394_quirk_table[] = {
 	{
 		.ident = "Toshiba PS5 based laptop",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
-			DMI_MATCH(DMI_PRODUCT_VERSION, "PS5"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "TOSHIBA"),
+			SYSFW_MATCH(SYSFW_PRODUCT_VERSION, "PS5"),
 		},
 	},
 	{
 		.ident = "Toshiba PSM4 based laptop",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
-			DMI_MATCH(DMI_PRODUCT_VERSION, "PSM4"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "TOSHIBA"),
+			SYSFW_MATCH(SYSFW_PRODUCT_VERSION, "PSM4"),
 		},
 	},
 	{
 		.ident = "Toshiba A40 based laptop",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
-			DMI_MATCH(DMI_PRODUCT_VERSION, "PSA40U"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "TOSHIBA"),
+			SYSFW_MATCH(SYSFW_PRODUCT_VERSION, "PSA40U"),
 		},
 	},
-	{ }
+	{}
 };
 
 static void __devinit pci_pre_fixup_toshiba_ohci1394(struct pci_dev *dev)
 {
-	if (!dmi_check_system(toshiba_ohci1394_dmi_table))
+	if (!sysfw_callback(toshiba_ohci1394_quirk_table))
 		return; /* only applies to certain Toshibas (so far) */
 
 	dev->current_state = PCI_D3cold;
@@ -451,7 +452,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, 0x8032,
 
 static void __devinit pci_post_fixup_toshiba_ohci1394(struct pci_dev *dev)
 {
-	if (!dmi_check_system(toshiba_ohci1394_dmi_table))
+	if (!sysfw_callback(toshiba_ohci1394_quirk_table))
 		return; /* only applies to certain Toshibas (so far) */
 
 	/* Restore config space on Toshiba laptops */
diff --git a/arch/x86/pci/init.c b/arch/x86/pci/init.c
index adb62aa..9afdbc3 100644
--- a/arch/x86/pci/init.c
+++ b/arch/x86/pci/init.c
@@ -35,9 +35,9 @@ static __init int pci_arch_init(void)
 		printk(KERN_ERR
 		"PCI: Fatal: No config space access function found\n");
 
-	dmi_check_pciprobe();
+	smbios_check_pciprobe();
 
-	dmi_check_skip_isa_align();
+	smbios_check_skip_isa_align();
 
 	return 0;
 }
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
index 372e9b8..3e2ac8f 100644
--- a/arch/x86/pci/irq.c
+++ b/arch/x86/pci/irq.c
@@ -9,7 +9,7 @@
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/io.h>
 #include <linux/smp.h>
 #include <asm/io_apic.h>
@@ -1070,7 +1070,7 @@ void __init pcibios_fixup_irqs(void)
  * Work around broken HP Pavilion Notebooks which assign USB to
  * IRQ 9 even though it is actually wired to IRQ 11
  */
-static int __init fix_broken_hp_bios_irq9(const struct dmi_system_id *d)
+static int __init fix_broken_hp_bios_irq9(const struct sysfw_id *d)
 {
 	if (!broken_hp_bios_irq9) {
 		broken_hp_bios_irq9 = 1;
@@ -1084,7 +1084,7 @@ static int __init fix_broken_hp_bios_irq9(const struct dmi_system_id *d)
  * Work around broken Acer TravelMate 360 Notebooks which assign
  * Cardbus to IRQ 11 even though it is actually wired to IRQ 10
  */
-static int __init fix_acer_tm360_irqrouting(const struct dmi_system_id *d)
+static int __init fix_acer_tm360_irqrouting(const struct sysfw_id *d)
 {
 	if (!acer_tm360_irqrouting) {
 		acer_tm360_irqrouting = 1;
@@ -1094,27 +1094,27 @@ static int __init fix_acer_tm360_irqrouting(const struct dmi_system_id *d)
 	return 0;
 }
 
-static struct dmi_system_id __initdata pciirq_dmi_table[] = {
+static struct sysfw_id __initdata pciirq_quirk_table[] = {
 	{
 		.callback = fix_broken_hp_bios_irq9,
 		.ident = "HP Pavilion N5400 Series Laptop",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-			DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"),
-			DMI_MATCH(DMI_PRODUCT_VERSION,
-				"HP Pavilion Notebook Model GE"),
-			DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Hewlett-Packard"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "GE.M1.03"),
+			SYSFW_MATCH(SYSFW_PRODUCT_VERSION,
+				    "HP Pavilion Notebook Model GE"),
+			SYSFW_MATCH(SYSFW_BOARD_VERSION, "OmniBook N32N-736"),
 		},
 	},
 	{
 		.callback = fix_acer_tm360_irqrouting,
 		.ident = "Acer TravelMate 36x Laptop",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Acer"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "TravelMate 360"),
 		},
 	},
-	{ }
+	{}
 };
 
 void __init pcibios_irq_init(void)
@@ -1124,7 +1124,7 @@ void __init pcibios_irq_init(void)
 	if (raw_pci_ops == NULL)
 		return;
 
-	dmi_check_system(pciirq_dmi_table);
+	sysfw_callback(pciirq_quirk_table);
 
 	pirq_table = pirq_find_routing_table();
 
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c
index 750c346..730b36b 100644
--- a/arch/x86/pci/mmconfig-shared.c
+++ b/arch/x86/pci/mmconfig-shared.c
@@ -15,7 +15,7 @@
 #include <linux/acpi.h>
 #include <linux/sfi_acpi.h>
 #include <linux/bitmap.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/slab.h>
 #include <asm/e820.h>
 #include <asm/pci_x86.h>
@@ -514,19 +514,15 @@ static int __initdata known_bridge;
 static int __init acpi_mcfg_check_entry(struct acpi_table_mcfg *mcfg,
 					struct acpi_mcfg_allocation *cfg)
 {
-	int year;
-
 	if (cfg->address < 0xFFFFFFFF)
 		return 0;
 
 	if (!strcmp(mcfg->header.oem_id, "SGI"))
 		return 0;
 
-	if (mcfg->header.revision >= 1) {
-		if (dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL) &&
-		    year >= 2010)
+	if (mcfg->header.revision >= 1)
+		if (sysfw_get_date() >= 20100000)
 			return 0;
-	}
 
 	printk(KERN_ERR PREFIX "MCFG region for %04x [bus %02x-%02x] at %#llx "
 	       "is above 4GB, ignored\n", cfg->pci_segment,
diff --git a/arch/x86/pci/mrst.c b/arch/x86/pci/mrst.c
index cb29191..741dbb0 100644
--- a/arch/x86/pci/mrst.c
+++ b/arch/x86/pci/mrst.c
@@ -22,7 +22,6 @@
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
-#include <linux/dmi.h>
 
 #include <asm/acpi.h>
 #include <asm/segment.h>
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index 596d5dd..6880c41 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -32,7 +32,7 @@
 #include <linux/sched.h>
 #include <linux/cpufreq.h>
 #include <linux/compiler.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/slab.h>
 
 #include <linux/acpi.h>
@@ -462,23 +462,23 @@ static int __init acpi_cpufreq_early_init(void)
  */
 static int bios_with_sw_any_bug;
 
-static int sw_any_bug_found(const struct dmi_system_id *d)
+static int sw_any_bug_found(const struct sysfw_id *d)
 {
 	bios_with_sw_any_bug = 1;
 	return 0;
 }
 
-static const struct dmi_system_id sw_any_bug_dmi_table[] = {
+static const struct sysfw_id sw_any_bug_table[] = {
 	{
 		.callback = sw_any_bug_found,
 		.ident = "Supermicro Server X6DLP",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"),
-			DMI_MATCH(DMI_BIOS_VERSION, "080010"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "X6DLP"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Supermicro"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "080010"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "X6DLP"),
 		},
 	},
-	{ }
+	{}
 };
 
 static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c)
@@ -554,7 +554,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
 	cpumask_copy(policy->related_cpus, perf->shared_cpu_map);
 
 #ifdef CONFIG_SMP
-	dmi_check_system(sw_any_bug_dmi_table);
+	sysfw_callback(sw_any_bug_table);
 	if (bios_with_sw_any_bug && cpumask_weight(policy->cpus) == 1) {
 		policy->shared_type = CPUFREQ_SHARED_TYPE_ALL;
 		cpumask_copy(policy->cpus, cpu_core_mask(cpu));
diff --git a/drivers/cpufreq/powernow-k7.c b/drivers/cpufreq/powernow-k7.c
index d71d9f3..ce33c9f 100644
--- a/drivers/cpufreq/powernow-k7.c
+++ b/drivers/cpufreq/powernow-k7.c
@@ -21,7 +21,7 @@
 #include <linux/cpufreq.h>
 #include <linux/slab.h>
 #include <linux/string.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/timex.h>
 #include <linux/io.h>
 
@@ -598,7 +598,7 @@ static unsigned int powernow_get(unsigned int cpu)
 }
 
 
-static int __cpuinit acer_cpufreq_pst(const struct dmi_system_id *d)
+static int __cpuinit acer_cpufreq_pst(const struct sysfw_id *d)
 {
 	printk(KERN_WARNING PFX
 		"%s laptop with broken PST tables in BIOS detected.\n",
@@ -616,16 +616,16 @@ static int __cpuinit acer_cpufreq_pst(const struct dmi_system_id *d)
  * A BIOS update is all that can save them.
  * Mention this, and disable cpufreq.
  */
-static struct dmi_system_id __cpuinitdata powernow_dmi_table[] = {
+static struct sysfw_id __cpuinitdata powernow_id_table[] = {
 	{
 		.callback = acer_cpufreq_pst,
 		.ident = "Acer Aspire",
 		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Insyde Software"),
-			DMI_MATCH(DMI_BIOS_VERSION, "3A71"),
+			SYSFW_MATCH(SYSFW_SYS_VENDOR, "Insyde Software"),
+			SYSFW_MATCH(SYSFW_BIOS_VERSION, "3A71"),
 		},
 	},
-	{ }
+	{}
 };
 
 static int __cpuinit powernow_cpu_init(struct cpufreq_policy *policy)
@@ -647,7 +647,7 @@ static int __cpuinit powernow_cpu_init(struct cpufreq_policy *policy)
 	}
 	pr_debug("FSB: %3dMHz\n", fsb/1000);
 
-	if (dmi_check_system(powernow_dmi_table) || acpi_force) {
+	if (sysfw_callback(powernow_id_table) || acpi_force) {
 		printk(KERN_INFO PFX "PSB/PST known to be broken.  "
 				"Trying ACPI instead\n");
 		result = powernow_acpi_init();
-- 
1.6.5.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ