[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH v2 5/9] sysbus: Add user map hints
From: |
Alexander Graf |
Subject: |
[Qemu-ppc] [PATCH v2 5/9] sysbus: Add user map hints |
Date: |
Wed, 2 Jul 2014 20:01:29 +0200 |
We want to give the user the ability to tell our machine file where he wants
to have devices mapped to. This patch adds code to create these hints
dynamically and expose them as object properties that can only be modified
before device realization.
Signed-off-by: Alexander Graf <address@hidden>
---
v1 -> v2:
- make irq and pio properties uint64
- ensure qom exposed pointers don't change due to realloc
- fix sysbus_pass_irq
- make properties write-once, not write-before-realize
- make props only available via qom, no state pointers left
---
hw/core/sysbus.c | 43 ++++++++++++++++++++++++++++++++++++++++---
include/hw/sysbus.h | 1 +
2 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index f4e760d..e551e16 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -20,6 +20,7 @@
#include "hw/sysbus.h"
#include "monitor/monitor.h"
#include "exec/address-spaces.h"
+#include "qom/property.h"
static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent);
static char *sysbus_get_fw_dev_path(DeviceState *dev);
@@ -86,6 +87,34 @@ void sysbus_mmio_map_overlap(SysBusDevice *dev, int n,
hwaddr addr,
sysbus_mmio_map_common(dev, n, addr, true, priority);
}
+static void sysbus_property_set_uint64_ptr(Object *obj, Visitor *v,
+ void *opaque, const char *name,
+ Error **errp)
+{
+ uint64_t *valp = opaque;
+
+ if (*valp != SYSBUS_DYNAMIC) {
+ error_setg(errp, "Attempt to set property '%s' twice", name);
+ return;
+ }
+
+ object_property_set_uint64_ptr(obj, v, opaque, name, errp);
+}
+
+static void sysbus_init_int64_prop(SysBusDevice *dev, const char *propstr,
+ int n)
+{
+ char *name = g_strdup_printf(propstr, n);
+ Object *obj = OBJECT(dev);
+ uint64_t *user_val = g_new(uint64_t, 1);
+
+ *user_val = SYSBUS_DYNAMIC;
+
+ object_property_add(obj, name, "uint64", object_property_get_uint64_ptr,
+ sysbus_property_set_uint64_ptr,
+ object_property_release_g_free, user_val, NULL);
+}
+
/* Request an IRQ source. The actual IRQ object may be populated later. */
void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p)
{
@@ -94,6 +123,8 @@ void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p)
assert(dev->num_irq < QDEV_MAX_IRQ);
n = dev->num_irq++;
dev->irqp[n] = p;
+
+ sysbus_init_int64_prop(dev, "irq[%d]", n);
}
/* Pass IRQs from a target device. */
@@ -101,9 +132,8 @@ void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice
*target)
{
int i;
assert(dev->num_irq == 0);
- dev->num_irq = target->num_irq;
for (i = 0; i < dev->num_irq; i++) {
- dev->irqp[i] = target->irqp[i];
+ sysbus_init_irq(dev, target->irqp[i]);
}
}
@@ -115,6 +145,8 @@ void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion
*memory)
n = dev->num_mmio++;
dev->mmio[n].addr = -1;
dev->mmio[n].memory = memory;
+
+ sysbus_init_int64_prop(dev, "mmio[%d]", n);
}
MemoryRegion *sysbus_mmio_get_region(SysBusDevice *dev, int n)
@@ -127,8 +159,13 @@ void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t
ioport, pio_addr_t size)
pio_addr_t i;
for (i = 0; i < size; i++) {
+ int n;
+
assert(dev->num_pio < QDEV_MAX_PIO);
- dev->pio[dev->num_pio++] = ioport++;
+ n = dev->num_pio++;
+ dev->pio[n] = ioport++;
+
+ sysbus_init_int64_prop(dev, "pio[%d]", n);
}
}
diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index f5aaa05..533184a 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -9,6 +9,7 @@
#define QDEV_MAX_MMIO 32
#define QDEV_MAX_PIO 32
#define QDEV_MAX_IRQ 512
+#define SYSBUS_DYNAMIC -1ULL
#define TYPE_SYSTEM_BUS "System"
#define SYSTEM_BUS(obj) OBJECT_CHECK(IDEBus, (obj), TYPE_IDE_BUS)
--
1.8.1.4
- [Qemu-ppc] [PATCH v2 4/9] qom: Add generic object property g_free helper, (continued)
- [Qemu-ppc] [PATCH v2 4/9] qom: Add generic object property g_free helper, Alexander Graf, 2014/07/02
- [Qemu-ppc] [PATCH v2 7/9] PPC: e500: Support dynamically spawned sysbus devices, Alexander Graf, 2014/07/02
- [Qemu-ppc] [PATCH v2 8/9] e500: Add support for eTSEC in device tree, Alexander Graf, 2014/07/02
- [Qemu-ppc] [PATCH v2 6/9] sysbus: Make devices spawnable via -device, Alexander Graf, 2014/07/02
- [Qemu-ppc] [PATCH v2 9/9] PPC: Fix default config ordering and add eTSEC for ppc64, Alexander Graf, 2014/07/02
- [Qemu-ppc] [PATCH v2 1/9] qom: Move property helpers to own file, Alexander Graf, 2014/07/02
- [Qemu-ppc] [PATCH v2 5/9] sysbus: Add user map hints,
Alexander Graf <=
- [Qemu-ppc] [PATCH v2 3/9] qom: Expose property helpers for get/set of integers, Alexander Graf, 2014/07/02