[SeaBIOS] [PATCH] SMBIOS: Add SMBIOS Type 6 Memory Module Information

Liran Alon posted 1 patch 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/seabios tags/patchew/20181128155422.29113-1-liran.alon@oracle.com
src/fw/smbios.c  | 46 ++++++++++++++++++++++++++++++++++++++++++++++
src/std/smbios.h | 12 ++++++++++++
2 files changed, 58 insertions(+)

[SeaBIOS] [PATCH] SMBIOS: Add SMBIOS Type 6 Memory Module Information

Posted by Liran Alon 1 week ago
From: Arbel Moshe <arbel.moshe@oracle.com>

Add support for obsolete SMBIOS Type 6 which describes the speed, type,
size and error status of each system memory module.

This is required by some guests to boot successfully.

Such an example is Cisco NGFW appliance which has a script which
runs every boot that parses this SMBIOS Type 6 information and if
it doesn't exists, it just fails to boot with an error of
"Unable to parse dmidecode. Restarting now!".

Reviewed-by: Liran Alon <liran.alon@oracle.com>
Reviewed-by: Ross Philipson <ross.philipson@oracle.com>
Signed-off-by: Arbel Moshe <arbel.moshe@oracle.com>
---
 src/fw/smbios.c  | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 src/std/smbios.h | 12 ++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/src/fw/smbios.c b/src/fw/smbios.c
index f3b5ad9dd9a0..751ae98f0fc4 100644
--- a/src/fw/smbios.c
+++ b/src/fw/smbios.c
@@ -348,6 +348,51 @@ smbios_init_type_4(void *start, unsigned int cpu_number)
     return end;
 }
 
+/* Type 6 -- Memory Module Information */
+static void *
+smbios_init_type_6(void *start, u32 size_mb, int instance)
+{
+    struct smbios_type_6 *p = (struct smbios_type_6 *)start;
+    char *end = (char *)start + sizeof(struct smbios_type_6);
+    u8 size_mem = 0;
+    char name[1024];
+    int str_index = 0;
+
+    p->header.type = 6;
+    p->header.length = sizeof(struct smbios_type_6);
+    p->header.handle = 0x600 + instance;
+
+    snprintf(name, sizeof(name), "RAM socket #%2x", instance);
+
+    memcpy(end, name, strlen(name) + 1);
+    end += strlen(name) + 1;
+    p->socket_designation_str = ++str_index;
+
+    set_field_with_default(6, bank_connection, 0xff); /* No connection */
+    set_field_with_default(6, current_speed, 0); /* Unknown Speed */
+    set_field_with_default(6, memory_type, 0x400); /* SDRAM */
+
+    /* size_mem = n, where 2**n = size_mb */
+    size_mb = size_mb >> 1;
+    while (size_mb) {
+        ++size_mem;
+        size_mb = size_mb >> 1;
+    }
+
+    p->installed_size = size_mem;
+    p->enabled_size = size_mem;
+    set_field_with_default(6, error_status, 0);
+
+    *end = 0;
+    end++;
+    if (!str_index) {
+        *end = 0;
+        end++;
+    }
+
+    return end;
+}
+
 /* Type 16 -- Physical Memory Array */
 static void *
 smbios_init_type_16(void *start, u32 memory_size_mb, int nr_mem_devs)
@@ -550,6 +595,7 @@ smbios_legacy_setup(void)
         u32 dev_mb = ((i == (nr_mem_devs - 1))
                       ? (((ram_mb - 1) & 0x3fff) + 1)
                       : 16384);
+        add_struct(6, p, dev_mb, i);
         add_struct(17, p, dev_mb, i);
     }
 
diff --git a/src/std/smbios.h b/src/std/smbios.h
index 4ccf2ea348ee..765ac51667ed 100644
--- a/src/std/smbios.h
+++ b/src/std/smbios.h
@@ -100,6 +100,18 @@ struct smbios_type_4 {
     u16 l3_cache_handle;
 } PACKED;
 
