summary refs log tree commit diff stats
path: root/hw/realview.c
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2009-11-13 04:31:22 +0000
committerPaul Brook <paul@codesourcery.com>2009-11-13 04:31:22 +0000
commitc988bfadc9cabb441cfc70cb011df5ee26f2ec5f (patch)
treef800d27336f6b409693b577157932d07478f4f48 /hw/realview.c
parent26e92f65525ef4446a500d85e185cf78835922aa (diff)
downloadfocaccia-qemu-c988bfadc9cabb441cfc70cb011df5ee26f2ec5f.tar.gz
focaccia-qemu-c988bfadc9cabb441cfc70cb011df5ee26f2ec5f.zip
ARM MPCore tweaks
Allow the user to specify the number of cores present on the
RealView EB + ARM11MPCore board.  Also split into its own config
rather than guessing from the CPU name.

Signed-off-by: Paul Brook <paul@codesourcery.com>
Diffstat (limited to 'hw/realview.c')
-rw-r--r--hw/realview.c84
1 files changed, 58 insertions, 26 deletions
diff --git a/hw/realview.c b/hw/realview.c
index a14c8a08c9..0e57b50854 100644
--- a/hw/realview.c
+++ b/hw/realview.c
@@ -35,14 +35,21 @@ static void secondary_cpu_reset(void *opaque)
   env->regs[15] = 0x80000000;
 }
 
+enum realview_board_type {
+    BOARD_EB,
+    BOARD_EB_MPCORE
+};
+
 static void realview_init(ram_addr_t ram_size,
                      const char *boot_device,
                      const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+                     const char *initrd_filename, const char *cpu_model,
+                     enum realview_board_type board_type)
 {
-    CPUState *env;
+    CPUState *env = NULL;
     ram_addr_t ram_offset;
     DeviceState *dev;
+    SysBusDevice *busdev;
     qemu_irq *irqp;
     qemu_irq pic[64];
     PCIBus *pci_bus;
@@ -50,19 +57,10 @@ static void realview_init(ram_addr_t ram_size,
     int n;
     int done_smc = 0;
     qemu_irq cpu_irq[4];
-    int ncpu;
+    int is_mpcore = (board_type == BOARD_EB_MPCORE);
     uint32_t proc_id = 0;
 
-    if (!cpu_model)
-        cpu_model = "arm926";
-    /* FIXME: obey smp_cpus.  */
-    if (strcmp(cpu_model, "arm11mpcore") == 0) {
-        ncpu = 4;
-    } else {
-        ncpu = 1;
-    }
-
-    for (n = 0; n < ncpu; n++) {
+    for (n = 0; n < smp_cpus; n++) {
         env = cpu_init(cpu_model);
         if (!env) {
             fprintf(stderr, "Unable to find CPU definition\n");
@@ -91,15 +89,16 @@ static void realview_init(ram_addr_t ram_size,
 
     arm_sysctl_init(0x10000000, 0xc1400400, proc_id);
 
-    if (ncpu == 1) {
-        /* ??? The documentation says GIC1 is nFIQ and either GIC2 or GIC3
-           is nIRQ (there are inconsistencies).  However Linux 2.6.17 expects
-           GIC1 to be nIRQ and ignores all the others, so do that for now.  */
-        dev = sysbus_create_simple("realview_gic", 0x10040000, cpu_irq[0]);
+    if (is_mpcore) {
+        dev = qdev_create(NULL, "realview_mpcore");
+        qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
+        qdev_init_nofail(dev);
+        busdev = sysbus_from_qdev(dev);
+        for (n = 0; n < smp_cpus; n++) {
+            sysbus_connect_irq(busdev, n, cpu_irq[n]);
+        }
     } else {
-        dev = sysbus_create_varargs("realview_mpcore", -1,
-                                    cpu_irq[0], cpu_irq[1], cpu_irq[2],
-                                    cpu_irq[3], NULL);
+        dev = sysbus_create_simple("realview_gic", 0x10040000, cpu_irq[0]);
     }
     for (n = 0; n < 64; n++) {
         pic[n] = qdev_get_gpio_in(dev, n);
@@ -210,20 +209,53 @@ static void realview_init(ram_addr_t ram_size,
     realview_binfo.kernel_filename = kernel_filename;
     realview_binfo.kernel_cmdline = kernel_cmdline;
     realview_binfo.initrd_filename = initrd_filename;
-    realview_binfo.nb_cpus = ncpu;
+    realview_binfo.nb_cpus = smp_cpus;
     arm_load_kernel(first_cpu, &realview_binfo);
 }
 
-static QEMUMachine realview_machine = {
-    .name = "realview",
+static void realview_eb_init(ram_addr_t ram_size,
+                     const char *boot_device,
+                     const char *kernel_filename, const char *kernel_cmdline,
+                     const char *initrd_filename, const char *cpu_model)
+{
+    if (!cpu_model) {
+        cpu_model = "arm926";
+    }
+    realview_init(ram_size, boot_device, kernel_filename, kernel_cmdline,
+                  initrd_filename, cpu_model, BOARD_EB);
+}
+
+static void realview_eb_mpcore_init(ram_addr_t ram_size,
+                     const char *boot_device,
+                     const char *kernel_filename, const char *kernel_cmdline,
+                     const char *initrd_filename, const char *cpu_model)
+{
+    if (!cpu_model) {
+        cpu_model = "arm11mpcore";
+    }
+    realview_init(ram_size, boot_device, kernel_filename, kernel_cmdline,
+                  initrd_filename, cpu_model, BOARD_EB_MPCORE);
+}
+
+static QEMUMachine realview_eb_machine = {
+    .name = "realview-eb",
     .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
-    .init = realview_init,
+    .init = realview_eb_init,
+    .use_scsi = 1,
+};
+
+static QEMUMachine realview_eb_mpcore_machine = {
+    .name = "realview-eb-mpcore",
+    .desc = "ARM RealView Emulation Baseboard (ARM11MPCore)",
+    .init = realview_eb_mpcore_init,
     .use_scsi = 1,
+    .max_cpus = 4,
 };
 
 static void realview_machine_init(void)
 {
-    qemu_register_machine(&realview_machine);
+    qemu_register_machine(&realview_eb_machine);
+    qemu_register_machine(&realview_eb_mpcore_machine);
 }
 
 machine_init(realview_machine_init);