blob: d57306d3adb6753f832d98a1b76ae63eae2f7d97 [file] [log] [blame]
ths5fafdf22007-09-16 21:08:06 +00001/*
pbrook06338792007-05-23 19:58:11 +00002 * Arnewsh 5206 ColdFire system emulation.
3 *
4 * Copyright (c) 2007 CodeSourcery.
5 *
Matthew Fernandez8e31bf32011-06-26 12:21:35 +10006 * This code is licensed under the GPL
pbrook06338792007-05-23 19:58:11 +00007 */
8
pbrook87ecb682007-11-17 17:14:51 +00009#include "hw.h"
10#include "mcf.h"
pbrook87ecb682007-11-17 17:14:51 +000011#include "boards.h"
Blue Swirlca20cf32009-09-20 14:58:02 +000012#include "loader.h"
13#include "elf.h"
Avi Kivity72e4d252011-07-25 14:14:31 +030014#include "exec-memory.h"
pbrook06338792007-05-23 19:58:11 +000015
16#define KERNEL_LOAD_ADDR 0x10000
17#define AN5206_MBAR_ADDR 0x10000000
18#define AN5206_RAMBAR_ADDR 0x20000000
19
pbrook06338792007-05-23 19:58:11 +000020/* Board init. */
21
Anthony Liguoric227f092009-10-01 16:12:16 -050022static void an5206_init(ram_addr_t ram_size,
aliguori3023f3322009-01-16 19:04:14 +000023 const char *boot_device,
pbrook06338792007-05-23 19:58:11 +000024 const char *kernel_filename, const char *kernel_cmdline,
25 const char *initrd_filename, const char *cpu_model)
26{
27 CPUState *env;
28 int kernel_size;
29 uint64_t elf_entry;
Anthony Liguoric227f092009-10-01 16:12:16 -050030 target_phys_addr_t entry;
Avi Kivity72e4d252011-07-25 14:14:31 +030031 MemoryRegion *address_space_mem = get_system_memory();
32 MemoryRegion *ram = g_new(MemoryRegion, 1);
33 MemoryRegion *sram = g_new(MemoryRegion, 1);
pbrook06338792007-05-23 19:58:11 +000034
pbrook06338792007-05-23 19:58:11 +000035 if (!cpu_model)
36 cpu_model = "m5206";
bellardaaed9092007-11-10 15:15:54 +000037 env = cpu_init(cpu_model);
38 if (!env) {
Paul Brook2ac71172009-05-08 02:35:15 +010039 hw_error("Unable to find m68k CPU definition\n");
pbrook20dcee92007-06-03 11:13:39 +000040 }
pbrook06338792007-05-23 19:58:11 +000041
42 /* Initialize CPU registers. */
43 env->vbr = 0;
44 /* TODO: allow changing MBAR and RAMBAR. */
45 env->mbar = AN5206_MBAR_ADDR | 1;
46 env->rambar0 = AN5206_RAMBAR_ADDR | 1;
47
48 /* DRAM at address zero */
Avi Kivityc5705a72011-12-20 15:59:12 +020049 memory_region_init_ram(ram, "an5206.ram", ram_size);
50 vmstate_register_ram_global(ram);
Avi Kivity72e4d252011-07-25 14:14:31 +030051 memory_region_add_subregion(address_space_mem, 0, ram);
pbrook06338792007-05-23 19:58:11 +000052
53 /* Internal SRAM. */
Avi Kivityc5705a72011-12-20 15:59:12 +020054 memory_region_init_ram(sram, "an5206.sram", 512);
55 vmstate_register_ram_global(sram);
Avi Kivity72e4d252011-07-25 14:14:31 +030056 memory_region_add_subregion(address_space_mem, AN5206_RAMBAR_ADDR, sram);
pbrook06338792007-05-23 19:58:11 +000057
BenoƮt Canet653fa852011-11-24 14:31:12 +010058 mcf5206_init(address_space_mem, AN5206_MBAR_ADDR, env);
pbrook06338792007-05-23 19:58:11 +000059
60 /* Load kernel. */
61 if (!kernel_filename) {
62 fprintf(stderr, "Kernel image must be specified\n");
63 exit(1);
64 }
65
Aurelien Jarno409dbce2010-03-14 21:20:59 +010066 kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
67 NULL, NULL, 1, ELF_MACHINE, 0);
pbrook06338792007-05-23 19:58:11 +000068 entry = elf_entry;
69 if (kernel_size < 0) {
aliguori5a9154e2008-11-20 22:14:40 +000070 kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL);
pbrook06338792007-05-23 19:58:11 +000071 }
72 if (kernel_size < 0) {
pbrookdcac9672009-04-09 20:05:49 +000073 kernel_size = load_image_targphys(kernel_filename, KERNEL_LOAD_ADDR,
74 ram_size - KERNEL_LOAD_ADDR);
pbrook06338792007-05-23 19:58:11 +000075 entry = KERNEL_LOAD_ADDR;
76 }
77 if (kernel_size < 0) {
78 fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename);
79 exit(1);
80 }
81
82 env->pc = entry;
83}
84
Anthony Liguorif80f9ec2009-05-20 18:38:09 -050085static QEMUMachine an5206_machine = {
aliguori4b32e162008-10-07 20:34:35 +000086 .name = "an5206",
87 .desc = "Arnewsh 5206",
88 .init = an5206_init,
pbrook06338792007-05-23 19:58:11 +000089};
Anthony Liguorif80f9ec2009-05-20 18:38:09 -050090
91static void an5206_machine_init(void)
92{
93 qemu_register_machine(&an5206_machine);
94}
95
96machine_init(an5206_machine_init);