virt.c 79.5 KB
Newer Older
P
Peter Maydell 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/*
 * ARM mach-virt emulation
 *
 * Copyright (c) 2013 Linaro Limited
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2 or later, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Emulate a virtual board which works by passing Linux all the information
 * it needs about what devices are present via the device tree.
 * There are some restrictions about what we can do here:
 *  + we can only present devices whose Linux drivers will work based
 *    purely on the device tree with no platform data at all
 *  + we want to present a very stripped-down minimalist platform,
 *    both because this reduces the security attack surface from the guest
 *    and also because it reduces our exposure to being broken when
 *    the kernel updates its device tree bindings and requires further
 *    information in a device binding that we aren't providing.
 * This is essentially the same approach kvmtool uses.
 */

P
Peter Maydell 已提交
31
#include "qemu/osdep.h"
32
#include "qemu-common.h"
33
#include "qemu/units.h"
34
#include "qemu/option.h"
35
#include "qapi/error.h"
P
Peter Maydell 已提交
36
#include "hw/sysbus.h"
37
#include "hw/boards.h"
38
#include "hw/arm/boot.h"
P
Peter Maydell 已提交
39
#include "hw/arm/primecell.h"
40
#include "hw/arm/virt.h"
41
#include "hw/block/flash.h"
42 43
#include "hw/vfio/vfio-calxeda-xgmac.h"
#include "hw/vfio/vfio-amd-xgbe.h"
44
#include "hw/display/ramfb.h"
P
Peter Maydell 已提交
45 46
#include "net/net.h"
#include "sysemu/device_tree.h"
47
#include "sysemu/numa.h"
P
Peter Maydell 已提交
48 49
#include "sysemu/sysemu.h"
#include "sysemu/kvm.h"
50
#include "hw/loader.h"
P
Peter Maydell 已提交
51 52 53
#include "exec/address-spaces.h"
#include "qemu/bitops.h"
#include "qemu/error-report.h"
54
#include "qemu/module.h"
55
#include "hw/pci-host/gpex.h"
56 57
#include "hw/arm/sysbus-fdt.h"
#include "hw/platform-bus.h"
58
#include "hw/qdev-properties.h"
59
#include "hw/arm/fdt.h"
60 61
#include "hw/intc/arm_gic.h"
#include "hw/intc/arm_gicv3_common.h"
M
Markus Armbruster 已提交
62
#include "hw/irq.h"
63
#include "kvm_arm.h"
64
#include "hw/firmware/smbios.h"
65
#include "qapi/visitor.h"
66
#include "standard-headers/linux/input.h"
67
#include "hw/arm/smmuv3.h"
68
#include "hw/acpi/acpi.h"
69
#include "target/arm/internals.h"
P
Peter Maydell 已提交
70

71
#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
72 73 74 75 76 77
    static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
                                                    void *data) \
    { \
        MachineClass *mc = MACHINE_CLASS(oc); \
        virt_machine_##major##_##minor##_options(mc); \
        mc->desc = "QEMU " # major "." # minor " ARM Virtual Machine"; \
78 79 80
        if (latest) { \
            mc->alias = "virt"; \
        } \
81 82 83 84 85 86 87 88 89 90 91 92
    } \
    static const TypeInfo machvirt_##major##_##minor##_info = { \
        .name = MACHINE_TYPE_NAME("virt-" # major "." # minor), \
        .parent = TYPE_VIRT_MACHINE, \
        .class_init = virt_##major##_##minor##_class_init, \
    }; \
    static void machvirt_machine_##major##_##minor##_init(void) \
    { \
        type_register_static(&machvirt_##major##_##minor##_info); \
    } \
    type_init(machvirt_machine_##major##_##minor##_init);

93 94 95 96 97
#define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor) \
    DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
#define DEFINE_VIRT_MACHINE(major, minor) \
    DEFINE_VIRT_MACHINE_LATEST(major, minor, false)

98

99 100 101 102 103
/* Number of external interrupt lines to configure the GIC with */
#define NUM_IRQS 256

#define PLATFORM_BUS_NUM_IRQS 64

104
/* Legacy RAM limit in GB (< version 4.0) */
105 106
#define LEGACY_RAMLIMIT_GB 255
#define LEGACY_RAMLIMIT_BYTES (LEGACY_RAMLIMIT_GB * GiB)
107

P
Peter Maydell 已提交
108 109 110 111 112 113 114 115 116
/* Addresses and sizes of our components.
 * 0..128MB is space for a flash device so we can run bootrom code such as UEFI.
 * 128MB..256MB is used for miscellaneous device I/O.
 * 256MB..1GB is reserved for possible future PCI support (ie where the
 * PCI memory window will go if we add a PCI host controller).
 * 1GB and up is RAM (which may happily spill over into the
 * high memory region beyond 4GB).
 * This represents a compromise between how much RAM can be given to
 * a 32 bit VM and leaving space for expansion and in particular for PCI.
P
Peter Maydell 已提交
117 118
 * Note that devices should generally be placed at multiples of 0x10000,
 * to accommodate guests using 64K pages.
P
Peter Maydell 已提交
119
 */
120
static const MemMapEntry base_memmap[] = {
P
Peter Maydell 已提交
121
    /* Space up to 0x8000000 is reserved for a boot ROM */
122 123
    [VIRT_FLASH] =              {          0, 0x08000000 },
    [VIRT_CPUPERIPHS] =         { 0x08000000, 0x00020000 },
P
Peter Maydell 已提交
124
    /* GIC distributor and CPU interfaces sit inside the CPU peripheral space */
125 126 127
    [VIRT_GIC_DIST] =           { 0x08000000, 0x00010000 },
    [VIRT_GIC_CPU] =            { 0x08010000, 0x00010000 },
    [VIRT_GIC_V2M] =            { 0x08020000, 0x00001000 },
128 129
    [VIRT_GIC_HYP] =            { 0x08030000, 0x00010000 },
    [VIRT_GIC_VCPU] =           { 0x08040000, 0x00010000 },
130 131 132 133
    /* The space in between here is reserved for GICv3 CPU/vCPU/HYP */
    [VIRT_GIC_ITS] =            { 0x08080000, 0x00020000 },
    /* This redistributor space allows up to 2*64kB*123 CPUs */
    [VIRT_GIC_REDIST] =         { 0x080A0000, 0x00F60000 },
134 135
    [VIRT_UART] =               { 0x09000000, 0x00001000 },
    [VIRT_RTC] =                { 0x09010000, 0x00001000 },
M
Marc Marí 已提交
136
    [VIRT_FW_CFG] =             { 0x09020000, 0x00000018 },
S
Shannon Zhao 已提交
137
    [VIRT_GPIO] =               { 0x09030000, 0x00001000 },
138
    [VIRT_SECURE_UART] =        { 0x09040000, 0x00001000 },
139
    [VIRT_SMMU] =               { 0x09050000, 0x00020000 },
140
    [VIRT_MMIO] =               { 0x0a000000, 0x00000200 },
P
Peter Maydell 已提交
141
    /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
142
    [VIRT_PLATFORM_BUS] =       { 0x0c000000, 0x02000000 },
143
    [VIRT_SECURE_MEM] =         { 0x0e000000, 0x01000000 },
144 145 146
    [VIRT_PCIE_MMIO] =          { 0x10000000, 0x2eff0000 },
    [VIRT_PCIE_PIO] =           { 0x3eff0000, 0x00010000 },
    [VIRT_PCIE_ECAM] =          { 0x3f000000, 0x01000000 },
147 148
    /* Actual RAM size depends on initial RAM and device memory settings */
    [VIRT_MEM] =                { GiB, LEGACY_RAMLIMIT_BYTES },
149 150 151 152 153 154 155 156 157 158 159 160 161
};

/*
 * Highmem IO Regions: This memory map is floating, located after the RAM.
 * Each MemMapEntry base (GPA) will be dynamically computed, depending on the
 * top of the RAM, so that its base get the same alignment as the size,
 * ie. a 512GiB entry will be aligned on a 512GiB boundary. If there is
 * less than 256GiB of RAM, the floating area starts at the 256GiB mark.
 * Note the extended_memmap is sized so that it eventually also includes the
 * base_memmap entries (VIRT_HIGH_GIC_REDIST2 index is greater than the last
 * index of base_memmap).
 */
static MemMapEntry extended_memmap[] = {
162
    /* Additional 64 MB redist region (can contain up to 512 redistributors) */
163 164 165 166
    [VIRT_HIGH_GIC_REDIST2] =   { 0x0, 64 * MiB },
    [VIRT_HIGH_PCIE_ECAM] =     { 0x0, 256 * MiB },
    /* Second PCIe window */
    [VIRT_HIGH_PCIE_MMIO] =     { 0x0, 512 * GiB },
P
Peter Maydell 已提交
167 168 169 170
};

static const int a15irqmap[] = {
    [VIRT_UART] = 1,
P
Peter Maydell 已提交
171
    [VIRT_RTC] = 2,
172
    [VIRT_PCIE] = 3, /* ... to 6 */
S
Shannon Zhao 已提交
173
    [VIRT_GPIO] = 7,
174
    [VIRT_SECURE_UART] = 8,
P
Peter Maydell 已提交
175
    [VIRT_MMIO] = 16, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */
176
    [VIRT_GIC_V2M] = 48, /* ...to 48 + NUM_GICV2M_SPIS - 1 */
177
    [VIRT_SMMU] = 74,    /* ...to 74 + NUM_SMMU_IRQS - 1 */
178
    [VIRT_PLATFORM_BUS] = 112, /* ...to 112 + PLATFORM_BUS_NUM_IRQS -1 */
P
Peter Maydell 已提交
179 180
};

181
static const char *valid_cpus[] = {
182
    ARM_CPU_TYPE_NAME("cortex-a7"),
183 184 185
    ARM_CPU_TYPE_NAME("cortex-a15"),
    ARM_CPU_TYPE_NAME("cortex-a53"),
    ARM_CPU_TYPE_NAME("cortex-a57"),
186
    ARM_CPU_TYPE_NAME("cortex-a72"),
187
    ARM_CPU_TYPE_NAME("host"),
188
    ARM_CPU_TYPE_NAME("max"),
P
Peter Maydell 已提交
189 190
};

191
static bool cpu_type_valid(const char *cpu)
P
Peter Maydell 已提交
192 193 194
{
    int i;

195 196 197
    for (i = 0; i < ARRAY_SIZE(valid_cpus); i++) {
        if (strcmp(cpu, valid_cpus[i]) == 0) {
            return true;
P
Peter Maydell 已提交
198 199
        }
    }
200
    return false;
P
Peter Maydell 已提交
201 202
}

203
static void create_fdt(VirtMachineState *vms)
P
Peter Maydell 已提交
204
{
205
    void *fdt = create_device_tree(&vms->fdt_size);
P
Peter Maydell 已提交
206 207 208 209 210 211

    if (!fdt) {
        error_report("create_device_tree() failed");
        exit(1);
    }

212
    vms->fdt = fdt;
P
Peter Maydell 已提交
213 214

    /* Header */
215 216 217
    qemu_fdt_setprop_string(fdt, "/", "compatible", "linux,dummy-virt");
    qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2);
    qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2);
P
Peter Maydell 已提交
218

219
    /* /chosen must exist for load_dtb to fill in necessary properties later */
220
    qemu_fdt_add_subnode(fdt, "/chosen");
P
Peter Maydell 已提交
221 222 223 224 225 226

    /* Clock node, for the benefit of the UART. The kernel device tree
     * binding documentation claims the PL011 node clock properties are
     * optional but in practice if you omit them the kernel refuses to
     * probe for the device.
     */
227
    vms->clock_phandle = qemu_fdt_alloc_phandle(fdt);
228 229 230 231 232
    qemu_fdt_add_subnode(fdt, "/apb-pclk");
    qemu_fdt_setprop_string(fdt, "/apb-pclk", "compatible", "fixed-clock");
    qemu_fdt_setprop_cell(fdt, "/apb-pclk", "#clock-cells", 0x0);
    qemu_fdt_setprop_cell(fdt, "/apb-pclk", "clock-frequency", 24000000);
    qemu_fdt_setprop_string(fdt, "/apb-pclk", "clock-output-names",
P
Peter Maydell 已提交
233
                                "clk24mhz");
234
    qemu_fdt_setprop_cell(fdt, "/apb-pclk", "phandle", vms->clock_phandle);
P
Peter Maydell 已提交
235

236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
    if (have_numa_distance) {
        int size = nb_numa_nodes * nb_numa_nodes * 3 * sizeof(uint32_t);
        uint32_t *matrix = g_malloc0(size);
        int idx, i, j;

        for (i = 0; i < nb_numa_nodes; i++) {
            for (j = 0; j < nb_numa_nodes; j++) {
                idx = (i * nb_numa_nodes + j) * 3;
                matrix[idx + 0] = cpu_to_be32(i);
                matrix[idx + 1] = cpu_to_be32(j);
                matrix[idx + 2] = cpu_to_be32(numa_info[i].distance[j]);
            }
        }

        qemu_fdt_add_subnode(fdt, "/distance-map");
        qemu_fdt_setprop_string(fdt, "/distance-map", "compatible",
                                "numa-distance-map-v1");
        qemu_fdt_setprop(fdt, "/distance-map", "distance-matrix",
                         matrix, size);
        g_free(matrix);
    }
257 258
}

