Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/smbios/smbios.c
- This file was moved from sys/x86/bios/smbios.c.
Show All 40 Lines | |||||
#include <machine/bus.h> | #include <machine/bus.h> | ||||
#include <machine/resource.h> | #include <machine/resource.h> | ||||
#include <sys/rman.h> | #include <sys/rman.h> | ||||
#include <vm/vm.h> | #include <vm/vm.h> | ||||
#include <vm/vm_param.h> | #include <vm/vm_param.h> | ||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
#include <machine/md_var.h> | #include <machine/md_var.h> | ||||
#if defined(__amd64__) || defined(__i386__) | |||||
#include <machine/pc/bios.h> | #include <machine/pc/bios.h> | ||||
#endif | |||||
#include <dev/smbios/smbios.h> | |||||
/* | /* | ||||
* System Management BIOS Reference Specification, v2.4 Final | * System Management BIOS Reference Specification, v2.4 Final | ||||
* http://www.dmtf.org/standards/published_documents/DSP0134.pdf | * http://www.dmtf.org/standards/published_documents/DSP0134.pdf | ||||
*/ | */ | ||||
struct smbios_softc { | struct smbios_softc { | ||||
device_t dev; | device_t dev; | ||||
struct resource * res; | struct resource * res; | ||||
int rid; | int rid; | ||||
struct smbios_eps * eps; | struct smbios_eps * eps; | ||||
}; | }; | ||||
#define RES2EPS(res) ((struct smbios_eps *)rman_get_virtual(res)) | #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 devclass_t smbios_devclass; | ||||
static void smbios_identify (driver_t *, device_t); | static void smbios_identify (driver_t *, device_t); | ||||
static int smbios_probe (device_t); | static int smbios_probe (device_t); | ||||
static int smbios_attach (device_t); | static int smbios_attach (device_t); | ||||
static int smbios_detach (device_t); | static int smbios_detach (device_t); | ||||
static int smbios_modevent (module_t, int, void *); | static int smbios_modevent (module_t, int, void *); | ||||
static int smbios_cksum (struct smbios_eps *); | static int smbios_cksum (struct smbios_eps *); | ||||
static void | static void | ||||
smbios_identify (driver_t *driver, device_t parent) | smbios_identify (driver_t *driver, device_t parent) | ||||
{ | { | ||||
struct smbios_eps *eps; | |||||
device_t child; | device_t child; | ||||
u_int32_t addr; | vm_paddr_t addr; | ||||
int length; | int length; | ||||
int rid; | int rid; | ||||
if (!device_is_alive(parent)) | if (!device_is_alive(parent)) | ||||
return; | return; | ||||
#if defined(__amd64__) || defined(__i386__) | |||||
addr = bios_sigsearch(SMBIOS_START, SMBIOS_SIG, SMBIOS_LEN, | addr = bios_sigsearch(SMBIOS_START, SMBIOS_SIG, SMBIOS_LEN, | ||||
SMBIOS_STEP, SMBIOS_OFF); | SMBIOS_STEP, SMBIOS_OFF); | ||||
#else | |||||
addr = 0; | |||||
#endif | |||||
if (addr != 0) { | if (addr != 0) { | ||||
eps = pmap_mapbios(addr, 0x1f); | |||||
rid = 0; | rid = 0; | ||||
length = ADDR2EPS(addr)->length; | length = eps->length; | ||||
if (length != 0x1f) { | if (length != 0x1f) { | ||||
u_int8_t major, minor; | u_int8_t major, minor; | ||||
major = ADDR2EPS(addr)->major_version; | major = eps->major_version; | ||||
minor = ADDR2EPS(addr)->minor_version; | minor = eps->minor_version; | ||||
/* SMBIOS v2.1 implementation might use 0x1e. */ | /* SMBIOS v2.1 implementation might use 0x1e. */ | ||||
if (length == 0x1e && major == 2 && minor == 1) | if (length == 0x1e && major == 2 && minor == 1) | ||||
length = 0x1f; | length = 0x1f; | ||||
else | else | ||||
return; | return; | ||||
} | } | ||||
child = BUS_ADD_CHILD(parent, 5, "smbios", -1); | child = BUS_ADD_CHILD(parent, 5, "smbios", -1); | ||||
device_set_driver(child, driver); | device_set_driver(child, driver); | ||||
bus_set_resource(child, SYS_RES_MEMORY, rid, addr, length); | bus_set_resource(child, SYS_RES_MEMORY, rid, addr, length); | ||||
device_set_desc(child, "System Management BIOS"); | device_set_desc(child, "System Management BIOS"); | ||||
pmap_unmapbios((vm_offset_t)eps, 0x1f); | |||||
} | } | ||||
return; | return; | ||||
} | } | ||||
static int | static int | ||||
smbios_probe (device_t dev) | smbios_probe (device_t dev) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 133 Lines • Show Last 20 Lines |