Blame SOURCES/0036-devtree-Add-description-vendor-and-clock-info-to-mem.patch

df7b7f
From 9f448f011d58c5c2e5279dccb077bfd83a02da68 Mon Sep 17 00:00:00 2001
df7b7f
From: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
df7b7f
Date: Tue, 29 Nov 2016 12:02:03 +0530
df7b7f
Subject: [PATCH 36/43] devtree: Add description, vendor and clock info to
df7b7f
 memory bank
df7b7f
df7b7f
This patch parses SPD info to get vendor id and then uses
df7b7f
jedec_resolve() to get vendor name. Also adds clock and description
df7b7f
info based on SPD values.
df7b7f
df7b7f
Sample output;
df7b7f
        *-bank:1
df7b7f
             description: RDIMM DDR3 1600 MHz (0.6ns)
df7b7f
             product: HMT42GR7BFR4A-PB
df7b7f
             vendor: Hynix Semiconductor (Hyundai Electronics)
df7b7f
             physical id: 1
df7b7f
             version: 5438,15 33,01
df7b7f
             serial: 0x10c0af2c
df7b7f
             slot: Physical:/Sys0/Node0/DIMM11
df7b7f
             size: 16GiB
df7b7f
             clock: 1333MHz (0.8ns)
df7b7f
             capabilities: ecc spd-1.3
df7b7f
             configuration: errordetection=ecc
df7b7f
df7b7f
Signed-off-by: Jack Miller <jack@codezen.org>
df7b7f
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
df7b7f
---
df7b7f
 src/core/device-tree.cc | 34 ++++++++++++++++++++++++++++++++++
df7b7f
 1 file changed, 34 insertions(+)
df7b7f
df7b7f
diff --git a/src/core/device-tree.cc b/src/core/device-tree.cc
df7b7f
index e286ab4..e224024 100644
df7b7f
--- a/src/core/device-tree.cc
df7b7f
+++ b/src/core/device-tree.cc
df7b7f
@@ -14,6 +14,7 @@
df7b7f
 #include "version.h"
df7b7f
 #include "device-tree.h"
df7b7f
 #include "osutils.h"
df7b7f
+#include "jedec.h"
df7b7f
 #include <sys/types.h>
df7b7f
 #include <sys/stat.h>
df7b7f
 #include <arpa/inet.h>
df7b7f
@@ -808,6 +809,39 @@ static void add_memory_bank_spd(string path, hwNode & bank)
df7b7f
         bank.setConfig("errordetection", "ecc");
df7b7f
         break;
df7b7f
     }
df7b7f
+
df7b7f
+    double ns = (dimminfo[0xc] / 2) * (dimminfo[0xa] / (float) dimminfo[0xb]);
df7b7f
+    bank.setClock(1000000000 / ns);
df7b7f
+
df7b7f
+    char vendor[3];
df7b7f
+    snprintf(vendor, sizeof(vendor), "%x%x", dimminfo[0x76], dimminfo[0x75]);
df7b7f
+    bank.setVendor(jedec_resolve(vendor));
df7b7f
+
df7b7f
+    char description[100];
df7b7f
+    const char *type, *mod_type;
df7b7f
+
df7b7f
+    type = "DDR3";
df7b7f
+    switch(dimminfo[0x3])
df7b7f
+    {
df7b7f
+      case 0x1:
df7b7f
+        mod_type = "RDIMM";
df7b7f
+        break;
df7b7f
+      case 0x2:
df7b7f
+        mod_type = "UDIMM";
df7b7f
+        break;
df7b7f
+      case 0x3:
df7b7f
+        mod_type = "SODIMM";
df7b7f
+        break;
df7b7f
+      case 0x4:
df7b7f
+        mod_type = "LRDIMM";
df7b7f
+        break;
df7b7f
+      default:
df7b7f
+        mod_type = "DIMM";
df7b7f
+    }
df7b7f
+
df7b7f
+    snprintf(description, sizeof(description), "%s %s %d MHz (%0.1fns)",
df7b7f
+	     mod_type, type, (int) (1000 / ns), ns);
df7b7f
+    bank.setDescription(description);
df7b7f
   } else {
df7b7f
     mfg_loc_offset = 0x48;
df7b7f
     rev_offset1 = 0x5b;
df7b7f
-- 
df7b7f
2.10.2
df7b7f