Add a Processor Hierarchy Node of cluster level between core level and package level for ARM PPTT table.
Signed-off-by: Yanan Wang <wangyana...@huawei.com> --- hw/arm/virt-acpi-build.c | 55 ++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index 03fd812d5a..2b745711d1 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -443,6 +443,7 @@ build_pptt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) int pptt_start = table_data->len; int uid = 0, cpus = 0, socket = 0; MachineState *ms = MACHINE(vms); + unsigned int smp_clusters = vms->smp_clusters; unsigned int smp_cores = ms->smp.cores; unsigned int smp_threads = ms->smp.threads; @@ -450,42 +451,52 @@ build_pptt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) for (socket = 0; cpus < ms->possible_cpus->len; socket++) { uint32_t socket_offset = table_data->len - pptt_start; - int core; + int cluster; build_processor_hierarchy_node( table_data, 1, /* Physical package */ 0, socket, /* No parent */ NULL, 0); /* No private resources */ - for (core = 0; core < smp_cores; core++) { - uint32_t core_offset = table_data->len - pptt_start; - int thread; - - if (smp_threads <= 1) { - build_processor_hierarchy_node( - table_data, - (1 << 1) | /* ACPI Processor ID valid */ - (1 << 3), /* ACPI 6.3 - Node is a Leaf */ - socket_offset, uid++, /* Parent is a Socket */ - NULL, 0); /* No private resources */ - } else { - build_processor_hierarchy_node( - table_data, 0, - socket_offset, core, /* Parent is a Socket */ - NULL, 0); /* No private resources */ - - for (thread = 0; thread < smp_threads; thread++) { + for (cluster = 0; cluster < smp_clusters; cluster++) { + uint32_t cluster_offset = table_data->len - pptt_start; + int core; + + build_processor_hierarchy_node( + table_data, 0, + socket_offset, cluster, /* Parent is a Socket */ + NULL, 0); /* No private resources */ + + for (core = 0; core < smp_cores; core++) { + uint32_t core_offset = table_data->len - pptt_start; + int thread; + + if (smp_threads <= 1) { build_processor_hierarchy_node( table_data, (1 << 1) | /* ACPI Processor ID valid */ - (1 << 2) | /* ACPI 6.3 - Processor is a Thread */ (1 << 3), /* ACPI 6.3 - Node is a Leaf */ - core_offset, uid++, /* Parent is a Core */ + cluster_offset, uid++, /* Parent is a Cluster */ NULL, 0); /* No private resources */ + } else { + build_processor_hierarchy_node( + table_data, 0, + cluster_offset, core, /* Parent is a Cluster */ + NULL, 0); /* No private resources */ + + for (thread = 0; thread < smp_threads; thread++) { + build_processor_hierarchy_node( + table_data, + (1 << 1) | /* ACPI Processor ID valid */ + (1 << 2) | /* ACPI 6.3 - Processor is a Thread */ + (1 << 3), /* ACPI 6.3 - Node is a Leaf */ + core_offset, uid++, /* Parent is a Core */ + NULL, 0); /* No private resources */ + } } } } - cpus += smp_cores * smp_threads; + cpus += smp_clusters * smp_cores * smp_threads; } build_header(linker, table_data, -- 2.19.1