[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH for-1.4?] ide/mmio: QOM'ify MMIO IDE for R2D
From: |
Aurelien Jarno |
Subject: |
Re: [Qemu-devel] [PATCH for-1.4?] ide/mmio: QOM'ify MMIO IDE for R2D |
Date: |
Fri, 1 Feb 2013 00:26:46 +0100 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
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 <address@hidden>
> Cc: Markus Armbruster <address@hidden>
> ---
> 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
address@hidden http://www.aurel32.net