virt.c 81.4 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"
48
#include "sysemu/runstate.h"
P
Peter Maydell 已提交
49 50
#include "sysemu/sysemu.h"
#include "sysemu/kvm.h"
51
#include "hw/loader.h"
P
Peter Maydell 已提交
52 53 54
#include "exec/address-spaces.h"
#include "qemu/bitops.h"
#include "qemu/error-report.h"
55
#include "qemu/module.h"
56
#include "hw/pci-host/gpex.h"
57 58
#include "hw/arm/sysbus-fdt.h"
#include "hw/platform-bus.h"
59
#include "hw/qdev-properties.h"
60
#include "hw/arm/fdt.h"
61 62
#include "hw/intc/arm_gic.h"
#include "hw/intc/arm_gicv3_common.h"
M
Markus Armbruster 已提交
63
#include "hw/irq.h"
64
#include "kvm_arm.h"
65
#include "hw/firmware/smbios.h"
66
#include "qapi/visitor.h"
67
#include "standard-headers/linux/input.h"
68
#include "hw/arm/smmuv3.h"
69
#include "hw/acpi/acpi.h"
70
#include "target/arm/internals.h"
71 72
#include "hw/mem/pc-dimm.h"
#include "hw/mem/nvdimm.h"
P
Peter Maydell 已提交
73

74
#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
75 76 77 78 79 80
    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"; \
81 82 83
        if (latest) { \
            mc->alias = "virt"; \
        } \
84 85 86 87 88 89 90 91 92 93 94 95
    } \
    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);

96 97 98 99 100
#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)

101

102 103 104 105 106
/* Number of external interrupt lines to configure the GIC with */
#define NUM_IRQS 256

#define PLATFORM_BUS_NUM_IRQS 64

107
/* Legacy RAM limit in GB (< version 4.0) */
108 109
#define LEGACY_RAMLIMIT_GB 255
#define LEGACY_RAMLIMIT_BYTES (LEGACY_RAMLIMIT_GB * GiB)
110

P
Peter Maydell 已提交
111 112 113 114 115 116 117 118 119
/* 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 已提交
120 121
 * Note that devices should generally be placed at multiples of 0x10000,
 * to accommodate guests using 64K pages.
P
Peter Maydell 已提交
122
 */
123
static const MemMapEntry base_memmap[] = {
P
Peter Maydell 已提交
124
    /* Space up to 0x8000000 is reserved for a boot ROM */
125 126
    [VIRT_FLASH] =              {          0, 0x08000000 },
    [VIRT_CPUPERIPHS] =         { 0x08000000, 0x00020000 },
P
Peter Maydell 已提交
127
    /* GIC distributor and CPU interfaces sit inside the CPU peripheral space */
128 129 130
    [VIRT_GIC_DIST] =           { 0x08000000, 0x00010000 },
    [VIRT_GIC_CPU] =            { 0x08010000, 0x00010000 },
    [VIRT_GIC_V2M] =            { 0x08020000, 0x00001000 },
131 132
    [VIRT_GIC_HYP] =            { 0x08030000, 0x00010000 },
    [VIRT_GIC_VCPU] =           { 0x08040000, 0x00010000 },
133 134 135 136
    /* 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 },
137 138
    [VIRT_UART] =               { 0x09000000, 0x00001000 },
    [VIRT_RTC] =                { 0x09010000, 0x00001000 },
M
Marc Marí 已提交
139
    [VIRT_FW_CFG] =             { 0x09020000, 0x00000018 },
S
Shannon Zhao 已提交
140
    [VIRT_GPIO] =               { 0x09030000, 0x00001000 },
141
    [VIRT_SECURE_UART] =        { 0x09040000, 0x00001000 },
142
    [VIRT_SMMU] =               { 0x09050000, 0x00020000 },
143
    [VIRT_MMIO] =               { 0x0a000000, 0x00000200 },
P
Peter Maydell 已提交
144
    /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
145
    [VIRT_PLATFORM_BUS] =       { 0x0c000000, 0x02000000 },
146
    [VIRT_SECURE_MEM] =         { 0x0e000000, 0x01000000 },
147 148 149
    [VIRT_PCIE_MMIO] =          { 0x10000000, 0x2eff0000 },
    [VIRT_PCIE_PIO] =           { 0x3eff0000, 0x00010000 },
    [VIRT_PCIE_ECAM] =          { 0x3f000000, 0x01000000 },
150 151
    /* Actual RAM size depends on initial RAM and device memory settings */
    [VIRT_MEM] =                { GiB, LEGACY_RAMLIMIT_BYTES },
152 153 154 155 156 157 158 159 160 161 162 163 164
};

/*
 * 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[] = {
165
    /* Additional 64 MB redist region (can contain up to 512 redistributors) */
166 167 168 169
    [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 已提交
170 171 172 173
};

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

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

194
static bool cpu_type_valid(const char *cpu)
P
Peter Maydell 已提交
195 196 197
{
    int i;

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

206
static void create_fdt(VirtMachineState *vms)
P
Peter Maydell 已提交
207
{
208 209
    MachineState *ms = MACHINE(vms);
    int nb_numa_nodes = ms->numa_state->num_nodes;
210
    void *fdt = create_device_tree(&vms->fdt_size);
P
Peter Maydell 已提交
211 212 213 214 215 216

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

217
    vms->fdt = fdt;
P
Peter Maydell 已提交
218 219

    /* Header */
220 221 222
    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 已提交
223

224
    /* /chosen must exist for load_dtb to fill in necessary properties later */
225
    qemu_fdt_add_subnode(fdt, "/chosen");
P
Peter Maydell 已提交
226 227 228 229 230 231

    /* 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.
     */
232
    vms->clock_phandle = qemu_fdt_alloc_phandle(fdt);
233 234 235 236 237
    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 已提交
238
                                "clk24mhz");
239
    qemu_fdt_setprop_cell(fdt, "/apb-pclk", "phandle", vms->clock_phandle);
P
Peter Maydell 已提交
240

241
    if (nb_numa_nodes > 0 && ms->numa_state->have_numa_distance) {
242 243 244 245 246 247 248 249 250
        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);
251 252
                matrix[idx + 2] =
                    cpu_to_be32(ms->numa_state->nodes[i].distance[j]);
253 254 255 256 257 258 259 260 261 262
            }
        }

        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);
    }
263 264
}

