aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/sleep34xx.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/sleep34xx.S')
-rw-r--r--arch/arm/mach-omap2/sleep34xx.S280
1 files changed, 258 insertions, 22 deletions
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
index e5e2553e79a6..d522cd70bf53 100644
--- a/arch/arm/mach-omap2/sleep34xx.S
+++ b/arch/arm/mach-omap2/sleep34xx.S
@@ -27,22 +27,68 @@
27#include <linux/linkage.h> 27#include <linux/linkage.h>
28#include <asm/assembler.h> 28#include <asm/assembler.h>
29#include <mach/io.h> 29#include <mach/io.h>
30#include <mach/control.h> 30#include <plat/control.h>
31 31
32#include "cm.h"
32#include "prm.h" 33#include "prm.h"
33#include "sdrc.h" 34#include "sdrc.h"
34 35
36#define SDRC_SCRATCHPAD_SEM_V 0xfa00291c
37
35#define PM_PREPWSTST_CORE_V OMAP34XX_PRM_REGADDR(CORE_MOD, \ 38#define PM_PREPWSTST_CORE_V OMAP34XX_PRM_REGADDR(CORE_MOD, \
36 OMAP3430_PM_PREPWSTST) 39 OMAP3430_PM_PREPWSTST)
40#define PM_PREPWSTST_CORE_P 0x48306AE8
37#define PM_PREPWSTST_MPU_V OMAP34XX_PRM_REGADDR(MPU_MOD, \ 41#define PM_PREPWSTST_MPU_V OMAP34XX_PRM_REGADDR(MPU_MOD, \
38 OMAP3430_PM_PREPWSTST) 42 OMAP3430_PM_PREPWSTST)
39#define PM_PWSTCTRL_MPU_P OMAP34XX_PRM_REGADDR(MPU_MOD, PM_PWSTCTRL) 43#define PM_PWSTCTRL_MPU_P OMAP3430_PRM_BASE + MPU_MOD + OMAP2_PM_PWSTCTRL
44#define CM_IDLEST1_CORE_V OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST1)
45#define SRAM_BASE_P 0x40200000
46#define CONTROL_STAT 0x480022F0
40#define SCRATCHPAD_MEM_OFFS 0x310 /* Move this as correct place is 47#define SCRATCHPAD_MEM_OFFS 0x310 /* Move this as correct place is
41 * available */ 48 * available */
42#define SCRATCHPAD_BASE_P OMAP343X_CTRL_REGADDR(\ 49#define SCRATCHPAD_BASE_P (OMAP343X_CTRL_BASE + OMAP343X_CONTROL_MEM_WKUP\
43 OMAP343X_CONTROL_MEM_WKUP +\ 50 + SCRATCHPAD_MEM_OFFS)
44 SCRATCHPAD_MEM_OFFS)
45#define SDRC_POWER_V OMAP34XX_SDRC_REGADDR(SDRC_POWER) 51#define SDRC_POWER_V OMAP34XX_SDRC_REGADDR(SDRC_POWER)
52#define SDRC_SYSCONFIG_P (OMAP343X_SDRC_BASE + SDRC_SYSCONFIG)
53#define SDRC_MR_0_P (OMAP343X_SDRC_BASE + SDRC_MR_0)
54#define SDRC_EMR2_0_P (OMAP343X_SDRC_BASE + SDRC_EMR2_0)
55#define SDRC_MANUAL_0_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_0)
56#define SDRC_MR_1_P (OMAP343X_SDRC_BASE + SDRC_MR_1)
57#define SDRC_EMR2_1_P (OMAP343X_SDRC_BASE + SDRC_EMR2_1)
58#define SDRC_MANUAL_1_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_1)
59#define SDRC_DLLA_STATUS_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
60#define SDRC_DLLA_CTRL_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)
61
62 .text
63/* Function to aquire the semaphore in scratchpad */
64ENTRY(lock_scratchpad_sem)
65 stmfd sp!, {lr} @ save registers on stack
66wait_sem:
67 mov r0,#1
68 ldr r1, sdrc_scratchpad_sem
69wait_loop:
70 ldr r2, [r1] @ load the lock value
71 cmp r2, r0 @ is the lock free ?
72 beq wait_loop @ not free...
73 swp r2, r0, [r1] @ semaphore free so lock it and proceed
74 cmp r2, r0 @ did we succeed ?
75 beq wait_sem @ no - try again
76 ldmfd sp!, {pc} @ restore regs and return
77sdrc_scratchpad_sem:
78 .word SDRC_SCRATCHPAD_SEM_V
79ENTRY(lock_scratchpad_sem_sz)
80 .word . - lock_scratchpad_sem
81
82 .text
83/* Function to release the scratchpad semaphore */
84ENTRY(unlock_scratchpad_sem)
85 stmfd sp!, {lr} @ save registers on stack
86 ldr r3, sdrc_scratchpad_sem
87 mov r2,#0
88 str r2,[r3]
89 ldmfd sp!, {pc} @ restore regs and return
90ENTRY(unlock_scratchpad_sem_sz)
91 .word . - unlock_scratchpad_sem
46 92
47 .text 93 .text
48/* Function call to get the restore pointer for resume from OFF */ 94/* Function call to get the restore pointer for resume from OFF */
@@ -51,7 +97,93 @@ ENTRY(get_restore_pointer)
51 adr r0, restore 97 adr r0, restore
52 ldmfd sp!, {pc} @ restore regs and return 98 ldmfd sp!, {pc} @ restore regs and return
53ENTRY(get_restore_pointer_sz) 99ENTRY(get_restore_pointer_sz)
54 .word . - get_restore_pointer_sz 100 .word . - get_restore_pointer
101
102 .text
103/* Function call to get the restore pointer for for ES3 to resume from OFF */
104ENTRY(get_es3_restore_pointer)
105 stmfd sp!, {lr} @ save registers on stack
106 adr r0, restore_es3
107 ldmfd sp!, {pc} @ restore regs and return
108ENTRY(get_es3_restore_pointer_sz)
109 .word . - get_es3_restore_pointer
110
111ENTRY(es3_sdrc_fix)
112 ldr r4, sdrc_syscfg @ get config addr
113 ldr r5, [r4] @ get value
114 tst r5, #0x100 @ is part access blocked
115 it eq
116 biceq r5, r5, #0x100 @ clear bit if set
117 str r5, [r4] @ write back change
118 ldr r4, sdrc_mr_0 @ get config addr
119 ldr r5, [r4] @ get value
120 str r5, [r4] @ write back change
121 ldr r4, sdrc_emr2_0 @ get config addr
122 ldr r5, [r4] @ get value
123 str r5, [r4] @ write back change
124 ldr r4, sdrc_manual_0 @ get config addr
125 mov r5, #0x2 @ autorefresh command
126 str r5, [r4] @ kick off refreshes
127 ldr r4, sdrc_mr_1 @ get config addr
128 ldr r5, [r4] @ get value
129 str r5, [r4] @ write back change
130 ldr r4, sdrc_emr2_1 @ get config addr
131 ldr r5, [r4] @ get value
132 str r5, [r4] @ write back change
133 ldr r4, sdrc_manual_1 @ get config addr
134 mov r5, #0x2 @ autorefresh command
135 str r5, [r4] @ kick off refreshes
136 bx lr
137sdrc_syscfg:
138 .word SDRC_SYSCONFIG_P
139sdrc_mr_0:
140 .word SDRC_MR_0_P
141sdrc_emr2_0:
142 .word SDRC_EMR2_0_P
143sdrc_manual_0:
144 .word SDRC_MANUAL_0_P
145sdrc_mr_1:
146 .word SDRC_MR_1_P
147sdrc_emr2_1:
148 .word SDRC_EMR2_1_P
149sdrc_manual_1:
150 .word SDRC_MANUAL_1_P
151ENTRY(es3_sdrc_fix_sz)
152 .word . - es3_sdrc_fix
153
154/* Function to call rom code to save secure ram context */
155ENTRY(save_secure_ram_context)
156 stmfd sp!, {r1-r12, lr} @ save registers on stack
157save_secure_ram_debug:
158 /* b save_secure_ram_debug */ @ enable to debug save code
159 adr r3, api_params @ r3 points to parameters
160 str r0, [r3,#0x4] @ r0 has sdram address
161 ldr r12, high_mask
162 and r3, r3, r12
163 ldr r12, sram_phy_addr_mask
164 orr r3, r3, r12
165 mov r0, #25 @ set service ID for PPA
166 mov r12, r0 @ copy secure service ID in r12
167 mov r1, #0 @ set task id for ROM code in r1
168 mov r2, #4 @ set some flags in r2, r6
169 mov r6, #0xff
170 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
171 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
172 .word 0xE1600071 @ call SMI monitor (smi #1)
173 nop
174 nop
175 nop
176 nop
177 ldmfd sp!, {r1-r12, pc}
178sram_phy_addr_mask:
179 .word SRAM_BASE_P
180high_mask:
181 .word 0xffff
182api_params:
183 .word 0x4, 0x0, 0x0, 0x1, 0x1
184ENTRY(save_secure_ram_context_sz)
185 .word . - save_secure_ram_context
186
55/* 187/*
56 * Forces OMAP into idle state 188 * Forces OMAP into idle state
57 * 189 *
@@ -92,11 +224,29 @@ loop:
92 nop 224 nop
93 nop 225 nop
94 nop 226 nop
95 bl i_dll_wait 227 bl wait_sdrc_ok
96 228
97 ldmfd sp!, {r0-r12, pc} @ restore regs and return 229 ldmfd sp!, {r0-r12, pc} @ restore regs and return
230restore_es3:
231 /*b restore_es3*/ @ Enable to debug restore code
232 ldr r5, pm_prepwstst_core_p
233 ldr r4, [r5]
234 and r4, r4, #0x3
235 cmp r4, #0x0 @ Check if previous power state of CORE is OFF
236 bne restore
237 adr r0, es3_sdrc_fix
238 ldr r1, sram_base
239 ldr r2, es3_sdrc_fix_sz
240 mov r2, r2, ror #2
241copy_to_sram:
242 ldmia r0!, {r3} @ val = *src
243 stmia r1!, {r3} @ *dst = val
244 subs r2, r2, #0x1 @ num_words--
245 bne copy_to_sram
246 ldr r1, sram_base
247 blx r1
98restore: 248restore:
99 /* b restore*/ @ Enable to debug restore code 249 /* b restore*/ @ Enable to debug restore code
100 /* Check what was the reason for mpu reset and store the reason in r9*/ 250 /* Check what was the reason for mpu reset and store the reason in r9*/
101 /* 1 - Only L1 and logic lost */ 251 /* 1 - Only L1 and logic lost */
102 /* 2 - Only L2 lost - In this case, we wont be here */ 252 /* 2 - Only L2 lost - In this case, we wont be here */
@@ -108,9 +258,65 @@ restore:
108 moveq r9, #0x3 @ MPU OFF => L1 and L2 lost 258 moveq r9, #0x3 @ MPU OFF => L1 and L2 lost
109 movne r9, #0x1 @ Only L1 and L2 lost => avoid L2 invalidation 259 movne r9, #0x1 @ Only L1 and L2 lost => avoid L2 invalidation
110 bne logic_l1_restore 260 bne logic_l1_restore
261 ldr r0, control_stat
262 ldr r1, [r0]
263 and r1, #0x700
264 cmp r1, #0x300
265 beq l2_inv_gp
266 mov r0, #40 @ set service ID for PPA
267 mov r12, r0 @ copy secure Service ID in r12
268 mov r1, #0 @ set task id for ROM code in r1
269 mov r2, #4 @ set some flags in r2, r6
270 mov r6, #0xff
271 adr r3, l2_inv_api_params @ r3 points to dummy parameters
272 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
273 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
274 .word 0xE1600071 @ call SMI monitor (smi #1)
275 /* Write to Aux control register to set some bits */
276 mov r0, #42 @ set service ID for PPA
277 mov r12, r0 @ copy secure Service ID in r12
278 mov r1, #0 @ set task id for ROM code in r1
279 mov r2, #4 @ set some flags in r2, r6
280 mov r6, #0xff
281 ldr r4, scratchpad_base
282 ldr r3, [r4, #0xBC] @ r3 points to parameters
283 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
284 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
285 .word 0xE1600071 @ call SMI monitor (smi #1)
286
287#ifdef CONFIG_OMAP3_L2_AUX_SECURE_SAVE_RESTORE
288 /* Restore L2 aux control register */
289 @ set service ID for PPA
290 mov r0, #CONFIG_OMAP3_L2_AUX_SECURE_SERVICE_SET_ID
291 mov r12, r0 @ copy service ID in r12
292 mov r1, #0 @ set task ID for ROM code in r1
293 mov r2, #4 @ set some flags in r2, r6
294 mov r6, #0xff
295 ldr r4, scratchpad_base
296 ldr r3, [r4, #0xBC]
297 adds r3, r3, #8 @ r3 points to parameters
298 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
299 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
300 .word 0xE1600071 @ call SMI monitor (smi #1)
301#endif
302 b logic_l1_restore
303l2_inv_api_params:
304 .word 0x1, 0x00
305l2_inv_gp:
111 /* Execute smi to invalidate L2 cache */ 306 /* Execute smi to invalidate L2 cache */
112 mov r12, #0x1 @ set up to invalide L2 307 mov r12, #0x1 @ set up to invalide L2
113smi: .word 0xE1600070 @ Call SMI monitor (smieq) 308smi: .word 0xE1600070 @ Call SMI monitor (smieq)
309 /* Write to Aux control register to set some bits */
310 ldr r4, scratchpad_base
311 ldr r3, [r4,#0xBC]
312 ldr r0, [r3,#4]
313 mov r12, #0x3
314 .word 0xE1600070 @ Call SMI monitor (smieq)
315 ldr r4, scratchpad_base
316 ldr r3, [r4,#0xBC]
317 ldr r0, [r3,#12]
318 mov r12, #0x2
319 .word 0xE1600070 @ Call SMI monitor (smieq)
114logic_l1_restore: 320logic_l1_restore:
115 mov r1, #0 321 mov r1, #0
116 /* Invalidate all instruction caches to PoU 322 /* Invalidate all instruction caches to PoU
@@ -119,6 +325,7 @@ logic_l1_restore:
119 325
120 ldr r4, scratchpad_base 326 ldr r4, scratchpad_base
121 ldr r3, [r4,#0xBC] 327 ldr r3, [r4,#0xBC]
328 adds r3, r3, #16
122 ldmia r3!, {r4-r6} 329 ldmia r3!, {r4-r6}
123 mov sp, r4 330 mov sp, r4
124 msr spsr_cxsf, r5 331 msr spsr_cxsf, r5
@@ -235,6 +442,11 @@ usettbr0:
235save_context_wfi: 442save_context_wfi:
236 /*b save_context_wfi*/ @ enable to debug save code 443 /*b save_context_wfi*/ @ enable to debug save code
237 mov r8, r0 /* Store SDRAM address in r8 */ 444 mov r8, r0 /* Store SDRAM address in r8 */
445 mrc p15, 0, r5, c1, c0, 1 @ Read Auxiliary Control Register
446 mov r4, #0x1 @ Number of parameters for restore call
447 stmia r8!, {r4-r5} @ Push parameters for restore call
448 mrc p15, 1, r5, c9, c0, 2 @ Read L2 AUX ctrl register
449 stmia r8!, {r4-r5} @ Push parameters for restore call
238 /* Check what that target sleep state is:stored in r1*/ 450 /* Check what that target sleep state is:stored in r1*/
239 /* 1 - Only L1 and logic lost */ 451 /* 1 - Only L1 and logic lost */
240 /* 2 - Only L2 lost */ 452 /* 2 - Only L2 lost */
@@ -391,33 +603,55 @@ skip_l2_inval:
391 nop 603 nop
392 nop 604 nop
393 nop 605 nop
394 bl i_dll_wait 606 bl wait_sdrc_ok
395 /* restore regs and return */ 607 /* restore regs and return */
396 ldmfd sp!, {r0-r12, pc} 608 ldmfd sp!, {r0-r12, pc}
397 609
398i_dll_wait: 610/* Make sure SDRC accesses are ok */
399 ldr r4, clk_stabilize_delay 611wait_sdrc_ok:
612 ldr r4, cm_idlest1_core
613 ldr r5, [r4]
614 and r5, r5, #0x2
615 cmp r5, #0
616 bne wait_sdrc_ok
617 ldr r4, sdrc_power
618 ldr r5, [r4]
619 bic r5, r5, #0x40
620 str r5, [r4]
621wait_dll_lock:
622 /* Is dll in lock mode? */
623 ldr r4, sdrc_dlla_ctrl
624 ldr r5, [r4]
625 tst r5, #0x4
626 bxne lr
627 /* wait till dll locks */
628 ldr r4, sdrc_dlla_status
629 ldr r5, [r4]
630 and r5, r5, #0x4
631 cmp r5, #0x4
632 bne wait_dll_lock
633 bx lr
400 634
401i_dll_delay: 635cm_idlest1_core:
402 subs r4, r4, #0x1 636 .word CM_IDLEST1_CORE_V
403 bne i_dll_delay 637sdrc_dlla_status:
404 ldr r4, sdrc_power 638 .word SDRC_DLLA_STATUS_V
405 ldr r5, [r4] 639sdrc_dlla_ctrl:
406 bic r5, r5, #0x40 640 .word SDRC_DLLA_CTRL_V
407 str r5, [r4]
408 bx lr
409pm_prepwstst_core: 641pm_prepwstst_core:
410 .word PM_PREPWSTST_CORE_V 642 .word PM_PREPWSTST_CORE_V
643pm_prepwstst_core_p:
644 .word PM_PREPWSTST_CORE_P
411pm_prepwstst_mpu: 645pm_prepwstst_mpu:
412 .word PM_PREPWSTST_MPU_V 646 .word PM_PREPWSTST_MPU_V
413pm_pwstctrl_mpu: 647pm_pwstctrl_mpu:
414 .word PM_PWSTCTRL_MPU_P 648 .word PM_PWSTCTRL_MPU_P
415scratchpad_base: 649scratchpad_base:
416 .word SCRATCHPAD_BASE_P 650 .word SCRATCHPAD_BASE_P
651sram_base:
652 .word SRAM_BASE_P + 0x8000
417sdrc_power: 653sdrc_power:
418 .word SDRC_POWER_V 654 .word SDRC_POWER_V
419context_mem:
420 .word 0x803E3E14
421clk_stabilize_delay: 655clk_stabilize_delay:
422 .word 0x000001FF 656 .word 0x000001FF
423assoc_mask: 657assoc_mask:
@@ -432,5 +666,7 @@ table_entry:
432 .word 0x00000C02 666 .word 0x00000C02
433cache_pred_disable_mask: 667cache_pred_disable_mask:
434 .word 0xFFFFE7FB 668 .word 0xFFFFE7FB
669control_stat:
670 .word CONTROL_STAT
435ENTRY(omap34xx_cpu_suspend_sz) 671ENTRY(omap34xx_cpu_suspend_sz)
436 .word . - omap34xx_cpu_suspend 672 .word . - omap34xx_cpu_suspend