2 * Generic device-tree-driven paravirt PPC e500 platform
4 * Copyright 2012 Freescale Semiconductor, Inc.
6 * This is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
12 #include "qemu/osdep.h"
13 #include "qemu-common.h"
15 #include "hw/net/fsl_etsec/etsec.h"
16 #include "hw/boards.h"
17 #include "sysemu/device_tree.h"
18 #include "sysemu/kvm.h"
19 #include "hw/sysbus.h"
20 #include "hw/pci/pci.h"
21 #include "hw/ppc/openpic.h"
24 static void e500plat_fixup_devtree(void *fdt
)
26 const char model
[] = "QEMU ppce500";
27 const char compatible
[] = "fsl,qemu-e500";
29 qemu_fdt_setprop(fdt
, "/", "model", model
, sizeof(model
));
30 qemu_fdt_setprop(fdt
, "/", "compatible", compatible
,
34 static void e500plat_init(MachineState
*machine
)
36 PPCE500MachineClass
*pmc
= PPCE500_MACHINE_GET_CLASS(machine
);
37 /* Older KVM versions don't support EPR which breaks guests when we announce
38 MPIC variants that support EPR. Revert to an older one for those */
39 if (kvm_enabled() && !kvmppc_has_cap_epr()) {
40 pmc
->mpic_version
= OPENPIC_MODEL_FSL_MPIC_20
;
43 ppce500_init(machine
);
46 static void e500plat_machine_device_plug_cb(HotplugHandler
*hotplug_dev
,
47 DeviceState
*dev
, Error
**errp
)
49 PPCE500MachineState
*pms
= PPCE500_MACHINE(hotplug_dev
);
52 if (object_dynamic_cast(OBJECT(dev
), TYPE_SYS_BUS_DEVICE
)) {
53 platform_bus_link_device(pms
->pbus_dev
, SYS_BUS_DEVICE(dev
));
59 HotplugHandler
*e500plat_machine_get_hotpug_handler(MachineState
*machine
,
62 if (object_dynamic_cast(OBJECT(dev
), TYPE_SYS_BUS_DEVICE
)) {
63 return HOTPLUG_HANDLER(machine
);
69 #define TYPE_E500PLAT_MACHINE MACHINE_TYPE_NAME("ppce500")
71 static void e500plat_machine_class_init(ObjectClass
*oc
, void *data
)
73 PPCE500MachineClass
*pmc
= PPCE500_MACHINE_CLASS(oc
);
74 HotplugHandlerClass
*hc
= HOTPLUG_HANDLER_CLASS(oc
);
75 MachineClass
*mc
= MACHINE_CLASS(oc
);
77 assert(!mc
->get_hotplug_handler
);
78 mc
->get_hotplug_handler
= e500plat_machine_get_hotpug_handler
;
79 hc
->plug
= e500plat_machine_device_plug_cb
;
81 pmc
->pci_first_slot
= 0x1;
82 pmc
->pci_nr_slots
= PCI_SLOT_MAX
- 1;
83 pmc
->fixup_devtree
= e500plat_fixup_devtree
;
84 pmc
->mpic_version
= OPENPIC_MODEL_FSL_MPIC_42
;
85 pmc
->has_mpc8xxx_gpio
= true;
86 pmc
->has_platform_bus
= true;
87 pmc
->platform_bus_base
= 0xf00000000ULL
;
88 pmc
->platform_bus_size
= (128ULL * 1024 * 1024);
89 pmc
->platform_bus_first_irq
= 5;
90 pmc
->platform_bus_num_irqs
= 10;
91 pmc
->ccsrbar_base
= 0xFE0000000ULL
;
92 pmc
->pci_pio_base
= 0xFE1000000ULL
;
93 pmc
->pci_mmio_base
= 0xC00000000ULL
;
94 pmc
->pci_mmio_bus_base
= 0xE0000000ULL
;
95 pmc
->spin_base
= 0xFEF000000ULL
;
97 mc
->desc
= "generic paravirt e500 platform";
98 mc
->init
= e500plat_init
;
100 mc
->default_cpu_type
= POWERPC_CPU_TYPE_NAME("e500v2_v30");
101 machine_class_allow_dynamic_sysbus_dev(mc
, TYPE_ETSEC_COMMON
);
104 static const TypeInfo e500plat_info
= {
105 .name
= TYPE_E500PLAT_MACHINE
,
106 .parent
= TYPE_PPCE500_MACHINE
,
107 .class_init
= e500plat_machine_class_init
,
108 .interfaces
= (InterfaceInfo
[]) {
109 { TYPE_HOTPLUG_HANDLER
},
114 static void e500plat_register_types(void)
116 type_register_static(&e500plat_info
);
118 type_init(e500plat_register_types
)