From: Sia Jee Heng <jeeheng.sia@starfivetech.com>
To: qemu-devel@nongnu.org, qemu-arm@nongnu.org, qemu-riscv@nongnu.org
Cc: mst@redhat.com, imammedo@redhat.com, anisinha@redhat.com,
shannon.zhaosl@gmail.com, jeeheng.sia@starfivetech.com,
peter.maydell@linaro.org, sunilvl@ventanamicro.com,
palmer@dabbelt.com, alistair.francis@wdc.com,
bin.meng@windriver.com, liwei1518@gmail.com,
dbarboza@ventanamicro.com, zhiwei_liu@linux.alibaba.com
Subject: [RESEND RFC 1/3] hw/acpi/aml-build: Add cache structure table creation for PPTT table
Date: Mon, 29 Jan 2024 02:40:37 -0800 [thread overview]
Message-ID: <20240129104039.117671-2-jeeheng.sia@starfivetech.com> (raw)
In-Reply-To: <20240129104039.117671-1-jeeheng.sia@starfivetech.com>
Adds cache structure table generation for the Processor Properties
Topology Table (PPTT) to describe cache hierarchy information for
ACPI guests.
A 3-level cache topology is employed here, referring to the type 1 cache
structure according to ACPI spec v6.3. The L1 cache and L2 cache are
private resources for the core, while the L3 cache is the private
resource for the cluster.
In the absence of cluster values in the QEMU command, a 2-layer cache is
expected. The default cache value should be passed in from the
architecture code.
Examples:
3-layer: -smp 4,sockets=1,clusters=2,cores=2,threads=1
2-layer: -smp 4,sockets=1,cores=2,threads=2
Signed-off-by: Sia Jee Heng <jeeheng.sia@starfivetech.com>
---
hw/acpi/aml-build.c | 65 ++++++++++++++++++++++++++++++++++---
include/hw/acpi/aml-build.h | 26 ++++++++++++++-
2 files changed, 85 insertions(+), 6 deletions(-)
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index af66bde0f5..3bbfce962b 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1994,18 +1994,48 @@ static void build_processor_hierarchy_node(GArray *tbl, uint32_t flags,
}
}
+/* ACPI spec, Revision 6.3 Cache type structure (Type 1) */
+static void build_cache_structure(GArray *tbl,
+ uint32_t next_level,
+ CPUCacheInfo *cache_info)
+{
+ /* Cache type structure */
+ build_append_byte(tbl, 1);
+ /* Length */
+ build_append_byte(tbl, 24);
+ /* Reserved */
+ build_append_int_noprefix(tbl, 0, 2);
+ /* Flags */
+ build_append_int_noprefix(tbl, 0x7f, 4);
+ /* Next level cache */
+ build_append_int_noprefix(tbl, next_level, 4);
+ /* Size */
+ build_append_int_noprefix(tbl, cache_info->size, 4);
+ /* Number of sets */
+ build_append_int_noprefix(tbl, cache_info->sets, 4);
+ /* Associativity */
+ build_append_byte(tbl, cache_info->associativity);
+ /* Attributes */
+ build_append_byte(tbl, cache_info->attributes);
+ /* Line size */
+ build_append_int_noprefix(tbl, cache_info->line_size, 2);
+}
+
/*
* ACPI spec, Revision 6.3
* 5.2.29 Processor Properties Topology Table (PPTT)
*/
void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
- const char *oem_id, const char *oem_table_id)
+ const char *oem_id, const char *oem_table_id,
+ const CPUCaches *CPUCaches)
{
MachineClass *mc = MACHINE_GET_CLASS(ms);
CPUArchIdList *cpus = ms->possible_cpus;
int64_t socket_id = -1, cluster_id = -1, core_id = -1;
uint32_t socket_offset = 0, cluster_offset = 0, core_offset = 0;
uint32_t pptt_start = table_data->len;
+ uint32_t l3_offset = 0, priv_num = 0;
+ uint32_t priv_rsrc[3] = {0};
int n;
AcpiTable table = { .sig = "PPTT", .rev = 2,
.oem_id = oem_id, .oem_table_id = oem_table_id };
@@ -2024,10 +2054,11 @@ void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
socket_id = cpus->cpus[n].props.socket_id;
cluster_id = -1;
core_id = -1;
+ priv_num = 0;
socket_offset = table_data->len - pptt_start;
build_processor_hierarchy_node(table_data,
(1 << 0), /* Physical package */
- 0, socket_id, NULL, 0);
+ 0, socket_id, NULL, priv_num);
}
if (mc->smp_props.clusters_supported && mc->smp_props.has_clusters) {
@@ -2035,20 +2066,44 @@ void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
assert(cpus->cpus[n].props.cluster_id > cluster_id);
cluster_id = cpus->cpus[n].props.cluster_id;
core_id = -1;
+ priv_num = 0;
+ l3_offset = table_data->len - pptt_start;
+ /* L3 cache type structure */
+ if (CPUCaches && CPUCaches->l3_cache) {
+ priv_num = 1;
+ build_cache_structure(table_data, 0, CPUCaches->l3_cache);
+ }
cluster_offset = table_data->len - pptt_start;
build_processor_hierarchy_node(table_data,
(0 << 0), /* Not a physical package */
- socket_offset, cluster_id, NULL, 0);
+ socket_offset, cluster_id, &l3_offset, priv_num);
}
} else {
cluster_offset = socket_offset;
}
+ if (CPUCaches) {
+ /* L2 cache type structure */
+ priv_rsrc[0] = table_data->len - pptt_start;
+ build_cache_structure(table_data, 0, CPUCaches->l2_cache);
+
+ /* L1d cache type structure */
+ priv_rsrc[1] = table_data->len - pptt_start;
+ build_cache_structure(table_data, priv_rsrc[0],
+ CPUCaches->l1d_cache);
+
+ /* L1i cache type structure */
+ priv_rsrc[2] = table_data->len - pptt_start;
+ build_cache_structure(table_data, priv_rsrc[0],
+ CPUCaches->l1i_cache);
+
+ priv_num = 3;
+ }
if (ms->smp.threads == 1) {
build_processor_hierarchy_node(table_data,
(1 << 1) | /* ACPI Processor ID valid */
(1 << 3), /* Node is a Leaf */
- cluster_offset, n, NULL, 0);
+ cluster_offset, n, priv_rsrc, priv_num);
} else {
if (cpus->cpus[n].props.core_id != core_id) {
assert(cpus->cpus[n].props.core_id > core_id);
@@ -2063,7 +2118,7 @@ void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
(1 << 1) | /* ACPI Processor ID valid */
(1 << 2) | /* Processor is a Thread */
(1 << 3), /* Node is a Leaf */
- core_offset, n, NULL, 0);
+ core_offset, n, priv_rsrc, priv_num);
}
}
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index ff2a310270..2dd949f41e 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -234,6 +234,29 @@ struct CrsRangeSet {
GPtrArray *mem_64bit_ranges;
} CrsRangeSet;
+enum CacheType {
+ DATA_CACHE,
+ INSTRUCTION_CACHE,
+ UNIFIED_CACHE
+};
+
+typedef
+struct CPUCacheInfo {
+ enum CacheType type; /* Cache Type*/
+ uint32_t size; /* Size of the cache in bytes */
+ uint32_t sets; /* Number of sets in the cache */
+ uint8_t associativity; /* Cache associativity */
+ uint8_t attributes; /* Cache attributes */
+ uint16_t line_size; /* Line size in bytes */
+} CPUCacheInfo;
+
+typedef
+struct CPUCaches {
+ CPUCacheInfo *l1d_cache;
+ CPUCacheInfo *l1i_cache;
+ CPUCacheInfo *l2_cache;
+ CPUCacheInfo *l3_cache;
+} CPUCaches;
/*
* ACPI 5.0: 6.4.3.8.2 Serial Bus Connection Descriptors
@@ -490,7 +513,8 @@ void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
const char *oem_id, const char *oem_table_id);
void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
- const char *oem_id, const char *oem_table_id);
+ const char *oem_id, const char *oem_table_id,
+ const CPUCaches *CPUCaches);
void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
const char *oem_id, const char *oem_table_id);
--
2.34.1
next prev parent reply other threads:[~2024-01-29 10:42 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-29 10:40 [RESEND RFC 0/3] Add cache structure table creation for PPTT table Sia Jee Heng
2024-01-29 10:40 ` Sia Jee Heng [this message]
2024-01-29 10:40 ` [RESEND RFC 2/3] hw/riscv/virt-acpi-build.c: Generate " Sia Jee Heng
2024-01-29 10:40 ` [RESEND RFC 3/3] hw/arm/virt-acpi-build.c: Enable CPU cache topology Sia Jee Heng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240129104039.117671-2-jeeheng.sia@starfivetech.com \
--to=jeeheng.sia@starfivetech.com \
--cc=alistair.francis@wdc.com \
--cc=anisinha@redhat.com \
--cc=bin.meng@windriver.com \
--cc=dbarboza@ventanamicro.com \
--cc=imammedo@redhat.com \
--cc=liwei1518@gmail.com \
--cc=mst@redhat.com \
--cc=palmer@dabbelt.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=shannon.zhaosl@gmail.com \
--cc=sunilvl@ventanamicro.com \
--cc=zhiwei_liu@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).