From: YannickV <Y.Vossen@beckhoff.com>
Read flash-type value as machine property and set the flash type
accordingly.
Signed-off-by: YannickV <Y.Vossen@beckhoff.com>
---
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