From 47ee0260a953dd33d935941dfd5f5f0652001743 Mon Sep 17 00:00:00 2001 From: Andrew Baumann Date: Wed, 25 Nov 2015 13:30:32 -0800 Subject: [PATCH] bcm2835_dma: refactor to use header file --- hw/arm/bcm2835_peripherals.c | 42 ++++++++++----------- hw/dma/bcm2835_dma.c | 73 ++++++++++++------------------------ include/hw/arm/bcm2835_peripherals.h | 4 +- include/hw/dma/bcm2835_dma.h | 48 ++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 72 deletions(-) create mode 100644 include/hw/dma/bcm2835_dma.h diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c index 1f9ec66b73..3101e4b8d5 100644 --- a/hw/arm/bcm2835_peripherals.c +++ b/hw/arm/bcm2835_peripherals.c @@ -111,11 +111,11 @@ static void bcm2835_peripherals_init(Object *obj) qdev_set_parent_bus(DEVICE(dev), sysbus_get_default()); /* DMA Channels */ - s->dma = dev = SYS_BUS_DEVICE(object_new("bcm2835_dma")); - object_property_add_child(obj, "dma", OBJECT(dev), NULL); - qdev_set_parent_bus(DEVICE(dev), sysbus_get_default()); + object_initialize(&s->dma, sizeof(s->dma), TYPE_BCM2835_DMA); + object_property_add_child(obj, "dma", OBJECT(&s->dma), NULL); + qdev_set_parent_bus(DEVICE(&s->dma), sysbus_get_default()); - object_property_add_const_link(OBJECT(dev), "dma_mr", + object_property_add_const_link(OBJECT(&s->dma), "dma_mr", OBJECT(&s->gpu_bus_mr), &error_abort); } @@ -319,32 +319,32 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp) sysbus_connect_irq(s->emmc, 0, pic[INTERRUPT_VC_ARASANSDIO]); /* DMA Channels */ - object_property_set_bool(OBJECT(s->dma), true, "realized", &err); + object_property_set_bool(OBJECT(&s->dma), true, "realized", &err); if (err) { error_propagate(errp, err); return; } memory_region_add_subregion(&s->peri_mr, DMA_OFFSET, - sysbus_mmio_get_region(s->dma, 0)); + sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->dma), 0)); /* XXX: this address was in the original raspi port. * It's unclear where it is derived from. */ memory_region_add_subregion(&s->peri_mr, 0xe05000, - sysbus_mmio_get_region(s->dma, 1)); - - sysbus_connect_irq(s->dma, 0, pic[INTERRUPT_DMA0]); - sysbus_connect_irq(s->dma, 1, pic[INTERRUPT_DMA1]); - sysbus_connect_irq(s->dma, 2, pic[INTERRUPT_VC_DMA2]); - sysbus_connect_irq(s->dma, 3, pic[INTERRUPT_VC_DMA3]); - sysbus_connect_irq(s->dma, 4, pic[INTERRUPT_DMA4]); - sysbus_connect_irq(s->dma, 5, pic[INTERRUPT_DMA5]); - sysbus_connect_irq(s->dma, 6, pic[INTERRUPT_DMA6]); - sysbus_connect_irq(s->dma, 7, pic[INTERRUPT_DMA7]); - sysbus_connect_irq(s->dma, 8, pic[INTERRUPT_DMA8]); - sysbus_connect_irq(s->dma, 9, pic[INTERRUPT_DMA9]); - sysbus_connect_irq(s->dma, 10, pic[INTERRUPT_DMA10]); - sysbus_connect_irq(s->dma, 11, pic[INTERRUPT_DMA11]); - sysbus_connect_irq(s->dma, 12, pic[INTERRUPT_DMA12]); + sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->dma), 1)); + + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 0, pic[INTERRUPT_DMA0]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 1, pic[INTERRUPT_DMA1]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 2, pic[INTERRUPT_VC_DMA2]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 3, pic[INTERRUPT_VC_DMA3]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 4, pic[INTERRUPT_DMA4]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 5, pic[INTERRUPT_DMA5]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 6, pic[INTERRUPT_DMA6]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 7, pic[INTERRUPT_DMA7]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 8, pic[INTERRUPT_DMA8]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 9, pic[INTERRUPT_DMA9]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 10, pic[INTERRUPT_DMA10]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 11, pic[INTERRUPT_DMA11]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), 12, pic[INTERRUPT_DMA12]); } static void bcm2835_peripherals_class_init(ObjectClass *oc, void *data) diff --git a/hw/dma/bcm2835_dma.c b/hw/dma/bcm2835_dma.c index baf46c06ab..d10182fac6 100644 --- a/hw/dma/bcm2835_dma.c +++ b/hw/dma/bcm2835_dma.c @@ -3,8 +3,7 @@ * This code is licensed under the GNU GPLv2 and later. */ -#include "hw/sysbus.h" -#include "exec/address-spaces.h" +#include "hw/dma/bcm2835_dma.h" /* DMA CS Control and Status bits */ #define BCM2708_DMA_ACTIVE (1 << 0) @@ -47,40 +46,9 @@ #define BCM2708_DMA_TDMODE_LEN(w, h) ((h) << 16 | (w)) -typedef struct { - uint32_t cs; - uint32_t conblk_ad; - uint32_t ti; - uint32_t source_ad; - uint32_t dest_ad; - uint32_t txfr_len; - uint32_t stride; - uint32_t nextconbk; - uint32_t debug; - - qemu_irq irq; -} DmaChan; - -#define TYPE_BCM2835_DMA "bcm2835_dma" -#define BCM2835_DMA(obj) \ - OBJECT_CHECK(Bcm2835DmaState, (obj), TYPE_BCM2835_DMA) - -typedef struct { - SysBusDevice busdev; - MemoryRegion iomem0_14; - MemoryRegion iomem15; - MemoryRegion *dma_mr; - AddressSpace dma_as; - - DmaChan chan[16]; - uint32_t int_status; - uint32_t enable; -} Bcm2835DmaState; - - -static void bcm2835_dma_update(Bcm2835DmaState *s, int c) +static void bcm2835_dma_update(BCM2835DmaState *s, int c) { - DmaChan *ch = &s->chan[c]; + BCM2835DmaChan *ch = &s->chan[c]; uint32_t data; if (!(s->enable & (1 << c))) { @@ -132,10 +100,10 @@ static void bcm2835_dma_update(Bcm2835DmaState *s, int c) ch->cs &= ~BCM2708_DMA_ACTIVE; } -static uint64_t bcm2835_dma_read(Bcm2835DmaState *s, hwaddr offset, +static uint64_t bcm2835_dma_read(BCM2835DmaState *s, hwaddr offset, unsigned size, int c) { - DmaChan *ch = &s->chan[c]; + BCM2835DmaChan *ch = &s->chan[c]; uint32_t res = 0; assert(size == 4); @@ -176,10 +144,10 @@ static uint64_t bcm2835_dma_read(Bcm2835DmaState *s, hwaddr offset, return res; } -static void bcm2835_dma_write(Bcm2835DmaState *s, hwaddr offset, +static void bcm2835_dma_write(BCM2835DmaState *s, hwaddr offset, uint64_t value, unsigned size, int c) { - DmaChan *ch = &s->chan[c]; + BCM2835DmaChan *ch = &s->chan[c]; uint32_t oldcs = ch->cs; assert(size == 4); @@ -242,7 +210,7 @@ static void bcm2835_dma_write(Bcm2835DmaState *s, hwaddr offset, static uint64_t bcm2835_dma0_14_read(void *opaque, hwaddr offset, unsigned size) { - Bcm2835DmaState *s = (Bcm2835DmaState *)opaque; + BCM2835DmaState *s = (BCM2835DmaState *)opaque; if (offset == 0xfe0) { return s->int_status; } @@ -256,14 +224,14 @@ static uint64_t bcm2835_dma0_14_read(void *opaque, hwaddr offset, static uint64_t bcm2835_dma15_read(void *opaque, hwaddr offset, unsigned size) { - return bcm2835_dma_read((Bcm2835DmaState *)opaque, (offset & 0xff), + return bcm2835_dma_read((BCM2835DmaState *)opaque, (offset & 0xff), size, 15); } static void bcm2835_dma0_14_write(void *opaque, hwaddr offset, uint64_t value, unsigned size) { - Bcm2835DmaState *s = (Bcm2835DmaState *)opaque; + BCM2835DmaState *s = (BCM2835DmaState *)opaque; if (offset == 0xfe0) { return; } @@ -278,7 +246,7 @@ static void bcm2835_dma0_14_write(void *opaque, hwaddr offset, static void bcm2835_dma15_write(void *opaque, hwaddr offset, uint64_t value, unsigned size) { - bcm2835_dma_write((Bcm2835DmaState *)opaque, (offset & 0xff), + bcm2835_dma_write((BCM2835DmaState *)opaque, (offset & 0xff), value, size, 15); } @@ -307,17 +275,26 @@ static const VMStateDescription vmstate_bcm2835_dma = { static void bcm2835_dma_init(Object *obj) { - Bcm2835DmaState *s = BCM2835_DMA(obj); + BCM2835DmaState *s = BCM2835_DMA(obj); + int n; + memory_region_init_io(&s->iomem0_14, OBJECT(s), &bcm2835_dma0_14_ops, s, "bcm2835_dma0_14", 0xf00); + sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem0_14); + memory_region_init_io(&s->iomem15, OBJECT(s), &bcm2835_dma15_ops, s, "bcm2835_dma15", 0x100); + sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem15); + + for (n = 0; n < 16; n++) { + sysbus_init_irq(SYS_BUS_DEVICE(s), &s->chan[n].irq); + } } static void bcm2835_dma_realize(DeviceState *dev, Error **errp) { int n; - Bcm2835DmaState *s = BCM2835_DMA(dev); + BCM2835DmaState *s = BCM2835_DMA(dev); Error *err = NULL; Object *obj; @@ -335,11 +312,7 @@ static void bcm2835_dma_realize(DeviceState *dev, Error **errp) for (n = 0; n < 16; n++) { s->chan[n].cs = 0; s->chan[n].conblk_ad = 0; - sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->chan[n].irq); } - - sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem0_14); - sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem15); } static void bcm2835_dma_class_init(ObjectClass *klass, void *data) @@ -353,7 +326,7 @@ static void bcm2835_dma_class_init(ObjectClass *klass, void *data) static TypeInfo bcm2835_dma_info = { .name = TYPE_BCM2835_DMA, .parent = TYPE_SYS_BUS_DEVICE, - .instance_size = sizeof(Bcm2835DmaState), + .instance_size = sizeof(BCM2835DmaState), .class_init = bcm2835_dma_class_init, .instance_init = bcm2835_dma_init, }; diff --git a/include/hw/arm/bcm2835_peripherals.h b/include/hw/arm/bcm2835_peripherals.h index 65ba08486b..1f37e209c0 100644 --- a/include/hw/arm/bcm2835_peripherals.h +++ b/include/hw/arm/bcm2835_peripherals.h @@ -16,6 +16,7 @@ #include "hw/sysbus.h" #include "hw/char/bcm2835_aux.h" #include "hw/display/bcm2835_fb.h" +#include "hw/dma/bcm2835_dma.h" #define TYPE_BCM2835_PERIPHERALS "bcm2835_peripherals" #define BCM2835_PERIPHERALS(obj) \ @@ -32,8 +33,9 @@ typedef struct BCM2835PeripheralState { Bcm2835AuxState aux; Bcm2835FbState fb; + BCM2835DmaState dma; SysBusDevice *ic, *uart0, *systimer, *armtimer, *usb, *mphi, *sbm, - *power, *property, *vchiq, *emmc, *dma; + *power, *property, *vchiq, *emmc; } BCM2835PeripheralState; #endif /* BCM2835_PERIPHERALS_H */ diff --git a/include/hw/dma/bcm2835_dma.h b/include/hw/dma/bcm2835_dma.h new file mode 100644 index 0000000000..9b8bc6e934 --- /dev/null +++ b/include/hw/dma/bcm2835_dma.h @@ -0,0 +1,48 @@ +/* + * Raspberry Pi emulation (c) 2012 Gregory Estrade + * Upstreaming code cleanup [including bcm2835_*] (c) 2013 Jan Petrous + * + * Rasperry Pi 2 emulation and refactoring Copyright (c) 2015, Microsoft + * Written by Andrew Baumann + * + * This code is licensed under the GNU GPLv2 and later. + */ + +#ifndef BCM2835_DMA_H +#define BCM2835_DMA_H + +#include "qemu-common.h" +#include "exec/address-spaces.h" +#include "hw/sysbus.h" + +typedef struct { + uint32_t cs; + uint32_t conblk_ad; + uint32_t ti; + uint32_t source_ad; + uint32_t dest_ad; + uint32_t txfr_len; + uint32_t stride; + uint32_t nextconbk; + uint32_t debug; + + qemu_irq irq; +} BCM2835DmaChan; + +#define TYPE_BCM2835_DMA "bcm2835_dma" +#define BCM2835_DMA(obj) \ + OBJECT_CHECK(BCM2835DmaState, (obj), TYPE_BCM2835_DMA) + +typedef struct { + SysBusDevice busdev; + MemoryRegion iomem0_14; + MemoryRegion iomem15; + MemoryRegion *dma_mr; + AddressSpace dma_as; + + BCM2835DmaChan chan[16]; + uint32_t int_status; + uint32_t enable; +} BCM2835DmaState; + +#endif -- 2.11.4.GIT