For e500 our approach to supporting dynamically spawned sysbus devices is to create a simple bus from the guest's point of view within which we map those devices dynamically. We allocate memory regions always within the "platform" hole in address space and map IRQs to predetermined IRQ lines that are reserved for platform device usage. This maps really nicely into device tree logic, so we can just tell the guest about our virtual simple bus in device tree as well. Signed-off-by: Alexander Graf <agraf@suse.de>
69 lines
2 KiB
C
69 lines
2 KiB
C
/*
|
|
* Generic device-tree-driven paravirt PPC e500 platform
|
|
*
|
|
* Copyright 2012 Freescale Semiconductor, Inc.
|
|
*
|
|
* This is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "qemu-common.h"
|
|
#include "e500.h"
|
|
#include "hw/boards.h"
|
|
#include "sysemu/device_tree.h"
|
|
#include "hw/pci/pci.h"
|
|
#include "hw/ppc/openpic.h"
|
|
#include "kvm_ppc.h"
|
|
|
|
static void e500plat_fixup_devtree(PPCE500Params *params, void *fdt)
|
|
{
|
|
const char model[] = "QEMU ppce500";
|
|
const char compatible[] = "fsl,qemu-e500";
|
|
|
|
qemu_fdt_setprop(fdt, "/", "model", model, sizeof(model));
|
|
qemu_fdt_setprop(fdt, "/", "compatible", compatible,
|
|
sizeof(compatible));
|
|
}
|
|
|
|
static void e500plat_init(MachineState *machine)
|
|
{
|
|
PPCE500Params params = {
|
|
.pci_first_slot = 0x1,
|
|
.pci_nr_slots = PCI_SLOT_MAX - 1,
|
|
.fixup_devtree = e500plat_fixup_devtree,
|
|
.mpic_version = OPENPIC_MODEL_FSL_MPIC_42,
|
|
.has_mpc8xxx_gpio = true,
|
|
.has_platform_bus = true,
|
|
.platform_bus_base = 0xf00000000ULL,
|
|
.platform_bus_size = (128ULL * 1024 * 1024),
|
|
.platform_bus_first_irq = 5,
|
|
.platform_bus_num_irqs = 10,
|
|
};
|
|
|
|
/* Older KVM versions don't support EPR which breaks guests when we announce
|
|
MPIC variants that support EPR. Revert to an older one for those */
|
|
if (kvm_enabled() && !kvmppc_has_cap_epr()) {
|
|
params.mpic_version = OPENPIC_MODEL_FSL_MPIC_20;
|
|
}
|
|
|
|
ppce500_init(machine, ¶ms);
|
|
}
|
|
|
|
static QEMUMachine e500plat_machine = {
|
|
.name = "ppce500",
|
|
.desc = "generic paravirt e500 platform",
|
|
.init = e500plat_init,
|
|
.max_cpus = 32,
|
|
.has_dynamic_sysbus = true,
|
|
};
|
|
|
|
static void e500plat_machine_init(void)
|
|
{
|
|
qemu_register_machine(&e500plat_machine);
|
|
}
|
|
|
|
machine_init(e500plat_machine_init);
|