xref: /qemu/hw/arm/cubieboard.c (revision a01c005327007562f3313f3efe235f77309db809)
1*a01c0053Sliguang /*
2*a01c0053Sliguang  * cubieboard emulation
3*a01c0053Sliguang  *
4*a01c0053Sliguang  * Copyright (C) 2013 Li Guang
5*a01c0053Sliguang  * Written by Li Guang <lig.fnst@cn.fujitsu.com>
6*a01c0053Sliguang  *
7*a01c0053Sliguang  * This program is free software; you can redistribute it and/or modify it
8*a01c0053Sliguang  * under the terms of the GNU General Public License as published by the
9*a01c0053Sliguang  * Free Software Foundation; either version 2 of the License, or
10*a01c0053Sliguang  * (at your option) any later version.
11*a01c0053Sliguang  *
12*a01c0053Sliguang  * This program is distributed in the hope that it will be useful, but WITHOUT
13*a01c0053Sliguang  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14*a01c0053Sliguang  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15*a01c0053Sliguang  * for more details.
16*a01c0053Sliguang  */
17*a01c0053Sliguang 
18*a01c0053Sliguang #include "hw/sysbus.h"
19*a01c0053Sliguang #include "hw/devices.h"
20*a01c0053Sliguang #include "hw/boards.h"
21*a01c0053Sliguang #include "hw/arm/allwinner-a10.h"
22*a01c0053Sliguang 
23*a01c0053Sliguang static struct arm_boot_info cubieboard_binfo = {
24*a01c0053Sliguang     .loader_start = AW_A10_SDRAM_BASE,
25*a01c0053Sliguang     .board_id = 0x1008,
26*a01c0053Sliguang };
27*a01c0053Sliguang 
28*a01c0053Sliguang typedef struct CubieBoardState {
29*a01c0053Sliguang     AwA10State *a10;
30*a01c0053Sliguang     MemoryRegion sdram;
31*a01c0053Sliguang } CubieBoardState;
32*a01c0053Sliguang 
33*a01c0053Sliguang static void cubieboard_init(QEMUMachineInitArgs *args)
34*a01c0053Sliguang {
35*a01c0053Sliguang     CubieBoardState *s = g_new(CubieBoardState, 1);
36*a01c0053Sliguang     Error *err = NULL;
37*a01c0053Sliguang 
38*a01c0053Sliguang     s->a10 = AW_A10(object_new(TYPE_AW_A10));
39*a01c0053Sliguang     object_property_set_bool(OBJECT(s->a10), true, "realized", &err);
40*a01c0053Sliguang     if (err != NULL) {
41*a01c0053Sliguang         error_report("Couldn't realize Allwinner A10: %s\n",
42*a01c0053Sliguang                 error_get_pretty(err));
43*a01c0053Sliguang         exit(1);
44*a01c0053Sliguang     }
45*a01c0053Sliguang 
46*a01c0053Sliguang     memory_region_init_ram(&s->sdram, NULL, "cubieboard.ram", args->ram_size);
47*a01c0053Sliguang     vmstate_register_ram_global(&s->sdram);
48*a01c0053Sliguang     memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
49*a01c0053Sliguang                                 &s->sdram);
50*a01c0053Sliguang 
51*a01c0053Sliguang     cubieboard_binfo.ram_size = args->ram_size;
52*a01c0053Sliguang     cubieboard_binfo.kernel_filename = args->kernel_filename;
53*a01c0053Sliguang     cubieboard_binfo.kernel_cmdline = args->kernel_cmdline;
54*a01c0053Sliguang     arm_load_kernel(&s->a10->cpu, &cubieboard_binfo);
55*a01c0053Sliguang }
56*a01c0053Sliguang 
57*a01c0053Sliguang static QEMUMachine cubieboard_machine = {
58*a01c0053Sliguang     .name = "cubieboard",
59*a01c0053Sliguang     .desc = "cubietech cubieboard",
60*a01c0053Sliguang     .init = cubieboard_init,
61*a01c0053Sliguang };
62*a01c0053Sliguang 
63*a01c0053Sliguang 
64*a01c0053Sliguang static void cubieboard_machine_init(void)
65*a01c0053Sliguang {
66*a01c0053Sliguang     qemu_register_machine(&cubieboard_machine);
67*a01c0053Sliguang }
68*a01c0053Sliguang 
69*a01c0053Sliguang machine_init(cubieboard_machine_init)
70