First step QOMficiation of the Axis NAND controller. Setup the memory regions properly as per sysbus.
Signed-off-by: Peter Crosthwaite <peter.crosthwa...@xilinx.com> --- hw/cris/axis_dev88.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c index 645e45c..46d7c2a 100644 --- a/hw/cris/axis_dev88.c +++ b/hw/cris/axis_dev88.c @@ -39,6 +39,10 @@ struct nand_state_t { + /*< private >*/ + SysBusDevice parent_obj; + /*< public > */ + DeviceState *nand; MemoryRegion iomem; unsigned int rdy:1; @@ -47,6 +51,11 @@ struct nand_state_t unsigned int ce:1; }; +#define TYPE_AXIS_DEV88_NAND "axis-dev88-nand" + +#define AXIS_DEV88_NAND(obj) \ + OBJECT_CHECK(struct nand_state_t, (obj), TYPE_AXIS_DEV88_NAND) + static struct nand_state_t nand_state; static uint64_t nand_read(void *opaque, hwaddr addr, unsigned size) { @@ -82,6 +91,21 @@ static const MemoryRegionOps nand_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; +static void axis_dev88_nand_init(Object *obj) +{ + struct nand_state_t *ns = AXIS_DEV88_NAND(obj); + + memory_region_init_io(&ns->iomem, NULL, &nand_ops, ns, "nand", 0x05000000); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &ns->iomem); +} + +static const TypeInfo axis_dev88_nand_info = { + .name = TYPE_AXIS_DEV88_NAND, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(struct nand_state_t), + .instance_init = axis_dev88_nand_init, +}; + struct tempsensor_t { unsigned int shiftreg; @@ -238,6 +262,13 @@ static const MemoryRegionOps gpio_ops = { }, }; +static void axis_dev88_register(void) +{ + type_register_static(&axis_dev88_nand_info); +} + +type_init(axis_dev88_register) + #define INTMEM_SIZE (128 * 1024) static struct cris_load_info li; @@ -281,13 +312,12 @@ void axisdev88_init(QEMUMachineInitArgs *args) memory_region_add_subregion(address_space_mem, 0x38000000, phys_intmem); /* Attach a NAND flash to CS1. */ + object_initialize(&nand_state, sizeof(nand_state), TYPE_AXIS_DEV88_NAND); + sysbus_mmio_map(SYS_BUS_DEVICE(&nand_state), 0, 0x10000000); nand = drive_get(IF_MTD, 0, 0); nand_state.nand = nand_init(nand ? nand->bdrv : NULL, NAND_MFR_STMICRO, 0x39); - memory_region_init_io(&nand_state.iomem, NULL, &nand_ops, &nand_state, - "nand", 0x05000000); - memory_region_add_subregion(address_space_mem, 0x10000000, - &nand_state.iomem); + object_property_set_bool(OBJECT(&nand_state), true, "realized", NULL); gpio_state.nand = &nand_state; memory_region_init_io(&gpio_state.iomem, NULL, &gpio_ops, &gpio_state, -- 1.8.5.4