@ -115,35 +115,11 @@ static const int aspeed_soc_ast2400_irqmap[] = {
# define aspeed_soc_ast2500_irqmap aspeed_soc_ast2400_irqmap
static const AspeedSoCInfo aspeed_socs [ ] = {
{
. name = " ast2400-a1 " ,
. cpu_type = ARM_CPU_TYPE_NAME ( " arm926 " ) ,
. silicon_rev = AST2400_A1_SILICON_REV ,
. sram_size = 0x8000 ,
. spis_num = 1 ,
. wdts_num = 2 ,
. irqmap = aspeed_soc_ast2400_irqmap ,
. memmap = aspeed_soc_ast2400_memmap ,
. num_cpus = 1 ,
} , {
. name = " ast2500-a1 " ,
. cpu_type = ARM_CPU_TYPE_NAME ( " arm1176 " ) ,
. silicon_rev = AST2500_A1_SILICON_REV ,
. sram_size = 0x9000 ,
. spis_num = 2 ,
. wdts_num = 3 ,
. irqmap = aspeed_soc_ast2500_irqmap ,
. memmap = aspeed_soc_ast2500_memmap ,
. num_cpus = 1 ,
} ,
} ;
static qemu_irq aspeed_soc_get_irq ( AspeedSoCState * s , int ctrl )
{
AspeedSoCClass * sc = ASPEED_SOC_GET_CLASS ( s ) ;
return qdev_get_gpio_in ( DEVICE ( & s - > vic ) , sc - > info - > i rqmap [ ctrl ] ) ;
return qdev_get_gpio_in ( DEVICE ( & s - > vic ) , sc - > irqmap [ ctrl ] ) ;
}
static void aspeed_soc_init ( Object * obj )
@ -154,13 +130,13 @@ static void aspeed_soc_init(Object *obj)
char socname [ 8 ] ;
char typename [ 64 ] ;
if ( sscanf ( sc - > info - > name , " %7s " , socname ) ! = 1 ) {
if ( sscanf ( sc - > name , " %7s " , socname ) ! = 1 ) {
g_assert_not_reached ( ) ;
}
for ( i = 0 ; i < sc - > info - > num_cpus ; i + + ) {
for ( i = 0 ; i < sc - > num_cpus ; i + + ) {
object_initialize_child ( obj , " cpu[*] " , OBJECT ( & s - > cpu [ i ] ) ,
sizeof ( s - > cpu [ i ] ) , sc - > info - > cpu_type ,
sizeof ( s - > cpu [ i ] ) , sc - > cpu_type ,
& error_abort , NULL ) ;
}
@ -168,7 +144,7 @@ static void aspeed_soc_init(Object *obj)
sysbus_init_child_obj ( obj , " scu " , OBJECT ( & s - > scu ) , sizeof ( s - > scu ) ,
typename ) ;
qdev_prop_set_uint32 ( DEVICE ( & s - > scu ) , " silicon-rev " ,
sc - > info - > silicon_rev ) ;
sc - > silicon_rev ) ;
object_property_add_alias ( obj , " hw-strap1 " , OBJECT ( & s - > scu ) ,
" hw-strap1 " , & error_abort ) ;
object_property_add_alias ( obj , " hw-strap2 " , OBJECT ( & s - > scu ) ,
@ -200,7 +176,7 @@ static void aspeed_soc_init(Object *obj)
object_property_add_alias ( obj , " dram " , OBJECT ( & s - > fmc ) , " dram " ,
& error_abort ) ;
for ( i = 0 ; i < sc - > info - > spis_num ; i + + ) {
for ( i = 0 ; i < sc - > spis_num ; i + + ) {
snprintf ( typename , sizeof ( typename ) , " aspeed.spi%d-%s " , i + 1 , socname ) ;
sysbus_init_child_obj ( obj , " spi[*] " , OBJECT ( & s - > spi [ i ] ) ,
sizeof ( s - > spi [ i ] ) , typename ) ;
@ -214,7 +190,7 @@ static void aspeed_soc_init(Object *obj)
object_property_add_alias ( obj , " max-ram-size " , OBJECT ( & s - > sdmc ) ,
" max-ram-size " , & error_abort ) ;
for ( i = 0 ; i < sc - > info - > wdts_num ; i + + ) {
for ( i = 0 ; i < sc - > wdts_num ; i + + ) {
snprintf ( typename , sizeof ( typename ) , " aspeed.wdt-%s " , socname ) ;
sysbus_init_child_obj ( obj , " wdt[*] " , OBJECT ( & s - > wdt [ i ] ) ,
sizeof ( s - > wdt [ i ] ) , typename ) ;
@ -252,13 +228,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
Error * err = NULL , * local_err = NULL ;
/* IO space */
create_unimplemented_device ( " aspeed_soc.io " , sc - > info - > memmap [ ASPEED_IOMEM ] ,
create_unimplemented_device ( " aspeed_soc.io " , sc - > memmap [ ASPEED_IOMEM ] ,
ASPEED_SOC_IOMEM_SIZE ) ;
if ( s - > num_cpus > sc - > info - > num_cpus ) {
if ( s - > num_cpus > sc - > num_cpus ) {
warn_report ( " %s: invalid number of CPUs %d, using default %d " ,
sc - > info - > name , s - > num_cpus , sc - > info - > num_cpus ) ;
s - > num_cpus = sc - > info - > num_cpus ;
sc - > name , s - > num_cpus , sc - > num_cpus ) ;
s - > num_cpus = sc - > num_cpus ;
}
/* CPU */
@ -272,13 +248,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
/* SRAM */
memory_region_init_ram ( & s - > sram , OBJECT ( dev ) , " aspeed.sram " ,
sc - > info - > sram_size , & err ) ;
sc - > sram_size , & err ) ;
if ( err ) {
error_propagate ( errp , err ) ;
return ;
}
memory_region_add_subregion ( get_system_memory ( ) ,
sc - > info - > memmap [ ASPEED_SRAM ] , & s - > sram ) ;
sc - > memmap [ ASPEED_SRAM ] , & s - > sram ) ;
/* SCU */
object_property_set_bool ( OBJECT ( & s - > scu ) , true , " realized " , & err ) ;
@ -286,7 +262,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate ( errp , err ) ;
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > scu ) , 0 , sc - > info - > memmap [ ASPEED_SCU ] ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > scu ) , 0 , sc - > memmap [ ASPEED_SCU ] ) ;
/* VIC */
object_property_set_bool ( OBJECT ( & s - > vic ) , true , " realized " , & err ) ;
@ -294,7 +270,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate ( errp , err ) ;
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > vic ) , 0 , sc - > info - > memmap [ ASPEED_VIC ] ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > vic ) , 0 , sc - > memmap [ ASPEED_VIC ] ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > vic ) , 0 ,
qdev_get_gpio_in ( DEVICE ( & s - > cpu ) , ARM_CPU_IRQ ) ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > vic ) , 1 ,
@ -306,7 +282,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate ( errp , err ) ;
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > rtc ) , 0 , sc - > info - > memmap [ ASPEED_RTC ] ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > rtc ) , 0 , sc - > memmap [ ASPEED_RTC ] ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > rtc ) , 0 ,
aspeed_soc_get_irq ( s , ASPEED_RTC ) ) ;
@ -317,7 +293,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > timerctrl ) , 0 ,
sc - > info - > memmap [ ASPEED_TIMER1 ] ) ;
sc - > memmap [ ASPEED_TIMER1 ] ) ;
for ( i = 0 ; i < ASPEED_TIMER_NR_TIMERS ; i + + ) {
qemu_irq irq = aspeed_soc_get_irq ( s , ASPEED_TIMER1 + i ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > timerctrl ) , i , irq ) ;
@ -326,7 +302,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
/* UART - attach an 8250 to the IO space as our UART5 */
if ( serial_hd ( 0 ) ) {
qemu_irq uart5 = aspeed_soc_get_irq ( s , ASPEED_UART5 ) ;
serial_mm_init ( get_system_memory ( ) , sc - > info - > memmap [ ASPEED_UART5 ] , 2 ,
serial_mm_init ( get_system_memory ( ) , sc - > memmap [ ASPEED_UART5 ] , 2 ,
uart5 , 38400 , serial_hd ( 0 ) , DEVICE_LITTLE_ENDIAN ) ;
}
@ -336,12 +312,12 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate ( errp , err ) ;
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > i2c ) , 0 , sc - > info - > memmap [ ASPEED_I2C ] ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > i2c ) , 0 , sc - > memmap [ ASPEED_I2C ] ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > i2c ) , 0 ,
aspeed_soc_get_irq ( s , ASPEED_I2C ) ) ;
/* FMC, The number of CS is set at the board level */
object_property_set_int ( OBJECT ( & s - > fmc ) , sc - > info - > memmap [ ASPEED_SDRAM ] ,
object_property_set_int ( OBJECT ( & s - > fmc ) , sc - > memmap [ ASPEED_SDRAM ] ,
" sdram-base " , & err ) ;
if ( err ) {
error_propagate ( errp , err ) ;
@ -352,14 +328,14 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate ( errp , err ) ;
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > fmc ) , 0 , sc - > info - > memmap [ ASPEED_FMC ] ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > fmc ) , 0 , sc - > memmap [ ASPEED_FMC ] ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > fmc ) , 1 ,
s - > fmc . ctrl - > flash_window_base ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > fmc ) , 0 ,
aspeed_soc_get_irq ( s , ASPEED_FMC ) ) ;
/* SPI */
for ( i = 0 ; i < sc - > info - > spis_num ; i + + ) {
for ( i = 0 ; i < sc - > spis_num ; i + + ) {
object_property_set_int ( OBJECT ( & s - > spi [ i ] ) , 1 , " num-cs " , & err ) ;
object_property_set_bool ( OBJECT ( & s - > spi [ i ] ) , true , " realized " ,
& local_err ) ;
@ -369,7 +345,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > spi [ i ] ) , 0 ,
sc - > info - > memmap [ ASPEED_SPI1 + i ] ) ;
sc - > memmap [ ASPEED_SPI1 + i ] ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > spi [ i ] ) , 1 ,
s - > spi [ i ] . ctrl - > flash_window_base ) ;
}
@ -380,10 +356,10 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate ( errp , err ) ;
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > sdmc ) , 0 , sc - > info - > memmap [ ASPEED_SDMC ] ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > sdmc ) , 0 , sc - > memmap [ ASPEED_SDMC ] ) ;
/* Watch dog */
for ( i = 0 ; i < sc - > info - > wdts_num ; i + + ) {
for ( i = 0 ; i < sc - > wdts_num ; i + + ) {
AspeedWDTClass * awc = ASPEED_WDT_GET_CLASS ( & s - > wdt [ i ] ) ;
object_property_set_bool ( OBJECT ( & s - > wdt [ i ] ) , true , " realized " , & err ) ;
@ -392,7 +368,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > wdt [ i ] ) , 0 ,
sc - > info - > memmap [ ASPEED_WDT ] + i * awc - > offset ) ;
sc - > memmap [ ASPEED_WDT ] + i * awc - > offset ) ;
}
/* Net */
@ -408,7 +384,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > ftgmac100 [ i ] ) , 0 ,
sc - > info - > memmap [ ASPEED_ETH1 + i ] ) ;
sc - > memmap [ ASPEED_ETH1 + i ] ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > ftgmac100 [ i ] ) , 0 ,
aspeed_soc_get_irq ( s , ASPEED_ETH1 + i ) ) ;
}
@ -420,7 +396,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > xdma ) , 0 ,
sc - > info - > memmap [ ASPEED_XDMA ] ) ;
sc - > memmap [ ASPEED_XDMA ] ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > xdma ) , 0 ,
aspeed_soc_get_irq ( s , ASPEED_XDMA ) ) ;
@ -430,7 +406,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate ( errp , err ) ;
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > gpio ) , 0 , sc - > info - > memmap [ ASPEED_GPIO ] ) ;
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > gpio ) , 0 , sc - > memmap [ ASPEED_GPIO ] ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > gpio ) , 0 ,
aspeed_soc_get_irq ( s , ASPEED_GPIO ) ) ;
@ -441,7 +417,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return ;
}
sysbus_mmio_map ( SYS_BUS_DEVICE ( & s - > sdhci ) , 0 ,
sc - > info - > memmap [ ASPEED_SDHCI ] ) ;
sc - > memmap [ ASPEED_SDHCI ] ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & s - > sdhci ) , 0 ,
aspeed_soc_get_irq ( s , ASPEED_SDHCI ) ) ;
}
@ -453,9 +429,7 @@ static Property aspeed_soc_properties[] = {
static void aspeed_soc_class_init ( ObjectClass * oc , void * data )
{
DeviceClass * dc = DEVICE_CLASS ( oc ) ;
AspeedSoCClass * sc = ASPEED_SOC_CLASS ( oc ) ;
sc - > info = ( AspeedSoCInfo * ) data ;
dc - > realize = aspeed_soc_realize ;
/* Reason: Uses serial_hds and nd_table in realize() directly */
dc - > user_creatable = false ;
@ -465,26 +439,62 @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data)
static const TypeInfo aspeed_soc_type_info = {
. name = TYPE_ASPEED_SOC ,
. parent = TYPE_DEVICE ,
. instance_init = aspeed_soc_init ,
. instance_size = sizeof ( AspeedSoCState ) ,
. class_size = sizeof ( AspeedSoCClass ) ,
. class_init = aspeed_soc_class_init ,
. abstract = true ,
} ;
static void aspeed_soc_register_types ( void )
static void aspeed_soc_ast2400_class_init ( ObjectClass * oc , void * data )
{
int i ;
AspeedSoCClass * sc = ASPEED_SOC_CLASS ( oc ) ;
type_register_static ( & aspeed_soc_type_info ) ;
for ( i = 0 ; i < ARRAY_SIZE ( aspeed_socs ) ; + + i ) {
TypeInfo ti = {
. name = aspeed_socs [ i ] . name ,
. parent = TYPE_ASPEED_SOC ,
. class_init = aspeed_soc_class_init ,
. class_data = ( void * ) & aspeed_socs [ i ] ,
} ;
type_register ( & ti ) ;
}
sc - > name = " ast2400-a1 " ;
sc - > cpu_type = ARM_CPU_TYPE_NAME ( " arm926 " ) ;
sc - > silicon_rev = AST2400_A1_SILICON_REV ;
sc - > sram_size = 0x8000 ;
sc - > spis_num = 1 ;
sc - > wdts_num = 2 ;
sc - > irqmap = aspeed_soc_ast2400_irqmap ;
sc - > memmap = aspeed_soc_ast2400_memmap ;
sc - > num_cpus = 1 ;
}
static const TypeInfo aspeed_soc_ast2400_type_info = {
. name = " ast2400-a1 " ,
. parent = TYPE_ASPEED_SOC ,
. instance_init = aspeed_soc_init ,
. instance_size = sizeof ( AspeedSoCState ) ,
. class_init = aspeed_soc_ast2400_class_init ,
} ;
static void aspeed_soc_ast2500_class_init ( ObjectClass * oc , void * data )
{
AspeedSoCClass * sc = ASPEED_SOC_CLASS ( oc ) ;
sc - > name = " ast2500-a1 " ;
sc - > cpu_type = ARM_CPU_TYPE_NAME ( " arm1176 " ) ;
sc - > silicon_rev = AST2500_A1_SILICON_REV ;
sc - > sram_size = 0x9000 ;
sc - > spis_num = 2 ;
sc - > wdts_num = 3 ;
sc - > irqmap = aspeed_soc_ast2500_irqmap ;
sc - > memmap = aspeed_soc_ast2500_memmap ;
sc - > num_cpus = 1 ;
}
static const TypeInfo aspeed_soc_ast2500_type_info = {
. name = " ast2500-a1 " ,
. parent = TYPE_ASPEED_SOC ,
. instance_init = aspeed_soc_init ,
. instance_size = sizeof ( AspeedSoCState ) ,
. class_init = aspeed_soc_ast2500_class_init ,
} ;
static void aspeed_soc_register_types ( void )
{
type_register_static ( & aspeed_soc_type_info ) ;
type_register_static ( & aspeed_soc_ast2400_type_info ) ;
type_register_static ( & aspeed_soc_ast2500_type_info ) ;
} ;
type_init ( aspeed_soc_register_types )