smbios: Move smbios driver out from x86 machdep code

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
This commit is contained in:
Allan Jude 2021-02-23 21:14:18 +00:00
parent cf97d2a1da
commit d0673fe160
12 changed files with 92 additions and 72 deletions

View File

@ -129,6 +129,7 @@ device cpufreq
# Bus support.
device acpi
device smbios
options IOMMU
device pci
options PCI_HP # PCI-Express native HotPlug

View File

@ -103,6 +103,7 @@ device cpufreq
# Bus support.
device acpi
device smbios
options IOMMU
device pci

View 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)

View File

@ -3096,6 +3096,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

View File

@ -293,7 +293,6 @@ x86/acpica/OsdEnvironment.c optional acpi
x86/acpica/acpi_apm.c optional acpi
x86/acpica/acpi_wakeup.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

View 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>

View File

@ -46,7 +46,10 @@ __FBSDID("$FreeBSD$");
#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
@ -62,7 +65,6 @@ struct smbios_softc {
};
#define RES2EPS(res) ((struct smbios_eps *)rman_get_virtual(res))
#define ADDR2EPS(addr) ((struct smbios_eps *)BIOS_PADDRTOVADDR(addr))
static devclass_t smbios_devclass;
@ -77,25 +79,32 @@ static int smbios_cksum (struct smbios_eps *);
static void
smbios_identify (driver_t *driver, device_t parent)
{
struct smbios_eps *eps;
device_t child;
u_int32_t addr;
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);
SMBIOS_STEP, SMBIOS_OFF);
#else
addr = 0;
#endif
if (addr != 0) {
eps = pmap_mapbios(addr, 0x1f);
rid = 0;
length = ADDR2EPS(addr)->length;
length = eps->length;
if (length != 0x1f) {
u_int8_t major, minor;
major = ADDR2EPS(addr)->major_version;
minor = ADDR2EPS(addr)->minor_version;
major = eps->major_version;
minor = eps->minor_version;
/* SMBIOS v2.1 implementation might use 0x1e. */
if (length == 0x1e && major == 2 && minor == 1)
@ -108,6 +117,7 @@ smbios_identify (driver_t *driver, device_t parent)
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;

67
sys/dev/smbios/smbios.h Normal file
View File

@ -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_ */

View File

@ -115,6 +115,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

View File

@ -104,6 +104,7 @@ device cpufreq
# Bus support.
device acpi
device smbios
device pci
# atkbdc0 controls both the keyboard and the PS/2 mouse

View 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)

View File

@ -1,7 +1,7 @@
# $FreeBSD$
#
.PATH: ${SRCTOP}/sys/x86/bios
.PATH: ${SRCTOP}/sys/dev/smbios
KMOD= smbios
SRCS= smbios.c \