[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH RFC 08/15] cpu/a9mpcore: Embed ARMMPTimerState
From: |
Andreas Färber |
Subject: |
[Qemu-devel] [PATCH RFC 08/15] cpu/a9mpcore: Embed ARMMPTimerState |
Date: |
Sun, 30 Jun 2013 23:00:58 +0200 |
From: Andreas Färber <address@hidden>
Prepares for QOM realize.
Signed-off-by: Andreas Färber <address@hidden>
---
hw/cpu/a9mpcore.c | 46 +++++++++++++++++++++--------------
hw/timer/arm_mptimer.c | 35 ++++-----------------------
include/hw/timer/arm_mptimer.h | 54 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 86 insertions(+), 49 deletions(-)
create mode 100644 include/hw/timer/arm_mptimer.h
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
index b7148fa..48f5897 100644
--- a/hw/cpu/a9mpcore.c
+++ b/hw/cpu/a9mpcore.c
@@ -11,6 +11,7 @@
#include "hw/sysbus.h"
#include "hw/intc/gic_internal.h"
#include "hw/misc/a9scu.h"
+#include "hw/timer/arm_mptimer.h"
#define TYPE_A9MPCORE_PRIV "a9mpcore_priv"
#define A9MPCORE_PRIV(obj) \
@@ -23,12 +24,12 @@ typedef struct A9MPPrivState {
uint32_t num_cpu;
MemoryRegion container;
- DeviceState *mptimer;
- DeviceState *wdt;
uint32_t num_irq;
GICState gic;
A9SCUState scu;
+ ARMMPTimerState mptimer;
+ ARMMPTimerState wdt;
} A9MPPrivState;
static void a9mp_priv_set_irq(void *opaque, int irq, int level)
@@ -54,12 +55,28 @@ static void a9mp_priv_initfn(Object *obj)
sbd = SYS_BUS_DEVICE(&s->scu);
memory_region_add_subregion(&s->container, 0,
sysbus_mmio_get_region(sbd, 0));
+
+ object_initialize(&s->mptimer, TYPE_ARM_MP_TIMER);
+ qdev_set_parent_bus(DEVICE(&s->mptimer), sysbus_get_default());
+
+ object_initialize(&s->wdt, TYPE_ARM_MP_TIMER);
+ qdev_set_parent_bus(DEVICE(&s->wdt), sysbus_get_default());
+
+ /* Note that the A9 exposes only the "timer/watchdog for this core"
+ * memory region, not the "timer/watchdog for core X" ones 11MPcore has.
+ */
+ sbd = SYS_BUS_DEVICE(&s->mptimer);
+ memory_region_add_subregion(&s->container, 0x600,
+ sysbus_mmio_get_region(sbd, 0));
+ sbd = SYS_BUS_DEVICE(&s->wdt);
+ memory_region_add_subregion(&s->container, 0x620,
+ sysbus_mmio_get_region(sbd, 0));
}
static int a9mp_priv_init(SysBusDevice *dev)
{
A9MPPrivState *s = A9MPCORE_PRIV(dev);
- DeviceState *gicdev, *scudev;
+ DeviceState *gicdev, *scudev, *mptimerdev, *wdtdev;
SysBusDevice *timerbusdev, *wdtbusdev, *gicbusdev;
int i;
@@ -79,15 +96,15 @@ static int a9mp_priv_init(SysBusDevice *dev)
qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
qdev_init_nofail(scudev);
- s->mptimer = qdev_create(NULL, "arm_mptimer");
- qdev_prop_set_uint32(s->mptimer, "num-cpu", s->num_cpu);
- qdev_init_nofail(s->mptimer);
- timerbusdev = SYS_BUS_DEVICE(s->mptimer);
+ mptimerdev = DEVICE(&s->mptimer);
+ qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
+ qdev_init_nofail(mptimerdev);
+ timerbusdev = SYS_BUS_DEVICE(&s->mptimer);
- s->wdt = qdev_create(NULL, "arm_mptimer");
- qdev_prop_set_uint32(s->wdt, "num-cpu", s->num_cpu);
- qdev_init_nofail(s->wdt);
- wdtbusdev = SYS_BUS_DEVICE(s->wdt);
+ wdtdev = DEVICE(&s->wdt);
+ qdev_prop_set_uint32(wdtdev, "num-cpu", s->num_cpu);
+ qdev_init_nofail(wdtdev);
+ wdtbusdev = SYS_BUS_DEVICE(&s->wdt);
/* Memory map (addresses are offsets from PERIPHBASE):
* 0x0000-0x00ff -- Snoop Control Unit
@@ -103,13 +120,6 @@ static int a9mp_priv_init(SysBusDevice *dev)
/* GIC CPU interface */
memory_region_add_subregion(&s->container, 0x100,
sysbus_mmio_get_region(gicbusdev, 1));
- /* Note that the A9 exposes only the "timer/watchdog for this core"
- * memory region, not the "timer/watchdog for core X" ones 11MPcore has.
- */
- memory_region_add_subregion(&s->container, 0x600,
- sysbus_mmio_get_region(timerbusdev, 0));
- memory_region_add_subregion(&s->container, 0x620,
- sysbus_mmio_get_region(wdtbusdev, 0));
memory_region_add_subregion(&s->container, 0x1000,
sysbus_mmio_get_region(gicbusdev, 0));
diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
index a19ffa3..5558f40 100644
--- a/hw/timer/arm_mptimer.c
+++ b/hw/timer/arm_mptimer.c
@@ -19,41 +19,13 @@
* with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#include "hw/sysbus.h"
+#include "hw/timer/arm_mptimer.h"
#include "qemu/timer.h"
/* This device implements the per-cpu private timer and watchdog block
* which is used in both the ARM11MPCore and Cortex-A9MP.
*/
-#define MAX_CPUS 4
-
-/* State of a single timer or watchdog block */
-typedef struct {
- uint32_t count;
- uint32_t load;
- uint32_t control;
- uint32_t status;
- int64_t tick;
- QEMUTimer *timer;
- qemu_irq irq;
- MemoryRegion iomem;
-} TimerBlock;
-
-#define TYPE_ARM_MP_TIMER "arm_mptimer"
-#define ARM_MP_TIMER(obj) \
- OBJECT_CHECK(ARMMPTimerState, (obj), TYPE_ARM_MP_TIMER)
-
-typedef struct {
- /*< private >*/
- SysBusDevice parent_obj;
- /*< public >*/
-
- uint32_t num_cpu;
- TimerBlock timerblock[MAX_CPUS];
- MemoryRegion iomem;
-} ARMMPTimerState;
-
static inline int get_current_cpu(ARMMPTimerState *s)
{
CPUState *cpu_single_cpu = ENV_GET_CPU(cpu_single_env);
@@ -241,8 +213,9 @@ static void arm_mptimer_realize(DeviceState *dev, Error
**errp)
ARMMPTimerState *s = ARM_MP_TIMER(dev);
int i;
- if (s->num_cpu < 1 || s->num_cpu > MAX_CPUS) {
- hw_error("%s: num-cpu must be between 1 and %d\n", __func__, MAX_CPUS);
+ if (s->num_cpu < 1 || s->num_cpu > ARM_MPTIMER_MAX_CPUS) {
+ hw_error("%s: num-cpu must be between 1 and %d\n",
+ __func__, ARM_MPTIMER_MAX_CPUS);
}
/* We implement one timer block per CPU, and expose multiple MMIO regions:
* * region 0 is "timer for this core"
diff --git a/include/hw/timer/arm_mptimer.h b/include/hw/timer/arm_mptimer.h
new file mode 100644
index 0000000..40a5fee
--- /dev/null
+++ b/include/hw/timer/arm_mptimer.h
@@ -0,0 +1,54 @@
+/*
+ * Private peripheral timer/watchdog blocks for ARM 11MPCore and A9MP
+ *
+ * Copyright (c) 2006-2007 CodeSourcery.
+ * Copyright (c) 2011 Linaro Limited
+ * Written by Paul Brook, Peter Maydell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef HW_TIMER_ARM_MPTIMER_H
+#define HW_TIMER_ARM_MPTIMER_H
+
+#include "hw/sysbus.h"
+
+#define ARM_MPTIMER_MAX_CPUS 4
+
+/* State of a single timer or watchdog block */
+typedef struct {
+ uint32_t count;
+ uint32_t load;
+ uint32_t control;
+ uint32_t status;
+ int64_t tick;
+ QEMUTimer *timer;
+ qemu_irq irq;
+ MemoryRegion iomem;
+} TimerBlock;
+
+#define TYPE_ARM_MP_TIMER "arm_mptimer"
+#define ARM_MP_TIMER(obj) \
+ OBJECT_CHECK(ARMMPTimerState, (obj), TYPE_ARM_MP_TIMER)
+
+typedef struct {
+ /*< private >*/
+ SysBusDevice parent_obj;
+ /*< public >*/
+
+ uint32_t num_cpu;
+ TimerBlock timerblock[ARM_MPTIMER_MAX_CPUS];
+ MemoryRegion iomem;
+} ARMMPTimerState;
+
+#endif
--
1.8.1.4
- [Qemu-devel] [PATCH RFC 00/15] arm: A9MPCore+A15MPCore QOM'ification, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 02/15] cpu/a9mpcore: Split off instance_init, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 03/15] cpu/a9mpcore: Embed GICState, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 01/15] cpu/a9mpcore: QOM casting cleanup, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 05/15] cpu/a9mpcore: Embed A9SCUState, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 04/15] misc/a9scu: QOM cleanups, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 07/15] timer/arm_mptimer: Convert to QOM realize, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 06/15] timer/arm_mptimer: QOM cast cleanup, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 10/15] cpu/a9mpcore: Prepare for QOM embedding, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 09/15] cpu/a9mpcore: Convert to QOM realize, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 08/15] cpu/a9mpcore: Embed ARMMPTimerState,
Andreas Färber <=
- [Qemu-devel] [PATCH RFC 11/15] cpu/a15mpcore: QOM cast cleanup, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 12/15] cpu/a15mpcore: Split off instance_init, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 13/15] cpu/a15mpcore: Embed GICState, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 14/15] cpu/a15mpcore: Convert to QOM realize, Andreas Färber, 2013/06/30
- [Qemu-devel] [PATCH RFC 15/15] cpu/a15mpcore: Prepare for QOM embedding, Andreas Färber, 2013/06/30