@ -221,14 +221,14 @@ static void sysbus_device_create_devtree(SysBusDevice *sbdev, void *opaque)
}
}
static void platform_bus_create_devtree ( PPCE500Params * params , void * fdt ,
const char * mpic )
static void platform_bus_create_devtree ( const PPCE500MachineClass * pmc ,
void * fdt , const char * mpic )
{
gchar * node = g_strdup_printf ( " /platform@% " PRIx64 , params - > platform_bus_base ) ;
gchar * node = g_strdup_printf ( " /platform@% " PRIx64 , pmc - > platform_bus_base ) ;
const char platcomp [ ] = " qemu,platform \0 simple-bus " ;
uint64_t addr = params - > platform_bus_base ;
uint64_t size = params - > platform_bus_size ;
int irq_start = params - > platform_bus_first_irq ;
uint64_t addr = pmc - > platform_bus_base ;
uint64_t size = pmc - > platform_bus_size ;
int irq_start = pmc - > platform_bus_first_irq ;
PlatformBusDevice * pbus ;
DeviceState * dev ;
@ -265,8 +265,7 @@ static void platform_bus_create_devtree(PPCE500Params *params, void *fdt,
g_free ( node ) ;
}
static int ppce500_load_device_tree ( MachineState * machine ,
PPCE500Params * params ,
static int ppce500_load_device_tree ( PPCE500MachineState * pms ,
hwaddr addr ,
hwaddr initrd_base ,
hwaddr initrd_size ,
@ -274,6 +273,8 @@ static int ppce500_load_device_tree(MachineState *machine,
hwaddr kernel_size ,
bool dry_run )
{
MachineState * machine = MACHINE ( pms ) ;
const PPCE500MachineClass * pmc = PPCE500_MACHINE_GET_CLASS ( pms ) ;
CPUPPCState * env = first_cpu - > env_ptr ;
int ret = - 1 ;
uint64_t mem_reg_property [ ] = { 0 , cpu_to_be64 ( machine - > ram_size ) } ;
@ -295,12 +296,12 @@ static int ppce500_load_device_tree(MachineState *machine,
int len ;
uint32_t pci_ranges [ 14 ] =
{
0x2000000 , 0x0 , params - > pci_mmio_bus_base ,
params - > pci_mmio_base > > 32 , params - > pci_mmio_base ,
0x2000000 , 0x0 , pmc - > pci_mmio_bus_base ,
pmc - > pci_mmio_base > > 32 , pmc - > pci_mmio_base ,
0x0 , 0x20000000 ,
0x1000000 , 0x0 , 0x0 ,
params - > pci_pio_base > > 32 , params - > pci_pio_base ,
pmc - > pci_pio_base > > 32 , pmc - > pci_pio_base ,
0x0 , 0x10000 ,
} ;
QemuOpts * machine_opts = qemu_get_machine_opts ( ) ;
@ -391,7 +392,7 @@ static int ppce500_load_device_tree(MachineState *machine,
for ( i = smp_cpus - 1 ; i > = 0 ; i - - ) {
CPUState * cpu ;
char cpu_name [ 128 ] ;
uint64_t cpu_release_addr = params - > spin_base + ( i * 0x20 ) ;
uint64_t cpu_release_addr = pmc - > spin_base + ( i * 0x20 ) ;
cpu = qemu_get_cpu ( i ) ;
if ( cpu = = NULL ) {
@ -425,7 +426,7 @@ static int ppce500_load_device_tree(MachineState *machine,
qemu_fdt_add_subnode ( fdt , " /aliases " ) ;
/* XXX These should go into their respective devices' code */
snprintf ( soc , sizeof ( soc ) , " /soc@% " PRIx64 , params - > ccsrbar_base ) ;
snprintf ( soc , sizeof ( soc ) , " /soc@% " PRIx64 , pmc - > ccsrbar_base ) ;
qemu_fdt_add_subnode ( fdt , soc ) ;
qemu_fdt_setprop_string ( fdt , soc , " device_type " , " soc " ) ;
qemu_fdt_setprop ( fdt , soc , " compatible " , compatible_sb ,
@ -433,7 +434,7 @@ static int ppce500_load_device_tree(MachineState *machine,
qemu_fdt_setprop_cell ( fdt , soc , " #address-cells " , 1 ) ;
qemu_fdt_setprop_cell ( fdt , soc , " #size-cells " , 1 ) ;
qemu_fdt_setprop_cells ( fdt , soc , " ranges " , 0x0 ,
params - > ccsrbar_base > > 32 , params - > ccsrbar_base ,
pmc - > ccsrbar_base > > 32 , pmc - > ccsrbar_base ,
MPC8544_CCSRBAR_SIZE ) ;
/* XXX should contain a reasonable value */
qemu_fdt_setprop_cell ( fdt , soc , " bus-frequency " , 0 ) ;
@ -493,7 +494,7 @@ static int ppce500_load_device_tree(MachineState *machine,
qemu_fdt_setprop_cell ( fdt , msi , " linux,phandle " , msi_ph ) ;
snprintf ( pci , sizeof ( pci ) , " /pci@%llx " ,
params - > ccsrbar_base + MPC8544_PCI_REGS_OFFSET ) ;
pmc - > ccsrbar_base + MPC8544_PCI_REGS_OFFSET ) ;
qemu_fdt_add_subnode ( fdt , pci ) ;
qemu_fdt_setprop_cell ( fdt , pci , " cell-index " , 0 ) ;
qemu_fdt_setprop_string ( fdt , pci , " compatible " , " fsl,mpc8540-pci " ) ;
@ -501,7 +502,7 @@ static int ppce500_load_device_tree(MachineState *machine,
qemu_fdt_setprop_cells ( fdt , pci , " interrupt-map-mask " , 0xf800 , 0x0 ,
0x0 , 0x7 ) ;
pci_map = pci_map_create ( fdt , qemu_fdt_get_phandle ( fdt , mpic ) ,
params - > pci_first_slot , params - > pci_nr_slots ,
pmc - > pci_first_slot , pmc - > pci_nr_slots ,
& len ) ;
qemu_fdt_setprop ( fdt , pci , " interrupt-map " , pci_map , len ) ;
qemu_fdt_setprop_phandle ( fdt , pci , " interrupt-parent " , mpic ) ;
@ -513,8 +514,8 @@ static int ppce500_load_device_tree(MachineState *machine,
qemu_fdt_setprop_cell ( fdt , pci , " fsl,msi " , msi_ph ) ;
qemu_fdt_setprop ( fdt , pci , " ranges " , pci_ranges , sizeof ( pci_ranges ) ) ;
qemu_fdt_setprop_cells ( fdt , pci , " reg " ,
( params - > ccsrbar_base + MPC8544_PCI_REGS_OFFSET ) > > 32 ,
( params - > ccsrbar_base + MPC8544_PCI_REGS_OFFSET ) ,
( pmc - > ccsrbar_base + MPC8544_PCI_REGS_OFFSET ) > > 32 ,
( pmc - > ccsrbar_base + MPC8544_PCI_REGS_OFFSET ) ,
0 , 0x1000 ) ;
qemu_fdt_setprop_cell ( fdt , pci , " clock-frequency " , 66666666 ) ;
qemu_fdt_setprop_cell ( fdt , pci , " #interrupt-cells " , 1 ) ;
@ -522,15 +523,15 @@ static int ppce500_load_device_tree(MachineState *machine,
qemu_fdt_setprop_cell ( fdt , pci , " #address-cells " , 3 ) ;
qemu_fdt_setprop_string ( fdt , " /aliases " , " pci0 " , pci ) ;
if ( params - > has_mpc8xxx_gpio ) {
if ( pmc - > has_mpc8xxx_gpio ) {
create_dt_mpc8xxx_gpio ( fdt , soc , mpic ) ;
}
if ( params - > has_platform_bus ) {
platform_bus_create_devtree ( params , fdt , mpic ) ;
if ( pmc - > has_platform_bus ) {
platform_bus_create_devtree ( pmc , fdt , mpic ) ;
}
params - > fixup_devtree ( params , fdt ) ;
pmc - > fixup_devtree ( fdt ) ;
if ( toplevel_compat ) {
qemu_fdt_setprop ( fdt , " / " , " compatible " , toplevel_compat ,
@ -551,8 +552,7 @@ out:
}
typedef struct DeviceTreeParams {
MachineState * machine ;
PPCE500Params params ;
PPCE500MachineState * machine ;
hwaddr addr ;
hwaddr initrd_base ;
hwaddr initrd_size ;
@ -564,7 +564,7 @@ typedef struct DeviceTreeParams {
static void ppce500_reset_device_tree ( void * opaque )
{
DeviceTreeParams * p = opaque ;
ppce500_load_device_tree ( p - > machine , & p - > params , p - > addr , p - > initrd_base ,
ppce500_load_device_tree ( p - > machine , p - > addr , p - > initrd_base ,
p - > initrd_size , p - > kernel_base , p - > kernel_size ,
false ) ;
}
@ -575,8 +575,7 @@ static void ppce500_init_notify(Notifier *notifier, void *data)
ppce500_reset_device_tree ( p ) ;
}
static int ppce500_prep_device_tree ( MachineState * machine ,
PPCE500Params * params ,
static int ppce500_prep_device_tree ( PPCE500MachineState * machine ,
hwaddr addr ,
hwaddr initrd_base ,
hwaddr initrd_size ,
@ -585,7 +584,6 @@ static int ppce500_prep_device_tree(MachineState *machine,
{
DeviceTreeParams * p = g_new ( DeviceTreeParams , 1 ) ;
p - > machine = machine ;
p - > params = * params ;
p - > addr = addr ;
p - > initrd_base = initrd_base ;
p - > initrd_size = initrd_size ;
@ -597,9 +595,8 @@ static int ppce500_prep_device_tree(MachineState *machine,
qemu_add_machine_init_done_notifier ( & p - > notifier ) ;
/* Issue the device tree loader once, so that we get the size of the blob */
return ppce500_load_device_tree ( machine , params , addr , initrd_base ,
initrd_size , kernel_base , kernel_size ,
true ) ;
return ppce500_load_device_tree ( machine , addr , initrd_base , initrd_size ,
kernel_base , kernel_size , true ) ;
}
/* Create -kernel TLB entries for BookE. */
@ -685,17 +682,19 @@ static void ppce500_cpu_reset(void *opaque)
mmubooke_create_initial_mapping ( env ) ;
}
static DeviceState * ppce500_init_mpic_qemu ( PPCE500Params * para ms ,
static DeviceState * ppce500_init_mpic_qemu ( PPCE500MachineState * p ms ,
qemu_irq * * irqs )
{
DeviceState * dev ;
SysBusDevice * s ;
int i , j , k ;
MachineState * machine = MACHINE ( pms ) ;
const PPCE500MachineClass * pmc = PPCE500_MACHINE_GET_CLASS ( pms ) ;
dev = qdev_create ( NULL , TYPE_OPENPIC ) ;
object_property_add_child ( qdev_get_machine ( ) , " pic " , OBJECT ( dev ) ,
object_property_add_child ( OBJECT ( machine ) , " pic " , OBJECT ( dev ) ,
& error_fatal ) ;
qdev_prop_set_uint32 ( dev , " model " , params - > mpic_version ) ;
qdev_prop_set_uint32 ( dev , " model " , pmc - > mpic_version ) ;
qdev_prop_set_uint32 ( dev , " nb_cpus " , smp_cpus ) ;
qdev_init_nofail ( dev ) ;
@ -711,7 +710,7 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500Params *params,
return dev ;
}
static DeviceState * ppce500_init_mpic_kvm ( PPCE500Params * params ,
static DeviceState * ppce500_init_mpic_kvm ( const PPCE500MachineClass * pmc ,
qemu_irq * * irqs , Error * * errp )
{
Error * err = NULL ;
@ -719,7 +718,7 @@ static DeviceState *ppce500_init_mpic_kvm(PPCE500Params *params,
CPUState * cs ;
dev = qdev_create ( NULL , TYPE_KVM_OPENPIC ) ;
qdev_prop_set_uint32 ( dev , " model " , params - > mpic_version ) ;
qdev_prop_set_uint32 ( dev , " model " , pmc - > mpic_version ) ;
object_property_set_bool ( OBJECT ( dev ) , true , " realized " , & err ) ;
if ( err ) {
@ -739,11 +738,12 @@ static DeviceState *ppce500_init_mpic_kvm(PPCE500Params *params,
return dev ;
}
static DeviceState * ppce500_init_mpic ( MachineState * machine ,
PPCE500Params * params ,
static DeviceState * ppce500_init_mpic ( PPCE500MachineState * pms ,
MemoryRegion * ccsr ,
qemu_irq * * irqs )
{
MachineState * machine = MACHINE ( pms ) ;
const PPCE500MachineClass * pmc = PPCE500_MACHINE_GET_CLASS ( pms ) ;
DeviceState * dev = NULL ;
SysBusDevice * s ;
@ -751,7 +751,7 @@ static DeviceState *ppce500_init_mpic(MachineState *machine,
Error * err = NULL ;
if ( machine_kernel_irqchip_allowed ( machine ) ) {
dev = ppce500_init_mpic_kvm ( params , irqs , & err ) ;
dev = ppce500_init_mpic_kvm ( pmc , irqs , & err ) ;
}
if ( machine_kernel_irqchip_required ( machine ) & & ! dev ) {
error_reportf_err ( err ,
@ -761,7 +761,7 @@ static DeviceState *ppce500_init_mpic(MachineState *machine,
}
if ( ! dev ) {
dev = ppce500_init_mpic_qemu ( para ms , irqs ) ;
dev = ppce500_init_mpic_qemu ( pms , irqs ) ;
}
s = SYS_BUS_DEVICE ( dev ) ;
@ -778,10 +778,12 @@ static void ppce500_power_off(void *opaque, int line, int on)
}
}
void ppce500_init ( MachineState * machine , PPCE500Params * params )
void ppce500_init ( MachineState * machine )
{
MemoryRegion * address_space_mem = get_system_memory ( ) ;
MemoryRegion * ram = g_new ( MemoryRegion , 1 ) ;
PPCE500MachineState * pms = PPCE500_MACHINE ( machine ) ;
const PPCE500MachineClass * pmc = PPCE500_MACHINE_GET_CLASS ( machine ) ;
PCIBus * pci_bus ;
CPUPPCState * env = NULL ;
uint64_t loadaddr ;
@ -835,8 +837,7 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
irqs [ i ] [ OPENPIC_OUTPUT_INT ] = input [ PPCE500_INPUT_INT ] ;
irqs [ i ] [ OPENPIC_OUTPUT_CINT ] = input [ PPCE500_INPUT_CINT ] ;
env - > spr_cb [ SPR_BOOKE_PIR ] . default_value = cs - > cpu_index = i ;
env - > mpic_iack = params - > ccsrbar_base +
MPC8544_MPIC_REGS_OFFSET + 0xa0 ;
env - > mpic_iack = pmc - > ccsrbar_base + MPC8544_MPIC_REGS_OFFSET + 0xa0 ;
ppc_booke_timers_init ( cpu , 400000000 , PPC_TIMER_E500 ) ;
@ -869,10 +870,10 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
qdev_init_nofail ( dev ) ;
ccsr = CCSR ( dev ) ;
ccsr_addr_space = & ccsr - > ccsr_space ;
memory_region_add_subregion ( address_space_mem , params - > ccsrbar_base ,
memory_region_add_subregion ( address_space_mem , pmc - > ccsrbar_base ,
ccsr_addr_space ) ;
mpicdev = ppce500_init_mpic ( machine , para ms, ccsr_addr_space , irqs ) ;
mpicdev = ppce500_init_mpic ( p ms, ccsr_addr_space , irqs ) ;
/* Serial */
if ( serial_hd ( 0 ) ) {
@ -898,7 +899,7 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
dev = qdev_create ( NULL , " e500-pcihost " ) ;
object_property_add_child ( qdev_get_machine ( ) , " pci-host " , OBJECT ( dev ) ,
& error_abort ) ;
qdev_prop_set_uint32 ( dev , " first_slot " , params - > pci_first_slot ) ;
qdev_prop_set_uint32 ( dev , " first_slot " , pmc - > pci_first_slot ) ;
qdev_prop_set_uint32 ( dev , " first_pin_irq " , pci_irq_nrs [ 0 ] ) ;
qdev_init_nofail ( dev ) ;
s = SYS_BUS_DEVICE ( dev ) ;
@ -921,9 +922,9 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
}
/* Register spinning region */
sysbus_create_simple ( " e500-spin " , params - > spin_base , NULL ) ;
sysbus_create_simple ( " e500-spin " , pmc - > spin_base , NULL ) ;
if ( params - > has_mpc8xxx_gpio ) {
if ( pmc - > has_mpc8xxx_gpio ) {
qemu_irq poweroff_irq ;
dev = qdev_create ( NULL , " mpc8xxx_gpio " ) ;
@ -939,21 +940,21 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
}
/* Platform Bus Device */
if ( params - > has_platform_bus ) {
if ( pmc - > has_platform_bus ) {
dev = qdev_create ( NULL , TYPE_PLATFORM_BUS_DEVICE ) ;
dev - > id = TYPE_PLATFORM_BUS_DEVICE ;
qdev_prop_set_uint32 ( dev , " num_irqs " , params - > platform_bus_num_irqs ) ;
qdev_prop_set_uint32 ( dev , " mmio_size " , params - > platform_bus_size ) ;
qdev_prop_set_uint32 ( dev , " num_irqs " , pmc - > platform_bus_num_irqs ) ;
qdev_prop_set_uint32 ( dev , " mmio_size " , pmc - > platform_bus_size ) ;
qdev_init_nofail ( dev ) ;
s = SYS_BUS_DEVICE ( dev ) ;
for ( i = 0 ; i < params - > platform_bus_num_irqs ; i + + ) {
int irqn = params - > platform_bus_first_irq + i ;
for ( i = 0 ; i < pmc - > platform_bus_num_irqs ; i + + ) {
int irqn = pmc - > platform_bus_first_irq + i ;
sysbus_connect_irq ( s , i , qdev_get_gpio_in ( mpicdev , irqn ) ) ;
}
memory_region_add_subregion ( address_space_mem ,
params - > platform_bus_base ,
pmc - > platform_bus_base ,
sysbus_mmio_get_region ( s , 0 ) ) ;
}
@ -1056,7 +1057,7 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
exit ( 1 ) ;
}
dt_size = ppce500_prep_device_tree ( machine , para ms, dt_base ,
dt_size = ppce500_prep_device_tree ( p ms, dt_base ,
initrd_base , initrd_size ,
kernel_base , kernel_size ) ;
if ( dt_size < 0 ) {
@ -1085,9 +1086,17 @@ static const TypeInfo e500_ccsr_info = {
. instance_init = e500_ccsr_initfn ,
} ;
static const TypeInfo ppce500_info = {
. name = TYPE_PPCE500_MACHINE ,
. parent = TYPE_MACHINE ,
. abstract = true ,
. class_size = sizeof ( PPCE500MachineClass ) ,
} ;
static void e500_register_types ( void )
{
type_register_static ( & e500_ccsr_info ) ;
type_register_static ( & ppce500_info ) ;
}
type_init ( e500_register_types )