diff options
author | khali <khali> | 2015-05-21 19:14:06 +0000 |
---|---|---|
committer | khali <khali> | 2015-05-21 19:14:06 +0000 |
commit | 4df0a85e758390a6cc54df5aa45fe1659c2a9a0b (patch) | |
tree | 90b27cbaa7bff5c1a45f31185b6bfebd33e494b3 | |
parent | b76e823c0123f5b8335b01d911973b375e386ed4 (diff) | |
download | dmidecode-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.
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | dmioem.c | 55 |
2 files changed, 56 insertions, 0 deletions
@@ -1,6 +1,7 @@ 2015-05-21 Jean Delvare <jdelvare@suse.de> * dmidecode.c: Fix up invalid DMI type 34 structure length. + * dmioem.c: Decode HP-specific DMI types 212 and 219. 2015-05-13 Jean Delvare <jdelvare@suse.de> @@ -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; } |