Statistics
| Branch: | Revision:

root / hw / ppc / e500.c @ 0cbad81f

History | View | Annotate | Download (23.9 kB)

1 1db09b84 aurel32
/*
2 b3305981 Scott Wood
 * QEMU PowerPC e500-based platforms
3 1db09b84 aurel32
 *
4 1db09b84 aurel32
 * Copyright (C) 2009 Freescale Semiconductor, Inc. All rights reserved.
5 1db09b84 aurel32
 *
6 1db09b84 aurel32
 * Author: Yu Liu,     <yu.liu@freescale.com>
7 1db09b84 aurel32
 *
8 1db09b84 aurel32
 * This file is derived from hw/ppc440_bamboo.c,
9 1db09b84 aurel32
 * the copyright for that material belongs to the original owners.
10 1db09b84 aurel32
 *
11 1db09b84 aurel32
 * This is free software; you can redistribute it and/or modify
12 1db09b84 aurel32
 * it under the terms of  the GNU General  Public License as published by
13 1db09b84 aurel32
 * the Free Software Foundation;  either version 2 of the  License, or
14 1db09b84 aurel32
 * (at your option) any later version.
15 1db09b84 aurel32
 */
16 1db09b84 aurel32
17 1db09b84 aurel32
#include "config.h"
18 1db09b84 aurel32
#include "qemu-common.h"
19 e6eaabeb Scott Wood
#include "e500.h"
20 3eddc1be Bharat Bhushan
#include "e500-ccsr.h"
21 1422e32d Paolo Bonzini
#include "net/net.h"
22 1de7afc9 Paolo Bonzini
#include "qemu/config-file.h"
23 4a18e7c9 Scott Wood
#include "hw/hw.h"
24 0d09e41a Paolo Bonzini
#include "hw/char/serial.h"
25 a2cb15b0 Michael S. Tsirkin
#include "hw/pci/pci.h"
26 4a18e7c9 Scott Wood
#include "hw/boards.h"
27 9c17d615 Paolo Bonzini
#include "sysemu/sysemu.h"
28 9c17d615 Paolo Bonzini
#include "sysemu/kvm.h"
29 1db09b84 aurel32
#include "kvm_ppc.h"
30 9c17d615 Paolo Bonzini
#include "sysemu/device_tree.h"
31 0d09e41a Paolo Bonzini
#include "hw/ppc/openpic.h"
32 0d09e41a Paolo Bonzini
#include "hw/ppc/ppc.h"
33 4a18e7c9 Scott Wood
#include "hw/loader.h"
34 ca20cf32 Blue Swirl
#include "elf.h"
35 4a18e7c9 Scott Wood
#include "hw/sysbus.h"
36 022c62cb Paolo Bonzini
#include "exec/address-spaces.h"
37 1de7afc9 Paolo Bonzini
#include "qemu/host-utils.h"
38 0d09e41a Paolo Bonzini
#include "hw/pci-host/ppce500.h"
39 1db09b84 aurel32
40 1db09b84 aurel32
#define BINARY_DEVICE_TREE_FILE    "mpc8544ds.dtb"
41 1db09b84 aurel32
#define UIMAGE_LOAD_BASE           0
42 9dd5eba1 Scott Wood
#define DTC_LOAD_PAD               0x1800000
43 75bb6589 Liu Yu
#define DTC_PAD_MASK               0xFFFFF
44 b8dec144 Alexander Graf
#define DTB_MAX_SIZE               (8 * 1024 * 1024)
45 75bb6589 Liu Yu
#define INITRD_LOAD_PAD            0x2000000
46 75bb6589 Liu Yu
#define INITRD_PAD_MASK            0xFFFFFF
47 1db09b84 aurel32
48 1db09b84 aurel32
#define RAM_SIZES_ALIGN            (64UL << 20)
49 1db09b84 aurel32
50 b3305981 Scott Wood
/* TODO: parameterize */
51 ed2bc496 Alexander Graf
#define MPC8544_CCSRBAR_BASE       0xE0000000ULL
52 ed2bc496 Alexander Graf
#define MPC8544_CCSRBAR_SIZE       0x00100000ULL
53 dffb1dc2 Bharat Bhushan
#define MPC8544_MPIC_REGS_OFFSET   0x40000ULL
54 a911b7a9 Alexander Graf
#define MPC8544_MSI_REGS_OFFSET   0x41600ULL
55 dffb1dc2 Bharat Bhushan
#define MPC8544_SERIAL0_REGS_OFFSET 0x4500ULL
56 dffb1dc2 Bharat Bhushan
#define MPC8544_SERIAL1_REGS_OFFSET 0x4600ULL
57 dffb1dc2 Bharat Bhushan
#define MPC8544_PCI_REGS_OFFSET    0x8000ULL
58 dffb1dc2 Bharat Bhushan
#define MPC8544_PCI_REGS_BASE      (MPC8544_CCSRBAR_BASE + \
59 dffb1dc2 Bharat Bhushan
                                    MPC8544_PCI_REGS_OFFSET)
60 ed2bc496 Alexander Graf
#define MPC8544_PCI_REGS_SIZE      0x1000ULL
61 ed2bc496 Alexander Graf
#define MPC8544_PCI_IO             0xE1000000ULL
62 dffb1dc2 Bharat Bhushan
#define MPC8544_UTIL_OFFSET        0xe0000ULL
63 ed2bc496 Alexander Graf
#define MPC8544_SPIN_BASE          0xEF000000ULL
64 1db09b84 aurel32
65 3b989d49 Alexander Graf
struct boot_info
66 3b989d49 Alexander Graf
{
67 3b989d49 Alexander Graf
    uint32_t dt_base;
68 cba2026a Alexander Graf
    uint32_t dt_size;
69 3b989d49 Alexander Graf
    uint32_t entry;
70 3b989d49 Alexander Graf
};
71 3b989d49 Alexander Graf
72 347dd79d Alexander Graf
static uint32_t *pci_map_create(void *fdt, uint32_t mpic, int first_slot,
73 347dd79d Alexander Graf
                                int nr_slots, int *len)