259
static void fdt_add_timer_nodes(const VirtMachineState *vms)
P
Peter Maydell 已提交
260
{
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
    /* On real hardware these interrupts are level-triggered.
     * On KVM they were edge-triggered before host kernel version 4.4,
     * and level-triggered afterwards.
     * On emulated QEMU they are level-triggered.
     *
     * Getting the DTB info about them wrong is awkward for some
     * guest kernels:
     *  pre-4.8 ignore the DT and leave the interrupt configured
     *   with whatever the GIC reset value (or the bootloader) left it at
     *  4.8 before rc6 honour the incorrect data by programming it back
     *   into the GIC, causing problems
     *  4.8rc6 and later ignore the DT and always write "level triggered"
     *   into the GIC
     *
     * For backwards-compatibility, virt-2.8 and earlier will continue
     * to say these are edge-triggered, but later machines will report
     * the correct information.
P
Peter Maydell 已提交
278
     */
279
    ARMCPU *armcpu;
280 281 282 283 284 285
    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
    uint32_t irqflags = GIC_FDT_IRQ_FLAGS_LEVEL_HI;

    if (vmc->claim_edge_triggered_timers) {
        irqflags = GIC_FDT_IRQ_FLAGS_EDGE_LO_HI;
    }
P
Peter Maydell 已提交
286

287
    if (vms->gic_version == 2) {
288 289
        irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
                             GIC_FDT_IRQ_PPI_CPU_WIDTH,
290
                             (1 << vms->smp_cpus) - 1);
291
    }
P
Peter Maydell 已提交
292

293
    qemu_fdt_add_subnode(vms->fdt, "/timer");
294 295 296 297

    armcpu = ARM_CPU(qemu_get_cpu(0));
    if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) {
        const char compat[] = "arm,armv8-timer\0arm,armv7-timer";
298
        qemu_fdt_setprop(vms->fdt, "/timer", "compatible",
299 300
                         compat, sizeof(compat));
    } else {
301
        qemu_fdt_setprop_string(vms->fdt, "/timer", "compatible",
302 303
                                "arm,armv7-timer");
    }
304 305
    qemu_fdt_setprop(vms->fdt, "/timer", "always-on", NULL, 0);
    qemu_fdt_setprop_cells(vms->fdt, "/timer", "interrupts",
306 307 308 309
                       GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_S_EL1_IRQ, irqflags,
                       GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL1_IRQ, irqflags,
                       GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_VIRT_IRQ, irqflags,
                       GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL2_IRQ, irqflags);
P
Peter Maydell 已提交
310 311
}

312
static void fdt_add_cpu_nodes(const VirtMachineState *vms)
P
Peter Maydell 已提交
313 314
{
    int cpu;
315
    int addr_cells = 1;
316
    const MachineState *ms = MACHINE(vms);
317 318 319 320 321 322 323 324 325 326 327 328 329 330

    /*
     * From Documentation/devicetree/bindings/arm/cpus.txt
     *  On ARM v8 64-bit systems value should be set to 2,
     *  that corresponds to the MPIDR_EL1 register size.
     *  If MPIDR_EL1[63:32] value is equal to 0 on all CPUs
     *  in the system, #address-cells can be set to 1, since
     *  MPIDR_EL1[63:32] bits are not used for CPUs
     *  identification.
     *
     *  Here we actually don't know whether our system is 32- or 64-bit one.
     *  The simplest way to go is to examine affinity IDs of all our CPUs. If
     *  at least one of them has Aff3 populated, we set #address-cells to 2.
     */
331
    for (cpu = 0; cpu < vms->smp_cpus; cpu++) {
332 333 334 335 336 337 338
        ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));

        if (armcpu->mp_affinity & ARM_AFF3_MASK) {
            addr_cells = 2;
            break;
        }
    }
P
Peter Maydell 已提交
339

340 341 342
    qemu_fdt_add_subnode(vms->fdt, "/cpus");
    qemu_fdt_setprop_cell(vms->fdt, "/cpus", "#address-cells", addr_cells);
    qemu_fdt_setprop_cell(vms->fdt, "/cpus", "#size-cells", 0x0);
P
Peter Maydell 已提交
343

344
    for (cpu = vms->smp_cpus - 1; cpu >= 0; cpu--) {
P
Peter Maydell 已提交
345 346
        char *nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
        ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
347
        CPUState *cs = CPU(armcpu);
P
Peter Maydell 已提交
348

349 350 351
        qemu_fdt_add_subnode(vms->fdt, nodename);
        qemu_fdt_setprop_string(vms->fdt, nodename, "device_type", "cpu");
        qemu_fdt_setprop_string(vms->fdt, nodename, "compatible",
P
Peter Maydell 已提交
352 353
                                    armcpu->dtb_compatible);

354 355
        if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED
            && vms->smp_cpus > 1) {
356
            qemu_fdt_setprop_string(vms->fdt, nodename,
P
Peter Maydell 已提交
357 358 359
                                        "enable-method", "psci");
        }

360
        if (addr_cells == 2) {
361
            qemu_fdt_setprop_u64(vms->fdt, nodename, "reg",
362 363
                                 armcpu->mp_affinity);
        } else {
364
            qemu_fdt_setprop_cell(vms->fdt, nodename, "reg",
365 366 367
                                  armcpu->mp_affinity);
        }

368 369 370
        if (ms->possible_cpus->cpus[cs->cpu_index].props.has_node_id) {
            qemu_fdt_setprop_cell(vms->fdt, nodename, "numa-node-id",
                ms->possible_cpus->cpus[cs->cpu_index].props.node_id);
371 372
        }

P
Peter Maydell 已提交
373 374 375 376
        g_free(nodename);
    }
}

377
static void fdt_add_its_gic_node(VirtMachineState *vms)
P
Pavel Fedin 已提交
378
{
379 380
    char *nodename;

381
    vms->msi_phandle = qemu_fdt_alloc_phandle(vms->fdt);
382 383 384 385
    nodename = g_strdup_printf("/intc/its@%" PRIx64,
                               vms->memmap[VIRT_GIC_ITS].base);
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop_string(vms->fdt, nodename, "compatible",
P
Pavel Fedin 已提交
386
                            "arm,gic-v3-its");
387 388
    qemu_fdt_setprop(vms->fdt, nodename, "msi-controller", NULL, 0);
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
389 390
                                 2, vms->memmap[VIRT_GIC_ITS].base,
                                 2, vms->memmap[VIRT_GIC_ITS].size);
391 392
    qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", vms->msi_phandle);
    g_free(nodename);
P
Pavel Fedin 已提交
393 394
}

395
static void fdt_add_v2m_gic_node(VirtMachineState *vms)
P
Peter Maydell 已提交
396
{
397 398 399 400
    char *nodename;

    nodename = g_strdup_printf("/intc/v2m@%" PRIx64,
                               vms->memmap[VIRT_GIC_V2M].base);
401
    vms->msi_phandle = qemu_fdt_alloc_phandle(vms->fdt);
402 403
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop_string(vms->fdt, nodename, "compatible",
404
                            "arm,gic-v2m-frame");
405 406
    qemu_fdt_setprop(vms->fdt, nodename, "msi-controller", NULL, 0);
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
407 408
                                 2, vms->memmap[VIRT_GIC_V2M].base,
                                 2, vms->memmap[VIRT_GIC_V2M].size);
409 410
    qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", vms->msi_phandle);
    g_free(nodename);
411
}
P
Peter Maydell 已提交
412

413
static void fdt_add_gic_node(VirtMachineState *vms)
414
{
415 416
    char *nodename;

417 418 419
    vms->gic_phandle = qemu_fdt_alloc_phandle(vms->fdt);
    qemu_fdt_setprop_cell(vms->fdt, "/", "interrupt-parent", vms->gic_phandle);

420 421 422 423 424 425 426 427
    nodename = g_strdup_printf("/intc@%" PRIx64,
                               vms->memmap[VIRT_GIC_DIST].base);
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop_cell(vms->fdt, nodename, "#interrupt-cells", 3);
    qemu_fdt_setprop(vms->fdt, nodename, "interrupt-controller", NULL, 0);
    qemu_fdt_setprop_cell(vms->fdt, nodename, "#address-cells", 0x2);
    qemu_fdt_setprop_cell(vms->fdt, nodename, "#size-cells", 0x2);
    qemu_fdt_setprop(vms->fdt, nodename, "ranges", NULL, 0);
428
    if (vms->gic_version == 3) {
429 430
        int nb_redist_regions = virt_gicv3_redist_region_count(vms);

431
        qemu_fdt_setprop_string(vms->fdt, nodename, "compatible",
432
                                "arm,gic-v3");
433

434
        qemu_fdt_setprop_cell(vms->fdt, nodename,
435 436 437
                              "#redistributor-regions", nb_redist_regions);

        if (nb_redist_regions == 1) {
438
            qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
439 440 441 442 443
                                         2, vms->memmap[VIRT_GIC_DIST].base,
                                         2, vms->memmap[VIRT_GIC_DIST].size,
                                         2, vms->memmap[VIRT_GIC_REDIST].base,
                                         2, vms->memmap[VIRT_GIC_REDIST].size);
        } else {
444
            qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
445 446 447 448 449 450
                                 2, vms->memmap[VIRT_GIC_DIST].base,
                                 2, vms->memmap[VIRT_GIC_DIST].size,
                                 2, vms->memmap[VIRT_GIC_REDIST].base,
                                 2, vms->memmap[VIRT_GIC_REDIST].size,
                                 2, vms->memmap[VIRT_HIGH_GIC_REDIST2].base,
                                 2, vms->memmap[VIRT_HIGH_GIC_REDIST2].size);
451 452
        }

453
        if (vms->virt) {
454
            qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
455
                                   GIC_FDT_IRQ_TYPE_PPI, ARCH_GIC_MAINT_IRQ,
456 457
                                   GIC_FDT_IRQ_FLAGS_LEVEL_HI);
        }
458 459
    } else {
        /* 'cortex-a15-gic' means 'GIC v2' */
460
        qemu_fdt_setprop_string(vms->fdt, nodename, "compatible",
461
                                "arm,cortex-a15-gic");
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
        if (!vms->virt) {
            qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
                                         2, vms->memmap[VIRT_GIC_DIST].base,
                                         2, vms->memmap[VIRT_GIC_DIST].size,
                                         2, vms->memmap[VIRT_GIC_CPU].base,
                                         2, vms->memmap[VIRT_GIC_CPU].size);
        } else {
            qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
                                         2, vms->memmap[VIRT_GIC_DIST].base,
                                         2, vms->memmap[VIRT_GIC_DIST].size,
                                         2, vms->memmap[VIRT_GIC_CPU].base,
                                         2, vms->memmap[VIRT_GIC_CPU].size,
                                         2, vms->memmap[VIRT_GIC_HYP].base,
                                         2, vms->memmap[VIRT_GIC_HYP].size,
                                         2, vms->memmap[VIRT_GIC_VCPU].base,
                                         2, vms->memmap[VIRT_GIC_VCPU].size);
            qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
                                   GIC_FDT_IRQ_TYPE_PPI, ARCH_GIC_MAINT_IRQ,
                                   GIC_FDT_IRQ_FLAGS_LEVEL_HI);
        }
