drivers/vpd: Add support to read device serial from VPD

Add functions to read the system and mainboard serial numbers
from VPD tables stored in flash.

Remove board-specific implementations for google/drallion and
google/sarien and select the new Kconfig instead.

Test: build/boot google/akemi with RO_VPD region persisted from
stock Google firmware, verify system/mainboard serial numbers
present via dmidecode.

Change-Id: I14ae07cd8b764e1e22d58577c7cc697ca1496bd5
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/49050
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Michael Niewöhner <foss@mniewoehner.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Matt DeVillier 2020-05-31 12:31:15 -05:00 committed by Patrick Georgi
parent 1717231b74
commit 8bdb006db5
7 changed files with 34 additions and 42 deletions

View File

@ -19,3 +19,8 @@ config VPD_FMAP_SIZE
default 0x4000 default 0x4000
help help
Size in bytes of the FMAP region created to store VPD tables. Size in bytes of the FMAP region created to store VPD tables.
config SMBIOS_SERIAL_FROM_VPD
bool "Load device serial from VPD"
depends on VPD && GENERATE_SMBIOS_TABLES
default n

View File

@ -5,3 +5,4 @@ verstage-$(CONFIG_VPD) += vpd_decode.c vpd.c
romstage-$(CONFIG_VPD) += vpd_decode.c vpd.c romstage-$(CONFIG_VPD) += vpd_decode.c vpd.c
postcar-$(CONFIG_VPD) += vpd_decode.c vpd.c postcar-$(CONFIG_VPD) += vpd_decode.c vpd.c
ramstage-$(CONFIG_VPD) += vpd_decode.c vpd.c ramstage-$(CONFIG_VPD) += vpd_decode.c vpd.c
ramstage-$(CONFIG_SMBIOS_SERIAL_FROM_VPD) += vpd_serial.c

View File

@ -0,0 +1,26 @@
/* SPDX-License-Identifier: BSD-3-Clause */
#include <smbios.h>
#include "vpd.h"
#include "vpd_tables.h"
#define VPD_KEY_SYSTEM_SERIAL "serial_number"
#define VPD_KEY_MAINBOARD_SERIAL "mlb_serial_number"
#define VPD_SERIAL_LEN 64
const char *smbios_system_serial_number(void)
{
static char serial[VPD_SERIAL_LEN];
if (vpd_gets(VPD_KEY_SYSTEM_SERIAL, serial, VPD_SERIAL_LEN, VPD_RO))
return serial;
return "";
}
const char *smbios_mainboard_serial_number(void)
{
static char serial[VPD_SERIAL_LEN];
if (vpd_gets(VPD_KEY_MAINBOARD_SERIAL, serial, VPD_SERIAL_LEN, VPD_RO))
return serial;
return "";
}

View File

@ -16,6 +16,7 @@ config BOARD_GOOGLE_BASEBOARD_DRALLION
select MAINBOARD_HAS_CHROMEOS select MAINBOARD_HAS_CHROMEOS
select MAINBOARD_HAS_I2C_TPM_CR50 select MAINBOARD_HAS_I2C_TPM_CR50
select MAINBOARD_HAS_TPM2 select MAINBOARD_HAS_TPM2
select SMBIOS_SERIAL_FROM_VPD if VPD
select SOC_INTEL_COMETLAKE_1 select SOC_INTEL_COMETLAKE_1
select SOC_INTEL_COMMON_BLOCK_HDA_VERB select SOC_INTEL_COMMON_BLOCK_HDA_VERB
select SOC_INTEL_COMMON_BLOCK_SMM_ESPI_DISABLE select SOC_INTEL_COMMON_BLOCK_SMM_ESPI_DISABLE

View File