74 0dbc0798 Alexander Graf
{
75 347dd79d Alexander Graf
    int i = 0;
76 347dd79d Alexander Graf
    int slot;
77 347dd79d Alexander Graf
    int pci_irq;
78 9e2c1298 Alexander Graf
    int host_irq;
79 347dd79d Alexander Graf
    int last_slot = first_slot + nr_slots;
80 347dd79d Alexander Graf
    uint32_t *pci_map;
81 347dd79d Alexander Graf
82 347dd79d Alexander Graf
    *len = nr_slots * 4 * 7 * sizeof(uint32_t);
83 347dd79d Alexander Graf
    pci_map = g_malloc(*len);
84 347dd79d Alexander Graf
85 347dd79d Alexander Graf
    for (slot = first_slot; slot < last_slot; slot++) {
86 347dd79d Alexander Graf
        for (pci_irq = 0; pci_irq < 4; pci_irq++) {
87 347dd79d Alexander Graf
            pci_map[i++] = cpu_to_be32(slot << 11);
88 347dd79d Alexander Graf
            pci_map[i++] = cpu_to_be32(0x0);
89 347dd79d Alexander Graf
            pci_map[i++] = cpu_to_be32(0x0);
90 347dd79d Alexander Graf
            pci_map[i++] = cpu_to_be32(pci_irq + 1);
91 347dd79d Alexander Graf
            pci_map[i++] = cpu_to_be32(mpic);
92 9e2c1298 Alexander Graf
            host_irq = ppce500_pci_map_irq_slot(slot, pci_irq);
93 9e2c1298 Alexander Graf
            pci_map[i++] = cpu_to_be32(host_irq + 1);
94 347dd79d Alexander Graf
            pci_map[i++] = cpu_to_be32(0x1);
95 347dd79d Alexander Graf
        }
96 0dbc0798 Alexander Graf
    }
97 347dd79d Alexander Graf
98 347dd79d Alexander Graf
    assert((i * sizeof(uint32_t)) == *len);
99 347dd79d Alexander Graf
100 347dd79d Alexander Graf
    return pci_map;
101 0dbc0798 Alexander Graf
}
102 0dbc0798 Alexander Graf
103 a053a7ce Alexander Graf
static void dt_serial_create(void *fdt, unsigned long long offset,
104 a053a7ce Alexander Graf
                             const char *soc, const char *mpic,
105 a053a7ce Alexander Graf
                             const char *alias, int idx, bool defcon)
106 a053a7ce Alexander Graf
{
107 a053a7ce Alexander Graf
    char ser[128];
108 a053a7ce Alexander Graf
109 a053a7ce Alexander Graf
    snprintf(ser, sizeof(ser), "%s/serial@%llx", soc, offset);
110 a053a7ce Alexander Graf
    qemu_devtree_add_subnode(fdt, ser);
111 a053a7ce Alexander Graf
    qemu_devtree_setprop_string(fdt, ser, "device_type", "serial");
112 a053a7ce Alexander Graf
    qemu_devtree_setprop_string(fdt, ser, "compatible", "ns16550");
113 a053a7ce Alexander Graf
    qemu_devtree_setprop_cells(fdt, ser, "reg", offset, 0x100);
114 a053a7ce Alexander Graf
    qemu_devtree_setprop_cell(fdt, ser, "cell-index", idx);
115 a053a7ce Alexander Graf
    qemu_devtree_setprop_cell(fdt, ser, "clock-frequency", 0);
116 7e99826c Alexander Graf
    qemu_devtree_setprop_cells(fdt, ser, "interrupts", 42, 2);
117 a053a7ce Alexander Graf
    qemu_devtree_setprop_phandle(fdt, ser, "interrupt-parent", mpic);
118 a053a7ce Alexander Graf
    qemu_devtree_setprop_string(fdt, "/aliases", alias, ser);
119 a053a7ce Alexander Graf
120 a053a7ce Alexander Graf
    if (defcon) {
121 a053a7ce Alexander Graf
        qemu_devtree_setprop_string(fdt, "/chosen", "linux,stdout-path", ser);
122 a053a7ce Alexander Graf
    }
123 a053a7ce Alexander Graf
}
124 a053a7ce Alexander Graf
125 b3305981 Scott Wood
static int ppce500_load_device_tree(CPUPPCState *env,
126 e6eaabeb Scott Wood
                                    PPCE500Params *params,
127 a8170e5e Avi Kivity
                                    hwaddr addr,
128 a8170e5e Avi Kivity
                                    hwaddr initrd_base,
129 a8170e5e Avi Kivity
                                    hwaddr initrd_size)
130 1db09b84 aurel32
{
131 dbf916d8 Aurelien Jarno
    int ret = -1;
132 e6eaabeb Scott Wood
    uint64_t mem_reg_property[] = { 0, cpu_to_be64(params->ram_size) };
133 7ec632b4 pbrook
    int fdt_size;
134 dbf916d8 Aurelien Jarno
    void *fdt;
135 5de6b46d Alexander Graf
    uint8_t hypercall[16];
136 911d6e7a Alexander Graf
    uint32_t clock_freq = 400000000;
137 911d6e7a Alexander Graf
    uint32_t tb_freq = 400000000;
138 621d05e3 Alexander Graf
    int i;
139 e6eaabeb Scott Wood
    const char *toplevel_compat = NULL; /* user override */
140 ebb9518a Alexander Graf
    char compatible_sb[] = "fsl,mpc8544-immr\0simple-bus";
141 5da96624 Alexander Graf
    char soc[128];
142 19ac9dea Alexander Graf
    char mpic[128];
143 19ac9dea Alexander Graf
    uint32_t mpic_ph;
144 a911b7a9 Alexander Graf
    uint32_t msi_ph;
145 f5038483 Alexander Graf
    char gutil[128];
146 0dbc0798 Alexander Graf
    char pci[128];
147 a911b7a9 Alexander Graf
    char msi[128];
148 347dd79d Alexander Graf
    uint32_t *pci_map = NULL;
149 347dd79d Alexander Graf
    int len;
150 3627757e Alexander Graf
    uint32_t pci_ranges[14] =
151 3627757e Alexander Graf
        {
152 3627757e Alexander Graf
            0x2000000, 0x0, 0xc0000000,
153 3627757e Alexander Graf
            0x0, 0xc0000000,
154 3627757e Alexander Graf
            0x0, 0x20000000,
155 3627757e Alexander Graf
156 3627757e Alexander Graf
            0x1000000, 0x0, 0x0,
157 3627757e Alexander Graf
            0x0, 0xe1000000,
158 3627757e Alexander Graf
            0x0, 0x10000,
159 3627757e Alexander Graf
        };
160 25b42708 Alexander Graf
    QemuOpts *machine_opts;
161 d1b93565 Alexander Graf
    const char *dtb_file = NULL;
162 d1b93565 Alexander Graf
163 d1b93565 Alexander Graf
    machine_opts = qemu_opts_find(qemu_find_opts("machine"), 0);
164 d1b93565 Alexander Graf
    if (machine_opts) {
165 d1b93565 Alexander Graf
        dtb_file = qemu_opt_get(machine_opts, "dtb");
166 e6eaabeb Scott Wood
        toplevel_compat = qemu_opt_get(machine_opts, "dt_compatible");
167 d1b93565 Alexander Graf
    }
168 d1b93565 Alexander Graf
169 d1b93565 Alexander Graf
    if (dtb_file) {
170 d1b93565 Alexander Graf
        char *filename;
171 d1b93565 Alexander Graf
        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, dtb_file);
172 d1b93565 Alexander Graf
        if (!filename) {
173 d1b93565 Alexander Graf
            goto out;
174 d1b93565 Alexander Graf
        }
175 d1b93565 Alexander Graf
176 d1b93565 Alexander Graf
        fdt = load_device_tree(filename, &fdt_size);
177 d1b93565 Alexander Graf
        if (!fdt) {
178 d1b93565 Alexander Graf
            goto out;
179 d1b93565 Alexander Graf
        }
180 d1b93565 Alexander Graf
        goto done;
181 d1b93565 Alexander Graf
    }
182 1db09b84 aurel32
183 2636fcb6 Alexander Graf
    fdt = create_device_tree(&fdt_size);