482 483
    }

484 485
    qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", vms->gic_phandle);
    g_free(nodename);
P
Peter Maydell 已提交
486 487
}

488
static void fdt_add_pmu_nodes(const VirtMachineState *vms)
489 490 491 492 493 494 495
{
    CPUState *cpu;
    ARMCPU *armcpu;
    uint32_t irqflags = GIC_FDT_IRQ_FLAGS_LEVEL_HI;

    CPU_FOREACH(cpu) {
        armcpu = ARM_CPU(cpu);
496
        if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
497 498
            return;
        }
499
        if (kvm_enabled()) {
500 501
            if (kvm_irqchip_in_kernel()) {
                kvm_arm_pmu_set_irq(cpu, PPI(VIRTUAL_PMU_IRQ));
502
            }
503
            kvm_arm_pmu_init(cpu);
504
        }
505 506
    }

507
    if (vms->gic_version == 2) {
508 509
        irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
                             GIC_FDT_IRQ_PPI_CPU_WIDTH,
510
                             (1 << vms->smp_cpus) - 1);
511 512 513
    }

    armcpu = ARM_CPU(qemu_get_cpu(0));
514
    qemu_fdt_add_subnode(vms->fdt, "/pmu");
515 516
    if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) {
        const char compat[] = "arm,armv8-pmuv3";
517
        qemu_fdt_setprop(vms->fdt, "/pmu", "compatible",
518
                         compat, sizeof(compat));
519
        qemu_fdt_setprop_cells(vms->fdt, "/pmu", "interrupts",
520 521 522 523
                               GIC_FDT_IRQ_TYPE_PPI, VIRTUAL_PMU_IRQ, irqflags);
    }
}

524
static void create_its(VirtMachineState *vms, DeviceState *gicdev)
P
Pavel Fedin 已提交
525 526 527 528 529 530 531 532 533 534 535 536 537 538
{
    const char *itsclass = its_class_name();
    DeviceState *dev;

    if (!itsclass) {
        /* Do nothing if not supported */
        return;
    }

    dev = qdev_create(NULL, itsclass);

    object_property_set_link(OBJECT(dev), OBJECT(gicdev), "parent-gicv3",
                             &error_abort);
    qdev_init_nofail(dev);
539
    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base);
P
Pavel Fedin 已提交
540

541
    fdt_add_its_gic_node(vms);
P
Pavel Fedin 已提交
542 543
}

544
static void create_v2m(VirtMachineState *vms, qemu_irq *pic)
545 546
{
    int i;
547
    int irq = vms->irqmap[VIRT_GIC_V2M];
548 549 550
    DeviceState *dev;

    dev = qdev_create(NULL, "arm-gicv2m");
551
    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_V2M].base);
552 553 554 555 556 557 558 559
    qdev_prop_set_uint32(dev, "base-spi", irq);
    qdev_prop_set_uint32(dev, "num-spi", NUM_GICV2M_SPIS);
    qdev_init_nofail(dev);

    for (i = 0; i < NUM_GICV2M_SPIS; i++) {
        sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
    }

560
    fdt_add_v2m_gic_node(vms);
561 562
}

563
static void create_gic(VirtMachineState *vms, qemu_irq *pic)
564
{
565
    MachineState *ms = MACHINE(vms);
566
    /* We create a standalone GIC */
567 568
    DeviceState *gicdev;
    SysBusDevice *gicbusdev;
569
    const char *gictype;
570
    int type = vms->gic_version, i;
571
    unsigned int smp_cpus = ms->smp.cpus;
572
    uint32_t nb_redist_regions = 0;
573

574
    gictype = (type == 3) ? gicv3_class_name() : gic_class_name();
575 576

    gicdev = qdev_create(NULL, gictype);
577
    qdev_prop_set_uint32(gicdev, "revision", type);
578 579 580 581 582
    qdev_prop_set_uint32(gicdev, "num-cpu", smp_cpus);
    /* Note that the num-irq property counts both internal and external
     * interrupts; there are always 32 of the former (mandated by GIC spec).
     */
    qdev_prop_set_uint32(gicdev, "num-irq", NUM_IRQS + 32);
583
    if (!kvm_irqchip_in_kernel()) {
584
        qdev_prop_set_bit(gicdev, "has-security-extensions", vms->secure);
585
    }
586 587 588 589 590 591

    if (type == 3) {
        uint32_t redist0_capacity =
                    vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;
        uint32_t redist0_count = MIN(smp_cpus, redist0_capacity);

592 593 594 595
        nb_redist_regions = virt_gicv3_redist_region_count(vms);

        qdev_prop_set_uint32(gicdev, "len-redist-region-count",
                             nb_redist_regions);
596
        qdev_prop_set_uint32(gicdev, "redist-region-count[0]", redist0_count);
597 598 599

        if (nb_redist_regions == 2) {
            uint32_t redist1_capacity =
600
                    vms->memmap[VIRT_HIGH_GIC_REDIST2].size / GICV3_REDIST_SIZE;
601 602 603 604

            qdev_prop_set_uint32(gicdev, "redist-region-count[1]",
                MIN(smp_cpus - redist0_count, redist1_capacity));
        }
605 606 607 608 609
    } else {
        if (!kvm_irqchip_in_kernel()) {
            qdev_prop_set_bit(gicdev, "has-virtualization-extensions",
                              vms->virt);
        }
610
    }
611 612
    qdev_init_nofail(gicdev);
    gicbusdev = SYS_BUS_DEVICE(gicdev);
613
    sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base);
614
    if (type == 3) {
615
        sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_REDIST].base);
616
        if (nb_redist_regions == 2) {
617 618
            sysbus_mmio_map(gicbusdev, 2,
                            vms->memmap[VIRT_HIGH_GIC_REDIST2].base);
619
        }
620
    } else {
621
        sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_CPU].base);
622 623 624 625
        if (vms->virt) {
            sysbus_mmio_map(gicbusdev, 2, vms->memmap[VIRT_GIC_HYP].base);
            sysbus_mmio_map(gicbusdev, 3, vms->memmap[VIRT_GIC_VCPU].base);
        }
626
    }
627

628 629 630
    /* Wire the outputs from each CPU's generic timer and the GICv3
     * maintenance interrupt signal to the appropriate GIC PPI inputs,
     * and the GIC's IRQ/FIQ/VIRQ/VFIQ interrupt outputs to the CPU's inputs.
631 632 633
     */
    for (i = 0; i < smp_cpus; i++) {
        DeviceState *cpudev = DEVICE(qemu_get_cpu(i));
634
        int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
635 636 637
        int irq;
        /* Mapping from the output timer irq lines from the CPU to the
         * GIC PPI inputs we use for the virt board.
638
         */
639 640 641 642 643 644 645 646 647 648 649 650
        const int timer_irq[] = {
            [GTIMER_PHYS] = ARCH_TIMER_NS_EL1_IRQ,
            [GTIMER_VIRT] = ARCH_TIMER_VIRT_IRQ,
            [GTIMER_HYP]  = ARCH_TIMER_NS_EL2_IRQ,
            [GTIMER_SEC]  = ARCH_TIMER_S_EL1_IRQ,
        };

        for (irq = 0; irq < ARRAY_SIZE(timer_irq); irq++) {
            qdev_connect_gpio_out(cpudev, irq,
                                  qdev_get_gpio_in(gicdev,
                                                   ppibase + timer_irq[irq]));
        }
651

652 653 654 655 656 657 658 659 660 661 662
        if (type == 3) {
            qemu_irq irq = qdev_get_gpio_in(gicdev,
                                            ppibase + ARCH_GIC_MAINT_IRQ);
            qdev_connect_gpio_out_named(cpudev, "gicv3-maintenance-interrupt",
                                        0, irq);
        } else if (vms->virt) {
            qemu_irq irq = qdev_get_gpio_in(gicdev,
                                            ppibase + ARCH_GIC_MAINT_IRQ);
            sysbus_connect_irq(gicbusdev, i + 4 * smp_cpus, irq);
        }

663 664 665
        qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0,
                                    qdev_get_gpio_in(gicdev, ppibase
                                                     + VIRTUAL_PMU_IRQ));
666

667
        sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
668 669
        sysbus_connect_irq(gicbusdev, i + smp_cpus,
                           qdev_get_gpio_in(cpudev, ARM_CPU_FIQ));
670 671 672 673
        sysbus_connect_irq(gicbusdev, i + 2 * smp_cpus,
                           qdev_get_gpio_in(cpudev, ARM_CPU_VIRQ));
        sysbus_connect_irq(gicbusdev, i + 3 * smp_cpus,
                           qdev_get_gpio_in(cpudev, ARM_CPU_VFIQ));
674 675 676 677 678 679
    }

    for (i = 0; i < NUM_IRQS; i++) {
        pic[i] = qdev_get_gpio_in(gicdev, i);
    }

680
    fdt_add_gic_node(vms);
681

682
    if (type == 3 && vms->its) {
683
        create_its(vms, gicdev);
684
    } else if (type == 2) {
685
        create_v2m(vms, pic);
686
    }
687 688
}

689
static void create_uart(const VirtMachineState *vms, qemu_irq *pic, int uart,
690
                        MemoryRegion *mem, Chardev *chr)
P
Peter Maydell 已提交
691 692
{
    char *nodename;
693 694 695
    hwaddr base = vms->memmap[uart].base;
    hwaddr size = vms->memmap[uart].size;
    int irq = vms->irqmap[uart];
P
Peter Maydell 已提交
696 697
    const char compat[] = "arm,pl011\0arm,primecell";
    const char clocknames[] = "uartclk\0apb_pclk";
698 699
    DeviceState *dev = qdev_create(NULL, "pl011");
    SysBusDevice *s = SYS_BUS_DEVICE(dev);
P
Peter Maydell 已提交
700

X
xiaoqiang zhao 已提交
701
    qdev_prop_set_chr(dev, "chardev", chr);
702 703 704 705
    qdev_init_nofail(dev);
    memory_region_add_subregion(mem, base,
                                sysbus_mmio_get_region(s, 0));
    sysbus_connect_irq(s, 0, pic[irq]);
P
Peter Maydell 已提交
706 707

    nodename = g_strdup_printf("/pl011@%" PRIx64, base);
708
    qemu_fdt_add_subnode(vms->fdt, nodename);
P
Peter Maydell 已提交
709
    /* Note that we can't use setprop_string because of the embedded NUL */
710
    qemu_fdt_setprop(vms->fdt, nodename, "compatible",
P
Peter Maydell 已提交
711
                         compat, sizeof(compat));
712
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
P
Peter Maydell 已提交
713
                                     2, base, 2, size);
714
    qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
P
Peter Maydell 已提交
715
                               GIC_FDT_IRQ_TYPE_SPI, irq,
716
                               GIC_FDT_IRQ_FLAGS_LEVEL_HI);
717 718 719
    qemu_fdt_setprop_cells(vms->fdt, nodename, "clocks",
                               vms->clock_phandle, vms->clock_phandle);
    qemu_fdt_setprop(vms->fdt, nodename, "clock-names",
P
Peter Maydell 已提交
720
                         clocknames, sizeof(clocknames));
721

722
    if (uart == VIRT_UART) {
723
        qemu_fdt_setprop_string(vms->fdt, "/chosen", "stdout-path", nodename);
724 725
    } else {
        /* Mark as not usable by the normal world */
726 727
        qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled");
        qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay");
728 729 730 731

        qemu_fdt_add_subnode(vms->fdt, "/secure-chosen");
        qemu_fdt_setprop_string(vms->fdt, "/secure-chosen", "stdout-path",
                                nodename);
732 733
    }

P
Peter Maydell 已提交
734 735 736
    g_free(nodename);
}

