[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCHv2 08/13] sparc32_dma: make esp device child of espdm
From: |
Mark Cave-Ayland |
Subject: |
[Qemu-devel] [PATCHv2 08/13] sparc32_dma: make esp device child of espdma device |
Date: |
Sat, 14 Oct 2017 19:09:00 +0100 |
This makes it possible to reference the esp device from the espdma device as
required, and by wiring up the device ourselves in sun4m.c we can drop use
of the esp_init() function.
Signed-off-by: Mark Cave-Ayland <address@hidden>
---
hw/dma/sparc32_dma.c | 26 ++++++++++++++++++++++++++
hw/sparc/sun4m.c | 19 ++++++++-----------
include/hw/sparc/sparc32_dma.h | 3 +++
3 files changed, 37 insertions(+), 11 deletions(-)
diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
index c56a2ba..6009b94 100644
--- a/hw/dma/sparc32_dma.c
+++ b/hw/dma/sparc32_dma.c
@@ -298,11 +298,37 @@ static void sparc32_espdma_device_init(Object *obj)
s->is_ledma = 0;
}
+static void sparc32_espdma_device_realize(DeviceState *dev, Error **errp)
+{
+ DeviceState *d;
+ SysBusESPState *sysbus;
+ ESPState *esp;
+
+ d = qdev_create(NULL, TYPE_ESP);
+ object_property_add_child(OBJECT(dev), "esp", OBJECT(d), errp);
+ sysbus = ESP_STATE(d);
+ esp = &sysbus->esp;
+ esp->dma_memory_read = espdma_memory_read;
+ esp->dma_memory_write = espdma_memory_write;
+ esp->dma_opaque = SPARC32_DMA_DEVICE(dev);
+ sysbus->it_shift = 2;
+ esp->dma_enabled = 1;
+ qdev_init_nofail(d);
+}
+
+static void sparc32_espdma_device_class_init(ObjectClass *klass, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+
+ dc->realize = sparc32_espdma_device_realize;
+}
+
static const TypeInfo sparc32_espdma_device_info = {
.name = TYPE_SPARC32_ESPDMA_DEVICE,
.parent = TYPE_SPARC32_DMA_DEVICE,
.instance_size = sizeof(ESPDMADeviceState),
.instance_init = sparc32_espdma_device_init,
+ .class_init = sparc32_espdma_device_class_init,
};
static void sparc32_ledma_device_init(Object *obj)
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 12d36b5..4626c85 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -819,10 +819,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
const char *cpu_model = machine->cpu_model;
unsigned int i;
void *iommu, *nvram;
- DeviceState *espdma, *ledma;
+ DeviceState *espdma, *esp, *ledma;
SysBusDevice *sbd;
qemu_irq *cpu_irqs[MAX_CPUS], slavio_irq[32], slavio_cpu_irq[MAX_CPUS];
- qemu_irq esp_reset, dma_enable;
qemu_irq fdc_tc;
unsigned long kernel_size;
DriveInfo *fd[MAX_FD];
@@ -884,6 +883,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
sbd = SYS_BUS_DEVICE(espdma);
sysbus_connect_irq(sbd, 0, slavio_irq[18]);
+ esp = DEVICE(object_resolve_path_component(OBJECT(espdma), "esp"));
+ sbd = SYS_BUS_DEVICE(esp);
+ sysbus_mmio_map(sbd, 0, hwdef->esp_base);
+ sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(espdma, 0));
+ qdev_connect_gpio_out(espdma, 0, qdev_get_gpio_in(esp, 0));
+ qdev_connect_gpio_out(espdma, 1, qdev_get_gpio_in(esp, 1));
+
ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, iommu, 1);
sbd = SYS_BUS_DEVICE(ledma);
sysbus_connect_irq(sbd, 0, slavio_irq[16]);
@@ -970,15 +976,6 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
slavio_misc_init(hwdef->slavio_base, hwdef->aux1_base, hwdef->aux2_base,
slavio_irq[30], fdc_tc);
- esp_init(hwdef->esp_base, 2,
- espdma_memory_read, espdma_memory_write,
- espdma,
- qdev_get_gpio_in(espdma, 0),
- &esp_reset, &dma_enable);
-
- qdev_connect_gpio_out(espdma, 0, esp_reset);
- qdev_connect_gpio_out(espdma, 1, dma_enable);
-
if (hwdef->cs_base) {
sysbus_create_simple("SUNW,CS4231", hwdef->cs_base,
slavio_irq[5]);
diff --git a/include/hw/sparc/sparc32_dma.h b/include/hw/sparc/sparc32_dma.h
index df7491d..365160f 100644
--- a/include/hw/sparc/sparc32_dma.h
+++ b/include/hw/sparc/sparc32_dma.h
@@ -2,6 +2,7 @@
#define SPARC32_DMA_H
#include "hw/sysbus.h"
+#include "hw/scsi/esp.h"
#define DMA_REGS 4
@@ -28,6 +29,8 @@ struct DMADeviceState {
typedef struct ESPDMADeviceState {
DMADeviceState parent_obj;
+
+ SysBusESPState *esp;
} ESPDMADeviceState;
#define TYPE_SPARC32_LEDMA_DEVICE "sparc32-ledma"
--
1.7.10.4
- [Qemu-devel] [PATCHv2 00/13] sun4m: sparc32_dma tidy-ups, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 01/13] sparc32_dma: rename SPARC32_DMA type to SPARC32_DMA_DEVICE, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 03/13] sparc32_dma: move type declarations from sparc32_dma.c to sparc32_dma.h, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 04/13] sun4m: move DMA device wiring from sparc32_dma_init() to sun4m_hw_init(), Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 02/13] sparc32_dma: split esp and le into separate DMA devices, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 05/13] sun4m_iommu: move TYPE_SUN4M_IOMMU declaration to sun4m.h, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 06/13] sparc32_dma: use object link instead of qdev property to pass IOMMU reference, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 07/13] esp: move TYPE_ESP and SysBusESPState from esp.c to esp.h, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 08/13] sparc32_dma: make esp device child of espdma device,
Mark Cave-Ayland <=
- [Qemu-devel] [PATCHv2 09/13] lance: move TYPE_LANCE and SysBusPCNetState from lance.c to sun4m.h, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 10/13] sparc32_dma: make lance device child of ledma device, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 12/13] sparc32_dma: remove is_ledma hack and replace with memory region alias, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 13/13] sparc32_dma: add len to esp/le DMA memory tracing, Mark Cave-Ayland, 2017/10/14
- [Qemu-devel] [PATCHv2 11/13] sparc32_dma: introduce new SPARC32_DMA type container object, Mark Cave-Ayland, 2017/10/14
- Re: [Qemu-devel] [PATCHv2 00/13] sun4m: sparc32_dma tidy-ups, no-reply, 2017/10/14
- Re: [Qemu-devel] [PATCHv2 00/13] sun4m: sparc32_dma tidy-ups, no-reply, 2017/10/14
- Re: [Qemu-devel] [PATCHv2 00/13] sun4m: sparc32_dma tidy-ups, no-reply, 2017/10/14