184 5cea8590 Paul Brook
    if (fdt == NULL) {
185 5cea8590 Paul Brook
        goto out;
186 5cea8590 Paul Brook
    }
187 1db09b84 aurel32
188 1db09b84 aurel32
    /* Manipulate device tree in memory. */
189 3627757e Alexander Graf
    qemu_devtree_setprop_cell(fdt, "/", "#address-cells", 2);
190 3627757e Alexander Graf
    qemu_devtree_setprop_cell(fdt, "/", "#size-cells", 2);
191 51b852b7 Alexander Graf
192 dd0bcfca Alexander Graf
    qemu_devtree_add_subnode(fdt, "/memory");
193 dd0bcfca Alexander Graf
    qemu_devtree_setprop_string(fdt, "/memory", "device_type", "memory");
194 dd0bcfca Alexander Graf
    qemu_devtree_setprop(fdt, "/memory", "reg", mem_reg_property,
195 dd0bcfca Alexander Graf
                         sizeof(mem_reg_property));
196 1db09b84 aurel32
197 f5231aaf Alexander Graf
    qemu_devtree_add_subnode(fdt, "/chosen");
198 3b989d49 Alexander Graf
    if (initrd_size) {
199 3b989d49 Alexander Graf
        ret = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-start",
200 3b989d49 Alexander Graf
                                        initrd_base);
201 3b989d49 Alexander Graf
        if (ret < 0) {
202 3b989d49 Alexander Graf
            fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n");
203 3b989d49 Alexander Graf
        }
204 1db09b84 aurel32
205 3b989d49 Alexander Graf
        ret = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-end",
206 3b989d49 Alexander Graf
                                        (initrd_base + initrd_size));
207 3b989d49 Alexander Graf
        if (ret < 0) {
208 3b989d49 Alexander Graf
            fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n");
209 3b989d49 Alexander Graf
        }
210 3b989d49 Alexander Graf
    }
211 1db09b84 aurel32
212 1db09b84 aurel32
    ret = qemu_devtree_setprop_string(fdt, "/chosen", "bootargs",
213 e6eaabeb Scott Wood
                                      params->kernel_cmdline);
214 1db09b84 aurel32
    if (ret < 0)
215 1db09b84 aurel32
        fprintf(stderr, "couldn't set /chosen/bootargs\n");
216 1db09b84 aurel32
217 1db09b84 aurel32
    if (kvm_enabled()) {
218 911d6e7a Alexander Graf
        /* Read out host's frequencies */
219 911d6e7a Alexander Graf
        clock_freq = kvmppc_get_clockfreq();
220 911d6e7a Alexander Graf
        tb_freq = kvmppc_get_tbfreq();
221 5de6b46d Alexander Graf
222 5de6b46d Alexander Graf
        /* indicate KVM hypercall interface */
223 d50f71a5 Alexander Graf
        qemu_devtree_add_subnode(fdt, "/hypervisor");
224 5de6b46d Alexander Graf
        qemu_devtree_setprop_string(fdt, "/hypervisor", "compatible",
225 5de6b46d Alexander Graf
                                    "linux,kvm");
226 5de6b46d Alexander Graf
        kvmppc_get_hypercall(env, hypercall, sizeof(hypercall));
227 5de6b46d Alexander Graf
        qemu_devtree_setprop(fdt, "/hypervisor", "hcall-instructions",
228 5de6b46d Alexander Graf
                             hypercall, sizeof(hypercall));
229 1a61a9ae Stuart Yoder
        /* if KVM supports the idle hcall, set property indicating this */
230 1a61a9ae Stuart Yoder
        if (kvmppc_get_hasidle(env)) {
231 1a61a9ae Stuart Yoder
            qemu_devtree_setprop(fdt, "/hypervisor", "has-idle", NULL, 0);
232 1a61a9ae Stuart Yoder
        }
233 1db09b84 aurel32
    }
234 3b989d49 Alexander Graf
235 625e665b Alexander Graf
    /* Create CPU nodes */
236 625e665b Alexander Graf
    qemu_devtree_add_subnode(fdt, "/cpus");
237 625e665b Alexander Graf
    qemu_devtree_setprop_cell(fdt, "/cpus", "#address-cells", 1);
238 625e665b Alexander Graf
    qemu_devtree_setprop_cell(fdt, "/cpus", "#size-cells", 0);
239 625e665b Alexander Graf
240 1e3debf0 Alexander Graf
    /* We need to generate the cpu nodes in reverse order, so Linux can pick
241 1e3debf0 Alexander Graf
       the first node as boot node and be happy */
242 1e3debf0 Alexander Graf
    for (i = smp_cpus - 1; i >= 0; i--) {
243 440c8152 Andreas Färber
        CPUState *cpu;
244 621d05e3 Alexander Graf
        char cpu_name[128];
245 1d2e5c52 Alexander Graf
        uint64_t cpu_release_addr = MPC8544_SPIN_BASE + (i * 0x20);
246 10f25a46 Alexander Graf
247 440c8152 Andreas Färber
        cpu = qemu_get_cpu(i);
248 55e5c285 Andreas Färber
        if (cpu == NULL) {
249 1e3debf0 Alexander Graf
            continue;
250 1e3debf0 Alexander Graf
        }
251 440c8152 Andreas Färber
        env = cpu->env_ptr;
252 1e3debf0 Alexander Graf
253 55e5c285 Andreas Färber
        snprintf(cpu_name, sizeof(cpu_name), "/cpus/PowerPC,8544@%x",
254 55e5c285 Andreas Färber
                 cpu->cpu_index);
255 1e3debf0 Alexander Graf
        qemu_devtree_add_subnode(fdt, cpu_name);
256 621d05e3 Alexander Graf
        qemu_devtree_setprop_cell(fdt, cpu_name, "clock-frequency", clock_freq);
257 621d05e3 Alexander Graf
        qemu_devtree_setprop_cell(fdt, cpu_name, "timebase-frequency", tb_freq);
258 1e3debf0 Alexander Graf
        qemu_devtree_setprop_string(fdt, cpu_name, "device_type", "cpu");
259 55e5c285 Andreas Färber
        qemu_devtree_setprop_cell(fdt, cpu_name, "reg", cpu->cpu_index);
260 1e3debf0 Alexander Graf
        qemu_devtree_setprop_cell(fdt, cpu_name, "d-cache-line-size",
261 1e3debf0 Alexander Graf
                                  env->dcache_line_size);
262 1e3debf0 Alexander Graf
        qemu_devtree_setprop_cell(fdt, cpu_name, "i-cache-line-size",
263 1e3debf0 Alexander Graf
                                  env->icache_line_size);
264 1e3debf0 Alexander Graf
        qemu_devtree_setprop_cell(fdt, cpu_name, "d-cache-size", 0x8000);
265 1e3debf0 Alexander Graf
        qemu_devtree_setprop_cell(fdt, cpu_name, "i-cache-size", 0x8000);
266 1e3debf0 Alexander Graf
        qemu_devtree_setprop_cell(fdt, cpu_name, "bus-frequency", 0);
267 55e5c285 Andreas Färber
        if (cpu->cpu_index) {
268 1e3debf0 Alexander Graf
            qemu_devtree_setprop_string(fdt, cpu_name, "status", "disabled");
269 1e3debf0 Alexander Graf
            qemu_devtree_setprop_string(fdt, cpu_name, "enable-method", "spin-table");
270 1d2e5c52 Alexander Graf
            qemu_devtree_setprop_u64(fdt, cpu_name, "cpu-release-addr",
271 1d2e5c52 Alexander Graf
                                     cpu_release_addr);
272 1e3debf0 Alexander Graf
        } else {
273 1e3debf0 Alexander Graf
            qemu_devtree_setprop_string(fdt, cpu_name, "status", "okay");
274 1e3debf0 Alexander Graf
        }
275 1db09b84 aurel32
    }