737
static void create_rtc(const VirtMachineState *vms, qemu_irq *pic)
P
Peter Maydell 已提交
738 739
{
    char *nodename;
740 741 742
    hwaddr base = vms->memmap[VIRT_RTC].base;
    hwaddr size = vms->memmap[VIRT_RTC].size;
    int irq = vms->irqmap[VIRT_RTC];
P
Peter Maydell 已提交
743 744 745 746 747
    const char compat[] = "arm,pl031\0arm,primecell";

    sysbus_create_simple("pl031", base, pic[irq]);

    nodename = g_strdup_printf("/pl031@%" PRIx64, base);
748 749 750
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop(vms->fdt, nodename, "compatible", compat, sizeof(compat));
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
P
Peter Maydell 已提交
751
                                 2, base, 2, size);
752
    qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
P
Peter Maydell 已提交
753
                           GIC_FDT_IRQ_TYPE_SPI, irq,
754
                           GIC_FDT_IRQ_FLAGS_LEVEL_HI);
755 756
    qemu_fdt_setprop_cell(vms->fdt, nodename, "clocks", vms->clock_phandle);
    qemu_fdt_setprop_string(vms->fdt, nodename, "clock-names", "apb_pclk");
P
Peter Maydell 已提交
757 758 759
    g_free(nodename);
}

760
static DeviceState *gpio_key_dev;
761 762 763
static void virt_powerdown_req(Notifier *n, void *opaque)
{
    /* use gpio Pin 3 for power button event */
764
    qemu_set_irq(qdev_get_gpio_in(gpio_key_dev, 0), 1);
765 766 767 768 769 770
}

static Notifier virt_system_powerdown_notifier = {
    .notify = virt_powerdown_req
};

771
static void create_gpio(const VirtMachineState *vms, qemu_irq *pic)
S
Shannon Zhao 已提交
772 773
{
    char *nodename;
774
    DeviceState *pl061_dev;
775 776 777
    hwaddr base = vms->memmap[VIRT_GPIO].base;
    hwaddr size = vms->memmap[VIRT_GPIO].size;
    int irq = vms->irqmap[VIRT_GPIO];
S
Shannon Zhao 已提交
778 779
    const char compat[] = "arm,pl061\0arm,primecell";

780
    pl061_dev = sysbus_create_simple("pl061", base, pic[irq]);
S
Shannon Zhao 已提交
781

782
    uint32_t phandle = qemu_fdt_alloc_phandle(vms->fdt);
S
Shannon Zhao 已提交
783
    nodename = g_strdup_printf("/pl061@%" PRIx64, base);
784 785
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
S
Shannon Zhao 已提交
786
                                 2, base, 2, size);
787 788 789 790
    qemu_fdt_setprop(vms->fdt, nodename, "compatible", compat, sizeof(compat));
    qemu_fdt_setprop_cell(vms->fdt, nodename, "#gpio-cells", 2);
    qemu_fdt_setprop(vms->fdt, nodename, "gpio-controller", NULL, 0);
    qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
S
Shannon Zhao 已提交
791 792
                           GIC_FDT_IRQ_TYPE_SPI, irq,
                           GIC_FDT_IRQ_FLAGS_LEVEL_HI);
793 794 795
    qemu_fdt_setprop_cell(vms->fdt, nodename, "clocks", vms->clock_phandle);
    qemu_fdt_setprop_string(vms->fdt, nodename, "clock-names", "apb_pclk");
    qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", phandle);
796

797 798
    gpio_key_dev = sysbus_create_simple("gpio-key", -1,
                                        qdev_get_gpio_in(pl061_dev, 3));
799 800 801 802
    qemu_fdt_add_subnode(vms->fdt, "/gpio-keys");
    qemu_fdt_setprop_string(vms->fdt, "/gpio-keys", "compatible", "gpio-keys");
    qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#size-cells", 0);
    qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#address-cells", 1);
803

804 805
    qemu_fdt_add_subnode(vms->fdt, "/gpio-keys/poweroff");
    qemu_fdt_setprop_string(vms->fdt, "/gpio-keys/poweroff",
806
                            "label", "GPIO Key Poweroff");
807
    qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys/poweroff", "linux,code",
808
                          KEY_POWER);
809
    qemu_fdt_setprop_cells(vms->fdt, "/gpio-keys/poweroff",
810
                           "gpios", phandle, 3, 0);
S
Shannon Zhao 已提交
811

812 813 814
    /* connect powerdown request */
    qemu_register_powerdown_notifier(&virt_system_powerdown_notifier);

S
Shannon Zhao 已提交
815 816 817
    g_free(nodename);
}

818
static void create_virtio_devices(const VirtMachineState *vms, qemu_irq *pic)
P
Peter Maydell 已提交
819 820
{
    int i;
821
    hwaddr size = vms->memmap[VIRT_MMIO].size;
P
Peter Maydell 已提交
822

823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848
    /* We create the transports in forwards order. Since qbus_realize()
     * prepends (not appends) new child buses, the incrementing loop below will
     * create a list of virtio-mmio buses with decreasing base addresses.
     *
     * When a -device option is processed from the command line,
     * qbus_find_recursive() picks the next free virtio-mmio bus in forwards
     * order. The upshot is that -device options in increasing command line
     * order are mapped to virtio-mmio buses with decreasing base addresses.
     *
     * When this code was originally written, that arrangement ensured that the
     * guest Linux kernel would give the lowest "name" (/dev/vda, eth0, etc) to
     * the first -device on the command line. (The end-to-end order is a
     * function of this loop, qbus_realize(), qbus_find_recursive(), and the
     * guest kernel's name-to-address assignment strategy.)
     *
     * Meanwhile, the kernel's traversal seems to have been reversed; see eg.
     * the message, if not necessarily the code, of commit 70161ff336.
     * Therefore the loop now establishes the inverse of the original intent.
     *
     * Unfortunately, we can't counteract the kernel change by reversing the
     * loop; it would break existing command lines.
     *
     * In any case, the kernel makes no guarantee about the stability of
     * enumeration order of virtio devices (as demonstrated by it changing
     * between kernel versions). For reliable and stable identification
     * of disks users must use UUIDs or similar mechanisms.
P
Peter Maydell 已提交
849 850
     */
    for (i = 0; i < NUM_VIRTIO_TRANSPORTS; i++) {
851 852
        int irq = vms->irqmap[VIRT_MMIO] + i;
        hwaddr base = vms->memmap[VIRT_MMIO].base + i * size;
P
Peter Maydell 已提交
853 854 855 856

        sysbus_create_simple("virtio-mmio", base, pic[irq]);
    }

857 858 859 860 861 862 863
    /* We add dtb nodes in reverse order so that they appear in the finished
     * device tree lowest address first.
     *
     * Note that this mapping is independent of the loop above. The previous
     * loop influences virtio device to virtio transport assignment, whereas
     * this loop controls how virtio transports are laid out in the dtb.
     */
P
Peter Maydell 已提交
864 865
    for (i = NUM_VIRTIO_TRANSPORTS - 1; i >= 0; i--) {
        char *nodename;
866 867
        int irq = vms->irqmap[VIRT_MMIO] + i;
        hwaddr base = vms->memmap[VIRT_MMIO].base + i * size;
P
Peter Maydell 已提交
868 869

        nodename = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
870 871
        qemu_fdt_add_subnode(vms->fdt, nodename);
        qemu_fdt_setprop_string(vms->fdt, nodename,
872
                                "compatible", "virtio,mmio");
873
        qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
874
                                     2, base, 2, size);
875
        qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
876 877
                               GIC_FDT_IRQ_TYPE_SPI, irq,
                               GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
878
        qemu_fdt_setprop(vms->fdt, nodename, "dma-coherent", NULL, 0);
P
Peter Maydell 已提交
879 880 881 882
        g_free(nodename);
    }
}

883 884 885 886 887
#define VIRT_FLASH_SECTOR_SIZE (256 * KiB)

static PFlashCFI01 *virt_flash_create1(VirtMachineState *vms,
                                        const char *name,
                                        const char *alias_prop_name)
888
{
889 890 891
    /*
     * Create a single flash device.  We use the same parameters as
     * the flash devices on the Versatile Express board.
892
     */
893
    DeviceState *dev = qdev_create(NULL, TYPE_PFLASH_CFI01);
894

895
    qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
896 897
    qdev_prop_set_uint8(dev, "width", 4);
    qdev_prop_set_uint8(dev, "device-width", 2);
898
    qdev_prop_set_bit(dev, "big-endian", false);
899 900 901 902 903
    qdev_prop_set_uint16(dev, "id0", 0x89);
    qdev_prop_set_uint16(dev, "id1", 0x18);
    qdev_prop_set_uint16(dev, "id2", 0x00);
    qdev_prop_set_uint16(dev, "id3", 0x00);
    qdev_prop_set_string(dev, "name", name);
904 905 906 907 908 909
    object_property_add_child(OBJECT(vms), name, OBJECT(dev),
                              &error_abort);
    object_property_add_alias(OBJECT(vms), alias_prop_name,
                              OBJECT(dev), "drive", &error_abort);
    return PFLASH_CFI01(dev);
}
910

911 912 913 914 915
static void virt_flash_create(VirtMachineState *vms)
{
    vms->flash[0] = virt_flash_create1(vms, "virt.flash0", "pflash0");
    vms->flash[1] = virt_flash_create1(vms, "virt.flash1", "pflash1");
}
916

917 918 919 920 921
static void virt_flash_map1(PFlashCFI01 *flash,
                            hwaddr base, hwaddr size,
                            MemoryRegion *sysmem)
{
    DeviceState *dev = DEVICE(flash);
922

923 924 925 926 927 928 929 930
    assert(size % VIRT_FLASH_SECTOR_SIZE == 0);
    assert(size / VIRT_FLASH_SECTOR_SIZE <= UINT32_MAX);
    qdev_prop_set_uint32(dev, "num-blocks", size / VIRT_FLASH_SECTOR_SIZE);
    qdev_init_nofail(dev);

    memory_region_add_subregion(sysmem, base,
                                sysbus_mmio_get_region(SYS_BUS_DEVICE(dev),
                                                       0));
931 932
}

933 934 935
static void virt_flash_map(VirtMachineState *vms,
                           MemoryRegion *sysmem,
                           MemoryRegion *secure_sysmem)
936
{
937 938
    /*
     * Map two flash devices to fill the VIRT_FLASH space in the memmap.
939 940 941 942 943
     * sysmem is the system memory space. secure_sysmem is the secure view
     * of the system, and the first flash device should be made visible only
     * there. The second flash device is visible to both secure and nonsecure.
     * If sysmem == secure_sysmem this means there is no separate Secure
     * address space and both flash devices are generally visible.
944
     */
945 946
    hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2;
    hwaddr flashbase = vms->memmap[VIRT_FLASH].base;
947

948 949 950 951 952 953 954 955 956 957 958 959 960
    virt_flash_map1(vms->flash[0], flashbase, flashsize,
                    secure_sysmem);
    virt_flash_map1(vms->flash[1], flashbase + flashsize, flashsize,
                    sysmem);
}

static void virt_flash_fdt(VirtMachineState *vms,
                           MemoryRegion *sysmem,
                           MemoryRegion *secure_sysmem)
{
    hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2;
    hwaddr flashbase = vms->memmap[VIRT_FLASH].base;
    char *nodename;
961

962 963 964
    if (sysmem == secure_sysmem) {
        /* Report both flash devices as a single node in the DT */
        nodename = g_strdup_printf("/flash@%" PRIx64, flashbase);
965 966 967
        qemu_fdt_add_subnode(vms->fdt, nodename);
        qemu_fdt_setprop_string(vms->fdt, nodename, "compatible", "cfi-flash");
        qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
968 969
                                     2, flashbase, 2, flashsize,
                                     2, flashbase + flashsize, 2, flashsize);
970
        qemu_fdt_setprop_cell(vms->fdt, nodename, "bank-width", 4);
971 972
        g_free(nodename);
    } else {
973 974
        /*
         * Report the devices as separate nodes so we can mark one as
975 976 977
         * only visible to the secure world.
         */
        nodename = g_strdup_printf("/secflash@%" PRIx64, flashbase);
978 979 980
        qemu_fdt_add_subnode(vms->fdt, nodename);
        qemu_fdt_setprop_string(vms->fdt, nodename, "compatible", "cfi-flash");
        qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
981
                                     2, flashbase, 2, flashsize);
