From patchwork Sat Sep 19 15:36:42 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andreas_F=C3=A4rber?= X-Patchwork-Id: 519765 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 6997D14016A for ; Sun, 20 Sep 2015 01:40:25 +1000 (AEST) Received: from localhost ([::1]:46659 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZdKFT-0005Or-F4 for incoming@patchwork.ozlabs.org; Sat, 19 Sep 2015 11:40:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57661) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZdKC3-0007pp-VH for qemu-devel@nongnu.org; Sat, 19 Sep 2015 11:36:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZdKC2-00060V-KQ for qemu-devel@nongnu.org; Sat, 19 Sep 2015 11:36:51 -0400 Received: from mx2.suse.de ([195.135.220.15]:42791) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZdKC2-00060A-AR for qemu-devel@nongnu.org; Sat, 19 Sep 2015 11:36:50 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id CC633AD9B; Sat, 19 Sep 2015 15:36:49 +0000 (UTC) From: =?UTF-8?q?Andreas=20F=C3=A4rber?= To: qemu-devel@nongnu.org Date: Sat, 19 Sep 2015 17:36:42 +0200 Message-Id: <1442677004-4482-6-git-send-email-afaerber@suse.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1442677004-4482-1-git-send-email-afaerber@suse.de> References: <1442677004-4482-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] X-Received-From: 195.135.220.15 Cc: Peter Maydell , Evgeny Voevodin , Igor Mitsyanko , Dmitry Solodkiy , Maksim Kozlov , =?UTF-8?q?Andreas=20F=C3=A4rber?= Subject: [Qemu-devel] [PATCH 5/6] exynos4: Further QOM'ify machines X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Drop board enumeration in favor of an abstract type, and move static tables into class initialization. Signed-off-by: Andreas Färber --- hw/arm/exynos4_boards.c | 71 ++++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 33 deletions(-) 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); }