qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC v1 1/2] arm: Add the cortex-a9 CPU to the a9mpcore dev


From: Alistair Francis
Subject: [Qemu-devel] [RFC v1 1/2] arm: Add the cortex-a9 CPU to the a9mpcore device
Date: Tue, 10 Jun 2014 11:32:57 +1000

This patch adds the Cortex-A9 ARM CPU to the A9MPCore. It
first does a check to make sure no other CPUs exist and if
they do the Cortex-A9 won't be added. This is implemented to
maintain compatibility and can be removed once all machines
have been updated

This patch also allows the midr and reset-property to be set

Signed-off-by: Alistair Francis <address@hidden>
---
There comments in the code explaining the reason that the CPU
is initiated in the realize function. This is because it relies
on the num_cpu property, which isn't yet set in the initfn
Is this an acceptable compromise?

 hw/cpu/a9mpcore.c         |   43 +++++++++++++++++++++++++++++++++++++++++++
 include/hw/cpu/a9mpcore.h |    4 ++++
 2 files changed, 47 insertions(+), 0 deletions(-)

diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
index c09358c..1159044 100644
--- a/hw/cpu/a9mpcore.c
+++ b/hw/cpu/a9mpcore.c
@@ -21,6 +21,12 @@ static void a9mp_priv_initfn(Object *obj)
 {
     A9MPPrivState *s = A9MPCORE_PRIV(obj);
 
+    /* Ideally would init the CPUs here, but the num_cpu property has not been
+     * set yet. So that only works if assuming a single CPU
+     * object_initialize(&s->cpu, sizeof(s->cpu), "cortex-a9-" TYPE_ARM_CPU);
+     * object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL);
+     */
+
     memory_region_init(&s->container, obj, "a9mp-priv-container", 0x2000);
     sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->container);
 
@@ -50,6 +56,40 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
     Error *err = NULL;
     int i;
 
+    /* Just a temporary measure to not break machines that init the CPU
+     * seperatly */
+    if (!first_cpu) {
+        s->cpu = g_malloc(sizeof(ARMCPU) * s->num_cpu);
+        for (i = 0; i < s->num_cpu; i++) {
+            object_initialize((s->cpu + i), sizeof(*(s->cpu + i)),
+                              "cortex-a9-" TYPE_ARM_CPU);
+
+            if (s->midr) {
+                object_property_set_int(OBJECT((s->cpu + i)), s->midr,
+                                        "midr", &err);
+                if (err) {
+                    error_propagate(errp, err);
+                    exit(1);
+                }
+            }
+            if (s->reset_cbar) {
+                object_property_set_int(OBJECT((s->cpu + i)), s->reset_cbar,
+                                        "reset-cbar", &err);
+                if (err) {
+                    error_propagate(errp, err);
+                    exit(1);
+                }
+            }
+            object_property_set_bool(OBJECT((s->cpu + i)), true,
+                                     "realized", &err);
+            if (err) {
+                error_propagate(errp, err);
+                return;
+            }
+        }
+        g_free(s->cpu);
+    }
+
     scudev = DEVICE(&s->scu);
     qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
     object_property_set_bool(OBJECT(&s->scu), true, "realized", &err);
@@ -152,6 +192,9 @@ static Property a9mp_priv_properties[] = {
      * Other boards may differ and should set this property appropriately.
      */
     DEFINE_PROP_UINT32("num-irq", A9MPPrivState, num_irq, 96),
+    /* Properties for the A9 CPU */
+    DEFINE_PROP_UINT32("midr", A9MPPrivState, midr, 0),
+    DEFINE_PROP_UINT64("reset-cbar", A9MPPrivState, reset_cbar, 0),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/include/hw/cpu/a9mpcore.h b/include/hw/cpu/a9mpcore.h
index 5d67ca2..8e395a4 100644
--- a/include/hw/cpu/a9mpcore.h
+++ b/include/hw/cpu/a9mpcore.h
@@ -29,6 +29,10 @@ typedef struct A9MPPrivState {
     MemoryRegion container;
     uint32_t num_irq;
 
+    ARMCPU *cpu;
+    uint32_t midr;
+    uint64_t reset_cbar;
+
     A9SCUState scu;
     GICState gic;
     A9GTimerState gtimer;
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]