hw/loongarch/virt: Improve fdt table creation for CPU object
For CPU object, possible_cpu_arch_ids() function is used rather than smp.cpus. With command -smp x, -device la464-loongarch-cpu, smp.cpus is not accurate for all possible CPU objects, possible_cpu_arch_ids() is used here. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Reviewed-by: Bibo Mao <maobibo@loongson.cn>
This commit is contained in:
parent
2f1399b008
commit
b360109fc6
@ -365,26 +365,35 @@ static void create_fdt(LoongArchVirtMachineState *lvms)
|
|||||||
static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
|
static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
|
||||||
{
|
{
|
||||||
int num;
|
int num;
|
||||||
const MachineState *ms = MACHINE(lvms);
|
MachineState *ms = MACHINE(lvms);
|
||||||
int smp_cpus = ms->smp.cpus;
|
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||||
|
const CPUArchIdList *possible_cpus;
|
||||||
|
LoongArchCPU *cpu;
|
||||||
|
CPUState *cs;
|
||||||
|
char *nodename, *map_path;
|
||||||
|
|
||||||
qemu_fdt_add_subnode(ms->fdt, "/cpus");
|
qemu_fdt_add_subnode(ms->fdt, "/cpus");
|
||||||
qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
|
qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
|
||||||
qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0);
|
qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0);
|
||||||
|
|
||||||
/* cpu nodes */
|
/* cpu nodes */
|
||||||
for (num = smp_cpus - 1; num >= 0; num--) {
|
possible_cpus = mc->possible_cpu_arch_ids(ms);
|
||||||
char *nodename = g_strdup_printf("/cpus/cpu@%d", num);
|
for (num = 0; num < possible_cpus->len; num++) {
|
||||||
LoongArchCPU *cpu = LOONGARCH_CPU(qemu_get_cpu(num));
|
cs = possible_cpus->cpus[num].cpu;
|
||||||
CPUState *cs = CPU(cpu);
|
if (cs == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
nodename = g_strdup_printf("/cpus/cpu@%d", num);
|
||||||
|
cpu = LOONGARCH_CPU(cs);
|
||||||
|
|
||||||
qemu_fdt_add_subnode(ms->fdt, nodename);
|
qemu_fdt_add_subnode(ms->fdt, nodename);
|
||||||
qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "cpu");
|
qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "cpu");
|
||||||
qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
|
qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
|
||||||
cpu->dtb_compatible);
|
cpu->dtb_compatible);
|
||||||
if (ms->possible_cpus->cpus[cs->cpu_index].props.has_node_id) {
|
if (possible_cpus->cpus[num].props.has_node_id) {
|
||||||
qemu_fdt_setprop_cell(ms->fdt, nodename, "numa-node-id",
|
qemu_fdt_setprop_cell(ms->fdt, nodename, "numa-node-id",
|
||||||
ms->possible_cpus->cpus[cs->cpu_index].props.node_id);
|
possible_cpus->cpus[num].props.node_id);
|
||||||
}
|
}
|
||||||
qemu_fdt_setprop_cell(ms->fdt, nodename, "reg", num);
|
qemu_fdt_setprop_cell(ms->fdt, nodename, "reg", num);
|
||||||
qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle",
|
qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle",
|
||||||
@ -394,11 +403,13 @@ static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
|
|||||||
|
|
||||||
/*cpu map */
|
/*cpu map */
|
||||||
qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
|
qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
|
||||||
|
for (num = 0; num < possible_cpus->len; num++) {
|
||||||
|
cs = possible_cpus->cpus[num].cpu;
|
||||||
|
if (cs == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (num = smp_cpus - 1; num >= 0; num--) {
|
nodename = g_strdup_printf("/cpus/cpu@%d", num);
|
||||||
char *cpu_path = g_strdup_printf("/cpus/cpu@%d", num);
|
|
||||||
char *map_path;
|
|
||||||
|
|
||||||
if (ms->smp.threads > 1) {
|
if (ms->smp.threads > 1) {
|
||||||
map_path = g_strdup_printf(
|
map_path = g_strdup_printf(
|
||||||
"/cpus/cpu-map/socket%d/core%d/thread%d",
|
"/cpus/cpu-map/socket%d/core%d/thread%d",
|
||||||
@ -412,10 +423,10 @@ static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
|
|||||||
num % ms->smp.cores);
|
num % ms->smp.cores);
|
||||||
}
|
}
|
||||||
qemu_fdt_add_path(ms->fdt, map_path);
|
qemu_fdt_add_path(ms->fdt, map_path);
|
||||||
qemu_fdt_setprop_phandle(ms->fdt, map_path, "cpu", cpu_path);
|
qemu_fdt_setprop_phandle(ms->fdt, map_path, "cpu", nodename);
|
||||||
|
|
||||||
g_free(map_path);
|
g_free(map_path);
|
||||||
g_free(cpu_path);
|
g_free(nodename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user