On Thu, Aug 27, 2026 at 07:25:55PM +0800, Daniel Henrique Barboza wrote:
> Add a common helper to create a cfi-flash compatible flash subnode.
>
> This change only affects the existing 'virt' board for now but it will
> be used by the future 'riscv-server-ref' board in the future.
>
> No FDT changes intended.
>
> Signed-off-by: Daniel Henrique Barboza <[email protected]>
> Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Reviewed-by: Chao Liu <[email protected]>
Thanks,
Chao
> ---
> hw/riscv/fdt-common.c | 12 ++++++++++++
> hw/riscv/virt.c | 18 ++----------------
> include/hw/riscv/fdt-common.h | 1 +
> 3 files changed, 15 insertions(+), 16 deletions(-)
>
> diff --git a/hw/riscv/fdt-common.c b/hw/riscv/fdt-common.c
> index 3a8da03cfb..6fcc1ce21f 100644
> --- a/hw/riscv/fdt-common.c
> +++ b/hw/riscv/fdt-common.c
> @@ -283,3 +283,15 @@ void riscv_pmu_generate_fdt_node(void *fdt, uint32_t
> cmask, char *pmu_name)
> qemu_fdt_setprop(fdt, pmu_name, "riscv,event-to-mhpmcounters",
> fdt_event_ctr_map, sizeof(fdt_event_ctr_map));
> }
> +
> +void riscv_create_fdt_flash(void *fdt, hwaddr flashbase, hwaddr flashsize)
> +{
> + g_autofree char *name = g_strdup_printf("/flash@%" PRIx64, flashbase);
> +
> + qemu_fdt_add_subnode(fdt, name);
> + qemu_fdt_setprop_string(fdt, name, "compatible", "cfi-flash");
> + qemu_fdt_setprop_sized_cells(fdt, name, "reg",
> + 2, flashbase, 2, flashsize,
> + 2, flashbase + flashsize, 2, flashsize);
> + qemu_fdt_setprop_cell(fdt, name, "bank-width", 4);
> +}
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index b796220fc2..e48337dfd9 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -867,21 +867,6 @@ static void create_fdt_rtc(RISCVVirtState *s,
> }
> }
>
> -static void create_fdt_flash(RISCVVirtState *s)
> -{
> - MachineState *ms = MACHINE(s);
> - hwaddr flashsize = s->memmap[VIRT_FLASH].size / 2;
> - hwaddr flashbase = s->memmap[VIRT_FLASH].base;
> - g_autofree char *name = g_strdup_printf("/flash@%" PRIx64, flashbase);
> -
> - qemu_fdt_add_subnode(ms->fdt, name);
> - qemu_fdt_setprop_string(ms->fdt, name, "compatible", "cfi-flash");
> - qemu_fdt_setprop_sized_cells(ms->fdt, name, "reg",
> - 2, flashbase, 2, flashsize,
> - 2, flashbase + flashsize, 2, flashsize);
> - qemu_fdt_setprop_cell(ms->fdt, name, "bank-width", 4);
> -}
> -
> static void create_fdt_fw_cfg(RISCVVirtState *s)
> {
> MachineState *ms = MACHINE(s);
> @@ -1043,7 +1028,8 @@ static void create_fdt(RISCVVirtState *s)
>
> qemu_fdt_add_subnode(ms->fdt, "/aliases");
>
> - create_fdt_flash(s);
> + riscv_create_fdt_flash(ms->fdt, s->memmap[VIRT_FLASH].base,
> + s->memmap[VIRT_FLASH].size / 2);
> create_fdt_fw_cfg(s);
> create_fdt_pmu(s);
> }
> diff --git a/include/hw/riscv/fdt-common.h b/include/hw/riscv/fdt-common.h
> index 371971d79d..b422da6aef 100644
> --- a/include/hw/riscv/fdt-common.h
> +++ b/include/hw/riscv/fdt-common.h
> @@ -38,4 +38,5 @@ void riscv_create_fdt_plic(void *fdt, hwaddr addr, uint64_t
> size,
> uint32_t cells_size, uint32_t ndev_sources,
> bool numa_enabled, int socket);
> void riscv_pmu_generate_fdt_node(void *fdt, uint32_t cmask, char *pmu_name);
> +void riscv_create_fdt_flash(void *fdt, hwaddr flashbase, hwaddr flashsize);
> #endif
> --
> 2.43.0
>