276 1db09b84 aurel32
277 0cfc6e8d Alexander Graf
    qemu_devtree_add_subnode(fdt, "/aliases");
278 5da96624 Alexander Graf
    /* XXX These should go into their respective devices' code */
279 ed2bc496 Alexander Graf
    snprintf(soc, sizeof(soc), "/soc@%llx", MPC8544_CCSRBAR_BASE);
280 5da96624 Alexander Graf
    qemu_devtree_add_subnode(fdt, soc);
281 5da96624 Alexander Graf
    qemu_devtree_setprop_string(fdt, soc, "device_type", "soc");
282 ebb9518a Alexander Graf
    qemu_devtree_setprop(fdt, soc, "compatible", compatible_sb,
283 ebb9518a Alexander Graf
                         sizeof(compatible_sb));
284 5da96624 Alexander Graf
    qemu_devtree_setprop_cell(fdt, soc, "#address-cells", 1);
285 5da96624 Alexander Graf
    qemu_devtree_setprop_cell(fdt, soc, "#size-cells", 1);
286 3627757e Alexander Graf
    qemu_devtree_setprop_cells(fdt, soc, "ranges", 0x0,
287 3627757e Alexander Graf
                               MPC8544_CCSRBAR_BASE >> 32, MPC8544_CCSRBAR_BASE,
288 5da96624 Alexander Graf
                               MPC8544_CCSRBAR_SIZE);
289 5da96624 Alexander Graf
    /* XXX should contain a reasonable value */
290 5da96624 Alexander Graf
    qemu_devtree_setprop_cell(fdt, soc, "bus-frequency", 0);
291 5da96624 Alexander Graf
292 dffb1dc2 Bharat Bhushan
    snprintf(mpic, sizeof(mpic), "%s/pic@%llx", soc, MPC8544_MPIC_REGS_OFFSET);
293 19ac9dea Alexander Graf
    qemu_devtree_add_subnode(fdt, mpic);
294 19ac9dea Alexander Graf
    qemu_devtree_setprop_string(fdt, mpic, "device_type", "open-pic");
295 f5fba9d2 Scott Wood
    qemu_devtree_setprop_string(fdt, mpic, "compatible", "fsl,mpic");
296 dffb1dc2 Bharat Bhushan
    qemu_devtree_setprop_cells(fdt, mpic, "reg", MPC8544_MPIC_REGS_OFFSET,
297 dffb1dc2 Bharat Bhushan
                               0x40000);
298 19ac9dea Alexander Graf
    qemu_devtree_setprop_cell(fdt, mpic, "#address-cells", 0);
299 7e99826c Alexander Graf
    qemu_devtree_setprop_cell(fdt, mpic, "#interrupt-cells", 2);
300 19ac9dea Alexander Graf
    mpic_ph = qemu_devtree_alloc_phandle(fdt);
301 19ac9dea Alexander Graf
    qemu_devtree_setprop_cell(fdt, mpic, "phandle", mpic_ph);
302 19ac9dea Alexander Graf
    qemu_devtree_setprop_cell(fdt, mpic, "linux,phandle", mpic_ph);
303 19ac9dea Alexander Graf
    qemu_devtree_setprop(fdt, mpic, "interrupt-controller", NULL, 0);
304 19ac9dea Alexander Graf
305 0cfc6e8d Alexander Graf
    /*
306 0cfc6e8d Alexander Graf
     * We have to generate ser1 first, because Linux takes the first
307 0cfc6e8d Alexander Graf
     * device it finds in the dt as serial output device. And we generate
308 0cfc6e8d Alexander Graf
     * devices in reverse order to the dt.
309 0cfc6e8d Alexander Graf
     */
310 dffb1dc2 Bharat Bhushan
    dt_serial_create(fdt, MPC8544_SERIAL1_REGS_OFFSET,
311 a053a7ce Alexander Graf
                     soc, mpic, "serial1", 1, false);
312 dffb1dc2 Bharat Bhushan
    dt_serial_create(fdt, MPC8544_SERIAL0_REGS_OFFSET,
313 a053a7ce Alexander Graf
                     soc, mpic, "serial0", 0, true);
314 0cfc6e8d Alexander Graf
315 ed2bc496 Alexander Graf
    snprintf(gutil, sizeof(gutil), "%s/global-utilities@%llx", soc,
316 dffb1dc2 Bharat Bhushan
             MPC8544_UTIL_OFFSET);
317 f5038483 Alexander Graf
    qemu_devtree_add_subnode(fdt, gutil);
318 f5038483 Alexander Graf
    qemu_devtree_setprop_string(fdt, gutil, "compatible", "fsl,mpc8544-guts");
319 dffb1dc2 Bharat Bhushan
    qemu_devtree_setprop_cells(fdt, gutil, "reg", MPC8544_UTIL_OFFSET, 0x1000);
320 f5038483 Alexander Graf
    qemu_devtree_setprop(fdt, gutil, "fsl,has-rstcr", NULL, 0);
321 f5038483 Alexander Graf
322 a911b7a9 Alexander Graf
    snprintf(msi, sizeof(msi), "/%s/msi@%llx", soc, MPC8544_MSI_REGS_OFFSET);
323 a911b7a9 Alexander Graf
    qemu_devtree_add_subnode(fdt, msi);
324 a911b7a9 Alexander Graf
    qemu_devtree_setprop_string(fdt, msi, "compatible", "fsl,mpic-msi");
325 a911b7a9 Alexander Graf
    qemu_devtree_setprop_cells(fdt, msi, "reg", MPC8544_MSI_REGS_OFFSET, 0x200);
326 a911b7a9 Alexander Graf
    msi_ph = qemu_devtree_alloc_phandle(fdt);
327 a911b7a9 Alexander Graf
    qemu_devtree_setprop_cells(fdt, msi, "msi-available-ranges", 0x0, 0x100);
328 a911b7a9 Alexander Graf
    qemu_devtree_setprop_phandle(fdt, msi, "interrupt-parent", mpic);
329 a911b7a9 Alexander Graf
    qemu_devtree_setprop_cells(fdt, msi, "interrupts",
330 a911b7a9 Alexander Graf
        0xe0, 0x0,
331 a911b7a9 Alexander Graf
        0xe1, 0x0,
332 a911b7a9 Alexander Graf
        0xe2, 0x0,
333 a911b7a9 Alexander Graf
        0xe3, 0x0,
334 a911b7a9 Alexander Graf
        0xe4, 0x0,
335 a911b7a9 Alexander Graf
        0xe5, 0x0,
336 a911b7a9 Alexander Graf
        0xe6, 0x0,
337 a911b7a9 Alexander Graf
        0xe7, 0x0);
