On Thu, Jan 24, 2013 at 08:33:56PM +0100, Andreas Färber wrote: > It was not qdev'ified before, so turn it into a SysBusDevice. > Keep mmio_ide_init_drives() around to attach the hard drive. > > Signed-off-by: Andreas Färber <afaer...@suse.de> > Cc: Markus Armbruster <arm...@redhat.com> > --- > hw/ide.h | 5 +--- > hw/ide/mmio.c | 92 > +++++++++++++++++++++++++++++++++++++++++++++------------ > hw/r2d.c | 10 +++++-- > 3 Dateien geändert, 82 Zeilen hinzugefügt(+), 25 Zeilen entfernt(-) > > diff --git a/hw/ide.h b/hw/ide.h > index 7e23cda..db33ea7 100644 > --- a/hw/ide.h > +++ b/hw/ide.h > @@ -24,10 +24,7 @@ MemoryRegion *pmac_ide_init (DriveInfo **hd_table, > qemu_irq irq, > void *dbdma, int channel, qemu_irq dma_irq); > > /* ide-mmio.c */ > -void mmio_ide_init (hwaddr membase, hwaddr membase2, > - MemoryRegion *address_space, > - qemu_irq irq, int shift, > - DriveInfo *hd0, DriveInfo *hd1); > +void mmio_ide_init_drives(DeviceState *dev, DriveInfo *hd0, DriveInfo *hd1); > > int ide_get_geometry(BusState *bus, int unit, > int16_t *cyls, int8_t *heads, int8_t *secs); > diff --git a/hw/ide/mmio.c b/hw/ide/mmio.c > index eb59976..ce88c3a 100644 > --- a/hw/ide/mmio.c > +++ b/hw/ide/mmio.c > @@ -22,7 +22,8 @@ > * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > * THE SOFTWARE. > */ > -#include <hw/hw.h> > +#include "hw/hw.h" > +#include "hw/sysbus.h" > #include "block/block.h" > #include "sysemu/dma.h" > > @@ -34,15 +35,24 @@ > * dedicated ide controller, which is often seen on embedded boards. > */ > > -typedef struct { > +#define TYPE_MMIO_IDE "mmio-ide" > +#define MMIO_IDE(obj) OBJECT_CHECK(MMIOState, (obj), TYPE_MMIO_IDE) > + > +typedef struct MMIOIDEState { > + /*< private >*/ > + SysBusDevice parent_obj; > + /*< public >*/ > + > IDEBus bus; > - int shift; > + > + uint32_t shift; > + qemu_irq irq; > MemoryRegion iomem1, iomem2; > } MMIOState; > > -static void mmio_ide_reset(void *opaque) > +static void mmio_ide_reset(DeviceState *dev) > { > - MMIOState *s = opaque; > + MMIOState *s = MMIO_IDE(dev); > > ide_bus_reset(&s->bus); > } > @@ -107,24 +117,68 @@ static const VMStateDescription vmstate_ide_mmio = { > } > }; > > -void mmio_ide_init (hwaddr membase, hwaddr membase2, > - MemoryRegion *address_space, > - qemu_irq irq, int shift, > - DriveInfo *hd0, DriveInfo *hd1) > +static void mmio_ide_realizefn(DeviceState *dev, Error **errp) > { > - MMIOState *s = g_malloc0(sizeof(MMIOState)); > + SysBusDevice *d = SYS_BUS_DEVICE(dev); > + MMIOState *s = MMIO_IDE(dev); > > - ide_init2_with_non_qdev_drives(&s->bus, hd0, hd1, irq); > - > - s->shift = shift; > + ide_init2(&s->bus, s->irq); > > memory_region_init_io(&s->iomem1, &mmio_ide_ops, s, > - "ide-mmio.1", 16 << shift); > + "ide-mmio.1", 16 << s->shift); > memory_region_init_io(&s->iomem2, &mmio_ide_cs_ops, s, > - "ide-mmio.2", 2 << shift); > - memory_region_add_subregion(address_space, membase, &s->iomem1); > - memory_region_add_subregion(address_space, membase2, &s->iomem2); > - vmstate_register(NULL, 0, &vmstate_ide_mmio, s); > - qemu_register_reset(mmio_ide_reset, s); > + "ide-mmio.2", 2 << s->shift); > + sysbus_init_mmio(d, &s->iomem1); > + sysbus_init_mmio(d, &s->iomem2); > +} > + > +static void mmio_ide_initfn(Object *obj) > +{ > + SysBusDevice *d = SYS_BUS_DEVICE(obj); > + MMIOState *s = MMIO_IDE(obj); > + > + ide_bus_new(&s->bus, DEVICE(obj), 0); > + sysbus_init_irq(d, &s->irq); > +} > + > +static Property mmio_ide_properties[] = { > + DEFINE_PROP_UINT32("shift", MMIOState, shift, 0), > + DEFINE_PROP_END_OF_LIST() > +}; > + > +static void mmio_ide_class_init(ObjectClass *oc, void *data) > +{ > + DeviceClass *dc = DEVICE_CLASS(oc); > + > + dc->realize = mmio_ide_realizefn; > + dc->reset = mmio_ide_reset; > + dc->props = mmio_ide_properties; > + dc->vmsd = &vmstate_ide_mmio; > +} > + > +static const TypeInfo mmio_ide_type_info = { > + .name = TYPE_MMIO_IDE, > + .parent = TYPE_SYS_BUS_DEVICE, > + .instance_size = sizeof(MMIOState), > + .instance_init = mmio_ide_initfn, > + .class_init = mmio_ide_class_init, > +}; > + > +static void mmio_ide_register_types(void) > +{ > + type_register_static(&mmio_ide_type_info); > +} > + > +void mmio_ide_init_drives(DeviceState *dev, DriveInfo *hd0, DriveInfo *hd1) > +{ > + MMIOState *s = MMIO_IDE(dev); > + > + if (hd0 != NULL) { > + ide_create_drive(&s->bus, 0, hd0); > + } > + if (hd1 != NULL) { > + ide_create_drive(&s->bus, 1, hd1); > + } > } > > +type_init(mmio_ide_register_types) > diff --git a/hw/r2d.c b/hw/r2d.c > index a2e3b6f..2d0dd1f 100644 > --- a/hw/r2d.c > +++ b/hw/r2d.c > @@ -276,8 +276,14 @@ static void r2d_init(QEMUMachineInitArgs *args) > > /* onboard CF (True IDE mode, Master only). */ > dinfo = drive_get(IF_IDE, 0, 0); > - mmio_ide_init(0x14001000, 0x1400080c, address_space_mem, irq[CF_IDE], 1, > - dinfo, NULL); > + dev = qdev_create(NULL, "mmio-ide"); > + busdev = SYS_BUS_DEVICE(dev); > + sysbus_connect_irq(busdev, 0, irq[CF_IDE]); > + qdev_prop_set_uint32(dev, "shift", 1); > + qdev_init_nofail(dev); > + sysbus_mmio_map(busdev, 0, 0x14001000); > + sysbus_mmio_map(busdev, 1, 0x1400080c); > + mmio_ide_init_drives(dev, dinfo, NULL); > > /* onboard flash memory */ > dinfo = drive_get(IF_PFLASH, 0, 0);
Thanks, applied. -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurel...@aurel32.net http://www.aurel32.net