Blame SOURCES/kvm-hmat-acpi-Build-System-Locality-Latency-and-Bandwidt.patch

77c23f
From f55b8b251c323856087baf2380d93fbf2da15db7 Mon Sep 17 00:00:00 2001
77c23f
From: "plai@redhat.com" <plai@redhat.com>
77c23f
Date: Thu, 21 May 2020 23:56:51 +0100
77c23f
Subject: [PATCH 08/12] hmat acpi: Build System Locality Latency and Bandwidth
77c23f
 Information Structure(s)
77c23f
77c23f
RH-Author: plai@redhat.com
77c23f
Message-id: <20200521235655.27141-8-plai@redhat.com>
77c23f
Patchwork-id: 96733
77c23f
O-Subject: [RHEL8.2.1 AV qemu-kvm PATCH 07/11] hmat acpi: Build System Locality Latency and Bandwidth 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 the memory access latency and bandwidth
77c23f
information from various memory access initiator proximity domains.
77c23f
The latency and bandwidth numbers represented in this structure
77c23f
correspond to rated latency and bandwidth for the platform.
77c23f
The software could use this information as hint for optimization.
77c23f
77c23f
Acked-by: Markus Armbruster <armbru@redhat.com>
77c23f
Reviewed-by: Igor Mammedov <imammedo@redhat.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-6-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 4586a2cb833f80b19c80ebe364a005ac2fa0974a)
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 | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
77c23f
 1 file changed, 103 insertions(+), 1 deletion(-)
77c23f
77c23f
diff --git a/hw/acpi/hmat.c b/hw/acpi/hmat.c
77c23f
index 9ff7930..4635d45 100644
77c23f
--- a/hw/acpi/hmat.c
77c23f
+++ b/hw/acpi/hmat.c
77c23f
@@ -25,6 +25,7 @@
77c23f
  */
77c23f
 
77c23f
 #include "qemu/osdep.h"
77c23f
+#include "qemu/units.h"
77c23f
 #include "sysemu/numa.h"
77c23f
 #include "hw/acpi/hmat.h"
77c23f
 
77c23f
@@ -67,11 +68,89 @@ static void build_hmat_mpda(GArray *table_data, uint16_t flags,
77c23f
     build_append_int_noprefix(table_data, 0, 8);
77c23f
 }
77c23f
 
