diff mbox

[5/6] exynos4: Further QOM'ify machines

Message ID 1442677004-4482-6-git-send-email-afaerber@suse.de
State New
Headers show

Commit Message

Andreas Färber Sept. 19, 2015, 3:36 p.m. UTC
Drop board enumeration in favor of an abstract type, and move static
tables into class initialization.

Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 hw/arm/exynos4_boards.c | 71 ++++++++++++++++++++++++++-----------------------
 1 file changed, 38 insertions(+), 33 deletions(-)
diff mbox

Patch

diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 336c8b2..ec7f235 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -46,26 +46,17 @@ 
 
 #define SMDK_LAN9118_BASE_ADDR      0x05000000
 
-typedef enum Exynos4BoardType {
-    EXYNOS4_BOARD_NURI,
-    EXYNOS4_BOARD_SMDKC210,
-    EXYNOS4_NUM_OF_BOARDS
-} Exynos4BoardType;
-
-static int exynos4_board_id[EXYNOS4_NUM_OF_BOARDS] = {
-    [EXYNOS4_BOARD_NURI]     = 0xD33,
-    [EXYNOS4_BOARD_SMDKC210] = 0xB16,
-};
+typedef struct Exynos4MachineClass {
+    MachineClass parent_class;
 
-static int exynos4_board_smp_bootreg_addr[EXYNOS4_NUM_OF_BOARDS] = {
-    [EXYNOS4_BOARD_NURI]     = EXYNOS4210_SECOND_CPU_BOOTREG,
-    [EXYNOS4_BOARD_SMDKC210] = EXYNOS4210_SECOND_CPU_BOOTREG,
-};
+    int id;
+    int smp_bootreg_addr;
+    unsigned long ram_size;
+} Exynos4MachineClass;
 
-static unsigned long exynos4_board_ram_size[EXYNOS4_NUM_OF_BOARDS] = {
-    [EXYNOS4_BOARD_NURI]     = 0x40000000,
-    [EXYNOS4_BOARD_SMDKC210] = 0x40000000,
-};
+#define TYPE_EXYNOS4_MACHINE MACHINE_TYPE_NAME("exynos4")
+#define EXYNOS4_MACHINE_CLASS(cls) \
+    OBJECT_CLASS_CHECK(Exynos4MachineClass, (cls), TYPE_EXYNOS4_MACHINE)
 
 static struct arm_boot_info exynos4_board_binfo = {
     .loader_start     = EXYNOS4210_BASE_BOOT_ADDR,
@@ -92,10 +83,10 @@  static void lan9215_init(uint32_t base, qemu_irq irq)
     }
 }
 
-static Exynos4210State *exynos4_boards_init_common(MachineState *machine,
-                                                   Exynos4BoardType board_type)
+static Exynos4210State *exynos4_boards_init_common(MachineState *machine)
 {
     MachineClass *mc = MACHINE_GET_CLASS(machine);
+    Exynos4MachineClass *emc = EXYNOS4_MACHINE_CLASS(mc);
 
     if (smp_cpus != EXYNOS4210_NCPUS && !qtest_enabled()) {
         fprintf(stderr, "%s board supports only %d CPU cores. Ignoring smp_cpus"
@@ -103,10 +94,9 @@  static Exynos4210State *exynos4_boards_init_common(MachineState *machine,
                 mc->name, EXYNOS4210_NCPUS);
     }
 
-    exynos4_board_binfo.ram_size = exynos4_board_ram_size[board_type];
-    exynos4_board_binfo.board_id = exynos4_board_id[board_type];
-    exynos4_board_binfo.smp_bootreg_addr =
-            exynos4_board_smp_bootreg_addr[board_type];
+    exynos4_board_binfo.ram_size = emc->ram_size;
+    exynos4_board_binfo.board_id = emc->id;
+    exynos4_board_binfo.smp_bootreg_addr = emc->smp_bootreg_addr;
     exynos4_board_binfo.kernel_filename = machine->kernel_filename;
     exynos4_board_binfo.initrd_filename = machine->initrd_filename;
     exynos4_board_binfo.kernel_cmdline = machine->kernel_cmdline;
@@ -117,27 +107,24 @@  static Exynos4210State *exynos4_boards_init_common(MachineState *machine,
             " kernel_filename: %s\n"
             " kernel_cmdline: %s\n"
             " initrd_filename: %s\n",
-            exynos4_board_ram_size[board_type] / 1048576,
-            exynos4_board_ram_size[board_type],
+            emc->ram_size / 1048576, emc->ram_size,
             machine->kernel_filename,
             machine->kernel_cmdline,
             machine->initrd_filename);
 
-    return exynos4210_init(get_system_memory(),
-            exynos4_board_ram_size[board_type]);
+    return exynos4210_init(get_system_memory(), emc->ram_size);
 }
 
 static void nuri_init(MachineState *machine)
 {
-    exynos4_boards_init_common(machine, EXYNOS4_BOARD_NURI);
+    exynos4_boards_init_common(machine);
 
     arm_load_kernel(ARM_CPU(first_cpu), &exynos4_board_binfo);
 }
 
 static void smdkc210_init(MachineState *machine)
 {
-    Exynos4210State *s = exynos4_boards_init_common(machine,
-                                                    EXYNOS4_BOARD_SMDKC210);
+    Exynos4210State *s = exynos4_boards_init_common(machine);
 
     lan9215_init(SMDK_LAN9118_BASE_ADDR,
             qemu_irq_invert(s->irq_table[exynos4210_get_irq(37, 1)]));
@@ -147,35 +134,53 @@  static void smdkc210_init(MachineState *machine)
 static void nuri_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
+    Exynos4MachineClass *emc = EXYNOS4_MACHINE_CLASS(oc);
 
     mc->desc = "Samsung NURI board (Exynos4210)";
     mc->init = nuri_init;
     mc->max_cpus = EXYNOS4210_NCPUS;
+
+    emc->id = 0xD33;
+    emc->smp_bootreg_addr = EXYNOS4210_SECOND_CPU_BOOTREG;
+    emc->ram_size = 0x40000000;
 }
 
 static const TypeInfo nuri_type = {
     .name = MACHINE_TYPE_NAME("nuri"),
-    .parent = TYPE_MACHINE,
+    .parent = TYPE_EXYNOS4_MACHINE,
     .class_init = nuri_class_init,
 };
 
 static void smdkc210_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
+    Exynos4MachineClass *emc = EXYNOS4_MACHINE_CLASS(oc);
 
     mc->desc = "Samsung SMDKC210 board (Exynos4210)";
     mc->init = smdkc210_init;
     mc->max_cpus = EXYNOS4210_NCPUS;
+
+    emc->id = 0xB16;
+    emc->smp_bootreg_addr = EXYNOS4210_SECOND_CPU_BOOTREG;
+    emc->ram_size = 0x40000000;
 }
 
 static const TypeInfo smdkc210_type = {
     .name = MACHINE_TYPE_NAME("smdkc210"),
-    .parent = TYPE_MACHINE,
+    .parent = TYPE_EXYNOS4_MACHINE,
     .class_init = smdkc210_class_init,
 };
 
+static const TypeInfo exynos4_machine_type = {
+    .name = TYPE_EXYNOS4_MACHINE,
+    .parent = TYPE_MACHINE,
+    .abstract = true,
+    .class_size = sizeof(Exynos4MachineClass),
+};
+
 static void exynos4_machines_init(void)
 {
+    type_register_static(&exynos4_machine_type);
     type_register_static(&nuri_type);
     type_register_static(&smdkc210_type);
 }