265
static void fdt_add_timer_nodes(const VirtMachineState *vms)
P
Peter Maydell 已提交
266
{
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
    /* 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 已提交
284
     */
285
    ARMCPU *armcpu;
286 287 288 289 290 291
    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 已提交
292

293
    if (vms->gic_version == 2) {
294 295
        irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
                             GIC_FDT_IRQ_PPI_CPU_WIDTH,
296
                             (1 << vms->smp_cpus) - 1);
297
    }
P
Peter Maydell 已提交
298

299
    qemu_fdt_add_subnode(vms->fdt, "/timer");
300 301 302 303

    armcpu = ARM_CPU(qemu_get_cpu(0));
    if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) {
        const char compat[] = "arm,armv8-timer\0arm,armv7-timer";
304
        qemu_fdt_setprop(vms->fdt, "/timer", "compatible",
305 306
                         compat, sizeof(compat));
    } else {
307
        qemu_fdt_setprop_string(vms->fdt, "/timer", "compatible",
308 309
                                "arm,armv7-timer");
    }
310 311
    qemu_fdt_setprop(vms->fdt, "/timer", "always-on", NULL, 0);
    qemu_fdt_setprop_cells(vms->fdt, "/timer", "interrupts",
312 313 314 315
                       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 已提交
316 317
}

318
static void fdt_add_cpu_nodes(const VirtMachineState *vms)
P
Peter Maydell 已提交
319 320
{
    int cpu;
321
    int addr_cells = 1;
322
    const MachineState *ms = MACHINE(vms);
323 324 325 326 327 328 329 330 331 332 333 334 335 336

    /*
     * 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.
     */
337
    for (cpu = 0; cpu < vms->smp_cpus; cpu++) {
338 339 340 341 342 343 344
        ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));

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

346 347 348
    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 已提交
349

350
    for (cpu = vms->smp_cpus - 1; cpu >= 0; cpu--) {
P
Peter Maydell 已提交
351 352
        char *nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
        ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
353
        CPUState *cs = CPU(armcpu);
P
Peter Maydell 已提交
354

355 356 357
        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 已提交
358 359
                                    armcpu->dtb_compatible);

360 361
        if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED
            && vms->smp_cpus > 1) {
362
            qemu_fdt_setprop_string(vms->fdt, nodename,
P
Peter Maydell 已提交
363 364 365
                                        "enable-method", "psci");
        }

366
        if (addr_cells == 2) {
367
            qemu_fdt_setprop_u64(vms->fdt, nodename, "reg",
368 369
                                 armcpu->mp_affinity);
        } else {
370
            qemu_fdt_setprop_cell(vms->fdt, nodename, "reg",
371 372 373
                                  armcpu->mp_affinity);
        }

374 375 376
        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);
377 378
        }

P
Peter Maydell 已提交
379 380 381 382
        g_free(nodename);
    }
}

383
static void fdt_add_its_gic_node(VirtMachineState *vms)
P
Pavel Fedin 已提交
384
{
385 386
    char *nodename;

387
    vms->msi_phandle = qemu_fdt_alloc_phandle(vms->fdt);
388 389 390 391
    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 已提交
392
                            "arm,gic-v3-its");
393 394
    qemu_fdt_setprop(vms->fdt, nodename, "msi-controller", NULL, 0);
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
395 396
                                 2, vms->memmap[VIRT_GIC_ITS].base,
                                 2, vms->memmap[VIRT_GIC_ITS].size);
397 398
    qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", vms->msi_phandle);
    g_free(nodename);
P
Pavel Fedin 已提交
399 400
}

401
static void fdt_add_v2m_gic_node(VirtMachineState *vms)
P
Peter Maydell 已提交
402
{
403 404 405 406
    char *nodename;

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

419
static void fdt_add_gic_node(VirtMachineState *vms)
420
{
421 422
    char *nodename;

423 424 425
    vms->gic_phandle = qemu_fdt_alloc_phandle(vms->fdt);
    qemu_fdt_setprop_cell(vms->fdt, "/", "interrupt-parent", vms->gic_phandle);

426 427 428 429 430 431 432 433
    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);
434
    if (vms->gic_version == 3) {
435 436
        int nb_redist_regions = virt_gicv3_redist_region_count(vms);

437
        qemu_fdt_setprop_string(vms->fdt, nodename, "compatible",
438
                                "arm,gic-v3");
439

440
        qemu_fdt_setprop_cell(vms->fdt, nodename,
441 442 443
                              "#redistributor-regions", nb_redist_regions);

        if (nb_redist_regions == 1) {
444
            qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
445 446 447 448 449
                                         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 {
450
            qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
451 452 453 454 455 456
                                 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);
457 458
        }

459
        if (vms->virt) {
460
            qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
461
                                   GIC_FDT_IRQ_TYPE_PPI, ARCH_GIC_MAINT_IRQ,
462 463
                                   GIC_FDT_IRQ_FLAGS_LEVEL_HI);
        }
464 465
    } else {
        /* 'cortex-a15-gic' means 'GIC v2' */
466
        qemu_fdt_setprop_string(vms->fdt, nodename, "compatible",
467
                                "arm,cortex-a15-gic");
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
        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);
        }
488 489
    }

490 491
    qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", vms->gic_phandle);
    g_free(nodename);
P
Peter Maydell 已提交
492 493
}

494
static void fdt_add_pmu_nodes(const VirtMachineState *vms)
495 496 497 498 499 500 501
{
    CPUState *cpu;
    ARMCPU *armcpu;
    uint32_t irqflags = GIC_FDT_IRQ_FLAGS_LEVEL_HI;

    CPU_FOREACH(cpu) {
        armcpu = ARM_CPU(cpu);
502
        if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
503 504
            return;
        }
505
        if (kvm_enabled()) {
506 507
            if (kvm_irqchip_in_kernel()) {
                kvm_arm_pmu_set_irq(cpu, PPI(VIRTUAL_PMU_IRQ));
508
            }
509
            kvm_arm_pmu_init(cpu);
510
        }
511 512
    }

513
    if (vms->gic_version == 2) {
514 515
        irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
                             GIC_FDT_IRQ_PPI_CPU_WIDTH,
516
                             (1 << vms->smp_cpus) - 1);
517 518 519
    }

    armcpu = ARM_CPU(qemu_get_cpu(0));
520
    qemu_fdt_add_subnode(vms->fdt, "/pmu");
521 522
    if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) {
        const char compat[] = "arm,armv8-pmuv3";
523
        qemu_fdt_setprop(vms->fdt, "/pmu", "compatible",
524
                         compat, sizeof(compat));
525
        qemu_fdt_setprop_cells(vms->fdt, "/pmu", "interrupts",
526 527 528 529
                               GIC_FDT_IRQ_TYPE_PPI, VIRTUAL_PMU_IRQ, irqflags);
    }
}