77c23f
+/*
77c23f
+ * ACPI 6.3: 5.2.27.4 System Locality Latency and Bandwidth Information
77c23f
+ * Structure: Table 5-146
77c23f
+ */
77c23f
+static void build_hmat_lb(GArray *table_data, HMAT_LB_Info *hmat_lb,
77c23f
+                          uint32_t num_initiator, uint32_t num_target,
77c23f
+                          uint32_t *initiator_list)
77c23f
+{
77c23f
+    int i, index;
77c23f
+    HMAT_LB_Data *lb_data;
77c23f
+    uint16_t *entry_list;
77c23f
+    uint32_t base;
77c23f
+    /* Length in bytes for entire structure */
77c23f
+    uint32_t lb_length
77c23f
+        = 32 /* Table length upto and including Entry Base Unit */
77c23f
+        + 4 * num_initiator /* Initiator Proximity Domain List */
77c23f
+        + 4 * num_target /* Target Proximity Domain List */
77c23f
+        + 2 * num_initiator * num_target; /* Latency or Bandwidth Entries */
77c23f
+
77c23f
+    /* Type */
77c23f
+    build_append_int_noprefix(table_data, 1, 2);
77c23f
+    /* Reserved */
77c23f
+    build_append_int_noprefix(table_data, 0, 2);
77c23f
+    /* Length */
77c23f
+    build_append_int_noprefix(table_data, lb_length, 4);
77c23f
+    /* Flags: Bits [3:0] Memory Hierarchy, Bits[7:4] Reserved */
77c23f
+    assert(!(hmat_lb->hierarchy >> 4));
77c23f
+    build_append_int_noprefix(table_data, hmat_lb->hierarchy, 1);
77c23f
+    /* Data Type */
77c23f
+    build_append_int_noprefix(table_data, hmat_lb->data_type, 1);
77c23f
+    /* Reserved */
77c23f
+    build_append_int_noprefix(table_data, 0, 2);
77c23f
+    /* Number of Initiator Proximity Domains (s) */
77c23f
+    build_append_int_noprefix(table_data, num_initiator, 4);
77c23f
+    /* Number of Target Proximity Domains (t) */
77c23f
+    build_append_int_noprefix(table_data, num_target, 4);
77c23f
+    /* Reserved */
77c23f
+    build_append_int_noprefix(table_data, 0, 4);
77c23f
+
77c23f
+    /* Entry Base Unit */
77c23f
+    if (hmat_lb->data_type <= HMAT_LB_DATA_WRITE_LATENCY) {
77c23f
+        /* Convert latency base from nanoseconds to picosecond */
77c23f
+        base = hmat_lb->base * 1000;
77c23f
+    } else {
77c23f
+        /* Convert bandwidth base from Byte to Megabyte */
77c23f
+        base = hmat_lb->base / MiB;
77c23f
+    }
77c23f
+    build_append_int_noprefix(table_data, base, 8);
77c23f
+
77c23f
+    /* Initiator Proximity Domain List */
77c23f
+    for (i = 0; i < num_initiator; i++) {
77c23f
+        build_append_int_noprefix(table_data, initiator_list[i], 4);
77c23f
+    }
77c23f
+
77c23f
+    /* Target Proximity Domain List */
77c23f
+    for (i = 0; i < num_target; i++) {
77c23f
+        build_append_int_noprefix(table_data, i, 4);
77c23f
+    }
77c23f
+
77c23f
+    /* Latency or Bandwidth Entries */
77c23f
+    entry_list = g_malloc0(num_initiator * num_target * sizeof(uint16_t));
77c23f
+    for (i = 0; i < hmat_lb->list->len; i++) {
77c23f
+        lb_data = &g_array_index(hmat_lb->list, HMAT_LB_Data, i);
77c23f
+        index = lb_data->initiator * num_target + lb_data->target;
77c23f
+
77c23f
+        entry_list[index] = (uint16_t)(lb_data->data / hmat_lb->base);
77c23f
+    }
77c23f
+
77c23f
+    for (i = 0; i < num_initiator * num_target; i++) {
77c23f
+        build_append_int_noprefix(table_data, entry_list[i], 2);
77c23f
+    }
77c23f
+
77c23f
+    g_free(entry_list);
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
+    uint32_t num_initiator = 0;
77c23f
+    uint32_t initiator_list[MAX_NODES];
77c23f
+    int i, hierarchy, type;
77c23f
+    HMAT_LB_Info *hmat_lb;
77c23f
 
77c23f
     for (i = 0; i < numa_state->num_nodes; i++) {
77c23f
         flags = 0;
77c23f
@@ -82,6 +161,29 @@ static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
77c23f
 
77c23f
         build_hmat_mpda(table_data, flags, numa_state->nodes[i].initiator, i);
77c23f
     }
77c23f
+
77c23f
+    for (i = 0; i < numa_state->num_nodes; i++) {
77c23f
+        if (numa_state->nodes[i].has_cpu) {
77c23f
+            initiator_list[num_initiator++] = i;
77c23f
+        }
77c23f
+    }
77c23f
+
77c23f
+    /*
77c23f
+     * ACPI 6.3: 5.2.27.4 System Locality Latency and Bandwidth Information
77c23f
+     * Structure: Table 5-146
77c23f
+     */
77c23f
+    for (hierarchy = HMAT_LB_MEM_MEMORY;
77c23f
+         hierarchy <= HMAT_LB_MEM_CACHE_3RD_LEVEL; hierarchy++) {
77c23f
+        for (type = HMAT_LB_DATA_ACCESS_LATENCY;
77c23f
+             type <= HMAT_LB_DATA_WRITE_BANDWIDTH; type++) {
77c23f
+            hmat_lb = numa_state->hmat_lb[hierarchy][type];
77c23f
+
77c23f
+            if (hmat_lb && hmat_lb->list->len) {
77c23f
+                build_hmat_lb(table_data, hmat_lb, num_initiator,
77c23f
+                              numa_state->num_nodes, initiator_list);
77c23f
+            }
77c23f
+        }
77c23f
+    }
77c23f
 }
77c23f
 
77c23f
 void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state)
77c23f
-- 
77c23f
1.8.3.1
77c23f