dmidecode-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 2/2] Update to support DSP0270 v1.3.0


From: John Chung
Subject: [PATCH v2 2/2] Update to support DSP0270 v1.3.0
Date: Fri, 9 Jun 2023 18:39:19 +0800

Added version 2 of USB and PCI/PCIe device descriptors.

  * USB Network Interface v2
  * PCI/PCIe Network Interface v2

Signed-off-by: John Chung <john.chung@arm.com>
---
 dmidecode.c | 153 +++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 127 insertions(+), 26 deletions(-)

diff --git a/dmidecode.c b/dmidecode.c
index 6926a93..bf9ca6b 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -57,7 +57,7 @@
  *    Family "2.0", Level 00, Revision 00.43, January 26, 2015
  *    
https://trustedcomputinggroup.org/pc-client-platform-tpm-profile-ptp-specification/
  *  - "RedFish Host Interface Specification" (DMTF DSP0270)
- *    https://www.dmtf.org/sites/default/files/DSP0270_1.0.1.pdf
+ *    
https://www.dmtf.org/sites/default/files/standards/documents/DSP0270_1.3.0.pdf
  *  - LoongArch Reference Manual, volume 1
  *    
https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html#_cpucfg
  */
@@ -3852,7 +3852,7 @@ static const char *dmi_protocol_record_type(u8 type)
 }
 
 /*
- * DSP0270: 8.6: Protocol IP Assignment types
+ * DSP0270: 8.4.2: Protocol IP Assignment types
  */
 static const char *dmi_protocol_assignment_type(u8 type)
 {
@@ -3870,7 +3870,7 @@ static const char *dmi_protocol_assignment_type(u8 type)
 }
 
 /*
- * DSP0270: 8.6: Protocol IP Address type
+ * DSP0270: 8.4.3: Protocol IP Address type
  */
 static const char *dmi_address_type(u8 type)
 {
@@ -3886,7 +3886,7 @@ static const char *dmi_address_type(u8 type)
 }
 
 /*
- *  DSP0270: 8.6 Protocol Address decode
+ *  DSP0270: 8.4.3 Protocol Address decode
  */
 static const char *dmi_address_decode(u8 *data, char *storage, u8 addrtype)
 {
@@ -3898,7 +3898,7 @@ static const char *dmi_address_decode(u8 *data, char 
*storage, u8 addrtype)
 }
 
 /*
- * DSP0270: 8.5: Parse the protocol record format
+ * DSP0270: 8.4: Parse the protocol record format
  */
 static void dmi_parse_protocol_record(u8 *rec)
 {
@@ -3913,11 +3913,11 @@ static void dmi_parse_protocol_record(u8 *rec)
        const char *hname;
        char attr[38];
 
-       /* DSP0270: 8.5: Protocol Identifier */
+       /* DSP0270: 8.4: Protocol Identifier */
        rid = rec[0x0];
-       /* DSP0270: 8.5: Protocol Record Length */
+       /* DSP0270: 8.4: Protocol Record Length */
        rlen = rec[0x1];
-       /* DSP0270: 8.5: Protocol Record Data */
+       /* DSP0270: 8.4: Protocol Record Data */
        rdata = &rec[0x2];
 
        pr_attr("Protocol ID", "%02x (%s)", rid,
@@ -3926,7 +3926,7 @@ static void dmi_parse_protocol_record(u8 *rec)
        /*
         * Don't decode anything other than Redfish for now
         * Note 0x4 is Redfish over IP in 7.43.2
-        * and DSP0270: 8.5
+        * and DSP0270: 8.4
         */
        if (rid != 0x4)
                return;
@@ -3940,7 +3940,7 @@ static void dmi_parse_protocol_record(u8 *rec)
                return;
 
        /*
-        * DSP0270: 8.6: Redfish Over IP Service UUID
+        * DSP0270: 8.4.1: Redfish Over IP Service UUID
         * Note: ver is hardcoded to 0x311 here just for
         * convenience.  It could get passed from the SMBIOS
         * header, but that's a lot of passing of pointers just
@@ -3953,7 +3953,7 @@ static void dmi_parse_protocol_record(u8 *rec)
        dmi_system_uuid(pr_subattr, "Service UUID", &rdata[0], 0x311);
 
        /*
-        * DSP0270: 8.6: Redfish Over IP Host IP Assignment Type
+        * DSP0270: 8.4.1: Redfish Over IP Host IP Assignment Type
         * Note, using decimal indices here, as the DSP0270
         * uses decimal, so as to make it more comparable
         */
@@ -3961,34 +3961,34 @@ static void dmi_parse_protocol_record(u8 *rec)
        pr_subattr("Host IP Assignment Type", "%s",
                dmi_protocol_assignment_type(assign_val));
 
-       /* DSP0270: 8.6: Redfish Over IP Host Address format */
+       /* DSP0270: 8.4.1: Redfish Over IP Host Address format */
        addrtype = rdata[17];
        addrstr = dmi_address_type(addrtype);
        pr_subattr("Host IP Address Format", "%s",
                addrstr);
 
-       /* DSP0270: 8.6 IP Assignment types */
+       /* DSP0270: 8.4.1 IP Assignment types */
        /* We only use the Host IP Address and Mask if the assignment type is 
static */
        if (assign_val == 0x1 || assign_val == 0x3)
        {
-               /* DSP0270: 8.6: the Host IPv[4|6] Address */
+               /* DSP0270: 8.4.1: the Host IPv[4|6] Address */
                sprintf(attr, "%s Address", addrstr);
                pr_subattr(attr, "%s",
                        dmi_address_decode(&rdata[18], buf, addrtype));
 
-               /* DSP0270: 8.6: Prints the Host IPv[4|6] Mask */
+               /* DSP0270: 8.4.1: Prints the Host IPv[4|6] Mask */
                sprintf(attr, "%s Mask", addrstr);
                pr_subattr(attr, "%s",
                        dmi_address_decode(&rdata[34], buf, addrtype));
        }
 
-       /* DSP0270: 8.6: Get the Redfish Service IP Discovery Type */
+       /* DSP0270: 8.4.1: Get the Redfish Service IP Discovery Type */
        assign_val = rdata[50];
        /* Redfish Service IP Discovery type mirrors Host IP Assignment type */
        pr_subattr("Redfish Service IP Discovery Type", "%s",
                dmi_protocol_assignment_type(assign_val));
 
-       /* DSP0270: 8.6: Get the Redfish Service IP Address Format */
+       /* DSP0270: 8.4.1: Get the Redfish Service IP Address Format */
        addrtype = rdata[51];
        addrstr = dmi_address_type(addrtype);
        pr_subattr("Redfish Service IP Address Format", "%s",
@@ -3999,30 +3999,30 @@ static void dmi_parse_protocol_record(u8 *rec)
                u16 port;
                u32 vlan;
 
-               /* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Address */
+               /* DSP0270: 8.4.1: Prints the Redfish IPv[4|6] Service Address 
*/
                sprintf(attr, "%s Redfish Service Address", addrstr);
                pr_subattr(attr, "%s",
                        dmi_address_decode(&rdata[52], buf,
                        addrtype));
 
-               /* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Mask */
+               /* DSP0270: 8.4.1: Prints the Redfish IPv[4|6] Service Mask */
                sprintf(attr, "%s Redfish Service Mask", addrstr);
                pr_subattr(attr, "%s",
                        dmi_address_decode(&rdata[68], buf,
                        addrtype));
 
-               /* DSP0270: 8.6: Redfish vlan and port info */
+               /* DSP0270: 8.4.1: Redfish vlan and port info */
                port = WORD(&rdata[84]);
                vlan = DWORD(&rdata[86]);
                pr_subattr("Redfish Service Port", "%hu", port);
                pr_subattr("Redfish Service Vlan", "%u", vlan);
        }
 
-       /* DSP0270: 8.6: Redfish host length and name */
+       /* DSP0270: 8.4.1: Redfish host length and name */
        hlen = rdata[90];
 
        /*
-        * DSP0270: 8.6: The length of the host string + 91 (the minimum
+        * DSP0270: 8.4.1: The length of the host string + 91 (the minimum
         * size of a protocol record) cannot exceed the record length
         * (rec[0x1])
         */
@@ -4043,15 +4043,39 @@ static const char *dmi_parse_device_type(u8 type)
        const char *devname[] = {
                "USB",          /* 0x2 */
                "PCI/PCIe",     /* 0x3 */
+               "USB v2",       /* 0x4 */
+               "PCI/PCIe v2",  /* 0x5 */
        };
 
-       if (type >= 0x2 && type <= 0x3)
+       if (type >= 0x2 && type <= 0x5)
                return devname[type - 0x2];
        if (type >= 0x80)
                return "OEM";
        return out_of_spec;
 }
 
+/*
+ * DSP0270: 8.3.7: Device Characteristics
+ */
+static void dmi_device_characteristics(u16 code)
+{
+       const char *characteristics[] = {
+               "Credential bootstrapping via IPMI is supported", /* 0 */
+               /* Reserved */
+       };
+
+       if ((code & 0x1) == 0)
+               pr_list_item("None");
+       else
+       {
+               int i;
+
+               for (i = 0; i < 1; i++)
+                       if (code & (1 << i))
+                               pr_list_item("%s", characteristics[i]);
+       }
+}
+
 static void dmi_parse_controller_structure(const struct dmi_header *h)
 {
        int i;
@@ -4094,7 +4118,7 @@ static void dmi_parse_controller_structure(const struct 
dmi_header *h)
 
        if (len != 0)
        {
-               /* DSP0270: 8.3 Table 2: Device Type */
+               /* DSP0270: 8.3.1 Table 3: Device Type values */
                type = data[0x6];
 
                pr_attr("Device Type", "%s",
@@ -4131,6 +4155,83 @@ static void dmi_parse_controller_structure(const struct 
dmi_header *h)
                        pr_attr("SubDeviceID", "0x%04x",
                                WORD(&pcidata[0x6]));
                }
+               else if (type == 0x4 && len >= 0x0d)
+               {
+                       /* USB Device Type v2 - need at least 12 bytes */
+                       u8 *usbdata = &data[7];
+                       /* USB Device Descriptor v2: idVendor */
+                       pr_attr("idVendor", "0x%04x",
+                               WORD(&usbdata[0x1]));
+                       /* USB Device Descriptor v2: idProduct */
+                       pr_attr("idProduct", "0x%04x",
+                               WORD(&usbdata[0x3]));
+
+                       /*
+                        * USB Serial number is here, but its useless, don't
+                        * bother decoding it
+                        */
+
+                       /* USB Device Descriptor v2: MAC Address */
+                       pr_attr("MAC Address", "%02x:%02x:%02x:%02x:%02x:%02x",
+                               usbdata[0x6], usbdata[0x7], usbdata[0x8],
+                               usbdata[0x9], usbdata[0xa], usbdata[0xb]);
+
+                       /* DSP0270 v1.3.0 support */
+                       if (len >= 0x11)
+                       {
+                               /* USB Device Descriptor v2: Device 
Characteristics */
+                               pr_list_start("Device Characteristics", NULL);
+                               dmi_device_characteristics(WORD(&usbdata[0xc]));
+                               pr_list_end();
+
+                               /* USB Device Descriptor v2: Credential 
Bootstrapping Handle */
+                               if (WORD(&usbdata[0x0c]) & 0x1)
+                               {
+                                       pr_attr("Credential Bootstrapping 
Handle", "0x%04x",
+                                                       WORD(&usbdata[0xe]));
+                               }
+                       }
+               }
+               else if (type == 0x5 && len >= 0x14)
+               {
+                       /* PCI Device Type v2 - Need at least 19 bytes */
+                       u8 *pcidata = &data[0x7];
+                       /* PCI Device Descriptor v2: VendorID */
+                       pr_attr("VendorID", "0x%04x",
+                               WORD(&pcidata[0x1]));
+                       /* PCI Device Descriptor v2: DeviceID */
+                       pr_attr("DeviceID", "0x%04x",
+                               WORD(&pcidata[0x3]));
+                       /* PCI Device Descriptor v2: PCI SubvendorID */
+                       pr_attr("SubVendorID", "0x%04x",
+                               WORD(&pcidata[0x5]));
+                       /* PCI Device Descriptor v2: PCI SubdeviceID */
+                       pr_attr("SubDeviceID", "0x%04x",
+                               WORD(&pcidata[0x7]));
+                       /* PCI Device Descriptor v2: MAC Address */
+                       pr_attr("MAC Address", "%02x:%02x:%02x:%02x:%02x:%02x",
+                               pcidata[0x9], pcidata[0xa], pcidata[0xb],
+                               pcidata[0xc], pcidata[0xd], pcidata[0xe]);
+                       /* PCI Device Descriptor v2:
+                        *              Segment Group Number, Bus Number, 
Device/Function Number
+                        */
+                       dmi_slot_segment_bus_func(WORD(&pcidata[0xf]), 
pcidata[0x11], pcidata[0x12]);
+
+                       /* DSP0270 v1.3.0 support */
+                       if (len >= 0x18)
+                       {
+                               /* PCI Device Descriptor v2: Device 
Characteristics */
+                               pr_list_start("Device Characteristics", NULL);
+                               dmi_device_characteristics(WORD(&pcidata[0x13]) 
);
+                               pr_list_end();
+                               /* PCI Device Descriptor v2: Credential 
Bootstrapping Handle */
+                               if (WORD(&pcidata[0x13]) & 0x1)
+                               {
+                                       pr_attr("Credential Bootstrapping 
Handle", "0x%04x",
+                                                       WORD(&pcidata[0x15]));
+                               }
+                       }
+               }
                else if (type >= 0x80 && len >= 5)
                {
                        /* OEM Device Type - Need at least 4 bytes */
@@ -4144,7 +4245,7 @@ static void dmi_parse_controller_structure(const struct 
dmi_header *h)
        }
 
        /*
-        * DSP0270: 8.2 and 8.5: Protocol record count and protocol records
+        * DSP0270: 8.2 and 8.4: Protocol record count and protocol records
         * Move to the Protocol Count.
         */
        data = &data[total_read];
@@ -4187,7 +4288,7 @@ static void dmi_parse_controller_structure(const struct 
dmi_header *h)
                        dmi_parse_protocol_record(rec);
 
                        /*
-                        * DSP0270: 8.6
+                        * DSP0270: 8.4.1
                         * Each record is rec[1] bytes long, starting at the
                         * data byte immediately following the length field.
                         * That means we need to add the byte for the rec id,
-- 
2.17.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]