aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2
diff options
context:
space:
mode:
authorSantosh Shilimkar <santosh.shilimkar@ti.com>2011-01-23 12:21:09 -0500
committerKevin Hilman <khilman@ti.com>2011-03-10 15:23:13 -0500
commit9062511097683b4422f023d181b4a8b2db1a7a72 (patch)
tree9e46fb8c0491a26bb25464d90b6cd4caf92edf5b /arch/arm/mach-omap2
parent46f557cb453b9f3b6dc36b8179c2c36932a2ea64 (diff)
OMAP3: PM: Clear the SCTLR C bit in asm code to prevent data cache allocation
On the newer ARM processors like CortexA8, CortexA9, the caches can be speculatively loaded while they are getting flushed. Clear the SCTLR C bit to prevent further data cache allocation as part of cache clean routine Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Signed-off-by: Kevin Hilman <khilman@ti.com>
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r--arch/arm/mach-omap2/sleep34xx.S27
1 files changed, 27 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
index 99e43cc5a503..e60ac1f71bd4 100644
--- a/arch/arm/mach-omap2/sleep34xx.S
+++ b/arch/arm/mach-omap2/sleep34xx.S
@@ -246,6 +246,27 @@ clean_caches:
246 * - it executes in a cached space so is faster than refetch per-block 246 * - it executes in a cached space so is faster than refetch per-block
247 * - should be faster and will change with kernel 247 * - should be faster and will change with kernel
248 * - 'might' have to copy address, load and jump to it 248 * - 'might' have to copy address, load and jump to it
249 * Flush all data from the L1 data cache before disabling
250 * SCTLR.C bit.
251 */
252 ldr r1, kernel_flush
253 mov lr, pc
254 bx r1
255
256 /*
257 * Clear the SCTLR.C bit to prevent further data cache
258 * allocation. Clearing SCTLR.C would make all the data accesses
259 * strongly ordered and would not hit the cache.
260 */
261 mrc p15, 0, r0, c1, c0, 0
262 bic r0, r0, #(1 << 2) @ Disable the C bit
263 mcr p15, 0, r0, c1, c0, 0
264 isb
265
266 /*
267 * Invalidate L1 data cache. Even though only invalidate is
268 * necessary exported flush API is used here. Doing clean
269 * on already clean cache would be almost NOP.
249 */ 270 */
250 ldr r1, kernel_flush 271 ldr r1, kernel_flush
251 blx r1 272 blx r1
@@ -295,6 +316,12 @@ omap3_do_wfi:
295 nop 316 nop
296 bl wait_sdrc_ok 317 bl wait_sdrc_ok
297 318
319 mrc p15, 0, r0, c1, c0, 0
320 tst r0, #(1 << 2) @ Check C bit enabled?
321 orreq r0, r0, #(1 << 2) @ Enable the C bit if cleared
322 mcreq p15, 0, r0, c1, c0, 0
323 isb
324
298/* 325/*
299 * =================================== 326 * ===================================
300 * == Exit point from non-OFF modes == 327 * == Exit point from non-OFF modes ==