diff options
author | Akshay Saraswat <akshay.s@samsung.com> | 2015-02-20 13:27:14 +0530 |
---|---|---|
committer | Minkyu Kang <mk7.kang@samsung.com> | 2015-02-28 18:03:46 +0900 |
commit | a389531439a7d5cea2829054edcf438dc76e79a9 (patch) | |
tree | eb3579513553a870fac0ec44e5f9b6db0d88ef53 /arch/arm | |
parent | 0c08baf05317c723214ba6e0ba89e4a4d9e0d3f1 (diff) | |
download | u-boot-imx-a389531439a7d5cea2829054edcf438dc76e79a9.zip u-boot-imx-a389531439a7d5cea2829054edcf438dc76e79a9.tar.gz u-boot-imx-a389531439a7d5cea2829054edcf438dc76e79a9.tar.bz2 |
Exynos542x: Add workaround for ARM errata 799270
This patch adds workaround for the ARM errata 799270 which says
"If the L2 cache logic clock is stopped because of L2 inactivity,
setting or clearing the ACTLR.SMP bit might not be effective. The bit is
modified in the ACTLR, meaning a read of the register returns the
updated value. However the logic that uses that bit retains the previous
value."
Signed-off-by: Kimoon Kim <kimoon.kim@samsung.com>
Signed-off-by: Akshay Saraswat <akshay.s@samsung.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/include/asm/armv7.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/arch/arm/include/asm/armv7.h b/arch/arm/include/asm/armv7.h index a2040b7..dc9561c 100644 --- a/arch/arm/include/asm/armv7.h +++ b/arch/arm/include/asm/armv7.h @@ -84,6 +84,34 @@ static inline void v7_enable_l2_hazard_detect(void) asm volatile ("mcr p15, 1, %0, c15, c0, 0\n\t" : : "r"(val)); } +/* + * Workaround for ARM errata # 799270 + * Ensure that the L2 logic has been used within the previous 256 cycles + * before modifying the ACTLR.SMP bit. This is required during boot before + * MMU has been enabled, or during a specified reset or power down sequence. + */ +static inline void v7_enable_smp(uint32_t address) +{ + uint32_t temp, val; + + /* Read auxiliary control register */ + asm volatile ("mrc p15, 0, %0, c1, c0, 1\n\t" : "=r"(val)); + + /* Enable SMP */ + val |= (1 << 6); + + /* Dummy read to assure L2 access */ + temp = readl(address); + temp &= 0; + val |= temp; + + /* Write auxiliary control register */ + asm volatile ("mcr p15, 0, %0, c1, c0, 1\n\t" : : "r"(val)); + + CP15DSB; + CP15ISB; +} + void v7_en_l2_hazard_detect(void); void v7_outer_cache_enable(void); void v7_outer_cache_disable(void); |