diff mbox series

[RFC,22/52] riscv: Replace MachineState.smp access with topology helpers

Message ID 20230213095035.158240-23-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.

In the codes of riscv, it's straightforward to replace topology access
with wrapped generic interfaces.

Cc: Bin Meng <bin.meng@windriver.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Alistair Francis <alistair.francis@wdc.com>
CC: Vijai Kumar K <vijai@behindbytes.com>
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
---
 hw/riscv/microchip_pfsoc.c | 11 ++++++-----
 hw/riscv/numa.c            | 21 +++++++++++----------
 hw/riscv/opentitan.c       |  8 ++++----
 hw/riscv/shakti_c.c        |  2 +-
 hw/riscv/sifive_e.c        | 10 ++++++----
 hw/riscv/sifive_u.c        | 28 ++++++++++++++--------------
 hw/riscv/virt.c            | 24 +++++++++++++-----------
 7 files changed, 55 insertions(+), 49 deletions(-)

Comments

Mi, Dapeng1 Feb. 14, 2023, 2:17 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>; Meng, Bin
> <bin.meng@windriver.com>; Palmer Dabbelt <palmer@dabbelt.com>; Alistair
> Francis <alistair.francis@wdc.com>; Vijai Kumar K <vijai@behindbytes.com>
> Subject: [RFC 22/52] riscv: 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.
> 
> In the codes of riscv, it's straightforward to replace topology access
> with wrapped generic interfaces.
> 
> Cc: Bin Meng <bin.meng@windriver.com>
> Cc: Palmer Dabbelt <palmer@dabbelt.com>
> Cc: Alistair Francis <alistair.francis@wdc.com>
> CC: Vijai Kumar K <vijai@behindbytes.com>
> Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> ---
>  hw/riscv/microchip_pfsoc.c | 11 ++++++-----
>  hw/riscv/numa.c            | 21 +++++++++++----------
>  hw/riscv/opentitan.c       |  8 ++++----
>  hw/riscv/shakti_c.c        |  2 +-
>  hw/riscv/sifive_e.c        | 10 ++++++----
>  hw/riscv/sifive_u.c        | 28 ++++++++++++++--------------
>  hw/riscv/virt.c            | 24 +++++++++++++-----------
>  7 files changed, 55 insertions(+), 49 deletions(-)
> 
> diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
> index 2b91e49561f1..30295cce17e7 100644
> --- a/hw/riscv/microchip_pfsoc.c
> +++ b/hw/riscv/microchip_pfsoc.c
> @@ -164,7 +164,8 @@ static void microchip_pfsoc_soc_instance_init(Object
> *obj)
> 
>      object_initialize_child(OBJECT(&s->u_cluster), "u-cpus", &s->u_cpus,
>                              TYPE_RISCV_HART_ARRAY);
> -    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
> +    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts",
> +                         machine_topo_get_cpus(ms) - 1);
>      qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
>      qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type",
>                           TYPE_RISCV_CPU_SIFIVE_U54);
> @@ -249,10 +250,10 @@ static void microchip_pfsoc_soc_realize(DeviceState
> *dev, Error **errp)
> 
>      /* CLINT */
>      riscv_aclint_swi_create(memmap[MICROCHIP_PFSOC_CLINT].base,
> -        0, ms->smp.cpus, false);
> +        0, machine_topo_get_cpus(ms), false);
>      riscv_aclint_mtimer_create(
>          memmap[MICROCHIP_PFSOC_CLINT].base + RISCV_ACLINT_SWI_SIZE,
> -        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
> +        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, machine_topo_get_cpus(ms),
>          RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
>          CLINT_TIMEBASE_FREQ, false);
> 
> @@ -276,11 +277,11 @@ static void microchip_pfsoc_soc_realize(DeviceState
> *dev, Error **errp)
>                                  l2lim_mem);
> 
>      /* create PLIC hart topology configuration string */
> -    plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
> +    plic_hart_config =
> riscv_plic_hart_config_string(machine_topo_get_cpus(ms));
> 
>      /* PLIC */
>      s->plic = sifive_plic_create(memmap[MICROCHIP_PFSOC_PLIC].base,
> -        plic_hart_config, ms->smp.cpus, 0,
> +        plic_hart_config, machine_topo_get_cpus(ms), 0,
>          MICROCHIP_PFSOC_PLIC_NUM_SOURCES,
>          MICROCHIP_PFSOC_PLIC_NUM_PRIORITIES,
>          MICROCHIP_PFSOC_PLIC_PRIORITY_BASE,
> diff --git a/hw/riscv/numa.c b/hw/riscv/numa.c
> index 472010256183..1fabdc42e767 100644
> --- a/hw/riscv/numa.c
> +++ b/hw/riscv/numa.c
> @@ -37,13 +37,14 @@ int riscv_socket_count(const MachineState *ms)
> 
>  int riscv_socket_first_hartid(const MachineState *ms, int socket_id)
>  {
> -    int i, first_hartid = ms->smp.cpus;
> +    int i, first_hartid, cpus = machine_topo_get_cpus(ms);
> 
> +    first_hartid = cpus;
>      if (!numa_enabled(ms)) {
>          return (!socket_id) ? 0 : -1;
>      }
> 
> -    for (i = 0; i < ms->smp.cpus; i++) {
> +    for (i = 0; i < cpus; i++) {
>          if (ms->possible_cpus->cpus[i].props.node_id != socket_id) {
>              continue;
>          }
> @@ -52,18 +53,18 @@ int riscv_socket_first_hartid(const MachineState *ms,
> int socket_id)
>          }
>      }
> 
> -    return (first_hartid < ms->smp.cpus) ? first_hartid : -1;
> +    return (first_hartid < cpus) ? first_hartid : -1;
>  }
> 
>  int riscv_socket_last_hartid(const MachineState *ms, int socket_id)
>  {
> -    int i, last_hartid = -1;
> +    int i, last_hartid = -1, cpus = machine_topo_get_cpus(ms);
> 
>      if (!numa_enabled(ms)) {
> -        return (!socket_id) ? ms->smp.cpus - 1 : -1;
> +        return (!socket_id) ? cpus - 1 : -1;
>      }
> 
> -    for (i = 0; i < ms->smp.cpus; i++) {
> +    for (i = 0; i < cpus; i++) {
>          if (ms->possible_cpus->cpus[i].props.node_id != socket_id) {
>              continue;
>          }
> @@ -72,7 +73,7 @@ int riscv_socket_last_hartid(const MachineState *ms, int
> socket_id)
>          }
>      }
> 
> -    return (last_hartid < ms->smp.cpus) ? last_hartid : -1;
> +    return (last_hartid < cpus) ? last_hartid : -1;
>  }
> 
>  int riscv_socket_hart_count(const MachineState *ms, int socket_id)
> @@ -80,7 +81,7 @@ int riscv_socket_hart_count(const MachineState *ms, int
> socket_id)
>      int first_hartid, last_hartid;
> 
>      if (!numa_enabled(ms)) {
> -        return (!socket_id) ? ms->smp.cpus : -1;
> +        return (!socket_id) ? machine_topo_get_cpus(ms) : -1;
>      }
> 
>      first_hartid = riscv_socket_first_hartid(ms, socket_id);
> @@ -208,7 +209,7 @@ int64_t riscv_numa_get_default_cpu_node_id(const
> MachineState *ms, int idx)
>      int64_t nidx = 0;
> 
>      if (ms->numa_state->num_nodes) {
> -        nidx = idx / (ms->smp.cpus / ms->numa_state->num_nodes);
> +        nidx = idx / (machine_topo_get_cpus(ms) / ms->numa_state->num_nodes);
>          if (ms->numa_state->num_nodes <= nidx) {
>              nidx = ms->numa_state->num_nodes - 1;
>          }
> @@ -220,7 +221,7 @@ int64_t riscv_numa_get_default_cpu_node_id(const
> MachineState *ms, int idx)
>  const CPUArchIdList *riscv_numa_possible_cpu_arch_ids(MachineState *ms)
>  {
>      int n;
> -    unsigned int max_cpus = ms->smp.max_cpus;
> +    unsigned int max_cpus = machine_topo_get_max_cpus(ms);
> 
>      if (ms->possible_cpus) {
>          assert(ms->possible_cpus->len == max_cpus);
> diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
> index 353f030d80c1..fb59c43dcc08 100644
> --- a/hw/riscv/opentitan.c
> +++ b/hw/riscv/opentitan.c
> @@ -143,11 +143,11 @@ static void lowrisc_ibex_soc_realize(DeviceState
> *dev_soc, Error **errp)
>      MachineState *ms = MACHINE(qdev_get_machine());
>      LowRISCIbexSoCState *s = RISCV_IBEX_SOC(dev_soc);
>      MemoryRegion *sys_mem = get_system_memory();
> -    int i;
> +    int i, cpus = machine_topo_get_cpus(ms);
> 
>      object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
>                              &error_abort);
> -    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
> +    object_property_set_int(OBJECT(&s->cpus), "num-harts", cpus,
>                              &error_abort);
>      object_property_set_int(OBJECT(&s->cpus), "resetvec", s->resetvec,
>                              &error_abort);
> @@ -186,10 +186,10 @@ static void lowrisc_ibex_soc_realize(DeviceState
> *dev_soc, Error **errp)
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->plic), 0,
> memmap[IBEX_DEV_PLIC].base);
> 
> -    for (i = 0; i < ms->smp.cpus; i++) {
> +    for (i = 0; i < cpus; i++) {
>          CPUState *cpu = qemu_get_cpu(i);
> 
> -        qdev_connect_gpio_out(DEVICE(&s->plic), ms->smp.cpus + i,
> +        qdev_connect_gpio_out(DEVICE(&s->plic), cpus + i,
>                                qdev_get_gpio_in(DEVICE(cpu), IRQ_M_EXT));
>      }
> 
> diff --git a/hw/riscv/shakti_c.c b/hw/riscv/shakti_c.c
> index e43cc9445cb1..34499510e2f0 100644
> --- a/hw/riscv/shakti_c.c
> +++ b/hw/riscv/shakti_c.c
> @@ -110,7 +110,7 @@ static void shakti_c_soc_state_realize(DeviceState *dev,
> Error **errp)
>      sysbus_realize(SYS_BUS_DEVICE(&sss->cpus), &error_abort);
> 
>      sss->plic = sifive_plic_create(shakti_c_memmap[SHAKTI_C_PLIC].base,
> -        (char *)SHAKTI_C_PLIC_HART_CONFIG, ms->smp.cpus, 0,
> +        (char *)SHAKTI_C_PLIC_HART_CONFIG, machine_topo_get_cpus(ms), 0,
>          SHAKTI_C_PLIC_NUM_SOURCES,
>          SHAKTI_C_PLIC_NUM_PRIORITIES,
>          SHAKTI_C_PLIC_PRIORITY_BASE,
> diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
> index 3e3f4b0088ca..ca3a7a0877cd 100644
> --- a/hw/riscv/sifive_e.c
> +++ b/hw/riscv/sifive_e.c
> @@ -178,7 +178,8 @@ static void sifive_e_soc_init(Object *obj)
>      SiFiveESoCState *s = RISCV_E_SOC(obj);
> 
>      object_initialize_child(obj, "cpus", &s->cpus, TYPE_RISCV_HART_ARRAY);
> -    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
> +    object_property_set_int(OBJECT(&s->cpus), "num-harts",
> +                            machine_topo_get_cpus(ms),
>                              &error_abort);

With this change, we don't need to start a new line for '&error_abort);', just move
it to previous line.

>      object_property_set_int(OBJECT(&s->cpus), "resetvec", 0x1004,
> &error_abort);
>      object_initialize_child(obj, "riscv.sifive.e.gpio0", &s->gpio,
> @@ -191,6 +192,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error
> **errp)
>      const MemMapEntry *memmap = sifive_e_memmap;
>      SiFiveESoCState *s = RISCV_E_SOC(dev);
>      MemoryRegion *sys_mem = get_system_memory();
> +    unsigned int cpus = machine_topo_get_cpus(ms);
> 
>      object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
>                              &error_abort);
> @@ -204,7 +206,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error
> **errp)
> 
>      /* MMIO */
>      s->plic = sifive_plic_create(memmap[SIFIVE_E_DEV_PLIC].base,
> -        (char *)SIFIVE_E_PLIC_HART_CONFIG, ms->smp.cpus, 0,
> +        (char *)SIFIVE_E_PLIC_HART_CONFIG, cpus, 0,
>          SIFIVE_E_PLIC_NUM_SOURCES,
>          SIFIVE_E_PLIC_NUM_PRIORITIES,
>          SIFIVE_E_PLIC_PRIORITY_BASE,
> @@ -215,10 +217,10 @@ static void sifive_e_soc_realize(DeviceState *dev,
> Error **errp)
>          SIFIVE_E_PLIC_CONTEXT_STRIDE,
>          memmap[SIFIVE_E_DEV_PLIC].size);
>      riscv_aclint_swi_create(memmap[SIFIVE_E_DEV_CLINT].base,
> -        0, ms->smp.cpus, false);
> +        0, cpus, false);
>      riscv_aclint_mtimer_create(memmap[SIFIVE_E_DEV_CLINT].base +
>              RISCV_ACLINT_SWI_SIZE,
> -        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
> +        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, cpus,
>          RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
>          RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, false);
>      create_unimplemented_device("riscv.sifive.e.aon",
> diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
> index d3ab7a9cda5d..c7f969510209 100644
> --- a/hw/riscv/sifive_u.c
> +++ b/hw/riscv/sifive_u.c
> @@ -99,7 +99,7 @@ static void create_fdt(SiFiveUState *s, const
> MemMapEntry *memmap,
>      MachineState *ms = MACHINE(s);
>      uint64_t mem_size = ms->ram_size;
>      void *fdt;
> -    int cpu, fdt_size;
> +    int cpu, fdt_size, num_cpus = machine_topo_get_cpus(ms);
>      uint32_t *cells;
>      char *nodename;
>      uint32_t plic_phandle, prci_phandle, gpio_phandle, phandle = 1;
> @@ -175,7 +175,7 @@ static void create_fdt(SiFiveUState *s, const
> MemMapEntry *memmap,
>      qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
>      qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
> 
> -    for (cpu = ms->smp.cpus - 1; cpu >= 0; cpu--) {
> +    for (cpu = num_cpus - 1; cpu >= 0; cpu--) {
>          int cpu_phandle = phandle++;
>          nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
>          char *intc = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
> @@ -207,8 +207,8 @@ static void create_fdt(SiFiveUState *s, const
> MemMapEntry *memmap,
>          g_free(nodename);
>      }
> 
> -    cells =  g_new0(uint32_t, ms->smp.cpus * 4);
> -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> +    cells =  g_new0(uint32_t, num_cpus * 4);
> +    for (cpu = 0; cpu < num_cpus; cpu++) {
>          nodename =
>              g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
>          uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename);
> @@ -227,7 +227,7 @@ static void create_fdt(SiFiveUState *s, const
> MemMapEntry *memmap,
>          0x0, memmap[SIFIVE_U_DEV_CLINT].base,
>          0x0, memmap[SIFIVE_U_DEV_CLINT].size);
>      qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
> -        cells, ms->smp.cpus * sizeof(uint32_t) * 4);
> +        cells, num_cpus * sizeof(uint32_t) * 4);
>      g_free(cells);
>      g_free(nodename);
> 
> @@ -258,8 +258,8 @@ static void create_fdt(SiFiveUState *s, const
> MemMapEntry *memmap,
>      g_free(nodename);
> 
>      plic_phandle = phandle++;
> -    cells =  g_new0(uint32_t, ms->smp.cpus * 4 - 2);
> -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> +    cells =  g_new0(uint32_t, machine_topo_get_cpus(ms) * 4 - 2);
> +    for (cpu = 0; cpu < machine_topo_get_cpus(ms); cpu++) {
>          nodename =
>              g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
>          uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename);
> @@ -283,7 +283,7 @@ static void create_fdt(SiFiveUState *s, const
> MemMapEntry *memmap,
>          (char **)&plic_compat, ARRAY_SIZE(plic_compat));
>      qemu_fdt_setprop(fdt, nodename, "interrupt-controller", NULL, 0);
>      qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
> -        cells, (ms->smp.cpus * 4 - 2) * sizeof(uint32_t));
> +        cells, (machine_topo_get_cpus(ms) * 4 - 2) * sizeof(uint32_t));
>      qemu_fdt_setprop_cells(fdt, nodename, "reg",
>          0x0, memmap[SIFIVE_U_DEV_PLIC].base,
>          0x0, memmap[SIFIVE_U_DEV_PLIC].size);
> @@ -797,10 +797,10 @@ static void sifive_u_soc_realize(DeviceState *dev,
> Error **errp)
>      MemoryRegion *mask_rom = g_new(MemoryRegion, 1);
>      MemoryRegion *l2lim_mem = g_new(MemoryRegion, 1);
>      char *plic_hart_config;
> -    int i, j;
> +    int i, j, cpus = machine_topo_get_cpus(ms);
>      NICInfo *nd = &nd_table[0];
> 
> -    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
> +    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", cpus - 1);
>      qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
>      qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type", s->cpu_type);
>      qdev_prop_set_uint64(DEVICE(&s->u_cpus), "resetvec", 0x1004);
> @@ -837,11 +837,11 @@ static void sifive_u_soc_realize(DeviceState *dev,
> Error **errp)
>                                  l2lim_mem);
> 
>      /* create PLIC hart topology configuration string */
> -    plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
> +    plic_hart_config = riscv_plic_hart_config_string(cpus);
> 
>      /* MMIO */
>      s->plic = sifive_plic_create(memmap[SIFIVE_U_DEV_PLIC].base,
> -        plic_hart_config, ms->smp.cpus, 0,
> +        plic_hart_config, cpus, 0,
>          SIFIVE_U_PLIC_NUM_SOURCES,
>          SIFIVE_U_PLIC_NUM_PRIORITIES,
>          SIFIVE_U_PLIC_PRIORITY_BASE,
> @@ -857,10 +857,10 @@ static void sifive_u_soc_realize(DeviceState *dev,
> Error **errp)
>      sifive_uart_create(system_memory, memmap[SIFIVE_U_DEV_UART1].base,
>          serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_U_UART1_IRQ));
>      riscv_aclint_swi_create(memmap[SIFIVE_U_DEV_CLINT].base, 0,
> -        ms->smp.cpus, false);
> +        cpus, false);
>      riscv_aclint_mtimer_create(memmap[SIFIVE_U_DEV_CLINT].base +
>              RISCV_ACLINT_SWI_SIZE,
> -        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
> +        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, cpus,
>          RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
>          CLINT_TIMEBASE_FREQ, false);
> 
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index b81081c70b1c..4b0a3dab5ec1 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -506,16 +506,17 @@ static void create_fdt_imsic(RISCVVirtState *s, const
> MemMapEntry *memmap,
>      char *imsic_name;
>      MachineState *ms = MACHINE(s);
>      int socket_count = riscv_socket_count(ms);
> -    uint32_t imsic_max_hart_per_socket, imsic_guest_bits;
> +    uint32_t imsic_max_hart_per_socket, imsic_guest_bits, cpus;
>      uint32_t *imsic_cells, *imsic_regs, imsic_addr, imsic_size;
> 
> +    cpus = machine_topo_get_cpus(ms);
>      *msi_m_phandle = (*phandle)++;
>      *msi_s_phandle = (*phandle)++;
> -    imsic_cells = g_new0(uint32_t, ms->smp.cpus * 2);
> +    imsic_cells = g_new0(uint32_t, cpus * 2);
>      imsic_regs = g_new0(uint32_t, socket_count * 4);
> 
>      /* M-level IMSIC node */
> -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> +    for (cpu = 0; cpu < cpus; cpu++) {
>          imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
>          imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
>      }
> @@ -544,7 +545,7 @@ static void create_fdt_imsic(RISCVVirtState *s, const
> MemMapEntry *memmap,
>      qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
>          NULL, 0);
>      qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
> -        imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
> +        imsic_cells, cpus * sizeof(uint32_t) * 2);
>      qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
>          socket_count * sizeof(uint32_t) * 4);
>      qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
> @@ -562,7 +563,7 @@ static void create_fdt_imsic(RISCVVirtState *s, const
> MemMapEntry *memmap,
>      g_free(imsic_name);
> 
>      /* S-level IMSIC node */
> -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> +    for (cpu = 0; cpu < cpus; cpu++) {
>          imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
>          imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_S_EXT);
>      }
> @@ -593,7 +594,7 @@ static void create_fdt_imsic(RISCVVirtState *s, const
> MemMapEntry *memmap,
>      qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
>          NULL, 0);
>      qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
> -        imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
> +        imsic_cells, cpus * sizeof(uint32_t) * 2);
>      qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
>          socket_count * sizeof(uint32_t) * 4);
>      qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
> @@ -732,7 +733,7 @@ static void create_fdt_sockets(RISCVVirtState *s, const
> MemMapEntry *memmap,
>      char *clust_name;
>      int socket, phandle_pos;
>      MachineState *ms = MACHINE(s);
> -    uint32_t msi_m_phandle = 0, msi_s_phandle = 0;
> +    uint32_t msi_m_phandle = 0, msi_s_phandle = 0, cpus;
>      uint32_t *intc_phandles, xplic_phandles[MAX_NODES];
>      int socket_count = riscv_socket_count(ms);
> 
> @@ -743,9 +744,10 @@ static void create_fdt_sockets(RISCVVirtState *s, const
> MemMapEntry *memmap,
>      qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
>      qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
> 
> -    intc_phandles = g_new0(uint32_t, ms->smp.cpus);
> +    cpus = machine_topo_get_cpus(ms);
> +    intc_phandles = g_new0(uint32_t, cpus);
> 
> -    phandle_pos = ms->smp.cpus;
> +    phandle_pos = cpus;
>      for (socket = (socket_count - 1); socket >= 0; socket--) {
>          phandle_pos -= s->soc[socket].num_harts;
> 
> @@ -776,7 +778,7 @@ static void create_fdt_sockets(RISCVVirtState *s, const
> MemMapEntry *memmap,
>          *msi_pcie_phandle = msi_s_phandle;
>      }
> 
> -    phandle_pos = ms->smp.cpus;
> +    phandle_pos = cpus;
>      for (socket = (socket_count - 1); socket >= 0; socket--) {
>          phandle_pos -= s->soc[socket].num_harts;
> 
> @@ -1113,7 +1115,7 @@ static FWCfgState *create_fw_cfg(const
> MachineState *ms)
> 
>      fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16,
>                                    &address_space_memory);
> -    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)ms->smp.cpus);
> +    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS,
> (uint16_t)machine_topo_get_cpus(ms));
> 
>      return fw_cfg;
>  }
> --
> 2.34.1
Zhao Liu Feb. 15, 2023, 2:57 a.m. UTC | #2
On Tue, Feb 14, 2023 at 10:17:45AM +0800, Mi, Dapeng1 wrote:
> Date: Tue, 14 Feb 2023 10:17:45 +0800
> From: "Mi, Dapeng1" <dapeng1.mi@intel.com>
> Subject: RE: [RFC 22/52] riscv: 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>; Meng, Bin
> > <bin.meng@windriver.com>; Palmer Dabbelt <palmer@dabbelt.com>; Alistair
> > Francis <alistair.francis@wdc.com>; Vijai Kumar K <vijai@behindbytes.com>
> > Subject: [RFC 22/52] riscv: 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.
> > 
> > In the codes of riscv, it's straightforward to replace topology access
> > with wrapped generic interfaces.
> > 
> > Cc: Bin Meng <bin.meng@windriver.com>
> > Cc: Palmer Dabbelt <palmer@dabbelt.com>
> > Cc: Alistair Francis <alistair.francis@wdc.com>
> > CC: Vijai Kumar K <vijai@behindbytes.com>
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> > ---
> >  hw/riscv/microchip_pfsoc.c | 11 ++++++-----
> >  hw/riscv/numa.c            | 21 +++++++++++----------
> >  hw/riscv/opentitan.c       |  8 ++++----
> >  hw/riscv/shakti_c.c        |  2 +-
> >  hw/riscv/sifive_e.c        | 10 ++++++----
> >  hw/riscv/sifive_u.c        | 28 ++++++++++++++--------------
> >  hw/riscv/virt.c            | 24 +++++++++++++-----------
> >  7 files changed, 55 insertions(+), 49 deletions(-)
> > 
> > diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
> > index 2b91e49561f1..30295cce17e7 100644
> > --- a/hw/riscv/microchip_pfsoc.c
> > +++ b/hw/riscv/microchip_pfsoc.c
> > @@ -164,7 +164,8 @@ static void microchip_pfsoc_soc_instance_init(Object
> > *obj)
> > 
> >      object_initialize_child(OBJECT(&s->u_cluster), "u-cpus", &s->u_cpus,
> >                              TYPE_RISCV_HART_ARRAY);
> > -    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
> > +    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts",
> > +                         machine_topo_get_cpus(ms) - 1);
> >      qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
> >      qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type",
> >                           TYPE_RISCV_CPU_SIFIVE_U54);
> > @@ -249,10 +250,10 @@ static void microchip_pfsoc_soc_realize(DeviceState
> > *dev, Error **errp)
> > 
> >      /* CLINT */
> >      riscv_aclint_swi_create(memmap[MICROCHIP_PFSOC_CLINT].base,
> > -        0, ms->smp.cpus, false);
> > +        0, machine_topo_get_cpus(ms), false);
> >      riscv_aclint_mtimer_create(
> >          memmap[MICROCHIP_PFSOC_CLINT].base + RISCV_ACLINT_SWI_SIZE,
> > -        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
> > +        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, machine_topo_get_cpus(ms),
> >          RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
> >          CLINT_TIMEBASE_FREQ, false);
> > 
> > @@ -276,11 +277,11 @@ static void microchip_pfsoc_soc_realize(DeviceState
> > *dev, Error **errp)
> >                                  l2lim_mem);
> > 
> >      /* create PLIC hart topology configuration string */
> > -    plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
> > +    plic_hart_config =
> > riscv_plic_hart_config_string(machine_topo_get_cpus(ms));
> > 
> >      /* PLIC */
> >      s->plic = sifive_plic_create(memmap[MICROCHIP_PFSOC_PLIC].base,
> > -        plic_hart_config, ms->smp.cpus, 0,
> > +        plic_hart_config, machine_topo_get_cpus(ms), 0,
> >          MICROCHIP_PFSOC_PLIC_NUM_SOURCES,
> >          MICROCHIP_PFSOC_PLIC_NUM_PRIORITIES,
> >          MICROCHIP_PFSOC_PLIC_PRIORITY_BASE,
> > diff --git a/hw/riscv/numa.c b/hw/riscv/numa.c
> > index 472010256183..1fabdc42e767 100644
> > --- a/hw/riscv/numa.c
> > +++ b/hw/riscv/numa.c
> > @@ -37,13 +37,14 @@ int riscv_socket_count(const MachineState *ms)
> > 
> >  int riscv_socket_first_hartid(const MachineState *ms, int socket_id)
> >  {
> > -    int i, first_hartid = ms->smp.cpus;
> > +    int i, first_hartid, cpus = machine_topo_get_cpus(ms);
> > 
> > +    first_hartid = cpus;
> >      if (!numa_enabled(ms)) {
> >          return (!socket_id) ? 0 : -1;
> >      }
> > 
> > -    for (i = 0; i < ms->smp.cpus; i++) {
> > +    for (i = 0; i < cpus; i++) {
> >          if (ms->possible_cpus->cpus[i].props.node_id != socket_id) {
> >              continue;
> >          }
> > @@ -52,18 +53,18 @@ int riscv_socket_first_hartid(const MachineState *ms,
> > int socket_id)
> >          }
> >      }
> > 
> > -    return (first_hartid < ms->smp.cpus) ? first_hartid : -1;
> > +    return (first_hartid < cpus) ? first_hartid : -1;
> >  }
> > 
> >  int riscv_socket_last_hartid(const MachineState *ms, int socket_id)
> >  {
> > -    int i, last_hartid = -1;
> > +    int i, last_hartid = -1, cpus = machine_topo_get_cpus(ms);
> > 
> >      if (!numa_enabled(ms)) {
> > -        return (!socket_id) ? ms->smp.cpus - 1 : -1;
> > +        return (!socket_id) ? cpus - 1 : -1;
> >      }
> > 
> > -    for (i = 0; i < ms->smp.cpus; i++) {
> > +    for (i = 0; i < cpus; i++) {
> >          if (ms->possible_cpus->cpus[i].props.node_id != socket_id) {
> >              continue;
> >          }
> > @@ -72,7 +73,7 @@ int riscv_socket_last_hartid(const MachineState *ms, int
> > socket_id)
> >          }
> >      }
> > 
> > -    return (last_hartid < ms->smp.cpus) ? last_hartid : -1;
> > +    return (last_hartid < cpus) ? last_hartid : -1;
> >  }
> > 
> >  int riscv_socket_hart_count(const MachineState *ms, int socket_id)
> > @@ -80,7 +81,7 @@ int riscv_socket_hart_count(const MachineState *ms, int
> > socket_id)
> >      int first_hartid, last_hartid;
> > 
> >      if (!numa_enabled(ms)) {
> > -        return (!socket_id) ? ms->smp.cpus : -1;
> > +        return (!socket_id) ? machine_topo_get_cpus(ms) : -1;
> >      }
> > 
> >      first_hartid = riscv_socket_first_hartid(ms, socket_id);
> > @@ -208,7 +209,7 @@ int64_t riscv_numa_get_default_cpu_node_id(const
> > MachineState *ms, int idx)
> >      int64_t nidx = 0;
> > 
> >      if (ms->numa_state->num_nodes) {
> > -        nidx = idx / (ms->smp.cpus / ms->numa_state->num_nodes);
> > +        nidx = idx / (machine_topo_get_cpus(ms) / ms->numa_state->num_nodes);
> >          if (ms->numa_state->num_nodes <= nidx) {
> >              nidx = ms->numa_state->num_nodes - 1;
> >          }
> > @@ -220,7 +221,7 @@ int64_t riscv_numa_get_default_cpu_node_id(const
> > MachineState *ms, int idx)
> >  const CPUArchIdList *riscv_numa_possible_cpu_arch_ids(MachineState *ms)
> >  {
> >      int n;
> > -    unsigned int max_cpus = ms->smp.max_cpus;
> > +    unsigned int max_cpus = machine_topo_get_max_cpus(ms);
> > 
> >      if (ms->possible_cpus) {
> >          assert(ms->possible_cpus->len == max_cpus);
> > diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
> > index 353f030d80c1..fb59c43dcc08 100644
> > --- a/hw/riscv/opentitan.c
> > +++ b/hw/riscv/opentitan.c
> > @@ -143,11 +143,11 @@ static void lowrisc_ibex_soc_realize(DeviceState
> > *dev_soc, Error **errp)
> >      MachineState *ms = MACHINE(qdev_get_machine());
> >      LowRISCIbexSoCState *s = RISCV_IBEX_SOC(dev_soc);
> >      MemoryRegion *sys_mem = get_system_memory();
> > -    int i;
> > +    int i, cpus = machine_topo_get_cpus(ms);
> > 
> >      object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
> >                              &error_abort);
> > -    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
> > +    object_property_set_int(OBJECT(&s->cpus), "num-harts", cpus,
> >                              &error_abort);
> >      object_property_set_int(OBJECT(&s->cpus), "resetvec", s->resetvec,
> >                              &error_abort);
> > @@ -186,10 +186,10 @@ static void lowrisc_ibex_soc_realize(DeviceState
> > *dev_soc, Error **errp)
> >      }
> >      sysbus_mmio_map(SYS_BUS_DEVICE(&s->plic), 0,
> > memmap[IBEX_DEV_PLIC].base);
> > 
> > -    for (i = 0; i < ms->smp.cpus; i++) {
> > +    for (i = 0; i < cpus; i++) {
> >          CPUState *cpu = qemu_get_cpu(i);
> > 
> > -        qdev_connect_gpio_out(DEVICE(&s->plic), ms->smp.cpus + i,
> > +        qdev_connect_gpio_out(DEVICE(&s->plic), cpus + i,
> >                                qdev_get_gpio_in(DEVICE(cpu), IRQ_M_EXT));
> >      }
> > 
> > diff --git a/hw/riscv/shakti_c.c b/hw/riscv/shakti_c.c
> > index e43cc9445cb1..34499510e2f0 100644
> > --- a/hw/riscv/shakti_c.c
> > +++ b/hw/riscv/shakti_c.c
> > @@ -110,7 +110,7 @@ static void shakti_c_soc_state_realize(DeviceState *dev,
> > Error **errp)
> >      sysbus_realize(SYS_BUS_DEVICE(&sss->cpus), &error_abort);
> > 
> >      sss->plic = sifive_plic_create(shakti_c_memmap[SHAKTI_C_PLIC].base,
> > -        (char *)SHAKTI_C_PLIC_HART_CONFIG, ms->smp.cpus, 0,
> > +        (char *)SHAKTI_C_PLIC_HART_CONFIG, machine_topo_get_cpus(ms), 0,
> >          SHAKTI_C_PLIC_NUM_SOURCES,
> >          SHAKTI_C_PLIC_NUM_PRIORITIES,
> >          SHAKTI_C_PLIC_PRIORITY_BASE,
> > diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
> > index 3e3f4b0088ca..ca3a7a0877cd 100644
> > --- a/hw/riscv/sifive_e.c
> > +++ b/hw/riscv/sifive_e.c
> > @@ -178,7 +178,8 @@ static void sifive_e_soc_init(Object *obj)
> >      SiFiveESoCState *s = RISCV_E_SOC(obj);
> > 
> >      object_initialize_child(obj, "cpus", &s->cpus, TYPE_RISCV_HART_ARRAY);
> > -    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
> > +    object_property_set_int(OBJECT(&s->cpus), "num-harts",
> > +                            machine_topo_get_cpus(ms),
> >                              &error_abort);
> 
> With this change, we don't need to start a new line for '&error_abort);', just move
> it to previous line.

Yes, this is no more than 80 characters.

> 
> >      object_property_set_int(OBJECT(&s->cpus), "resetvec", 0x1004,
> > &error_abort);
> >      object_initialize_child(obj, "riscv.sifive.e.gpio0", &s->gpio,
> > @@ -191,6 +192,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error
> > **errp)
> >      const MemMapEntry *memmap = sifive_e_memmap;
> >      SiFiveESoCState *s = RISCV_E_SOC(dev);
> >      MemoryRegion *sys_mem = get_system_memory();
> > +    unsigned int cpus = machine_topo_get_cpus(ms);
> > 
> >      object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
> >                              &error_abort);
> > @@ -204,7 +206,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error
> > **errp)
> > 
> >      /* MMIO */
> >      s->plic = sifive_plic_create(memmap[SIFIVE_E_DEV_PLIC].base,
> > -        (char *)SIFIVE_E_PLIC_HART_CONFIG, ms->smp.cpus, 0,
> > +        (char *)SIFIVE_E_PLIC_HART_CONFIG, cpus, 0,
> >          SIFIVE_E_PLIC_NUM_SOURCES,
> >          SIFIVE_E_PLIC_NUM_PRIORITIES,
> >          SIFIVE_E_PLIC_PRIORITY_BASE,
> > @@ -215,10 +217,10 @@ static void sifive_e_soc_realize(DeviceState *dev,
> > Error **errp)
> >          SIFIVE_E_PLIC_CONTEXT_STRIDE,
> >          memmap[SIFIVE_E_DEV_PLIC].size);
> >      riscv_aclint_swi_create(memmap[SIFIVE_E_DEV_CLINT].base,
> > -        0, ms->smp.cpus, false);
> > +        0, cpus, false);
> >      riscv_aclint_mtimer_create(memmap[SIFIVE_E_DEV_CLINT].base +
> >              RISCV_ACLINT_SWI_SIZE,
> > -        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
> > +        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, cpus,
> >          RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
> >          RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, false);
> >      create_unimplemented_device("riscv.sifive.e.aon",
> > diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
> > index d3ab7a9cda5d..c7f969510209 100644
> > --- a/hw/riscv/sifive_u.c
> > +++ b/hw/riscv/sifive_u.c
> > @@ -99,7 +99,7 @@ static void create_fdt(SiFiveUState *s, const
> > MemMapEntry *memmap,
> >      MachineState *ms = MACHINE(s);
> >      uint64_t mem_size = ms->ram_size;
> >      void *fdt;
> > -    int cpu, fdt_size;
> > +    int cpu, fdt_size, num_cpus = machine_topo_get_cpus(ms);
> >      uint32_t *cells;
> >      char *nodename;
> >      uint32_t plic_phandle, prci_phandle, gpio_phandle, phandle = 1;
> > @@ -175,7 +175,7 @@ static void create_fdt(SiFiveUState *s, const
> > MemMapEntry *memmap,
> >      qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
> >      qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
> > 
> > -    for (cpu = ms->smp.cpus - 1; cpu >= 0; cpu--) {
> > +    for (cpu = num_cpus - 1; cpu >= 0; cpu--) {
> >          int cpu_phandle = phandle++;
> >          nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
> >          char *intc = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
> > @@ -207,8 +207,8 @@ static void create_fdt(SiFiveUState *s, const
> > MemMapEntry *memmap,
> >          g_free(nodename);
> >      }
> > 
> > -    cells =  g_new0(uint32_t, ms->smp.cpus * 4);
> > -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> > +    cells =  g_new0(uint32_t, num_cpus * 4);
> > +    for (cpu = 0; cpu < num_cpus; cpu++) {
> >          nodename =
> >              g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
> >          uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename);
> > @@ -227,7 +227,7 @@ static void create_fdt(SiFiveUState *s, const
> > MemMapEntry *memmap,
> >          0x0, memmap[SIFIVE_U_DEV_CLINT].base,
> >          0x0, memmap[SIFIVE_U_DEV_CLINT].size);
> >      qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
> > -        cells, ms->smp.cpus * sizeof(uint32_t) * 4);
> > +        cells, num_cpus * sizeof(uint32_t) * 4);
> >      g_free(cells);
> >      g_free(nodename);
> > 
> > @@ -258,8 +258,8 @@ static void create_fdt(SiFiveUState *s, const
> > MemMapEntry *memmap,
> >      g_free(nodename);
> > 
> >      plic_phandle = phandle++;
> > -    cells =  g_new0(uint32_t, ms->smp.cpus * 4 - 2);
> > -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> > +    cells =  g_new0(uint32_t, machine_topo_get_cpus(ms) * 4 - 2);
> > +    for (cpu = 0; cpu < machine_topo_get_cpus(ms); cpu++) {
> >          nodename =
> >              g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
> >          uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename);
> > @@ -283,7 +283,7 @@ static void create_fdt(SiFiveUState *s, const
> > MemMapEntry *memmap,
> >          (char **)&plic_compat, ARRAY_SIZE(plic_compat));
> >      qemu_fdt_setprop(fdt, nodename, "interrupt-controller", NULL, 0);
> >      qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
> > -        cells, (ms->smp.cpus * 4 - 2) * sizeof(uint32_t));
> > +        cells, (machine_topo_get_cpus(ms) * 4 - 2) * sizeof(uint32_t));
> >      qemu_fdt_setprop_cells(fdt, nodename, "reg",
> >          0x0, memmap[SIFIVE_U_DEV_PLIC].base,
> >          0x0, memmap[SIFIVE_U_DEV_PLIC].size);
> > @@ -797,10 +797,10 @@ static void sifive_u_soc_realize(DeviceState *dev,
> > Error **errp)
> >      MemoryRegion *mask_rom = g_new(MemoryRegion, 1);
> >      MemoryRegion *l2lim_mem = g_new(MemoryRegion, 1);
> >      char *plic_hart_config;
> > -    int i, j;
> > +    int i, j, cpus = machine_topo_get_cpus(ms);
> >      NICInfo *nd = &nd_table[0];
> > 
> > -    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
> > +    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", cpus - 1);
> >      qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
> >      qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type", s->cpu_type);
> >      qdev_prop_set_uint64(DEVICE(&s->u_cpus), "resetvec", 0x1004);
> > @@ -837,11 +837,11 @@ static void sifive_u_soc_realize(DeviceState *dev,
> > Error **errp)
> >                                  l2lim_mem);
> > 
> >      /* create PLIC hart topology configuration string */
> > -    plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
> > +    plic_hart_config = riscv_plic_hart_config_string(cpus);
> > 
> >      /* MMIO */
> >      s->plic = sifive_plic_create(memmap[SIFIVE_U_DEV_PLIC].base,
> > -        plic_hart_config, ms->smp.cpus, 0,
> > +        plic_hart_config, cpus, 0,
> >          SIFIVE_U_PLIC_NUM_SOURCES,
> >          SIFIVE_U_PLIC_NUM_PRIORITIES,
> >          SIFIVE_U_PLIC_PRIORITY_BASE,
> > @@ -857,10 +857,10 @@ static void sifive_u_soc_realize(DeviceState *dev,
> > Error **errp)
> >      sifive_uart_create(system_memory, memmap[SIFIVE_U_DEV_UART1].base,
> >          serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_U_UART1_IRQ));
> >      riscv_aclint_swi_create(memmap[SIFIVE_U_DEV_CLINT].base, 0,
> > -        ms->smp.cpus, false);
> > +        cpus, false);
> >      riscv_aclint_mtimer_create(memmap[SIFIVE_U_DEV_CLINT].base +
> >              RISCV_ACLINT_SWI_SIZE,
> > -        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
> > +        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, cpus,
> >          RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
> >          CLINT_TIMEBASE_FREQ, false);
> > 
> > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> > index b81081c70b1c..4b0a3dab5ec1 100644
> > --- a/hw/riscv/virt.c
> > +++ b/hw/riscv/virt.c
> > @@ -506,16 +506,17 @@ static void create_fdt_imsic(RISCVVirtState *s, const
> > MemMapEntry *memmap,
> >      char *imsic_name;
> >      MachineState *ms = MACHINE(s);
> >      int socket_count = riscv_socket_count(ms);
> > -    uint32_t imsic_max_hart_per_socket, imsic_guest_bits;
> > +    uint32_t imsic_max_hart_per_socket, imsic_guest_bits, cpus;
> >      uint32_t *imsic_cells, *imsic_regs, imsic_addr, imsic_size;
> > 
> > +    cpus = machine_topo_get_cpus(ms);
> >      *msi_m_phandle = (*phandle)++;
> >      *msi_s_phandle = (*phandle)++;
> > -    imsic_cells = g_new0(uint32_t, ms->smp.cpus * 2);
> > +    imsic_cells = g_new0(uint32_t, cpus * 2);
> >      imsic_regs = g_new0(uint32_t, socket_count * 4);
> > 
> >      /* M-level IMSIC node */
> > -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> > +    for (cpu = 0; cpu < cpus; cpu++) {
> >          imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
> >          imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
> >      }
> > @@ -544,7 +545,7 @@ static void create_fdt_imsic(RISCVVirtState *s, const
> > MemMapEntry *memmap,
> >      qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
> >          NULL, 0);
> >      qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
> > -        imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
> > +        imsic_cells, cpus * sizeof(uint32_t) * 2);
> >      qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
> >          socket_count * sizeof(uint32_t) * 4);
> >      qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
> > @@ -562,7 +563,7 @@ static void create_fdt_imsic(RISCVVirtState *s, const
> > MemMapEntry *memmap,
> >      g_free(imsic_name);
> > 
> >      /* S-level IMSIC node */
> > -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> > +    for (cpu = 0; cpu < cpus; cpu++) {
> >          imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
> >          imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_S_EXT);
> >      }
> > @@ -593,7 +594,7 @@ static void create_fdt_imsic(RISCVVirtState *s, const
> > MemMapEntry *memmap,
> >      qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
> >          NULL, 0);
> >      qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
> > -        imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
> > +        imsic_cells, cpus * sizeof(uint32_t) * 2);
> >      qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
> >          socket_count * sizeof(uint32_t) * 4);
> >      qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
> > @@ -732,7 +733,7 @@ static void create_fdt_sockets(RISCVVirtState *s, const
> > MemMapEntry *memmap,
> >      char *clust_name;
> >      int socket, phandle_pos;
> >      MachineState *ms = MACHINE(s);
> > -    uint32_t msi_m_phandle = 0, msi_s_phandle = 0;
> > +    uint32_t msi_m_phandle = 0, msi_s_phandle = 0, cpus;
> >      uint32_t *intc_phandles, xplic_phandles[MAX_NODES];
> >      int socket_count = riscv_socket_count(ms);
> > 
> > @@ -743,9 +744,10 @@ static void create_fdt_sockets(RISCVVirtState *s, const
> > MemMapEntry *memmap,
> >      qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
> >      qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
> > 
> > -    intc_phandles = g_new0(uint32_t, ms->smp.cpus);
> > +    cpus = machine_topo_get_cpus(ms);
> > +    intc_phandles = g_new0(uint32_t, cpus);
> > 
> > -    phandle_pos = ms->smp.cpus;
> > +    phandle_pos = cpus;
> >      for (socket = (socket_count - 1); socket >= 0; socket--) {
> >          phandle_pos -= s->soc[socket].num_harts;
> > 
> > @@ -776,7 +778,7 @@ static void create_fdt_sockets(RISCVVirtState *s, const
> > MemMapEntry *memmap,
> >          *msi_pcie_phandle = msi_s_phandle;
> >      }
> > 
> > -    phandle_pos = ms->smp.cpus;
> > +    phandle_pos = cpus;
> >      for (socket = (socket_count - 1); socket >= 0; socket--) {
> >          phandle_pos -= s->soc[socket].num_harts;
> > 
> > @@ -1113,7 +1115,7 @@ static FWCfgState *create_fw_cfg(const
> > MachineState *ms)
> > 
> >      fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16,
> >                                    &address_space_memory);
> > -    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)ms->smp.cpus);
> > +    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS,
> > (uint16_t)machine_topo_get_cpus(ms));
> > 
> >      return fw_cfg;
> >  }
> > --
> > 2.34.1
>
Palmer Dabbelt March 1, 2023, 11:43 p.m. UTC | #3
On Tue, 14 Feb 2023 18:57:35 PST (-0800), zhao1.liu@linux.intel.com wrote:
> On Tue, Feb 14, 2023 at 10:17:45AM +0800, Mi, Dapeng1 wrote:
>> Date: Tue, 14 Feb 2023 10:17:45 +0800
>> From: "Mi, Dapeng1" <dapeng1.mi@intel.com>
>> Subject: RE: [RFC 22/52] riscv: 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>; Meng, Bin
>> > <bin.meng@windriver.com>; Palmer Dabbelt <palmer@dabbelt.com>; Alistair
>> > Francis <alistair.francis@wdc.com>; Vijai Kumar K <vijai@behindbytes.com>
>> > Subject: [RFC 22/52] riscv: 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.
>> >
>> > In the codes of riscv, it's straightforward to replace topology access
>> > with wrapped generic interfaces.
>> >
>> > Cc: Bin Meng <bin.meng@windriver.com>
>> > Cc: Palmer Dabbelt <palmer@dabbelt.com>
>> > Cc: Alistair Francis <alistair.francis@wdc.com>
>> > CC: Vijai Kumar K <vijai@behindbytes.com>
>> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
>> > ---
>> >  hw/riscv/microchip_pfsoc.c | 11 ++++++-----
>> >  hw/riscv/numa.c            | 21 +++++++++++----------
>> >  hw/riscv/opentitan.c       |  8 ++++----
>> >  hw/riscv/shakti_c.c        |  2 +-
>> >  hw/riscv/sifive_e.c        | 10 ++++++----
>> >  hw/riscv/sifive_u.c        | 28 ++++++++++++++--------------
>> >  hw/riscv/virt.c            | 24 +++++++++++++-----------
>> >  7 files changed, 55 insertions(+), 49 deletions(-)
>> >
>> > diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
>> > index 2b91e49561f1..30295cce17e7 100644
>> > --- a/hw/riscv/microchip_pfsoc.c
>> > +++ b/hw/riscv/microchip_pfsoc.c
>> > @@ -164,7 +164,8 @@ static void microchip_pfsoc_soc_instance_init(Object
>> > *obj)
>> >
>> >      object_initialize_child(OBJECT(&s->u_cluster), "u-cpus", &s->u_cpus,
>> >                              TYPE_RISCV_HART_ARRAY);
>> > -    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
>> > +    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts",
>> > +                         machine_topo_get_cpus(ms) - 1);
>> >      qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
>> >      qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type",
>> >                           TYPE_RISCV_CPU_SIFIVE_U54);
>> > @@ -249,10 +250,10 @@ static void microchip_pfsoc_soc_realize(DeviceState
>> > *dev, Error **errp)
>> >
>> >      /* CLINT */
>> >      riscv_aclint_swi_create(memmap[MICROCHIP_PFSOC_CLINT].base,
>> > -        0, ms->smp.cpus, false);
>> > +        0, machine_topo_get_cpus(ms), false);
>> >      riscv_aclint_mtimer_create(
>> >          memmap[MICROCHIP_PFSOC_CLINT].base + RISCV_ACLINT_SWI_SIZE,
>> > -        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
>> > +        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, machine_topo_get_cpus(ms),
>> >          RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
>> >          CLINT_TIMEBASE_FREQ, false);
>> >
>> > @@ -276,11 +277,11 @@ static void microchip_pfsoc_soc_realize(DeviceState
>> > *dev, Error **errp)
>> >                                  l2lim_mem);
>> >
>> >      /* create PLIC hart topology configuration string */
>> > -    plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
>> > +    plic_hart_config =
>> > riscv_plic_hart_config_string(machine_topo_get_cpus(ms));
>> >
>> >      /* PLIC */
>> >      s->plic = sifive_plic_create(memmap[MICROCHIP_PFSOC_PLIC].base,
>> > -        plic_hart_config, ms->smp.cpus, 0,
>> > +        plic_hart_config, machine_topo_get_cpus(ms), 0,
>> >          MICROCHIP_PFSOC_PLIC_NUM_SOURCES,
>> >          MICROCHIP_PFSOC_PLIC_NUM_PRIORITIES,
>> >          MICROCHIP_PFSOC_PLIC_PRIORITY_BASE,
>> > diff --git a/hw/riscv/numa.c b/hw/riscv/numa.c
>> > index 472010256183..1fabdc42e767 100644
>> > --- a/hw/riscv/numa.c
>> > +++ b/hw/riscv/numa.c
>> > @@ -37,13 +37,14 @@ int riscv_socket_count(const MachineState *ms)
>> >
>> >  int riscv_socket_first_hartid(const MachineState *ms, int socket_id)
>> >  {
>> > -    int i, first_hartid = ms->smp.cpus;
>> > +    int i, first_hartid, cpus = machine_topo_get_cpus(ms);
>> >
>> > +    first_hartid = cpus;
>> >      if (!numa_enabled(ms)) {
>> >          return (!socket_id) ? 0 : -1;
>> >      }
>> >
>> > -    for (i = 0; i < ms->smp.cpus; i++) {
>> > +    for (i = 0; i < cpus; i++) {
>> >          if (ms->possible_cpus->cpus[i].props.node_id != socket_id) {
>> >              continue;
>> >          }
>> > @@ -52,18 +53,18 @@ int riscv_socket_first_hartid(const MachineState *ms,
>> > int socket_id)
>> >          }
>> >      }
>> >
>> > -    return (first_hartid < ms->smp.cpus) ? first_hartid : -1;
>> > +    return (first_hartid < cpus) ? first_hartid : -1;
>> >  }
>> >
>> >  int riscv_socket_last_hartid(const MachineState *ms, int socket_id)
>> >  {
>> > -    int i, last_hartid = -1;
>> > +    int i, last_hartid = -1, cpus = machine_topo_get_cpus(ms);
>> >
>> >      if (!numa_enabled(ms)) {
>> > -        return (!socket_id) ? ms->smp.cpus - 1 : -1;
>> > +        return (!socket_id) ? cpus - 1 : -1;
>> >      }
>> >
>> > -    for (i = 0; i < ms->smp.cpus; i++) {
>> > +    for (i = 0; i < cpus; i++) {
>> >          if (ms->possible_cpus->cpus[i].props.node_id != socket_id) {
>> >              continue;
>> >          }
>> > @@ -72,7 +73,7 @@ int riscv_socket_last_hartid(const MachineState *ms, int
>> > socket_id)
>> >          }
>> >      }
>> >
>> > -    return (last_hartid < ms->smp.cpus) ? last_hartid : -1;
>> > +    return (last_hartid < cpus) ? last_hartid : -1;
>> >  }
>> >
>> >  int riscv_socket_hart_count(const MachineState *ms, int socket_id)
>> > @@ -80,7 +81,7 @@ int riscv_socket_hart_count(const MachineState *ms, int
>> > socket_id)
>> >      int first_hartid, last_hartid;
>> >
>> >      if (!numa_enabled(ms)) {
>> > -        return (!socket_id) ? ms->smp.cpus : -1;
>> > +        return (!socket_id) ? machine_topo_get_cpus(ms) : -1;
>> >      }
>> >
>> >      first_hartid = riscv_socket_first_hartid(ms, socket_id);
>> > @@ -208,7 +209,7 @@ int64_t riscv_numa_get_default_cpu_node_id(const
>> > MachineState *ms, int idx)
>> >      int64_t nidx = 0;
>> >
>> >      if (ms->numa_state->num_nodes) {
>> > -        nidx = idx / (ms->smp.cpus / ms->numa_state->num_nodes);
>> > +        nidx = idx / (machine_topo_get_cpus(ms) / ms->numa_state->num_nodes);
>> >          if (ms->numa_state->num_nodes <= nidx) {
>> >              nidx = ms->numa_state->num_nodes - 1;
>> >          }
>> > @@ -220,7 +221,7 @@ int64_t riscv_numa_get_default_cpu_node_id(const
>> > MachineState *ms, int idx)
>> >  const CPUArchIdList *riscv_numa_possible_cpu_arch_ids(MachineState *ms)
>> >  {
>> >      int n;
>> > -    unsigned int max_cpus = ms->smp.max_cpus;
>> > +    unsigned int max_cpus = machine_topo_get_max_cpus(ms);
>> >
>> >      if (ms->possible_cpus) {
>> >          assert(ms->possible_cpus->len == max_cpus);
>> > diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
>> > index 353f030d80c1..fb59c43dcc08 100644
>> > --- a/hw/riscv/opentitan.c
>> > +++ b/hw/riscv/opentitan.c
>> > @@ -143,11 +143,11 @@ static void lowrisc_ibex_soc_realize(DeviceState
>> > *dev_soc, Error **errp)
>> >      MachineState *ms = MACHINE(qdev_get_machine());
>> >      LowRISCIbexSoCState *s = RISCV_IBEX_SOC(dev_soc);
>> >      MemoryRegion *sys_mem = get_system_memory();
>> > -    int i;
>> > +    int i, cpus = machine_topo_get_cpus(ms);
>> >
>> >      object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
>> >                              &error_abort);
>> > -    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
>> > +    object_property_set_int(OBJECT(&s->cpus), "num-harts", cpus,
>> >                              &error_abort);
>> >      object_property_set_int(OBJECT(&s->cpus), "resetvec", s->resetvec,
>> >                              &error_abort);
>> > @@ -186,10 +186,10 @@ static void lowrisc_ibex_soc_realize(DeviceState
>> > *dev_soc, Error **errp)
>> >      }
>> >      sysbus_mmio_map(SYS_BUS_DEVICE(&s->plic), 0,
>> > memmap[IBEX_DEV_PLIC].base);
>> >
>> > -    for (i = 0; i < ms->smp.cpus; i++) {
>> > +    for (i = 0; i < cpus; i++) {
>> >          CPUState *cpu = qemu_get_cpu(i);
>> >
>> > -        qdev_connect_gpio_out(DEVICE(&s->plic), ms->smp.cpus + i,
>> > +        qdev_connect_gpio_out(DEVICE(&s->plic), cpus + i,
>> >                                qdev_get_gpio_in(DEVICE(cpu), IRQ_M_EXT));
>> >      }
>> >
>> > diff --git a/hw/riscv/shakti_c.c b/hw/riscv/shakti_c.c
>> > index e43cc9445cb1..34499510e2f0 100644
>> > --- a/hw/riscv/shakti_c.c
>> > +++ b/hw/riscv/shakti_c.c
>> > @@ -110,7 +110,7 @@ static void shakti_c_soc_state_realize(DeviceState *dev,
>> > Error **errp)
>> >      sysbus_realize(SYS_BUS_DEVICE(&sss->cpus), &error_abort);
>> >
>> >      sss->plic = sifive_plic_create(shakti_c_memmap[SHAKTI_C_PLIC].base,
>> > -        (char *)SHAKTI_C_PLIC_HART_CONFIG, ms->smp.cpus, 0,
>> > +        (char *)SHAKTI_C_PLIC_HART_CONFIG, machine_topo_get_cpus(ms), 0,
>> >          SHAKTI_C_PLIC_NUM_SOURCES,
>> >          SHAKTI_C_PLIC_NUM_PRIORITIES,
>> >          SHAKTI_C_PLIC_PRIORITY_BASE,
>> > diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
>> > index 3e3f4b0088ca..ca3a7a0877cd 100644
>> > --- a/hw/riscv/sifive_e.c
>> > +++ b/hw/riscv/sifive_e.c
>> > @@ -178,7 +178,8 @@ static void sifive_e_soc_init(Object *obj)
>> >      SiFiveESoCState *s = RISCV_E_SOC(obj);
>> >
>> >      object_initialize_child(obj, "cpus", &s->cpus, TYPE_RISCV_HART_ARRAY);
>> > -    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
>> > +    object_property_set_int(OBJECT(&s->cpus), "num-harts",
>> > +                            machine_topo_get_cpus(ms),
>> >                              &error_abort);
>>
>> With this change, we don't need to start a new line for '&error_abort);', just move
>> it to previous line.
>
> Yes, this is no more than 80 characters.

With that fixed

Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com>

Thanks!

>> >      object_property_set_int(OBJECT(&s->cpus), "resetvec", 0x1004,
>> > &error_abort);
>> >      object_initialize_child(obj, "riscv.sifive.e.gpio0", &s->gpio,
>> > @@ -191,6 +192,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error
>> > **errp)
>> >      const MemMapEntry *memmap = sifive_e_memmap;
>> >      SiFiveESoCState *s = RISCV_E_SOC(dev);
>> >      MemoryRegion *sys_mem = get_system_memory();
>> > +    unsigned int cpus = machine_topo_get_cpus(ms);
>> >
>> >      object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
>> >                              &error_abort);
>> > @@ -204,7 +206,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error
>> > **errp)
>> >
>> >      /* MMIO */
>> >      s->plic = sifive_plic_create(memmap[SIFIVE_E_DEV_PLIC].base,
>> > -        (char *)SIFIVE_E_PLIC_HART_CONFIG, ms->smp.cpus, 0,
>> > +        (char *)SIFIVE_E_PLIC_HART_CONFIG, cpus, 0,
>> >          SIFIVE_E_PLIC_NUM_SOURCES,
>> >          SIFIVE_E_PLIC_NUM_PRIORITIES,
>> >          SIFIVE_E_PLIC_PRIORITY_BASE,
>> > @@ -215,10 +217,10 @@ static void sifive_e_soc_realize(DeviceState *dev,
>> > Error **errp)
>> >          SIFIVE_E_PLIC_CONTEXT_STRIDE,
>> >          memmap[SIFIVE_E_DEV_PLIC].size);
>> >      riscv_aclint_swi_create(memmap[SIFIVE_E_DEV_CLINT].base,
>> > -        0, ms->smp.cpus, false);
>> > +        0, cpus, false);
>> >      riscv_aclint_mtimer_create(memmap[SIFIVE_E_DEV_CLINT].base +
>> >              RISCV_ACLINT_SWI_SIZE,
>> > -        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
>> > +        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, cpus,
>> >          RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
>> >          RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, false);
>> >      create_unimplemented_device("riscv.sifive.e.aon",
>> > diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
>> > index d3ab7a9cda5d..c7f969510209 100644
>> > --- a/hw/riscv/sifive_u.c
>> > +++ b/hw/riscv/sifive_u.c
>> > @@ -99,7 +99,7 @@ static void create_fdt(SiFiveUState *s, const
>> > MemMapEntry *memmap,
>> >      MachineState *ms = MACHINE(s);
>> >      uint64_t mem_size = ms->ram_size;
>> >      void *fdt;
>> > -    int cpu, fdt_size;
>> > +    int cpu, fdt_size, num_cpus = machine_topo_get_cpus(ms);
>> >      uint32_t *cells;
>> >      char *nodename;
>> >      uint32_t plic_phandle, prci_phandle, gpio_phandle, phandle = 1;
>> > @@ -175,7 +175,7 @@ static void create_fdt(SiFiveUState *s, const
>> > MemMapEntry *memmap,
>> >      qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
>> >      qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
>> >
>> > -    for (cpu = ms->smp.cpus - 1; cpu >= 0; cpu--) {
>> > +    for (cpu = num_cpus - 1; cpu >= 0; cpu--) {
>> >          int cpu_phandle = phandle++;
>> >          nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
>> >          char *intc = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
>> > @@ -207,8 +207,8 @@ static void create_fdt(SiFiveUState *s, const
>> > MemMapEntry *memmap,
>> >          g_free(nodename);
>> >      }
>> >
>> > -    cells =  g_new0(uint32_t, ms->smp.cpus * 4);
>> > -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
>> > +    cells =  g_new0(uint32_t, num_cpus * 4);
>> > +    for (cpu = 0; cpu < num_cpus; cpu++) {
>> >          nodename =
>> >              g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
>> >          uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename);
>> > @@ -227,7 +227,7 @@ static void create_fdt(SiFiveUState *s, const
>> > MemMapEntry *memmap,
>> >          0x0, memmap[SIFIVE_U_DEV_CLINT].base,
>> >          0x0, memmap[SIFIVE_U_DEV_CLINT].size);
>> >      qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
>> > -        cells, ms->smp.cpus * sizeof(uint32_t) * 4);
>> > +        cells, num_cpus * sizeof(uint32_t) * 4);
>> >      g_free(cells);
>> >      g_free(nodename);
>> >
>> > @@ -258,8 +258,8 @@ static void create_fdt(SiFiveUState *s, const
>> > MemMapEntry *memmap,
>> >      g_free(nodename);
>> >
>> >      plic_phandle = phandle++;
>> > -    cells =  g_new0(uint32_t, ms->smp.cpus * 4 - 2);
>> > -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
>> > +    cells =  g_new0(uint32_t, machine_topo_get_cpus(ms) * 4 - 2);
>> > +    for (cpu = 0; cpu < machine_topo_get_cpus(ms); cpu++) {
>> >          nodename =
>> >              g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
>> >          uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename);
>> > @@ -283,7 +283,7 @@ static void create_fdt(SiFiveUState *s, const
>> > MemMapEntry *memmap,
>> >          (char **)&plic_compat, ARRAY_SIZE(plic_compat));
>> >      qemu_fdt_setprop(fdt, nodename, "interrupt-controller", NULL, 0);
>> >      qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
>> > -        cells, (ms->smp.cpus * 4 - 2) * sizeof(uint32_t));
>> > +        cells, (machine_topo_get_cpus(ms) * 4 - 2) * sizeof(uint32_t));
>> >      qemu_fdt_setprop_cells(fdt, nodename, "reg",
>> >          0x0, memmap[SIFIVE_U_DEV_PLIC].base,
>> >          0x0, memmap[SIFIVE_U_DEV_PLIC].size);
>> > @@ -797,10 +797,10 @@ static void sifive_u_soc_realize(DeviceState *dev,
>> > Error **errp)
>> >      MemoryRegion *mask_rom = g_new(MemoryRegion, 1);
>> >      MemoryRegion *l2lim_mem = g_new(MemoryRegion, 1);
>> >      char *plic_hart_config;
>> > -    int i, j;
>> > +    int i, j, cpus = machine_topo_get_cpus(ms);
>> >      NICInfo *nd = &nd_table[0];
>> >
>> > -    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
>> > +    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", cpus - 1);
>> >      qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
>> >      qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type", s->cpu_type);
>> >      qdev_prop_set_uint64(DEVICE(&s->u_cpus), "resetvec", 0x1004);
>> > @@ -837,11 +837,11 @@ static void sifive_u_soc_realize(DeviceState *dev,
>> > Error **errp)
>> >                                  l2lim_mem);
>> >
>> >      /* create PLIC hart topology configuration string */
>> > -    plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
>> > +    plic_hart_config = riscv_plic_hart_config_string(cpus);
>> >
>> >      /* MMIO */
>> >      s->plic = sifive_plic_create(memmap[SIFIVE_U_DEV_PLIC].base,
>> > -        plic_hart_config, ms->smp.cpus, 0,
>> > +        plic_hart_config, cpus, 0,
>> >          SIFIVE_U_PLIC_NUM_SOURCES,
>> >          SIFIVE_U_PLIC_NUM_PRIORITIES,
>> >          SIFIVE_U_PLIC_PRIORITY_BASE,
>> > @@ -857,10 +857,10 @@ static void sifive_u_soc_realize(DeviceState *dev,
>> > Error **errp)
>> >      sifive_uart_create(system_memory, memmap[SIFIVE_U_DEV_UART1].base,
>> >          serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_U_UART1_IRQ));
>> >      riscv_aclint_swi_create(memmap[SIFIVE_U_DEV_CLINT].base, 0,
>> > -        ms->smp.cpus, false);
>> > +        cpus, false);
>> >      riscv_aclint_mtimer_create(memmap[SIFIVE_U_DEV_CLINT].base +
>> >              RISCV_ACLINT_SWI_SIZE,
>> > -        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
>> > +        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, cpus,
>> >          RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
>> >          CLINT_TIMEBASE_FREQ, false);
>> >
>> > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
>> > index b81081c70b1c..4b0a3dab5ec1 100644
>> > --- a/hw/riscv/virt.c
>> > +++ b/hw/riscv/virt.c
>> > @@ -506,16 +506,17 @@ static void create_fdt_imsic(RISCVVirtState *s, const
>> > MemMapEntry *memmap,
>> >      char *imsic_name;
>> >      MachineState *ms = MACHINE(s);
>> >      int socket_count = riscv_socket_count(ms);
>> > -    uint32_t imsic_max_hart_per_socket, imsic_guest_bits;
>> > +    uint32_t imsic_max_hart_per_socket, imsic_guest_bits, cpus;
>> >      uint32_t *imsic_cells, *imsic_regs, imsic_addr, imsic_size;
>> >
>> > +    cpus = machine_topo_get_cpus(ms);
>> >      *msi_m_phandle = (*phandle)++;
>> >      *msi_s_phandle = (*phandle)++;
>> > -    imsic_cells = g_new0(uint32_t, ms->smp.cpus * 2);
>> > +    imsic_cells = g_new0(uint32_t, cpus * 2);
>> >      imsic_regs = g_new0(uint32_t, socket_count * 4);
>> >
>> >      /* M-level IMSIC node */
>> > -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
>> > +    for (cpu = 0; cpu < cpus; cpu++) {
>> >          imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
>> >          imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
>> >      }
>> > @@ -544,7 +545,7 @@ static void create_fdt_imsic(RISCVVirtState *s, const
>> > MemMapEntry *memmap,
>> >      qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
>> >          NULL, 0);
>> >      qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
>> > -        imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
>> > +        imsic_cells, cpus * sizeof(uint32_t) * 2);
>> >      qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
>> >          socket_count * sizeof(uint32_t) * 4);
>> >      qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
>> > @@ -562,7 +563,7 @@ static void create_fdt_imsic(RISCVVirtState *s, const
>> > MemMapEntry *memmap,
>> >      g_free(imsic_name);
>> >
>> >      /* S-level IMSIC node */
>> > -    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
>> > +    for (cpu = 0; cpu < cpus; cpu++) {
>> >          imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
>> >          imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_S_EXT);
>> >      }
>> > @@ -593,7 +594,7 @@ static void create_fdt_imsic(RISCVVirtState *s, const
>> > MemMapEntry *memmap,
>> >      qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
>> >          NULL, 0);
>> >      qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
>> > -        imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
>> > +        imsic_cells, cpus * sizeof(uint32_t) * 2);
>> >      qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
>> >          socket_count * sizeof(uint32_t) * 4);
>> >      qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
>> > @@ -732,7 +733,7 @@ static void create_fdt_sockets(RISCVVirtState *s, const
>> > MemMapEntry *memmap,
>> >      char *clust_name;
>> >      int socket, phandle_pos;
>> >      MachineState *ms = MACHINE(s);
>> > -    uint32_t msi_m_phandle = 0, msi_s_phandle = 0;
>> > +    uint32_t msi_m_phandle = 0, msi_s_phandle = 0, cpus;
>> >      uint32_t *intc_phandles, xplic_phandles[MAX_NODES];
>> >      int socket_count = riscv_socket_count(ms);
>> >
>> > @@ -743,9 +744,10 @@ static void create_fdt_sockets(RISCVVirtState *s, const
>> > MemMapEntry *memmap,
>> >      qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
>> >      qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
>> >
>> > -    intc_phandles = g_new0(uint32_t, ms->smp.cpus);
>> > +    cpus = machine_topo_get_cpus(ms);
>> > +    intc_phandles = g_new0(uint32_t, cpus);
>> >
>> > -    phandle_pos = ms->smp.cpus;
>> > +    phandle_pos = cpus;
>> >      for (socket = (socket_count - 1); socket >= 0; socket--) {
>> >          phandle_pos -= s->soc[socket].num_harts;
>> >
>> > @@ -776,7 +778,7 @@ static void create_fdt_sockets(RISCVVirtState *s, const
>> > MemMapEntry *memmap,
>> >          *msi_pcie_phandle = msi_s_phandle;
>> >      }
>> >
>> > -    phandle_pos = ms->smp.cpus;
>> > +    phandle_pos = cpus;
>> >      for (socket = (socket_count - 1); socket >= 0; socket--) {
>> >          phandle_pos -= s->soc[socket].num_harts;
>> >
>> > @@ -1113,7 +1115,7 @@ static FWCfgState *create_fw_cfg(const
>> > MachineState *ms)
>> >
>> >      fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16,
>> >                                    &address_space_memory);
>> > -    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)ms->smp.cpus);
>> > +    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS,
>> > (uint16_t)machine_topo_get_cpus(ms));
>> >
>> >      return fw_cfg;
>> >  }
>> > --
>> > 2.34.1
>>
diff mbox series