338 a911b7a9 Alexander Graf
    qemu_devtree_setprop_cell(fdt, msi, "phandle", msi_ph);
339 a911b7a9 Alexander Graf
    qemu_devtree_setprop_cell(fdt, msi, "linux,phandle", msi_ph);
340 a911b7a9 Alexander Graf
341 ed2bc496 Alexander Graf
    snprintf(pci, sizeof(pci), "/pci@%llx", MPC8544_PCI_REGS_BASE);
342 0dbc0798 Alexander Graf
    qemu_devtree_add_subnode(fdt, pci);
343 0dbc0798 Alexander Graf
    qemu_devtree_setprop_cell(fdt, pci, "cell-index", 0);
344 0dbc0798 Alexander Graf
    qemu_devtree_setprop_string(fdt, pci, "compatible", "fsl,mpc8540-pci");
345 0dbc0798 Alexander Graf
    qemu_devtree_setprop_string(fdt, pci, "device_type", "pci");
346 0dbc0798 Alexander Graf
    qemu_devtree_setprop_cells(fdt, pci, "interrupt-map-mask", 0xf800, 0x0,
347 0dbc0798 Alexander Graf
                               0x0, 0x7);
348 347dd79d Alexander Graf
    pci_map = pci_map_create(fdt, qemu_devtree_get_phandle(fdt, mpic),
349 492ec48d Alexander Graf
                             params->pci_first_slot, params->pci_nr_slots,
350 492ec48d Alexander Graf
                             &len);
351 347dd79d Alexander Graf
    qemu_devtree_setprop(fdt, pci, "interrupt-map", pci_map, len);
352 0dbc0798 Alexander Graf
    qemu_devtree_setprop_phandle(fdt, pci, "interrupt-parent", mpic);
353 7e99826c Alexander Graf
    qemu_devtree_setprop_cells(fdt, pci, "interrupts", 24, 2);
354 0dbc0798 Alexander Graf
    qemu_devtree_setprop_cells(fdt, pci, "bus-range", 0, 255);
355 3627757e Alexander Graf
    for (i = 0; i < 14; i++) {
356 0dbc0798 Alexander Graf
        pci_ranges[i] = cpu_to_be32(pci_ranges[i]);
357 0dbc0798 Alexander Graf
    }
358 a911b7a9 Alexander Graf
    qemu_devtree_setprop_cell(fdt, pci, "fsl,msi", msi_ph);
359 0dbc0798 Alexander Graf
    qemu_devtree_setprop(fdt, pci, "ranges", pci_ranges, sizeof(pci_ranges));
360 3627757e Alexander Graf
    qemu_devtree_setprop_cells(fdt, pci, "reg", MPC8544_PCI_REGS_BASE >> 32,
361 3627757e Alexander Graf
                               MPC8544_PCI_REGS_BASE, 0, 0x1000);
362 0dbc0798 Alexander Graf
    qemu_devtree_setprop_cell(fdt, pci, "clock-frequency", 66666666);
363 0dbc0798 Alexander Graf
    qemu_devtree_setprop_cell(fdt, pci, "#interrupt-cells", 1);
364 0dbc0798 Alexander Graf
    qemu_devtree_setprop_cell(fdt, pci, "#size-cells", 2);
365 0dbc0798 Alexander Graf
    qemu_devtree_setprop_cell(fdt, pci, "#address-cells", 3);
366 0dbc0798 Alexander Graf
    qemu_devtree_setprop_string(fdt, "/aliases", "pci0", pci);
367 0dbc0798 Alexander Graf
368 e6eaabeb Scott Wood
    params->fixup_devtree(params, fdt);
369 e6eaabeb Scott Wood
370 e6eaabeb Scott Wood
    if (toplevel_compat) {
371 e6eaabeb Scott Wood
        qemu_devtree_setprop(fdt, "/", "compatible", toplevel_compat,
372 e6eaabeb Scott Wood
                             strlen(toplevel_compat) + 1);
373 e6eaabeb Scott Wood
    }
374 e6eaabeb Scott Wood
375 d1b93565 Alexander Graf
done:
376 71193433 Alexander Graf
    qemu_devtree_dumpdtb(fdt, fdt_size);
377 04088adb Liu Yu
    ret = rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr);
378 cba2026a Alexander Graf
    if (ret < 0) {
379 cba2026a Alexander Graf
        goto out;
380 cba2026a Alexander Graf
    }
381 7267c094 Anthony Liguori
    g_free(fdt);
382 cba2026a Alexander Graf
    ret = fdt_size;
383 7ec632b4 pbrook
384 1db09b84 aurel32
out:
385 347dd79d Alexander Graf
    g_free(pci_map);
386 1db09b84 aurel32
387 04088adb Liu Yu
    return ret;
388 1db09b84 aurel32
}
389 1db09b84 aurel32
390 cba2026a Alexander Graf
/* Create -kernel TLB entries for BookE.  */
391 a8170e5e Avi Kivity
static inline hwaddr booke206_page_size_to_tlb(uint64_t size)
392 d1e256fe Alexander Graf
{
393 cba2026a Alexander Graf
    return 63 - clz64(size >> 10);
394 d1e256fe Alexander Graf
}
395 d1e256fe Alexander Graf
396 cba2026a Alexander Graf
static void mmubooke_create_initial_mapping(CPUPPCState *env)
397 3b989d49 Alexander Graf
{
398 cba2026a Alexander Graf
    struct boot_info *bi = env->load_info;
399 d1e256fe Alexander Graf
    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 0);
400 a8170e5e Avi Kivity
    hwaddr size, dt_end;
401 cba2026a Alexander Graf
    int ps;
402 cba2026a Alexander Graf
403 cba2026a Alexander Graf
    /* Our initial TLB entry needs to cover everything from 0 to
404 cba2026a Alexander Graf
       the device tree top */
405 cba2026a Alexander Graf
    dt_end = bi->dt_base + bi->dt_size;
406 cba2026a Alexander Graf
    ps = booke206_page_size_to_tlb(dt_end) + 1;
407 fb37c302 Alexander Graf
    if (ps & 1) {
408 fb37c302 Alexander Graf
        /* e500v2 can only do even TLB size bits */
409 fb37c302 Alexander Graf
        ps++;
410 fb37c302 Alexander Graf
    }
411 cba2026a Alexander Graf
    size = (ps << MAS1_TSIZE_SHIFT);
412 d1e256fe Alexander Graf
    tlb->mas1 = MAS1_VALID | size;
413 cba2026a Alexander Graf
    tlb->mas2 = 0;
414 cba2026a Alexander Graf
    tlb->mas7_3 = 0;
415 d1e256fe Alexander Graf
    tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX;
416 93dd5e85 Scott Wood
417 93dd5e85 Scott Wood
    env->tlb_dirty = true;
