Statistics
| Branch: | Revision:

root / hw / microblaze / petalogix_ml605_mmu.c @ 2c9b15ca

History | View | Annotate | Download (6.9 kB)

1 00914b7d Michal Simek
/*
2 00914b7d Michal Simek
 * Model of Petalogix linux reference design targeting Xilinx Spartan ml605
3 00914b7d Michal Simek
 * board.
4 00914b7d Michal Simek
 *
5 00914b7d Michal Simek
 * Copyright (c) 2011 Michal Simek <monstr@monstr.eu>
6 00914b7d Michal Simek
 * Copyright (c) 2011 PetaLogix
7 00914b7d Michal Simek
 * Copyright (c) 2009 Edgar E. Iglesias.
8 00914b7d Michal Simek
 *
9 00914b7d Michal Simek
 * Permission is hereby granted, free of charge, to any person obtaining a copy
10 00914b7d Michal Simek
 * of this software and associated documentation files (the "Software"), to deal
11 00914b7d Michal Simek
 * in the Software without restriction, including without limitation the rights
12 00914b7d Michal Simek
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 00914b7d Michal Simek
 * copies of the Software, and to permit persons to whom the Software is
14 00914b7d Michal Simek
 * furnished to do so, subject to the following conditions:
15 00914b7d Michal Simek
 *
16 00914b7d Michal Simek
 * The above copyright notice and this permission notice shall be included in
17 00914b7d Michal Simek
 * all copies or substantial portions of the Software.
18 00914b7d Michal Simek
 *
19 00914b7d Michal Simek
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 00914b7d Michal Simek
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 00914b7d Michal Simek
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 00914b7d Michal Simek
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 00914b7d Michal Simek
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 00914b7d Michal Simek
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 00914b7d Michal Simek
 * THE SOFTWARE.
26 00914b7d Michal Simek
 */