Patch

diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 2b91e49561f1..30295cce17e7 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -164,7 +164,8 @@  static void microchip_pfsoc_soc_instance_init(Object *obj)
 
     object_initialize_child(OBJECT(&s->u_cluster), "u-cpus", &s->u_cpus,
                             TYPE_RISCV_HART_ARRAY);
-    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
+    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts",
+                         machine_topo_get_cpus(ms) - 1);
     qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
     qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type",
                          TYPE_RISCV_CPU_SIFIVE_U54);
@@ -249,10 +250,10 @@  static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
 
     /* CLINT */
     riscv_aclint_swi_create(memmap[MICROCHIP_PFSOC_CLINT].base,
-        0, ms->smp.cpus, false);
+        0, machine_topo_get_cpus(ms), false);
     riscv_aclint_mtimer_create(
         memmap[MICROCHIP_PFSOC_CLINT].base + RISCV_ACLINT_SWI_SIZE,
-        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
+        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, machine_topo_get_cpus(ms),
         RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
         CLINT_TIMEBASE_FREQ, false);
 
@@ -276,11 +277,11 @@  static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
                                 l2lim_mem);
 
     /* create PLIC hart topology configuration string */
-    plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
+    plic_hart_config = riscv_plic_hart_config_string(machine_topo_get_cpus(ms));
 
     /* PLIC */
     s->plic = sifive_plic_create(memmap[MICROCHIP_PFSOC_PLIC].base,
-        plic_hart_config, ms->smp.cpus, 0,
+        plic_hart_config, machine_topo_get_cpus(ms), 0,
         MICROCHIP_PFSOC_PLIC_NUM_SOURCES,
         MICROCHIP_PFSOC_PLIC_NUM_PRIORITIES,
         MICROCHIP_PFSOC_PLIC_PRIORITY_BASE,
diff --git a/hw/riscv/numa.c b/hw/riscv/numa.c
index 472010256183..1fabdc42e767 100644
--- a/hw/riscv/numa.c
+++ b/hw/riscv/numa.c
@@ -37,13 +37,14 @@  int riscv_socket_count(const MachineState *ms)
 
 int riscv_socket_first_hartid(const MachineState *ms, int socket_id)
 {
-    int i, first_hartid = ms->smp.cpus;
+    int i, first_hartid, cpus = machine_topo_get_cpus(ms);
 
+    first_hartid = cpus;
     if (!numa_enabled(ms)) {
         return (!socket_id) ? 0 : -1;
     }
 
-    for (i = 0; i < ms->smp.cpus; i++) {
+    for (i = 0; i < cpus; i++) {
         if (ms->possible_cpus->cpus[i].props.node_id != socket_id) {
             continue;
         }
@@ -52,18 +53,18 @@  int riscv_socket_first_hartid(const MachineState *ms, int socket_id)
         }
     }
 
-    return (first_hartid < ms->smp.cpus) ? first_hartid : -1;
+    return (first_hartid < cpus) ? first_hartid : -1;
 }
 
 int riscv_socket_last_hartid(const MachineState *ms, int socket_id)
 {
-    int i, last_hartid = -1;
+    int i, last_hartid = -1, cpus = machine_topo_get_cpus(ms);
 
     if (!numa_enabled(ms)) {
-        return (!socket_id) ? ms->smp.cpus - 1 : -1;
+        return (!socket_id) ? cpus - 1 : -1;
     }
 
-    for (i = 0; i < ms->smp.cpus; i++) {
+    for (i = 0; i < cpus; i++) {
         if (ms->possible_cpus->cpus[i].props.node_id != socket_id) {
             continue;
         }
@@ -72,7 +73,7 @@  int riscv_socket_last_hartid(const MachineState *ms, int socket_id)
         }
     }
 
-    return (last_hartid < ms->smp.cpus) ? last_hartid : -1;
+    return (last_hartid < cpus) ? last_hartid : -1;
 }
 
 int riscv_socket_hart_count(const MachineState *ms, int socket_id)
@@ -80,7 +81,7 @@  int riscv_socket_hart_count(const MachineState *ms, int socket_id)
     int first_hartid, last_hartid;
 
     if (!numa_enabled(ms)) {
-        return (!socket_id) ? ms->smp.cpus : -1;
+        return (!socket_id) ? machine_topo_get_cpus(ms) : -1;
     }
 
     first_hartid = riscv_socket_first_hartid(ms, socket_id);
@@ -208,7 +209,7 @@  int64_t riscv_numa_get_default_cpu_node_id(const MachineState *ms, int idx)
     int64_t nidx = 0;
 
     if (ms->numa_state->num_nodes) {
-        nidx = idx / (ms->smp.cpus / ms->numa_state->num_nodes);
+        nidx = idx / (machine_topo_get_cpus(ms) / ms->numa_state->num_nodes);
         if (ms->numa_state->num_nodes <= nidx) {
             nidx = ms->numa_state->num_nodes - 1;
         }
@@ -220,7 +221,7 @@  int64_t riscv_numa_get_default_cpu_node_id(const MachineState *ms, int idx)
 const CPUArchIdList *riscv_numa_possible_cpu_arch_ids(MachineState *ms)
 {
     int n;
-    unsigned int max_cpus = ms->smp.max_cpus;
+    unsigned int max_cpus = machine_topo_get_max_cpus(ms);
 
     if (ms->possible_cpus) {
         assert(ms->possible_cpus->len == max_cpus);
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
index 353f030d80c1..fb59c43dcc08 100644
--- a/hw/riscv/opentitan.c
+++ b/hw/riscv/opentitan.c
@@ -143,11 +143,11 @@  static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
     MachineState *ms = MACHINE(qdev_get_machine());
     LowRISCIbexSoCState *s = RISCV_IBEX_SOC(dev_soc);
     MemoryRegion *sys_mem = get_system_memory();
-    int i;
+    int i, cpus = machine_topo_get_cpus(ms);
 
     object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
+    object_property_set_int(OBJECT(&s->cpus), "num-harts", cpus,
                             &error_abort);
     object_property_set_int(OBJECT(&s->cpus), "resetvec", s->resetvec,
                             &error_abort);
@@ -186,10 +186,10 @@  static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->plic), 0, memmap[IBEX_DEV_PLIC].base);
 
-    for (i = 0; i < ms->smp.cpus; i++) {
+    for (i = 0; i < cpus; i++) {
         CPUState *cpu = qemu_get_cpu(i);
 
-        qdev_connect_gpio_out(DEVICE(&s->plic), ms->smp.cpus + i,
+        qdev_connect_gpio_out(DEVICE(&s->plic), cpus + i,
                               qdev_get_gpio_in(DEVICE(cpu), IRQ_M_EXT));
     }
 
diff --git a/hw/riscv/shakti_c.c b/hw/riscv/shakti_c.c
index e43cc9445cb1..34499510e2f0 100644
--- a/hw/riscv/shakti_c.c
+++ b/hw/riscv/shakti_c.c
@@ -110,7 +110,7 @@  static void shakti_c_soc_state_realize(DeviceState *dev, Error **errp)
     sysbus_realize(SYS_BUS_DEVICE(&sss->cpus), &error_abort);
 
     sss->plic = sifive_plic_create(shakti_c_memmap[SHAKTI_C_PLIC].base,
-        (char *)SHAKTI_C_PLIC_HART_CONFIG, ms->smp.cpus, 0,
+        (char *)SHAKTI_C_PLIC_HART_CONFIG, machine_topo_get_cpus(ms), 0,
         SHAKTI_C_PLIC_NUM_SOURCES,
         SHAKTI_C_PLIC_NUM_PRIORITIES,
         SHAKTI_C_PLIC_PRIORITY_BASE,
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index 3e3f4b0088ca..ca3a7a0877cd 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -178,7 +178,8 @@  static void sifive_e_soc_init(Object *obj)
     SiFiveESoCState *s = RISCV_E_SOC(obj);
 
     object_initialize_child(obj, "cpus", &s->cpus, TYPE_RISCV_HART_ARRAY);
-    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
+    object_property_set_int(OBJECT(&s->cpus), "num-harts",
+                            machine_topo_get_cpus(ms),
                             &error_abort);
     object_property_set_int(OBJECT(&s->cpus), "resetvec", 0x1004, &error_abort);
     object_initialize_child(obj, "riscv.sifive.e.gpio0", &s->gpio,
@@ -191,6 +192,7 @@  static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
     const MemMapEntry *memmap = sifive_e_memmap;
     SiFiveESoCState *s = RISCV_E_SOC(dev);
     MemoryRegion *sys_mem = get_system_memory();
+    unsigned int cpus = machine_topo_get_cpus(ms);
 
     object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
                             &error_abort);
@@ -204,7 +206,7 @@  static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
 
     /* MMIO */
     s->plic = sifive_plic_create(memmap[SIFIVE_E_DEV_PLIC].base,
-        (char *)SIFIVE_E_PLIC_HART_CONFIG, ms->smp.cpus, 0,
+        (char *)SIFIVE_E_PLIC_HART_CONFIG, cpus, 0,
         SIFIVE_E_PLIC_NUM_SOURCES,
         SIFIVE_E_PLIC_NUM_PRIORITIES,
         SIFIVE_E_PLIC_PRIORITY_BASE,
@@ -215,10 +217,10 @@  static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
         SIFIVE_E_PLIC_CONTEXT_STRIDE,
         memmap[SIFIVE_E_DEV_PLIC].size);
     riscv_aclint_swi_create(memmap[SIFIVE_E_DEV_CLINT].base,
-        0, ms->smp.cpus, false);
+        0, cpus, false);
     riscv_aclint_mtimer_create(memmap[SIFIVE_E_DEV_CLINT].base +
             RISCV_ACLINT_SWI_SIZE,
-        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
+        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, cpus,
         RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
         RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, false);
     create_unimplemented_device("riscv.sifive.e.aon",
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index d3ab7a9cda5d..c7f969510209 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -99,7 +99,7 @@  static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
     MachineState *ms = MACHINE(s);
     uint64_t mem_size = ms->ram_size;
     void *fdt;
-    int cpu, fdt_size;
+    int cpu, fdt_size, num_cpus = machine_topo_get_cpus(ms);
     uint32_t *cells;
     char *nodename;
     uint32_t plic_phandle, prci_phandle, gpio_phandle, phandle = 1;
@@ -175,7 +175,7 @@  static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
     qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
     qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
 
-    for (cpu = ms->smp.cpus - 1; cpu >= 0; cpu--) {
+    for (cpu = num_cpus - 1; cpu >= 0; cpu--) {
         int cpu_phandle = phandle++;
         nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
         char *intc = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
@@ -207,8 +207,8 @@  static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
         g_free(nodename);
     }
 
-    cells =  g_new0(uint32_t, ms->smp.cpus * 4);
-    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
+    cells =  g_new0(uint32_t, num_cpus * 4);
+    for (cpu = 0; cpu < num_cpus; cpu++) {
         nodename =
             g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
         uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename);
@@ -227,7 +227,7 @@  static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
         0x0, memmap[SIFIVE_U_DEV_CLINT].base,
         0x0, memmap[SIFIVE_U_DEV_CLINT].size);
     qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
-        cells, ms->smp.cpus * sizeof(uint32_t) * 4);
+        cells, num_cpus * sizeof(uint32_t) * 4);
     g_free(cells);
     g_free(nodename);
 
@@ -258,8 +258,8 @@  static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
     g_free(nodename);
 
     plic_phandle = phandle++;
-    cells =  g_new0(uint32_t, ms->smp.cpus * 4 - 2);
-    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
+    cells =  g_new0(uint32_t, machine_topo_get_cpus(ms) * 4 - 2);
+    for (cpu = 0; cpu < machine_topo_get_cpus(ms); cpu++) {
         nodename =
             g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
         uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename);
@@ -283,7 +283,7 @@  static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
         (char **)&plic_compat, ARRAY_SIZE(plic_compat));
     qemu_fdt_setprop(fdt, nodename, "interrupt-controller", NULL, 0);
     qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
-        cells, (ms->smp.cpus * 4 - 2) * sizeof(uint32_t));
+        cells, (machine_topo_get_cpus(ms) * 4 - 2) * sizeof(uint32_t));
     qemu_fdt_setprop_cells(fdt, nodename, "reg",
         0x0, memmap[SIFIVE_U_DEV_PLIC].base,
         0x0, memmap[SIFIVE_U_DEV_PLIC].size);