418 3b989d49 Alexander Graf
}
419 3b989d49 Alexander Graf
420 b3305981 Scott Wood
static void ppce500_cpu_reset_sec(void *opaque)
421 5c145dac Alexander Graf
{
422 38f92da6 Andreas Färber
    PowerPCCPU *cpu = opaque;
423 259186a7 Andreas Färber
    CPUState *cs = CPU(cpu);
424 38f92da6 Andreas Färber
    CPUPPCState *env = &cpu->env;
425 5c145dac Alexander Graf
426 259186a7 Andreas Färber
    cpu_reset(cs);
427 5c145dac Alexander Graf
428 5c145dac Alexander Graf
    /* Secondary CPU starts in halted state for now. Needs to change when
429 5c145dac Alexander Graf
       implementing non-kernel boot. */
430 259186a7 Andreas Färber
    cs->halted = 1;
431 5c145dac Alexander Graf
    env->exception_index = EXCP_HLT;
432 3b989d49 Alexander Graf
}
433 3b989d49 Alexander Graf
434 b3305981 Scott Wood
static void ppce500_cpu_reset(void *opaque)
435 3b989d49 Alexander Graf
{
436 38f92da6 Andreas Färber
    PowerPCCPU *cpu = opaque;
437 259186a7 Andreas Färber
    CPUState *cs = CPU(cpu);
438 38f92da6 Andreas Färber
    CPUPPCState *env = &cpu->env;
439 3b989d49 Alexander Graf
    struct boot_info *bi = env->load_info;
440 3b989d49 Alexander Graf
441 259186a7 Andreas Färber
    cpu_reset(cs);
442 3b989d49 Alexander Graf
443 3b989d49 Alexander Graf
    /* Set initial guest state. */
444 259186a7 Andreas Färber
    cs->halted = 0;
445 3b989d49 Alexander Graf
    env->gpr[1] = (16<<20) - 8;
446 3b989d49 Alexander Graf
    env->gpr[3] = bi->dt_base;
447 3b989d49 Alexander Graf
    env->nip = bi->entry;
448 cba2026a Alexander Graf
    mmubooke_create_initial_mapping(env);
449 3b989d49 Alexander Graf
}
450 3b989d49 Alexander Graf
451 e6eaabeb Scott Wood
void ppce500_init(PPCE500Params *params)
452 1db09b84 aurel32
{
453 39186d8a Richard Henderson
    MemoryRegion *address_space_mem = get_system_memory();
454 2646c133 Avi Kivity
    MemoryRegion *ram = g_new(MemoryRegion, 1);
455 1db09b84 aurel32
    PCIBus *pci_bus;
456 e2684c0b Andreas Färber
    CPUPPCState *env = NULL;
457 1db09b84 aurel32
    uint64_t elf_entry;
458 1db09b84 aurel32
    uint64_t elf_lowaddr;
459 a8170e5e Avi Kivity
    hwaddr entry=0;
460 a8170e5e Avi Kivity
    hwaddr loadaddr=UIMAGE_LOAD_BASE;
461 1db09b84 aurel32
    target_long kernel_size=0;
462 75bb6589 Liu Yu
    target_ulong dt_base = 0;
463 75bb6589 Liu Yu
    target_ulong initrd_base = 0;
464 528e536e Alexander Graf
    target_long initrd_size = 0;
465 528e536e Alexander Graf
    target_ulong cur_base = 0;
466 d0b72631 Alexander Graf
    int i = 0, j, k;
467 1db09b84 aurel32
    unsigned int pci_irq_nrs[4] = {1, 2, 3, 4};
468 a915249f Alexander Graf
    qemu_irq **irqs, *mpic;
469 be13cc7a Alexander Graf
    DeviceState *dev;
470 e2684c0b Andreas Färber
    CPUPPCState *firstenv = NULL;
471 3eddc1be Bharat Bhushan
    MemoryRegion *ccsr_addr_space;
472 dffb1dc2 Bharat Bhushan
    SysBusDevice *s;
473 3eddc1be Bharat Bhushan
    PPCE500CCSRState *ccsr;
474 1db09b84 aurel32
475 e61c36d5 Alexander Graf
    /* Setup CPUs */
476 e6eaabeb Scott Wood
    if (params->cpu_model == NULL) {
477 e6eaabeb Scott Wood
        params->cpu_model = "e500v2_v30";
478 ef250db6 Alexander Graf
    }
479 ef250db6 Alexander Graf
480 a915249f Alexander Graf
    irqs = g_malloc0(smp_cpus * sizeof(qemu_irq *));
481 a915249f Alexander Graf
    irqs[0] = g_malloc0(smp_cpus * sizeof(qemu_irq) * OPENPIC_OUTPUT_NB);
482 e61c36d5 Alexander Graf
    for (i = 0; i < smp_cpus; i++) {
483 397b457d Andreas Färber
        PowerPCCPU *cpu;
484 55e5c285 Andreas Färber
        CPUState *cs;
485 e61c36d5 Alexander Graf
        qemu_irq *input;
486 397b457d Andreas Färber
487 e6eaabeb Scott Wood
        cpu = cpu_ppc_init(params->cpu_model);
488 397b457d Andreas Färber
        if (cpu == NULL) {
489 e61c36d5 Alexander Graf
            fprintf(stderr, "Unable to initialize CPU!\n");
490 e61c36d5 Alexander Graf
            exit(1);
491 e61c36d5 Alexander Graf
        }
492 397b457d Andreas Färber
        env = &cpu->env;
493 55e5c285 Andreas Färber
        cs = CPU(cpu);
494 1db09b84 aurel32
495 e61c36d5 Alexander Graf
        if (!firstenv) {
496 e61c36d5 Alexander Graf
            firstenv = env;
497 e61c36d5 Alexander Graf
        }
498 1db09b84 aurel32
499 a915249f Alexander Graf
        irqs[i] = irqs[0] + (i * OPENPIC_OUTPUT_NB);
500 a915249f Alexander Graf
        input = (qemu_irq *)env->irq_inputs;
501 a915249f Alexander Graf
        irqs[i][OPENPIC_OUTPUT_INT] = input[PPCE500_INPUT_INT];
502 a915249f Alexander Graf
        irqs[i][OPENPIC_OUTPUT_CINT] = input[PPCE500_INPUT_CINT];
503 55e5c285 Andreas Färber
        env->spr[SPR_BOOKE_PIR] = cs->cpu_index = i;
504 68c2dd70 Alexander Graf
        env->mpic_iack = MPC8544_CCSRBAR_BASE +
505 bd25922e Scott Wood
                         MPC8544_MPIC_REGS_OFFSET + 0xa0;
506 3b989d49 Alexander Graf
507 a34a92b9 Andreas Färber
        ppc_booke_timers_init(cpu, 400000000, PPC_TIMER_E500);
508 e61c36d5 Alexander Graf
509 e61c36d5 Alexander Graf
        /* Register reset handler */
510 5c145dac Alexander Graf
        if (!i) {
511 5c145dac Alexander Graf
            /* Primary CPU */
512 5c145dac Alexander Graf
            struct boot_info *boot_info;
513 5c145dac Alexander Graf
            boot_info = g_malloc0(sizeof(struct boot_info));
514 b3305981 Scott Wood
            qemu_register_reset(ppce500_cpu_reset, cpu);
515 5c145dac Alexander Graf
            env->load_info = boot_info;
516 5c145dac Alexander Graf
        } else {
517 5c145dac Alexander Graf
            /* Secondary CPUs */
518 b3305981 Scott Wood
            qemu_register_reset(ppce500_cpu_reset_sec, cpu);
519 5c145dac Alexander Graf
        }
520 e61c36d5 Alexander Graf
    }
521 3b989d49 Alexander Graf
522 e61c36d5 Alexander Graf
    env = firstenv;
523 3b989d49 Alexander Graf
524 1db09b84 aurel32
    /* Fixup Memory size on a alignment boundary */
525 1db09b84 aurel32
    ram_size &= ~(RAM_SIZES_ALIGN - 1);
526 1db09b84 aurel32
527 1db09b84 aurel32
    /* Register Memory */
528 c5705a77 Avi Kivity
    memory_region_init_ram(ram, "mpc8544ds.ram", ram_size);
529 c5705a77 Avi Kivity
    vmstate_register_ram_global(ram);
530 2646c133 Avi Kivity
    memory_region_add_subregion(address_space_mem, 0, ram);
531 1db09b84 aurel32
532 3eddc1be Bharat Bhushan
    dev = qdev_create(NULL, "e500-ccsr");
533 3eddc1be Bharat Bhushan
    object_property_add_child(qdev_get_machine(), "e500-ccsr",
534 3eddc1be Bharat Bhushan
                              OBJECT(dev), NULL);
535 3eddc1be Bharat Bhushan
    qdev_init_nofail(dev);
536 3eddc1be Bharat Bhushan
    ccsr = CCSR(dev);
537 3eddc1be Bharat Bhushan
    ccsr_addr_space = &ccsr->ccsr_space;
538 3eddc1be Bharat Bhushan
    memory_region_add_subregion(address_space_mem, MPC8544_CCSRBAR_BASE,
539 3eddc1be Bharat Bhushan
                                ccsr_addr_space);
540 dffb1dc2 Bharat Bhushan
541 1db09b84 aurel32
    /* MPIC */
542 d0b72631 Alexander Graf
    mpic = g_new(qemu_irq, 256);
543 d0b72631 Alexander Graf
    dev = qdev_create(NULL, "openpic");
544 d0b72631 Alexander Graf
    qdev_prop_set_uint32(dev, "nb_cpus", smp_cpus);
545 f5fba9d2 Scott Wood
    qdev_prop_set_uint32(dev, "model", params->mpic_version);
546 d0b72631 Alexander Graf
    qdev_init_nofail(dev);
547 1356b98d Andreas Färber
    s = SYS_BUS_DEVICE(dev);
548 d0b72631 Alexander Graf
549 d0b72631 Alexander Graf
    k = 0;
550 d0b72631 Alexander Graf
    for (i = 0; i < smp_cpus; i++) {
551 d0b72631 Alexander Graf
        for (j = 0; j < OPENPIC_OUTPUT_NB; j++) {
552 d0b72631 Alexander Graf
            sysbus_connect_irq(s, k++, irqs[i][j]);
553 d0b72631 Alexander Graf
        }
554 d0b72631 Alexander Graf
    }
555 a915249f Alexander Graf
556 d0b72631 Alexander Graf
    for (i = 0; i < 256; i++) {
557 d0b72631 Alexander Graf
        mpic[i] = qdev_get_gpio_in(dev, i);
558 a915249f Alexander Graf
    }
559 1db09b84 aurel32
560 d0b72631 Alexander Graf
    memory_region_add_subregion(ccsr_addr_space, MPC8544_MPIC_REGS_OFFSET,
561 d0b72631 Alexander Graf
                                s->mmio[0].memory);
562 d0b72631 Alexander Graf
563 1db09b84 aurel32
    /* Serial */
564 2d48377a Blue Swirl
    if (serial_hds[0]) {
565 3eddc1be Bharat Bhushan
        serial_mm_init(ccsr_addr_space, MPC8544_SERIAL0_REGS_OFFSET,
566 cdbb912a Alexander Graf
                       0, mpic[42], 399193,
567 2ff0c7c3 Richard Henderson
                       serial_hds[0], DEVICE_BIG_ENDIAN);
568 2d48377a Blue Swirl
    }
569 1db09b84 aurel32
570 2d48377a Blue Swirl
    if (serial_hds[1]) {
571 3eddc1be Bharat Bhushan
        serial_mm_init(ccsr_addr_space, MPC8544_SERIAL1_REGS_OFFSET,
572 cdbb912a Alexander Graf
                       0, mpic[42], 399193,
573 59de4f98 Bharat Bhushan
                       serial_hds[1], DEVICE_BIG_ENDIAN);
574 2d48377a Blue Swirl
    }
575 1db09b84 aurel32
576 b0fb8423 Alexander Graf
    /* General Utility device */
577 dffb1dc2 Bharat Bhushan
    dev = qdev_create(NULL, "mpc8544-guts");
578 dffb1dc2 Bharat Bhushan
    qdev_init_nofail(dev);
579 dffb1dc2 Bharat Bhushan
    s = SYS_BUS_DEVICE(dev);
580 3eddc1be Bharat Bhushan
    memory_region_add_subregion(ccsr_addr_space, MPC8544_UTIL_OFFSET,
581 dffb1dc2 Bharat Bhushan
                                sysbus_mmio_get_region(s, 0));
582 b0fb8423 Alexander Graf
583 1db09b84 aurel32
    /* PCI */
584 dffb1dc2 Bharat Bhushan
    dev = qdev_create(NULL, "e500-pcihost");
585 492ec48d Alexander Graf
    qdev_prop_set_uint32(dev, "first_slot", params->pci_first_slot);
586 dffb1dc2 Bharat Bhushan
    qdev_init_nofail(dev);
587 dffb1dc2 Bharat Bhushan
    s = SYS_BUS_DEVICE(dev);
588 dffb1dc2 Bharat Bhushan
    sysbus_connect_irq(s, 0, mpic[pci_irq_nrs[0]]);
589 dffb1dc2 Bharat Bhushan
    sysbus_connect_irq(s, 1, mpic[pci_irq_nrs[1]]);
590 dffb1dc2 Bharat Bhushan
    sysbus_connect_irq(s, 2, mpic[pci_irq_nrs[2]]);
591 dffb1dc2 Bharat Bhushan
    sysbus_connect_irq(s, 3, mpic[pci_irq_nrs[3]]);
592 3eddc1be Bharat Bhushan
    memory_region_add_subregion(ccsr_addr_space, MPC8544_PCI_REGS_OFFSET,
593 dffb1dc2 Bharat Bhushan
                                sysbus_mmio_get_region(s, 0));
594 dffb1dc2 Bharat Bhushan
595 d461e3b9 Alexander Graf
    pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci.0");
596 1db09b84 aurel32
    if (!pci_bus)
597 1db09b84 aurel32
        printf("couldn't create PCI controller!\n");
598 1db09b84 aurel32
599 1356b98d Andreas Färber
    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, MPC8544_PCI_IO);
