yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
902636
From a0816e4374759048cb24b9b3549a093a2ccb6240 Mon Sep 17 00:00:00 2001
902636
From: "plai@redhat.com" <plai@redhat.com>
902636
Date: Thu, 21 May 2020 23:56:50 +0100
902636
Subject: [PATCH 07/12] hmat acpi: Build Memory Proximity Domain Attributes
902636
 Structure(s)
902636
902636
RH-Author: plai@redhat.com
902636
Message-id: <20200521235655.27141-7-plai@redhat.com>
902636
Patchwork-id: 96734
902636
O-Subject: [RHEL8.2.1 AV qemu-kvm PATCH 06/11] hmat acpi: Build Memory Proximity Domain Attributes Structure(s)
902636
Bugzilla: 1600217
902636
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
902636
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
902636
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
902636
902636
From: Liu Jingqi <jingqi.liu@intel.com>
902636
902636
HMAT is defined in ACPI 6.3: 5.2.27 Heterogeneous Memory Attribute Table
902636
(HMAT). The specification references below link:
902636
http://www.uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf
902636
902636
It describes the memory attributes, such as memory side cache
902636
attributes and bandwidth and latency details, related to the
902636
Memory Proximity Domain. The software is
902636
expected to use this information as hint for optimization.
902636
902636
This structure describes Memory Proximity Domain Attributes by memory
902636
subsystem and its associativity with processor proximity domain as well as
902636
hint for memory usage.
902636
902636
In the linux kernel, the codes in drivers/acpi/hmat/hmat.c parse and report
902636
the platform's HMAT tables.
902636
902636
Acked-by: Markus Armbruster <armbru@redhat.com>
902636
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
902636
Reviewed-by: Daniel Black <daniel@linux.ibm.com>
902636
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
902636
Signed-off-by: Liu Jingqi <jingqi.liu@intel.com>
902636
Signed-off-by: Tao Xu <tao3.xu@intel.com>
902636
Message-Id: <20191213011929.2520-5-tao3.xu@intel.com>
902636
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
902636
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
902636
(cherry picked from commit e6f123c3b81241be33f1b763d0ff8b36d1ae9c1e)
902636
Signed-off-by: Paul Lai <plai@redhat.com>
902636
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
902636
---
902636
 hw/acpi/Kconfig       |  7 ++--
902636
 hw/acpi/Makefile.objs |  1 +
902636
 hw/acpi/hmat.c        | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++
902636
 hw/acpi/hmat.h        | 42 ++++++++++++++++++++++
902636
 hw/i386/acpi-build.c  |  5 +++
902636
 5 files changed, 152 insertions(+), 2 deletions(-)
902636
 create mode 100644 hw/acpi/hmat.c
902636
 create mode 100644 hw/acpi/hmat.h
902636
902636
diff --git a/hw/acpi/Kconfig b/hw/acpi/Kconfig
902636
index 12e3f1e..54209c6 100644
902636
--- a/hw/acpi/Kconfig
902636
+++ b/hw/acpi/Kconfig
902636
@@ -7,6 +7,7 @@ config ACPI_X86
902636
     select ACPI_NVDIMM
902636
     select ACPI_CPU_HOTPLUG
902636
     select ACPI_MEMORY_HOTPLUG
902636
+    select ACPI_HMAT
902636
 
902636
 config ACPI_X86_ICH
902636
     bool
902636
@@ -23,6 +24,10 @@ config ACPI_NVDIMM
902636
     bool
902636
     depends on ACPI
902636
 
902636
+config ACPI_HMAT
902636
+    bool
902636
+    depends on ACPI
902636
+
902636
 config ACPI_PCI
902636
     bool
902636
     depends on ACPI && PCI
902636
@@ -33,5 +38,3 @@ config ACPI_VMGENID
902636
     depends on PC
902636
 
902636
 config ACPI_HW_REDUCED
902636
-    bool
902636
-    depends on ACPI
902636
diff --git a/hw/acpi/Makefile.objs b/hw/acpi/Makefile.objs
902636
index 655a9c1..517bd88 100644
902636
--- a/hw/acpi/Makefile.objs
902636
+++ b/hw/acpi/Makefile.objs
902636
@@ -7,6 +7,7 @@ common-obj-$(CONFIG_ACPI_CPU_HOTPLUG) += cpu.o
902636
 common-obj-$(CONFIG_ACPI_NVDIMM) += nvdimm.o