530
static void create_its(VirtMachineState *vms, DeviceState *gicdev)
P
Pavel Fedin 已提交
531 532 533 534 535 536 537 538 539 540 541 542 543 544
{
    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);
545
    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base);
P
Pavel Fedin 已提交
546

547
    fdt_add_its_gic_node(vms);
P
Pavel Fedin 已提交
548 549
}

550
static void create_v2m(VirtMachineState *vms, qemu_irq *pic)
551 552
{
    int i;
553
    int irq = vms->irqmap[VIRT_GIC_V2M];
554 555 556
    DeviceState *dev;

    dev = qdev_create(NULL, "arm-gicv2m");
557
    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_V2M].base);
558 559 560 561 562 563 564 565
    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]);
    }

566
    fdt_add_v2m_gic_node(vms);
567 568
}

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

580
    gictype = (type == 3) ? gicv3_class_name() : gic_class_name();
581 582

    gicdev = qdev_create(NULL, gictype);
583
    qdev_prop_set_uint32(gicdev, "revision", type);
584 585 586 587 588
    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);
589
    if (!kvm_irqchip_in_kernel()) {
590
        qdev_prop_set_bit(gicdev, "has-security-extensions", vms->secure);
591
    }
592 593 594 595 596 597

    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);

598 599 600 601
        nb_redist_regions = virt_gicv3_redist_region_count(vms);

        qdev_prop_set_uint32(gicdev, "len-redist-region-count",
                             nb_redist_regions);
602
        qdev_prop_set_uint32(gicdev, "redist-region-count[0]", redist0_count);
603 604 605

        if (nb_redist_regions == 2) {
            uint32_t redist1_capacity =
606
                    vms->memmap[VIRT_HIGH_GIC_REDIST2].size / GICV3_REDIST_SIZE;
607 608 609 610

            qdev_prop_set_uint32(gicdev, "redist-region-count[1]",
                MIN(smp_cpus - redist0_count, redist1_capacity));
        }
611 612 613 614 615
    } else {
        if (!kvm_irqchip_in_kernel()) {
            qdev_prop_set_bit(gicdev, "has-virtualization-extensions",
                              vms->virt);
        }
616
    }
617 618
    qdev_init_nofail(gicdev);
    gicbusdev = SYS_BUS_DEVICE(gicdev);
619
    sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base);
620
    if (type == 3) {
621
        sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_REDIST].base);
622
        if (nb_redist_regions == 2) {
623 624
            sysbus_mmio_map(gicbusdev, 2,
                            vms->memmap[VIRT_HIGH_GIC_REDIST2].base);
625
        }
626
    } else {
627
        sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_CPU].base);
628 629 630 631
        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);
        }
632
    }
633

634 635 636
    /* 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.
637 638 639
     */
    for (i = 0; i < smp_cpus; i++) {
        DeviceState *cpudev = DEVICE(qemu_get_cpu(i));
640
        int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
641 642 643
        int irq;
        /* Mapping from the output timer irq lines from the CPU to the
         * GIC PPI inputs we use for the virt board.
644
         */
645 646 647 648 649 650 651 652 653 654 655 656
        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]));
        }
657

658 659 660 661 662 663 664 665 666 667 668
        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);
        }

669 670 671
        qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0,
                                    qdev_get_gpio_in(gicdev, ppibase
                                                     + VIRTUAL_PMU_IRQ));
672

673
        sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
674 675
        sysbus_connect_irq(gicbusdev, i + smp_cpus,
                           qdev_get_gpio_in(cpudev, ARM_CPU_FIQ));
676 677 678 679
        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));
680 681 682 683 684 685
    }

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

686
    fdt_add_gic_node(vms);
687

688
    if (type == 3 && vms->its) {
689
        create_its(vms, gicdev);
690
    } else if (type == 2) {
691
        create_v2m(vms, pic);
692
    }
693 694
}

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

X
xiaoqiang zhao 已提交
707
    qdev_prop_set_chr(dev, "chardev", chr);
708 709 710 711
    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 已提交
712 713

    nodename = g_strdup_printf("/pl011@%" PRIx64, base);
714
    qemu_fdt_add_subnode(vms->fdt, nodename);
P
Peter Maydell 已提交
715
    /* Note that we can't use setprop_string because of the embedded NUL */
716
    qemu_fdt_setprop(vms->fdt, nodename, "compatible",
P
Peter Maydell 已提交
717
                         compat, sizeof(compat));
718
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
P
Peter Maydell 已提交
719
                                     2, base, 2, size);
720
    qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
P
Peter Maydell 已提交
721
                               GIC_FDT_IRQ_TYPE_SPI, irq,
722
                               GIC_FDT_IRQ_FLAGS_LEVEL_HI);
723 724 725
    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 已提交
726
                         clocknames, sizeof(clocknames));
727

728
    if (uart == VIRT_UART) {
729
        qemu_fdt_setprop_string(vms->fdt, "/chosen", "stdout-path", nodename);
730 731
    } else {
        /* Mark as not usable by the normal world */
732 733
        qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled");
        qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay");
734 735 736 737

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

P
Peter Maydell 已提交
740 741 742
    g_free(nodename);
}

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

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

    nodename = g_strdup_printf("/pl031@%" PRIx64, base);
754 755 756
    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 已提交
757
                                 2, base, 2, size);
758
    qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
P
Peter Maydell 已提交
759
                           GIC_FDT_IRQ_TYPE_SPI, irq,
760
                           GIC_FDT_IRQ_FLAGS_LEVEL_HI);
761 762
    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 已提交
763 764 765
    g_free(nodename);
}

766
static DeviceState *gpio_key_dev;
767 768 769
static void virt_powerdown_req(Notifier *n, void *opaque)
{
    /* use gpio Pin 3 for power button event */
770
    qemu_set_irq(qdev_get_gpio_in(gpio_key_dev, 0), 1);
771 772 773 774 775 776
}

static Notifier virt_system_powerdown_notifier = {
    .notify = virt_powerdown_req
};

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

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

788
    uint32_t phandle = qemu_fdt_alloc_phandle(vms->fdt);
S
Shannon Zhao 已提交
789
    nodename = g_strdup_printf("/pl061@%" PRIx64, base);
790 791
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
S
Shannon Zhao 已提交
792
                                 2, base, 2, size);