600 1db09b84 aurel32
601 1db09b84 aurel32
    if (pci_bus) {
602 1db09b84 aurel32
        /* Register network interfaces. */
603 1db09b84 aurel32
        for (i = 0; i < nb_nics; i++) {
604 07caea31 Markus Armbruster
            pci_nic_init_nofail(&nd_table[i], "virtio", NULL);
605 1db09b84 aurel32
        }
606 1db09b84 aurel32
    }
607 1db09b84 aurel32
608 5c145dac Alexander Graf
    /* Register spinning region */
609 5c145dac Alexander Graf
    sysbus_create_simple("e500-spin", MPC8544_SPIN_BASE, NULL);
610 5c145dac Alexander Graf
611 1db09b84 aurel32
    /* Load kernel. */
612 e6eaabeb Scott Wood
    if (params->kernel_filename) {
613 e6eaabeb Scott Wood
        kernel_size = load_uimage(params->kernel_filename, &entry,
614 e6eaabeb Scott Wood
                                  &loadaddr, NULL);
615 1db09b84 aurel32
        if (kernel_size < 0) {
616 e6eaabeb Scott Wood
            kernel_size = load_elf(params->kernel_filename, NULL, NULL,
617 e6eaabeb Scott Wood
                                   &elf_entry, &elf_lowaddr, NULL, 1,
618 e6eaabeb Scott Wood
                                   ELF_MACHINE, 0);
619 1db09b84 aurel32
            entry = elf_entry;
620 1db09b84 aurel32
            loadaddr = elf_lowaddr;
621 1db09b84 aurel32
        }
622 1db09b84 aurel32
        /* XXX try again as binary */
623 1db09b84 aurel32
        if (kernel_size < 0) {
624 1db09b84 aurel32
            fprintf(stderr, "qemu: could not load kernel '%s'\n",
625 e6eaabeb Scott Wood
                    params->kernel_filename);
626 1db09b84 aurel32
            exit(1);
627 1db09b84 aurel32
        }
628 528e536e Alexander Graf
629 528e536e Alexander Graf
        cur_base = loadaddr + kernel_size;
630 b8dec144 Alexander Graf
631 b8dec144 Alexander Graf
        /* Reserve space for dtb */
632 b8dec144 Alexander Graf
        dt_base = (cur_base + DTC_LOAD_PAD) & ~DTC_PAD_MASK;
633 b8dec144 Alexander Graf
        cur_base += DTB_MAX_SIZE;
634 1db09b84 aurel32
    }
