summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Hoemann <jerry.hoemann@hpe.com>2023-04-03 13:42:21 +0200
committerJean Delvare <jdelvare@suse.de>2023-04-03 13:42:21 +0200
commit9af40b6484c8e1f8f1530a2c2ef97b5cc1aa28db (patch)
tree12a9a835f527f8f1fafe369f10c55bc658fb1fe8
parentce2e75a73b9de5c1e857b01f02123d6e6c008702 (diff)
downloaddmidecode-git-9af40b6484c8e1f8f1530a2c2ef97b5cc1aa28db.tar.gz
dmioem: Decode HPE OEM Record 239
Decode HPE OEM Record 239: USB Device Correlation Record. Signed-off-by: Jerry Hoemann <jerry.hoemann@hpe.com> Signed-off-by: Jean Delvare <jdelvare@suse.de>
-rw-r--r--dmioem.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/dmioem.c b/dmioem.c
index ee4b968..4b9248e 100644
--- a/dmioem.c
+++ b/dmioem.c
@@ -620,6 +620,85 @@ static void dmi_hp_238_speed(const char *fname, unsigned int code)
pr_attr(fname, "%s", str);
}
+static void dmi_hp_239_usb_device(u8 class, u8 subclass, u8 protocol)
+{
+ /* https://www.usb.org/defined-class-codes */
+ /* https://www.usb.org/sites/default/files/Mass_Storage_Specification_Overview_v1.4_2-19-2010.pdf */
+ const char *str = "Reserved";
+ if (class == 0x08)
+ {
+ static const char * const sub_class_name[] = {
+ "SCSI command set not reported", /* 0x00 */
+ "RBC",
+ "ATAPI",
+ "Obsolete",
+ "UFI",
+ "Obsolete",
+ "SCSI",
+ "LSD FS",
+ "IEEE 1667" /* 0x08 */
+ };
+ pr_attr("USB Class", "%s", "Mass Storage");
+ if (subclass == 0xFF)
+ {
+ str = "Vendor Specific";
+ }
+ else if (subclass < ARRAY_SIZE(sub_class_name))
+ {
+ str = sub_class_name[subclass];
+ }
+ pr_attr("USB SubClass", "%s", str);
+
+ switch (protocol) {
+ case 0x00:
+ str = "CBI w/ completion interrupt";
+ break;
+ case 0x01:
+ str = "CBI w/o completion interrupt";
+ break;
+ case 0x02:
+ str = "Obsolete";
+ break;
+ case 0x50:
+ str = "Bulk-Only";
+ break;
+ case 0x62:
+ str = "UAS";
+ break;
+ case 0xFF:
+ str = "Vendor Specific";
+ break;
+ default:
+ str = "Reserved";
+ }
+ pr_attr("USB Protocol", "%s", str);
+ }
+ else if (class == 0x09 && subclass == 0)
+ {
+ pr_attr("USB Class", "%s", "HUB");
+ switch (protocol) {
+ case 0:
+ str = "Full Speed";
+ break;
+ case 1:
+ str = "Hi-Speed w/ single TT";
+ break;
+ case 2:
+ str = "Hi-Speed w/ multiple TT";
+ break;
+ default:
+ str = "Reserved";
+ }
+ pr_attr("USB Protocol", str);
+ }
+ else
+ {
+ pr_attr("USB Class", "0x%02x", class);
+ pr_attr("USB SubClass", "0x%02x", subclass);
+ pr_attr("USB Protocol", "0x%02x", protocol);
+ }
+}
+
static void dmi_hp_242_hdd_type(u8 code)
{
const char *str = "Reserved";
@@ -1149,6 +1228,54 @@ static int dmi_decode_hp(const struct dmi_header *h)
pr_attr("Device Path", "%s", dmi_string(h, data[0xE]));
break;
+ case 239:
+ /*
+ * Vendor Specific: HPE USB Device Correlation Record
+ *
+ * This record provides a mechanism for software to correlate USB device
+ * information provided in SMBIOS record Type 8 and Type 238. It
+ * additionally provides device specific data that is typically not
+ * available in SMBIOS to allow HP tools to understand how these device
+ * entries correlate to both UEFI and Legacy USB Boot entries. This record
+ * will only contain information for a device detected by the BIOS during
+ * POST and does not comprehend a hot plug event after the system has
+ * booted. This record will only be supported on UEFI Based systems.
+ *
+ * Offset | Name | Width | Description
+ * -------+------------+-------+------------
+ * 0x00 | Type | BYTE | 0xEF, HP Device Correlation Record
+ * 0x01 | Length | BYTE | Length of structure
+ * 0x02 | Handle | WORD | Unique handle
+ * 0x04 | Hand Assoc | WORD | Handle to map to Type 238
+ * 0x06 | Vendor ID | WORD | Vendor ID of detected USB Device
+ * 0x08 | Flags | WORD | Bit[0] - Indicates presence of SD card
+ * 0x0A | Class | BYTE | USB Device Class per USB HID Dev Spec
+ * 0x0B | Sub Class | BYTE | USB Device SubClass per USB HID Dev Spec
+ * 0x0C | Protocol | BYTE | Device Protocol per USB HID Dev Spec
+ * 0x0D | Product ID | WORD | USB Product ID
+ * 0x0F | Capacity | DWORD | USB Device Capacity (if apropos) in Mbytes
+ * 0x13 | Device Path| STRING| UEFI Device Path
+ * 0x14 | Device Name| STRING| UEFI Device Structured Name
+ * 0x15 | UEFI Name | STRING| Device Name
+ * 0x16 | Location | STRING| USB Device Location
+ */
+ if (gen < G9) return 0;
+ pr_handle_name("%s USB Device Correlation Record", company);
+ if (h->length < 0x17) break;
+ if (!(opt.flags & FLAG_QUIET))
+ pr_attr("Associated Handle", "0x%04X", WORD(data + 0x04));
+ pr_attr("USB Vendor ID", "0x%04x", WORD(data + 0x06));
+ pr_attr("Embedded SD Card", "%s", data[0x08] & 0x01 ? "Present" : "Empty");
+ dmi_hp_239_usb_device(data[0x0A], data[0x0B], data[0x0C]);
+ pr_attr("USB Product ID", "0x%04x", WORD(data + 0x0D));
+ if (DWORD(data + 0x0F))
+ pr_attr("USB Capacity", "%u MB", DWORD(data + 0x0F));
+ pr_attr("UEFI Device Path", "%s", dmi_string(h, data[0x13]));
+ pr_attr("UEFI Device Name", "%s", dmi_string(h, data[0x14]));
+ pr_attr("Device Name", "%s", dmi_string(h, data[0x15]));
+ pr_attr("Device Location", "%s", dmi_string(h, data[0x16]));
+ break;
+
case 240:
/*
* Vendor Specific: HPE Proliant Inventory Record