902636
 common-obj-$(CONFIG_ACPI_VMGENID) += vmgenid.o
902636
 common-obj-$(CONFIG_ACPI_HW_REDUCED) += generic_event_device.o
902636
+common-obj-$(CONFIG_ACPI_HMAT) += hmat.o
902636
 common-obj-$(call lnot,$(CONFIG_ACPI_X86)) += acpi-stub.o
902636
 
902636
 common-obj-y += acpi_interface.o
902636
diff --git a/hw/acpi/hmat.c b/hw/acpi/hmat.c
902636
new file mode 100644
902636
index 0000000..9ff7930
902636
--- /dev/null
902636
+++ b/hw/acpi/hmat.c
902636
@@ -0,0 +1,99 @@
902636
+/*
902636
+ * HMAT ACPI Implementation
902636
+ *
902636
+ * Copyright(C) 2019 Intel Corporation.
902636
+ *
902636
+ * Author:
902636
+ *  Liu jingqi <jingqi.liu@linux.intel.com>
902636
+ *  Tao Xu <tao3.xu@intel.com>
902636
+ *
902636
+ * HMAT is defined in ACPI 6.3: 5.2.27 Heterogeneous Memory Attribute Table
902636
+ * (HMAT)
902636
+ *
902636
+ * This library is free software; you can redistribute it and/or
902636
+ * modify it under the terms of the GNU Lesser General Public
902636
+ * License as published by the Free Software Foundation; either
902636
+ * version 2 of the License, or (at your option) any later version.
902636
+ *
902636
+ * This library is distributed in the hope that it will be useful,
902636
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
902636
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
902636
+ * Lesser General Public License for more details.
902636
+ *
902636
+ * You should have received a copy of the GNU Lesser General Public
902636
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>
902636
+ */
902636
+
902636
+#include "qemu/osdep.h"
902636
+#include "sysemu/numa.h"
902636
+#include "hw/acpi/hmat.h"
902636
+
902636
+/*
902636
+ * ACPI 6.3:
902636
+ * 5.2.27.3 Memory Proximity Domain Attributes Structure: Table 5-145
902636
+ */
902636
+static void build_hmat_mpda(GArray *table_data, uint16_t flags,
902636
+                            uint32_t initiator, uint32_t mem_node)
902636
+{
902636
+
902636
+    /* Memory Proximity Domain Attributes Structure */
902636
+    /* Type */
902636
+    build_append_int_noprefix(table_data, 0, 2);
902636
+    /* Reserved */
902636
+    build_append_int_noprefix(table_data, 0, 2);
902636
+    /* Length */
902636
+    build_append_int_noprefix(table_data, 40, 4);
902636
+    /* Flags */
902636
+    build_append_int_noprefix(table_data, flags, 2);
902636
+    /* Reserved */
902636
+    build_append_int_noprefix(table_data, 0, 2);
902636
+    /* Proximity Domain for the Attached Initiator */
902636
+    build_append_int_noprefix(table_data, initiator, 4);
902636
+    /* Proximity Domain for the Memory */
902636
+    build_append_int_noprefix(table_data, mem_node, 4);
902636
+    /* Reserved */
902636
+    build_append_int_noprefix(table_data, 0, 4);
902636
+    /*
902636
+     * Reserved:
902636
+     * Previously defined as the Start Address of the System Physical
902636
+     * Address Range. Deprecated since ACPI Spec 6.3.
902636
+     */
902636
+    build_append_int_noprefix(table_data, 0, 8);
902636
+    /*
902636
+     * Reserved:
902636
+     * Previously defined as the Range Length of the region in bytes.
902636
+     * Deprecated since ACPI Spec 6.3.
902636
+     */
902636
+    build_append_int_noprefix(table_data, 0, 8);
902636
+}
902636
+
902636
+/* Build HMAT sub table structures */
902636
+static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
902636
+{
902636
+    uint16_t flags;
902636
+    int i;
902636
+
902636
+    for (i = 0; i < numa_state->num_nodes; i++) {
902636
+        flags = 0;
902636
+
902636
+        if (numa_state->nodes[i].initiator < MAX_NODES) {
902636
+            flags |= HMAT_PROXIMITY_INITIATOR_VALID;
902636
+        }
902636
+
902636
+        build_hmat_mpda(table_data, flags, numa_state->nodes[i].initiator, i);
902636
+    }
902636
+}
902636
+
902636
+void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state)
902636
+{
902636
+    int hmat_start = table_data->len;
902636
+
902636
+    /* reserve space for HMAT header  */
902636
+    acpi_data_push(table_data, 40);
902636
+
902636
+    hmat_build_table_structs(table_data, numa_state);
902636
+
902636
+    build_header(linker, table_data,
902636
+                 (void *)(table_data->data + hmat_start),
902636
+                 "HMAT", table_data->len - hmat_start, 2, NULL, NULL);
902636
+}
902636
diff --git a/hw/acpi/hmat.h b/hw/acpi/hmat.h
902636
new file mode 100644
902636
index 0000000..437dbc6
902636
--- /dev/null
902636
+++ b/hw/acpi/hmat.h
902636
@@ -0,0 +1,42 @@
902636
+/*
902636
+ * HMAT ACPI Implementation Header
902636
+ *
902636
+ * Copyright(C) 2019 Intel Corporation.
902636
+ *
902636
+ * Author:
902636
+ *  Liu jingqi <jingqi.liu@linux.intel.com>
902636
+ *  Tao Xu <tao3.xu@intel.com>
902636
+ *
902636
+ * HMAT is defined in ACPI 6.3: 5.2.27 Heterogeneous Memory Attribute Table
902636
+ * (HMAT)
902636
+ *
902636
+ * This library is free software; you can redistribute it and/or
902636
+ * modify it under the terms of the GNU Lesser General Public
902636
+ * License as published by the Free Software Foundation; either
902636
+ * version 2 of the License, or (at your option) any later version.
902636
+ *
902636
+ * This library is distributed in the hope that it will be useful,
902636
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
902636
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
902636
+ * Lesser General Public License for more details.
902636
+ *
902636
+ * You should have received a copy of the GNU Lesser General Public
902636
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>
902636
+ */
902636
+
902636
+#ifndef HMAT_H
902636
+#define HMAT_H
902636
+
902636
+#include "hw/acpi/aml-build.h"
902636
+
902636
+/*
902636
+ * ACPI 6.3: 5.2.27.3 Memory Proximity Domain Attributes Structure,
902636
+ * Table 5-145, Field "flag", Bit [0]: set to 1 to indicate that data in
902636
+ * the Proximity Domain for the Attached Initiator field is valid.
902636
+ * Other bits reserved.
902636
+ */
902636
+#define HMAT_PROXIMITY_INITIATOR_VALID  0x1
902636
+
902636
+void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state);
902636
+
902636
+#endif
902636
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
902636
index 6400189..b1f8c55 100644
902636
--- a/hw/i386/acpi-build.c
902636
+++ b/hw/i386/acpi-build.c
902636
@@ -67,6 +67,7 @@
902636
 #include "hw/i386/intel_iommu.h"
902636
 
902636
 #include "hw/acpi/ipmi.h"
902636
+#include "hw/acpi/hmat.h"
902636
 
902636
 /* These are used to size the ACPI tables for -M pc-i440fx-1.7 and
902636
  * -M pc-i440fx-2.0.  Even if the actual amount of AML generated grows
902636
@@ -2837,6 +2838,10 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
902636
             acpi_add_table(table_offsets, tables_blob);
902636
             build_slit(tables_blob, tables->linker, machine);
902636
         }
902636
+        if (machine->numa_state->hmat_enabled) {
902636
+            acpi_add_table(table_offsets, tables_blob);
902636
+            build_hmat(tables_blob, tables->linker, machine->numa_state);
902636
+        }
902636
     }
902636
     if (acpi_get_mcfg(&mcfg)) {
902636
         acpi_add_table(table_offsets, tables_blob);
902636
-- 
902636
1.8.3.1
902636