From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34658) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ujq85-0007eO-JP for qemu-devel@nongnu.org; Tue, 04 Jun 2013 08:14:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ujq83-0002Qf-SA for qemu-devel@nongnu.org; Tue, 04 Jun 2013 08:14:21 -0400 Received: from mail-bk0-x22c.google.com ([2a00:1450:4008:c01::22c]:60567) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ujq83-0002Pu-MF for qemu-devel@nongnu.org; Tue, 04 Jun 2013 08:14:19 -0400 Received: by mail-bk0-f44.google.com with SMTP id r7so92226bkg.17 for ; Tue, 04 Jun 2013 05:14:19 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Tue, 4 Jun 2013 14:13:50 +0200 Message-Id: <1370348041-6768-7-git-send-email-pbonzini@redhat.com> In-Reply-To: <1370348041-6768-1-git-send-email-pbonzini@redhat.com> References: <1370348041-6768-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH v2 06/17] sysbus: add sysbus_pass_mmio List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org This matches sysbus_pass_irq in cases where a device is a thin wrapper of another. MMIO regions will keep the subdevice as the owner. Signed-off-by: Paolo Bonzini --- hw/core/sysbus.c | 12 ++++++++++++ hw/cpu/arm11mpcore.c | 2 +- include/hw/sysbus.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c index 9004d8c..6dbd1f8 100644 --- a/hw/core/sysbus.c +++ b/hw/core/sysbus.c @@ -117,6 +117,18 @@ void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion *memory) dev->mmio[n].memory = memory; } +/* Pass MMIOs from a target device. */ +void sysbus_pass_mmio(SysBusDevice *dev, SysBusDevice *target) +{ + int i; + assert(dev->num_mmio == 0); + dev->num_mmio = target->num_mmio; + for (i = 0; i < dev->num_mmio; i++) { + assert(target->mmio[i].addr == -1); + dev->mmio[i] = target->mmio[i]; + } +} + MemoryRegion *sysbus_mmio_get_region(SysBusDevice *dev, int n) { return dev->mmio[n].memory; diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c index 90dcead..cc885d1 100644 --- a/hw/cpu/arm11mpcore.c +++ b/hw/cpu/arm11mpcore.c @@ -213,7 +213,7 @@ static int realview_mpcore_init(SysBusDevice *dev) } } qdev_init_gpio_in(&dev->qdev, mpcore_rirq_set_irq, 64); - sysbus_init_mmio(dev, sysbus_mmio_get_region(s->priv, 0)); + sysbus_pass_mmio(dev, s->priv); return 0; } diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h index 7c2e316..0639343 100644 --- a/include/hw/sysbus.h +++ b/include/hw/sysbus.h @@ -48,6 +48,7 @@ struct SysBusDevice { void *sysbus_new(void); void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion *memory); +void sysbus_pass_mmio(SysBusDevice *dev, SysBusDevice *target); MemoryRegion *sysbus_mmio_get_region(SysBusDevice *dev, int n); void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p); void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target); -- 1.8.1.4