On Wed, Jul 16, 2025 at 11:53:57AM +0200, Luc Michel wrote: > Refactor the BBRAM device creation using the VersalMap structure. > > Note that the corresponding FDT node is removed. It does not correspond > to any real node in standard Versal DTBs. No matching drivers exist for > it. > > Signed-off-by: Luc Michel <luc.mic...@amd.com>
Reviewed-by: Francisco Iglesias <francisco.igles...@amd.com> > --- > include/hw/arm/xlnx-versal.h | 3 +-- > hw/arm/xlnx-versal-virt.c | 27 +++--------------------- > hw/arm/xlnx-versal.c | 41 +++++++++++++++++++++++++----------- > 3 files changed, 33 insertions(+), 38 deletions(-) > > diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h > index 78442e6c2c5..9adce02f8a9 100644 > --- a/include/hw/arm/xlnx-versal.h > +++ b/include/hw/arm/xlnx-versal.h > @@ -17,11 +17,10 @@ > #include "hw/cpu/cluster.h" > #include "hw/or-irq.h" > #include "hw/intc/arm_gicv3.h" > #include "hw/rtc/xlnx-zynqmp-rtc.h" > #include "qom/object.h" > -#include "hw/nvram/xlnx-bbram.h" > #include "hw/misc/xlnx-versal-crl.h" > #include "hw/misc/xlnx-versal-trng.h" > #include "net/can_emu.h" > #include "hw/misc/xlnx-versal-cfu.h" > #include "hw/misc/xlnx-versal-cframe-reg.h" > @@ -83,11 +82,10 @@ struct Versal { > > /* The Platform Management Controller subsystem. */ > struct { > XlnxZynqMPRTC rtc; > XlnxVersalTRng trng; > - XlnxBBRam bbram; > XlnxVersalCFUAPB cfu_apb; > XlnxVersalCFUFDRO cfu_fdro; > XlnxVersalCFUSFR cfu_sfr; > XlnxVersalCFrameReg cframe[XLNX_VERSAL_NR_CFRAME]; > XlnxVersalCFrameBcastReg cframe_bcast; > @@ -119,10 +117,11 @@ static inline void versal_set_fdt(Versal *s, void *fdt) > s->cfg.fdt = fdt; > } > > void versal_sdhci_plug_card(Versal *s, int sd_idx, BlockBackend *blk); > void versal_efuse_attach_drive(Versal *s, BlockBackend *blk); > +void versal_bbram_attach_drive(Versal *s, BlockBackend *blk); > void versal_ospi_create_flash(Versal *s, int flash_idx, const char > *flash_mdl, > BlockBackend *blk); > > int versal_get_num_can(VersalVersion version); > int versal_get_num_sdhci(VersalVersion version); > diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c > index 43f3c3d0be9..2d7e8a5955a 100644 > --- a/hw/arm/xlnx-versal-virt.c > +++ b/hw/arm/xlnx-versal-virt.c > @@ -170,30 +170,10 @@ static void fdt_add_rtc_node(VersalVirt *s) > 2, MM_PMC_RTC, 2, MM_PMC_RTC_SIZE); > qemu_fdt_setprop(s->fdt, name, "compatible", compat, sizeof(compat)); > g_free(name); > } > > -static void fdt_add_bbram_node(VersalVirt *s) > -{ > - const char compat[] = TYPE_XLNX_BBRAM; > - const char interrupt_names[] = "bbram-error"; > - char *name = g_strdup_printf("/bbram@%x", MM_PMC_BBRAM_CTRL); > - > - qemu_fdt_add_subnode(s->fdt, name); > - > - qemu_fdt_setprop_cells(s->fdt, name, "interrupts", > - GIC_FDT_IRQ_TYPE_SPI, VERSAL_PMC_APB_IRQ, > - GIC_FDT_IRQ_FLAGS_LEVEL_HI); > - qemu_fdt_setprop(s->fdt, name, "interrupt-names", > - interrupt_names, sizeof(interrupt_names)); > - qemu_fdt_setprop_sized_cells(s->fdt, name, "reg", > - 2, MM_PMC_BBRAM_CTRL, > - 2, MM_PMC_BBRAM_CTRL_SIZE); > - qemu_fdt_setprop(s->fdt, name, "compatible", compat, sizeof(compat)); > - g_free(name); > -} > - > static void fdt_nop_memory_nodes(void *fdt, Error **errp) > { > Error *err = NULL; > char **node_path; > int n = 0; > @@ -344,19 +324,19 @@ static void create_virtio_regions(VersalVirt *s) > qemu_fdt_setprop_string(s->fdt, name, "compatible", "virtio,mmio"); > g_free(name); > } > } > > -static void bbram_attach_drive(XlnxBBRam *dev) > +static void bbram_attach_drive(VersalVirt *s) > { > DriveInfo *dinfo; > BlockBackend *blk; > > dinfo = drive_get_by_index(IF_PFLASH, 0); > blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL; > if (blk) { > - qdev_prop_set_drive(DEVICE(dev), "drive", blk); > + versal_bbram_attach_drive(&s->soc, blk); > } > } > > static void efuse_attach_drive(VersalVirt *s) > { > @@ -442,11 +422,10 @@ static void versal_virt_init(MachineState *machine) > fdt_create(s); > versal_set_fdt(&s->soc, s->fdt); > fdt_add_gic_nodes(s); > fdt_add_timer_nodes(s); > fdt_add_rtc_node(s); > - fdt_add_bbram_node(s); > fdt_add_cpu_nodes(s, psci_conduit); > fdt_add_clk_node(s, "/old-clk125", 125000000, s->phandle.clk_125Mhz); > fdt_add_clk_node(s, "/old-clk25", 25000000, s->phandle.clk_25Mhz); > > sysbus_realize(SYS_BUS_DEVICE(&s->soc), &error_fatal); > @@ -456,11 +435,11 @@ static void versal_virt_init(MachineState *machine) > * modules unaware of multiple address-spaces. */ > memory_region_add_subregion_overlap(get_system_memory(), > 0, &s->soc.fpd.apu.mr, 0); > > /* Attach bbram backend, if given */ > - bbram_attach_drive(&s->soc.pmc.bbram); > + bbram_attach_drive(s); > > /* Attach efuse backend, if given */ > efuse_attach_drive(s); > > /* Plug SD cards */ > diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c > index d34a36e18aa..615eea54372 100644 > --- a/hw/arm/xlnx-versal.c > +++ b/hw/arm/xlnx-versal.c > @@ -34,10 +34,11 @@ > #include "hw/misc/xlnx-versal-xramc.h" > #include "hw/usb/xlnx-usb-subsystem.h" > #include "hw/nvram/xlnx-versal-efuse.h" > #include "hw/ssi/xlnx-versal-ospi.h" > #include "hw/misc/xlnx-versal-pmc-iou-slcr.h" > +#include "hw/nvram/xlnx-bbram.h" > > #define XLNX_VERSAL_ACPU_TYPE ARM_CPU_TYPE_NAME("cortex-a72") > #define XLNX_VERSAL_RCPU_TYPE ARM_CPU_TYPE_NAME("cortex-r5f") > #define GEM_REVISION 0x40070106 > > @@ -117,10 +118,11 @@ typedef struct VersalMap { > uint64_t dma_dst; > int irq; > } ospi; > > VersalSimplePeriphMap pmc_iou_slcr; > + VersalSimplePeriphMap bbram; > } VersalMap; > > static const VersalMap VERSAL_MAP = { > .uart[0] = { 0xff000000, 18 }, > .uart[1] = { 0xff010000, 19 }, > @@ -159,10 +161,11 @@ static const VersalMap VERSAL_MAP = { > .dma_src = 0xf1011000, .dma_dst = 0xf1011800, > .irq = 124, > }, > > .pmc_iou_slcr = { 0xf1060000, OR_IRQ(121, 0) }, > + .bbram = { 0xf11f0000, OR_IRQ(121, 1) }, > }; > > static const VersalMap *VERSION_TO_MAP[] = { > [VERSAL_VER_VERSAL] = &VERSAL_MAP, > }; > @@ -811,26 +814,25 @@ static void versal_create_xrams(Versal *s, const struct > VersalXramMap *map) > > sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(or, i)); > } > } > > -static void versal_create_bbram(Versal *s, qemu_irq *pic) > +static void versal_create_bbram(Versal *s, > + const VersalSimplePeriphMap *map) > { > + DeviceState *dev; > SysBusDevice *sbd; > > - object_initialize_child_with_props(OBJECT(s), "bbram", &s->pmc.bbram, > - sizeof(s->pmc.bbram), TYPE_XLNX_BBRAM, > - &error_fatal, > - "crc-zpads", "0", > - NULL); > - sbd = SYS_BUS_DEVICE(&s->pmc.bbram); > + dev = qdev_new(TYPE_XLNX_BBRAM); > + sbd = SYS_BUS_DEVICE(dev); > > - sysbus_realize(sbd, &error_fatal); > - memory_region_add_subregion(&s->mr_ps, MM_PMC_BBRAM_CTRL, > + object_property_add_child(OBJECT(s), "bbram", OBJECT(dev)); > + qdev_prop_set_uint32(dev, "crc-zpads", 0); > + sysbus_realize_and_unref(sbd, &error_abort); > + memory_region_add_subregion(&s->mr_ps, map->addr, > sysbus_mmio_get_region(sbd, 0)); > - sysbus_connect_irq(sbd, 0, > - qdev_get_gpio_in(DEVICE(&s->pmc.apb_irq_orgate), 1)); > + versal_sysbus_connect_irq(s, sbd, 0, map->irq); > } > > static void versal_create_efuse(Versal *s, > const struct VersalEfuseMap *map) > { > @@ -1323,14 +1325,16 @@ static void versal_realize(DeviceState *dev, Error > **errp) > slcr = versal_create_pmc_iou_slcr(s, &map->pmc_iou_slcr); > > qdev_connect_gpio_out_named(slcr, "ospi-mux-sel", 0, > qdev_get_gpio_in_named(ospi, > "ospi-mux-sel", 0)); > + > + versal_create_bbram(s, &map->bbram); > + > versal_create_pmc_apb_irq_orgate(s, pic); > versal_create_rtc(s, pic); > versal_create_trng(s, pic); > - versal_create_bbram(s, pic); > versal_create_crl(s, pic); > versal_create_cfu(s, pic); > versal_map_ddr(s); > versal_unimp(s); > > @@ -1372,10 +1376,23 @@ void versal_efuse_attach_drive(Versal *s, > BlockBackend *blk) > } > > qdev_prop_set_drive(efuse, "drive", blk); > } > > +void versal_bbram_attach_drive(Versal *s, BlockBackend *blk) > +{ > + DeviceState *bbram; > + > + bbram = DEVICE(versal_get_child(s, "bbram")); > + > + if (bbram == NULL) { > + return; > + } > + > + qdev_prop_set_drive(bbram, "drive", blk); > +} > + > void versal_ospi_create_flash(Versal *s, int flash_idx, const char > *flash_mdl, > BlockBackend *blk) > { > BusState *spi_bus; > DeviceState *flash, *ospi; > -- > 2.50.0 >