793 794 795 796
    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 已提交
797 798
                           GIC_FDT_IRQ_TYPE_SPI, irq,
                           GIC_FDT_IRQ_FLAGS_LEVEL_HI);
799 800 801
    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);
802

803 804
    gpio_key_dev = sysbus_create_simple("gpio-key", -1,
                                        qdev_get_gpio_in(pl061_dev, 3));
805 806 807 808
    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);
809

810 811
    qemu_fdt_add_subnode(vms->fdt, "/gpio-keys/poweroff");
    qemu_fdt_setprop_string(vms->fdt, "/gpio-keys/poweroff",
812
                            "label", "GPIO Key Poweroff");
813
    qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys/poweroff", "linux,code",
814
                          KEY_POWER);
815
    qemu_fdt_setprop_cells(vms->fdt, "/gpio-keys/poweroff",
816
                           "gpios", phandle, 3, 0);
S
Shannon Zhao 已提交
817

818 819 820
    /* connect powerdown request */
    qemu_register_powerdown_notifier(&virt_system_powerdown_notifier);

S
Shannon Zhao 已提交
821 822 823
    g_free(nodename);
}

824
static void create_virtio_devices(const VirtMachineState *vms, qemu_irq *pic)
P
Peter Maydell 已提交
825 826
{
    int i;
827
    hwaddr size = vms->memmap[VIRT_MMIO].size;
P
Peter Maydell 已提交
828

829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
    /* 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 已提交
855 856
     */
    for (i = 0; i < NUM_VIRTIO_TRANSPORTS; i++) {
857 858
        int irq = vms->irqmap[VIRT_MMIO] + i;
        hwaddr base = vms->memmap[VIRT_MMIO].base + i * size;
P
Peter Maydell 已提交
859 860 861 862

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

863 864 865 866 867 868 869
    /* 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 已提交
870 871
    for (i = NUM_VIRTIO_TRANSPORTS - 1; i >= 0; i--) {
        char *nodename;
872 873
        int irq = vms->irqmap[VIRT_MMIO] + i;
        hwaddr base = vms->memmap[VIRT_MMIO].base + i * size;
P
Peter Maydell 已提交
874 875

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

889 890 891 892 893
#define VIRT_FLASH_SECTOR_SIZE (256 * KiB)

static PFlashCFI01 *virt_flash_create1(VirtMachineState *vms,
                                        const char *name,
                                        const char *alias_prop_name)
894
{
895 896 897
    /*
     * Create a single flash device.  We use the same parameters as
     * the flash devices on the Versatile Express board.
898
     */
899
    DeviceState *dev = qdev_create(NULL, TYPE_PFLASH_CFI01);
900

901
    qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
902 903
    qdev_prop_set_uint8(dev, "width", 4);
    qdev_prop_set_uint8(dev, "device-width", 2);
904
    qdev_prop_set_bit(dev, "big-endian", false);
905 906 907 908 909
    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);
910 911 912 913 914 915
    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);
}
916

917 918 919 920 921
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");
}
922

923 924 925 926 927
static void virt_flash_map1(PFlashCFI01 *flash,
                            hwaddr base, hwaddr size,
                            MemoryRegion *sysmem)
{
    DeviceState *dev = DEVICE(flash);
928

929 930 931 932 933 934 935 936
    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));
937 938
}

939 940 941
static void virt_flash_map(VirtMachineState *vms,
                           MemoryRegion *sysmem,
                           MemoryRegion *secure_sysmem)
942
{
943 944
    /*
     * Map two flash devices to fill the VIRT_FLASH space in the memmap.
945 946 947 948 949
     * 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.
950
     */
951 952
    hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2;
    hwaddr flashbase = vms->memmap[VIRT_FLASH].base;
953

954 955 956 957 958 959 960 961 962 963 964 965 966
    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;
967

968 969 970
    if (sysmem == secure_sysmem) {
        /* Report both flash devices as a single node in the DT */
        nodename = g_strdup_printf("/flash@%" PRIx64, flashbase);
971 972 973
        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",
974 975
                                     2, flashbase, 2, flashsize,
                                     2, flashbase + flashsize, 2, flashsize);
976
        qemu_fdt_setprop_cell(vms->fdt, nodename, "bank-width", 4);
977 978
        g_free(nodename);
    } else {
979 980
        /*
         * Report the devices as separate nodes so we can mark one as
981 982 983
         * only visible to the secure world.
         */
        nodename = g_strdup_printf("/secflash@%" PRIx64, flashbase);
984 985 986
        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",
987
                                     2, flashbase, 2, flashsize);
988 989 990
        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");
991 992 993
        g_free(nodename);

        nodename = g_strdup_printf("/flash@%" PRIx64, flashbase);
994 995 996
        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",
997
                                     2, flashbase + flashsize, 2, flashsize);
998
        qemu_fdt_setprop_cell(vms->fdt, nodename, "bank-width", 4);
999 1000
        g_free(nodename);
    }
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 1045 1046 1047 1048 1049 1050
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 已提交
1051
static FWCfgState *create_fw_cfg(const VirtMachineState *vms, AddressSpace *as)
L
Laszlo Ersek 已提交
1052
{
1053
    MachineState *ms = MACHINE(vms);
1054 1055
    hwaddr base = vms->memmap[VIRT_FW_CFG].base;
    hwaddr size = vms->memmap[VIRT_FW_CFG].size;
1056
    FWCfgState *fw_cfg;
L
Laszlo Ersek 已提交
1057 1058
    char *nodename;

1059
    fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16, as);
1060
    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)ms->smp.cpus);
L
Laszlo Ersek 已提交
1061 1062

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

1073
static void create_pcie_irq_map(const VirtMachineState *vms,
1074
                                uint32_t gic_phandle,
1075 1076 1077
                                int first_irq, const char *nodename)
{
    int devfn, pin;
1078
    uint32_t full_irq_map[4 * 4 * 10] = { 0 };
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
    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 */
1091
                gic_phandle, 0, 0, irq_type, irq_nr, irq_level }; /* GIC irq */
1092 1093

            /* Convert map to big endian */
1094
            for (i = 0; i < 10; i++) {
1095 1096
                irq_map[i] = cpu_to_be32(map[i]);
            }
1097
            irq_map += 10;
1098 1099 1100
        }
    }

1101
    qemu_fdt_setprop(vms->fdt, nodename, "interrupt-map",
1102 1103
                     full_irq_map, sizeof(full_irq_map));

