Blame SOURCES/kvm-hmat-acpi-Build-Memory-Proximity-Domain-Attributes-S.patch

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