982 983 984
        qemu_fdt_setprop_cell(vms->fdt, nodename, "bank-width", 4);
        qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled");
        qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay");
985 986 987
        g_free(nodename);

        nodename = g_strdup_printf("/flash@%" PRIx64, flashbase);
988 989 990
        qemu_fdt_add_subnode(vms->fdt, nodename);
        qemu_fdt_setprop_string(vms->fdt, nodename, "compatible", "cfi-flash");
        qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
991
                                     2, flashbase + flashsize, 2, flashsize);
992
        qemu_fdt_setprop_cell(vms->fdt, nodename, "bank-width", 4);
993 994
        g_free(nodename);
    }
995 996
}

997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
static bool virt_firmware_init(VirtMachineState *vms,
                               MemoryRegion *sysmem,
                               MemoryRegion *secure_sysmem)
{
    int i;
    BlockBackend *pflash_blk0;

    /* Map legacy -drive if=pflash to machine properties */
    for (i = 0; i < ARRAY_SIZE(vms->flash); i++) {
        pflash_cfi01_legacy_drive(vms->flash[i],
                                  drive_get(IF_PFLASH, 0, i));
    }

    virt_flash_map(vms, sysmem, secure_sysmem);

    pflash_blk0 = pflash_cfi01_get_blk(vms->flash[0]);

    if (bios_name) {
        char *fname;
        MemoryRegion *mr;
        int image_size;

        if (pflash_blk0) {
            error_report("The contents of the first flash device may be "
                         "specified with -bios or with -drive if=pflash... "
                         "but you cannot use both options at once");
            exit(1);
        }

        /* Fall back to -bios */

        fname = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
        if (!fname) {
            error_report("Could not find ROM image '%s'", bios_name);
            exit(1);
        }
        mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(vms->flash[0]), 0);
        image_size = load_image_mr(fname, mr);
        g_free(fname);
        if (image_size < 0) {
            error_report("Could not load ROM image '%s'", bios_name);
            exit(1);
        }
    }

    return pflash_blk0 || bios_name;
}

A
Andrew Jones 已提交
1045
static FWCfgState *create_fw_cfg(const VirtMachineState *vms, AddressSpace *as)
L
Laszlo Ersek 已提交
1046
{
1047
    MachineState *ms = MACHINE(vms);
1048 1049
    hwaddr base = vms->memmap[VIRT_FW_CFG].base;
    hwaddr size = vms->memmap[VIRT_FW_CFG].size;
1050
    FWCfgState *fw_cfg;
L
Laszlo Ersek 已提交
1051 1052
    char *nodename;

1053
    fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16, as);
1054
    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)ms->smp.cpus);
L
Laszlo Ersek 已提交
1055 1056

    nodename = g_strdup_printf("/fw-cfg@%" PRIx64, base);
1057 1058
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop_string(vms->fdt, nodename,
L
Laszlo Ersek 已提交
1059
                            "compatible", "qemu,fw-cfg-mmio");
1060
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
L
Laszlo Ersek 已提交
1061
                                 2, base, 2, size);
1062
    qemu_fdt_setprop(vms->fdt, nodename, "dma-coherent", NULL, 0);
L
Laszlo Ersek 已提交
1063
    g_free(nodename);
A
Andrew Jones 已提交
1064
    return fw_cfg;
L
Laszlo Ersek 已提交
1065 1066
}

1067
static void create_pcie_irq_map(const VirtMachineState *vms,
1068
                                uint32_t gic_phandle,
1069 1070 1071
                                int first_irq, const char *nodename)
{
    int devfn, pin;
1072
    uint32_t full_irq_map[4 * 4 * 10] = { 0 };
1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084
    uint32_t *irq_map = full_irq_map;

    for (devfn = 0; devfn <= 0x18; devfn += 0x8) {
        for (pin = 0; pin < 4; pin++) {
            int irq_type = GIC_FDT_IRQ_TYPE_SPI;
            int irq_nr = first_irq + ((pin + PCI_SLOT(devfn)) % PCI_NUM_PINS);
            int irq_level = GIC_FDT_IRQ_FLAGS_LEVEL_HI;
            int i;

            uint32_t map[] = {
                devfn << 8, 0, 0,                           /* devfn */
                pin + 1,                                    /* PCI pin */
1085
                gic_phandle, 0, 0, irq_type, irq_nr, irq_level }; /* GIC irq */
1086 1087

            /* Convert map to big endian */
1088
            for (i = 0; i < 10; i++) {
1089 1090
                irq_map[i] = cpu_to_be32(map[i]);
            }
1091
            irq_map += 10;
1092 1093 1094
        }
    }

1095
    qemu_fdt_setprop(vms->fdt, nodename, "interrupt-map",
1096 1097
                     full_irq_map, sizeof(full_irq_map));

1098
    qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupt-map-mask",
1099 1100 1101 1102
                           0x1800, 0, 0, /* devfn (PCI_SLOT(3)) */
                           0x7           /* PCI irq */);
}

1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153
static void create_smmu(const VirtMachineState *vms, qemu_irq *pic,
                        PCIBus *bus)
{
    char *node;
    const char compat[] = "arm,smmu-v3";
    int irq =  vms->irqmap[VIRT_SMMU];
    int i;
    hwaddr base = vms->memmap[VIRT_SMMU].base;
    hwaddr size = vms->memmap[VIRT_SMMU].size;
    const char irq_names[] = "eventq\0priq\0cmdq-sync\0gerror";
    DeviceState *dev;

    if (vms->iommu != VIRT_IOMMU_SMMUV3 || !vms->iommu_phandle) {
        return;
    }

    dev = qdev_create(NULL, "arm-smmuv3");

    object_property_set_link(OBJECT(dev), OBJECT(bus), "primary-bus",
                             &error_abort);
    qdev_init_nofail(dev);
    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
    for (i = 0; i < NUM_SMMU_IRQS; i++) {
        sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
    }

    node = g_strdup_printf("/smmuv3@%" PRIx64, base);
    qemu_fdt_add_subnode(vms->fdt, node);
    qemu_fdt_setprop(vms->fdt, node, "compatible", compat, sizeof(compat));
    qemu_fdt_setprop_sized_cells(vms->fdt, node, "reg", 2, base, 2, size);

    qemu_fdt_setprop_cells(vms->fdt, node, "interrupts",
            GIC_FDT_IRQ_TYPE_SPI, irq    , GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
            GIC_FDT_IRQ_TYPE_SPI, irq + 1, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
            GIC_FDT_IRQ_TYPE_SPI, irq + 2, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
            GIC_FDT_IRQ_TYPE_SPI, irq + 3, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);

    qemu_fdt_setprop(vms->fdt, node, "interrupt-names", irq_names,
                     sizeof(irq_names));

    qemu_fdt_setprop_cell(vms->fdt, node, "clocks", vms->clock_phandle);
    qemu_fdt_setprop_string(vms->fdt, node, "clock-names", "apb_pclk");
    qemu_fdt_setprop(vms->fdt, node, "dma-coherent", NULL, 0);

    qemu_fdt_setprop_cell(vms->fdt, node, "#iommu-cells", 1);

    qemu_fdt_setprop_cell(vms->fdt, node, "phandle", vms->iommu_phandle);
    g_free(node);
}

static void create_pcie(VirtMachineState *vms, qemu_irq *pic)
1154
{
1155 1156
    hwaddr base_mmio = vms->memmap[VIRT_PCIE_MMIO].base;
    hwaddr size_mmio = vms->memmap[VIRT_PCIE_MMIO].size;
1157 1158
    hwaddr base_mmio_high = vms->memmap[VIRT_HIGH_PCIE_MMIO].base;
    hwaddr size_mmio_high = vms->memmap[VIRT_HIGH_PCIE_MMIO].size;
1159 1160
    hwaddr base_pio = vms->memmap[VIRT_PCIE_PIO].base;
    hwaddr size_pio = vms->memmap[VIRT_PCIE_PIO].size;
1161
    hwaddr base_ecam, size_ecam;
1162
    hwaddr base = base_mmio;
1163
    int nr_pcie_buses;
1164
    int irq = vms->irqmap[VIRT_PCIE];
1165 1166 1167 1168 1169 1170
    MemoryRegion *mmio_alias;
    MemoryRegion *mmio_reg;
    MemoryRegion *ecam_alias;
    MemoryRegion *ecam_reg;
    DeviceState *dev;
    char *nodename;
1171
    int i, ecam_id;
1172
    PCIHostState *pci;
1173 1174 1175 1176

    dev = qdev_create(NULL, TYPE_GPEX_HOST);
    qdev_init_nofail(dev);

1177 1178 1179 1180
    ecam_id = VIRT_ECAM_ID(vms->highmem_ecam);
    base_ecam = vms->memmap[ecam_id].base;
    size_ecam = vms->memmap[ecam_id].size;
    nr_pcie_buses = size_ecam / PCIE_MMCFG_SIZE_MIN;
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198
    /* Map only the first size_ecam bytes of ECAM space */
    ecam_alias = g_new0(MemoryRegion, 1);
    ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
    memory_region_init_alias(ecam_alias, OBJECT(dev), "pcie-ecam",
                             ecam_reg, 0, size_ecam);
    memory_region_add_subregion(get_system_memory(), base_ecam, ecam_alias);

    /* Map the MMIO window into system address space so as to expose
     * the section of PCI MMIO space which starts at the same base address
     * (ie 1:1 mapping for that part of PCI MMIO space visible through
     * the window).
     */
    mmio_alias = g_new0(MemoryRegion, 1);
    mmio_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1);
    memory_region_init_alias(mmio_alias, OBJECT(dev), "pcie-mmio",
                             mmio_reg, base_mmio, size_mmio);
    memory_region_add_subregion(get_system_memory(), base_mmio, mmio_alias);

1199
    if (vms->highmem) {
1200 1201 1202 1203 1204 1205 1206 1207 1208
        /* Map high MMIO space */
        MemoryRegion *high_mmio_alias = g_new0(MemoryRegion, 1);

        memory_region_init_alias(high_mmio_alias, OBJECT(dev), "pcie-mmio-high",
                                 mmio_reg, base_mmio_high, size_mmio_high);
        memory_region_add_subregion(get_system_memory(), base_mmio_high,
                                    high_mmio_alias);
    }

1209
    /* Map IO port space */
1210
    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 2, base_pio);
1211 1212 1213

    for (i = 0; i < GPEX_NUM_IRQS; i++) {
        sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
1214
        gpex_set_irq_num(GPEX_HOST(dev), i, irq + i);
1215 1216
    }

1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229
    pci = PCI_HOST_BRIDGE(dev);
    if (pci->bus) {
        for (i = 0; i < nb_nics; i++) {
            NICInfo *nd = &nd_table[i];

            if (!nd->model) {
                nd->model = g_strdup("virtio");
            }

            pci_nic_init_nofail(nd, pci->bus, nd->model, NULL);
        }
    }

1230
    nodename = g_strdup_printf("/pcie@%" PRIx64, base);
1231 1232
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop_string(vms->fdt, nodename,
1233
                            "compatible", "pci-host-ecam-generic");
1234 1235 1236
    qemu_fdt_setprop_string(vms->fdt, nodename, "device_type", "pci");
    qemu_fdt_setprop_cell(vms->fdt, nodename, "#address-cells", 3);
    qemu_fdt_setprop_cell(vms->fdt, nodename, "#size-cells", 2);
1237
    qemu_fdt_setprop_cell(vms->fdt, nodename, "linux,pci-domain", 0);
1238
    qemu_fdt_setprop_cells(vms->fdt, nodename, "bus-range", 0,
1239
                           nr_pcie_buses - 1);
1240
    qemu_fdt_setprop(vms->fdt, nodename, "dma-coherent", NULL, 0);
1241

1242 1243 1244
    if (vms->msi_phandle) {
        qemu_fdt_setprop_cells(vms->fdt, nodename, "msi-parent",
                               vms->msi_phandle);
1245
    }
1246

