On Wed, Jun 3, 2026 at 5:04 PM Joel Stanley <[email protected]> wrote:
>
> riscv_create_aia() currently hard-codes the M-IMSIC at one 4 KiB page
> per hart and gives callers no way to widen it.
>
> Add an m_imsic_stride parameter that supplies the per hart byte
> stride directly. The virt machine passes IMSIC_HART_SIZE(0)
> (= 4 KiB), preserving its existing compact layout.
>
> The parameter only changes how the slots are spaced, with the rest of
> each slot reserved. This allows future platforms that have different
> layouts to control the stride.
>
> Signed-off-by: Joel Stanley <[email protected]>

With a `uint32_t`

Reviewed-by: Alistair Francis <[email protected]>

Alistair

> ---
>  hw/riscv/aia.h  | 1 +
>  hw/riscv/aia.c  | 3 ++-
>  hw/riscv/virt.c | 1 +
>  3 files changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/hw/riscv/aia.h b/hw/riscv/aia.h
> index 5ad0a902be0d..452e78b9d7ad 100644
> --- a/hw/riscv/aia.h
> +++ b/hw/riscv/aia.h
> @@ -14,6 +14,7 @@
>  uint32_t imsic_num_bits(uint32_t count);
>
>  DeviceState *riscv_create_aia(bool msimode, int aia_guests,
> +                             hwaddr m_imsic_stride,
>                               uint16_t num_sources,
>                               const MemMapEntry *aplic_m,
>                               const MemMapEntry *aplic_s,
> diff --git a/hw/riscv/aia.c b/hw/riscv/aia.c
> index 82ea9d48ea75..840f84d26b98 100644
> --- a/hw/riscv/aia.c
> +++ b/hw/riscv/aia.c
> @@ -25,6 +25,7 @@ uint32_t imsic_num_bits(uint32_t count)
>  }
>
>  DeviceState *riscv_create_aia(bool msimode, int aia_guests,
> +                             hwaddr m_imsic_stride,
>                               uint16_t num_sources,
>                               const MemMapEntry *aplic_m,
>                               const MemMapEntry *aplic_s,
> @@ -47,7 +48,7 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guests,
>              /* Per-socket M-level IMSICs */
>              addr = imsic_m->base + socket * (1U << 
> IMSIC_MMIO_GROUP_MIN_SHIFT);
>              for (i = 0; i < hart_count; i++) {
> -                riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0),
> +                riscv_imsic_create(addr + i * m_imsic_stride,
>                                     base_hartid + i, true, 1,
>                                     num_msis);
>              }
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index 4cd941a6aac6..529bb2fc0132 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -1549,6 +1549,7 @@ static void virt_machine_init(MachineState *machine)
>          } else {
>              s->irqchip[i] = riscv_create_aia(s->aia_type == 
> VIRT_AIA_TYPE_APLIC_IMSIC,
>                                               s->aia_guests,
> +                                             IMSIC_HART_SIZE(0),
>                                               s->num_sources,
>                                               &s->memmap[VIRT_APLIC_M],
>                                               &s->memmap[VIRT_APLIC_S],
> --
> 2.47.3
>
>

Reply via email to