From: YannickV <[email protected]> Read flash-type value as machine property and set the flash type accordingly.
Signed-off-by: YannickV <[email protected]> --- hw/arm/xilinx_zynq.c | 25 ++++++++++++++++++++----- include/hw/arm/xilinx_zynq.h | 1 + 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c index 4d095ab6f3..db4fac17c8 100644 --- a/hw/arm/xilinx_zynq.c +++ b/hw/arm/xilinx_zynq.c @@ -120,7 +120,8 @@ static void gem_init(uint32_t base, qemu_irq irq) } static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq, - bool is_qspi, int unit0) + bool is_qspi, int unit0, + const char *flash_type) { int unit = unit0; DeviceState *dev; @@ -152,7 +153,7 @@ static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq, for (j = 0; j < num_ss; ++j) { DriveInfo *dinfo = drive_get(IF_MTD, 0, unit++); - flash_dev = qdev_new("n25q128"); + flash_dev = qdev_new(flash_type); if (dinfo) { qdev_prop_set_drive_err(flash_dev, "drive", blk_by_legacy_dinfo(dinfo), @@ -190,6 +191,14 @@ static void zynq_set_boot_mode(Object *obj, const char *str, m->boot_mode = mode; } +static void zynq_set_flash_type(Object *obj, const char *str, + Error **errp) +{ + ZynqMachineState *m = ZYNQ_MACHINE(obj); + g_free(m->flash_type); + m->flash_type = g_strdup(str); +} + static void ddr_ctrl_init(uint32_t base) { DeviceState *dev; @@ -283,9 +292,12 @@ static void zynq_init(MachineState *machine) pic[n] = qdev_get_gpio_in(dev, n); } - n = zynq_init_spi_flashes(0xE0006000, pic[58 - GIC_INTERNAL], false, 0); - n = zynq_init_spi_flashes(0xE0007000, pic[81 - GIC_INTERNAL], false, n); - n = zynq_init_spi_flashes(0xE000D000, pic[51 - GIC_INTERNAL], true, n); + n = zynq_init_spi_flashes(0xE0006000, pic[58 - GIC_INTERNAL], false, 0, + zynq_machine->flash_type); + n = zynq_init_spi_flashes(0xE0007000, pic[81 - GIC_INTERNAL], false, n, + zynq_machine->flash_type); + n = zynq_init_spi_flashes(0xE000D000, pic[51 - GIC_INTERNAL], true, n, + zynq_machine->flash_type); sysbus_create_simple(TYPE_CHIPIDEA, 0xE0002000, pic[53 - GIC_INTERNAL]); sysbus_create_simple(TYPE_CHIPIDEA, 0xE0003000, pic[76 - GIC_INTERNAL]); @@ -473,6 +485,9 @@ static void zynq_machine_class_init(ObjectClass *oc, const void *data) "Supported boot modes:" " jtag qspi sd nor"); object_property_set_default_str(prop, "qspi"); + + prop = object_class_property_add_str(oc, "flash-type", NULL, zynq_set_flash_type); + object_property_set_default_str(prop, "n25q128"); } static const TypeInfo zynq_machine_type = { diff --git a/include/hw/arm/xilinx_zynq.h b/include/hw/arm/xilinx_zynq.h index ec80441e7c..7379fe3988 100644 --- a/include/hw/arm/xilinx_zynq.h +++ b/include/hw/arm/xilinx_zynq.h @@ -31,6 +31,7 @@ struct ZynqMachineState { Clock *ps_clk; ARMCPU *cpu[ZYNQ_MAX_CPUS]; uint8_t boot_mode; + char *flash_type; }; #endif /* QEMU_ARM_ZYNQ_H */ -- 2.47.3
