imx: Enable ACTLR.SMP bit for all i.MX cortex-a7 platforms
Subsystems (3)
Fabio Estevam
reviewerPATCH 1/1 imx: Enable ACTLR.SMP bit for all i.MX cortex-a7 platforms
From: Ye Li <[email protected]>
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.
--- arch/arm/mach-imx/cache.c | 42 ++++++++++++++++++++++++++++++++++++++++++ arch/arm/mach-imx/mx7/soc.c | 7 ------- 2 files changed, 42 insertions(+), 7 deletions(-)
arch/arm/mach-imx/cache.c +42 -0
@@ -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 */ + asmvolatile ("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 */ + asmvolatile ("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 */ + asmvolatile ("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
arch/arm/mach-imx/mx7/soc.c +0 -7
@@ -281,13 +281,6 @@ const struct boot_mode soc_boot_modes[] = {void s_init (void ) { -#if !definedCONFIG_SPL_BUILD -/* Enable SMP mode for CPU0, by setting bit 6 of Auxiliary Ctl reg */ - asmvolatile ( -"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 ();
Signature · 1 line
2.7.4
PATCH 1/1 imx: Enable ACTLR.SMP bit for all i.MX cortex-a7 platforms
Quoted 94 lines · Fabio Estevam
From: Ye Li <[email protected]>
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 <[email protected]>[fabio: adapted to U-Boot mainline codebase and make checkpatch happy]Signed-off-by Fabio Estevam <[email protected]>--- arch/arm/mach-imx/cache.c | 42 ++++++++++++++++++++++++++++++++++++++++++ arch/arm/mach-imx/mx7/soc.c | 7 ------- 2 files changed, 42 insertions(+), 7 deletions(-)arch/arm/mach-imx/cache.c +42
-0@@ -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 */ + asmvolatile ("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 */ + asmvolatile ("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 */ + asmvolatile ("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 arch/arm/mach-imx/mx7/soc.c +0
-0@@ -281,13 +281,6 @@ const struct boot_mode soc_boot_modes[] = {void s_init (void ) {
arch/arm/mach-imx/mx7/soc.c const struct boot_mode soc_boot_modes[] = { · line 286
Quoted 10 lines
arch/arm/mach-imx/mx7/soc.c +0
-7-#if !definedCONFIG_SPL_BUILD -/* Enable SMP mode for CPU0, by setting bit 6 of Auxiliary Ctl reg */ - asmvolatile ( -"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
Signature · 5 lines
===================================================================== 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 =====================================================================