summaryrefslogtreecommitdiff
path: root/dmioem.c
diff options
context:
space:
mode:
authorkhali <khali>2015-05-21 19:14:06 +0000
committerkhali <khali>2015-05-21 19:14:06 +0000
commit4df0a85e758390a6cc54df5aa45fe1659c2a9a0b (patch)
tree90b27cbaa7bff5c1a45f31185b6bfebd33e494b3 /dmioem.c
parentb76e823c0123f5b8335b01d911973b375e386ed4 (diff)
downloaddmidecode-4df0a85e758390a6cc54df5aa45fe1659c2a9a0b.tar.gz
dmioem: Decode HP-specific DMI types 212 and 219
Some information about OEM DMI types 212 and 219 for HP machines is available from the hpwdt kernel driver. Include the available information in the output of dmidecode.
Diffstat (limited to 'dmioem.c')
-rw-r--r--dmioem.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/dmioem.c b/dmioem.c
index 1a2aa2f..ae1370a 100644
--- a/dmioem.c
+++ b/dmioem.c
@@ -62,6 +62,17 @@ void dmi_set_vendor(const char *s)
dmi_vendor = VENDOR_ACER;
}
+static int is_printable(const u8 *data, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++)
+ if (data[i] < 32 || data[i] >= 127)
+ return 0;
+
+ return 1;
+}
+
/*
* HP-specific data structures are decoded here.
*
@@ -72,6 +83,7 @@ static int dmi_decode_hp(const struct dmi_header *h)
{
u8 *data = h->data;
int nic, ptr;
+ u32 feat;
switch (h->type)
{
@@ -124,6 +136,49 @@ static int dmi_decode_hp(const struct dmi_header *h)
}
break;
+ case 212:
+ /*
+ * Vendor Specific: HP 64-bit CRU Information
+ *
+ * Source: hpwdt kernel driver
+ */
+ printf("HP 64-bit CRU Information\n");
+ if (h->length < 0x18) break;
+ printf("\tSignature: 0x%08x", DWORD(data + 0x04));
+ if (is_printable(data + 0x04, 4))
+ printf(" (%c%c%c%c)", data[0x04], data[0x05],
+ data[0x06], data[0x07]);
+ printf("\n");
+ if (DWORD(data + 0x04) == 0x55524324)
+ {
+ u64 paddr = QWORD(data + 0x08);
+ paddr.l += DWORD(data + 0x14);
+ if (paddr.l < DWORD(data + 0x14))
+ paddr.h++;
+ printf("\tPhysical Address: 0x%08x%08x\n",
+ paddr.h, paddr.l);
+ printf("\tLength: 0x%08x\n", DWORD(data + 0x10));
+ }
+ break;
+
+ case 219:
+ /*
+ * Vendor Specific: HP ProLiant Information
+ *
+ * Source: hpwdt kernel driver
+ */
+ printf("HP ProLiant Information\n");
+ if (h->length < 0x08) break;
+ printf("\tPower Features: 0x%08x\n", DWORD(data + 0x04));
+ if (h->length < 0x0C) break;
+ printf("\tOmega Features: 0x%08x\n", DWORD(data + 0x08));
+ if (h->length < 0x14) break;
+ feat = DWORD(data + 0x10);
+ printf("\tMisc. Features: 0x%08x\n", feat);
+ printf("\t\tiCRU: %s\n", feat & 0x0001 ? "Yes" : "No");
+ printf("\t\tUEFI: %s\n", feat & 0x0408 ? "Yes" : "No");
+ break;
+
default:
return 0;
}