@ -18,6 +18,10 @@
DECLARE_GLOBAL_DATA_PTR ;
DECLARE_GLOBAL_DATA_PTR ;
# ifndef CONFIG_SYS_FSL_NUM_CC_PLLS
# define CONFIG_SYS_FSL_NUM_CC_PLLS 6
# endif
/* --------------------------------------------------------------- */
/* --------------------------------------------------------------- */
void get_sys_info ( sys_info_t * sys_info )
void get_sys_info ( sys_info_t * sys_info )
@ -30,6 +34,9 @@ void get_sys_info(sys_info_t *sys_info)
# ifdef CONFIG_FSL_CORENET
# ifdef CONFIG_FSL_CORENET
volatile ccsr_clk_t * clk = ( void * ) ( CONFIG_SYS_FSL_CORENET_CLK_ADDR ) ;
volatile ccsr_clk_t * clk = ( void * ) ( CONFIG_SYS_FSL_CORENET_CLK_ADDR ) ;
unsigned int cpu ;
unsigned int cpu ;
# ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
int cc_group [ 12 ] = CONFIG_SYS_FSL_CLUSTER_CLOCKS ;
# endif
const u8 core_cplx_PLL [ 16 ] = {
const u8 core_cplx_PLL [ 16 ] = {
[ 0 ] = 0 , /* CC1 PPL / 1 */
[ 0 ] = 0 , /* CC1 PPL / 1 */
@ -60,8 +67,11 @@ void get_sys_info(sys_info_t *sys_info)
[ 13 ] = 2 , /* CC4 PPL / 2 */
[ 13 ] = 2 , /* CC4 PPL / 2 */
[ 14 ] = 4 , /* CC4 PPL / 4 */
[ 14 ] = 4 , /* CC4 PPL / 4 */
} ;
} ;
uint i , freq_cc_pll [ 6 ] , rcw_tmp ;
uint i , freq_c_pll [ CONFIG_SYS_FSL_NUM_CC_PLLS ] ;
uint ratio [ 6 ] ;
# if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV)
uint rcw_tmp ;
# endif
uint ratio [ CONFIG_SYS_FSL_NUM_CC_PLLS ] ;
unsigned long sysclk = CONFIG_SYS_CLK_FREQ ;
unsigned long sysclk = CONFIG_SYS_CLK_FREQ ;
uint mem_pll_rat ;
uint mem_pll_rat ;
@ -81,37 +91,36 @@ void get_sys_info(sys_info_t *sys_info)
else
else
sys_info - > freq_ddrbus = sys_info - > freq_systembus * mem_pll_rat ;
sys_info - > freq_ddrbus = sys_info - > freq_systembus * mem_pll_rat ;
ratio [ 0 ] = ( in_be32 ( & clk - > pllc1gsr ) > > 1 ) & 0x3f ;
for ( i = 0 ; i < CONFIG_SYS_FSL_NUM_CC_PLLS ; i + + ) {
ratio [ 1 ] = ( in_be32 ( & clk - > pllc2gsr ) > > 1 ) & 0x3f ;
ratio [ i ] = ( in_be32 ( & clk - > pllcgsr [ i ] . pllcngsr ) > > 1 ) & 0x3f ;
ratio [ 2 ] = ( in_be32 ( & clk - > pllc3gsr ) > > 1 ) & 0x3f ;
ratio [ 3 ] = ( in_be32 ( & clk - > pllc4gsr ) > > 1 ) & 0x3f ;
ratio [ 4 ] = ( in_be32 ( & clk - > pllc5gsr ) > > 1 ) & 0x3f ;
ratio [ 5 ] = ( in_be32 ( & clk - > pllc6gsr ) > > 1 ) & 0x3f ;
for ( i = 0 ; i < 6 ; i + + ) {
if ( ratio [ i ] > 4 )
if ( ratio [ i ] > 4 )
freq_cc _pll [ i ] = sysclk * ratio [ i ] ;
freq_c_pll [ i ] = sysclk * ratio [ i ] ;
else
else
freq_cc _pll [ i ] = sys_info - > freq_systembus * ratio [ i ] ;
freq_c_pll [ i ] = sys_info - > freq_systembus * ratio [ i ] ;
}
}
# ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
# ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
/*
/*
* As per CHASSIS2 architeture total 12 clusters are posible and
* Each cluster has up to 4 cores , sharing the same PLL selection .
* Each cluster has up to 4 cores , sharing the same PLL selection .
* The cluster assignment is fixed per SoC . PLL1 , PLL2 , PLL3 are
* The cluster clock assignment is SoC defined .
* cluster group A , feeding cores on cluster 1 and cluster 2.
*
* PLL4 , PLL5 , PLL6 are cluster group B , feeding cores on cluster 3
* Total 4 clock groups are possible with 3 PLLs each .
* and cluster 4 if existing .
* as per array indices , clock group A has 0 , 1 , 2 numbered PLLs &
* clock group B has 3 , 4 , 6 and so on .
*
* Clock group A having PLL1 , PLL2 , PLL3 , feeding cores of any cluster
* depends upon the SoC architeture . Same applies to other
* clock groups and clusters .
*
*/
*/
for_each_cpu ( i , cpu , cpu_numcores ( ) , cpu_mask ( ) ) {
for_each_cpu ( i , cpu , cpu_numcores ( ) , cpu_mask ( ) ) {
int cluster = fsl_qoriq_core_to_cluster ( cpu ) ;
int cluster = fsl_qoriq_core_to_cluster ( cpu ) ;
u32 c_pll_sel = ( in_be32 ( & clk - > clkcsr [ cluster ] . clkcncsr ) > > 27 )
u32 c_pll_sel = ( in_be32 ( & clk - > clkcsr [ cluster ] . clkcncsr ) > > 27 )
& 0xf ;
& 0xf ;
u32 cplx_pll = core_cplx_PLL [ c_pll_sel ] ;
u32 cplx_pll = core_cplx_PLL [ c_pll_sel ] ;
if ( cplx_pll > 3 )
cplx_pll + = cc_group [ cluster ] - 1 ;
printf ( " Unsupported architecture configuration "
" in function %s \n " , __func__ ) ;
cplx_pll + = ( cluster / 2 ) * 3 ;
sys_info - > freq_processor [ cpu ] =
sys_info - > freq_processor [ cpu ] =
freq_cc _pll [ cplx_pll ] / core_cplx_pll_div [ c_pll_sel ] ;
freq_c_pll [ cplx_pll ] / core_cplx_pll_div [ c_pll_sel ] ;
}
}
# ifdef CONFIG_PPC_B4860
# ifdef CONFIG_PPC_B4860
# define FM1_CLK_SEL 0xe0000000
# define FM1_CLK_SEL 0xe0000000
@ -122,27 +131,30 @@ void get_sys_info(sys_info_t *sys_info)
# define FM1_CLK_SEL 0x1c000000
# define FM1_CLK_SEL 0x1c000000
# define FM1_CLK_SHIFT 26
# define FM1_CLK_SHIFT 26
# endif
# endif
# if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV)
rcw_tmp = in_be32 ( & gur - > rcwsr [ 7 ] ) ;
rcw_tmp = in_be32 ( & gur - > rcwsr [ 7 ] ) ;
# endif
# ifdef CONFIG_SYS_DPAA_PME
# ifdef CONFIG_SYS_DPAA_PME
# ifndef CONFIG_PME_PLAT_CLK_DIV
switch ( ( rcw_tmp & PME_CLK_SEL ) > > PME_CLK_SHIFT ) {
switch ( ( rcw_tmp & PME_CLK_SEL ) > > PME_CLK_SHIFT ) {
case 1 :
case 1 :
sys_info - > freq_pme = freq_cc_pll [ 0 ] ;
sys_info - > freq_pme = freq_c_pll [ CONFIG_SYS_PME_CLK ] ;
break ;
break ;
case 2 :
case 2 :
sys_info - > freq_pme = freq_cc_pll [ 0 ] / 2 ;
sys_info - > freq_pme = freq_c_pll [ CONFIG_SYS_PME_CLK ] / 2 ;
break ;
break ;
case 3 :
case 3 :
sys_info - > freq_pme = freq_cc_pll [ 0 ] / 3 ;
sys_info - > freq_pme = freq_c_pll [ CONFIG_SYS_PME_CLK ] / 3 ;
break ;
break ;
case 4 :
case 4 :
sys_info - > freq_pme = freq_cc_pll [ 0 ] / 4 ;
sys_info - > freq_pme = freq_c_pll [ CONFIG_SYS_PME_CLK ] / 4 ;
break ;
break ;
case 6 :
case 6 :
sys_info - > freq_pme = freq_cc _pll [ 1 ] / 2 ;
sys_info - > freq_pme = freq_c_pll [ CONFIG_SYS_PME_CLK + 1 ] / 2 ;
break ;
break ;
case 7 :
case 7 :
sys_info - > freq_pme = freq_cc _pll [ 1 ] / 3 ;
sys_info - > freq_pme = freq_c_pll [ CONFIG_SYS_PME_CLK + 1 ] / 3 ;
break ;
break ;
default :
default :
printf ( " Error: Unknown PME clock select! \n " ) ;
printf ( " Error: Unknown PME clock select! \n " ) ;
@ -151,6 +163,10 @@ void get_sys_info(sys_info_t *sys_info)
break ;
break ;
}
}
# else
sys_info - > freq_pme = sys_info - > freq_systembus / CONFIG_SYS_PME_CLK ;
# endif
# endif
# endif
# ifdef CONFIG_SYS_DPAA_QBMAN
# ifdef CONFIG_SYS_DPAA_QBMAN
@ -158,27 +174,28 @@ void get_sys_info(sys_info_t *sys_info)
# endif
# endif
# ifdef CONFIG_SYS_DPAA_FMAN
# ifdef CONFIG_SYS_DPAA_FMAN
# ifndef CONFIG_FM_PLAT_CLK_DIV
switch ( ( rcw_tmp & FM1_CLK_SEL ) > > FM1_CLK_SHIFT ) {
switch ( ( rcw_tmp & FM1_CLK_SEL ) > > FM1_CLK_SHIFT ) {
case 1 :
case 1 :
sys_info - > freq_fman [ 0 ] = freq_cc_pll [ 3 ] ;
sys_info - > freq_fman [ 0 ] = freq_c_pll [ CONFIG_SYS_FM1_CLK ] ;
break ;
break ;
case 2 :
case 2 :
sys_info - > freq_fman [ 0 ] = freq_cc_pll [ 3 ] / 2 ;
sys_info - > freq_fman [ 0 ] = freq_c_pll [ CONFIG_SYS_FM1_CLK ] / 2 ;
break ;
break ;
case 3 :
case 3 :
sys_info - > freq_fman [ 0 ] = freq_cc_pll [ 3 ] / 3 ;
sys_info - > freq_fman [ 0 ] = freq_c_pll [ CONFIG_SYS_FM1_CLK ] / 3 ;
break ;
break ;
case 4 :
case 4 :
sys_info - > freq_fman [ 0 ] = freq_cc_pll [ 3 ] / 4 ;
sys_info - > freq_fman [ 0 ] = freq_c_pll [ CONFIG_SYS_FM1_CLK ] / 4 ;
break ;
break ;
case 5 :
case 5 :
sys_info - > freq_fman [ 0 ] = sys_info - > freq_systembus ;
sys_info - > freq_fman [ 0 ] = sys_info - > freq_systembus ;
break ;
break ;
case 6 :
case 6 :
sys_info - > freq_fman [ 0 ] = freq_cc_pll [ 4 ] / 2 ;
sys_info - > freq_fman [ 0 ] = freq_c_pll [ CONFIG_SYS_FM1_CLK + 1 ] / 2 ;
break ;
break ;
case 7 :
case 7 :
sys_info - > freq_fman [ 0 ] = freq_cc_pll [ 4 ] / 3 ;
sys_info - > freq_fman [ 0 ] = freq_c_pll [ CONFIG_SYS_FM1_CLK + 1 ] / 3 ;
break ;
break ;
default :
default :
printf ( " Error: Unknown FMan1 clock select! \n " ) ;
printf ( " Error: Unknown FMan1 clock select! \n " ) ;
@ -187,27 +204,28 @@ void get_sys_info(sys_info_t *sys_info)
break ;
break ;
}
}
# if (CONFIG_SYS_NUM_FMAN) == 2
# if (CONFIG_SYS_NUM_FMAN) == 2
# ifdef CONFIG_SYS_FM2_CLK
# define FM2_CLK_SEL 0x00000038
# define FM2_CLK_SEL 0x00000038
# define FM2_CLK_SHIFT 3
# define FM2_CLK_SHIFT 3
rcw_tmp = in_be32 ( & gur - > rcwsr [ 15 ] ) ;
rcw_tmp = in_be32 ( & gur - > rcwsr [ 15 ] ) ;
switch ( ( rcw_tmp & FM2_CLK_SEL ) > > FM2_CLK_SHIFT ) {
switch ( ( rcw_tmp & FM2_CLK_SEL ) > > FM2_CLK_SHIFT ) {
case 1 :
case 1 :
sys_info - > freq_fman [ 1 ] = freq_cc_pll [ 4 ] ;
sys_info - > freq_fman [ 1 ] = freq_c_pll [ CONFIG_SYS_FM2_CLK + 1 ] ;
break ;
break ;
case 2 :
case 2 :
sys_info - > freq_fman [ 1 ] = freq_cc_pll [ 4 ] / 2 ;
sys_info - > freq_fman [ 1 ] = freq_c_pll [ CONFIG_SYS_FM2_CLK + 1 ] / 2 ;
break ;
break ;
case 3 :
case 3 :
sys_info - > freq_fman [ 1 ] = freq_cc_pll [ 4 ] / 3 ;
sys_info - > freq_fman [ 1 ] = freq_c_pll [ CONFIG_SYS_FM2_CLK + 1 ] / 3 ;
break ;
break ;
case 4 :
case 4 :
sys_info - > freq_fman [ 1 ] = freq_cc_pll [ 4 ] / 4 ;
sys_info - > freq_fman [ 1 ] = freq_c_pll [ CONFIG_SYS_FM2_CLK + 1 ] / 4 ;
break ;
break ;
case 6 :
case 6 :
sys_info - > freq_fman [ 1 ] = freq_cc_pll [ 3 ] / 2 ;
sys_info - > freq_fman [ 1 ] = freq_c_pll [ CONFIG_SYS_FM2_CLK ] / 2 ;
break ;
break ;
case 7 :
case 7 :
sys_info - > freq_fman [ 1 ] = freq_cc_pll [ 3 ] / 3 ;
sys_info - > freq_fman [ 1 ] = freq_c_pll [ CONFIG_SYS_FM2_CLK ] / 3 ;
break ;
break ;
default :
default :
printf ( " Error: Unknown FMan2 clock select! \n " ) ;
printf ( " Error: Unknown FMan2 clock select! \n " ) ;
@ -215,8 +233,12 @@ void get_sys_info(sys_info_t *sys_info)
sys_info - > freq_fman [ 1 ] = sys_info - > freq_systembus / 2 ;
sys_info - > freq_fman [ 1 ] = sys_info - > freq_systembus / 2 ;
break ;
break ;
}
}
# endif
# endif /* CONFIG_SYS_NUM_FMAN == 2 */
# endif /* CONFIG_SYS_NUM_FMAN == 2 */
# endif /* CONFIG_SYS_DPAA_FMAN */
# else
sys_info - > freq_fman [ 0 ] = sys_info - > freq_systembus / CONFIG_SYS_FM1_CLK ;
# endif
# endif
# else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
# else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
@ -226,7 +248,7 @@ void get_sys_info(sys_info_t *sys_info)
u32 cplx_pll = core_cplx_PLL [ c_pll_sel ] ;
u32 cplx_pll = core_cplx_PLL [ c_pll_sel ] ;
sys_info - > freq_processor [ cpu ] =
sys_info - > freq_processor [ cpu ] =
freq_cc _pll [ cplx_pll ] / core_cplx_pll_div [ c_pll_sel ] ;
freq_c_pll [ cplx_pll ] / core_cplx_pll_div [ c_pll_sel ] ;
}
}
# define PME_CLK_SEL 0x80000000
# define PME_CLK_SEL 0x80000000
# define FM1_CLK_SEL 0x40000000
# define FM1_CLK_SEL 0x40000000
@ -246,9 +268,9 @@ void get_sys_info(sys_info_t *sys_info)
# ifdef CONFIG_SYS_DPAA_PME
# ifdef CONFIG_SYS_DPAA_PME
if ( rcw_tmp & PME_CLK_SEL ) {
if ( rcw_tmp & PME_CLK_SEL ) {
if ( rcw_tmp & HWA_ASYNC_DIV )
if ( rcw_tmp & HWA_ASYNC_DIV )
sys_info - > freq_pme = freq_cc _pll [ HWA_CC_PLL ] / 4 ;
sys_info - > freq_pme = freq_c_pll [ HWA_CC_PLL ] / 4 ;
else
else
sys_info - > freq_pme = freq_cc _pll [ HWA_CC_PLL ] / 2 ;
sys_info - > freq_pme = freq_c_pll [ HWA_CC_PLL ] / 2 ;
} else {
} else {
sys_info - > freq_pme = sys_info - > freq_systembus / 2 ;
sys_info - > freq_pme = sys_info - > freq_systembus / 2 ;
}
}
@ -257,18 +279,18 @@ void get_sys_info(sys_info_t *sys_info)
# ifdef CONFIG_SYS_DPAA_FMAN
# ifdef CONFIG_SYS_DPAA_FMAN
if ( rcw_tmp & FM1_CLK_SEL ) {
if ( rcw_tmp & FM1_CLK_SEL ) {
if ( rcw_tmp & HWA_ASYNC_DIV )
if ( rcw_tmp & HWA_ASYNC_DIV )
sys_info - > freq_fman [ 0 ] = freq_cc _pll [ HWA_CC_PLL ] / 4 ;
sys_info - > freq_fman [ 0 ] = freq_c_pll [ HWA_CC_PLL ] / 4 ;
else
else
sys_info - > freq_fman [ 0 ] = freq_cc _pll [ HWA_CC_PLL ] / 2 ;
sys_info - > freq_fman [ 0 ] = freq_c_pll [ HWA_CC_PLL ] / 2 ;
} else {
} else {
sys_info - > freq_fman [ 0 ] = sys_info - > freq_systembus / 2 ;
sys_info - > freq_fman [ 0 ] = sys_info - > freq_systembus / 2 ;
}
}
# if (CONFIG_SYS_NUM_FMAN) == 2
# if (CONFIG_SYS_NUM_FMAN) == 2
if ( rcw_tmp & FM2_CLK_SEL ) {
if ( rcw_tmp & FM2_CLK_SEL ) {
if ( rcw_tmp & HWA_ASYNC_DIV )
if ( rcw_tmp & HWA_ASYNC_DIV )
sys_info - > freq_fman [ 1 ] = freq_cc _pll [ HWA_CC_PLL ] / 4 ;
sys_info - > freq_fman [ 1 ] = freq_c_pll [ HWA_CC_PLL ] / 4 ;
else
else
sys_info - > freq_fman [ 1 ] = freq_cc _pll [ HWA_CC_PLL ] / 2 ;
sys_info - > freq_fman [ 1 ] = freq_c_pll [ HWA_CC_PLL ] / 2 ;
} else {
} else {
sys_info - > freq_fman [ 1 ] = sys_info - > freq_systembus / 2 ;
sys_info - > freq_fman [ 1 ] = sys_info - > freq_systembus / 2 ;
}
}