Re: [Qemu-devel] [PATCH v10 4/5] hw/arm: add allwinner a10 SoC support
On Mon, Dec 9, 2013 at 10:10 AM, liguang wrote: > Signed-off-by: liguang Acked-by: Peter Crosthwaite > --- > default-configs/arm-softmmu.mak |1 + > hw/arm/Makefile.objs|1 + > hw/arm/allwinner-a10.c | 103 > +++ > include/hw/arm/allwinner-a10.h | 35 + > 4 files changed, 140 insertions(+), 0 deletions(-) > create mode 100644 hw/arm/allwinner-a10.c > create mode 100644 include/hw/arm/allwinner-a10.h > > diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak > index e965068..a19208f 100644 > --- a/default-configs/arm-softmmu.mak > +++ b/default-configs/arm-softmmu.mak > @@ -84,3 +84,4 @@ CONFIG_INTEGRATOR_DEBUG=y > > CONFIG_ALLWINNER_A10_PIT=y > CONFIG_ALLWINNER_A10_PIC=y > +CONFIG_ALLWINNER_A10=y > diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs > index 3671b42..012bd2c 100644 > --- a/hw/arm/Makefile.objs > +++ b/hw/arm/Makefile.objs > @@ -5,3 +5,4 @@ obj-y += tosa.o versatilepb.o vexpress.o xilinx_zynq.o z2.o > > obj-y += armv7m.o exynos4210.o pxa2xx.o pxa2xx_gpio.o pxa2xx_pic.o > obj-y += omap1.o omap2.o strongarm.o > +obj-$(CONFIG_ALLWINNER_A10) += allwinner-a10.o > diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c > new file mode 100644 > index 000..4658e19 > --- /dev/null > +++ b/hw/arm/allwinner-a10.c > @@ -0,0 +1,103 @@ > +/* > + * Allwinner A10 SoC emulation > + * > + * Copyright (C) 2013 Li Guang > + * Written by Li Guang > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms of the GNU General Public License as published by the > + * Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, but > WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License > + * for more details. > + */ > + > +#include "hw/sysbus.h" > +#include "hw/devices.h" > +#include "hw/arm/allwinner-a10.h" > + > +static void aw_a10_init(Object *obj) > +{ > +AwA10State *s = AW_A10(obj); > + > +object_initialize(&s->cpu, sizeof(s->cpu), "cortex-a8-" TYPE_ARM_CPU); > +object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL); > + > +object_initialize(&s->intc, sizeof(s->intc), TYPE_AW_A10_PIC); > +qdev_set_parent_bus(DEVICE(&s->intc), sysbus_get_default()); > + > +object_initialize(&s->timer, sizeof(s->timer), TYPE_AW_A10_PIT); > +qdev_set_parent_bus(DEVICE(&s->timer), sysbus_get_default()); > +} > + > +static void aw_a10_realize(DeviceState *dev, Error **errp) > +{ > +AwA10State *s = AW_A10(dev); > +SysBusDevice *sysbusdev; > +uint8_t i; > +qemu_irq fiq, irq; > +Error *err = NULL; > + > +object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err); > +if (err != NULL) { > +error_propagate(errp, err); > +return; > +} > +irq = qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ); > +fiq = qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ); > + > +object_property_set_bool(OBJECT(&s->intc), true, "realized", &err); > +if (err != NULL) { > +error_propagate(errp, err); > +return; > +} > +sysbusdev = SYS_BUS_DEVICE(&s->intc); > +sysbus_mmio_map(sysbusdev, 0, AW_A10_PIC_REG_BASE); > +sysbus_connect_irq(sysbusdev, 0, irq); > +sysbus_connect_irq(sysbusdev, 1, fiq); > +for (i = 0; i < AW_A10_PIC_INT_NR; i++) { > +s->irq[i] = qdev_get_gpio_in(DEVICE(&s->intc), i); > +} > + > +object_property_set_bool(OBJECT(&s->timer), true, "realized", &err); > +if (err != NULL) { > +error_propagate(errp, err); > +return; > +} > +sysbusdev = SYS_BUS_DEVICE(&s->timer); > +sysbus_mmio_map(sysbusdev, 0, AW_A10_PIT_REG_BASE); > +sysbus_connect_irq(sysbusdev, 0, s->irq[22]); > +sysbus_connect_irq(sysbusdev, 1, s->irq[23]); > +sysbus_connect_irq(sysbusdev, 2, s->irq[24]); > +sysbus_connect_irq(sysbusdev, 3, s->irq[25]); > +sysbus_connect_irq(sysbusdev, 4, s->irq[67]); > +sysbus_connect_irq(sysbusdev, 5, s->irq[68]); > + You could make optionally make a static const array here and loop over it to clean this up. static const int aw_10_timer_ints [] = { 22, 23, 24, 25, 67, 68 }; > +serial_mm_init(get_system_memory(), AW_A10_UART0_REG_BASE, 2, s->irq[1], > + 115200, serial_hds[0], DEVICE_NATIVE_ENDIAN); > +} > + > +static void aw_a10_class_init(ObjectClass *oc, void *data) > +{ > +DeviceClass *dc = DEVICE_CLASS(oc); > + > +dc->realize = aw_a10_realize; > +} > + > +static const TypeInfo aw_a10_type_info = { > +.name = TYPE_AW_A10, > +.parent = TYPE_DEVICE, > +.instance_size = sizeof(AwA10State), > +.instance_init = aw_a10_init, > +.class_init = aw_a10_class_init, > +}; > + > +static void aw_a10_register_typ
[Qemu-devel] [PATCH v10 4/5] hw/arm: add allwinner a10 SoC support
Signed-off-by: liguang --- default-configs/arm-softmmu.mak |1 + hw/arm/Makefile.objs|1 + hw/arm/allwinner-a10.c | 103 +++ include/hw/arm/allwinner-a10.h | 35 + 4 files changed, 140 insertions(+), 0 deletions(-) create mode 100644 hw/arm/allwinner-a10.c create mode 100644 include/hw/arm/allwinner-a10.h diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak index e965068..a19208f 100644 --- a/default-configs/arm-softmmu.mak +++ b/default-configs/arm-softmmu.mak @@ -84,3 +84,4 @@ CONFIG_INTEGRATOR_DEBUG=y CONFIG_ALLWINNER_A10_PIT=y CONFIG_ALLWINNER_A10_PIC=y +CONFIG_ALLWINNER_A10=y diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs index 3671b42..012bd2c 100644 --- a/hw/arm/Makefile.objs +++ b/hw/arm/Makefile.objs @@ -5,3 +5,4 @@ obj-y += tosa.o versatilepb.o vexpress.o xilinx_zynq.o z2.o obj-y += armv7m.o exynos4210.o pxa2xx.o pxa2xx_gpio.o pxa2xx_pic.o obj-y += omap1.o omap2.o strongarm.o +obj-$(CONFIG_ALLWINNER_A10) += allwinner-a10.o diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c new file mode 100644 index 000..4658e19 --- /dev/null +++ b/hw/arm/allwinner-a10.c @@ -0,0 +1,103 @@ +/* + * Allwinner A10 SoC emulation + * + * Copyright (C) 2013 Li Guang + * Written by Li Guang + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "hw/sysbus.h" +#include "hw/devices.h" +#include "hw/arm/allwinner-a10.h" + +static void aw_a10_init(Object *obj) +{ +AwA10State *s = AW_A10(obj); + +object_initialize(&s->cpu, sizeof(s->cpu), "cortex-a8-" TYPE_ARM_CPU); +object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL); + +object_initialize(&s->intc, sizeof(s->intc), TYPE_AW_A10_PIC); +qdev_set_parent_bus(DEVICE(&s->intc), sysbus_get_default()); + +object_initialize(&s->timer, sizeof(s->timer), TYPE_AW_A10_PIT); +qdev_set_parent_bus(DEVICE(&s->timer), sysbus_get_default()); +} + +static void aw_a10_realize(DeviceState *dev, Error **errp) +{ +AwA10State *s = AW_A10(dev); +SysBusDevice *sysbusdev; +uint8_t i; +qemu_irq fiq, irq; +Error *err = NULL; + +object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err); +if (err != NULL) { +error_propagate(errp, err); +return; +} +irq = qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ); +fiq = qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ); + +object_property_set_bool(OBJECT(&s->intc), true, "realized", &err); +if (err != NULL) { +error_propagate(errp, err); +return; +} +sysbusdev = SYS_BUS_DEVICE(&s->intc); +sysbus_mmio_map(sysbusdev, 0, AW_A10_PIC_REG_BASE); +sysbus_connect_irq(sysbusdev, 0, irq); +sysbus_connect_irq(sysbusdev, 1, fiq); +for (i = 0; i < AW_A10_PIC_INT_NR; i++) { +s->irq[i] = qdev_get_gpio_in(DEVICE(&s->intc), i); +} + +object_property_set_bool(OBJECT(&s->timer), true, "realized", &err); +if (err != NULL) { +error_propagate(errp, err); +return; +} +sysbusdev = SYS_BUS_DEVICE(&s->timer); +sysbus_mmio_map(sysbusdev, 0, AW_A10_PIT_REG_BASE); +sysbus_connect_irq(sysbusdev, 0, s->irq[22]); +sysbus_connect_irq(sysbusdev, 1, s->irq[23]); +sysbus_connect_irq(sysbusdev, 2, s->irq[24]); +sysbus_connect_irq(sysbusdev, 3, s->irq[25]); +sysbus_connect_irq(sysbusdev, 4, s->irq[67]); +sysbus_connect_irq(sysbusdev, 5, s->irq[68]); + +serial_mm_init(get_system_memory(), AW_A10_UART0_REG_BASE, 2, s->irq[1], + 115200, serial_hds[0], DEVICE_NATIVE_ENDIAN); +} + +static void aw_a10_class_init(ObjectClass *oc, void *data) +{ +DeviceClass *dc = DEVICE_CLASS(oc); + +dc->realize = aw_a10_realize; +} + +static const TypeInfo aw_a10_type_info = { +.name = TYPE_AW_A10, +.parent = TYPE_DEVICE, +.instance_size = sizeof(AwA10State), +.instance_init = aw_a10_init, +.class_init = aw_a10_class_init, +}; + +static void aw_a10_register_types(void) +{ +type_register_static(&aw_a10_type_info); +} + +type_init(aw_a10_register_types) diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h new file mode 100644 index 000..da36647 --- /dev/null +++ b/include/hw/arm/allwinner-a10.h @@ -0,0 +1,35 @@ +#ifndef ALLWINNER_H_ + +#include "qemu-common.h" +#include "qemu/error-report.h" +#include "hw/char/serial.h" +#include "hw/arm/arm.h" +#include "hw/timer/allwinner-a10-pit.h" +#include "hw/intc/allwinner-a10-pic.h" + +#