Blame packages/q/qemu/hw-smbios-support-for-type-8-port-connec.patch

Bernhard M. Wiedemann 399b1f
From: Hal Martin <hal.martin@gmail.com>
Bernhard M. Wiedemann 399b1f
Date: Fri, 12 Aug 2022 15:51:53 +0200
Bernhard M. Wiedemann 399b1f
Subject: hw/smbios: support for type 8 (port connector)
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
PATCH v1: add support for SMBIOS type 8 to qemu
Bernhard M. Wiedemann 399b1f
PATCH v2: incorporate patch v1 feedback and add smbios type=8 to qemu-options
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
internal_reference: internal reference designator
Bernhard M. Wiedemann 399b1f
external_reference: external reference designator
Bernhard M. Wiedemann 399b1f
connector_type: hex value for port connector type (see SMBIOS 7.9.2)
Bernhard M. Wiedemann 399b1f
port_type: hex value for port type (see SMBIOS 7.9.3)
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
After studying various vendor implementationsi (Dell, Lenovo, MSI),
Bernhard M. Wiedemann 399b1f
the value of internal connector type was hard-coded to 0x0 (None).
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
Example usage:
Bernhard M. Wiedemann 399b1f
-smbios type=8,internal_reference=JUSB1,external_reference=USB1,connector_type=0x12,port_type=0x10 \
Bernhard M. Wiedemann 399b1f
-smbios type=8,internal_reference=JAUD1,external_reference="Audio Jack",connector_type=0x1f,port_type=0x1d \
Bernhard M. Wiedemann 399b1f
-smbios type=8,internal_reference=LAN,external_reference=Ethernet,connector_type=0x0b,port_type=0x1f \
Bernhard M. Wiedemann 399b1f
-smbios type=8,internal_reference=PS2,external_reference=Mouse,connector_type=0x0f,port_type=0x0e \
Bernhard M. Wiedemann 399b1f
-smbios type=8,internal_reference=PS2,external_reference=Keyboard,connector_type=0x0f,port_type=0x0d
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
Signed-off-by: Hal Martin <hal.martin@gmail.com>
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
Message-Id: <20220812135153.17859-1-hal.martin@gmail.com>
Bernhard M. Wiedemann 399b1f
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Bernhard M. Wiedemann 399b1f
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Bernhard M. Wiedemann 399b1f
(cherry picked from commit fd8caa253c56ed126c09d3b9cc682753ff12218f)
Bernhard M. Wiedemann 399b1f
References: bsc#1202282, jsc#PED-2592
Bernhard M. Wiedemann 399b1f
Signed-off-by: Dario Faggioli <dfaggioli@suse.com>
Bernhard M. Wiedemann 399b1f
---
Bernhard M. Wiedemann 399b1f
 hw/smbios/smbios.c           | 63 ++++++++++++++++++++++++++++++++++++
Bernhard M. Wiedemann 399b1f
 include/hw/firmware/smbios.h | 10 ++++++
Bernhard M. Wiedemann 399b1f
 qemu-options.hx              |  2 ++
