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

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