]> xenbits.xensource.com Git - people/royger/freebsd.git/commitdiff
smbios: Move smbios driver out from x86 machdep code
authorAllan Jude <allanjude@FreeBSD.org>
Tue, 23 Feb 2021 21:14:18 +0000 (21:14 +0000)
committerEric van Gyzen <vangyzen@FreeBSD.org>
Thu, 3 Mar 2022 14:20:07 +0000 (08:20 -0600)
Add it to the x86 GENERIC and MINIMAL kernels

Sponsored by: Ampere Computing LLC
Submitted by: Klara Inc.
Reviewed by: rpokala
Differential Revision: https://reviews.freebsd.org/D28738

(cherry picked from commit d0673fe160b04f8162f380926d455dfb966f08fb)

13 files changed:
sys/amd64/conf/GENERIC
sys/amd64/conf/MINIMAL
sys/amd64/include/pc/bios.h
sys/conf/files
sys/conf/files.x86
sys/dev/ipmi/ipmi_smbios.c
sys/dev/smbios/smbios.c [new file with mode: 0644]
sys/dev/smbios/smbios.h [new file with mode: 0644]
sys/i386/conf/GENERIC
sys/i386/conf/MINIMAL
sys/i386/include/pc/bios.h
sys/modules/bios/smbios/Makefile
sys/x86/bios/smbios.c [deleted file]

index 3fbb421a44b11f12c34caa1207c9da566f2050c5..0be9ed389b06610d2e7f496f6f6df84f24431b54 100644 (file)
@@ -116,6 +116,7 @@ device              cpufreq
 
 # Bus support.
 device         acpi
+device         smbios
 options        IOMMU
 device         pci
 options        PCI_HP                  # PCI-Express native HotPlug
index a55a63d6b3adc39117fdc650581d529ed14b8263..030fb171c43af7f3087400522c5cfcd04435fee7 100644 (file)
@@ -93,6 +93,7 @@ device                cpufreq
 
 # Bus support.
 device         acpi
+device         smbios
 options        IOMMU
 device         pci
 
index 99e346a4a344f09c3afc6b9778f22c6693d742da..4b2d9af025585ab3508beab37188e250f59da7fa 100644 (file)
@@ -64,38 +64,6 @@ struct bios_smap_xattr {
     u_int32_t  xattr;
 } __packed;
 
-/*
- * System Management BIOS
- */
-#define        SMBIOS_START    0xf0000
-#define        SMBIOS_STEP     0x10
-#define        SMBIOS_OFF      0
-#define        SMBIOS_LEN      4
-#define        SMBIOS_SIG      "_SM_"
-
-struct smbios_eps {
-       uint8_t         anchor_string[4];               /* '_SM_' */
-       uint8_t         checksum;
-       uint8_t         length;
-       uint8_t         major_version;
-       uint8_t         minor_version;
-       uint16_t        maximum_structure_size;
-       uint8_t         entry_point_revision;
-       uint8_t         formatted_area[5];
-       uint8_t         intermediate_anchor_string[5];  /* '_DMI_' */
-       uint8_t         intermediate_checksum;
-       uint16_t        structure_table_length;
-       uint32_t        structure_table_address;
-       uint16_t        number_structures;
-       uint8_t         BCD_revision;
-};
-
-struct smbios_structure_header {
-       uint8_t         type;
-       uint8_t         length;
-       uint16_t        handle;
-};
-
 #ifdef _KERNEL
 #define BIOS_PADDRTOVADDR(x)   ((x) + KERNBASE)
 #define BIOS_VADDRTOPADDR(x)   ((x) - KERNBASE)
index 949c0b5ecd868128a713d40ef45bbb013dea7466..3e727f952ac2a9b2b262944fab842572c083512d 100644 (file)
@@ -3119,6 +3119,7 @@ dev/sge/if_sge.c          optional sge pci
 dev/siis/siis.c                        optional siis pci
 dev/sis/if_sis.c               optional sis pci
 dev/sk/if_sk.c                 optional sk pci
+dev/smbios/smbios.c            optional smbios
 dev/smbus/smb.c                        optional smb
 dev/smbus/smbconf.c            optional smbus
 dev/smbus/smbus.c              optional smbus
index 69e1f7fd6802e292d9369d21ce90169d303989a2..ae68faa002ff5596b9f7aa8e519f3118a073e71d 100644 (file)
@@ -304,7 +304,6 @@ libkern/x86/crc32_sse42.c   standard
 x86/acpica/OsdEnvironment.c    optional        acpi
 x86/acpica/acpi_apm.c          optional        acpi
 x86/acpica/srat.c              optional        acpi
