1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-10-04 17:01:34 +02:00
Files
u-boot-megous/board/coreboot/coreboot/sysinfo.c
Simon Glass e1302b3e30 x86: coreboot: Add a sysinfo driver
Create a sysinfo driver to avoid needing a custom checkboard()
function. With this the following information is printed when booting
from coreboot under QEMU:

   Model: Standard PC (i440FX + PIIX, 1996)
   Manufacturer: QEMU
   Prior-stage version: 4.21-885-g2a87ef1eca56
   Prior-stage date: 11/11/2023

Signed-off-by: Simon Glass <sjg@chromium.org>
2023-11-28 12:53:04 -05:00

90 lines
2.1 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* coreboot sysinfo driver
*
* Copyright 2023 Google LLC
* Written by Simon Glass <sjg@chromium.org>
*/
#include <dm.h>
#include <smbios.h>
#include <sysinfo.h>
#include <asm/cb_sysinfo.h>
struct cb_sysinfo_priv {
const struct smbios_header *bios;
const struct smbios_header *system;
const struct smbios_type0 *t0;
const struct smbios_type1 *t1;
};
static int cb_get_str(struct udevice *dev, int id, size_t size, char *val)
{
struct cb_sysinfo_priv *priv = dev_get_priv(dev);
const char *str = NULL;
switch (id) {
case SYSINFO_ID_BOARD_MODEL:
if (priv->t1)
str = smbios_string(priv->system,
priv->t1->product_name);
break;
case SYSINFO_ID_BOARD_MANUFACTURER:
if (priv->t1)
str = smbios_string(priv->system,
priv->t1->manufacturer);
break;
case SYSINFO_ID_PRIOR_STAGE_VERSION:
if (priv->t0)
str = smbios_string(priv->bios, priv->t0->bios_ver);
break;
case SYSINFO_ID_PRIOR_STAGE_DATE:
if (priv->t0)
str = smbios_string(priv->bios,
priv->t0->bios_release_date);
break;
}
if (!str)
return -ENOTSUPP;
strlcpy(val, str, size);
return 0;
}
static int cb_detect(struct udevice *dev)
{
struct cb_sysinfo_priv *priv = dev_get_priv(dev);
const struct smbios_entry *smbios;
smbios = smbios_entry(lib_sysinfo.smbios_start,
lib_sysinfo.smbios_size);
if (!smbios)
return 0;
priv->bios = smbios_header(smbios, SMBIOS_BIOS_INFORMATION);
priv->system = smbios_header(smbios, SMBIOS_SYSTEM_INFORMATION);
priv->t0 = (struct smbios_type0 *)priv->bios;
priv->t1 = (struct smbios_type1 *)priv->system;
return 0;
}
static const struct udevice_id sysinfo_coreboot_ids[] = {
{ .compatible = "coreboot,sysinfo" },
{ /* sentinel */ }
};
static const struct sysinfo_ops sysinfo_coreboot_ops = {
.detect = cb_detect,
.get_str = cb_get_str,
};
U_BOOT_DRIVER(sysinfo_coreboot) = {
.name = "sysinfo_coreboot",
.id = UCLASS_SYSINFO,
.of_match = sysinfo_coreboot_ids,
.ops = &sysinfo_coreboot_ops,
.priv_auto = sizeof(struct cb_sysinfo_priv),
};