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.

> +
> +     __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?

> +#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.

Thanks,
Mark.
_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to