> -----Original Message----- > From: Zhiqiang Hou [mailto:zhiqiang....@nxp.com] > Sent: Tuesday, December 27, 2016 1:06 PM > To: u-boot@lists.denx.de; albert.u.b...@aribaud.net; york sun > <york....@nxp.com>; Mingkai Hu <mingkai...@nxp.com>; Prabhakar > Kushwaha <prabhakar.kushw...@nxp.com>; Calvin Johnson > <calvin.john...@nxp.com> > Cc: Z.Q. Hou <zhiqiang....@nxp.com> > Subject: [PATCHv3 1/2] armv8/fsl-lsch2: refactor the clock system > initialization > > From: Hou Zhiqiang <zhiqiang....@nxp.com> > > Up to now, there are 3 kind of SoCs under Layerscape Chassis 2, > like LS1043A, LS1046A and LS1012A. But the clocks tree has a > lot of differences, for instance, the IP modules have different > dividers to derive its clock from Platform PLL. And the core > cluster PLL and platform PLL maybe have different reference > clocks, such as LS1012A. Another problem is which clock/PLL > should be described by sys_info->freq_systembus, it is confused > in Layerscape Chissis 2. > > This patch is to bind the sys_info->freq_systembus to the Platform > PLL, and handle the different divider of IP modules separately > between different SoCs, and separate reference clocks of core > cluster PLL and platform PLL. > > Signed-off-by: Hou Zhiqiang <zhiqiang....@nxp.com> > --- > V3: > - Generate the patch set base on the latest git://git.denx.de/u-boot-fsl- > qoriq.git. > - Use the Kconfig instead of header file to add CONFIG_* > > arch/arm/cpu/armv8/fsl-layerscape/Kconfig | 76 > ++++++++++++++++++++++ > arch/arm/cpu/armv8/fsl-layerscape/cpu.c | 3 +- > .../arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c | 68 ++++++++++++++----- > .../include/asm/arch-fsl-layerscape/immap_lsch2.h | 1 + > include/configs/ls1012a_common.h | 6 +- > include/configs/ls1043a_common.h | 3 +- > include/configs/ls1046a_common.h | 3 +- > include/configs/ls2080aqds.h | 2 - > include/configs/ls2080ardb.h | 1 - > 9 files changed, 134 insertions(+), 29 deletions(-) > > diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Kconfig > b/arch/arm/cpu/armv8/fsl-layerscape/Kconfig > index cc0dc88..de1e5a4 100644 > --- a/arch/arm/cpu/armv8/fsl-layerscape/Kconfig > +++ b/arch/arm/cpu/armv8/fsl-layerscape/Kconfig > @@ -87,6 +87,82 @@ config MAX_CPUS > cores, count the reserved ports. This will allocate enough memory > in spin table to properly handle all cores. > > +menu "Layerscape clock tree configuration" > + depends on FSL_LSCH2 || FSL_LSCH3 > + > +config SYS_FSL_CLK > + bool "Enable clock tree initialization" > + default y > + > +config CLUSTER_CLK_FREQ > + int "Reference clock of core cluster" > + depends on ARCH_LS1012A > + default 100000000 > + help > + This number is the reference clock frequency of core PLL. > + For most platforms, the core PLL and Platform PLL have the same > + reference clock, but for some platforms, LS1012A for instance, > + they are provided sepatately. > + > +config SYS_FSL_PCLK_DIV > + int "Platform clock divider" > + default 1 if ARCH_LS1043A > + default 1 if ARCH_LS1046A > + default 2
Only LS2080A and LS2088A requires Platform_PLL_freq / 2. So make 1 as default and exception for LS2080A and LS2088A > + help > + This is the divider that is used to derive Platform clock from > + Platform PLL, in another word: > + Platform_clk = Platform_PLL_freq / this_divider > + <snips> > +#endif > + cluster_clk = CONFIG_CLUSTER_CLK_FREQ; > + > #ifdef CONFIG_DDR_CLK_FREQ > sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ; > #else > sys_info->freq_ddrbus = sysclk; > #endif > > -#ifdef CONFIG_ARCH_LS1012A > - sys_info->freq_ddrbus *= (gur_in32(&gur->rcwsr[0]) >> > - FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT) & > - FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK; > -#else > + /* The freq_systembus is used to record frequency of platform PLL */ > sys_info->freq_systembus *= (gur_in32(&gur->rcwsr[0]) >> > FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT) & > FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK; > + > +#ifdef CONFIG_ARCH_LS1012A > + sys_info->freq_ddrbus = 2 * sys_info->freq_systembus; > +#else > sys_info->freq_ddrbus *= (gur_in32(&gur->rcwsr[0]) >> > FSL_CHASSIS2_RCWSR0_MEM_PLL_RAT_SHIFT) & > FSL_CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK; > @@ -76,7 +82,7 @@ void get_sys_info(struct sys_info *sys_info) > for (i = 0; i < CONFIG_SYS_FSL_NUM_CC_PLLS; i++) { > ratio[i] = (in_be32(&clk->pllcgsr[i].pllcngsr) >> 1) & 0xff; > if (ratio[i] > 4) > - freq_c_pll[i] = sysclk * ratio[i]; > + freq_c_pll[i] = cluster_clk * ratio[i]; > else > freq_c_pll[i] = sys_info->freq_systembus * ratio[i]; > } > @@ -91,11 +97,6 @@ void get_sys_info(struct sys_info *sys_info) > freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel]; > } > Above new logic of calculating sys_clk ddr_clk for LS1012A. It is not matching with previous logic. Let me try to explain for LS1012A #define CONFIG_SYS_CLK_FREQ 100000000 #define CONFIG_DDR_CLK_FREQ 125000000 Previous logic sys_info->freq_ddrbus = 125MHz sys_info->freq_ddrbus = 125 * 4 = 500 MHz here 4 is PLL ratio i.e. 4:1 sys_info->freq_systembus = sys_info->freq_ddrbus/2 = 250MHz sys_info->freq_ddrbus *2 = 1000MT/s New Logic sys_info->freq_systembus = 100MHz sys_info->freq_systembus = 100 * 4 = 400MHz here 4 is PLL ratio sys_info->freq_ddrbus = 2 * sys_info->freq_systembus ==> 800MHz --prabhakar _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot