diff options
author | attilio <attilio@FreeBSD.org> | 2010-02-25 14:13:39 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2010-02-25 14:13:39 +0000 |
commit | 1b75a98556931f83129a222260dbc32a104b8bc3 (patch) | |
tree | d968b8185d78ca4c30d4e35c028883a9027fcb5f /sys/i386/bios | |
parent | 2705e272e16f3352f585937363f0557635e5149f (diff) | |
download | FreeBSD-src-1b75a98556931f83129a222260dbc32a104b8bc3.zip FreeBSD-src-1b75a98556931f83129a222260dbc32a104b8bc3.tar.gz |
Introduce the new kernel sub-tree x86 which should contain all the code
shared and generalized between our current amd64, i386 and pc98.
This is just an initial step that should lead to a more complete effort.
For the moment, a very simple porting of cpufreq modules, BIOS calls and
the whole MD specific ISA bus part is added to the sub-tree but ideally
a lot of code might be added and more shared support should grow.
Sponsored by: Sandvine Incorporated
Reviewed by: emaste, kib, jhb, imp
Discussed on: arch
MFC: 3 weeks
Diffstat (limited to 'sys/i386/bios')
-rw-r--r-- | sys/i386/bios/smbios.c | 277 | ||||
-rw-r--r-- | sys/i386/bios/vpd.c | 297 |
2 files changed, 0 insertions, 574 deletions
diff --git a/sys/i386/bios/smbios.c b/sys/i386/bios/smbios.c deleted file mode 100644 index f38d985..0000000 --- a/sys/i386/bios/smbios.c +++ /dev/null @@ -1,277 +0,0 @@ -/*- - * 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/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 - */ - -/* - * SMBIOS Entry Point Structure - */ -struct smbios_eps { - u_int8_t Anchor[4]; /* '_SM_' */ - u_int8_t Checksum; - u_int8_t Length; - - u_int8_t SMBIOS_Major; - u_int8_t SMBIOS_Minor; - u_int16_t Max_Size; - u_int8_t Revision; - u_int8_t Formatted_Area[5]; - - u_int8_t Intermediate_Anchor[5]; /* '_DMI_' */ - u_int8_t Intermediate_Checksum; - - u_int16_t Structure_Table_Length; - u_int32_t Structure_Table_Address; - u_int16_t Structure_Count; - - u_int8_t SMBIOS_BCD_Revision; -} __packed; - -struct smbios_softc { - device_t dev; - struct resource * res; - int rid; - - struct smbios_eps * eps; -}; - -#define SMBIOS_START 0xf0000 -#define SMBIOS_STEP 0x10 -#define SMBIOS_OFF 0 -#define SMBIOS_LEN 4 -#define SMBIOS_SIG "_SM_" - -#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)->SMBIOS_Major; - minor = ADDR2EPS(addr)->SMBIOS_Minor; - - /* 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->SMBIOS_Major, sc->eps->SMBIOS_Minor); - if (bcd2bin(sc->eps->SMBIOS_BCD_Revision)) - printf(", BCD Revision: %u.%u", - bcd2bin(sc->eps->SMBIOS_BCD_Revision >> 4), - bcd2bin(sc->eps->SMBIOS_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]); - } - 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/i386/bios/vpd.c b/sys/i386/bios/vpd.c deleted file mode 100644 index 246b76d..0000000 --- a/sys/i386/bios/vpd.c +++ /dev/null @@ -1,297 +0,0 @@ -/*- - * 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$"); - -/* - * VPD decoder for IBM systems (Thinkpads) - * http://www-1.ibm.com/support/docview.wss?uid=psg1MIGR-45120 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/socket.h> -#include <sys/sysctl.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> - -/* - * Vital Product Data - */ -struct vpd { - u_int16_t Header; /* 0x55AA */ - u_int8_t Signature[3]; /* Always 'VPD' */ - u_int8_t Length; /* Sructure Length */ - - u_int8_t Reserved[7]; /* Reserved */ - - u_int8_t BuildID[9]; /* BIOS Build ID */ - u_int8_t BoxSerial[7]; /* Box Serial Number */ - u_int8_t PlanarSerial[11]; /* Motherboard Serial Number */ - u_int8_t MachType[7]; /* Machine Type/Model */ - u_int8_t Checksum; /* Checksum */ -} __packed; - -struct vpd_softc { - device_t dev; - struct resource * res; - int rid; - - struct vpd * vpd; - - struct sysctl_ctx_list ctx; - - char BuildID[10]; - char BoxSerial[8]; - char PlanarSerial[12]; - char MachineType[5]; - char MachineModel[4]; -}; - -#define VPD_START 0xf0000 -#define VPD_STEP 0x10 -#define VPD_OFF 2 -#define VPD_LEN 3 -#define VPD_SIG "VPD" - -#define RES2VPD(res) ((struct vpd *)rman_get_virtual(res)) -#define ADDR2VPD(addr) ((struct vpd *)BIOS_PADDRTOVADDR(addr)) - -static devclass_t vpd_devclass; - -static void vpd_identify (driver_t *, device_t); -static int vpd_probe (device_t); -static int vpd_attach (device_t); -static int vpd_detach (device_t); -static int vpd_modevent (module_t, int, void *); - -static int vpd_cksum (struct vpd *); - -SYSCTL_NODE(_hw, OID_AUTO, vpd, CTLFLAG_RD, NULL, NULL); -SYSCTL_NODE(_hw_vpd, OID_AUTO, machine, CTLFLAG_RD, NULL, NULL); -SYSCTL_NODE(_hw_vpd_machine, OID_AUTO, type, CTLFLAG_RD, NULL, NULL); -SYSCTL_NODE(_hw_vpd_machine, OID_AUTO, model, CTLFLAG_RD, NULL, NULL); -SYSCTL_NODE(_hw_vpd, OID_AUTO, build_id, CTLFLAG_RD, NULL, NULL); -SYSCTL_NODE(_hw_vpd, OID_AUTO, serial, CTLFLAG_RD, NULL, NULL); -SYSCTL_NODE(_hw_vpd_serial, OID_AUTO, box, CTLFLAG_RD, NULL, NULL); -SYSCTL_NODE(_hw_vpd_serial, OID_AUTO, planar, CTLFLAG_RD, NULL, NULL); - -static void -vpd_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(VPD_START, VPD_SIG, VPD_LEN, VPD_STEP, VPD_OFF); - if (addr != 0) { - rid = 0; - length = ADDR2VPD(addr)->Length; - - child = BUS_ADD_CHILD(parent, 5, "vpd", -1); - device_set_driver(child, driver); - bus_set_resource(child, SYS_RES_MEMORY, rid, addr, length); - device_set_desc(child, "Vital Product Data Area"); - } - - return; -} - -static int -vpd_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 (vpd_cksum(RES2VPD(res))) - device_printf(dev, "VPD checksum failed. BIOS update may be required.\n"); - -bad: - if (res) - bus_release_resource(dev, SYS_RES_MEMORY, rid, res); - return (error); -} - -static int -vpd_attach (device_t dev) -{ - struct vpd_softc *sc; - char unit[4]; - 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->vpd = RES2VPD(sc->res); - - snprintf(unit, sizeof(unit), "%d", device_get_unit(sc->dev)); - snprintf(sc->MachineType, 5, "%.4s", sc->vpd->MachType); - snprintf(sc->MachineModel, 4, "%.3s", sc->vpd->MachType+4); - snprintf(sc->BuildID, 10, "%.9s", sc->vpd->BuildID); - snprintf(sc->BoxSerial, 8, "%.7s", sc->vpd->BoxSerial); - snprintf(sc->PlanarSerial, 12, "%.11s", sc->vpd->PlanarSerial); - - sysctl_ctx_init(&sc->ctx); - SYSCTL_ADD_STRING(&sc->ctx, - SYSCTL_STATIC_CHILDREN(_hw_vpd_machine_type), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->MachineType, 0, NULL); - SYSCTL_ADD_STRING(&sc->ctx, - SYSCTL_STATIC_CHILDREN(_hw_vpd_machine_model), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->MachineModel, 0, NULL); - SYSCTL_ADD_STRING(&sc->ctx, - SYSCTL_STATIC_CHILDREN(_hw_vpd_build_id), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->BuildID, 0, NULL); - SYSCTL_ADD_STRING(&sc->ctx, - SYSCTL_STATIC_CHILDREN(_hw_vpd_serial_box), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->BoxSerial, 0, NULL); - SYSCTL_ADD_STRING(&sc->ctx, - SYSCTL_STATIC_CHILDREN(_hw_vpd_serial_planar), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->PlanarSerial, 0, NULL); - - device_printf(dev, "Machine Type: %.4s, Model: %.3s, Build ID: %.9s\n", - sc->MachineType, sc->MachineModel, sc->BuildID); - device_printf(dev, "Box Serial: %.7s, Planar Serial: %.11s\n", - sc->BoxSerial, sc->PlanarSerial); - - return (0); -bad: - if (sc->res) - bus_release_resource(dev, SYS_RES_MEMORY, sc->rid, sc->res); - return (error); -} - -static int -vpd_detach (device_t dev) -{ - struct vpd_softc *sc; - - sc = device_get_softc(dev); - - if (sc->res) - bus_release_resource(dev, SYS_RES_MEMORY, sc->rid, sc->res); - - sysctl_ctx_free(&sc->ctx); - - return (0); -} - -static int -vpd_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(vpd_devclass, &devs, &count); - for (i = 0; i < count; i++) { - device_delete_child(device_get_parent(devs[i]), devs[i]); - } - break; - default: - break; - } - - return (0); -} - -static device_method_t vpd_methods[] = { - /* Device interface */ - DEVMETHOD(device_identify, vpd_identify), - DEVMETHOD(device_probe, vpd_probe), - DEVMETHOD(device_attach, vpd_attach), - DEVMETHOD(device_detach, vpd_detach), - { 0, 0 } -}; - -static driver_t vpd_driver = { - "vpd", - vpd_methods, - sizeof(struct vpd_softc), -}; - -DRIVER_MODULE(vpd, nexus, vpd_driver, vpd_devclass, vpd_modevent, 0); -MODULE_VERSION(vpd, 1); - -/* - * Perform a checksum over the VPD structure, starting with - * the BuildID. (Jean Delvare <khali@linux-fr.org>) - */ -static int -vpd_cksum (struct vpd *v) -{ - u_int8_t *ptr; - u_int8_t cksum; - int i; - - ptr = (u_int8_t *)v; - cksum = 0; - for (i = offsetof(struct vpd, BuildID); i < v->Length ; i++) - cksum += ptr[i]; - return (cksum); -} |