635 1db09b84 aurel32
636 1db09b84 aurel32
    /* Load initrd. */
637 e6eaabeb Scott Wood
    if (params->initrd_filename) {
638 528e536e Alexander Graf
        initrd_base = (cur_base + INITRD_LOAD_PAD) & ~INITRD_PAD_MASK;
639 e6eaabeb Scott Wood
        initrd_size = load_image_targphys(params->initrd_filename, initrd_base,
640 d7585251 pbrook
                                          ram_size - initrd_base);
641 1db09b84 aurel32
642 1db09b84 aurel32
        if (initrd_size < 0) {
643 1db09b84 aurel32
            fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
644 e6eaabeb Scott Wood
                    params->initrd_filename);
645 1db09b84 aurel32
            exit(1);
646 1db09b84 aurel32
        }
647 528e536e Alexander Graf
648 528e536e Alexander Graf
        cur_base = initrd_base + initrd_size;
649 1db09b84 aurel32
    }
650 1db09b84 aurel32
651 1db09b84 aurel32
    /* If we're loading a kernel directly, we must load the device tree too. */
652 e6eaabeb Scott Wood
    if (params->kernel_filename) {
653 5c145dac Alexander Graf
        struct boot_info *boot_info;
654 cba2026a Alexander Graf
        int dt_size;
655 5c145dac Alexander Graf
656 e6eaabeb Scott Wood
        dt_size = ppce500_load_device_tree(env, params, dt_base, initrd_base,
657 e6eaabeb Scott Wood
                                           initrd_size);
658 cba2026a Alexander Graf
        if (dt_size < 0) {
659 1db09b84 aurel32
            fprintf(stderr, "couldn't load device tree\n");
660 1db09b84 aurel32
            exit(1);
661 1db09b84 aurel32
        }
662 b8dec144 Alexander Graf
        assert(dt_size < DTB_MAX_SIZE);
663 1db09b84 aurel32
664 e61c36d5 Alexander Graf
        boot_info = env->load_info;
665 3b989d49 Alexander Graf
        boot_info->entry = entry;
666 3b989d49 Alexander Graf
        boot_info->dt_base = dt_base;
667 cba2026a Alexander Graf
        boot_info->dt_size = dt_size;
668 1db09b84 aurel32
    }
669 1db09b84 aurel32
670 3b989d49 Alexander Graf
    if (kvm_enabled()) {
671 1db09b84 aurel32
        kvmppc_init();
672 3b989d49 Alexander Graf
    }
673 1db09b84 aurel32
}
674 3eddc1be Bharat Bhushan
675 3eddc1be Bharat Bhushan
static int e500_ccsr_initfn(SysBusDevice *dev)
676 3eddc1be Bharat Bhushan
{
677 3eddc1be Bharat Bhushan
    PPCE500CCSRState *ccsr;
678 3eddc1be Bharat Bhushan
679 3eddc1be Bharat Bhushan
    ccsr = CCSR(dev);
680 3eddc1be Bharat Bhushan
    memory_region_init(&ccsr->ccsr_space, "e500-ccsr",
681 3eddc1be Bharat Bhushan
                       MPC8544_CCSRBAR_SIZE);
682 3eddc1be Bharat Bhushan
    return 0;
683 3eddc1be Bharat Bhushan
}
684 3eddc1be Bharat Bhushan
685 3eddc1be Bharat Bhushan
static void e500_ccsr_class_init(ObjectClass *klass, void *data)
686 3eddc1be Bharat Bhushan
{
687 3eddc1be Bharat Bhushan
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
688 3eddc1be Bharat Bhushan
    k->init = e500_ccsr_initfn;
689 3eddc1be Bharat Bhushan
}
690 3eddc1be Bharat Bhushan
691 3eddc1be Bharat Bhushan
static const TypeInfo e500_ccsr_info = {
692 3eddc1be Bharat Bhushan
    .name          = TYPE_CCSR,
693 3eddc1be Bharat Bhushan
    .parent        = TYPE_SYS_BUS_DEVICE,
694 3eddc1be Bharat Bhushan
    .instance_size = sizeof(PPCE500CCSRState),
695 3eddc1be Bharat Bhushan
    .class_init    = e500_ccsr_class_init,
696 3eddc1be Bharat Bhushan
};
697 3eddc1be Bharat Bhushan
698 3eddc1be Bharat Bhushan
static void e500_register_types(void)
699 3eddc1be Bharat Bhushan
{
700 3eddc1be Bharat Bhushan
    type_register_static(&e500_ccsr_info);
701 3eddc1be Bharat Bhushan
}
702 3eddc1be Bharat Bhushan
703 3eddc1be Bharat Bhushan
type_init(e500_register_types)