drivers/generic/cbfs-serial: Add driver to read serial from CBFS

Add a new driver to support reading a board serial number from
a text file in CBFS and injecting into the SMBIOS tables.
Allow driver to be selected at the .config level and not require
inclusion at the board level.

Signed-off-by: Matt DeVillier <matt.devillier@puri.sm>
Change-Id: Ieae39f39ab36e5b1f240383b7cf47681d9a311af
Reviewed-on: https://review.coreboot.org/c/coreboot/+/37917
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
Matt DeVillier 2019-12-23 16:08:37 -06:00 committed by Patrick Georgi
parent f9ad22d9f7
commit 92b0e8dcae
3 changed files with 57 additions and 0 deletions

View File

@ -0,0 +1,6 @@
config DRIVERS_GENERIC_CBFS_SERIAL
bool "Serial number in CBFS"
default n
help
Enable this option to read the board serial number from a
text file located in CBFS.

View File

@ -0,0 +1 @@
ramstage-$(CONFIG_DRIVERS_GENERIC_CBFS_SERIAL) += cbfs-serial.c

View File

@ -0,0 +1,50 @@
/*
* This file is part of the coreboot project.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <cbfs.h>
#include <device/device.h>
#include <smbios.h>
#include <string.h>
#define MAX_SERIAL_LENGTH 0x100
const char *smbios_mainboard_serial_number(void)
{
static char serial_number[MAX_SERIAL_LENGTH + 1] = {0};
struct cbfsf file;
if (serial_number[0] != 0)
return serial_number;
if (cbfs_boot_locate(&file, "serial_number", NULL) == 0) {
struct region_device cbfs_region;
size_t serial_len;
cbfs_file_data(&cbfs_region, &file);
serial_len = region_device_sz(&cbfs_region);
if (serial_len <= MAX_SERIAL_LENGTH) {
if (rdev_readat(&cbfs_region, serial_number, 0,
serial_len) == serial_len) {
serial_number[serial_len] = 0;
return serial_number;
}
}
}
strncpy(serial_number, CONFIG_MAINBOARD_SERIAL_NUMBER,
MAX_SERIAL_LENGTH);
return serial_number;
}