aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sysinfo.h11
-rw-r--r--lib/smbios.c32
2 files changed, 40 insertions, 3 deletions
diff --git a/include/sysinfo.h b/include/sysinfo.h
index 6e02125..743f355 100644
--- a/include/sysinfo.h
+++ b/include/sysinfo.h
@@ -31,6 +31,17 @@
* to read the serial number.
*/
+/** enum sysinfo_id - Standard IDs defined by U-Boot */
+enum sysinfo_id {
+ SYSINFO_ID_NONE,
+
+ SYSINFO_ID_SMBIOS_SYSTEM_VERSION,
+ SYSINFO_ID_SMBIOS_BASEBOARD_VERSION,
+
+ /* First value available for downstream/board used */
+ SYSINFO_ID_USER = 0x1000,
+};
+
struct sysinfo_ops {
/**
* detect() - Run the hardware info detection procedure for this
diff --git a/lib/smbios.c b/lib/smbios.c
index e8bfc9e..7d463c8 100644
--- a/lib/smbios.c
+++ b/lib/smbios.c
@@ -10,6 +10,7 @@
#include <env.h>
#include <mapmem.h>
#include <smbios.h>
+#include <sysinfo.h>
#include <tables_csum.h>
#include <version.h>
#ifdef CONFIG_CPU
@@ -108,14 +109,25 @@ static int smbios_add_string(struct smbios_ctx *ctx, const char *str)
}
/**
- * smbios_add_prop() - Add a property from the device tree
+ * smbios_add_prop_si() - Add a property from the devicetree or sysinfo
+ *
+ * Sysinfo is used if available, with a fallback to devicetree
*
* @ctx: context for writing the tables
* @prop: property to write
* @return 0 if not found, else SMBIOS string number (1 or more)
*/
-static int smbios_add_prop(struct smbios_ctx *ctx, const char *prop)
+static int smbios_add_prop_si(struct smbios_ctx *ctx, const char *prop,
+ int sysinfo_id)
{
+ if (sysinfo_id && ctx->dev) {
+ char val[SMBIOS_STR_MAX];
+ int ret;
+
+ ret = sysinfo_get_str(ctx->dev, sysinfo_id, sizeof(val), val);
+ if (!ret)
+ return smbios_add_string(ctx, val);
+ }
if (IS_ENABLED(CONFIG_OF_CONTROL)) {
const char *str;
@@ -127,6 +139,17 @@ static int smbios_add_prop(struct smbios_ctx *ctx, const char *prop)
return 0;
}
+/**
+ * smbios_add_prop() - Add a property from the devicetree
+ *
+ * @prop: property to write
+ * @return 0 if not found, else SMBIOS string number (1 or more)
+ */
+static int smbios_add_prop(struct smbios_ctx *ctx, const char *prop)
+{
+ return smbios_add_prop_si(ctx, prop, SYSINFO_ID_NONE);
+}
+
static void smbios_set_eos(struct smbios_ctx *ctx, char *eos)
{
ctx->eos = eos;
@@ -240,7 +263,8 @@ static int smbios_write_type1(ulong *current, int handle,
smbios_set_eos(ctx, t->eos);
t->manufacturer = smbios_add_prop(ctx, "manufacturer");
t->product_name = smbios_add_prop(ctx, "product");
- t->version = smbios_add_prop(ctx, "version");
+ t->version = smbios_add_prop_si(ctx, "version",
+ SYSINFO_ID_SMBIOS_SYSTEM_VERSION);
if (serial_str) {
t->serial_number = smbios_add_string(ctx, serial_str);
strncpy((char *)t->uuid, serial_str, sizeof(t->uuid));
@@ -269,6 +293,8 @@ static int smbios_write_type2(ulong *current, int handle,
smbios_set_eos(ctx, t->eos);
t->manufacturer = smbios_add_prop(ctx, "manufacturer");
t->product_name = smbios_add_prop(ctx, "product");
+ t->version = smbios_add_prop_si(ctx, "version",
+ SYSINFO_ID_SMBIOS_BASEBOARD_VERSION);
t->asset_tag_number = smbios_add_prop(ctx, "asset-tag");
t->feature_flags = SMBIOS_BOARD_FEATURE_HOSTING;
t->board_type = SMBIOS_BOARD_MOTHERBOARD;