Merge https://source.denx.de/u-boot/custodians/u-boot-marvell
[platform/kernel/u-boot.git] / lib / smbios.c
index 7d463c8..d7f4999 100644 (file)
@@ -8,6 +8,7 @@
 #include <common.h>
 #include <dm.h>
 #include <env.h>
+#include <linux/stringify.h>
 #include <mapmem.h>
 #include <smbios.h>
 #include <sysinfo.h>
 #include <dm/uclass-internal.h>
 #endif
 
-DECLARE_GLOBAL_DATA_PTR;
+/* Safeguard for checking that U_BOOT_VERSION_NUM macros are compatible with U_BOOT_DMI */
+#if U_BOOT_VERSION_NUM < 2000 || U_BOOT_VERSION_NUM > 2099 || \
+    U_BOOT_VERSION_NUM_PATCH < 1 || U_BOOT_VERSION_NUM_PATCH > 12
+#error U_BOOT_VERSION_NUM macros are not compatible with DMI, fix U_BOOT_DMI macros
+#endif
 
-enum {
-       SMBIOS_STR_MAX  = 64,   /* Maximum length allowed for a string */
-};
+/*
+ * U_BOOT_DMI_DATE contains BIOS Release Date in format mm/dd/yyyy.
+ * BIOS Release Date is calculated from U-Boot version and fixed day 01.
+ * So for U-Boot version 2021.04 it is calculated as "04/01/2021".
+ * BIOS Release Date should contain date when code was released
+ * and not when it was built or compiled.
+ */
+#if U_BOOT_VERSION_NUM_PATCH < 10
+#define U_BOOT_DMI_MONTH "0" __stringify(U_BOOT_VERSION_NUM_PATCH)
+#else
+#define U_BOOT_DMI_MONTH __stringify(U_BOOT_VERSION_NUM_PATCH)
+#endif
+#define U_BOOT_DMI_DAY "01"
+#define U_BOOT_DMI_YEAR __stringify(U_BOOT_VERSION_NUM)
+#define U_BOOT_DMI_DATE U_BOOT_DMI_MONTH "/" U_BOOT_DMI_DAY "/" U_BOOT_DMI_YEAR
+
+DECLARE_GLOBAL_DATA_PTR;
 
 /**
  * struct smbios_ctx - context for writing SMBIOS tables
@@ -51,7 +70,7 @@ struct smbios_ctx {
  * @addr:      start address to write the structure
  * @handle:    the structure's handle, a unique 16-bit number
  * @ctx:       context for writing the tables
- * @return:    size of the structure
+ * Return:     size of the structure
  */
 typedef int (*smbios_write_type)(ulong *addr, int handle,
                                 struct smbios_ctx *ctx);
