hw/i386: Update structures to save the number of nodes per package
Update structures X86CPUTopoIDs and CPUX86State to hold the number of nodes per package. This is required to build EPYC mode topology. Signed-off-by: Babu Moger <babu.moger@amd.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Message-Id: <158396720035.58170.1973738805301006456.stgit@naples-babu.amd.com>
This commit is contained in:
parent
156778a083
commit
c24a41bb53
@ -1525,6 +1525,7 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
init_topo_info(&topo_info, x86ms);
|
||||
|
||||
env->nr_dies = x86ms->smp_dies;
|
||||
env->nr_nodes = topo_info.nodes_per_pkg;
|
||||
|
||||
/*
|
||||
* If APIC ID is not set,
|
||||
|
@ -62,6 +62,7 @@ inline void init_topo_info(X86CPUTopoInfo *topo_info,
|
||||
{
|
||||
MachineState *ms = MACHINE(x86ms);
|
||||
|
||||
topo_info->nodes_per_pkg = ms->numa_state->num_nodes / ms->smp.sockets;
|
||||
topo_info->dies_per_pkg = x86ms->smp_dies;
|
||||
topo_info->cores_per_die = ms->smp.cores;
|
||||
topo_info->threads_per_core = ms->smp.threads;
|
||||
|
@ -53,6 +53,7 @@ typedef struct X86CPUTopoIDs {
|
||||
} X86CPUTopoIDs;
|
||||
|
||||
typedef struct X86CPUTopoInfo {
|
||||
unsigned nodes_per_pkg;
|
||||
unsigned dies_per_pkg;
|
||||
unsigned cores_per_die;
|
||||
unsigned threads_per_core;
|
||||
|
@ -6957,6 +6957,7 @@ static void x86_cpu_initfn(Object *obj)
|
||||
FeatureWord w;
|
||||
|
||||
env->nr_dies = 1;
|
||||
env->nr_nodes = 1;
|
||||
cpu_set_cpustate_pointers(cpu);
|
||||
|
||||
object_property_add(obj, "family", "int",
|
||||
|
@ -1609,6 +1609,7 @@ typedef struct CPUX86State {
|
||||
TPRAccess tpr_access_type;
|
||||
|
||||
unsigned nr_dies;
|
||||
unsigned nr_nodes;
|
||||
} CPUX86State;
|
||||
|
||||
struct kvm_msrs;
|
||||
|
@ -31,12 +31,12 @@ static void test_topo_bits(void)
|
||||
X86CPUTopoInfo topo_info = {0};
|
||||
|
||||
/* simple tests for 1 thread per core, 1 core per die, 1 die per package */
|
||||
topo_info = (X86CPUTopoInfo) {1, 1, 1};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 1, 1};
|
||||
g_assert_cmpuint(apicid_smt_width(&topo_info), ==, 0);
|
||||
g_assert_cmpuint(apicid_core_width(&topo_info), ==, 0);
|
||||
g_assert_cmpuint(apicid_die_width(&topo_info), ==, 0);
|
||||
|
||||
topo_info = (X86CPUTopoInfo) {1, 1, 1};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 1, 1};
|
||||
g_assert_cmpuint(x86_apicid_from_cpu_idx(&topo_info, 0), ==, 0);
|
||||
g_assert_cmpuint(x86_apicid_from_cpu_idx(&topo_info, 1), ==, 1);
|
||||
g_assert_cmpuint(x86_apicid_from_cpu_idx(&topo_info, 2), ==, 2);
|
||||
@ -45,39 +45,39 @@ static void test_topo_bits(void)
|
||||
|
||||
/* Test field width calculation for multiple values
|
||||
*/
|
||||
topo_info = (X86CPUTopoInfo) {1, 1, 2};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 1, 2};
|
||||
g_assert_cmpuint(apicid_smt_width(&topo_info), ==, 1);
|
||||
topo_info = (X86CPUTopoInfo) {1, 1, 3};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 1, 3};
|
||||
g_assert_cmpuint(apicid_smt_width(&topo_info), ==, 2);
|
||||
topo_info = (X86CPUTopoInfo) {1, 1, 4};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 1, 4};
|
||||
g_assert_cmpuint(apicid_smt_width(&topo_info), ==, 2);
|
||||
|
||||
topo_info = (X86CPUTopoInfo) {1, 1, 14};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 1, 14};
|
||||
g_assert_cmpuint(apicid_smt_width(&topo_info), ==, 4);
|
||||
topo_info = (X86CPUTopoInfo) {1, 1, 15};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 1, 15};
|
||||
g_assert_cmpuint(apicid_smt_width(&topo_info), ==, 4);
|
||||
topo_info = (X86CPUTopoInfo) {1, 1, 16};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 1, 16};
|
||||
g_assert_cmpuint(apicid_smt_width(&topo_info), ==, 4);
|
||||
topo_info = (X86CPUTopoInfo) {1, 1, 17};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 1, 17};
|
||||
g_assert_cmpuint(apicid_smt_width(&topo_info), ==, 5);
|
||||
|
||||
|
||||
topo_info = (X86CPUTopoInfo) {1, 30, 2};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 30, 2};
|
||||
g_assert_cmpuint(apicid_core_width(&topo_info), ==, 5);
|
||||
topo_info = (X86CPUTopoInfo) {1, 31, 2};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 31, 2};
|
||||
g_assert_cmpuint(apicid_core_width(&topo_info), ==, 5);
|
||||
topo_info = (X86CPUTopoInfo) {1, 32, 2};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 32, 2};
|
||||
g_assert_cmpuint(apicid_core_width(&topo_info), ==, 5);
|
||||
topo_info = (X86CPUTopoInfo) {1, 33, 2};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 33, 2};
|
||||
g_assert_cmpuint(apicid_core_width(&topo_info), ==, 6);
|
||||
|
||||
topo_info = (X86CPUTopoInfo) {1, 30, 2};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 30, 2};
|
||||
g_assert_cmpuint(apicid_die_width(&topo_info), ==, 0);
|
||||
topo_info = (X86CPUTopoInfo) {2, 30, 2};
|
||||
topo_info = (X86CPUTopoInfo) {0, 2, 30, 2};
|
||||
g_assert_cmpuint(apicid_die_width(&topo_info), ==, 1);
|
||||
topo_info = (X86CPUTopoInfo) {3, 30, 2};
|
||||
topo_info = (X86CPUTopoInfo) {0, 3, 30, 2};
|
||||
g_assert_cmpuint(apicid_die_width(&topo_info), ==, 2);
|
||||
topo_info = (X86CPUTopoInfo) {4, 30, 2};
|
||||
topo_info = (X86CPUTopoInfo) {0, 4, 30, 2};
|
||||
g_assert_cmpuint(apicid_die_width(&topo_info), ==, 2);
|
||||
|
||||
/* build a weird topology and see if IDs are calculated correctly
|
||||
@ -85,18 +85,18 @@ static void test_topo_bits(void)
|
||||
|
||||
/* This will use 2 bits for thread ID and 3 bits for core ID
|
||||
*/
|
||||
topo_info = (X86CPUTopoInfo) {1, 6, 3};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 6, 3};
|
||||
g_assert_cmpuint(apicid_smt_width(&topo_info), ==, 2);
|
||||
g_assert_cmpuint(apicid_core_offset(&topo_info), ==, 2);
|
||||
g_assert_cmpuint(apicid_die_offset(&topo_info), ==, 5);
|
||||
g_assert_cmpuint(apicid_pkg_offset(&topo_info), ==, 5);
|
||||
|
||||
topo_info = (X86CPUTopoInfo) {1, 6, 3};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 6, 3};
|
||||
g_assert_cmpuint(x86_apicid_from_cpu_idx(&topo_info, 0), ==, 0);
|
||||
g_assert_cmpuint(x86_apicid_from_cpu_idx(&topo_info, 1), ==, 1);
|
||||
g_assert_cmpuint(x86_apicid_from_cpu_idx(&topo_info, 2), ==, 2);
|
||||
|
||||
topo_info = (X86CPUTopoInfo) {1, 6, 3};
|
||||
topo_info = (X86CPUTopoInfo) {0, 1, 6, 3};
|
||||
g_assert_cmpuint(x86_apicid_from_cpu_idx(&topo_info, 1 * 3 + 0), ==,
|
||||
(1 << 2) | 0);
|
||||
g_assert_cmpuint(x86_apicid_from_cpu_idx(&topo_info, 1 * 3 + 1), ==,
|
||||
|
Loading…
Reference in New Issue
Block a user