[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v1 19/25] sysbus: Setup memory regions as dynamic prop
From: |
Peter Crosthwaite |
Subject: |
[Qemu-devel] [RFC v1 19/25] sysbus: Setup memory regions as dynamic props |
Date: |
Thu, 15 May 2014 19:00:47 -0700 |
Dynamically allocate Memory Region pointers and set them up as QOM
links. Plug these dynamic links to the sysbus_init_mmio() and
sysbus_mmio_get_region APIs.
This allows for removal of the Sysbus Memory Regions as state. All
that's needed now is the counter for total number of regions. Another
piece of SysBus state bites the dust!
This also removes the artificial limit of 32 memory regions per device.
The number of memory regions is now practically unbounded (unless you
cause a wrap on the total counter).
Signed-off-by: Peter Crosthwaite <address@hidden>
---
hw/core/sysbus.c | 29 ++++++++++++++++++-----------
include/hw/sysbus.h | 4 ----
2 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index 7cdc428..6858336 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -50,7 +50,7 @@ static void sysbus_mmio_map_common(SysBusDevice *dev, int n,
hwaddr addr,
MemoryRegion *mr;
assert(n >= 0 && n < dev->num_mmio);
- mr = dev->mmio[n].memory;
+ mr = sysbus_mmio_get_region(dev, n);
object_property_set_link(OBJECT(mr), OBJECT(get_system_memory()),
"container", &error_abort);
@@ -85,16 +85,22 @@ void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice
*target)
void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion *memory)
{
- int n;
+ char *propname = g_strdup_printf("sysbus-mr-%d", dev->num_mmio++);
- assert(dev->num_mmio < QDEV_MAX_MMIO);
- n = dev->num_mmio++;
- dev->mmio[n].memory = memory;
+ object_property_add_child(OBJECT(dev), propname, OBJECT(memory),
+ &error_abort);
+ g_free(propname);
}
MemoryRegion *sysbus_mmio_get_region(SysBusDevice *dev, int n)
{
- return dev->mmio[n].memory;
+ MemoryRegion *ret;
+ char *propname = g_strdup_printf("sysbus-mr-%d", n);
+
+ ret = MEMORY_REGION(object_property_get_link(OBJECT(dev), propname,
+ &error_abort));
+ g_free(propname);
+ return ret;
}
void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size)
@@ -186,9 +192,9 @@ static void sysbus_dev_print(Monitor *mon, DeviceState
*dev, int indent)
int i;
for (i = 0; i < s->num_mmio; i++) {
- hwaddr addr = object_property_get_int(OBJECT(s->mmio[i].memory),
- "addr", &error_abort);
- size = memory_region_size(s->mmio[i].memory);
+ MemoryRegion *mr = sysbus_mmio_get_region(s, i);
+ hwaddr addr = object_property_get_int(OBJECT(mr), "addr",
&error_abort);
+ size = memory_region_size(mr);
monitor_printf(mon, "%*smmio " TARGET_FMT_plx "/" TARGET_FMT_plx "\n",
indent, "", addr, size);
}
@@ -203,8 +209,9 @@ static char *sysbus_get_fw_dev_path(DeviceState *dev)
off = snprintf(path, sizeof(path), "%s", qdev_fw_name(dev));
if (s->num_mmio) {
- hwaddr addr = object_property_get_int(OBJECT(s->mmio[0].memory),
- "addr", &error_abort);
+ hwaddr addr;
+ addr = object_property_get_int(OBJECT(sysbus_mmio_get_region(s, 0)),
+ "addr", &error_abort);
snprintf(path + off, sizeof(path) - off, "@"TARGET_FMT_plx, addr);
} else if (s->num_pio) {
snprintf(path + off, sizeof(path) - off, "@i%04x", s->pio[0]);
diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index 4499020..1a8e527 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -6,7 +6,6 @@
#include "hw/qdev.h"
#include "exec/memory.h"
-#define QDEV_MAX_MMIO 32
#define QDEV_MAX_PIO 32
#define TYPE_SYSTEM_BUS "System"
@@ -49,9 +48,6 @@ struct SysBusDevice {
/*< public >*/
int num_mmio;
- struct {
- MemoryRegion *memory;
- } mmio[QDEV_MAX_MMIO];
int num_pio;
pio_addr_t pio[QDEV_MAX_PIO];
};
--
1.9.3.1.ga73a6ad
- Re: [Qemu-devel] [RFC v1 11/25] irq: Slim conversion of qemu_irq to QOM [WIP], (continued)
[Qemu-devel] [RFC v1 12/25] qdev: gpio: Don't allow name share between I and O, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 13/25] qdev: gpio: Register GPIO inputs as child objects, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 14/25] qdev: gpio: Register GPIO outputs as QOM links, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 15/25] qdev: gpio: Re-impement qdev_connect_gpio QOM style, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 16/25] qom: object_property_set/get: Add child recursion, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 17/25] sysbus: Use TYPE_DEVICE GPIO functionality, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 18/25] sysbus: Rework sysbus_mmio_map to use mr QOMification, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 19/25] sysbus: Setup memory regions as dynamic props,
Peter Crosthwaite <=
[Qemu-devel] [RFC v1 20/25] sysbus: Enable hotplug., Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 21/25] microblaze: s3adsp: Expand UART creator, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 22/25] microblaze: s3adsp: Parent devices with sane names, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 23/25] timer: xilinx_timer: Convert to realize(), Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 24/25] timer: xilinx_timer: init MMIO ASAP, Peter Crosthwaite, 2014/05/15
[Qemu-devel] [RFC v1 25/25] TEST: microblaze: s3adsp: Remove timer, Peter Crosthwaite, 2014/05/15