diff mbox series

[RFC,25/52] mips: Replace MachineState.smp access with topology helpers

Message ID 20230213095035.158240-26-zhao1.liu@linux.intel.com
State New
Headers show
Series Introduce hybrid CPU topology | expand

Commit Message

Zhao Liu Feb. 13, 2023, 9:50 a.m. UTC
From: Zhao Liu <zhao1.liu@intel.com>

When MachineState.topo is introduced, the topology related structures
become complicated. So we wrapped the access to topology fields of
MachineState.topo into some helpers, and we are using these helpers
to replace the use of MachineState.smp.

For mips, it's straightforward to replace topology access with wrapped
generic interfaces.

Cc: Aleksandar Rikalo <aleksandar.rikalo@syrmia.com>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
Cc: Aurelien Jarno <aurelien@aurel32.net>
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
---
 hw/mips/boston.c          |  8 +++++---
 hw/mips/loongson3_bootp.c |  7 ++++---
 hw/mips/loongson3_virt.c  |  8 +++++---
 hw/mips/malta.c           | 10 ++++++----
 4 files changed, 20 insertions(+), 13 deletions(-)

Comments

Mi, Dapeng1 Feb. 14, 2023, 3:40 a.m. UTC | #1
> From: Zhao Liu <zhao1.liu@linux.intel.com>
> Sent: Monday, February 13, 2023 5:50 PM
> To: Eduardo Habkost <eduardo@habkost.net>; Marcel Apfelbaum
> <marcel.apfelbaum@gmail.com>; Philippe Mathieu-Daudé <philmd@linaro.org>;
> Yanan Wang <wangyanan55@huawei.com>; Michael S . Tsirkin
> <mst@redhat.com>; Richard Henderson <richard.henderson@linaro.org>; Paolo
> Bonzini <pbonzini@redhat.com>; Eric Blake <eblake@redhat.com>; Markus
> Armbruster <armbru@redhat.com>
> Cc: qemu-devel@nongnu.org; Wang, Zhenyu Z <zhenyu.z.wang@intel.com>; Mi,
> Dapeng1 <dapeng1.mi@intel.com>; Ding, Zhuocheng
> <zhuocheng.ding@intel.com>; Robert Hoo <robert.hu@linux.intel.com>;
> Christopherson,, Sean <seanjc@google.com>; Like Xu
> <like.xu.linux@gmail.com>; Liu, Zhao1 <zhao1.liu@intel.com>; Aleksandar
> Rikalo <aleksandar.rikalo@syrmia.com>; Huacai Chen
> <chenhuacai@kernel.org>; Jiaxun Yang <jiaxun.yang@flygoat.com>; Aurelien
> Jarno <aurelien@aurel32.net>
> Subject: [RFC 25/52] mips: Replace MachineState.smp access with topology
> helpers
> 
> From: Zhao Liu <zhao1.liu@intel.com>
> 
> When MachineState.topo is introduced, the topology related structures
> become complicated. So we wrapped the access to topology fields of
> MachineState.topo into some helpers, and we are using these helpers
> to replace the use of MachineState.smp.
> 
> For mips, it's straightforward to replace topology access with wrapped
> generic interfaces.
> 
> Cc: Aleksandar Rikalo <aleksandar.rikalo@syrmia.com>
> Cc: Huacai Chen <chenhuacai@kernel.org>
> Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
> Cc: Aurelien Jarno <aurelien@aurel32.net>
> Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> ---
>  hw/mips/boston.c          |  8 +++++---
>  hw/mips/loongson3_bootp.c |  7 ++++---
>  hw/mips/loongson3_virt.c  |  8 +++++---
>  hw/mips/malta.c           | 10 ++++++----
>  4 files changed, 20 insertions(+), 13 deletions(-)
> 
> diff --git a/hw/mips/boston.c b/hw/mips/boston.c
> index a9d87f34378f..d02c88d769d4 100644
> --- a/hw/mips/boston.c
> +++ b/hw/mips/boston.c
> @@ -514,7 +514,7 @@ static const void *create_fdt(BostonState *s,
>                                const MemMapEntry *memmap, int *dt_size)
>  {
>      void *fdt;
> -    int cpu;
> +    int cpu, smp_cpus;
>      MachineState *ms = s->mach;
>      uint32_t platreg_ph, gic_ph, clk_ph;
>      char *name, *gic_name, *platreg_name, *stdout_name;
> @@ -542,7 +542,8 @@ static const void *create_fdt(BostonState *s,
>      qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
>      qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
> 
> -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> +    smp_cpus = machine_topo_get_cpus(ms);
> +    for (cpu = 0; cpu < smp_cpus; cpu++) {
>          name = g_strdup_printf("/cpus/cpu@%d", cpu);
>          qemu_fdt_add_subnode(fdt, name);
>          qemu_fdt_setprop_string(fdt, name, "compatible", "img,mips");
> @@ -702,7 +703,8 @@ static void boston_mach_init(MachineState *machine)
>      object_initialize_child(OBJECT(machine), "cps", &s->cps, TYPE_MIPS_CPS);
>      object_property_set_str(OBJECT(&s->cps), "cpu-type", machine->cpu_type,
>                              &error_fatal);
> -    object_property_set_int(OBJECT(&s->cps), "num-vp", machine->smp.cpus,
> +    object_property_set_int(OBJECT(&s->cps), "num-vp",
> +                            machine_topo_get_cpus(machine),
>                              &error_fatal);

It's better move "&error_fatal);" to previous line.

>      qdev_connect_clock_in(DEVICE(&s->cps), "clk-in",
>                            qdev_get_clock_out(dev, "cpu-refclk"));
> diff --git a/hw/mips/loongson3_bootp.c b/hw/mips/loongson3_bootp.c
> index f99af229327a..d9a92825ceae 100644
> --- a/hw/mips/loongson3_bootp.c
> +++ b/hw/mips/loongson3_bootp.c
> @@ -40,9 +40,10 @@ static void init_cpu_info(void *g_cpuinfo, uint64_t
> cpu_freq)
>      }
> 
>      c->cpu_startup_core_id = cpu_to_le16(0);
> -    c->nr_cpus = cpu_to_le32(current_machine->smp.cpus);
> -    c->total_node = cpu_to_le32(DIV_ROUND_UP(current_machine->smp.cpus,
> -                                             LOONGSON3_CORE_PER_NODE));
> +    c->nr_cpus = cpu_to_le32(machine_topo_get_cpus(current_machine));
> +    c->total_node =
> +        cpu_to_le32(DIV_ROUND_UP(machine_topo_get_cpus(current_machine),
> +                                 LOONGSON3_CORE_PER_NODE));
>  }
> 
>  static void init_memory_map(void *g_map, uint64_t ram_size)
> diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
> index 25534288dd81..c972bb43a1f7 100644
> --- a/hw/mips/loongson3_virt.c
> +++ b/hw/mips/loongson3_virt.c
> @@ -271,8 +271,10 @@ static void fw_conf_init(unsigned long ram_size)
>      hwaddr cfg_addr = virt_memmap[VIRT_FW_CFG].base;
> 
>      fw_cfg = fw_cfg_init_mem_wide(cfg_addr, cfg_addr + 8, 8, 0, NULL);
> -    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)current_machine-
> >smp.cpus);
> -    fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)current_machine-
> >smp.max_cpus);
> +    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS,
> +                   (uint16_t)machine_topo_get_cpus(current_machine));
> +    fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS,
> +                   (uint16_t)machine_topo_get_max_cpus(current_machine));
>      fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
>      fw_cfg_add_i32(fw_cfg, FW_CFG_MACHINE_VERSION, 1);
>      fw_cfg_add_i64(fw_cfg, FW_CFG_CPU_FREQ, get_cpu_freq_hz());
> @@ -528,7 +530,7 @@ static void mips_loongson3_virt_init(MachineState
> *machine)
>      cpuclk = clock_new(OBJECT(machine), "cpu-refclk");
>      clock_set_hz(cpuclk, DEF_LOONGSON3_FREQ);
> 
> -    for (i = 0; i < machine->smp.cpus; i++) {
> +    for (i = 0; i < machine_topo_get_cpus(machine); i++) {
>          int ip;
> 
>          /* init CPUs */
> diff --git a/hw/mips/malta.c b/hw/mips/malta.c
> index ec172b111ae4..b3322f74baf5 100644
> --- a/hw/mips/malta.c
> +++ b/hw/mips/malta.c
> @@ -981,7 +981,7 @@ static uint64_t load_kernel(void)
>  static void malta_mips_config(MIPSCPU *cpu)
>  {
>      MachineState *ms = MACHINE(qdev_get_machine());
> -    unsigned int smp_cpus = ms->smp.cpus;
> +    unsigned int smp_cpus = machine_topo_get_cpus(ms);
>      CPUMIPSState *env = &cpu->env;
>      CPUState *cs = CPU(cpu);
> 
> @@ -1045,7 +1045,7 @@ static void create_cpu_without_cps(MachineState
> *ms, MaltaState *s,
>      MIPSCPU *cpu;
>      int i;
> 
> -    for (i = 0; i < ms->smp.cpus; i++) {
> +    for (i = 0; i < machine_topo_get_cpus(ms); i++) {
>          cpu = mips_cpu_create_with_clock(ms->cpu_type, s->cpuclk);
> 
>          /* Init internal devices */
> @@ -1066,7 +1066,8 @@ static void create_cps(MachineState *ms, MaltaState
> *s,
>      object_initialize_child(OBJECT(s), "cps", &s->cps, TYPE_MIPS_CPS);
>      object_property_set_str(OBJECT(&s->cps), "cpu-type", ms->cpu_type,
>                              &error_fatal);
> -    object_property_set_int(OBJECT(&s->cps), "num-vp", ms->smp.cpus,
> +    object_property_set_int(OBJECT(&s->cps), "num-vp",
> +                            machine_topo_get_cpus(ms),
>                              &error_fatal);
>      qdev_connect_clock_in(DEVICE(&s->cps), "clk-in", s->cpuclk);
>      sysbus_realize(SYS_BUS_DEVICE(&s->cps), &error_fatal);
> @@ -1080,7 +1081,8 @@ static void create_cps(MachineState *ms, MaltaState
> *s,
>  static void mips_create_cpu(MachineState *ms, MaltaState *s,
>                              qemu_irq *cbus_irq, qemu_irq *i8259_irq)
>  {
> -    if ((ms->smp.cpus > 1) && cpu_type_supports_cps_smp(ms->cpu_type)) {
> +    if ((machine_topo_get_cpus(ms) > 1) &&
> +        cpu_type_supports_cps_smp(ms->cpu_type)) {
>          create_cps(ms, s, cbus_irq, i8259_irq);
>      } else {
>          create_cpu_without_cps(ms, s, cbus_irq, i8259_irq);
> --
> 2.34.1
Zhao Liu Feb. 15, 2023, 3:08 a.m. UTC | #2
On Tue, Feb 14, 2023 at 11:40:14AM +0800, Mi, Dapeng1 wrote:
> Date: Tue, 14 Feb 2023 11:40:14 +0800
> From: "Mi, Dapeng1" <dapeng1.mi@intel.com>
> Subject: RE: [RFC 25/52] mips: Replace MachineState.smp access with
>  topology helpers
> 
> > From: Zhao Liu <zhao1.liu@linux.intel.com>
> > Sent: Monday, February 13, 2023 5:50 PM
> > To: Eduardo Habkost <eduardo@habkost.net>; Marcel Apfelbaum
> > <marcel.apfelbaum@gmail.com>; Philippe Mathieu-Daud? <philmd@linaro.org>;
> > Yanan Wang <wangyanan55@huawei.com>; Michael S . Tsirkin
> > <mst@redhat.com>; Richard Henderson <richard.henderson@linaro.org>; Paolo
> > Bonzini <pbonzini@redhat.com>; Eric Blake <eblake@redhat.com>; Markus
> > Armbruster <armbru@redhat.com>
> > Cc: qemu-devel@nongnu.org; Wang, Zhenyu Z <zhenyu.z.wang@intel.com>; Mi,
> > Dapeng1 <dapeng1.mi@intel.com>; Ding, Zhuocheng
> > <zhuocheng.ding@intel.com>; Robert Hoo <robert.hu@linux.intel.com>;
> > Christopherson,, Sean <seanjc@google.com>; Like Xu
> > <like.xu.linux@gmail.com>; Liu, Zhao1 <zhao1.liu@intel.com>; Aleksandar
> > Rikalo <aleksandar.rikalo@syrmia.com>; Huacai Chen
> > <chenhuacai@kernel.org>; Jiaxun Yang <jiaxun.yang@flygoat.com>; Aurelien
> > Jarno <aurelien@aurel32.net>
> > Subject: [RFC 25/52] mips: Replace MachineState.smp access with topology
> > helpers
> > 
> > From: Zhao Liu <zhao1.liu@intel.com>
> > 
> > When MachineState.topo is introduced, the topology related structures
> > become complicated. So we wrapped the access to topology fields of
> > MachineState.topo into some helpers, and we are using these helpers
> > to replace the use of MachineState.smp.
> > 
> > For mips, it's straightforward to replace topology access with wrapped
> > generic interfaces.
> > 
> > Cc: Aleksandar Rikalo <aleksandar.rikalo@syrmia.com>
> > Cc: Huacai Chen <chenhuacai@kernel.org>
> > Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
> > Cc: Aurelien Jarno <aurelien@aurel32.net>
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> > ---
> >  hw/mips/boston.c          |  8 +++++---
> >  hw/mips/loongson3_bootp.c |  7 ++++---
> >  hw/mips/loongson3_virt.c  |  8 +++++---
> >  hw/mips/malta.c           | 10 ++++++----
> >  4 files changed, 20 insertions(+), 13 deletions(-)
> > 
> > diff --git a/hw/mips/boston.c b/hw/mips/boston.c
> > index a9d87f34378f..d02c88d769d4 100644
> > --- a/hw/mips/boston.c
> > +++ b/hw/mips/boston.c
> > @@ -514,7 +514,7 @@ static const void *create_fdt(BostonState *s,
> >                                const MemMapEntry *memmap, int *dt_size)
> >  {
> >      void *fdt;
> > -    int cpu;
> > +    int cpu, smp_cpus;
> >      MachineState *ms = s->mach;
> >      uint32_t platreg_ph, gic_ph, clk_ph;
> >      char *name, *gic_name, *platreg_name, *stdout_name;
> > @@ -542,7 +542,8 @@ static const void *create_fdt(BostonState *s,
> >      qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
> >      qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
> > 
> > -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> > +    smp_cpus = machine_topo_get_cpus(ms);
> > +    for (cpu = 0; cpu < smp_cpus; cpu++) {
> >          name = g_strdup_printf("/cpus/cpu@%d", cpu);
> >          qemu_fdt_add_subnode(fdt, name);
> >          qemu_fdt_setprop_string(fdt, name, "compatible", "img,mips");
> > @@ -702,7 +703,8 @@ static void boston_mach_init(MachineState *machine)
> >      object_initialize_child(OBJECT(machine), "cps", &s->cps, TYPE_MIPS_CPS);
> >      object_property_set_str(OBJECT(&s->cps), "cpu-type", machine->cpu_type,
> >                              &error_fatal);
> > -    object_property_set_int(OBJECT(&s->cps), "num-vp", machine->smp.cpus,
> > +    object_property_set_int(OBJECT(&s->cps), "num-vp",
> > +                            machine_topo_get_cpus(machine),
> >                              &error_fatal);
> 
> It's better move "&error_fatal);" to previous line.

Yes, this is no more than 80 characters.

> 
> >      qdev_connect_clock_in(DEVICE(&s->cps), "clk-in",
> >                            qdev_get_clock_out(dev, "cpu-refclk"));
> > diff --git a/hw/mips/loongson3_bootp.c b/hw/mips/loongson3_bootp.c
> > index f99af229327a..d9a92825ceae 100644
> > --- a/hw/mips/loongson3_bootp.c
> > +++ b/hw/mips/loongson3_bootp.c
> > @@ -40,9 +40,10 @@ static void init_cpu_info(void *g_cpuinfo, uint64_t
> > cpu_freq)
> >      }
> > 
> >      c->cpu_startup_core_id = cpu_to_le16(0);
> > -    c->nr_cpus = cpu_to_le32(current_machine->smp.cpus);
> > -    c->total_node = cpu_to_le32(DIV_ROUND_UP(current_machine->smp.cpus,
> > -                                             LOONGSON3_CORE_PER_NODE));
> > +    c->nr_cpus = cpu_to_le32(machine_topo_get_cpus(current_machine));
> > +    c->total_node =
> > +        cpu_to_le32(DIV_ROUND_UP(machine_topo_get_cpus(current_machine),
> > +                                 LOONGSON3_CORE_PER_NODE));
> >  }
> > 
> >  static void init_memory_map(void *g_map, uint64_t ram_size)
> > diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
> > index 25534288dd81..c972bb43a1f7 100644
> > --- a/hw/mips/loongson3_virt.c
> > +++ b/hw/mips/loongson3_virt.c
> > @@ -271,8 +271,10 @@ static void fw_conf_init(unsigned long ram_size)
> >      hwaddr cfg_addr = virt_memmap[VIRT_FW_CFG].base;
> > 
> >      fw_cfg = fw_cfg_init_mem_wide(cfg_addr, cfg_addr + 8, 8, 0, NULL);
> > -    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)current_machine-
> > >smp.cpus);
> > -    fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)current_machine-
> > >smp.max_cpus);
> > +    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS,
> > +                   (uint16_t)machine_topo_get_cpus(current_machine));
> > +    fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS,
> > +                   (uint16_t)machine_topo_get_max_cpus(current_machine));
> >      fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
> >      fw_cfg_add_i32(fw_cfg, FW_CFG_MACHINE_VERSION, 1);
> >      fw_cfg_add_i64(fw_cfg, FW_CFG_CPU_FREQ, get_cpu_freq_hz());
> > @@ -528,7 +530,7 @@ static void mips_loongson3_virt_init(MachineState
> > *machine)
> >      cpuclk = clock_new(OBJECT(machine), "cpu-refclk");
> >      clock_set_hz(cpuclk, DEF_LOONGSON3_FREQ);
> > 
> > -    for (i = 0; i < machine->smp.cpus; i++) {
> > +    for (i = 0; i < machine_topo_get_cpus(machine); i++) {
> >          int ip;
> > 
> >          /* init CPUs */
> > diff --git a/hw/mips/malta.c b/hw/mips/malta.c
> > index ec172b111ae4..b3322f74baf5 100644
> > --- a/hw/mips/malta.c
> > +++ b/hw/mips/malta.c
> > @@ -981,7 +981,7 @@ static uint64_t load_kernel(void)
> >  static void malta_mips_config(MIPSCPU *cpu)
> >  {
> >      MachineState *ms = MACHINE(qdev_get_machine());
> > -    unsigned int smp_cpus = ms->smp.cpus;
> > +    unsigned int smp_cpus = machine_topo_get_cpus(ms);
> >      CPUMIPSState *env = &cpu->env;
> >      CPUState *cs = CPU(cpu);
> > 
> > @@ -1045,7 +1045,7 @@ static void create_cpu_without_cps(MachineState
> > *ms, MaltaState *s,
> >      MIPSCPU *cpu;
> >      int i;
> > 
> > -    for (i = 0; i < ms->smp.cpus; i++) {
> > +    for (i = 0; i < machine_topo_get_cpus(ms); i++) {
> >          cpu = mips_cpu_create_with_clock(ms->cpu_type, s->cpuclk);
> > 
> >          /* Init internal devices */
> > @@ -1066,7 +1066,8 @@ static void create_cps(MachineState *ms, MaltaState
> > *s,
> >      object_initialize_child(OBJECT(s), "cps", &s->cps, TYPE_MIPS_CPS);
> >      object_property_set_str(OBJECT(&s->cps), "cpu-type", ms->cpu_type,
> >                              &error_fatal);
> > -    object_property_set_int(OBJECT(&s->cps), "num-vp", ms->smp.cpus,
> > +    object_property_set_int(OBJECT(&s->cps), "num-vp",
> > +                            machine_topo_get_cpus(ms),
> >                              &error_fatal);
> >      qdev_connect_clock_in(DEVICE(&s->cps), "clk-in", s->cpuclk);
> >      sysbus_realize(SYS_BUS_DEVICE(&s->cps), &error_fatal);
> > @@ -1080,7 +1081,8 @@ static void create_cps(MachineState *ms, MaltaState
> > *s,
> >  static void mips_create_cpu(MachineState *ms, MaltaState *s,
> >                              qemu_irq *cbus_irq, qemu_irq *i8259_irq)
> >  {
> > -    if ((ms->smp.cpus > 1) && cpu_type_supports_cps_smp(ms->cpu_type)) {
> > +    if ((machine_topo_get_cpus(ms) > 1) &&
> > +        cpu_type_supports_cps_smp(ms->cpu_type)) {
> >          create_cps(ms, s, cbus_irq, i8259_irq);
> >      } else {
> >          create_cpu_without_cps(ms, s, cbus_irq, i8259_irq);
> > --
> > 2.34.1
>
diff mbox series

Patch

diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index a9d87f34378f..d02c88d769d4 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -514,7 +514,7 @@  static const void *create_fdt(BostonState *s,
                               const MemMapEntry *memmap, int *dt_size)
 {
     void *fdt;
-    int cpu;
+    int cpu, smp_cpus;
     MachineState *ms = s->mach;
     uint32_t platreg_ph, gic_ph, clk_ph;
     char *name, *gic_name, *platreg_name, *stdout_name;
@@ -542,7 +542,8 @@  static const void *create_fdt(BostonState *s,
     qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
     qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
 
-    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
+    smp_cpus = machine_topo_get_cpus(ms);
+    for (cpu = 0; cpu < smp_cpus; cpu++) {
         name = g_strdup_printf("/cpus/cpu@%d", cpu);
         qemu_fdt_add_subnode(fdt, name);
         qemu_fdt_setprop_string(fdt, name, "compatible", "img,mips");
@@ -702,7 +703,8 @@  static void boston_mach_init(MachineState *machine)
     object_initialize_child(OBJECT(machine), "cps", &s->cps, TYPE_MIPS_CPS);
     object_property_set_str(OBJECT(&s->cps), "cpu-type", machine->cpu_type,
                             &error_fatal);
-    object_property_set_int(OBJECT(&s->cps), "num-vp", machine->smp.cpus,
+    object_property_set_int(OBJECT(&s->cps), "num-vp",
+                            machine_topo_get_cpus(machine),
                             &error_fatal);
     qdev_connect_clock_in(DEVICE(&s->cps), "clk-in",
                           qdev_get_clock_out(dev, "cpu-refclk"));
diff --git a/hw/mips/loongson3_bootp.c b/hw/mips/loongson3_bootp.c
index f99af229327a..d9a92825ceae 100644
--- a/hw/mips/loongson3_bootp.c
+++ b/hw/mips/loongson3_bootp.c
@@ -40,9 +40,10 @@  static void init_cpu_info(void *g_cpuinfo, uint64_t cpu_freq)
     }
 
     c->cpu_startup_core_id = cpu_to_le16(0);
-    c->nr_cpus = cpu_to_le32(current_machine->smp.cpus);
-    c->total_node = cpu_to_le32(DIV_ROUND_UP(current_machine->smp.cpus,
-                                             LOONGSON3_CORE_PER_NODE));
+    c->nr_cpus = cpu_to_le32(machine_topo_get_cpus(current_machine));
+    c->total_node =
+        cpu_to_le32(DIV_ROUND_UP(machine_topo_get_cpus(current_machine),
+                                 LOONGSON3_CORE_PER_NODE));
 }
 
 static void init_memory_map(void *g_map, uint64_t ram_size)
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 25534288dd81..c972bb43a1f7 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -271,8 +271,10 @@  static void fw_conf_init(unsigned long ram_size)
     hwaddr cfg_addr = virt_memmap[VIRT_FW_CFG].base;
 
     fw_cfg = fw_cfg_init_mem_wide(cfg_addr, cfg_addr + 8, 8, 0, NULL);
-    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)current_machine->smp.cpus);
-    fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)current_machine->smp.max_cpus);
+    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS,
+                   (uint16_t)machine_topo_get_cpus(current_machine));
+    fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS,
+                   (uint16_t)machine_topo_get_max_cpus(current_machine));
     fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
     fw_cfg_add_i32(fw_cfg, FW_CFG_MACHINE_VERSION, 1);
     fw_cfg_add_i64(fw_cfg, FW_CFG_CPU_FREQ, get_cpu_freq_hz());
@@ -528,7 +530,7 @@  static void mips_loongson3_virt_init(MachineState *machine)
     cpuclk = clock_new(OBJECT(machine), "cpu-refclk");
     clock_set_hz(cpuclk, DEF_LOONGSON3_FREQ);
 
-    for (i = 0; i < machine->smp.cpus; i++) {
+    for (i = 0; i < machine_topo_get_cpus(machine); i++) {
         int ip;
 
         /* init CPUs */
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index ec172b111ae4..b3322f74baf5 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -981,7 +981,7 @@  static uint64_t load_kernel(void)
 static void malta_mips_config(MIPSCPU *cpu)
 {
     MachineState *ms = MACHINE(qdev_get_machine());
-    unsigned int smp_cpus = ms->smp.cpus;
+    unsigned int smp_cpus = machine_topo_get_cpus(ms);
     CPUMIPSState *env = &cpu->env;
     CPUState *cs = CPU(cpu);
 
@@ -1045,7 +1045,7 @@  static void create_cpu_without_cps(MachineState *ms, MaltaState *s,
     MIPSCPU *cpu;
     int i;
 
-    for (i = 0; i < ms->smp.cpus; i++) {
+    for (i = 0; i < machine_topo_get_cpus(ms); i++) {
         cpu = mips_cpu_create_with_clock(ms->cpu_type, s->cpuclk);
 
         /* Init internal devices */
@@ -1066,7 +1066,8 @@  static void create_cps(MachineState *ms, MaltaState *s,
     object_initialize_child(OBJECT(s), "cps", &s->cps, TYPE_MIPS_CPS);
     object_property_set_str(OBJECT(&s->cps), "cpu-type", ms->cpu_type,
                             &error_fatal);
-    object_property_set_int(OBJECT(&s->cps), "num-vp", ms->smp.cpus,
+    object_property_set_int(OBJECT(&s->cps), "num-vp",
+                            machine_topo_get_cpus(ms),
                             &error_fatal);
     qdev_connect_clock_in(DEVICE(&s->cps), "clk-in", s->cpuclk);
     sysbus_realize(SYS_BUS_DEVICE(&s->cps), &error_fatal);
@@ -1080,7 +1081,8 @@  static void create_cps(MachineState *ms, MaltaState *s,
 static void mips_create_cpu(MachineState *ms, MaltaState *s,
                             qemu_irq *cbus_irq, qemu_irq *i8259_irq)
 {
-    if ((ms->smp.cpus > 1) && cpu_type_supports_cps_smp(ms->cpu_type)) {
+    if ((machine_topo_get_cpus(ms) > 1) &&
+        cpu_type_supports_cps_smp(ms->cpu_type)) {
         create_cps(ms, s, cbus_irq, i8259_irq);
     } else {
         create_cpu_without_cps(ms, s, cbus_irq, i8259_irq);