DIMM Current Configuration Record

Signed-off-by: Jerry Hoemann <[email protected]>
---
 dmioem.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)

diff --git a/dmioem.c b/dmioem.c
index cffa49d..44f9c88 100644
--- a/dmioem.c
+++ b/dmioem.c
@@ -949,6 +949,22 @@ static void dmi_hp_242_speed(const char *attr, u16 speed)
                pr_attr(attr, "%s", "Unknown");
 }
 
+static void dmi_hp_244_health(u8 code)
+{
+       const char *str = "Reserved";
+       static const char * const health[] = {
+               "Healthy", /* 0x00 */
+               "DIMM Missing",
+               "Config Inactive",
+               "SPA Missing",
+               "New Goal",
+               "Locked", /* 0x05 */
+       };
+       if (code < ARRAY_SIZE(health))
+               str = health[code];
+       pr_attr("Interleave Set Health", "%s", str);
+}
+
 static void dmi_hp_245_pcie_riser(const struct dmi_header *h)
 {
        const char *str = "Reserved";
@@ -1919,6 +1935,76 @@ static int dmi_decode_hp(const struct dmi_header *h)
                        dmi_hp_242_speed("Capable Speed", WORD(data + 0x3C));
                        break;
 
+               case 244:
+                       /*
+                        * Vendor Specific: HPE DIMM Current Configuration 
Record
+                        *
+                        * This record is used to communicate information about 
the currently
+                        * configured memory regions on DIMMs installed in the 
system.
+                        *
+                        * There will be at least one Type 244 Record for each 
DIMM installed
+                        * in the system with configured non-volatile or 
volatile memory.
+                        *
+                        * The number of DIMM Configuration Records for each 
DIMM is specified by
+                        * the Configured Region Count field in its 
corresponding Type 232 DIMM
+                        * Capabilities record. Each record represents a memory 
region on the
+                        * DIMM, labeled by its Region ID. The Memory Type 
field can be used to
+                        * determine the currently configured memory type for 
the region. When
+                        * set to Volatile, the data on the memory region is 
lost on a power
+                        * cycle. When set to Byte Accessible Persistent, the 
data on
+                        * the memory region is retained through a reset. The 
Region Memory Size
+                        * field contains the size of the configured region in 
MiB.
+                        *
+                        * The Passphrase State specifies the enable/disable 
state of the
+                        * Passphrase requirement and is only applicable when 
the DIMM region is
+                        * configured as Byte Accessible Persistent. The 
Interleave Set Index
+                        * specifies which interleave set the DIMM region 
belongs to, if any.
+                        * Regions with identical interleave set indices mean 
the DIMM regions
+                        * are interleaved. These indices should match what is 
found in the DIMM's
+                        * PCAT Interleave Information tables.  Interleave set 
indices are
+                        * 1-based. This will be a unique value per interleave 
set. If the DIMM
+                        * region is not interleaved, the interleave set index 
will
+                        * still be a unique value.
+                        *
+                        * Offset |  Name      | Width | Description
+                        * ---------------------------------------
+                        *  0x00  | Type       | BYTE  | 0xF4, DIMM Current 
Configuration Record
+                        *  0x01  | Length     | BYTE  | Length of structure
+                        *  0x02  | Handle     | WORD  | Unique handle
+                        *  0x04  | Hndl Assoc | WORD  | Handle of 
corresponding Type 17 record
+                        *  0x06  | Region ID  | BYTE  | Unique ID of memory 
region on DIMM
+                        *  0x07  | Region Type| WORD  | Persistence Type. Bit 
Field: See code
+                        *  0x09  | Region Size| QWORD | Size of memory region 
in MiB
+                        *  0x11  | Passphrase | BYTE  | Current state of 
Passphrase. See code
+                        *  0x12  | Set Index  | WORD  | Interleave set index. 
Region w/ same index
+                        *                             | are part of same 
interleave set.
+                        *  0x14  | DIMM Count | BYTE  | Number of DIMMs in 
interleave set
+                        *  0x15  | Health     | BYTE  | Health of Interleave 
set defined in code
+                        */
+
+                       pr_handle_name("%s DIMM Current Configuration", 
company);
+                       if (h->length < 0x14) break;
+                       if (!(opt.flags & FLAG_QUIET))
+                               pr_attr("Associated Handle", "0x%04X", 
WORD(data + 0x04));
+                       pr_attr("Region ID", "%d", data[0x06]);
+                       feat = WORD(data + 0x07);
+                       pr_attr("Persistence Type", "%s", (feat & 0x01) ? 
"Volatile" :
+                                                        ((feat >> 1) & 0x01) ? 
"Byte Accessible" :
+                                                        ((feat >> 2) & 0x01) ? 
"Block I/O" :
+                                                        "Reserved");
+                       dmi_print_memory_size("Size", QWORD(data + 0x09), 2);
+                       pr_attr("Passphrase Enabled", "%s", data[0x11] ? "Yes" 
: "No");
+                       feat = WORD(data + 0x12);
+                       if (feat)
+                               pr_attr("Interleave Set Index", "%d", WORD(data 
+ 0x12));
+                       if (h->length < 0x15) break;
+                       if (feat)
+                               pr_attr("Interleave DIMM Count", "%d", 
data[0x14]);
+                       if (h->length < 0x16) break;
+                       if (feat)
+                               dmi_hp_244_health(data[0x15]);
+                       break;
+
                case 245:
                        /*
                         * Vendor Specific: HPE Extension Board Inventory Record
-- 
2.50.0


Reply via email to