qemu-riscv
[Top][All Lists]
Advanced

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

Re: [PATCH v2 3/4] target/riscv: SMBIOS support for RISC-V virt machine


From: Daniel Henrique Barboza
Subject: Re: [PATCH v2 3/4] target/riscv: SMBIOS support for RISC-V virt machine
Date: Wed, 3 Jan 2024 17:40:38 -0300
User-agent: Mozilla Thunderbird



On 12/29/23 09:07, Heinrich Schuchardt wrote:
Generate SMBIOS tables for the RISC-V mach-virt.
Add CONFIG_SMBIOS=y to the RISC-V default config.
Set the default processor family in the type 4 table.

The implementation is based on the corresponding ARM and Loongson code.

With the patch the following firmware tables are provided:

     etc/smbios/smbios-anchor
     etc/smbios/smbios-tables

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
---
v2:
        set processor family
---

Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>


  hw/riscv/Kconfig |  1 +
  hw/riscv/virt.c  | 42 ++++++++++++++++++++++++++++++++++++++++++
  2 files changed, 43 insertions(+)

diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
index b6a5eb4452..1e11ac9432 100644
--- a/hw/riscv/Kconfig
+++ b/hw/riscv/Kconfig
@@ -41,6 +41,7 @@ config RISCV_VIRT
      select RISCV_IMSIC
      select SIFIVE_PLIC
      select SIFIVE_TEST
+    select SMBIOS
      select VIRTIO_MMIO
      select FW_CFG_DMA
      select PLATFORM_BUS
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index d2eac24156..a876dd8f34 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -36,6 +36,7 @@
  #include "hw/riscv/boot.h"
  #include "hw/riscv/numa.h"
  #include "kvm/kvm_riscv.h"
+#include "hw/firmware/smbios.h"
  #include "hw/intc/riscv_aclint.h"
  #include "hw/intc/riscv_aplic.h"
  #include "hw/intc/riscv_imsic.h"
@@ -1249,6 +1250,45 @@ static void create_platform_bus(RISCVVirtState *s, 
DeviceState *irqchip)
                                  sysbus_mmio_get_region(sysbus, 0));
  }
+static void virt_build_smbios(RISCVVirtState *s)
+{
+    MachineClass *mc = MACHINE_GET_CLASS(s);
+    MachineState *ms = MACHINE(s);
+    uint8_t *smbios_tables, *smbios_anchor;
+    size_t smbios_tables_len, smbios_anchor_len;
+    struct smbios_phys_mem_area mem_array;
+    const char *product = "QEMU Virtual Machine";
+
+    if (kvm_enabled()) {
+        product = "KVM Virtual Machine";
+    }
+
+    smbios_set_defaults("QEMU", product, mc->name, false,
+                        true, SMBIOS_ENTRY_POINT_TYPE_64);
+
+#if defined(TARGET_RISCV32)
+    smbios_set_default_processor_family(0x200);
+#elif defined(TARGET_RISCV64)
+    smbios_set_default_processor_family(0x201);
+#endif
+
+    /* build the array of physical mem area from base_memmap */
+    mem_array.address = s->memmap[VIRT_DRAM].base;
+    mem_array.length = ms->ram_size;
+
+    smbios_get_tables(ms, &mem_array, 1,
+                      &smbios_tables, &smbios_tables_len,
+                      &smbios_anchor, &smbios_anchor_len,
+                      &error_fatal);
+
+    if (smbios_anchor) {
+        fw_cfg_add_file(s->fw_cfg, "etc/smbios/smbios-tables",
+                        smbios_tables, smbios_tables_len);
+        fw_cfg_add_file(s->fw_cfg, "etc/smbios/smbios-anchor",
+                        smbios_anchor, smbios_anchor_len);
+    }
+}
+
  static void virt_machine_done(Notifier *notifier, void *data)
  {
      RISCVVirtState *s = container_of(notifier, RISCVVirtState,
@@ -1337,6 +1377,8 @@ static void virt_machine_done(Notifier *notifier, void 
*data)
          riscv_setup_direct_kernel(kernel_entry, fdt_load_addr);
      }
+ virt_build_smbios(s);
+
      if (virt_is_acpi_enabled(s)) {
          virt_acpi_setup(s);
      }



reply via email to

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