27 00914b7d Michal Simek
28 83c9f4ca Paolo Bonzini
#include "hw/sysbus.h"
29 83c9f4ca Paolo Bonzini
#include "hw/hw.h"
30 1422e32d Paolo Bonzini
#include "net/net.h"
31 0d09e41a Paolo Bonzini
#include "hw/block/flash.h"
32 9c17d615 Paolo Bonzini
#include "sysemu/sysemu.h"
33 bd2be150 Peter Maydell
#include "hw/devices.h"
34 83c9f4ca Paolo Bonzini
#include "hw/boards.h"
35 83c9f4ca Paolo Bonzini
#include "hw/xilinx.h"
36 9c17d615 Paolo Bonzini
#include "sysemu/blockdev.h"
37 0d09e41a Paolo Bonzini
#include "hw/char/serial.h"
38 022c62cb Paolo Bonzini
#include "exec/address-spaces.h"
39 83c9f4ca Paolo Bonzini
#include "hw/ssi.h"
40 00914b7d Michal Simek
41 47b43a1f Paolo Bonzini
#include "boot.h"
42 47b43a1f Paolo Bonzini
#include "pic_cpu.h"
43 669b4983 Peter A. G. Crosthwaite
44 83c9f4ca Paolo Bonzini
#include "hw/stream.h"
45 00914b7d Michal Simek
46 00914b7d Michal Simek
#define LMB_BRAM_SIZE  (128 * 1024)
47 00914b7d Michal Simek
#define FLASH_SIZE     (32 * 1024 * 1024)
48 00914b7d Michal Simek
49 d94e7434 Peter A. G. Crosthwaite
#define BINARY_DEVICE_TREE_FILE "petalogix-ml605.dtb"
50 00914b7d Michal Simek
51 acd3b6be Peter A. G. Crosthwaite
#define NUM_SPI_FLASHES 4
52 acd3b6be Peter A. G. Crosthwaite
53 d94e7434 Peter A. G. Crosthwaite
#define MEMORY_BASEADDR 0x50000000
54 d94e7434 Peter A. G. Crosthwaite
#define FLASH_BASEADDR 0x86000000
55 d94e7434 Peter A. G. Crosthwaite
#define INTC_BASEADDR 0x81800000
56 d94e7434 Peter A. G. Crosthwaite
#define TIMER_BASEADDR 0x83c00000
57 d94e7434 Peter A. G. Crosthwaite
#define UART16550_BASEADDR 0x83e00000
58 d94e7434 Peter A. G. Crosthwaite
#define AXIENET_BASEADDR 0x82780000
59 d94e7434 Peter A. G. Crosthwaite
#define AXIDMA_BASEADDR 0x84600000
60 00914b7d Michal Simek
61 bf494367 Andreas Färber
static void machine_cpu_reset(MicroBlazeCPU *cpu)
62 d94e7434 Peter A. G. Crosthwaite
{
63 bf494367 Andreas Färber
    CPUMBState *env = &cpu->env;
64 bf494367 Andreas Färber
65 00914b7d Michal Simek
    env->pvr.regs[10] = 0x0e000000; /* virtex 6 */
66 00914b7d Michal Simek
    /* setup pvr to match kernel setting */
67 00914b7d Michal Simek
    env->pvr.regs[5] |= PVR5_DCACHE_WRITEBACK_MASK;
68 00914b7d Michal Simek
    env->pvr.regs[0] |= PVR0_USE_FPU_MASK | PVR0_ENDI;
69 00914b7d Michal Simek
    env->pvr.regs[0] = (env->pvr.regs[0] & ~PVR0_VERSION_MASK) | (0x14 << 8);
70 00914b7d Michal Simek
    env->pvr.regs[2] ^= PVR2_USE_FPU2_MASK;
71 00914b7d Michal Simek
    env->pvr.regs[4] = 0xc56b8000;
72 00914b7d Michal Simek
    env->pvr.regs[5] = 0xc56be000;
73 00914b7d Michal Simek
}
74 00914b7d Michal Simek
75 00914b7d Michal Simek
static void
76 5f072e1f Eduardo Habkost
petalogix_ml605_init(QEMUMachineInitArgs *args)
77 00914b7d Michal Simek
{
78 5f072e1f Eduardo Habkost
    ram_addr_t ram_size = args->ram_size;
79 5f072e1f Eduardo Habkost
    const char *cpu_model = args->cpu_model;
80 39186d8a Richard Henderson
    MemoryRegion *address_space_mem = get_system_memory();
81 669b4983 Peter A. G. Crosthwaite
    DeviceState *dev, *dma, *eth0;
82 42bb9c91 Peter Crosthwaite
    Object *ds, *cs;
83 a9480e5d Andreas Färber
    MicroBlazeCPU *cpu;
84 acd3b6be Peter A. G. Crosthwaite
    SysBusDevice *busdev;
85 ee118507 Andreas Färber
    CPUMBState *env;
86 00914b7d Michal Simek
    DriveInfo *dinfo;
87 00914b7d Michal Simek
    int i;
88 a8170e5e Avi Kivity
    hwaddr ddr_base = MEMORY_BASEADDR;
89 d7973c77 Avi Kivity
    MemoryRegion *phys_lmb_bram = g_new(MemoryRegion, 1);
90 d7973c77 Avi Kivity
    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
91 00914b7d Michal Simek
    qemu_irq irq[32], *cpu_irq;
92 00914b7d Michal Simek
93 00914b7d Michal Simek
    /* init CPUs */
94 00914b7d Michal Simek
    if (cpu_model == NULL) {
95 00914b7d Michal Simek
        cpu_model = "microblaze";
96 00914b7d Michal Simek
    }
97 a9480e5d Andreas Färber
    cpu = cpu_mb_init(cpu_model);
98 a9480e5d Andreas Färber
    env = &cpu->env;
99 00914b7d Michal Simek
100 00914b7d Michal Simek
    /* Attach emulated BRAM through the LMB.  */
101 2c9b15ca Paolo Bonzini
    memory_region_init_ram(phys_lmb_bram, NULL, "petalogix_ml605.lmb_bram",
102 d7973c77 Avi Kivity
                           LMB_BRAM_SIZE);
103 c5705a77 Avi Kivity
    vmstate_register_ram_global(phys_lmb_bram);
104 d7973c77 Avi Kivity
    memory_region_add_subregion(address_space_mem, 0x00000000, phys_lmb_bram);
105 00914b7d Michal Simek
106 2c9b15ca Paolo Bonzini
    memory_region_init_ram(phys_ram, NULL, "petalogix_ml605.ram", ram_size);
107 c5705a77 Avi Kivity
    vmstate_register_ram_global(phys_ram);
108 d7973c77 Avi Kivity
    memory_region_add_subregion(address_space_mem, ddr_base, phys_ram);
109 00914b7d Michal Simek
110 00914b7d Michal Simek
    dinfo = drive_get(IF_PFLASH, 0, 0);
111 00914b7d Michal Simek
    /* 5th parameter 2 means bank-width
112 00914b7d Michal Simek
     * 10th paremeter 0 means little-endian */
113 cfe5f011 Avi Kivity
    pflash_cfi01_register(FLASH_BASEADDR,
114 cfe5f011 Avi Kivity
                          NULL, "petalogix_ml605.flash", FLASH_SIZE,
115 00914b7d Michal Simek
                          dinfo ? dinfo->bdrv : NULL, (64 * 1024),
116 00914b7d Michal Simek
                          FLASH_SIZE >> 16,
117 01e0451a Anthony Liguori
                          2, 0x89, 0x18, 0x0000, 0x0, 0);
118 00914b7d Michal Simek
119 00914b7d Michal Simek
120 00914b7d Michal Simek
    cpu_irq = microblaze_pic_init_cpu(env);
121 00914b7d Michal Simek
    dev = xilinx_intc_create(INTC_BASEADDR, cpu_irq[0], 4);
122 00914b7d Michal Simek
    for (i = 0; i < 32; i++) {
123 00914b7d Michal Simek
        irq[i] = qdev_get_gpio_in(dev, i);
124 00914b7d Michal Simek
    }
125 00914b7d Michal Simek
126 39186d8a Richard Henderson
    serial_mm_init(address_space_mem, UART16550_BASEADDR + 0x1000, 2,
127 39186d8a Richard Henderson
                   irq[5], 115200, serial_hds[0], DEVICE_LITTLE_ENDIAN);
128 00914b7d Michal Simek
129 00914b7d Michal Simek
    /* 2 timers at irq 2 @ 100 Mhz.  */
130 abe098e4 Peter A. G. Crosthwaite
    xilinx_timer_create(TIMER_BASEADDR, irq[2], 0, 100 * 1000000);
131 00914b7d Michal Simek
132 669b4983 Peter A. G. Crosthwaite
    /* axi ethernet and dma initialization. */
133 dada5c7e Peter Crosthwaite
    qemu_check_nic_model(&nd_table[0], "xlnx.axi-ethernet");
134 dada5c7e Peter Crosthwaite
    eth0 = qdev_create(NULL, "xlnx.axi-ethernet");
135 669b4983 Peter A. G. Crosthwaite
    dma = qdev_create(NULL, "xlnx.axi-dma");
136 00914b7d Michal Simek
137 669b4983 Peter A. G. Crosthwaite
    /* FIXME: attach to the sysbus instead */
138 b19ceaad Peter Crosthwaite
    object_property_add_child(qdev_get_machine(), "xilinx-eth", OBJECT(eth0),
139 b19ceaad Peter Crosthwaite
                              NULL);
140 54ff2a39 Peter Crosthwaite
    object_property_add_child(qdev_get_machine(), "xilinx-dma", OBJECT(dma),
141 54ff2a39 Peter Crosthwaite
                              NULL);
142 669b4983 Peter A. G. Crosthwaite
143 42bb9c91 Peter Crosthwaite
    ds = object_property_get_link(OBJECT(dma),
144 42bb9c91 Peter Crosthwaite
                                  "axistream-connected-target", NULL);
145 42bb9c91 Peter Crosthwaite
    cs = object_property_get_link(OBJECT(dma),
146 42bb9c91 Peter Crosthwaite
                                  "axistream-control-connected-target", NULL);
147 42bb9c91 Peter Crosthwaite
    xilinx_axiethernet_init(eth0, &nd_table[0], STREAM_SLAVE(ds),
148 42bb9c91 Peter Crosthwaite
                            STREAM_SLAVE(cs), 0x82780000, irq[3], 0x1000,
149 42bb9c91 Peter Crosthwaite
                            0x1000);
150 42bb9c91 Peter Crosthwaite
151 42bb9c91 Peter Crosthwaite
    ds = object_property_get_link(OBJECT(eth0),
152 42bb9c91 Peter Crosthwaite
                                  "axistream-connected-target", NULL);
153 42bb9c91 Peter Crosthwaite
    cs = object_property_get_link(OBJECT(eth0),
154 42bb9c91 Peter Crosthwaite
                                  "axistream-control-connected-target", NULL);
155 42bb9c91 Peter Crosthwaite
    xilinx_axidma_init(dma, STREAM_SLAVE(ds), STREAM_SLAVE(cs), 0x84600000,
156 42bb9c91 Peter Crosthwaite
                       irq[1], irq[0], 100 * 1000000);
157 00914b7d Michal Simek
158 acd3b6be Peter A. G. Crosthwaite
    {
159 acd3b6be Peter A. G. Crosthwaite
        SSIBus *spi;
160 acd3b6be Peter A. G. Crosthwaite
161 acd3b6be Peter A. G. Crosthwaite
        dev = qdev_create(NULL, "xlnx.xps-spi");
162 acd3b6be Peter A. G. Crosthwaite
        qdev_prop_set_uint8(dev, "num-ss-bits", NUM_SPI_FLASHES);
163 acd3b6be Peter A. G. Crosthwaite
        qdev_init_nofail(dev);
164 1356b98d Andreas Färber
        busdev = SYS_BUS_DEVICE(dev);
165 acd3b6be Peter A. G. Crosthwaite
        sysbus_mmio_map(busdev, 0, 0x40a00000);
166 acd3b6be Peter A. G. Crosthwaite
        sysbus_connect_irq(busdev, 0, irq[4]);
167 acd3b6be Peter A. G. Crosthwaite
168 acd3b6be Peter A. G. Crosthwaite
        spi = (SSIBus *)qdev_get_child_bus(dev, "spi");
169 acd3b6be Peter A. G. Crosthwaite
170 acd3b6be Peter A. G. Crosthwaite
        for (i = 0; i < NUM_SPI_FLASHES; i++) {
171 acd3b6be Peter A. G. Crosthwaite
            qemu_irq cs_line;
172 acd3b6be Peter A. G. Crosthwaite
173 e641080f Peter Crosthwaite
            dev = ssi_create_slave(spi, "n25q128");
174 acd3b6be Peter A. G. Crosthwaite
            cs_line = qdev_get_gpio_in(dev, 0);
175 acd3b6be Peter A. G. Crosthwaite
            sysbus_connect_irq(busdev, i+1, cs_line);
176 acd3b6be Peter A. G. Crosthwaite
        }
177 acd3b6be Peter A. G. Crosthwaite
    }
178 acd3b6be Peter A. G. Crosthwaite
179 bf494367 Andreas Färber
    microblaze_load_kernel(cpu, ddr_base, ram_size, BINARY_DEVICE_TREE_FILE,
180 d94e7434 Peter A. G. Crosthwaite
                                                            machine_cpu_reset);
181 00914b7d Michal Simek
182 00914b7d Michal Simek
}
183 00914b7d Michal Simek
184 00914b7d Michal Simek
static QEMUMachine petalogix_ml605_machine = {
185 00914b7d Michal Simek
    .name = "petalogix-ml605",
186 00914b7d Michal Simek
    .desc = "PetaLogix linux refdesign for xilinx ml605 little endian",
187 00914b7d Michal Simek
    .init = petalogix_ml605_init,
188 e4ada29e Avik Sil
    .is_default = 0,
189 e4ada29e Avik Sil
    DEFAULT_MACHINE_OPTIONS,
190 00914b7d Michal Simek
};
191 00914b7d Michal Simek
192 00914b7d Michal Simek
static void petalogix_ml605_machine_init(void)
193 00914b7d Michal Simek
{
194 00914b7d Michal Simek
    qemu_register_machine(&petalogix_ml605_machine);
195 00914b7d Michal Simek
}
196 00914b7d Michal Simek
197 00914b7d Michal Simek
machine_init(petalogix_ml605_machine_init);