@@ -76,7 +95,7 @@ struct smbios_write_method {
  *
  * @ctx:       SMBIOS context
  * @str:       string to add
- * @return:    string number in the string area (1 or more)
+ * Return:     string number in the string area (1 or more)
  */
 static int smbios_add_string(struct smbios_ctx *ctx, const char *str)
 {
@@ -115,7 +134,7 @@ static int smbios_add_string(struct smbios_ctx *ctx, const char *str)
  *
  * @ctx:       context for writing the tables
  * @prop:      property to write
- * @return 0 if not found, else SMBIOS string number (1 or more)
+ * Return:     0 if not found, else SMBIOS string number (1 or more)
  */
 static int smbios_add_prop_si(struct smbios_ctx *ctx, const char *prop,
                              int sysinfo_id)
@@ -143,7 +162,7 @@ static int smbios_add_prop_si(struct smbios_ctx *ctx, const char *prop,
  * 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)
+ * Return:     0 if not found, else SMBIOS string number (1 or more)
  */
 static int smbios_add_prop(struct smbios_ctx *ctx, const char *prop)
 {
@@ -191,7 +210,7 @@ int smbios_update_version(const char *version)
  * This computes the size of the string area including the string terminator.
  *
  * @ctx:       SMBIOS context
- * @return:    string area size
+ * Return:     string area size
  */
 static int smbios_string_table_len(const struct smbios_ctx *ctx)
 {
@@ -233,9 +252,9 @@ static int smbios_write_type0(ulong *current, int handle,
        t->bios_characteristics_ext1 = BIOS_CHARACTERISTICS_EXT1_ACPI;
 #endif
 #ifdef CONFIG_EFI_LOADER
-       t->bios_characteristics_ext1 |= BIOS_CHARACTERISTICS_EXT1_UEFI;
+       t->bios_characteristics_ext2 |= BIOS_CHARACTERISTICS_EXT2_UEFI;
 #endif
-       t->bios_characteristics_ext2 = BIOS_CHARACTERISTICS_EXT2_TARGET;
+       t->bios_characteristics_ext2 |= BIOS_CHARACTERISTICS_EXT2_TARGET;
 
        /* bios_major_release has only one byte, so drop century */
        t->bios_major_release = U_BOOT_VERSION_NUM % 100;
@@ -262,7 +281,11 @@ static int smbios_write_type1(ulong *current, int handle,
        fill_smbios_header(t, SMBIOS_SYSTEM_INFORMATION, len, handle);
        smbios_set_eos(ctx, t->eos);
        t->manufacturer = smbios_add_prop(ctx, "manufacturer");
+       if (!t->manufacturer)
+               t->manufacturer = smbios_add_string(ctx, "Unknown");
        t->product_name = smbios_add_prop(ctx, "product");
+       if (!t->product_name)
+               t->product_name = smbios_add_string(ctx, "Unknown Product");
        t->version = smbios_add_prop_si(ctx, "version",
                                        SYSINFO_ID_SMBIOS_SYSTEM_VERSION);
        if (serial_str) {
@@ -292,7 +315,11 @@ static int smbios_write_type2(ulong *current, int handle,
        fill_smbios_header(t, SMBIOS_BOARD_INFORMATION, len, handle);
        smbios_set_eos(ctx, t->eos);
        t->manufacturer = smbios_add_prop(ctx, "manufacturer");
+       if (!t->manufacturer)
+               t->manufacturer = smbios_add_string(ctx, "Unknown");
        t->product_name = smbios_add_prop(ctx, "product");
+       if (!t->product_name)
+               t->product_name = smbios_add_string(ctx, "Unknown Product");
        t->version = smbios_add_prop_si(ctx, "version",
                                        SYSINFO_ID_SMBIOS_BASEBOARD_VERSION);
        t->asset_tag_number = smbios_add_prop(ctx, "asset-tag");
@@ -317,6 +344,8 @@ static int smbios_write_type3(ulong *current, int handle,
        fill_smbios_header(t, SMBIOS_SYSTEM_ENCLOSURE, len, handle);
        smbios_set_eos(ctx, t->eos);
        t->manufacturer = smbios_add_prop(ctx, "manufacturer");
+       if (!t->manufacturer)
+               t->manufacturer = smbios_add_string(ctx, "Unknown");
        t->chassis_type = SMBIOS_ENCLOSURE_DESKTOP;
        t->bootup_state = SMBIOS_STATE_SAFE;
        t->power_supply_state = SMBIOS_STATE_SAFE;
@@ -501,7 +530,8 @@ ulong write_smbios_table(ulong addr)
                 */
                printf("WARNING: SMBIOS table_address overflow %llx\n",
                       (unsigned long long)table_addr);
-               table_addr = 0;
+               addr = 0;
+               goto out;
        }
        se->struct_table_address = table_addr;
 
@@ -512,6 +542,7 @@ ulong write_smbios_table(ulong addr)
        isize = sizeof(struct smbios_entry) - SMBIOS_INTERMEDIATE_OFFSET;
        se->intermediate_checksum = table_compute_checksum(istart, isize);
        se->checksum = table_compute_checksum(se, sizeof(struct smbios_entry));
+out:
        unmap_sysmem(se);
 
        return addr;