+/* SMBIOS type 6 - Memory Module Information */
+struct smbios_type_6 {
+    struct smbios_structure_header header;
+    u8 socket_designation_str;
+    u8 bank_connection;
+    u8 current_speed;
+    u16 memory_type;
+    u8 installed_size;
+    u8 enabled_size;
+    u8 error_status;
+} PACKED;
+
 /* SMBIOS type 16 - Physical Memory Array
  *   Associated with one type 17 (Memory Device).
  */
-- 
2.16.1


_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://mail.coreboot.org/mailman/listinfo/seabios

Re: [SeaBIOS] [PATCH] SMBIOS: Add SMBIOS Type 6 Memory Module Information

Posted by Laszlo Ersek 1 week ago
On 11/28/18 16:54, Liran Alon wrote:
> From: Arbel Moshe <arbel.moshe@oracle.com>
> 
> Add support for obsolete SMBIOS Type 6 which describes the speed, type,
> size and error status of each system memory module.
> 
> This is required by some guests to boot successfully.
> 
> Such an example is Cisco NGFW appliance which has a script which
> runs every boot that parses this SMBIOS Type 6 information and if
> it doesn't exists, it just fails to boot with an error of
> "Unable to parse dmidecode. Restarting now!".
> 
> Reviewed-by: Liran Alon <liran.alon@oracle.com>
> Reviewed-by: Ross Philipson <ross.philipson@oracle.com>
> Signed-off-by: Arbel Moshe <arbel.moshe@oracle.com>
> ---
>  src/fw/smbios.c  | 46 ++++++++++++++++++++++++++++++++++++++++++++++

This file starts with the following two lines:

// smbios table generation (on emulators)
// DO NOT ADD NEW FEATURES HERE.  (See paravirt.c / biostables.c instead.)

Please consider extending the SMBIOS generator in QEMU instead.

Thanks
Laszlo

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://mail.coreboot.org/mailman/listinfo/seabios

Re: [SeaBIOS] [PATCH] SMBIOS: Add SMBIOS Type 6 Memory Module Information

Posted by Liran Alon 1 week ago

> On 28 Nov 2018, at 22:17, Laszlo Ersek <lersek@redhat.com> wrote:
> 
> On 11/28/18 16:54, Liran Alon wrote:
>> From: Arbel Moshe <arbel.moshe@oracle.com>
>> 
>> Add support for obsolete SMBIOS Type 6 which describes the speed, type,
>> size and error status of each system memory module.
>> 
>> This is required by some guests to boot successfully.
>> 
>> Such an example is Cisco NGFW appliance which has a script which
>> runs every boot that parses this SMBIOS Type 6 information and if
>> it doesn't exists, it just fails to boot with an error of
>> "Unable to parse dmidecode. Restarting now!".
>> 
>> Reviewed-by: Liran Alon <liran.alon@oracle.com>
>> Reviewed-by: Ross Philipson <ross.philipson@oracle.com>
>> Signed-off-by: Arbel Moshe <arbel.moshe@oracle.com>
>> ---
>> src/fw/smbios.c  | 46 ++++++++++++++++++++++++++++++++++++++++++++++
> 
> This file starts with the following two lines:
> 
> // smbios table generation (on emulators)
> // DO NOT ADD NEW FEATURES HERE.  (See paravirt.c / biostables.c instead.)
> 
> Please consider extending the SMBIOS generator in QEMU instead.
> 
> Thanks
> Laszlo

I thought originally that QEMU SMBIOS generator is used only for non-legacy SMBIOS.
But seems like I was wrong and indeed can use SMBIOS_TABLE_ENTRY entry on QEMU_CFG_SMBIOS_ENTRIES.

Will need to submit patches to QEMU then… Thanks,
-Liran


_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://mail.coreboot.org/mailman/listinfo/seabios