Record type 202: DIMM Location Record

Signed-off-by: Jerry Hoemann <jerry.hoem...@hpe.com>
---
 dmioem.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 92 insertions(+)

diff --git a/dmioem.c b/dmioem.c
index d4d83e2..0a01919 100644
--- a/dmioem.c
+++ b/dmioem.c
@@ -1147,6 +1147,98 @@ static int dmi_decode_hp(const struct dmi_header *h)
                        }
                        break;
 
+               case 202:
+                       /*
+                        * Vendor Specific: HPE DIMM Location Record
+                        *
+                        * This record allows software to correlate a Type 17 
Memory Device Record
+                        * with a specific DIMM (DIMM, Board, and/or Processor 
number if appropriate).
+                        *
+                        * There will be one Record Type 202 for each DIMM 
socket possible in the system.
+                        * A system will include a record for each DIMM socket 
even if that DIMM socket
+                        * is on a memory board which is not currently 
installed.
+                        *
+                        * Offset |  Name        | Width | Description
+                        * -------------------------------------
+                        *  0x00  | Type         | BYTE  | 0xCA, DIMM Location 
Record
+                        *  0x01  | Length       | BYTE  | Length of structure
+                        *  0x02  | Handle       | WORD  | Unique handle
+                        *  0x04  | Assoc Record | WORD  | Handle of Associated 
Type 17 Memory Record
+                        *  0x06  | Board Number | BYTE  | 1-based Memory Board 
number. 0FFh: DIMM on system board
+                        *  0x07  | DIMM Number  | BYTE  | 1-based DIMM number
+                        *  0x08  | Proc Number  | BYTE  | 1-based procssor 
number. 0FFh don't display
+                        *  0x09  | Log DIMM Num | BYTE  | 1-based Logical DIMM 
number mapping to ACPI numbering
+                        *  0x0A  | UEFI Dev Path| STRING| String number for 
UEFI Device Path
+                        *  0x0B  | UEFI Dev Name| STRING| String number for 
UEFI Device Structured Name
+                        *  0x0C  | Device Name  | STRING| String number for 
Device Name
+                        *  0x0D  | Mem Cntrl Num| BYTE  | 1-based Memory 
controller number
+                        *  0x0E  | Mem Chan Num | BYTE  | 1-based memory 
channel number (matches silk screen)
+                        *  0x0F  | IE DIMM Num  | BYTE  | 0-based DIMM number 
repored by IE. FF -> not supported
+                        *                               | Reserved G12 or later
+                        *  0x10  | IE PLDM ID   | BYTE  | IE PLDM Sensor ID. 
FF -> not supported
+                        *                               | Reserved G12 or later
+                        *  0x11  | Vendor ID    | WORD  | Module manufacturers 
ID code as read by SPD
+                        *  0x13  | Device ID    | WORD  | (NVDIMM only) Module 
product ID code from SPD
+                        *  0x15  | Sub Cntrl Ven| WORD  | (NVDIMM only) 
Controller manufacturer ID from SPD
+                        *  0x17  | Sub Cntrl Dev| WORD  | (NVDIMM only) 
Controller product ID from SPD
+                        *  0x19  | Interleave   | BYTE  | 1-based unique 
interleave set within Procssor Number
+                        *  0x1A  | Part Number  | STRING| String number for 
HPE part number from OEM SPD
+                        *  0x1B  | DIMM Index   | BYTE  | 0-based DIMM Index 
Per Channel
+                        */
+
+                       if (gen < G9) return 0;
+                       pr_handle_name("%s DIMM Location Record", company);
+
+                       if (h->length < 0x09) break;
+                       if (!(opt.flags & FLAG_QUIET))
+                               pr_attr("Associated Memory Record", "0x%04X", 
WORD(data + 0x04));
+                       if (data[0x06] == 0xFF)
+                               pr_attr("Board Number", "%s", "System Board");
+                       else
+                               pr_attr("Board Number", "%d", data[0x06]);
+                       pr_attr("DIMM Number", "%d", data[0x07]);
+                       if (data[0x08] != 0xFF)
+                               pr_attr("Processor Number", "%d", data[0x08]);
+
+                       if (h->length < 0x0A) break;
+                       pr_attr("Logical DIMM Number", "%d", data[0x09]);
+
+                       if (h->length < 0x0D) break;
+                       if (data[0x0A])
+                               pr_attr("UEFI Device Path", "%s", dmi_string(h, 
data[0x0A]));
+                       if (data[0x0B])
+                               pr_attr("UEFI Device Name", "%s", dmi_string(h, 
data[0x0B]));
+                       if (data[0x0C])
+                               pr_attr("Device Name", "%s", dmi_string(h, 
data[0x0C]));
+
+                       if (h->length < 0x19) break;
+                       if (data[0x0D])
+                               pr_attr("Memory Controller Number", "%d", 
data[0x0D]);
+                       if (data[0x0E])
+                               pr_attr("Memory Channel Number", "%d", 
data[0x0E]);
+                       if (gen < G12 && data[0x0F] != 0xFF)
+                               pr_attr("IE DIMM Number", "%d", data[0x0F]);
+                       if (gen < G12 && data[0x10] != 0xFF)
+                               pr_attr("IE PLDM ID", "%d", data[0x10]);
+                       if (data[0x11] || data[0x12])
+                               pr_attr("Vendor ID", "0x%04X", WORD(data + 
0x11));
+                       if (data[0x13] || data[0x14])
+                               pr_attr("Device ID", "0x%04X", WORD(data + 
0x13));
+                       if (data[0x15] || data[0x16])
+                               dmi_memory_manufacturer_id("Controller 
Manufacturer ID", WORD(data + 0x15));
+                       if (data[0x17] || data[0x18])
+                               dmi_memory_product_id("Controller Product ID", 
WORD(data + 0x17));
+
+                       if (h->length < 0x1A) break;
+                       if (data[0x19])
+                               pr_attr("Best Interleave", "%d", data[0x19]);
+                       if (h->length < 0x1B) break;
+                       pr_attr("Part Number", "%s", dmi_string(h, data[0x1A]));
+
+                       if (h->length < 0x1C) break;
+                       pr_attr("DIMM Index", "%d", data[0x1B]);
+                       break;
+
                case 203:
                        /*
                         * Vendor Specific: HP Device Correlation Record
-- 
2.47.1


Reply via email to