1247
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
1248
                                 2, base_ecam, 2, size_ecam);
1249

1250
    if (vms->highmem) {
1251
        qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "ranges",
1252 1253 1254 1255 1256 1257 1258 1259
                                     1, FDT_PCI_RANGE_IOPORT, 2, 0,
                                     2, base_pio, 2, size_pio,
                                     1, FDT_PCI_RANGE_MMIO, 2, base_mmio,
                                     2, base_mmio, 2, size_mmio,
                                     1, FDT_PCI_RANGE_MMIO_64BIT,
                                     2, base_mmio_high,
                                     2, base_mmio_high, 2, size_mmio_high);
    } else {
1260
        qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "ranges",
1261 1262 1263 1264 1265
                                     1, FDT_PCI_RANGE_IOPORT, 2, 0,
                                     2, base_pio, 2, size_pio,
                                     1, FDT_PCI_RANGE_MMIO, 2, base_mmio,
                                     2, base_mmio, 2, size_mmio);
    }
1266

1267 1268
    qemu_fdt_setprop_cell(vms->fdt, nodename, "#interrupt-cells", 1);
    create_pcie_irq_map(vms, vms->gic_phandle, irq, nodename);
1269

1270 1271 1272 1273 1274 1275 1276 1277 1278
    if (vms->iommu) {
        vms->iommu_phandle = qemu_fdt_alloc_phandle(vms->fdt);

        create_smmu(vms, pic, pci->bus);

        qemu_fdt_setprop_cells(vms->fdt, nodename, "iommu-map",
                               0x0, vms->iommu_phandle, 0x0, 0x10000);
    }

1279 1280 1281
    g_free(nodename);
}

1282
static void create_platform_bus(VirtMachineState *vms, qemu_irq *pic)
1283 1284 1285 1286 1287 1288 1289 1290
{
    DeviceState *dev;
    SysBusDevice *s;
    int i;
    MemoryRegion *sysmem = get_system_memory();

    dev = qdev_create(NULL, TYPE_PLATFORM_BUS_DEVICE);
    dev->id = TYPE_PLATFORM_BUS_DEVICE;
1291 1292
    qdev_prop_set_uint32(dev, "num_irqs", PLATFORM_BUS_NUM_IRQS);
    qdev_prop_set_uint32(dev, "mmio_size", vms->memmap[VIRT_PLATFORM_BUS].size);
1293
    qdev_init_nofail(dev);
1294
    vms->platform_bus_dev = dev;
1295

1296 1297 1298
    s = SYS_BUS_DEVICE(dev);
    for (i = 0; i < PLATFORM_BUS_NUM_IRQS; i++) {
        int irqn = vms->irqmap[VIRT_PLATFORM_BUS] + i;
1299 1300 1301 1302
        sysbus_connect_irq(s, i, pic[irqn]);
    }

    memory_region_add_subregion(sysmem,
1303
                                vms->memmap[VIRT_PLATFORM_BUS].base,
1304 1305 1306
                                sysbus_mmio_get_region(s, 0));
}

1307
static void create_secure_ram(VirtMachineState *vms,
1308
                              MemoryRegion *secure_sysmem)
1309 1310 1311
{
    MemoryRegion *secram = g_new(MemoryRegion, 1);
    char *nodename;
1312 1313
    hwaddr base = vms->memmap[VIRT_SECURE_MEM].base;
    hwaddr size = vms->memmap[VIRT_SECURE_MEM].size;
1314

1315 1316
    memory_region_init_ram(secram, NULL, "virt.secure-ram", size,
                           &error_fatal);
1317 1318 1319
    memory_region_add_subregion(secure_sysmem, base, secram);

    nodename = g_strdup_printf("/secram@%" PRIx64, base);
1320 1321 1322 1323 1324
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop_string(vms->fdt, nodename, "device_type", "memory");
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg", 2, base, 2, size);
    qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled");
    qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay");
1325 1326 1327 1328

    g_free(nodename);
}

P
Peter Maydell 已提交
1329 1330
static void *machvirt_dtb(const struct arm_boot_info *binfo, int *fdt_size)
{
1331 1332
    const VirtMachineState *board = container_of(binfo, VirtMachineState,
                                                 bootinfo);
P
Peter Maydell 已提交
1333 1334 1335 1336 1337

    *fdt_size = board->fdt_size;
    return board->fdt;
}

1338
static void virt_build_smbios(VirtMachineState *vms)
1339
{
1340 1341
    MachineClass *mc = MACHINE_GET_CLASS(vms);
    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
1342 1343
    uint8_t *smbios_tables, *smbios_anchor;
    size_t smbios_tables_len, smbios_anchor_len;
1344
    const char *product = "QEMU Virtual Machine";
1345

1346 1347 1348 1349 1350
    if (kvm_enabled()) {
        product = "KVM Virtual Machine";
    }

    smbios_set_defaults("QEMU", product,
1351 1352
                        vmc->smbios_old_sys_ver ? "1.0" : mc->name, false,
                        true, SMBIOS_ENTRY_POINT_30);
1353

1354
    smbios_get_tables(MACHINE(vms), NULL, 0, &smbios_tables, &smbios_tables_len,
1355 1356 1357
                      &smbios_anchor, &smbios_anchor_len);

    if (smbios_anchor) {
A
Andrew Jones 已提交
1358
        fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-tables",
1359
                        smbios_tables, smbios_tables_len);
A
Andrew Jones 已提交
1360
        fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-anchor",
1361 1362 1363 1364
                        smbios_anchor, smbios_anchor_len);
    }
}

1365
static
1366
void virt_machine_done(Notifier *notifier, void *data)
1367
{
1368 1369
    VirtMachineState *vms = container_of(notifier, VirtMachineState,
                                         machine_done);
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389
    ARMCPU *cpu = ARM_CPU(first_cpu);
    struct arm_boot_info *info = &vms->bootinfo;
    AddressSpace *as = arm_boot_address_space(cpu, info);

    /*
     * If the user provided a dtb, we assume the dynamic sysbus nodes
     * already are integrated there. This corresponds to a use case where
     * the dynamic sysbus nodes are complex and their generation is not yet
     * supported. In that case the user can take charge of the guest dt
     * while qemu takes charge of the qom stuff.
     */
    if (info->dtb_filename == NULL) {
        platform_bus_add_all_fdt_nodes(vms->fdt, "/intc",
                                       vms->memmap[VIRT_PLATFORM_BUS].base,
                                       vms->memmap[VIRT_PLATFORM_BUS].size,
                                       vms->irqmap[VIRT_PLATFORM_BUS]);
    }
    if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
        exit(1);
    }
1390

1391 1392
    virt_acpi_setup(vms);
    virt_build_smbios(vms);
1393 1394
}

1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417
static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx)
{
    uint8_t clustersz = ARM_DEFAULT_CPUS_PER_CLUSTER;
    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);

    if (!vmc->disallow_affinity_adjustment) {
        /* Adjust MPIDR like 64-bit KVM hosts, which incorporate the
         * GIC's target-list limitations. 32-bit KVM hosts currently
         * always create clusters of 4 CPUs, but that is expected to
         * change when they gain support for gicv3. When KVM is enabled
         * it will override the changes we make here, therefore our
         * purposes are to make TCG consistent (with 64-bit KVM hosts)
         * and to improve SGI efficiency.
         */
        if (vms->gic_version == 3) {
            clustersz = GICV3_TARGETLIST_BITS;
        } else {
            clustersz = GIC_TARGETLIST_BITS;
        }
    }
    return arm_cpu_mp_affinity(idx, clustersz);
}

1418 1419
static void virt_set_memmap(VirtMachineState *vms)
{
1420 1421
    MachineState *ms = MACHINE(vms);
    hwaddr base, device_memory_base, device_memory_size;
1422 1423 1424 1425 1426 1427 1428 1429
    int i;

    vms->memmap = extended_memmap;

    for (i = 0; i < ARRAY_SIZE(base_memmap); i++) {
        vms->memmap[i] = base_memmap[i];
    }

1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455
    if (ms->ram_slots > ACPI_MAX_RAM_SLOTS) {
        error_report("unsupported number of memory slots: %"PRIu64,
                     ms->ram_slots);
        exit(EXIT_FAILURE);
    }

    /*
     * We compute the base of the high IO region depending on the
     * amount of initial and device memory. The device memory start/size
     * is aligned on 1GiB. We never put the high IO region below 256GiB
     * so that if maxram_size is < 255GiB we keep the legacy memory map.
     * The device region size assumes 1GiB page max alignment per slot.
     */
    device_memory_base =
        ROUND_UP(vms->memmap[VIRT_MEM].base + ms->ram_size, GiB);
    device_memory_size = ms->maxram_size - ms->ram_size + ms->ram_slots * GiB;

    /* Base address of the high IO region */
    base = device_memory_base + ROUND_UP(device_memory_size, GiB);
    if (base < device_memory_base) {
        error_report("maxmem/slots too huge");
        exit(EXIT_FAILURE);
    }
    if (base < vms->memmap[VIRT_MEM].base + LEGACY_RAMLIMIT_BYTES) {
        base = vms->memmap[VIRT_MEM].base + LEGACY_RAMLIMIT_BYTES;
    }
1456 1457 1458 1459 1460 1461 1462 1463 1464

    for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
        hwaddr size = extended_memmap[i].size;

        base = ROUND_UP(base, size);
        vms->memmap[i].base = base;
        vms->memmap[i].size = size;
        base += size;
    }
1465 1466 1467 1468 1469 1470 1471
    vms->highest_gpa = base - 1;
    if (device_memory_size > 0) {
        ms->device_memory = g_malloc0(sizeof(*ms->device_memory));
        ms->device_memory->base = device_memory_base;
        memory_region_init(&ms->device_memory->mr, OBJECT(vms),
                           "device-memory", device_memory_size);
    }
1472 1473
}