-x86/bios/smbios.c              optional        smbios
 x86/bios/vpd.c                 optional        vpd
 x86/cpufreq/est.c              optional        cpufreq
 x86/cpufreq/hwpstate_amd.c     optional        cpufreq
index df0a7f70e9cd9c9efbadc5a283ba2d64afb5b98f..308a3b076ef7b1741177e1bc86c0957c9d15cdc8 100644 (file)
@@ -39,7 +39,10 @@ __FBSDID("$FreeBSD$");
 
 #include <vm/vm.h>
 #include <vm/pmap.h>
+#if defined(__amd64__) || defined(__i386__)
 #include <machine/pc/bios.h>
+#endif
+#include <dev/smbios/smbios.h>
 
 #ifdef LOCAL_MODULE
 #include <ipmi.h>
diff --git a/sys/dev/smbios/smbios.c b/sys/dev/smbios/smbios.c
new file mode 100644 (file)
index 0000000..10589ed
--- /dev/null
@@ -0,0 +1,261 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2003 Matthew N. Dodd <winter@jurai.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/socket.h>
+
+#include <sys/module.h>
+#include <sys/bus.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/pmap.h>
+#include <machine/md_var.h>
+#if defined(__amd64__) || defined(__i386__)
+#include <machine/pc/bios.h>
+#endif
+#include <dev/smbios/smbios.h>
+
+/*
+ * System Management BIOS Reference Specification, v2.4 Final
+ * http://www.dmtf.org/standards/published_documents/DSP0134.pdf
+ */
+
+struct smbios_softc {
+       device_t                dev;
+       struct resource *       res;
+       int                     rid;
+
+       struct smbios_eps *     eps;
+};
+
+#define        RES2EPS(res)    ((struct smbios_eps *)rman_get_virtual(res))
+
+static devclass_t      smbios_devclass;
+
+static void    smbios_identify (driver_t *, device_t);
+static int     smbios_probe    (device_t);
+static int     smbios_attach   (device_t);
+static int     smbios_detach   (device_t);
+static int     smbios_modevent (module_t, int, void *);
+
+static int     smbios_cksum    (struct smbios_eps *);
+
+static void
+smbios_identify (driver_t *driver, device_t parent)
+{
+       struct smbios_eps *eps;
+       device_t child;
+       vm_paddr_t addr;
+       int length;
+       int rid;
+
+       if (!device_is_alive(parent))
+               return;
+
+#if defined(__amd64__) || defined(__i386__)
+       addr = bios_sigsearch(SMBIOS_START, SMBIOS_SIG, SMBIOS_LEN,
+           SMBIOS_STEP, SMBIOS_OFF);
+#else
+       addr = 0;
+#endif
+
+       if (addr != 0) {
+               eps = pmap_mapbios(addr, 0x1f);
+               rid = 0;
+               length = eps->length;
+
+               if (length != 0x1f) {
+                       u_int8_t major, minor;
+
+                       major = eps->major_version;
+                       minor = eps->minor_version;
+
+                       /* SMBIOS v2.1 implementation might use 0x1e. */
+                       if (length == 0x1e && major == 2 && minor == 1)
+                               length = 0x1f;
+                       else
+                               return;
+               }
+
+               child = BUS_ADD_CHILD(parent, 5, "smbios", -1);
+               device_set_driver(child, driver);
+               bus_set_resource(child, SYS_RES_MEMORY, rid, addr, length);
+               device_set_desc(child, "System Management BIOS");
+               pmap_unmapbios((vm_offset_t)eps, 0x1f);
+       }
+
+       return;
+}
+
+static int
+smbios_probe (device_t dev)
+{
+       struct resource *res;
+       int rid;
+       int error;
+
+       error = 0;
+       rid = 0;
+       res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
+       if (res == NULL) {
+               device_printf(dev, "Unable to allocate memory resource.\n");
+               error = ENOMEM;
+               goto bad;
+       }
+
+       if (smbios_cksum(RES2EPS(res))) {
+               device_printf(dev, "SMBIOS checksum failed.\n");
+               error = ENXIO;
+               goto bad;
+       }
+
+bad:
+       if (res)
+               bus_release_resource(dev, SYS_RES_MEMORY, rid, res);
+       return (error);
+}
+
+static int
+smbios_attach (device_t dev)
+{
+       struct smbios_softc *sc;
+       int error;
+
+       sc = device_get_softc(dev);
+       error = 0;
+
+       sc->dev = dev;
+       sc->rid = 0;
+       sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->rid,
+               RF_ACTIVE);
+       if (sc->res == NULL) {
+               device_printf(dev, "Unable to allocate memory resource.\n");
+               error = ENOMEM;
+               goto bad;
+       }
+       sc->eps = RES2EPS(sc->res);
+
+       device_printf(dev, "Version: %u.%u",
+           sc->eps->major_version, sc->eps->minor_version);
+       if (bcd2bin(sc->eps->BCD_revision))
+               printf(", BCD Revision: %u.%u",
+                       bcd2bin(sc->eps->BCD_revision >> 4),
+                       bcd2bin(sc->eps->BCD_revision & 0x0f));
+       printf("\n");
+
+       return (0);
+bad:
+       if (sc->res)
+               bus_release_resource(dev, SYS_RES_MEMORY, sc->rid, sc->res);
+       return (error);
+}
+
+static int
+smbios_detach (device_t dev)
+{
+       struct smbios_softc *sc;
+
+       sc = device_get_softc(dev);
+
+       if (sc->res)
+               bus_release_resource(dev, SYS_RES_MEMORY, sc->rid, sc->res);
+
+       return (0);
+}
+
+static int
+smbios_modevent (mod, what, arg)
+        module_t        mod;
+        int             what;
+        void *          arg;
+{
+       device_t *      devs;
+       int             count;
+       int             i;
+
+       switch (what) {
+       case MOD_LOAD:
+               break;
+       case MOD_UNLOAD:
+               devclass_get_devices(smbios_devclass, &devs, &count);
+               for (i = 0; i < count; i++) {
+                       device_delete_child(device_get_parent(devs[i]), devs[i]);
+               }
+               free(devs, M_TEMP);
+               break;
+       default:
+               break;
+       }
+
+       return (0);
+}
+
+static device_method_t smbios_methods[] = {
+       /* Device interface */
+       DEVMETHOD(device_identify,      smbios_identify),
+       DEVMETHOD(device_probe,         smbios_probe),
+       DEVMETHOD(device_attach,        smbios_attach),
+       DEVMETHOD(device_detach,        smbios_detach),
+       { 0, 0 }
+};
+
+static driver_t smbios_driver = {
+       "smbios",
+       smbios_methods,
+       sizeof(struct smbios_softc),
+};
+
+DRIVER_MODULE(smbios, nexus, smbios_driver, smbios_devclass, smbios_modevent, 0);
+MODULE_VERSION(smbios, 1);
+
+static int
+smbios_cksum (struct smbios_eps *e)
+{
+       u_int8_t *ptr;
+       u_int8_t cksum;
+       int i;
+
+       ptr = (u_int8_t *)e;
+       cksum = 0;
+       for (i = 0; i < e->length; i++) {
+               cksum += ptr[i];
+       }
+
+       return (cksum);
+}
diff --git a/sys/dev/smbios/smbios.h b/sys/dev/smbios/smbios.h
new file mode 100644 (file)
index 0000000..6503cdb
--- /dev/null
@@ -0,0 +1,67 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 1997 Michael Smith
+ * Copyright (c) 1998 Jonathan Lemon
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _SMBIOS_H_
+#define _SMBIOS_H_
+
+/*
+ * System Management BIOS
+ */
+#define        SMBIOS_START    0xf0000
+#define        SMBIOS_STEP     0x10
+#define        SMBIOS_OFF      0
+#define        SMBIOS_LEN      4
+#define        SMBIOS_SIG      "_SM_"
+
+struct smbios_eps {
+       uint8_t         anchor_string[4];               /* '_SM_' */
+       uint8_t         checksum;
+       uint8_t         length;
+       uint8_t         major_version;
+       uint8_t         minor_version;
+       uint16_t        maximum_structure_size;
+       uint8_t         entry_point_revision;
+       uint8_t         formatted_area[5];
+       uint8_t         intermediate_anchor_string[5];  /* '_DMI_' */
+       uint8_t         intermediate_checksum;
+       uint16_t        structure_table_length;
+       uint32_t        structure_table_address;
+       uint16_t        number_structures;
+       uint8_t         BCD_revision;
+};
+
+struct smbios_structure_header {
+       uint8_t         type;
+       uint8_t         length;
+       uint16_t        handle;
+};
+
+#endif /* _SMBIOS_H_ */
index 55ff71a4f05bc77f75853914f7a5af655637c695..0bac5ba4c84602e55810268549147177879f266c 100644 (file)
@@ -105,6 +105,7 @@ device              cpufreq
 
 # Bus support.
 device         acpi
