xref: /openbmc/qemu/hw/arm/kzm.c (revision 3ef9622182e598392855931e7a0437d3855cef5e)
153018216SPaolo Bonzini /*
253018216SPaolo Bonzini  * KZM Board System emulation.
353018216SPaolo Bonzini  *
453018216SPaolo Bonzini  * Copyright (c) 2008 OKL and 2011 NICTA
553018216SPaolo Bonzini  * Written by Hans at OK-Labs
653018216SPaolo Bonzini  * Updated by Peter Chubb.
753018216SPaolo Bonzini  *
853018216SPaolo Bonzini  * This code is licensed under the GPL, version 2 or later.
953018216SPaolo Bonzini  * See the file `COPYING' in the top level directory.
1053018216SPaolo Bonzini  *
1153018216SPaolo Bonzini  * It (partially) emulates a Kyoto Microcomputer
1253018216SPaolo Bonzini  * KZM-ARM11-01 evaluation board, with a Freescale
1353018216SPaolo Bonzini  * i.MX31 SoC
1453018216SPaolo Bonzini  */
1553018216SPaolo Bonzini 
1653018216SPaolo Bonzini #include "hw/sysbus.h"
1753018216SPaolo Bonzini #include "exec/address-spaces.h"
1853018216SPaolo Bonzini #include "hw/hw.h"
19bd2be150SPeter Maydell #include "hw/arm/arm.h"
20bd2be150SPeter Maydell #include "hw/devices.h"
2153018216SPaolo Bonzini #include "net/net.h"
2253018216SPaolo Bonzini #include "sysemu/sysemu.h"
2353018216SPaolo Bonzini #include "hw/boards.h"
240d09e41aSPaolo Bonzini #include "hw/char/serial.h"
250d09e41aSPaolo Bonzini #include "hw/arm/imx.h"
2653018216SPaolo Bonzini 
2753018216SPaolo Bonzini     /* Memory map for Kzm Emulation Baseboard:
2853018216SPaolo Bonzini      * 0x00000000-0x00003fff 16k secure ROM       IGNORED
2953018216SPaolo Bonzini      * 0x00004000-0x00407fff Reserved             IGNORED
3053018216SPaolo Bonzini      * 0x00404000-0x00407fff ROM                  IGNORED
3153018216SPaolo Bonzini      * 0x00408000-0x0fffffff Reserved             IGNORED
3253018216SPaolo Bonzini      * 0x10000000-0x1fffbfff RAM aliasing         IGNORED
3353018216SPaolo Bonzini      * 0x1fffc000-0x1fffffff RAM                  EMULATED
3453018216SPaolo Bonzini      * 0x20000000-0x2fffffff Reserved             IGNORED
3553018216SPaolo Bonzini      * 0x30000000-0x7fffffff I.MX31 Internal Register Space
3653018216SPaolo Bonzini      *   0x43f00000 IO_AREA0
3753018216SPaolo Bonzini      *   0x43f90000 UART1                         EMULATED
3853018216SPaolo Bonzini      *   0x43f94000 UART2                         EMULATED
3953018216SPaolo Bonzini      *   0x68000000 AVIC                          EMULATED
4053018216SPaolo Bonzini      *   0x53f80000 CCM                           EMULATED
4153018216SPaolo Bonzini      *   0x53f94000 PIT 1                         EMULATED
4253018216SPaolo Bonzini      *   0x53f98000 PIT 2                         EMULATED
4353018216SPaolo Bonzini      *   0x53f90000 GPT                           EMULATED
4453018216SPaolo Bonzini      * 0x80000000-0x87ffffff RAM                  EMULATED
4553018216SPaolo Bonzini      * 0x88000000-0x8fffffff RAM Aliasing         EMULATED
4653018216SPaolo Bonzini      * 0xa0000000-0xafffffff NAND Flash           IGNORED
4753018216SPaolo Bonzini      * 0xb0000000-0xb3ffffff Unavailable          IGNORED
4853018216SPaolo Bonzini      * 0xb4000000-0xb4000fff 8-bit free space     IGNORED
4953018216SPaolo Bonzini      * 0xb4001000-0xb400100f Board control        IGNORED
5053018216SPaolo Bonzini      *  0xb4001003           DIP switch
5153018216SPaolo Bonzini      * 0xb4001010-0xb400101f 7-segment LED        IGNORED
5253018216SPaolo Bonzini      * 0xb4001020-0xb400102f LED                  IGNORED
5353018216SPaolo Bonzini      * 0xb4001030-0xb400103f LED                  IGNORED
5453018216SPaolo Bonzini      * 0xb4001040-0xb400104f FPGA, UART           EMULATED
5553018216SPaolo Bonzini      * 0xb4001050-0xb400105f FPGA, UART           EMULATED
5653018216SPaolo Bonzini      * 0xb4001060-0xb40fffff FPGA                 IGNORED
5753018216SPaolo Bonzini      * 0xb6000000-0xb61fffff LAN controller       EMULATED
5853018216SPaolo Bonzini      * 0xb6200000-0xb62fffff FPGA NAND Controller IGNORED
5953018216SPaolo Bonzini      * 0xb6300000-0xb7ffffff Free                 IGNORED
6053018216SPaolo Bonzini      * 0xb8000000-0xb8004fff Memory control registers IGNORED
6153018216SPaolo Bonzini      * 0xc0000000-0xc3ffffff PCMCIA/CF            IGNORED
6253018216SPaolo Bonzini      * 0xc4000000-0xffffffff Reserved             IGNORED
6353018216SPaolo Bonzini      */
6453018216SPaolo Bonzini 
6553018216SPaolo Bonzini #define KZM_RAMADDRESS (0x80000000)
6653018216SPaolo Bonzini #define KZM_FPGA       (0xb4001040)
6753018216SPaolo Bonzini 
6853018216SPaolo Bonzini static struct arm_boot_info kzm_binfo = {
6953018216SPaolo Bonzini     .loader_start = KZM_RAMADDRESS,
7053018216SPaolo Bonzini     .board_id = 1722,
7153018216SPaolo Bonzini };
7253018216SPaolo Bonzini 
73*3ef96221SMarcel Apfelbaum static void kzm_init(MachineState *machine)
7453018216SPaolo Bonzini {
75*3ef96221SMarcel Apfelbaum     ram_addr_t ram_size = machine->ram_size;
76*3ef96221SMarcel Apfelbaum     const char *cpu_model = machine->cpu_model;
77*3ef96221SMarcel Apfelbaum     const char *kernel_filename = machine->kernel_filename;
78*3ef96221SMarcel Apfelbaum     const char *kernel_cmdline = machine->kernel_cmdline;
79*3ef96221SMarcel Apfelbaum     const char *initrd_filename = machine->initrd_filename;
8053018216SPaolo Bonzini     ARMCPU *cpu;
8153018216SPaolo Bonzini     MemoryRegion *address_space_mem = get_system_memory();
8253018216SPaolo Bonzini     MemoryRegion *ram = g_new(MemoryRegion, 1);
8353018216SPaolo Bonzini     MemoryRegion *sram = g_new(MemoryRegion, 1);
8453018216SPaolo Bonzini     MemoryRegion *ram_alias = g_new(MemoryRegion, 1);
8553018216SPaolo Bonzini     DeviceState *dev;
8653018216SPaolo Bonzini     DeviceState *ccm;
8753018216SPaolo Bonzini 
8853018216SPaolo Bonzini     if (!cpu_model) {
8953018216SPaolo Bonzini         cpu_model = "arm1136";
9053018216SPaolo Bonzini     }
9153018216SPaolo Bonzini 
9253018216SPaolo Bonzini     cpu = cpu_arm_init(cpu_model);
9353018216SPaolo Bonzini     if (!cpu) {
9453018216SPaolo Bonzini         fprintf(stderr, "Unable to find CPU definition\n");
9553018216SPaolo Bonzini         exit(1);
9653018216SPaolo Bonzini     }
9753018216SPaolo Bonzini 
9853018216SPaolo Bonzini     /* On a real system, the first 16k is a `secure boot rom' */
9953018216SPaolo Bonzini 
1002c9b15caSPaolo Bonzini     memory_region_init_ram(ram, NULL, "kzm.ram", ram_size);
10153018216SPaolo Bonzini     vmstate_register_ram_global(ram);
10253018216SPaolo Bonzini     memory_region_add_subregion(address_space_mem, KZM_RAMADDRESS, ram);
10353018216SPaolo Bonzini 
1042c9b15caSPaolo Bonzini     memory_region_init_alias(ram_alias, NULL, "ram.alias", ram, 0, ram_size);
10553018216SPaolo Bonzini     memory_region_add_subregion(address_space_mem, 0x88000000, ram_alias);
10653018216SPaolo Bonzini 
1072c9b15caSPaolo Bonzini     memory_region_init_ram(sram, NULL, "kzm.sram", 0x4000);
10853018216SPaolo Bonzini     memory_region_add_subregion(address_space_mem, 0x1FFFC000, sram);
10953018216SPaolo Bonzini 
11053018216SPaolo Bonzini     dev = sysbus_create_varargs("imx_avic", 0x68000000,
1112f69ba17SPeter Maydell                                 qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ),
1122f69ba17SPeter Maydell                                 qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_FIQ),
1132f69ba17SPeter Maydell                                 NULL);
11453018216SPaolo Bonzini 
11553018216SPaolo Bonzini     imx_serial_create(0, 0x43f90000, qdev_get_gpio_in(dev, 45));
11653018216SPaolo Bonzini     imx_serial_create(1, 0x43f94000, qdev_get_gpio_in(dev, 32));
11753018216SPaolo Bonzini 
11853018216SPaolo Bonzini     ccm = sysbus_create_simple("imx_ccm", 0x53f80000, NULL);
11953018216SPaolo Bonzini 
12053018216SPaolo Bonzini     imx_timerp_create(0x53f94000, qdev_get_gpio_in(dev, 28), ccm);
12153018216SPaolo Bonzini     imx_timerp_create(0x53f98000, qdev_get_gpio_in(dev, 27), ccm);
12253018216SPaolo Bonzini     imx_timerg_create(0x53f90000, qdev_get_gpio_in(dev, 29), ccm);
12353018216SPaolo Bonzini 
12453018216SPaolo Bonzini     if (nd_table[0].used) {
12553018216SPaolo Bonzini         lan9118_init(&nd_table[0], 0xb6000000, qdev_get_gpio_in(dev, 52));
12653018216SPaolo Bonzini     }
12753018216SPaolo Bonzini 
12853018216SPaolo Bonzini     if (serial_hds[2]) { /* touchscreen */
12953018216SPaolo Bonzini         serial_mm_init(address_space_mem, KZM_FPGA+0x10, 0,
13053018216SPaolo Bonzini                        qdev_get_gpio_in(dev, 52),
13153018216SPaolo Bonzini                        14745600, serial_hds[2],
13253018216SPaolo Bonzini                        DEVICE_NATIVE_ENDIAN);
13353018216SPaolo Bonzini     }
13453018216SPaolo Bonzini 
13553018216SPaolo Bonzini     kzm_binfo.ram_size = ram_size;
13653018216SPaolo Bonzini     kzm_binfo.kernel_filename = kernel_filename;
13753018216SPaolo Bonzini     kzm_binfo.kernel_cmdline = kernel_cmdline;
13853018216SPaolo Bonzini     kzm_binfo.initrd_filename = initrd_filename;
13953018216SPaolo Bonzini     kzm_binfo.nb_cpus = 1;
14053018216SPaolo Bonzini     arm_load_kernel(cpu, &kzm_binfo);
14153018216SPaolo Bonzini }
14253018216SPaolo Bonzini 
14353018216SPaolo Bonzini static QEMUMachine kzm_machine = {
14453018216SPaolo Bonzini     .name = "kzm",
14553018216SPaolo Bonzini     .desc = "ARM KZM Emulation Baseboard (ARM1136)",
14653018216SPaolo Bonzini     .init = kzm_init,
14753018216SPaolo Bonzini };
14853018216SPaolo Bonzini 
14953018216SPaolo Bonzini static void kzm_machine_init(void)
15053018216SPaolo Bonzini {
15153018216SPaolo Bonzini     qemu_register_machine(&kzm_machine);
15253018216SPaolo Bonzini }
15353018216SPaolo Bonzini 
15453018216SPaolo Bonzini machine_init(kzm_machine_init)
155