1474
static void machvirt_init(MachineState *machine)
P
Peter Maydell 已提交
1475
{
1476
    VirtMachineState *vms = VIRT_MACHINE(machine);
1477
    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(machine);
1478 1479
    MachineClass *mc = MACHINE_GET_CLASS(machine);
    const CPUArchIdList *possible_cpus;
P
Peter Maydell 已提交
1480 1481
    qemu_irq pic[NUM_IRQS];
    MemoryRegion *sysmem = get_system_memory();
1482
    MemoryRegion *secure_sysmem = NULL;
A
Andrew Jones 已提交
1483
    int n, virt_max_cpus;
P
Peter Maydell 已提交
1484
    MemoryRegion *ram = g_new(MemoryRegion, 1);
1485
    bool firmware_loaded;
1486
    bool aarch64 = true;
1487 1488
    unsigned int smp_cpus = machine->smp.cpus;
    unsigned int max_cpus = machine->smp.max_cpus;
P
Peter Maydell 已提交
1489

1490 1491 1492 1493 1494 1495 1496
    /*
     * In accelerated mode, the memory map is computed earlier in kvm_type()
     * to create a VM with the right number of IPA bits.
     */
    if (!vms->memmap) {
        virt_set_memmap(vms);
    }
1497

1498 1499 1500
    /* We can probe only here because during property set
     * KVM is not available yet
     */
1501 1502
    if (vms->gic_version <= 0) {
        /* "host" or "max" */
1503
        if (!kvm_enabled()) {
1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517
            if (vms->gic_version == 0) {
                error_report("gic-version=host requires KVM");
                exit(1);
            } else {
                /* "max": currently means 3 for TCG */
                vms->gic_version = 3;
            }
        } else {
            vms->gic_version = kvm_arm_vgic_probe();
            if (!vms->gic_version) {
                error_report(
                    "Unable to determine GIC version supported by host");
                exit(1);
            }
1518 1519 1520
        }
    }

1521 1522
    if (!cpu_type_valid(machine->cpu_type)) {
        error_report("mach-virt: CPU type %s not supported", machine->cpu_type);
P
Peter Maydell 已提交
1523 1524 1525
        exit(1);
    }

1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546
    if (vms->secure) {
        if (kvm_enabled()) {
            error_report("mach-virt: KVM does not support Security extensions");
            exit(1);
        }

        /*
         * The Secure view of the world is the same as the NonSecure,
         * but with a few extra devices. Create it as a container region
         * containing the system memory at low priority; any secure-only
         * devices go in at higher priority and take precedence.
         */
        secure_sysmem = g_new(MemoryRegion, 1);
        memory_region_init(secure_sysmem, OBJECT(machine), "secure-memory",
                           UINT64_MAX);
        memory_region_add_subregion_overlap(secure_sysmem, 0, sysmem, -1);
    }

    firmware_loaded = virt_firmware_init(vms, sysmem,
                                         secure_sysmem ?: sysmem);

1547 1548 1549 1550 1551
    /* If we have an EL3 boot ROM then the assumption is that it will
     * implement PSCI itself, so disable QEMU's internal implementation
     * so it doesn't get in the way. Instead of starting secondary
     * CPUs in PSCI powerdown state we will start them all running and
     * let the boot ROM sort them out.
1552 1553 1554 1555
     * The usual case is that we do use QEMU's PSCI implementation;
     * if the guest has EL2 then we will use SMC as the conduit,
     * and otherwise we will use HVC (for backwards compatibility and
     * because if we're using KVM then we must use HVC).
1556
     */
1557 1558
    if (vms->secure && firmware_loaded) {
        vms->psci_conduit = QEMU_PSCI_CONDUIT_DISABLED;
1559 1560
    } else if (vms->virt) {
        vms->psci_conduit = QEMU_PSCI_CONDUIT_SMC;
1561 1562 1563
    } else {
        vms->psci_conduit = QEMU_PSCI_CONDUIT_HVC;
    }
1564

1565 1566 1567
    /* The maximum number of CPUs depends on the GIC version, or on how
     * many redistributors we can fit into the memory map.
     */
1568
    if (vms->gic_version == 3) {
1569 1570 1571 1572
        virt_max_cpus =
            vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;
        virt_max_cpus +=
            vms->memmap[VIRT_HIGH_GIC_REDIST2].size / GICV3_REDIST_SIZE;
1573
    } else {
A
Andrew Jones 已提交
1574
        virt_max_cpus = GIC_NCPU;
1575 1576
    }

A
Andrew Jones 已提交
1577
    if (max_cpus > virt_max_cpus) {
1578 1579
        error_report("Number of SMP CPUs requested (%d) exceeds max CPUs "
                     "supported by machine 'mach-virt' (%d)",
A
Andrew Jones 已提交
1580
                     max_cpus, virt_max_cpus);
1581 1582 1583
        exit(1);
    }

1584
    vms->smp_cpus = smp_cpus;
P
Peter Maydell 已提交
1585

1586 1587 1588 1589 1590 1591
    if (vms->virt && kvm_enabled()) {
        error_report("mach-virt: KVM does not support providing "
                     "Virtualization extensions to the guest CPU");
        exit(1);
    }

1592
    create_fdt(vms);
P
Peter Maydell 已提交
1593

1594 1595 1596
    possible_cpus = mc->possible_cpu_arch_ids(machine);
    for (n = 0; n < possible_cpus->len; n++) {
        Object *cpuobj;
1597
        CPUState *cs;
1598

1599 1600 1601 1602
        if (n >= smp_cpus) {
            break;
        }

1603
        cpuobj = object_new(possible_cpus->cpus[n].type);
1604
        object_property_set_int(cpuobj, possible_cpus->cpus[n].arch_id,
1605
                                "mp-affinity", NULL);
1606

1607 1608 1609
        cs = CPU(cpuobj);
        cs->cpu_index = n;

1610 1611
        numa_cpu_pre_plug(&possible_cpus->cpus[cs->cpu_index], DEVICE(cpuobj),
                          &error_fatal);
1612

1613 1614
        aarch64 &= object_property_get_bool(cpuobj, "aarch64", NULL);

1615 1616 1617 1618
        if (!vms->secure) {
            object_property_set_bool(cpuobj, false, "has_el3", NULL);
        }

1619
        if (!vms->virt && object_property_find(cpuobj, "has_el2", NULL)) {
1620 1621 1622
            object_property_set_bool(cpuobj, false, "has_el2", NULL);
        }

1623 1624
        if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED) {
            object_property_set_int(cpuobj, vms->psci_conduit,
1625
                                    "psci-conduit", NULL);
1626

1627 1628 1629 1630 1631
            /* Secondary CPUs start in PSCI powered-down state */
            if (n > 0) {
                object_property_set_bool(cpuobj, true,
                                         "start-powered-off", NULL);
            }
P
Peter Maydell 已提交
1632
        }
P
Peter Maydell 已提交
1633

1634 1635 1636 1637
        if (vmc->no_pmu && object_property_find(cpuobj, "pmu", NULL)) {
            object_property_set_bool(cpuobj, false, "pmu", NULL);
        }

P
Peter Maydell 已提交
1638
        if (object_property_find(cpuobj, "reset-cbar", NULL)) {
1639
            object_property_set_int(cpuobj, vms->memmap[VIRT_CPUPERIPHS].base,
P
Peter Maydell 已提交
1640 1641 1642
                                    "reset-cbar", &error_abort);
        }

1643 1644
        object_property_set_link(cpuobj, OBJECT(sysmem), "memory",
                                 &error_abort);
1645 1646 1647 1648
        if (vms->secure) {
            object_property_set_link(cpuobj, OBJECT(secure_sysmem),
                                     "secure-memory", &error_abort);
        }
1649

1650
        object_property_set_bool(cpuobj, true, "realized", &error_fatal);
1651
        object_unref(cpuobj);
P
Peter Maydell 已提交
1652
    }
1653
    fdt_add_timer_nodes(vms);
1654
    fdt_add_cpu_nodes(vms);
P
Peter Maydell 已提交
1655

1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671
   if (!kvm_enabled()) {
        ARMCPU *cpu = ARM_CPU(first_cpu);
        bool aarch64 = object_property_get_bool(OBJECT(cpu), "aarch64", NULL);

        if (aarch64 && vms->highmem) {
            int requested_pa_size, pamax = arm_pamax(cpu);

            requested_pa_size = 64 - clz64(vms->highest_gpa);
            if (pamax < requested_pa_size) {
                error_report("VCPU supports less PA bits (%d) than requested "
                            "by the memory map (%d)", pamax, requested_pa_size);
                exit(1);
            }
        }
    }

1672 1673
    memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram",
                                         machine->ram_size);
1674
    memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base, ram);
1675 1676 1677 1678
    if (machine->device_memory) {
        memory_region_add_subregion(sysmem, machine->device_memory->base,
                                    &machine->device_memory->mr);
    }
P
Peter Maydell 已提交
1679

1680
    virt_flash_fdt(vms, sysmem, secure_sysmem ?: sysmem);
1681

1682
    create_gic(vms, pic);
P
Peter Maydell 已提交
1683

1684
    fdt_add_pmu_nodes(vms);
1685

1686
    create_uart(vms, pic, VIRT_UART, sysmem, serial_hd(0));
1687 1688

    if (vms->secure) {
1689
        create_secure_ram(vms, secure_sysmem);
1690
        create_uart(vms, pic, VIRT_SECURE_UART, secure_sysmem, serial_hd(1));
1691
    }
P
Peter Maydell 已提交
1692

1693 1694
    vms->highmem_ecam &= vms->highmem && (!firmware_loaded || aarch64);

1695
    create_rtc(vms, pic);
P
Peter Maydell 已提交
1696

1697
    create_pcie(vms, pic);
1698

1699
    create_gpio(vms, pic);
S
Shannon Zhao 已提交
1700

P
Peter Maydell 已提交
1701 1702 1703 1704
    /* Create mmio transports, so the user can create virtio backends
     * (which will be automatically plugged in to the transports). If
     * no backend is created the transport will just sit harmlessly idle.
     */
1705
    create_virtio_devices(vms, pic);
P
Peter Maydell 已提交
1706

A
Andrew Jones 已提交
1707 1708
    vms->fw_cfg = create_fw_cfg(vms, &address_space_memory);
    rom_set_fw(vms->fw_cfg);
1709

1710
    create_platform_bus(vms, pic);
L
Laszlo Ersek 已提交
1711

1712 1713 1714 1715 1716 1717 1718 1719
    vms->bootinfo.ram_size = machine->ram_size;
    vms->bootinfo.kernel_filename = machine->kernel_filename;
    vms->bootinfo.kernel_cmdline = machine->kernel_cmdline;
    vms->bootinfo.initrd_filename = machine->initrd_filename;
    vms->bootinfo.nb_cpus = smp_cpus;
    vms->bootinfo.board_id = -1;
    vms->bootinfo.loader_start = vms->memmap[VIRT_MEM].base;
    vms->bootinfo.get_dtb = machvirt_dtb;
1720
    vms->bootinfo.skip_dtb_autoload = true;
1721 1722
    vms->bootinfo.firmware_loaded = firmware_loaded;
    arm_load_kernel(ARM_CPU(first_cpu), &vms->bootinfo);
1723

1724 1725
    vms->machine_done.notify = virt_machine_done;
    qemu_add_machine_init_done_notifier(&vms->machine_done);
P
Peter Maydell 已提交
1726 1727
}

1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741
static bool virt_get_secure(Object *obj, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    return vms->secure;
}

static void virt_set_secure(Object *obj, bool value, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    vms->secure = value;
}

1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755
static bool virt_get_virt(Object *obj, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    return vms->virt;
}

static void virt_set_virt(Object *obj, bool value, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    vms->virt = value;
}

1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769
static bool virt_get_highmem(Object *obj, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    return vms->highmem;
}

static void virt_set_highmem(Object *obj, bool value, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    vms->highmem = value;
}

1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783
static bool virt_get_its(Object *obj, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    return vms->its;
}

static void virt_set_its(Object *obj, bool value, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    vms->its = value;
}

1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801
static char *virt_get_gic_version(Object *obj, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);
    const char *val = vms->gic_version == 3 ? "3" : "2";

    return g_strdup(val);
}

static void virt_set_gic_version(Object *obj, const char *value, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    if (!strcmp(value, "3")) {
        vms->gic_version = 3;
    } else if (!strcmp(value, "2")) {
        vms->gic_version = 2;
    } else if (!strcmp(value, "host")) {
        vms->gic_version = 0; /* Will probe later */
1802 1803
    } else if (!strcmp(value, "max")) {
        vms->gic_version = -1; /* Will probe later */
1804
    } else {
1805
        error_setg(errp, "Invalid gic-version value");
1806
        error_append_hint(errp, "Valid values are 3, 2, host, max.\n");
1807 1808 1809
    }
}

1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837
static char *virt_get_iommu(Object *obj, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    switch (vms->iommu) {
    case VIRT_IOMMU_NONE:
        return g_strdup("none");
    case VIRT_IOMMU_SMMUV3:
        return g_strdup("smmuv3");
    default:
        g_assert_not_reached();
    }
}

static void virt_set_iommu(Object *obj, const char *value, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(obj);

    if (!strcmp(value, "smmuv3")) {
        vms->iommu = VIRT_IOMMU_SMMUV3;
    } else if (!strcmp(value, "none")) {
        vms->iommu = VIRT_IOMMU_NONE;
    } else {
        error_setg(errp, "Invalid iommu value");
        error_append_hint(errp, "Valid values are none, smmuv3.\n");
    }
}

1838 1839 1840 1841 1842 1843 1844 1845 1846 1847
static CpuInstanceProperties
virt_cpu_index_to_props(MachineState *ms, unsigned cpu_index)
{
    MachineClass *mc = MACHINE_GET_CLASS(ms);
    const CPUArchIdList *possible_cpus = mc->possible_cpu_arch_ids(ms);

    assert(cpu_index < possible_cpus->len);
    return possible_cpus->cpus[cpu_index].props;
}

1848 1849 1850 1851 1852
static int64_t virt_get_default_cpu_node_id(const MachineState *ms, int idx)
{
    return idx % nb_numa_nodes;
}

