@ -36,7 +36,7 @@ typedef struct TestData {
const GMACModule * module ;
} TestData ;
/* Values extracted from hw/arm/npcm7 xx.c */
/* Values extracted from hw/arm/npcm8 xx.c */
static const GMACModule gmac_module_list [ ] = {
{
. irq = 14 ,
@ -46,6 +46,14 @@ static const GMACModule gmac_module_list[] = {
. irq = 15 ,
. base_addr = 0xf0804000
} ,
{
. irq = 16 ,
. base_addr = 0xf0806000
} ,
{
. irq = 17 ,
. base_addr = 0xf0808000
}
} ;
/* Returns the index of the GMAC module. */
@ -174,18 +182,32 @@ static uint32_t gmac_read(QTestState *qts, const GMACModule *mod,
return qtest_readl ( qts , mod - > base_addr + regno ) ;
}
static uint16_t pcs_read ( QTestState * qts , const GMACModule * mod ,
NPCMRegister regno )
{
uint32_t write_value = ( regno & 0x3ffe00 ) > > 9 ;
qtest_writel ( qts , PCS_BASE_ADDRESS + NPCM_PCS_IND_AC_BA , write_value ) ;
uint32_t read_offset = regno & 0x1ff ;
return qtest_readl ( qts , PCS_BASE_ADDRESS + read_offset ) ;
}
/* Check that GMAC registers are reset to default value */
static void test_init ( gconstpointer test_data )
{
const TestData * td = test_data ;
const GMACModule * mod = td - > module ;
QTestState * qts = qtest_init ( " -machine npcm750-evb " ) ;
QTestState * qts = qtest_init ( " -machine npcm845 -evb " ) ;
# define CHECK_REG32(regno, value) \
do { \
g_assert_cmphex ( gmac_read ( qts , mod , ( regno ) ) , = = , ( value ) ) ; \
} while ( 0 )
# define CHECK_REG_PCS(regno, value) \
do { \
g_assert_cmphex ( pcs_read ( qts , mod , ( regno ) ) , = = , ( value ) ) ; \
} while ( 0 )
CHECK_REG32 ( NPCM_DMA_BUS_MODE , 0x00020100 ) ;
CHECK_REG32 ( NPCM_DMA_XMT_POLL_DEMAND , 0 ) ;
CHECK_REG32 ( NPCM_DMA_RCV_POLL_DEMAND , 0 ) ;
@ -235,6 +257,63 @@ static void test_init(gconstpointer test_data)
CHECK_REG32 ( NPCM_GMAC_PTP_TAR , 0 ) ;
CHECK_REG32 ( NPCM_GMAC_PTP_TTSR , 0 ) ;
if ( mod - > base_addr = = 0xf0802000 ) {
CHECK_REG_PCS ( NPCM_PCS_SR_CTL_ID1 , 0x699e ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_CTL_ID2 , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_CTL_STS , 0x8000 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_MII_CTRL , 0x1140 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_MII_STS , 0x0109 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_MII_DEV_ID1 , 0x699e ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_MII_DEV_ID2 , 0x0ced0 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_MII_AN_ADV , 0x0020 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_MII_LP_BABL , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_MII_AN_EXPN , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_MII_EXT_STS , 0xc000 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_TIM_SYNC_ABL , 0x0003 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_TIM_SYNC_TX_MAX_DLY_LWR , 0x0038 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_TIM_SYNC_TX_MAX_DLY_UPR , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_TIM_SYNC_TX_MIN_DLY_LWR , 0x0038 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_TIM_SYNC_TX_MIN_DLY_UPR , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_TIM_SYNC_RX_MAX_DLY_LWR , 0x0058 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_TIM_SYNC_RX_MAX_DLY_UPR , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_TIM_SYNC_RX_MIN_DLY_LWR , 0x0048 ) ;
CHECK_REG_PCS ( NPCM_PCS_SR_TIM_SYNC_RX_MIN_DLY_UPR , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MMD_DIG_CTRL1 , 0x2400 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_AN_CTRL , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_AN_INTR_STS , 0x000a ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_TC , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_DBG_CTRL , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_EEE_MCTRL0 , 0x899c ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_EEE_TXTIMER , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_EEE_RXTIMER , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_LINK_TIMER_CTRL , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_EEE_MCTRL1 , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_DIG_STS , 0x0010 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_ICG_ERRCNT1 , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MISC_STS , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_RX_LSTS , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_TX_BSTCTRL0 , 0x00a ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_TX_LVLCTRL0 , 0x007f ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_TX_GENCTRL0 , 0x0001 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_TX_GENCTRL1 , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_TX_STS , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_RX_GENCTRL0 , 0x0100 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_RX_GENCTRL1 , 0x1100 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_RX_LOS_CTRL0 , 0x000e ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_MPLL_CTRL0 , 0x0100 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_MPLL_CTRL1 , 0x0032 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_MPLL_STS , 0x0001 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_MISC_CTRL2 , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_LVL_CTRL , 0x0019 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_MISC_CTRL0 , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_MP_MISC_CTRL1 , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_DIG_CTRL2 , 0 ) ;
CHECK_REG_PCS ( NPCM_PCS_VR_MII_DIG_ERRCNT_SEL , 0 ) ;
}
qtest_quit ( qts ) ;
}
@ -242,7 +321,7 @@ static void gmac_add_test(const char *name, const TestData* td,
GTestDataFunc fn )
{
g_autofree char * full_name = g_strdup_printf (
" npcm7 xx_gmac/gmac[%d]/%s " , gmac_module_index ( td - > module ) , name ) ;
" npcm8 xx_gmac/gmac[%d]/%s " , gmac_module_index ( td - > module ) , name ) ;
qtest_add_data_func ( full_name , td , fn ) ;
}