Bernhard M. Wiedemann 399b1f
 3 files changed, 75 insertions(+)
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
Bernhard M. Wiedemann 399b1f
index 59091c8454bf6d8d05c4c8313753..417d65471704ee6babaebb2ba02e 100644
Bernhard M. Wiedemann 399b1f
--- a/hw/smbios/smbios.c
Bernhard M. Wiedemann 399b1f
+++ b/hw/smbios/smbios.c
Bernhard M. Wiedemann 399b1f
@@ -111,6 +111,13 @@ static struct {
Bernhard M. Wiedemann 399b1f
     .processor_id = 0,
Bernhard M. Wiedemann 399b1f
 };
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
+struct type8_instance {
Bernhard M. Wiedemann 399b1f
+    const char *internal_reference, *external_reference;
Bernhard M. Wiedemann 399b1f
+    uint8_t connector_type, port_type;
Bernhard M. Wiedemann 399b1f
+    QTAILQ_ENTRY(type8_instance) next;
Bernhard M. Wiedemann 399b1f
+};
Bernhard M. Wiedemann 399b1f
+static QTAILQ_HEAD(, type8_instance) type8 = QTAILQ_HEAD_INITIALIZER(type8);
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
 static struct {
Bernhard M. Wiedemann 399b1f
     size_t nvalues;
Bernhard M. Wiedemann 399b1f
     char **values;
Bernhard M. Wiedemann 399b1f
@@ -337,6 +344,29 @@ static const QemuOptDesc qemu_smbios_type4_opts[] = {
Bernhard M. Wiedemann 399b1f
     { /* end of list */ }
Bernhard M. Wiedemann 399b1f
 };
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
+static const QemuOptDesc qemu_smbios_type8_opts[] = {
Bernhard M. Wiedemann 399b1f
+    {
Bernhard M. Wiedemann 399b1f
+        .name = "internal_reference",
Bernhard M. Wiedemann 399b1f
+        .type = QEMU_OPT_STRING,
Bernhard M. Wiedemann 399b1f
+        .help = "internal reference designator",
Bernhard M. Wiedemann 399b1f
+    },
Bernhard M. Wiedemann 399b1f
+    {
Bernhard M. Wiedemann 399b1f
+        .name = "external_reference",
Bernhard M. Wiedemann 399b1f
+        .type = QEMU_OPT_STRING,
Bernhard M. Wiedemann 399b1f
+        .help = "external reference designator",
Bernhard M. Wiedemann 399b1f
+    },
Bernhard M. Wiedemann 399b1f
+    {
Bernhard M. Wiedemann 399b1f
+        .name = "connector_type",
Bernhard M. Wiedemann 399b1f
+        .type = QEMU_OPT_NUMBER,
Bernhard M. Wiedemann 399b1f
+        .help = "connector type",
Bernhard M. Wiedemann 399b1f
+    },
Bernhard M. Wiedemann 399b1f
+    {
Bernhard M. Wiedemann 399b1f
+        .name = "port_type",
Bernhard M. Wiedemann 399b1f
+        .type = QEMU_OPT_NUMBER,
Bernhard M. Wiedemann 399b1f
+        .help = "port type",
Bernhard M. Wiedemann 399b1f
+    },
Bernhard M. Wiedemann 399b1f
+};
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
 static const QemuOptDesc qemu_smbios_type11_opts[] = {
Bernhard M. Wiedemann 399b1f
     {
Bernhard M. Wiedemann 399b1f
         .name = "value",
Bernhard M. Wiedemann 399b1f
@@ -718,6 +748,26 @@ static void smbios_build_type_4_table(MachineState *ms, unsigned instance)
Bernhard M. Wiedemann 399b1f
     smbios_type4_count++;
Bernhard M. Wiedemann 399b1f
 }
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
+static void smbios_build_type_8_table(void)
Bernhard M. Wiedemann 399b1f
+{
Bernhard M. Wiedemann 399b1f
+    unsigned instance = 0;
Bernhard M. Wiedemann 399b1f
+    struct type8_instance *t8;
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
+    QTAILQ_FOREACH(t8, &type8, next) {
Bernhard M. Wiedemann 399b1f
+        SMBIOS_BUILD_TABLE_PRE(8, T0_BASE + instance, true);
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
+        SMBIOS_TABLE_SET_STR(8, internal_reference_str, t8->internal_reference);
Bernhard M. Wiedemann 399b1f
+        SMBIOS_TABLE_SET_STR(8, external_reference_str, t8->external_reference);
Bernhard M. Wiedemann 399b1f
+        /* most vendors seem to set this to None */
Bernhard M. Wiedemann 399b1f
+        t->internal_connector_type = 0x0;
Bernhard M. Wiedemann 399b1f
+        t->external_connector_type = t8->connector_type;
Bernhard M. Wiedemann 399b1f
+        t->port_type = t8->port_type;
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
+        SMBIOS_BUILD_TABLE_POST;
Bernhard M. Wiedemann 399b1f
+        instance++;
Bernhard M. Wiedemann 399b1f
+    }
Bernhard M. Wiedemann 399b1f
+}
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
 static void smbios_build_type_11_table(void)
Bernhard M. Wiedemann 399b1f
 {
Bernhard M. Wiedemann 399b1f
     char count_str[128];
Bernhard M. Wiedemann 399b1f
@@ -1030,6 +1080,7 @@ void smbios_get_tables(MachineState *ms,
Bernhard M. Wiedemann 399b1f
             smbios_build_type_4_table(ms, i);
Bernhard M. Wiedemann 399b1f
         }
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
+        smbios_build_type_8_table();
Bernhard M. Wiedemann 399b1f
         smbios_build_type_11_table();
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
 #define MAX_DIMM_SZ (16 * GiB)
Bernhard M. Wiedemann 399b1f
@@ -1381,6 +1432,18 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
Bernhard M. Wiedemann 399b1f
                            UINT16_MAX);
Bernhard M. Wiedemann 399b1f
             }
Bernhard M. Wiedemann 399b1f
             return;
Bernhard M. Wiedemann 399b1f
+        case 8:
Bernhard M. Wiedemann 399b1f
+            if (!qemu_opts_validate(opts, qemu_smbios_type8_opts, errp)) {
Bernhard M. Wiedemann 399b1f
+                return;
Bernhard M. Wiedemann 399b1f
+            }
Bernhard M. Wiedemann 399b1f
+            struct type8_instance *t;
Bernhard M. Wiedemann 399b1f
+            t = g_new0(struct type8_instance, 1);
Bernhard M. Wiedemann 399b1f
+            save_opt(&t->internal_reference, opts, "internal_reference");
Bernhard M. Wiedemann 399b1f
+            save_opt(&t->external_reference, opts, "external_reference");
Bernhard M. Wiedemann 399b1f
+            t->connector_type = qemu_opt_get_number(opts, "connector_type", 0);
Bernhard M. Wiedemann 399b1f
+            t->port_type = qemu_opt_get_number(opts, "port_type", 0);
Bernhard M. Wiedemann 399b1f
+            QTAILQ_INSERT_TAIL(&type8, t, next);
Bernhard M. Wiedemann 399b1f
+            return;
Bernhard M. Wiedemann 399b1f
         case 11:
Bernhard M. Wiedemann 399b1f
             if (!qemu_opts_validate(opts, qemu_smbios_type11_opts, errp)) {
Bernhard M. Wiedemann 399b1f
                 return;
Bernhard M. Wiedemann 399b1f
diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h
Bernhard M. Wiedemann 399b1f
index 4b7ad77a44f0622dccda24e41eb6..e7d386f7c837b16f341aba22bcf8 100644
Bernhard M. Wiedemann 399b1f
--- a/include/hw/firmware/smbios.h
Bernhard M. Wiedemann 399b1f
+++ b/include/hw/firmware/smbios.h
Bernhard M. Wiedemann 399b1f
@@ -189,6 +189,16 @@ struct smbios_type_4 {
Bernhard M. Wiedemann 399b1f
     uint16_t processor_family2;
Bernhard M. Wiedemann 399b1f
 } QEMU_PACKED;
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
+/* SMBIOS type 8 - Port Connector Information */
Bernhard M. Wiedemann 399b1f
+struct smbios_type_8 {
Bernhard M. Wiedemann 399b1f
+    struct smbios_structure_header header;
Bernhard M. Wiedemann 399b1f
+    uint8_t internal_reference_str;
Bernhard M. Wiedemann 399b1f
+    uint8_t internal_connector_type;
Bernhard M. Wiedemann 399b1f
+    uint8_t external_reference_str;
Bernhard M. Wiedemann 399b1f
+    uint8_t external_connector_type;
Bernhard M. Wiedemann 399b1f
+    uint8_t port_type;
Bernhard M. Wiedemann 399b1f
+} QEMU_PACKED;
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
 /* SMBIOS type 11 - OEM strings */
Bernhard M. Wiedemann 399b1f
 struct smbios_type_11 {
Bernhard M. Wiedemann 399b1f
     struct smbios_structure_header header;
Bernhard M. Wiedemann 399b1f
diff --git a/qemu-options.hx b/qemu-options.hx
Bernhard M. Wiedemann 399b1f
index 31c04f7eea0b2401249eee86ac3b..ba5a3226d7e5d3550583b0fe1e2b 100644
Bernhard M. Wiedemann 399b1f
--- a/qemu-options.hx
Bernhard M. Wiedemann 399b1f
+++ b/qemu-options.hx
Bernhard M. Wiedemann 399b1f
@@ -2548,6 +2548,8 @@ DEF("smbios", HAS_ARG, QEMU_OPTION_smbios,
Bernhard M. Wiedemann 399b1f
     "              [,asset=str][,part=str][,max-speed=%d][,current-speed=%d]\n"
Bernhard M. Wiedemann 399b1f
     "              [,processor-id=%d]\n"
Bernhard M. Wiedemann 399b1f
     "                specify SMBIOS type 4 fields\n"
Bernhard M. Wiedemann 399b1f
+    "-smbios type=8[,external_reference=str][,internal_reference=str][,connector_type=%d][,port_type=%d]\n"
Bernhard M. Wiedemann 399b1f
+    "                specify SMBIOS type 8 fields\n"
Bernhard M. Wiedemann 399b1f
     "-smbios type=11[,value=str][,path=filename]\n"
Bernhard M. Wiedemann 399b1f
     "                specify SMBIOS type 11 fields\n"
Bernhard M. Wiedemann 399b1f
     "-smbios type=17[,loc_pfx=str][,bank=str][,manufacturer=str][,serial=str]\n"