@ -31,12 +31,12 @@ struct BCM283XClass {
} ;
static Property bcm2836_enabled_cores_property =
DEFINE_PROP_UINT32 ( " enabled-cpus " , BCM283XState , enabled_cpus , 0 ) ;
DEFINE_PROP_UINT32 ( " enabled-cpus " , BCM283XBase State , enabled_cpus , 0 ) ;
static void bcm2836 _init ( Object * obj )
static void bcm283x_base _init ( Object * obj )
{
BCM283XState * s = BCM283X ( obj ) ;
BCM283XClass * bc = BCM283X_GET_CLASS ( obj ) ;
BCM283XBase State * s = BCM283X_BASE ( obj ) ;
BCM283XBase Class * bc = BCM283X_BASE _GET_CLASS ( obj ) ;
int n ;
for ( n = 0 ; n < bc - > core_count ; n + + ) {
@ -52,6 +52,11 @@ static void bcm2836_init(Object *obj)
object_initialize_child ( obj , " control " , & s - > control ,
TYPE_BCM2836_CONTROL ) ;
}
}
static void bcm283x_init ( Object * obj )
{
BCM283XState * s = BCM283X ( obj ) ;
object_initialize_child ( obj , " peripherals " , & s - > peripherals ,
TYPE_BCM2835_PERIPHERALS ) ;
@ -63,10 +68,11 @@ static void bcm2836_init(Object *obj)
" vcram-size " ) ;
}
static bool bcm283x_common_realize ( DeviceState * dev , Error * * errp )
bool bcm283x_common_realize ( DeviceState * dev , Error * * errp )
{
BCM283XState * s = BCM283X ( dev ) ;
BCM283XClass * bc = BCM283X_GET_CLASS ( dev ) ;
BCM283XBaseState * s_base = BCM283X_BASE ( dev ) ;
BCM283XBaseClass * bc = BCM283X_BASE_GET_CLASS ( dev ) ;
Object * obj ;
/* common peripherals from bcm2835 */
@ -79,90 +85,93 @@ static bool bcm283x_common_realize(DeviceState *dev, Error **errp)
return false ;
}
object_property_add_alias ( OBJECT ( s ) , " sd-bus " , OBJECT ( & s - > peripherals ) ,
" sd-bus " ) ;
object_property_add_alias ( OBJECT ( s_base ) , " sd-bus " ,
OBJECT ( & s - > peripherals ) , " sd-bus " ) ;
sysbus_mmio_map_overlap ( SYS_BUS_DEVICE ( & s - > peripherals ) , 0 ,
bc - > peri_base , 1 ) ;
sysbus_mmio_map_overlap ( SYS_BUS_DEVICE ( & s - > peripherals ) ,
0 , bc - > peri_base , 1 ) ;
return true ;
}
static void bcm2835_realize ( DeviceState * dev , Error * * errp )
{
BCM283XState * s = BCM283X ( dev ) ;
BCM283XBaseState * s_base = BCM283X_BASE ( dev ) ;
if ( ! bcm283x_common_realize ( dev , errp ) ) {
return ;
}
if ( ! qdev_realize ( DEVICE ( & s - > cpu [ 0 ] . core ) , NULL , errp ) ) {
if ( ! qdev_realize ( DEVICE ( & s_base - > cpu [ 0 ] . core ) , NULL , errp ) ) {
return ;
}
/* Connect irq/fiq outputs from the interrupt controller. */
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > peripherals ) , 0 ,
qdev_get_gpio_in ( DEVICE ( & s - > cpu [ 0 ] . core ) , ARM_CPU_IRQ ) ) ;
qdev_get_gpio_in ( DEVICE ( & s_base - > cpu [ 0 ] . core ) , ARM_CPU_IRQ ) ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > peripherals ) , 1 ,
qdev_get_gpio_in ( DEVICE ( & s - > cpu [ 0 ] . core ) , ARM_CPU_FIQ ) ) ;
qdev_get_gpio_in ( DEVICE ( & s_base - > cpu [ 0 ] . core ) , ARM_CPU_FIQ ) ) ;
}
static void bcm2836_realize ( DeviceState * dev , Error * * errp )
{
BCM283XState * s = BCM283X ( dev ) ;
BCM283XClass * bc = BCM283X_GET_CLASS ( dev ) ;
int n ;
BCM283XState * s = BCM283X ( dev ) ;
BCM283XBaseState * s_base = BCM283X_BASE ( dev ) ;
BCM283XBaseClass * bc = BCM283X_BASE_GET_CLASS ( dev ) ;
if ( ! bcm283x_common_realize ( dev , errp ) ) {
return ;
}
/* bcm2836 interrupt controller (and mailboxes, etc.) */
if ( ! sysbus_realize ( SYS_BUS_DEVICE ( & s - > control ) , errp ) ) {
if ( ! sysbus_realize ( SYS_BUS_DEVICE ( & s_base - > control ) , errp ) ) {
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > control ) , 0 , bc - > ctrl_base ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s_base - > control ) , 0 , bc - > ctrl_base ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > peripherals ) , 0 ,
qdev_get_gpio_in_named ( DEVICE ( & s - > control ) , " gpu-irq " , 0 ) ) ;
qdev_get_gpio_in_named ( DEVICE ( & s_base - > control ) , " gpu-irq " , 0 ) ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > peripherals ) , 1 ,
qdev_get_gpio_in_named ( DEVICE ( & s - > control ) , " gpu-fiq " , 0 ) ) ;
qdev_get_gpio_in_named ( DEVICE ( & s_base - > control ) , " gpu-fiq " , 0 ) ) ;
for ( n = 0 ; n < BCM283X_NCPUS ; n + + ) {
object_property_set_int ( OBJECT ( & s - > cpu [ n ] . core ) , " mp-affinity " ,
object_property_set_int ( OBJECT ( & s_base - > cpu [ n ] . core ) , " mp-affinity " ,
( bc - > clusterid < < 8 ) | n , & error_abort ) ;
/* set periphbase/CBAR value for CPU-local registers */
object_property_set_int ( OBJECT ( & s - > cpu [ n ] . core ) , " reset-cbar " ,
object_property_set_int ( OBJECT ( & s_base - > cpu [ n ] . core ) , " reset-cbar " ,
bc - > peri_base , & error_abort ) ;
/* start powered off if not enabled */
object_property_set_bool ( OBJECT ( & s - > cpu [ n ] . core ) , " start-powered-off " ,
n > = s - > enabled_cpus , & error_abort ) ;
object_property_set_bool ( OBJECT ( & s_base - > cpu [ n ] . core ) ,
" start-powered-off " ,
n > = s_base - > enabled_cpus , & error_abort ) ;
if ( ! qdev_realize ( DEVICE ( & s - > cpu [ n ] . core ) , NULL , errp ) ) {
if ( ! qdev_realize ( DEVICE ( & s_base - > cpu [ n ] . core ) , NULL , errp ) ) {
return ;
}
/* Connect irq/fiq outputs from the interrupt controller. */
qdev_connect_gpio_out_named ( DEVICE ( & s - > control ) , " irq " , n ,
qdev_get_gpio_in ( DEVICE ( & s - > cpu [ n ] . core ) , ARM_CPU_IRQ ) ) ;
qdev_connect_gpio_out_named ( DEVICE ( & s - > control ) , " fiq " , n ,
qdev_get_gpio_in ( DEVICE ( & s - > cpu [ n ] . core ) , ARM_CPU_FIQ ) ) ;
qdev_connect_gpio_out_named ( DEVICE ( & s_base - > control ) , " irq " , n ,
qdev_get_gpio_in ( DEVICE ( & s_base - > cpu [ n ] . core ) , ARM_CPU_IRQ ) ) ;
qdev_connect_gpio_out_named ( DEVICE ( & s_base - > control ) , " fiq " , n ,
qdev_get_gpio_in ( DEVICE ( & s_base - > cpu [ n ] . core ) , ARM_CPU_FIQ ) ) ;
/* Connect timers from the CPU to the interrupt controller */
qdev_connect_gpio_out ( DEVICE ( & s - > cpu [ n ] . core ) , GTIMER_PHYS ,
qdev_get_gpio_in_named ( DEVICE ( & s - > control ) , " cntpnsirq " , n ) ) ;
qdev_connect_gpio_out ( DEVICE ( & s - > cpu [ n ] . core ) , GTIMER_VIRT ,
qdev_get_gpio_in_named ( DEVICE ( & s - > control ) , " cntvirq " , n ) ) ;
qdev_connect_gpio_out ( DEVICE ( & s - > cpu [ n ] . core ) , GTIMER_HYP ,
qdev_get_gpio_in_named ( DEVICE ( & s - > control ) , " cnthpirq " , n ) ) ;
qdev_connect_gpio_out ( DEVICE ( & s - > cpu [ n ] . core ) , GTIMER_SEC ,
qdev_get_gpio_in_named ( DEVICE ( & s - > control ) , " cntpsirq " , n ) ) ;
qdev_connect_gpio_out ( DEVICE ( & s_base - > cpu [ n ] . core ) , GTIMER_PHYS ,
qdev_get_gpio_in_named ( DEVICE ( & s_base - > control ) , " cntpnsirq " , n ) ) ;
qdev_connect_gpio_out ( DEVICE ( & s_base - > cpu [ n ] . core ) , GTIMER_VIRT ,
qdev_get_gpio_in_named ( DEVICE ( & s_base - > control ) , " cntvirq " , n ) ) ;
qdev_connect_gpio_out ( DEVICE ( & s_base - > cpu [ n ] . core ) , GTIMER_HYP ,
qdev_get_gpio_in_named ( DEVICE ( & s_base - > control ) , " cnthpirq " , n ) ) ;
qdev_connect_gpio_out ( DEVICE ( & s_base - > cpu [ n ] . core ) , GTIMER_SEC ,
qdev_get_gpio_in_named ( DEVICE ( & s_base - > control ) , " cntpsirq " , n ) ) ;
}
}
static void bcm283x_class_init ( ObjectClass * oc , void * data )
static void bcm283x_base_ class_init ( ObjectClass * oc , void * data )
{
DeviceClass * dc = DEVICE_CLASS ( oc ) ;
@ -173,7 +182,7 @@ static void bcm283x_class_init(ObjectClass *oc, void *data)
static void bcm2835_class_init ( ObjectClass * oc , void * data )
{
DeviceClass * dc = DEVICE_CLASS ( oc ) ;
BCM283XClass * bc = BCM283X_CLASS ( oc ) ;
BCM283XBase Class * bc = BCM283X_BASE _CLASS ( oc ) ;
bc - > cpu_type = ARM_CPU_TYPE_NAME ( " arm1176 " ) ;
bc - > core_count = 1 ;
@ -184,7 +193,7 @@ static void bcm2835_class_init(ObjectClass *oc, void *data)
static void bcm2836_class_init ( ObjectClass * oc , void * data )
{
DeviceClass * dc = DEVICE_CLASS ( oc ) ;
BCM283XClass * bc = BCM283X_CLASS ( oc ) ;
BCM283XBase Class * bc = BCM283X_BASE _CLASS ( oc ) ;
bc - > cpu_type = ARM_CPU_TYPE_NAME ( " cortex-a7 " ) ;
bc - > core_count = BCM283X_NCPUS ;
@ -198,7 +207,7 @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
static void bcm2837_class_init ( ObjectClass * oc , void * data )
{
DeviceClass * dc = DEVICE_CLASS ( oc ) ;
BCM283XClass * bc = BCM283X_CLASS ( oc ) ;
BCM283XBase Class * bc = BCM283X_BASE _CLASS ( oc ) ;
bc - > cpu_type = ARM_CPU_TYPE_NAME ( " cortex-a53 " ) ;
bc - > core_count = BCM283X_NCPUS ;
@ -226,11 +235,17 @@ static const TypeInfo bcm283x_types[] = {
# endif
} , {
. name = TYPE_BCM283X ,
. parent = TYPE_DEVIC E ,
. parent = TYPE_BCM283X_BAS E ,
. instance_size = sizeof ( BCM283XState ) ,
. instance_init = bcm2836_init ,
. class_size = sizeof ( BCM283XClass ) ,
. class_init = bcm283x_class_init ,
. instance_init = bcm283x_init ,
. abstract = true ,
} , {
. name = TYPE_BCM283X_BASE ,
. parent = TYPE_DEVICE ,
. instance_size = sizeof ( BCM283XBaseState ) ,
. instance_init = bcm283x_base_init ,
. class_size = sizeof ( BCM283XBaseClass ) ,
. class_init = bcm283x_base_class_init ,
. abstract = true ,
}
} ;