[U-Boot] [PATCH] imx: Enable ACTLR.SMP bit for all i.MX cortex-a7 platforms
Stefano Babic
sbabic at denx.de
Mon Jun 18 14:22:56 UTC 2018
On 14/05/2018 14:44, Fabio Estevam wrote:
> From: Ye Li <ye.li at nxp.com>
>
> According to the Cortex-A7 TRM, for ACTLR.SMP bit "You must ensure this bit
> is set to 1 before the caches and MMU are enabled, or any cache and TLB
> maintenance operations are performed".
> ROM sets this bit in normal boot flow, but when in serial download mode,
> it is not set.
> Here we add it in u-boot as a common flow for all i.MX cortex-a7 platforms,
> including mx7d, mx6ul/ull and mx7ulp.
>
> Signed-off-by: Ye Li <ye.li at nxp.com>
> [fabio: adapted to U-Boot mainline codebase and make checkpatch happy]
> Signed-off-by: Fabio Estevam <fabio.estevam at nxp.com>
> ---
> arch/arm/mach-imx/cache.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> arch/arm/mach-imx/mx7/soc.c | 7 -------
> 2 files changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/mach-imx/cache.c b/arch/arm/mach-imx/cache.c
> index c5279a7..86205cf 100644
> --- a/arch/arm/mach-imx/cache.c
> +++ b/arch/arm/mach-imx/cache.c
> @@ -10,6 +10,34 @@
> #include <asm/io.h>
> #include <asm/mach-imx/sys_proto.h>
>
> +static void enable_ca7_smp(void)
> +{
> + u32 val;
> +
> + /* Read MIDR */
> + asm volatile ("mrc p15, 0, %0, c0, c0, 0\n\t" : "=r"(val));
> + val = (val >> 4);
> + val &= 0xf;
> +
> + /* Only set the SMP for Cortex A7 */
> + if (val == 0x7) {
> + /* Read auxiliary control register */
> + asm volatile ("mrc p15, 0, %0, c1, c0, 1\n\t" : "=r"(val));
> +
> + if (val & (1 << 6))
> + return;
> +
> + /* Enable SMP */
> + val |= (1 << 6);
> +
> + /* Write auxiliary control register */
> + asm volatile ("mcr p15, 0, %0, c1, c0, 1\n\t" : : "r"(val));
> +
> + DSB;
> + ISB;
> + }
> +}
> +
> #ifndef CONFIG_SYS_DCACHE_OFF
> void enable_caches(void)
> {
> @@ -21,6 +49,9 @@ void enable_caches(void)
> /* Avoid random hang when download by usb */
> invalidate_dcache_all();
>
> + /* Set ACTLR.SMP bit for Cortex-A7 */
> + enable_ca7_smp();
> +
> /* Enable D-cache. I-cache is already enabled in start.S */
> dcache_enable();
>
> @@ -32,6 +63,17 @@ void enable_caches(void)
> IRAM_SIZE,
> option);
> }
> +#else
> +void enable_caches(void)
> +{
> + /*
> + * Set ACTLR.SMP bit for Cortex-A7, even if the caches are
> + * disabled by u-boot
> + */
> + enable_ca7_smp();
> +
> + puts("WARNING: Caches not enabled\n");
> +}
> #endif
>
> #ifndef CONFIG_SYS_L2CACHE_OFF
> diff --git a/arch/arm/mach-imx/mx7/soc.c b/arch/arm/mach-imx/mx7/soc.c
> index 3ceeeff..83bcd2d 100644
> --- a/arch/arm/mach-imx/mx7/soc.c
> +++ b/arch/arm/mach-imx/mx7/soc.c
> @@ -281,13 +281,6 @@ const struct boot_mode soc_boot_modes[] = {
>
> void s_init(void)
> {
> -#if !defined CONFIG_SPL_BUILD
> - /* Enable SMP mode for CPU0, by setting bit 6 of Auxiliary Ctl reg */
> - asm volatile(
> - "mrc p15, 0, r0, c1, c0, 1\n"
> - "orr r0, r0, #1 << 6\n"
> - "mcr p15, 0, r0, c1, c0, 1\n");
> -#endif
> /* clock configuration. */
> clock_init();
>
>
Applied to u-boot-imx, thanks !
Best regards,
Stefano Babic
--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
More information about the U-Boot
mailing list