1104
    qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupt-map-mask",
1105 1106 1107 1108
                           0x1800, 0, 0, /* devfn (PCI_SLOT(3)) */
                           0x7           /* PCI irq */);
}

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 1154 1155 1156 1157 1158 1159
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)
1160
{
1161 1162
    hwaddr base_mmio = vms->memmap[VIRT_PCIE_MMIO].base;
    hwaddr size_mmio = vms->memmap[VIRT_PCIE_MMIO].size;
1163 1164
    hwaddr base_mmio_high = vms->memmap[VIRT_HIGH_PCIE_MMIO].base;
    hwaddr size_mmio_high = vms->memmap[VIRT_HIGH_PCIE_MMIO].size;
1165 1166
    hwaddr base_pio = vms->memmap[VIRT_PCIE_PIO].base;
    hwaddr size_pio = vms->memmap[VIRT_PCIE_PIO].size;
1167
    hwaddr base_ecam, size_ecam;
1168
    hwaddr base = base_mmio;
1169
    int nr_pcie_buses;
1170
    int irq = vms->irqmap[VIRT_PCIE];
1171 1172 1173 1174 1175 1176
    MemoryRegion *mmio_alias;
    MemoryRegion *mmio_reg;
    MemoryRegion *ecam_alias;
    MemoryRegion *ecam_reg;
    DeviceState *dev;
    char *nodename;
1177
    int i, ecam_id;
1178
    PCIHostState *pci;
1179 1180 1181 1182

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

1183 1184 1185 1186
    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;
1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204
    /* 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);

1205
    if (vms->highmem) {
1206 1207 1208 1209 1210 1211 1212 1213 1214
        /* 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);
    }

1215
    /* Map IO port space */
1216
    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 2, base_pio);
1217 1218 1219

    for (i = 0; i < GPEX_NUM_IRQS; i++) {
        sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
1220
        gpex_set_irq_num(GPEX_HOST(dev), i, irq + i);
1221 1222
    }

1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235
    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);
        }
    }

1236
    nodename = g_strdup_printf("/pcie@%" PRIx64, base);
1237 1238
    qemu_fdt_add_subnode(vms->fdt, nodename);
    qemu_fdt_setprop_string(vms->fdt, nodename,
1239
                            "compatible", "pci-host-ecam-generic");
1240 1241 1242
    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);
1243
    qemu_fdt_setprop_cell(vms->fdt, nodename, "linux,pci-domain", 0);
1244
    qemu_fdt_setprop_cells(vms->fdt, nodename, "bus-range", 0,
1245
                           nr_pcie_buses - 1);
1246
    qemu_fdt_setprop(vms->fdt, nodename, "dma-coherent", NULL, 0);
1247

1248 1249 1250
    if (vms->msi_phandle) {
        qemu_fdt_setprop_cells(vms->fdt, nodename, "msi-parent",
                               vms->msi_phandle);
1251
    }
1252

1253
    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
1254
                                 2, base_ecam, 2, size_ecam);
1255

1256
    if (vms->highmem) {
1257
        qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "ranges",
1258 1259 1260 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,
                                     1, FDT_PCI_RANGE_MMIO_64BIT,
                                     2, base_mmio_high,
                                     2, base_mmio_high, 2, size_mmio_high);
    } else {
1266
        qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "ranges",
1267 1268 1269 1270 1271
                                     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);
    }
1272

1273 1274
    qemu_fdt_setprop_cell(vms->fdt, nodename, "#interrupt-cells", 1);
    create_pcie_irq_map(vms, vms->gic_phandle, irq, nodename);
1275

1276 1277 1278 1279 1280 1281 1282 1283 1284
    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);
    }

1285 1286 1287
    g_free(nodename);
}

1288
static void create_platform_bus(VirtMachineState *vms, qemu_irq *pic)
1289 1290 1291 1292 1293 1294 1295 1296
{
    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;
1297 1298
    qdev_prop_set_uint32(dev, "num_irqs", PLATFORM_BUS_NUM_IRQS);
    qdev_prop_set_uint32(dev, "mmio_size", vms->memmap[VIRT_PLATFORM_BUS].size);
1299
    qdev_init_nofail(dev);
1300
    vms->platform_bus_dev = dev;
1301

1302 1303 1304
    s = SYS_BUS_DEVICE(dev);
    for (i = 0; i < PLATFORM_BUS_NUM_IRQS; i++) {
        int irqn = vms->irqmap[VIRT_PLATFORM_BUS] + i;
1305 1306 1307 1308
        sysbus_connect_irq(s, i, pic[irqn]);
    }

    memory_region_add_subregion(sysmem,
1309
                                vms->memmap[VIRT_PLATFORM_BUS].base,
1310 1311 1312
                                sysbus_mmio_get_region(s, 0));
}

1313
static void create_secure_ram(VirtMachineState *vms,
1314
                              MemoryRegion *secure_sysmem)
1315 1316 1317
{
    MemoryRegion *secram = g_new(MemoryRegion, 1);
    char *nodename;
1318 1319
    hwaddr base = vms->memmap[VIRT_SECURE_MEM].base;
    hwaddr size = vms->memmap[VIRT_SECURE_MEM].size;
1320

1321 1322
    memory_region_init_ram(secram, NULL, "virt.secure-ram", size,
                           &error_fatal);
1323 1324 1325
    memory_region_add_subregion(secure_sysmem, base, secram);

    nodename = g_strdup_printf("/secram@%" PRIx64, base);
1326 1327 1328 1329 1330
    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");
1331 1332 1333 1334

    g_free(nodename);
}

P
Peter Maydell 已提交
1335 1336
static void *machvirt_dtb(const struct arm_boot_info *binfo, int *fdt_size)
{
1337 1338
    const VirtMachineState *board = container_of(binfo, VirtMachineState,
                                                 bootinfo);
P
Peter Maydell 已提交
1339 1340 1341 1342 1343

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

1344
static void virt_build_smbios(VirtMachineState *vms)
1345
{
1346 1347
    MachineClass *mc = MACHINE_GET_CLASS(vms);
    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
1348 1349
    uint8_t *smbios_tables, *smbios_anchor;
    size_t smbios_tables_len, smbios_anchor_len;
1350
    const char *product = "QEMU Virtual Machine";
1351

1352 1353 1354 1355 1356
    if (kvm_enabled()) {
        product = "KVM Virtual Machine";
    }

    smbios_set_defaults("QEMU", product,
1357 1358
                        vmc->smbios_old_sys_ver ? "1.0" : mc->name, false,
                        true, SMBIOS_ENTRY_POINT_30);
1359

1360
    smbios_get_tables(MACHINE(vms), NULL, 0, &smbios_tables, &smbios_tables_len,
1361 1362 1363
                      &smbios_anchor, &smbios_anchor_len);

    if (smbios_anchor) {
A
Andrew Jones 已提交
1364
        fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-tables",
1365
                        smbios_tables, smbios_tables_len);
A
Andrew Jones 已提交
1366
        fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-anchor",
1367 1368 1369 1370
                        smbios_anchor, smbios_anchor_len);
    }
}

