dmidecode-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dmidecode] [PATCH] dmidecode: Handle memory module extended speed field


From: Jean Delvare
Subject: [dmidecode] [PATCH] dmidecode: Handle memory module extended speed fields
Date: Thu, 15 Oct 2020 10:37:51 +0200

These fields were added by SMBIOS version 3.3.0. and although there
is no hardware fast enough to need them yet, we can support them
already. I missed them before because their addition is not mentioned
in the specification change log.

Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
 dmidecode.c |   26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

--- dmidecode.orig/dmidecode.c  2020-10-14 14:32:53.766930219 +0200
+++ dmidecode/dmidecode.c       2020-10-15 10:27:06.039595370 +0200
@@ -2684,12 +2684,22 @@ static void dmi_memory_device_type_detai
        }
 }
 
-static void dmi_memory_device_speed(const char *attr, u16 code)
+static void dmi_memory_device_speed(const char *attr, u16 code1, u32 code2)
 {
-       if (code == 0)
-               pr_attr(attr, "Unknown");
+       if (code1 == 0xFFFF)
+       {
+               if (code2 == 0)
+                       pr_attr(attr, "Unknown");
+               else
+                       pr_attr(attr, "%lu MT/s", code2);
+       }
        else
-               pr_attr(attr, "%u MT/s", code);
+       {
+               if (code1 == 0)
+                       pr_attr(attr, "Unknown");
+               else
+                       pr_attr(attr, "%u MT/s", code1);
+       }
 }
 
 static void dmi_memory_technology(u8 code)
@@ -4451,7 +4461,9 @@ static void dmi_decode(const struct dmi_
                                dmi_memory_device_type(data[0x12]));
                        dmi_memory_device_type_detail(WORD(data + 0x13));
                        if (h->length < 0x17) break;
-                       dmi_memory_device_speed("Speed", WORD(data + 0x15));
+                       dmi_memory_device_speed("Speed", WORD(data + 0x15),
+                                               h->length >= 0x5C ?
+                                               DWORD(data + 0x54) : 0);
                        if (h->length < 0x1B) break;
                        pr_attr("Manufacturer", "%s",
                                dmi_string(h, data[0x17]));
@@ -4468,7 +4480,9 @@ static void dmi_decode(const struct dmi_
                                pr_attr("Rank", "%u", data[0x1B] & 0x0F);
                        if (h->length < 0x22) break;
                        dmi_memory_device_speed("Configured Memory Speed",
-                                               WORD(data + 0x20));
+                                               WORD(data + 0x20),
+                                               h->length >= 0x5C ?
+                                               DWORD(data + 0x58) : 0);
                        if (h->length < 0x28) break;
                        dmi_memory_voltage_value("Minimum Voltage",
                                                 WORD(data + 0x22));


-- 
Jean Delvare
SUSE L3 Support



reply via email to

[Prev in Thread] Current Thread [Next in Thread]