aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/sram34xx.S
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2009-05-12 19:27:09 -0400
committerpaul <paul@twilight.(none)>2009-05-12 19:27:09 -0400
commit69d4255b139274f71faca28bc93bb49da8eb1a91 (patch)
treeb9e21367ad98944b80937b756b89bca1415e0e1c /arch/arm/mach-omap2/sram34xx.S
parentd9295746c0ed3991bdec18c6a5890d71d88904b4 (diff)
OMAP3 SRAM: add ARM barriers to omap3_sram_configure_core_dpll
Add more barriers in the SRAM CORE DPLL M2 divider change code. - Add a DSB SY after the function's entry point to flush all cached and buffered writes and wait for the interconnect to claim that they have completed[1]. The idea here is to force all delayed write traffic going to the SDRAM to at least post to the L3 interconnect before continuing. If these writes are allowed to occur after the SDRC is idled, the writes will not be acknowledged and the ARM will stall. Note that in this case, it does not matter if the writes actually complete to the SDRAM - it is only necessary for the writes to leave the ARM itself. If the writes are posted by the interconnect when the SDRC goes into idle, the writes will be delayed until the SDRC returns from idle[2]. If the SDRC is in the middle of a write when it is requested to enter idle, the SDRC will not acknowledge the idle request until the writes complete to the SDRAM.[3] The old-style DMB in sdram_in_selfrefresh is now superfluous, so, remove it. - Add an ISB before the function's exit point to prevent the ARM from speculatively executing into SDRAM before the SDRAM is enabled[4]. ... 1. ARMv7 ARM (DDI 0406A) A3-47, A3-48. 2. Private communication with Richard Woodruff <r-woodruff2@ti.com>. 3. Private communication with Richard Woodruff <r-woodruff2@ti.com>. 4. ARMv7 ARM (DDI 0406A) A3-48. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: Richard Woodruff <r-woodruff2@ti.com>
Diffstat (limited to 'arch/arm/mach-omap2/sram34xx.S')
-rw-r--r--arch/arm/mach-omap2/sram34xx.S4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/sram34xx.S b/arch/arm/mach-omap2/sram34xx.S
index 2c7146136342..f4a356d5d2d8 100644
--- a/arch/arm/mach-omap2/sram34xx.S
+++ b/arch/arm/mach-omap2/sram34xx.S
@@ -43,6 +43,7 @@
43 */ 43 */
44ENTRY(omap3_sram_configure_core_dpll) 44ENTRY(omap3_sram_configure_core_dpll)
45 stmfd sp!, {r1-r12, lr} @ store regs to stack 45 stmfd sp!, {r1-r12, lr} @ store regs to stack
46 dsb @ flush buffered writes to interconnect
46 cmp r3, #0x2 47 cmp r3, #0x2
47 blne configure_sdrc 48 blne configure_sdrc
48 cmp r3, #0x2 49 cmp r3, #0x2
@@ -58,6 +59,7 @@ ENTRY(omap3_sram_configure_core_dpll)
58 blne wait_dll_lock 59 blne wait_dll_lock
59 cmp r3, #0x1 60 cmp r3, #0x1
60 blne configure_sdrc 61 blne configure_sdrc
62 isb @ prevent speculative exec past here
61 mov r0, #0 @ return value 63 mov r0, #0 @ return value
62 ldmfd sp!, {r1-r12, pc} @ restore regs and return 64 ldmfd sp!, {r1-r12, pc} @ restore regs and return
63unlock_dll: 65unlock_dll:
@@ -73,8 +75,6 @@ lock_dll:
73 str r5, [r4] 75 str r5, [r4]
74 bx lr 76 bx lr
75sdram_in_selfrefresh: 77sdram_in_selfrefresh:
76 mov r5, #0x0 @ Move 0 to R5
77 mcr p15, 0, r5, c7, c10, 5 @ memory barrier
78 ldr r4, omap3_sdrc_power @ read the SDRC_POWER register 78 ldr r4, omap3_sdrc_power @ read the SDRC_POWER register
79 ldr r5, [r4] @ read the contents of SDRC_POWER 79 ldr r5, [r4] @ read the contents of SDRC_POWER
80 orr r5, r5, #0x40 @ enable self refresh on idle req 80 orr r5, r5, #0x40 @ enable self refresh on idle req