On 2025/4/23 20:41, Michael S. Tsirkin wrote: > On Wed, Apr 23, 2025 at 12:41:28PM +0100, Alireza Sanaee wrote: >> From: Yicong Yang <yangyic...@hisilicon.com> >> >> Currently we build the PPTT starting from the socket node and each >> socket will be a separate tree. For a multi-socket system it'll >> be hard for the OS to know the whole system is homogeneous or not >> (actually we're in the current implementation) since no parent node >> to telling the identical implementation informentation. Add a >> root node for indicating this. >> >> Signed-off-by: Yicong Yang <yangyic...@hisilicon.com> >> Reviewed-by: Jonathan Cameron <jonathan.came...@huawei.com> >> Signed-off-by: Alireza Sanaee <alireza.san...@huawei.com> > > so how does the topology look before and after this change? >
for a 2 socket system, the PPTT processor hierarchy tree before this change will be like: [Socket 0] [Socket 1] ^ ^ |-----------\ |-----------\ [CPU 0] ... [CPU 1] [CPU 0] ... [CPU 1] after this change there will be a root node in the tree: [Root Node] ^ |-------------------\ [Socket 0] [Socket 1] ^ ^ |-----------\ |-----------\ [CPU 0] ... [CPU 1] [CPU 0] ... [CPU 1] > >> --- >> hw/acpi/aml-build.c | 15 ++++++++++++++- >> 1 file changed, 14 insertions(+), 1 deletion(-) >> >> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c >> index 560cee12a24b..3010325ca423 100644 >> --- a/hw/acpi/aml-build.c >> +++ b/hw/acpi/aml-build.c >> @@ -2153,12 +2153,25 @@ void build_pptt(GArray *table_data, BIOSLinker >> *linker, MachineState *ms, >> 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 root_offset; >> int n; >> AcpiTable table = { .sig = "PPTT", .rev = 2, >> .oem_id = oem_id, .oem_table_id = oem_table_id }; >> >> acpi_table_begin(&table, table_data); >> >> + /* >> + * Build a root node for all the processor nodes. Otherwise when >> + * building a multi-socket system each socket tree are separated > > is separated? > >> + * and will be hard for the OS like Linux to know whether the >> + * system is homogeneous. >> + */ >> + root_offset = table_data->len - pptt_start; >> + build_processor_hierarchy_node(table_data, >> + (1 << 0) | /* Physical package */ >> + (1 << 4), /* Identical Implementation */ >> + 0, 0, NULL, 0); >> + >> /* >> * This works with the assumption that cpus[n].props.*_id has been >> * sorted from top to down levels in mc->possible_cpu_arch_ids(). >> @@ -2175,7 +2188,7 @@ void build_pptt(GArray *table_data, BIOSLinker >> *linker, MachineState *ms, >> build_processor_hierarchy_node(table_data, >> (1 << 0) | /* Physical package */ >> (1 << 4), /* Identical Implementation */ >> - 0, socket_id, NULL, 0); >> + root_offset, socket_id, NULL, 0); >> } >> >> if (mc->smp_props.clusters_supported && mc->smp_props.has_clusters) >> { >> -- >> 2.34.1 > > > . >