On 03/20/2015 10:34 AM, Mark Rutland wrote: > Hi, > > On Thu, Mar 19, 2015 at 08:34:22PM +0000, York Sun wrote: >> The timer clock is system clock divided by 4, not fixed 12MHz. This is >> common to the SoC, not board specific. >> >> Signed-off-by: York Sun <[email protected]> >> >> --- >> >> Changes in v2: >> Fix CNTFRQ for secondary cores when COUNTER_FREQUENCY_REAL is defined. >> >> README | 8 ++++++++ >> arch/arm/cpu/armv8/fsl-lsch3/cpu.c | 26 ++++++++++++++++++++++++++ >> arch/arm/cpu/armv8/fsl-lsch3/lowlevel.S | 6 ++++++ >> arch/arm/cpu/armv8/fsl-lsch3/mp.h | 1 + >> board/freescale/ls2085a/ls2085a.c | 18 ------------------ >> include/configs/ls2085a_common.h | 6 +++++- >> 6 files changed, 46 insertions(+), 19 deletions(-) >> >> diff --git a/README b/README >> index f473515..776ebf4 100644 >> --- a/README >> +++ b/README >> @@ -690,6 +690,14 @@ The following options need to be configured: >> exists, unlike the similar options in the Linux kernel. Do not >> set these options unless they apply! >> >> + COUNTER_FREQUENCY >> + Generic timer clock source frequency. >> + >> + COUNTER_FREQUENCY_REAL >> + Generic timer clock source frequency if the real clock is >> + different from COUNTER_FREQUENCY, and can only be determined >> + at run time. >> + >> NOTE: The following can be machine specific errata. These >> do have ability to provide rudimentary version and machine >> specific checks, but expect no product checks. >> diff --git a/arch/arm/cpu/armv8/fsl-lsch3/cpu.c >> b/arch/arm/cpu/armv8/fsl-lsch3/cpu.c >> index 94fd147..f75b21d 100644 >> --- a/arch/arm/cpu/armv8/fsl-lsch3/cpu.c >> +++ b/arch/arm/cpu/armv8/fsl-lsch3/cpu.c >> @@ -395,3 +395,29 @@ int arch_early_init_r(void) >> >> return 0; >> } >> + >> +int timer_init(void) >> +{ >> + u32 __iomem *cntcr = (u32 *)CONFIG_SYS_FSL_TIMER_ADDR; >> + u32 __iomem *cltbenr = (u32 *)CONFIG_SYS_FSL_PMU_CLTBENR; >> +#ifdef COUNTER_FREQUENCY_REAL >> + unsigned long cntfrq = COUNTER_FREQUENCY_REAL; >> + >> + /* Update with accurate clock frequency */ >> + asm volatile("msr cntfrq_el0, %0" : : "r" (cntfrq) : "memory"); > > The commit message says that this can only be determined at runtime, but > this looks like we're writing a compile-time static value. >
The macro COUNTER_FREQUENCY_REA is (CONFIG_SYS_CLK_FREQ/4), where CONFIG_SYS_CLK_FREQ is a function call get_board_sys_clk(). >> + >> + __real_cntfrq = cntfrq; /* update for secondary cores */ > > Do we need anything in the way or barriers and/or cache flushing to > ensure that this is visible to the secondary CPUs? Or is the MMU off at > this point? It is flushed before booting secondary cores. But I am relying on the trick of enabling cache on flash. It may not be as reliable if someone decide to disable the cache to begin with. I will move the code to somewhere safe in next version. > >> +#endif >> + >> + /* Enable timebase for all clusters. >> + * It is safe to do so even some clusters are not enabled. >> + */ >> + out_le32(cltbenr, 0xf); >> + >> + /* Enable clock for timer >> + * This is a global setting. >> + */ >> + out_le32(cntcr, 0x1); >> + >> + return 0; >> +} >> diff --git a/arch/arm/cpu/armv8/fsl-lsch3/lowlevel.S >> b/arch/arm/cpu/armv8/fsl-lsch3/lowlevel.S >> index 886576e..8d330ff 100644 >> --- a/arch/arm/cpu/armv8/fsl-lsch3/lowlevel.S >> +++ b/arch/arm/cpu/armv8/fsl-lsch3/lowlevel.S >> @@ -224,6 +224,9 @@ ENTRY(secondary_boot_func) >> /* physical address of this cpus spin table element */ >> add x11, x1, x0 >> >> + ldr x0, =__real_cntfrq >> + ldr x0, [x0] >> + msr cntfrq_el0, x0 /* set with real frequency */ >> str x9, [x11, #16] /* LPID */ >> mov x4, #1 >> str x4, [x11, #8] /* STATUS */ >> @@ -275,6 +278,9 @@ ENDPROC(secondary_switch_to_el1) >> >> /* 64 bit alignment for elements accessed as data */ >> .align 4 >> + .global __real_cntfrq >> +__real_cntfrq: >> + .quad 0x17d7840 /* 25MHz */ > > I think this would be better as COUNTER_FREQUENCY, so as to avoid > duplicating the value. Good idea. Will fix in next version. York _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