1371
static
1372
void virt_machine_done(Notifier *notifier, void *data)
1373
{
1374 1375
    VirtMachineState *vms = container_of(notifier, VirtMachineState,
                                         machine_done);
T
Tao Xu 已提交
1376
    MachineState *ms = MACHINE(vms);
1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393
    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]);
    }
T
Tao Xu 已提交
1394
    if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as, ms) < 0) {
1395 1396
        exit(1);
    }
1397

1398 1399
    virt_acpi_setup(vms);
    virt_build_smbios(vms);
1400 1401
}

1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424
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);
}

1425 1426
static void virt_set_memmap(VirtMachineState *vms)
{
1427 1428
    MachineState *ms = MACHINE(vms);
    hwaddr base, device_memory_base, device_memory_size;
1429 1430 1431 1432 1433 1434 1435 1436
    int i;

    vms->memmap = extended_memmap;

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

1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462
    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;
    }
1463 1464 1465 1466 1467 1468 1469 1470 1471

    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;
    }
1472 1473 1474 1475 1476 1477 1478
    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);
    }
1479 1480
}

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

1497 1498 1499 1500 1501 1502 1503
    /*
     * 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);
    }
1504

1505 1506 1507
    /* We can probe only here because during property set
     * KVM is not available yet
     */
1508 1509
    if (vms->gic_version <= 0) {
        /* "host" or "max" */
1510
        if (!kvm_enabled()) {
1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524
            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);
            }
1525 1526 1527
        }
    }

1528 1529
    if (!cpu_type_valid(machine->cpu_type)) {
        error_report("mach-virt: CPU type %s not supported", machine->cpu_type);
P
Peter Maydell 已提交
1530 1531 1532
        exit(1);
    }

1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553
    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);

1554 1555 1556 1557 1558
    /* 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.
1559 1560 1561 1562
     * 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).
1563
     */
1564 1565
    if (vms->secure && firmware_loaded) {
        vms->psci_conduit = QEMU_PSCI_CONDUIT_DISABLED;
1566 1567
    } else if (vms->virt) {
        vms->psci_conduit = QEMU_PSCI_CONDUIT_SMC;
1568 1569 1570
    } else {
        vms->psci_conduit = QEMU_PSCI_CONDUIT_HVC;
    }
1571

1572 1573 1574
    /* The maximum number of CPUs depends on the GIC version, or on how
     * many redistributors we can fit into the memory map.
     */
1575
    if (vms->gic_version == 3) {
1576 1577 1578 1579
        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;
1580
    } else {
A
Andrew Jones 已提交
1581
        virt_max_cpus = GIC_NCPU;
1582 1583
    }

A
Andrew Jones 已提交
1584
    if (max_cpus > virt_max_cpus) {
1585 1586
        error_report("Number of SMP CPUs requested (%d) exceeds max CPUs "
                     "supported by machine 'mach-virt' (%d)",
A
Andrew Jones 已提交
1587
                     max_cpus, virt_max_cpus);
1588 1589 1590
        exit(1);
    }

1591
    vms->smp_cpus = smp_cpus;
P
Peter Maydell 已提交
1592

1593 1594 1595 1596 1597 1598
    if (vms->virt && kvm_enabled()) {
        error_report("mach-virt: KVM does not support providing "
                     "Virtualization extensions to the guest CPU");
        exit(1);
    }

1599
    create_fdt(vms);
P
Peter Maydell 已提交
1600

1601 1602 1603
    possible_cpus = mc->possible_cpu_arch_ids(machine);
    for (n = 0; n < possible_cpus->len; n++) {
        Object *cpuobj;
1604
        CPUState *cs;
1605

1606 1607 1608 1609
        if (n >= smp_cpus) {
            break;
        }

1610
        cpuobj = object_new(possible_cpus->cpus[n].type);
1611
        object_property_set_int(cpuobj, possible_cpus->cpus[n].arch_id,
1612
                                "mp-affinity", NULL);
1613

1614 1615 1616
        cs = CPU(cpuobj);
        cs->cpu_index = n;

1617 1618
        numa_cpu_pre_plug(&possible_cpus->cpus[cs->cpu_index], DEVICE(cpuobj),
                          &error_fatal);
1619

1620 1621
        aarch64 &= object_property_get_bool(cpuobj, "aarch64", NULL);

1622 1623 1624 1625
        if (!vms->secure) {
            object_property_set_bool(cpuobj, false, "has_el3", NULL);
        }

1626
        if (!vms->virt && object_property_find(cpuobj, "has_el2", NULL)) {
1627 1628 1629
            object_property_set_bool(cpuobj, false, "has_el2", NULL);
        }

1630 1631
        if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED) {
            object_property_set_int(cpuobj, vms->psci_conduit,
1632
                                    "psci-conduit", NULL);
1633

1634 1635 1636 1637 1638
            /* Secondary CPUs start in PSCI powered-down state */
            if (n > 0) {
                object_property_set_bool(cpuobj, true,
                                         "start-powered-off", NULL);
            }
P
Peter Maydell 已提交
1639
        }
P
Peter Maydell 已提交
1640

1641 1642 1643 1644
        if (vmc->no_pmu && object_property_find(cpuobj, "pmu", NULL)) {
            object_property_set_bool(cpuobj, false, "pmu", NULL);
        }

P
Peter Maydell 已提交
1645
        if (object_property_find(cpuobj, "reset-cbar", NULL)) {
1646
            object_property_set_int(cpuobj, vms->memmap[VIRT_CPUPERIPHS].base,
P
Peter Maydell 已提交
1647 1648 1649
                                    "reset-cbar", &error_abort);
        }

1650 1651
        object_property_set_link(cpuobj, OBJECT(sysmem), "memory",
                                 &error_abort);
1652 1653 1654 1655
        if (vms->secure) {
            object_property_set_link(cpuobj, OBJECT(secure_sysmem),
                                     "secure-memory", &error_abort);
        }
