diff --git a/src/Kconfig b/src/Kconfig index 55fad952bb..320d6db32c 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -149,6 +149,7 @@ config UTIL_GENPARSER choice prompt "Option backend to use" + default USE_CBFS_FILE_OPTION_BACKEND if CHROMEOS && PLATFORM_USES_FSP2_0 default USE_MAINBOARD_SPECIFIC_OPTION_BACKEND if HAVE_MAINBOARD_SPECIFIC_OPTION_BACKEND default USE_OPTION_TABLE if NVRAMCUI_SECONDARY_PAYLOAD default USE_UEFI_VARIABLE_STORE if DRIVERS_EFI_VARIABLE_STORE && \ @@ -164,6 +165,12 @@ config USE_OPTION_TABLE Enable this option if coreboot shall read options from the "CMOS" NVRAM instead of using hard-coded values. +config USE_CBFS_FILE_OPTION_BACKEND + bool "Use CBFS files for configuration values" + help + Enable this option if coreboot shall read options from files in CBFS. + Options can be set using `cbfstool add-int -n option/ -i value`. + config USE_UEFI_VARIABLE_STORE bool "Use UEFI variable-store in SPI flash as option backend" depends on DRIVERS_EFI_VARIABLE_STORE diff --git a/src/drivers/option/Makefile.mk b/src/drivers/option/Makefile.mk index 7ca439db78..63ac1baea0 100644 --- a/src/drivers/option/Makefile.mk +++ b/src/drivers/option/Makefile.mk @@ -1,3 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only ramstage-$(CONFIG_DRIVERS_OPTION_CFR) += cfr.c + +all-$(CONFIG_USE_CBFS_FILE_OPTION_BACKEND) += cbfs_file_option.c diff --git a/src/drivers/option/cbfs_file_option.c b/src/drivers/option/cbfs_file_option.c new file mode 100644 index 0000000000..b87bba8fb9 --- /dev/null +++ b/src/drivers/option/cbfs_file_option.c @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include + +unsigned int get_uint_option(const char *name, const unsigned int fallback) +{ + size_t size; + uint64_t value; + char full_name[CBFS_METADATA_MAX_SIZE]; + snprintf(full_name, sizeof(full_name), "option/%s", name); + + void *p = cbfs_ro_map(full_name, &size); + if (!p || size < sizeof(value)) { + value = fallback; + } else { + value = le64dec(p); + cbfs_unmap(p); + } + return (unsigned int)value; +} + +enum cb_err set_uint_option(const char *name, unsigned int value) +{ + return CB_ERR_NOT_IMPLEMENTED; +} diff --git a/src/include/option.h b/src/include/option.h index 3a00570064..bee761acfb 100644 --- a/src/include/option.h +++ b/src/include/option.h @@ -7,7 +7,9 @@ void sanitize_cmos(void); -#if CONFIG(OPTION_BACKEND_NONE) +/* The CBFS file option backend cannot be used in SMM due to vboot + * dependencies, which are not added to SMM */ +#if CONFIG(OPTION_BACKEND_NONE) || (CONFIG(USE_CBFS_FILE_OPTION_BACKEND) && ENV_SMM) static inline unsigned int get_uint_option(const char *name, const unsigned int fallback) {