summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/index.md1
-rw-r--r--Documentation/lib/option.md31
-rw-r--r--src/Kconfig15
3 files changed, 47 insertions, 0 deletions
diff --git a/Documentation/index.md b/Documentation/index.md
index 9870cf3108..c518c5085b 100644
--- a/Documentation/index.md
+++ b/Documentation/index.md
@@ -183,6 +183,7 @@ Contents:
* [Mainboard](mainboard/index.md)
* [Payloads](lib/payloads/index.md)
* [Libraries](lib/index.md)
+* [Options](lib/option.md)
* [Security](security/index.md)
* [SuperIO](superio/index.md)
* [Vendorcode](vendorcode/index.md)
diff --git a/Documentation/lib/option.md b/Documentation/lib/option.md
new file mode 100644
index 0000000000..eb63390ec7
--- /dev/null
+++ b/Documentation/lib/option.md
@@ -0,0 +1,31 @@
+# Option API
+
+The option API around the `set_option(const char *name, void *val)` and
+`get_option(void *dest, const char *name)` functions deprecated in favor
+of a type-safe API.
+
+Historically, options were stored in RTC battery-backed CMOS RAM inside
+the chipset on PC platforms. Nowadays, options can also be stored in the
+same flash chip as the boot firmware or through some BMC interface.
+
+The new type-safe option framework can be used by calling
+`enum cb_err set_uint_option(const char *name, unsigned int value)` and
+`unsigned int get_uint_option(const char *name, const unsigned int fallback)`.
+
+The default setting is `OPTION_BACKEND_NONE`, which disables any runtime
+configurable options. If supported by a mainboard, the `USE_OPTION_TABLE`
+and `USE_MAINBOARD_SPECIFIC_OPTION_BACKEND` choices are visible, and can
+be selected to enable runtime configurability.
+
+# Mainboard-specific option backend
+
+Mainboards with a mainboard-specific (vendor-defined) method to access
+options can select `HAVE_MAINBOARD_SPECIFIC_OPTION_BACKEND` to provide
+implementations of the option API accessors. To allow choosing between
+multiple option backends, the mainboard-specific implementation should
+only be built when `USE_MAINBOARD_SPECIFIC_OPTION_BACKEND` is selected.
+
+Where possible, using a generic, mainboard-independent mechanism should
+be preferred over reinventing the wheel in mainboard-specific code. The
+mainboard-specific approach should only be used when the option storage
+mechanism has to satisfy externally-imposed, vendor-defined constraints.
diff --git a/src/Kconfig b/src/Kconfig
index b019e9d8b2..6b6076741f 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -122,6 +122,7 @@ config UTIL_GENPARSER
choice
prompt "Option backend to use"
+ default USE_MAINBOARD_SPECIFIC_OPTION_BACKEND if HAVE_MAINBOARD_SPECIFIC_OPTION_BACKEND
default USE_OPTION_TABLE if NVRAMCUI_SECONDARY_PAYLOAD
config OPTION_BACKEND_NONE
@@ -134,6 +135,13 @@ config USE_OPTION_TABLE
Enable this option if coreboot shall read options from the "CMOS"
NVRAM instead of using hard-coded values.
+config USE_MAINBOARD_SPECIFIC_OPTION_BACKEND
+ bool "Use mainboard-specific option backend"
+ depends on HAVE_MAINBOARD_SPECIFIC_OPTION_BACKEND
+ help
+ Use a mainboard-specific mechanism to access runtime-configurable
+ options.
+
endchoice
config STATIC_OPTION_TABLE
@@ -683,6 +691,13 @@ config NUM_THREADS
help
How many execution threads to cooperatively multitask with.
+config HAVE_MAINBOARD_SPECIFIC_OPTION_BACKEND
+ bool
+ help
+ Selected by mainboards which implement a mainboard-specific mechanism
+ to access the values for runtime-configurable options. For example, a
+ custom BMC interface or an EEPROM with an externally-imposed layout.
+
config HAVE_OPTION_TABLE
bool
default n