@@ -797,10 +797,10 @@  static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
     MemoryRegion *mask_rom = g_new(MemoryRegion, 1);
     MemoryRegion *l2lim_mem = g_new(MemoryRegion, 1);
     char *plic_hart_config;
-    int i, j;
+    int i, j, cpus = machine_topo_get_cpus(ms);
     NICInfo *nd = &nd_table[0];
 
-    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
+    qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", cpus - 1);
     qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
     qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type", s->cpu_type);
     qdev_prop_set_uint64(DEVICE(&s->u_cpus), "resetvec", 0x1004);
@@ -837,11 +837,11 @@  static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
                                 l2lim_mem);
 
     /* create PLIC hart topology configuration string */
-    plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
+    plic_hart_config = riscv_plic_hart_config_string(cpus);
 
     /* MMIO */
     s->plic = sifive_plic_create(memmap[SIFIVE_U_DEV_PLIC].base,
-        plic_hart_config, ms->smp.cpus, 0,
+        plic_hart_config, cpus, 0,
         SIFIVE_U_PLIC_NUM_SOURCES,
         SIFIVE_U_PLIC_NUM_PRIORITIES,
         SIFIVE_U_PLIC_PRIORITY_BASE,
@@ -857,10 +857,10 @@  static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
     sifive_uart_create(system_memory, memmap[SIFIVE_U_DEV_UART1].base,
         serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_U_UART1_IRQ));
     riscv_aclint_swi_create(memmap[SIFIVE_U_DEV_CLINT].base, 0,
-        ms->smp.cpus, false);
+        cpus, false);
     riscv_aclint_mtimer_create(memmap[SIFIVE_U_DEV_CLINT].base +
             RISCV_ACLINT_SWI_SIZE,
-        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
+        RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, cpus,
         RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
         CLINT_TIMEBASE_FREQ, false);
 
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index b81081c70b1c..4b0a3dab5ec1 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -506,16 +506,17 @@  static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
     char *imsic_name;
     MachineState *ms = MACHINE(s);
     int socket_count = riscv_socket_count(ms);