1656

1657
        object_property_set_bool(cpuobj, true, "realized", &error_fatal);
1658
        object_unref(cpuobj);
P
Peter Maydell 已提交
1659
    }
1660
    fdt_add_timer_nodes(vms);
1661
    fdt_add_cpu_nodes(vms);
P
Peter Maydell 已提交
1662

1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678
   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);
            }
        }
    }

1679 1680
    memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram",
                                         machine->ram_size);
1681
    memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base, ram);
1682 1683 1684 1685
    if (machine->device_memory) {
        memory_region_add_subregion(sysmem, machine->device_memory->base,
                                    &machine->device_memory->mr);
    }
P
Peter Maydell 已提交
1686

1687
    virt_flash_fdt(vms, sysmem, secure_sysmem ?: sysmem);
1688

1689
    create_gic(vms, pic);
P
Peter Maydell 已提交
1690

1691
    fdt_add_pmu_nodes(vms);
1692

1693
    create_uart(vms, pic, VIRT_UART, sysmem, serial_hd(0));
1694 1695

    if (vms->secure) {
1696
        create_secure_ram(vms, secure_sysmem);
1697
        create_uart(vms, pic, VIRT_SECURE_UART, secure_sysmem, serial_hd(1));
1698
    }
P
Peter Maydell 已提交
1699

1700 1701
    vms->highmem_ecam &= vms->highmem && (!firmware_loaded || aarch64);

1702
    create_rtc(vms, pic);
P
Peter Maydell 已提交
1703

1704
    create_pcie(vms, pic);
1705

1706
    create_gpio(vms, pic);
S
Shannon Zhao 已提交
1707

P
Peter Maydell 已提交
1708 1709 1710 1711
    /* 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.
     */
1712
    create_virtio_devices(vms, pic);
P
Peter Maydell 已提交
1713

A
Andrew Jones 已提交
1714 1715
    vms->fw_cfg = create_fw_cfg(vms, &address_space_memory);
    rom_set_fw(vms->fw_cfg);
1716

1717
    create_platform_bus(vms, pic);
L
Laszlo Ersek 已提交
1718

1719 1720 1721 1722 1723
    vms->bootinfo.ram_size = machine->ram_size;
    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;
1724
    vms->bootinfo.skip_dtb_autoload = true;
1725
    vms->bootinfo.firmware_loaded = firmware_loaded;
T
Tao Xu 已提交
1726
    arm_load_kernel(ARM_CPU(first_cpu), machine, &vms->bootinfo);
1727

1728 1729
    vms->machine_done.notify = virt_machine_done;
    qemu_add_machine_init_done_notifier(&vms->machine_done);
P
Peter Maydell 已提交
1730 1731
}

1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745
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;
}

1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759
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;
}

1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773
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;
}

1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787
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;
}

1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805
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 */
1806 1807
    } else if (!strcmp(value, "max")) {
        vms->gic_version = -1; /* Will probe later */
1808
    } else {
1809
        error_setg(errp, "Invalid gic-version value");
1810
        error_append_hint(errp, "Valid values are 3, 2, host, max.\n");
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 1838 1839 1840 1841
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");
    }
}

1842 1843 1844 1845 1846 1847 1848 1849 1850 1851
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;
}

1852 1853
static int64_t virt_get_default_cpu_node_id(const MachineState *ms, int idx)
{
1854
    return idx % ms->numa_state->num_nodes;
1855 1856
}

1857 1858 1859
static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
{
    int n;
1860
    unsigned int max_cpus = ms->smp.max_cpus;
1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871
    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++) {
1872
        ms->possible_cpus->cpus[n].type = ms->cpu_type;
1873 1874 1875 1876 1877 1878 1879 1880
        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;
}

1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916
static void virt_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
                                 Error **errp)
{

    /*
     * The device memory is not yet exposed to the Guest either through
     * DT or ACPI and hence both cold/hot plug of memory is explicitly
     * disabled for now.
     */
    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
        error_setg(errp, "memory cold/hot plug is not yet supported");
        return;
    }

    pc_dimm_pre_plug(PC_DIMM(dev), MACHINE(hotplug_dev), NULL, errp);
}

static void virt_memory_plug(HotplugHandler *hotplug_dev,
                             DeviceState *dev, Error **errp)
{
    VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
    Error *local_err = NULL;

    pc_dimm_plug(PC_DIMM(dev), MACHINE(vms), &local_err);

    error_propagate(errp, local_err);
}

static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
                                            DeviceState *dev, Error **errp)
{
    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
        virt_memory_pre_plug(hotplug_dev, dev, errp);
    }
}

1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927
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));
        }
    }
1928 1929 1930 1931 1932 1933 1934 1935 1936 1937
    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
        virt_memory_plug(hotplug_dev, dev, errp);
    }
}

static void virt_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
                                          DeviceState *dev, Error **errp)
{
    error_setg(errp, "device unplug request for unsupported device"
               " type: %s", object_get_typename(OBJECT(dev)));
1938 1939 1940 1941 1942
}

static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
                                                        DeviceState *dev)
{
1943 1944
    if (object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE) ||
       (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM))) {
1945 1946 1947 1948 1949 1950
        return HOTPLUG_HANDLER(machine);
    }

    return NULL;
}

1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980
/*
 * 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;
}

1981 1982
static void virt_machine_class_init(ObjectClass *oc, void *data)
{
1983
    MachineClass *mc = MACHINE_CLASS(oc);
1984
    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
1985 1986

    mc->init = machvirt_init;
1987 1988
    /* 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
1989 1990
     * configuration of the particular instance.
     */
1991
    mc->max_cpus = 512;
1992 1993
    machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_CALXEDA_XGMAC);
    machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE);
1994
    machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
1995
    machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_PLATFORM);
1996 1997 1998
    mc->block_default_type = IF_VIRTIO;
    mc->no_cdrom = 1;
    mc->pci_allow_0_address = true;
1999 2000
    /* We know we will never create a pre-ARMv7 CPU which needs 1K pages */
    mc->minimum_page_bits = 12;
2001
    mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids;
2002
    mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
2003
    mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
2004
    mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
2005
    mc->kvm_type = virt_kvm_type;
2006
    assert(!mc->get_hotplug_handler);
2007
    mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
2008
    hc->pre_plug = virt_machine_device_pre_plug_cb;
2009
    hc->plug = virt_machine_device_plug_cb;
2010
    hc->unplug_request = virt_machine_device_unplug_request_cb;
