Blame SOURCES/kvm-hmat-acpi-Build-Memory-Side-Cache-Information-Struct.patch

77c23f
From d00453667cb972dc2fe1242081d3b39313a6a925 Mon Sep 17 00:00:00 2001
77c23f
From: "plai@redhat.com" <plai@redhat.com>
77c23f
Date: Thu, 21 May 2020 23:56:52 +0100
77c23f
Subject: [PATCH 09/12] hmat acpi: Build Memory Side Cache Information
77c23f
 Structure(s)
77c23f
77c23f
RH-Author: plai@redhat.com
77c23f
Message-id: <20200521235655.27141-9-plai@redhat.com>
77c23f
Patchwork-id: 96741
77c23f
O-Subject: [RHEL8.2.1 AV qemu-kvm PATCH 08/11] hmat acpi: Build Memory Side Cache Information 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
This structure describes memory side cache information for memory
77c23f
proximity domains if the memory side cache is present and the
77c23f
physical device forms the memory side cache.
77c23f
The software could use this information to effectively place
77c23f
the data in memory to maximize the performance of the system
77c23f
memory that use the memory side cache.
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-7-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 a9c2b841af002db6e21e1297c9026b63fc22c875)
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/hmat.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
77c23f
 1 file changed, 68 insertions(+), 1 deletion(-)
77c23f
77c23f
diff --git a/hw/acpi/hmat.c b/hw/acpi/hmat.c
77c23f
index 4635d45..7c24bb5 100644
77c23f
--- a/hw/acpi/hmat.c
77c23f
+++ b/hw/acpi/hmat.c
77c23f
@@ -143,14 +143,62 @@ static void build_hmat_lb(GArray *table_data, HMAT_LB_Info *hmat_lb,
77c23f
     g_free(entry_list);
77c23f
 }
77c23f
 
77c23f
+/* ACPI 6.3: 5.2.27.5 Memory Side Cache Information Structure: Table 5-147 */
77c23f
+static void build_hmat_cache(GArray *table_data, uint8_t total_levels,
77c23f
+                             NumaHmatCacheOptions *hmat_cache)
77c23f
+{
77c23f
+    /*
77c23f
+     * Cache Attributes: Bits [3:0] – Total Cache Levels
77c23f
+     * for this Memory Proximity Domain
77c23f
+     */
77c23f
+    uint32_t cache_attr = total_levels;
77c23f
+
77c23f
+    /* Bits [7:4] : Cache Level described in this structure */
77c23f
+    cache_attr |= (uint32_t) hmat_cache->level << 4;
77c23f
+
77c23f
+    /* Bits [11:8] - Cache Associativity */
77c23f
+    cache_attr |= (uint32_t) hmat_cache->associativity << 8;
77c23f
+
77c23f
+    /* Bits [15:12] - Write Policy */
77c23f
+    cache_attr |= (uint32_t) hmat_cache->policy << 12;
77c23f
+
77c23f
+    /* Bits [31:16] - Cache Line size in bytes */
77c23f
+    cache_attr |= (uint32_t) hmat_cache->line << 16;
77c23f
+
77c23f
+    /* Type */
77c23f
+    build_append_int_noprefix(table_data, 2, 2);
77c23f
+    /* Reserved */
77c23f
+    build_append_int_noprefix(table_data, 0, 2);
77c23f
+    /* Length */
77c23f
+    build_append_int_noprefix(table_data, 32, 4);
77c23f
+    /* Proximity Domain for the Memory */
77c23f
+    build_append_int_noprefix(table_data, hmat_cache->node_id, 4);
77c23f
+    /* Reserved */
77c23f
+    build_append_int_noprefix(table_data, 0, 4);
77c23f
+    /* Memory Side Cache Size */
77c23f
+    build_append_int_noprefix(table_data, hmat_cache->size, 8);
77c23f
+    /* Cache Attributes */
77c23f
+    build_append_int_noprefix(table_data, cache_attr, 4);
77c23f
+    /* Reserved */
77c23f
+    build_append_int_noprefix(table_data, 0, 2);
77c23f
+    /*
77c23f
+     * Number of SMBIOS handles (n)
77c23f
+     * Linux kernel uses Memory Side Cache Information Structure
77c23f
+     * without SMBIOS entries for now, so set Number of SMBIOS handles
77c23f
+     * as 0.
77c23f
+     */
77c23f
+    build_append_int_noprefix(table_data, 0, 2);
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
     uint32_t num_initiator = 0;
77c23f
     uint32_t initiator_list[MAX_NODES];
77c23f
-    int i, hierarchy, type;
77c23f
+    int i, hierarchy, type, cache_level, total_levels;
77c23f
     HMAT_LB_Info *hmat_lb;
77c23f
+    NumaHmatCacheOptions *hmat_cache;
77c23f
 
77c23f
     for (i = 0; i < numa_state->num_nodes; i++) {
77c23f
         flags = 0;
77c23f
@@ -184,6 +232,25 @@ static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
77c23f
             }
77c23f
         }
77c23f
     }
77c23f
+
77c23f
+    /*
77c23f
+     * ACPI 6.3: 5.2.27.5 Memory Side Cache Information Structure:
77c23f
+     * Table 5-147
77c23f
+     */
77c23f
+    for (i = 0; i < numa_state->num_nodes; i++) {
77c23f
+        total_levels = 0;
77c23f
+        for (cache_level = 1; cache_level < HMAT_LB_LEVELS; cache_level++) {
77c23f
+            if (numa_state->hmat_cache[i][cache_level]) {
77c23f
+                total_levels++;
77c23f
+            }
77c23f
+        }
77c23f
+        for (cache_level = 0; cache_level <= total_levels; cache_level++) {
77c23f
+            hmat_cache = numa_state->hmat_cache[i][cache_level];
77c23f
+            if (hmat_cache) {
77c23f
+                build_hmat_cache(table_data, total_levels, hmat_cache);
77c23f
+            }
77c23f
+        }
77c23f
+    }
77c23f
 }
77c23f
 
77c23f
 void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state)
77c23f
-- 
77c23f
1.8.3.1
77c23f