-    uint32_t imsic_max_hart_per_socket, imsic_guest_bits;
+    uint32_t imsic_max_hart_per_socket, imsic_guest_bits, cpus;
     uint32_t *imsic_cells, *imsic_regs, imsic_addr, imsic_size;
 
+    cpus = machine_topo_get_cpus(ms);
     *msi_m_phandle = (*phandle)++;
     *msi_s_phandle = (*phandle)++;
-    imsic_cells = g_new0(uint32_t, ms->smp.cpus * 2);
+    imsic_cells = g_new0(uint32_t, cpus * 2);
     imsic_regs = g_new0(uint32_t, socket_count * 4);
 
     /* M-level IMSIC node */
-    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
+    for (cpu = 0; cpu < cpus; cpu++) {
         imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
         imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
     }
@@ -544,7 +545,7 @@  static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
     qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
         NULL, 0);
     qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
-        imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
+        imsic_cells, cpus * sizeof(uint32_t) * 2);
     qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
         socket_count * sizeof(uint32_t) * 4);
     qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
@@ -562,7 +563,7 @@  static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
     g_free(imsic_name);
 
     /* S-level IMSIC node */
-    for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
+    for (cpu = 0; cpu < cpus; cpu++) {
         imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
         imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_S_EXT);
     }
@@ -593,7 +594,7 @@  static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
     qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
         NULL, 0);
     qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