@ -2,33 +2,12 @@
#include <acpi/acpi.h> #include <acpi/acpi.h>
#include <boardid.h> #include <boardid.h>
#include <drivers/vpd/vpd.h>
#include <smbios.h> #include <smbios.h>
#include <soc/gpio.h> #include <soc/gpio.h>
#include <soc/ramstage.h> #include <soc/ramstage.h>
#include <variant/gpio.h> #include <variant/gpio.h>
#include <vendorcode/google/chromeos/chromeos.h> #include <vendorcode/google/chromeos/chromeos.h>
#define VPD_KEY_SYSTEM_SERIAL "serial_number"
#define VPD_KEY_MAINBOARD_SERIAL "mlb_serial_number"
#define VPD_SERIAL_LEN 64
const char *smbios_system_serial_number(void)
{
static char serial[VPD_SERIAL_LEN];
if (vpd_gets(VPD_KEY_SYSTEM_SERIAL, serial, VPD_SERIAL_LEN, VPD_RO))
return serial;
return "";
}
const char *smbios_mainboard_serial_number(void)
{
static char serial[VPD_SERIAL_LEN];
if (vpd_gets(VPD_KEY_MAINBOARD_SERIAL, serial, VPD_SERIAL_LEN, VPD_RO))
return serial;
return "";
}
/* mainboard silk screen shows DIMM-A and DIMM-B */ /* mainboard silk screen shows DIMM-A and DIMM-B */
void smbios_fill_dimm_locator(const struct dimm_info *dimm, void smbios_fill_dimm_locator(const struct dimm_info *dimm,
struct smbios_type17 *t) struct smbios_type17 *t)

View File

@ -16,6 +16,7 @@ config BOARD_GOOGLE_BASEBOARD_SARIEN
select MAINBOARD_HAS_CHROMEOS select MAINBOARD_HAS_CHROMEOS
select MAINBOARD_HAS_I2C_TPM_CR50 select MAINBOARD_HAS_I2C_TPM_CR50
select MAINBOARD_HAS_TPM2 select MAINBOARD_HAS_TPM2
select SMBIOS_SERIAL_FROM_VPD if VPD
select SOC_INTEL_WHISKEYLAKE select SOC_INTEL_WHISKEYLAKE
select SOC_INTEL_COMMON_BLOCK_HDA_VERB select SOC_INTEL_COMMON_BLOCK_HDA_VERB
select SOC_INTEL_COMMON_BLOCK_SMM_ESPI_DISABLE select SOC_INTEL_COMMON_BLOCK_SMM_ESPI_DISABLE

View File

@ -2,33 +2,12 @@
#include <acpi/acpi.h> #include <acpi/acpi.h>
#include <boardid.h> #include <boardid.h>
#include <drivers/vpd/vpd.h>
#include <smbios.h> #include <smbios.h>
#include <soc/gpio.h> #include <soc/gpio.h>
#include <variant/gpio.h> #include <variant/gpio.h>
#include <vendorcode/google/chromeos/chromeos.h> #include <vendorcode/google/chromeos/chromeos.h>
#if CONFIG(GENERATE_SMBIOS_TABLES) #if CONFIG(GENERATE_SMBIOS_TABLES)
#define VPD_KEY_SYSTEM_SERIAL "serial_number"
#define VPD_KEY_MAINBOARD_SERIAL "mlb_serial_number"
#define VPD_SERIAL_LEN 64
const char *smbios_system_serial_number(void)
{
static char serial[VPD_SERIAL_LEN];
if (vpd_gets(VPD_KEY_SYSTEM_SERIAL, serial, VPD_SERIAL_LEN, VPD_RO))
return serial;
return "";
}
const char *smbios_mainboard_serial_number(void)
{
static char serial[VPD_SERIAL_LEN];
if (vpd_gets(VPD_KEY_MAINBOARD_SERIAL, serial, VPD_SERIAL_LEN, VPD_RO))
return serial;
return "";
}
/* mainboard silk screen shows DIMM-A and DIMM-B */ /* mainboard silk screen shows DIMM-A and DIMM-B */
void smbios_fill_dimm_locator(const struct dimm_info *dimm, void smbios_fill_dimm_locator(const struct dimm_info *dimm,
struct smbios_type17 *t) struct smbios_type17 *t)