@ -46,6 +46,7 @@
# include "hw/net/lan9118.h"
# include "net/net.h"
# include "hw/watchdog/cmsdk-apb-watchdog.h"
# include "hw/qdev-clock.h"
# include "qom/object.h"
typedef enum MPS2FPGAType {
@ -84,6 +85,7 @@ struct MPS2MachineState {
CMSDKAPBDualTimer dualtimer ;
CMSDKAPBWatchdog watchdog ;
CMSDKAPBTimer timer [ 2 ] ;
Clock * sysclk ;
} ;
# define TYPE_MPS2_MACHINE "mps2"
@ -140,6 +142,10 @@ static void mps2_common_init(MachineState *machine)
exit ( EXIT_FAILURE ) ;
}
/* This clock doesn't need migration because it is fixed-frequency */
mms - > sysclk = clock_new ( OBJECT ( machine ) , " SYSCLK " ) ;
clock_set_hz ( mms - > sysclk , SYSCLK_FRQ ) ;
/* The FPGA images have an odd combination of different RAMs,
* because in hardware they are different implementations and
* connected to different buses , giving varying performance / size
@ -341,6 +347,7 @@ static void mps2_common_init(MachineState *machine)
TYPE_CMSDK_APB_TIMER ) ;
sbd = SYS_BUS_DEVICE ( & mms - > timer [ i ] ) ;
qdev_prop_set_uint32 ( DEVICE ( & mms - > timer [ i ] ) , " pclk-frq " , SYSCLK_FRQ ) ;
qdev_connect_clock_in ( DEVICE ( & mms - > timer [ i ] ) , " pclk " , mms - > sysclk ) ;
sysbus_realize_and_unref ( sbd , & error_fatal ) ;
sysbus_mmio_map ( sbd , 0 , base ) ;
sysbus_connect_irq ( sbd , 0 , qdev_get_gpio_in ( armv7m , irqno ) ) ;
@ -349,6 +356,7 @@ static void mps2_common_init(MachineState *machine)
object_initialize_child ( OBJECT ( mms ) , " dualtimer " , & mms - > dualtimer ,
TYPE_CMSDK_APB_DUALTIMER ) ;
qdev_prop_set_uint32 ( DEVICE ( & mms - > dualtimer ) , " pclk-frq " , SYSCLK_FRQ ) ;
qdev_connect_clock_in ( DEVICE ( & mms - > dualtimer ) , " TIMCLK " , mms - > sysclk ) ;
sysbus_realize ( SYS_BUS_DEVICE ( & mms - > dualtimer ) , & error_fatal ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & mms - > dualtimer ) , 0 ,
qdev_get_gpio_in ( armv7m , 10 ) ) ;
@ -356,6 +364,7 @@ static void mps2_common_init(MachineState *machine)
object_initialize_child ( OBJECT ( mms ) , " watchdog " , & mms - > watchdog ,
TYPE_CMSDK_APB_WATCHDOG ) ;
qdev_prop_set_uint32 ( DEVICE ( & mms - > watchdog ) , " wdogclk-frq " , SYSCLK_FRQ ) ;
qdev_connect_clock_in ( DEVICE ( & mms - > watchdog ) , " WDOGCLK " , mms - > sysclk ) ;
sysbus_realize ( SYS_BUS_DEVICE ( & mms - > watchdog ) , & error_fatal ) ;
sysbus_connect_irq ( SYS_BUS_DEVICE ( & mms - > watchdog ) , 0 ,
qdev_get_gpio_in_named ( armv7m , " NMI " , 0 ) ) ;