1853 1854 1855
static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
{
    int n;
1856
    unsigned int max_cpus = ms->smp.max_cpus;
1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867
    VirtMachineState *vms = VIRT_MACHINE(ms);

    if (ms->possible_cpus) {
        assert(ms->possible_cpus->len == max_cpus);
        return ms->possible_cpus;
    }

    ms->possible_cpus = g_malloc0(sizeof(CPUArchIdList) +
                                  sizeof(CPUArchId) * max_cpus);
    ms->possible_cpus->len = max_cpus;
    for (n = 0; n < ms->possible_cpus->len; n++) {
1868
        ms->possible_cpus->cpus[n].type = ms->cpu_type;
1869 1870 1871 1872 1873 1874 1875 1876
        ms->possible_cpus->cpus[n].arch_id =
            virt_cpu_mp_affinity(vms, n);
        ms->possible_cpus->cpus[n].props.has_thread_id = true;
        ms->possible_cpus->cpus[n].props.thread_id = n;
    }
    return ms->possible_cpus;
}

1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899
static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
                                        DeviceState *dev, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);

    if (vms->platform_bus_dev) {
        if (object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)) {
            platform_bus_link_device(PLATFORM_BUS_DEVICE(vms->platform_bus_dev),
                                     SYS_BUS_DEVICE(dev));
        }
    }
}

static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
                                                        DeviceState *dev)
{
    if (object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)) {
        return HOTPLUG_HANDLER(machine);
    }

    return NULL;
}

1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929
/*
 * for arm64 kvm_type [7-0] encodes the requested number of bits
 * in the IPA address space
 */
static int virt_kvm_type(MachineState *ms, const char *type_str)
{
    VirtMachineState *vms = VIRT_MACHINE(ms);
    int max_vm_pa_size = kvm_arm_get_max_vm_ipa_size(ms);
    int requested_pa_size;

    /* we freeze the memory map to compute the highest gpa */
    virt_set_memmap(vms);

    requested_pa_size = 64 - clz64(vms->highest_gpa);

    if (requested_pa_size > max_vm_pa_size) {
        error_report("-m and ,maxmem option values "
                     "require an IPA range (%d bits) larger than "
                     "the one supported by the host (%d bits)",
                     requested_pa_size, max_vm_pa_size);
       exit(1);
    }
    /*
     * By default we return 0 which corresponds to an implicit legacy
     * 40b IPA setting. Otherwise we return the actual requested PA
     * logsize
     */
    return requested_pa_size > 40 ? requested_pa_size : 0;
}

1930 1931
static void virt_machine_class_init(ObjectClass *oc, void *data)
{
1932
    MachineClass *mc = MACHINE_CLASS(oc);
1933
    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
1934 1935

    mc->init = machvirt_init;
1936 1937
    /* Start with max_cpus set to 512, which is the maximum supported by KVM.
     * The value may be reduced later when we have more information about the
1938 1939
     * configuration of the particular instance.
     */
1940
    mc->max_cpus = 512;
1941 1942
    machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_CALXEDA_XGMAC);
    machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE);
1943
    machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
1944
    machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_PLATFORM);
1945 1946 1947
    mc->block_default_type = IF_VIRTIO;
    mc->no_cdrom = 1;
    mc->pci_allow_0_address = true;
1948 1949
    /* We know we will never create a pre-ARMv7 CPU which needs 1K pages */
    mc->minimum_page_bits = 12;
1950
    mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids;
1951
    mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
1952
    mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
1953
    mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
1954
    mc->kvm_type = virt_kvm_type;
1955
    assert(!mc->get_hotplug_handler);
1956 1957
    mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
    hc->plug = virt_machine_device_plug_cb;
1958
    mc->numa_mem_supported = true;
1959 1960
}

1961
static void virt_instance_init(Object *obj)
1962 1963
{
    VirtMachineState *vms = VIRT_MACHINE(obj);
1964
    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
1965

1966 1967 1968 1969 1970
    /* EL3 is disabled by default on virt: this makes us consistent
     * between KVM and TCG for this board, and it also allows us to
     * boot UEFI blobs which assume no TrustZone support.
     */
    vms->secure = false;
1971 1972 1973 1974 1975 1976
    object_property_add_bool(obj, "secure", virt_get_secure,
                             virt_set_secure, NULL);
    object_property_set_description(obj, "secure",
                                    "Set on/off to enable/disable the ARM "
                                    "Security Extensions (TrustZone)",
                                    NULL);
1977

1978 1979 1980 1981 1982 1983 1984 1985 1986 1987
    /* EL2 is also disabled by default, for similar reasons */
    vms->virt = false;
    object_property_add_bool(obj, "virtualization", virt_get_virt,
                             virt_set_virt, NULL);
    object_property_set_description(obj, "virtualization",
                                    "Set on/off to enable/disable emulating a "
                                    "guest CPU which implements the ARM "
                                    "Virtualization Extensions",
                                    NULL);

1988 1989 1990 1991 1992 1993 1994 1995
    /* High memory is enabled by default */
    vms->highmem = true;
    object_property_add_bool(obj, "highmem", virt_get_highmem,
                             virt_set_highmem, NULL);
    object_property_set_description(obj, "highmem",
                                    "Set on/off to enable/disable using "
                                    "physical address space above 32 bits",
                                    NULL);
1996 1997 1998 1999 2000 2001 2002
    /* Default GIC type is v2 */
    vms->gic_version = 2;
    object_property_add_str(obj, "gic-version", virt_get_gic_version,
                        virt_set_gic_version, NULL);
    object_property_set_description(obj, "gic-version",
                                    "Set GIC version. "
                                    "Valid values are 2, 3 and host", NULL);
2003

2004 2005
    vms->highmem_ecam = !vmc->no_highmem_ecam;

2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
    if (vmc->no_its) {
        vms->its = false;
    } else {
        /* Default allows ITS instantiation */
        vms->its = true;
        object_property_add_bool(obj, "its", virt_get_its,
                                 virt_set_its, NULL);
        object_property_set_description(obj, "its",
                                        "Set on/off to enable/disable "
                                        "ITS instantiation",
                                        NULL);
    }

2019 2020 2021 2022 2023 2024 2025 2026
    /* Default disallows iommu instantiation */
    vms->iommu = VIRT_IOMMU_NONE;
    object_property_add_str(obj, "iommu", virt_get_iommu, virt_set_iommu, NULL);
    object_property_set_description(obj, "iommu",
                                    "Set the IOMMU type. "
                                    "Valid values are none and smmuv3",
                                    NULL);

2027
    vms->irqmap = a15irqmap;
2028 2029

    virt_flash_create(vms);
2030 2031
}

2032 2033 2034 2035 2036 2037 2038
static const TypeInfo virt_machine_info = {
    .name          = TYPE_VIRT_MACHINE,
    .parent        = TYPE_MACHINE,
    .abstract      = true,
    .instance_size = sizeof(VirtMachineState),
    .class_size    = sizeof(VirtMachineClass),
    .class_init    = virt_machine_class_init,
E
Eduardo Habkost 已提交
2039
    .instance_init = virt_instance_init,
2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051
    .interfaces = (InterfaceInfo[]) {
         { TYPE_HOTPLUG_HANDLER },
         { }
    },
};

static void machvirt_machine_init(void)
{
    type_register_static(&virt_machine_info);
}
type_init(machvirt_machine_init);

C
Cornelia Huck 已提交
2052 2053 2054 2055 2056
static void virt_machine_4_1_options(MachineClass *mc)
{
}
DEFINE_VIRT_MACHINE_AS_LATEST(4, 1)

2057 2058
static void virt_machine_4_0_options(MachineClass *mc)
{
C
Cornelia Huck 已提交
2059 2060
    virt_machine_4_1_options(mc);
    compat_props_add(mc->compat_props, hw_compat_4_0, hw_compat_4_0_len);
2061
}
C
Cornelia Huck 已提交
2062
DEFINE_VIRT_MACHINE(4, 0)
2063

2064 2065
static void virt_machine_3_1_options(MachineClass *mc)
{
2066
    virt_machine_4_0_options(mc);
2067
    compat_props_add(mc->compat_props, hw_compat_3_1, hw_compat_3_1_len);
2068
}
2069
DEFINE_VIRT_MACHINE(3, 1)
2070

2071 2072
static void virt_machine_3_0_options(MachineClass *mc)
{
2073
    virt_machine_3_1_options(mc);
2074
    compat_props_add(mc->compat_props, hw_compat_3_0, hw_compat_3_0_len);
2075
}
2076 2077
DEFINE_VIRT_MACHINE(3, 0)

2078 2079
static void virt_machine_2_12_options(MachineClass *mc)
{
2080 2081
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

2082
    virt_machine_3_0_options(mc);
2083
    compat_props_add(mc->compat_props, hw_compat_2_12, hw_compat_2_12_len);
2084
    vmc->no_highmem_ecam = true;
2085
    mc->max_cpus = 255;
2086
}
2087
DEFINE_VIRT_MACHINE(2, 12)
2088

E
Eric Auger 已提交
2089 2090
static void virt_machine_2_11_options(MachineClass *mc)
{
2091 2092
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

2093
    virt_machine_2_12_options(mc);
2094
    compat_props_add(mc->compat_props, hw_compat_2_11, hw_compat_2_11_len);
2095
    vmc->smbios_old_sys_ver = true;
E
Eric Auger 已提交
2096
}
2097
DEFINE_VIRT_MACHINE(2, 11)
E
Eric Auger 已提交
2098

E
Eric Auger 已提交
2099 2100
static void virt_machine_2_10_options(MachineClass *mc)
{
E
Eric Auger 已提交
2101
    virt_machine_2_11_options(mc);
2102
    compat_props_add(mc->compat_props, hw_compat_2_10, hw_compat_2_10_len);
2103 2104
    /* before 2.11 we never faulted accesses to bad addresses */
    mc->ignore_memory_transaction_failures = true;
E
Eric Auger 已提交
2105
}
E
Eric Auger 已提交
2106
DEFINE_VIRT_MACHINE(2, 10)
E
Eric Auger 已提交
2107

P
Peter Maydell 已提交
2108 2109
static void virt_machine_2_9_options(MachineClass *mc)
{
E
Eric Auger 已提交
2110
    virt_machine_2_10_options(mc);
2111
    compat_props_add(mc->compat_props, hw_compat_2_9, hw_compat_2_9_len);
P
Peter Maydell 已提交
2112
}
E
Eric Auger 已提交
2113
DEFINE_VIRT_MACHINE(2, 9)
P
Peter Maydell 已提交
2114

A
Andrew Jones 已提交
2115 2116
static void virt_machine_2_8_options(MachineClass *mc)
{
2117 2118
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

P
Peter Maydell 已提交
2119
    virt_machine_2_9_options(mc);
2120
    compat_props_add(mc->compat_props, hw_compat_2_8, hw_compat_2_8_len);
2121 2122 2123 2124
    /* For 2.8 and earlier we falsely claimed in the DT that
     * our timers were edge-triggered, not level-triggered.
     */
    vmc->claim_edge_triggered_timers = true;
A
Andrew Jones 已提交
2125
}
P
Peter Maydell 已提交
2126
DEFINE_VIRT_MACHINE(2, 8)
A
Andrew Jones 已提交
2127

2128 2129
static void virt_machine_2_7_options(MachineClass *mc)
{
2130 2131
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

A
Andrew Jones 已提交
2132
    virt_machine_2_8_options(mc);
2133
    compat_props_add(mc->compat_props, hw_compat_2_7, hw_compat_2_7_len);
2134 2135
    /* ITS was introduced with 2.8 */
    vmc->no_its = true;
2136 2137
    /* Stick with 1K pages for migration compatibility */
    mc->minimum_page_bits = 0;
2138
}
A
Andrew Jones 已提交
2139
DEFINE_VIRT_MACHINE(2, 7)
2140

2141
static void virt_machine_2_6_options(MachineClass *mc)
2142
{
2143 2144
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

2145
    virt_machine_2_7_options(mc);
2146
    compat_props_add(mc->compat_props, hw_compat_2_6, hw_compat_2_6_len);
2147
    vmc->disallow_affinity_adjustment = true;
2148 2149
    /* Disable PMU for 2.6 as PMU support was first introduced in 2.7 */
    vmc->no_pmu = true;
2150
}
2151
DEFINE_VIRT_MACHINE(2, 6)