2011
    mc->numa_mem_supported = true;
2012 2013
}

2014
static void virt_instance_init(Object *obj)
2015 2016
{
    VirtMachineState *vms = VIRT_MACHINE(obj);
2017
    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
2018

2019 2020 2021 2022 2023
    /* 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;
2024 2025 2026 2027 2028 2029
    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);
2030

2031 2032 2033 2034 2035 2036 2037 2038 2039 2040
    /* 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);

2041 2042 2043 2044 2045 2046 2047 2048
    /* 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);
2049 2050 2051 2052 2053 2054 2055
    /* 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);
2056

2057 2058
    vms->highmem_ecam = !vmc->no_highmem_ecam;

2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071
    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);
    }

2072 2073 2074 2075 2076 2077 2078 2079
    /* 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);

2080
    vms->irqmap = a15irqmap;
2081 2082

    virt_flash_create(vms);
2083 2084
}

2085 2086 2087 2088 2089 2090 2091
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 已提交
2092
    .instance_init = virt_instance_init,
2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104
    .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 已提交
2105 2106 2107 2108 2109
static void virt_machine_4_2_options(MachineClass *mc)
{
}
DEFINE_VIRT_MACHINE_AS_LATEST(4, 2)

C
Cornelia Huck 已提交
2110 2111
static void virt_machine_4_1_options(MachineClass *mc)
{
C
Cornelia Huck 已提交
2112 2113
    virt_machine_4_2_options(mc);
    compat_props_add(mc->compat_props, hw_compat_4_1, hw_compat_4_1_len);
C
Cornelia Huck 已提交
2114
}
C
Cornelia Huck 已提交
2115
DEFINE_VIRT_MACHINE(4, 1)
C
Cornelia Huck 已提交
2116

2117 2118
static void virt_machine_4_0_options(MachineClass *mc)
{
C
Cornelia Huck 已提交
2119 2120
    virt_machine_4_1_options(mc);
    compat_props_add(mc->compat_props, hw_compat_4_0, hw_compat_4_0_len);
2121
}
C
Cornelia Huck 已提交
2122
DEFINE_VIRT_MACHINE(4, 0)
2123

2124 2125
static void virt_machine_3_1_options(MachineClass *mc)
{
2126
    virt_machine_4_0_options(mc);
2127
    compat_props_add(mc->compat_props, hw_compat_3_1, hw_compat_3_1_len);
2128
}
2129
DEFINE_VIRT_MACHINE(3, 1)
2130

2131 2132
static void virt_machine_3_0_options(MachineClass *mc)
{
2133
    virt_machine_3_1_options(mc);
2134
    compat_props_add(mc->compat_props, hw_compat_3_0, hw_compat_3_0_len);
2135
}
2136 2137
DEFINE_VIRT_MACHINE(3, 0)

2138 2139
static void virt_machine_2_12_options(MachineClass *mc)
{
2140 2141
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

2142
    virt_machine_3_0_options(mc);
2143
    compat_props_add(mc->compat_props, hw_compat_2_12, hw_compat_2_12_len);
2144
    vmc->no_highmem_ecam = true;
2145
    mc->max_cpus = 255;
2146
}
2147
DEFINE_VIRT_MACHINE(2, 12)
2148

E
Eric Auger 已提交
2149 2150
static void virt_machine_2_11_options(MachineClass *mc)
{
2151 2152
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

2153
    virt_machine_2_12_options(mc);
2154
    compat_props_add(mc->compat_props, hw_compat_2_11, hw_compat_2_11_len);
2155
    vmc->smbios_old_sys_ver = true;
E
Eric Auger 已提交
2156
}
2157
DEFINE_VIRT_MACHINE(2, 11)
E
Eric Auger 已提交
2158

E
Eric Auger 已提交
2159 2160
static void virt_machine_2_10_options(MachineClass *mc)
{
E
Eric Auger 已提交
2161
    virt_machine_2_11_options(mc);
2162
    compat_props_add(mc->compat_props, hw_compat_2_10, hw_compat_2_10_len);
2163 2164
    /* before 2.11 we never faulted accesses to bad addresses */
    mc->ignore_memory_transaction_failures = true;
E
Eric Auger 已提交
2165
}
E
Eric Auger 已提交
2166
DEFINE_VIRT_MACHINE(2, 10)
E
Eric Auger 已提交
2167

P
Peter Maydell 已提交
2168 2169
static void virt_machine_2_9_options(MachineClass *mc)
{
E
Eric Auger 已提交
2170
    virt_machine_2_10_options(mc);
2171
    compat_props_add(mc->compat_props, hw_compat_2_9, hw_compat_2_9_len);
P
Peter Maydell 已提交
2172
}
E
Eric Auger 已提交
2173
DEFINE_VIRT_MACHINE(2, 9)
P
Peter Maydell 已提交
2174

A
Andrew Jones 已提交
2175 2176
static void virt_machine_2_8_options(MachineClass *mc)
{
2177 2178
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

P
Peter Maydell 已提交
2179
    virt_machine_2_9_options(mc);
2180
    compat_props_add(mc->compat_props, hw_compat_2_8, hw_compat_2_8_len);
2181 2182 2183 2184
    /* 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 已提交
2185
}
P
Peter Maydell 已提交
2186
DEFINE_VIRT_MACHINE(2, 8)
A
Andrew Jones 已提交
2187

2188 2189
static void virt_machine_2_7_options(MachineClass *mc)
{
2190 2191
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

A
Andrew Jones 已提交
2192
    virt_machine_2_8_options(mc);
2193
    compat_props_add(mc->compat_props, hw_compat_2_7, hw_compat_2_7_len);
2194 2195
    /* ITS was introduced with 2.8 */
    vmc->no_its = true;
2196 2197
    /* Stick with 1K pages for migration compatibility */
    mc->minimum_page_bits = 0;
2198
}
A
Andrew Jones 已提交
2199
DEFINE_VIRT_MACHINE(2, 7)
2200

2201
static void virt_machine_2_6_options(MachineClass *mc)
2202
{
2203 2204
    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));

2205
    virt_machine_2_7_options(mc);
2206
    compat_props_add(mc->compat_props, hw_compat_2_6, hw_compat_2_6_len);
2207
    vmc->disallow_affinity_adjustment = true;
2208 2209
    /* Disable PMU for 2.6 as PMU support was first introduced in 2.7 */
    vmc->no_pmu = true;
2210
}
2211
DEFINE_VIRT_MACHINE(2, 6)