+device         smbios
 device         pci
 options        PCI_HP                  # PCI-Express native HotPlug
 options                PCI_IOV                 # PCI SR-IOV support
index 7e1f71f42eb46664c20fc1c28ed71f1b1f5fde3e..1b45dc6d77ff4b30b457fefdaea2324a9cfc60f3 100644 (file)
@@ -94,6 +94,7 @@ device                cpufreq
 
 # Bus support.
 device         acpi
+device         smbios
 device         pci
 
 # atkbdc0 controls both the keyboard and the PS/2 mouse
index aced9712e846c13df492296f662bcf30ffa25a8e..eec5983bee46a1e2405b55078d042d104b3e4893 100644 (file)
@@ -234,38 +234,6 @@ struct bios_smap_xattr {
     u_int32_t  xattr;
 } __packed;
 
-/*
- * System Management BIOS
- */
-#define        SMBIOS_START    0xf0000
-#define        SMBIOS_STEP     0x10
-#define        SMBIOS_OFF      0
-#define        SMBIOS_LEN      4
-#define        SMBIOS_SIG      "_SM_"
-
-struct smbios_eps {
-       uint8_t         anchor_string[4];               /* '_SM_' */
-       uint8_t         checksum;
-       uint8_t         length;
-       uint8_t         major_version;
-       uint8_t         minor_version;
-       uint16_t        maximum_structure_size;
-       uint8_t         entry_point_revision;
-       uint8_t         formatted_area[5];
-       uint8_t         intermediate_anchor_string[5];  /* '_DMI_' */
-       uint8_t         intermediate_checksum;
-       uint16_t        structure_table_length;
-       uint32_t        structure_table_address;
-       uint16_t        number_structures;
-       uint8_t         BCD_revision;
-};
-
-struct smbios_structure_header {
-       uint8_t         type;
-       uint8_t         length;
-       uint16_t        handle;
-};
-
 #ifdef _KERNEL
 #define BIOS_PADDRTOVADDR(x)   ((x) + PMAP_MAP_LOW)
 #define BIOS_VADDRTOPADDR(x)   ((x) - PMAP_MAP_LOW)
