summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@google.com>2020-05-09 19:20:10 -0700
committerDuncan Laurie <dlaurie@chromium.org>2020-06-02 16:40:04 +0000
commit36e6c6f8d2b63428b0829ff615903715766b8c20 (patch)
tree0db66d9ab7addfab097c59037e44c38a8579771d /src/include
parent1ebbb165efe71e83fbf19a9ce6c4bf14e2448d81 (diff)
fw_config: Add firmware configuration interface
This change introduces a new top-level interface for interacting with a bitmask providing firmware configuration information. This is motivated by Chromebook mainboards that need to support multiple different configurations at runtime with the same BIOS. In these devices the Embedded Controller provides a bitmask that can be broken down into different fields and each field can then be broken down into different options. The firmware configuration value could also be stored in CBFS and this interface will look in CBFS first to allow the Embedded Controller value to be overridden. The firmware configuration interface is intended to easily integrate into devicetree.cb and lead to less code duplication for new mainboards that make use of this feature. BUG=b:147462631 TEST=this provides a new interface that is tested in subsequent commits Change-Id: I1e889c235a81545e2ec0e3a34dfa750ac828a330 Signed-off-by: Duncan Laurie <dlaurie@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/41209 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
Diffstat (limited to 'src/include')
-rw-r--r--src/include/device/device.h4
-rw-r--r--src/include/fw_config.h53
2 files changed, 57 insertions, 0 deletions
diff --git a/src/include/device/device.h b/src/include/device/device.h
index 46efbfe679..082dcbb4d3 100644
--- a/src/include/device/device.h
+++ b/src/include/device/device.h
@@ -8,6 +8,7 @@
#include <smbios.h>
#include <types.h>
+struct fw_config;
struct device;
struct pci_operations;
struct i2c_bus_operations;
@@ -147,6 +148,9 @@ struct device {
#endif
#endif
DEVTREE_CONST void *chip_info;
+
+ /* Zero-terminated array of fields and options to probe. */
+ DEVTREE_CONST struct fw_config *probe_list;
};
/**
diff --git a/src/include/fw_config.h b/src/include/fw_config.h
new file mode 100644
index 0000000000..d41afd6c5d
--- /dev/null
+++ b/src/include/fw_config.h
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __FW_CONFIG__
+#define __FW_CONFIG__
+
+#include <device/device.h>
+#include <static.h> /* Provides fw_config definitions from devicetree.cb */
+#include <stdbool.h>
+#include <stdint.h>
+
+/**
+ * struct fw_config - Firmware configuration field and option.
+ * @field_name: Name of the field that this option belongs to.
+ * @option_name: Name of the option within this field.
+ * @mask: Bitmask of the field.
+ * @value: Value of the option within the mask.
+ */
+struct fw_config {
+ const char *field_name;
+ const char *option_name;
+ uint32_t mask;
+ uint32_t value;
+};
+
+/* Generate a pointer to a compound literal of the fw_config structure. */
+#define FW_CONFIG(__field, __option) (&(const struct fw_config) { \
+ .field_name = FW_CONFIG_FIELD_##__field##_NAME, \
+ .option_name = FW_CONFIG_FIELD_##__field##_OPTION_##__option##_NAME, \
+ .mask = FW_CONFIG_FIELD_##__field##_MASK, \
+ .value = FW_CONFIG_FIELD_##__field##_OPTION_##__option##_VALUE \
+})
+
+#if CONFIG(FW_CONFIG)
+
+/**
+ * fw_config_probe() - Check if field and option matches.
+ * @match: Structure containing field and option to probe.
+ *
+ * Return %true if match is found, %false if match is not found.
+ */
+bool fw_config_probe(const struct fw_config *match);
+
+#else
+
+static inline bool fw_config_probe(const struct fw_config *match)
+{
+ /* Always return true when probing with disabled fw_config. */
+ return true;
+}
+
+#endif /* CONFIG(FW_CONFIG) */
+
+#endif /* __FW_CONFIG__ */