-        imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
+        imsic_cells, cpus * sizeof(uint32_t) * 2);
     qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
         socket_count * sizeof(uint32_t) * 4);
     qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
@@ -732,7 +733,7 @@  static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap,
     char *clust_name;
     int socket, phandle_pos;
     MachineState *ms = MACHINE(s);
-    uint32_t msi_m_phandle = 0, msi_s_phandle = 0;
+    uint32_t msi_m_phandle = 0, msi_s_phandle = 0, cpus;
     uint32_t *intc_phandles, xplic_phandles[MAX_NODES];
     int socket_count = riscv_socket_count(ms);
 
@@ -743,9 +744,10 @@  static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap,
     qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
     qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
 
-    intc_phandles = g_new0(uint32_t, ms->smp.cpus);
+    cpus = machine_topo_get_cpus(ms);
+    intc_phandles = g_new0(uint32_t, cpus);
 
-    phandle_pos = ms->smp.cpus;
+    phandle_pos = cpus;
     for (socket = (socket_count - 1); socket >= 0; socket--) {
         phandle_pos -= s->soc[socket].num_harts;
 
@@ -776,7 +778,7 @@  static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap,
         *msi_pcie_phandle = msi_s_phandle;
     }
 
-    phandle_pos = ms->smp.cpus;
+    phandle_pos = cpus;
     for (socket = (socket_count - 1); socket >= 0; socket--) {
         phandle_pos -= s->soc[socket].num_harts;
 
@@ -1113,7 +1115,7 @@  static FWCfgState *create_fw_cfg(const MachineState *ms)
 
     fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16,
                                   &address_space_memory);
-    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)ms->smp.cpus);
+    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)machine_topo_get_cpus(ms));
 
     return fw_cfg;
 }