index ff8d22b764aa06c58bae3606d04fe83d99559388..58301eca17d620968a34d167d6d2fdea9337389e 100644 (file)
@@ -1,7 +1,7 @@
 # $FreeBSD$
 #
 
-.PATH:  ${SRCTOP}/sys/x86/bios
+.PATH:  ${SRCTOP}/sys/dev/smbios
 
 KMOD=  smbios
 SRCS=  smbios.c \
diff --git a/sys/x86/bios/smbios.c b/sys/x86/bios/smbios.c
deleted file mode 100644 (file)
index 2e3a80c..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2003 Matthew N. Dodd <winter@jurai.net>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/socket.h>
-
-#include <sys/module.h>
-#include <sys/bus.h>
-
-#include <machine/bus.h>
-#include <machine/resource.h>
-#include <sys/rman.h>
-
-#include <vm/vm.h>
-#include <vm/vm_param.h>
-#include <vm/pmap.h>
-#include <machine/md_var.h>
-#include <machine/pc/bios.h>
-
-/*
- * System Management BIOS Reference Specification, v2.4 Final
- * http://www.dmtf.org/standards/published_documents/DSP0134.pdf
- */
-
-struct smbios_softc {
-       device_t                dev;
-       struct resource *       res;
-       int                     rid;
-
-       struct smbios_eps *     eps;
-};
-
-#define        RES2EPS(res)    ((struct smbios_eps *)rman_get_virtual(res))
-#define        ADDR2EPS(addr)  ((struct smbios_eps *)BIOS_PADDRTOVADDR(addr))
-
-static devclass_t      smbios_devclass;
-
-static void    smbios_identify (driver_t *, device_t);
-static int     smbios_probe    (device_t);
-static int     smbios_attach   (device_t);
-static int     smbios_detach   (device_t);
-static int     smbios_modevent (module_t, int, void *);
-
-static int     smbios_cksum    (struct smbios_eps *);
-
-static void
-smbios_identify (driver_t *driver, device_t parent)
-{
-       device_t child;
-       u_int32_t addr;
-       int length;
-       int rid;
-
-       if (!device_is_alive(parent))
-               return;
-
-       addr = bios_sigsearch(SMBIOS_START, SMBIOS_SIG, SMBIOS_LEN,
-                             SMBIOS_STEP, SMBIOS_OFF);
-       if (addr != 0) {
-               rid = 0;
-               length = ADDR2EPS(addr)->length;
-
-               if (length != 0x1f) {
-                       u_int8_t major, minor;
-
-                       major = ADDR2EPS(addr)->major_version;
-                       minor = ADDR2EPS(addr)->minor_version;
-
-                       /* SMBIOS v2.1 implementation might use 0x1e. */
-                       if (length == 0x1e && major == 2 && minor == 1)
-                               length = 0x1f;
-                       else
-                               return;
-               }
-
-               child = BUS_ADD_CHILD(parent, 5, "smbios", -1);
-               device_set_driver(child, driver);
-               bus_set_resource(child, SYS_RES_MEMORY, rid, addr, length);
-               device_set_desc(child, "System Management BIOS");
-       }
-
-       return;
-}
-
-static int
-smbios_probe (device_t dev)
-{
-       struct resource *res;
-       int rid;
-       int error;
-
-       error = 0;
-       rid = 0;
-       res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
-       if (res == NULL) {
-               device_printf(dev, "Unable to allocate memory resource.\n");
-               error = ENOMEM;
-               goto bad;
-       }
-
-       if (smbios_cksum(RES2EPS(res))) {
-               device_printf(dev, "SMBIOS checksum failed.\n");
-               error = ENXIO;
-               goto bad;
-       }
-
-bad:
-       if (res)
-               bus_release_resource(dev, SYS_RES_MEMORY, rid, res);
-       return (error);
-}
-
-static int
-smbios_attach (device_t dev)
-{
-       struct smbios_softc *sc;
-       int error;
-
-       sc = device_get_softc(dev);
-       error = 0;
-
-       sc->dev = dev;
-       sc->rid = 0;
-       sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->rid,
-               RF_ACTIVE);
-       if (sc->res == NULL) {
-               device_printf(dev, "Unable to allocate memory resource.\n");
-               error = ENOMEM;
-               goto bad;
-       }
-       sc->eps = RES2EPS(sc->res);
-
-       device_printf(dev, "Version: %u.%u",
-           sc->eps->major_version, sc->eps->minor_version);
-       if (bcd2bin(sc->eps->BCD_revision))
-               printf(", BCD Revision: %u.%u",
-                       bcd2bin(sc->eps->BCD_revision >> 4),
-                       bcd2bin(sc->eps->BCD_revision & 0x0f));
-       printf("\n");
-
-       return (0);
-bad:
-       if (sc->res)
-               bus_release_resource(dev, SYS_RES_MEMORY, sc->rid, sc->res);
-       return (error);
-}
-
-static int
-smbios_detach (device_t dev)
-{
-       struct smbios_softc *sc;
-
-       sc = device_get_softc(dev);
-
-       if (sc->res)
-               bus_release_resource(dev, SYS_RES_MEMORY, sc->rid, sc->res);
-
-       return (0);
-}
-
-static int
-smbios_modevent (mod, what, arg)
-        module_t        mod;
-        int             what;
-        void *          arg;
-{
-       device_t *      devs;
-       int             count;
-       int             i;
-
-       switch (what) {
-       case MOD_LOAD:
-               break;
-       case MOD_UNLOAD:
-               devclass_get_devices(smbios_devclass, &devs, &count);
-               for (i = 0; i < count; i++) {
-                       device_delete_child(device_get_parent(devs[i]), devs[i]);
-               }
-               free(devs, M_TEMP);
-               break;
-       default:
-               break;
-       }
-
-       return (0);
-}
-
-static device_method_t smbios_methods[] = {
-       /* Device interface */
-       DEVMETHOD(device_identify,      smbios_identify),
-       DEVMETHOD(device_probe,         smbios_probe),
-       DEVMETHOD(device_attach,        smbios_attach),
-       DEVMETHOD(device_detach,        smbios_detach),
-       { 0, 0 }
-};
-
-static driver_t smbios_driver = {
-       "smbios",
-       smbios_methods,
-       sizeof(struct smbios_softc),
-};
-
-DRIVER_MODULE(smbios, nexus, smbios_driver, smbios_devclass, smbios_modevent, 0);
-MODULE_VERSION(smbios, 1);
-
-static int
-smbios_cksum (struct smbios_eps *e)
-{
-       u_int8_t *ptr;
-       u_int8_t cksum;
-       int i;
-
-       ptr = (u_int8_t *)e;
-       cksum = 0;
-       for (i = 0; i < e->length; i++) {
-               cksum += ptr[i];
-       }
-
-       return (cksum);
-}