Blame SOURCES/0040-devtree-Add-support-for-DDR4-SPD.patch

df7b7f
From 0ea2e95b3ccdeb3834bec6fe22d0794a65e8c37a Mon Sep 17 00:00:00 2001
df7b7f
From: Jeremy Kerr <jk@ozlabs.org>
df7b7f
Date: Tue, 6 Sep 2016 14:57:21 +0800
df7b7f
Subject: [PATCH 40/43] devtree: Add support for DDR4 SPD
df7b7f
df7b7f
This patch adds support for DDR4 SPD.
df7b7f
df7b7f
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
df7b7f
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
df7b7f
---
df7b7f
 src/core/device-tree.cc | 51 ++++++++++++++++++++++++++++++++++++-------------
df7b7f
 1 file changed, 38 insertions(+), 13 deletions(-)
df7b7f
df7b7f
diff --git a/src/core/device-tree.cc b/src/core/device-tree.cc
df7b7f
index 2672b53..48aac94 100644
df7b7f
--- a/src/core/device-tree.cc
df7b7f
+++ b/src/core/device-tree.cc
df7b7f
@@ -815,6 +815,7 @@ static void add_memory_bank_spd(string path, hwNode & bank)
df7b7f
   uint16_t partno_offset;
df7b7f
   uint16_t ver_offset;
df7b7f
   uint16_t serial_offset;
df7b7f
+  uint16_t bus_width_offset;
df7b7f
   int fd;
df7b7f
   size_t len = 0;
df7b7f
   dimminfo_buf dimminfo;
df7b7f
@@ -847,16 +848,47 @@ static void add_memory_bank_spd(string path, hwNode & bank)
df7b7f
   close(fd);
df7b7f
 
df7b7f
   if (dimminfo[2] >= 9) {
df7b7f
-    mfg_loc_offset = 0x77;
df7b7f
+    double ns;
df7b7f
+    char vendor[5];
df7b7f
+    const char *type, *mod_type;
df7b7f
+
df7b7f
     rev_offset1 = 0x92;
df7b7f
     rev_offset2 = 0x93;
df7b7f
-    year_offset = 0x78;
df7b7f
-    week_offset = 0x79;
df7b7f
-    partno_offset = 0x80;
df7b7f
     ver_offset = 0x01;
df7b7f
-    serial_offset = 0x7a;
df7b7f
 
df7b7f
-    switch ((dimminfo[0x8] >> 3) & 0x3) // DDR3 error detection and correction scheme
df7b7f
+    if (dimminfo[0x2] >= 0xc) {
df7b7f
+      type = "DDR4";
df7b7f
+      mfg_loc_offset = 0x142;
df7b7f
+      year_offset = 0x143;
df7b7f
+      week_offset = 0x144;
df7b7f
+      partno_offset = 0x149;
df7b7f
+      bus_width_offset = 0x0d;
df7b7f
+      serial_offset = 0x145;
df7b7f
+
df7b7f
+      /*
df7b7f
+       * There is no other valid values for the medium- and fine- timebase
df7b7f
+       * other than (125ps, 1ps), so we hard-code those here. The fine
df7b7f
+       * t_{ckavg}_{min} value is signed. Divide by 2 to get from raw clock
df7b7f
+       * to expected data rate
df7b7f
+       */
df7b7f
+      ns = (((float)dimminfo[0x12] * 0.125) +
df7b7f
+	    (((signed char) dimminfo[0x7d]) * 0.001)) / 2;
df7b7f
+      snprintf(vendor, sizeof(vendor), "%x%x", dimminfo[0x141], dimminfo[0x140]);
df7b7f
+    } else {
df7b7f
+      type = "DDR3";
df7b7f
+      mfg_loc_offset = 0x77;
df7b7f
+      year_offset = 0x78;
df7b7f
+      week_offset = 0x79;
df7b7f
+      partno_offset = 0x80;
df7b7f
+      serial_offset = 0x7a;
df7b7f
+      bus_width_offset = 0x08;
df7b7f
+
df7b7f
+      ns = (dimminfo[0xc] / 2) * (dimminfo[0xa] / (float) dimminfo[0xb]);
df7b7f
+      snprintf(vendor, sizeof(vendor), "%x%x", dimminfo[0x76], dimminfo[0x75]);
df7b7f
+    }
df7b7f
+
df7b7f
+    /* DDR3 & DDR4 error detection and correction scheme */
df7b7f
+    switch ((dimminfo[bus_width_offset] >> 3) & 0x3)
df7b7f
     {
df7b7f
       case 0x00:
df7b7f
         bank.setConfig("errordetection", "none");
df7b7f
@@ -867,17 +899,10 @@ static void add_memory_bank_spd(string path, hwNode & bank)
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
-- 
df7b7f
2.10.2
df7b7f