diff options
Diffstat (limited to 'arch/arm/mach-omap2/sleep34xx.S')
-rw-r--r-- | arch/arm/mach-omap2/sleep34xx.S | 280 |
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 */ | ||
64 | ENTRY(lock_scratchpad_sem) | ||
65 | stmfd sp!, {lr} @ save registers on stack | ||
66 | wait_sem: | ||
67 | mov r0,#1 | ||
68 | ldr r1, sdrc_scratchpad_sem | ||
69 | wait_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 | ||
77 | sdrc_scratchpad_sem: | ||
78 | .word SDRC_SCRATCHPAD_SEM_V | ||
79 | ENTRY(lock_scratchpad_sem_sz) | ||
80 | .word . - lock_scratchpad_sem | ||
81 | |||
82 | .text | ||
83 | /* Function to release the scratchpad semaphore */ | ||
84 | ENTRY(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 | ||
90 | ENTRY(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 |
53 | ENTRY(get_restore_pointer_sz) | 99 | ENTRY(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 */ | ||
104 | ENTRY(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 | ||
108 | ENTRY(get_es3_restore_pointer_sz) | ||
109 | .word . - get_es3_restore_pointer | ||
110 | |||
111 | ENTRY(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 | ||
137 | sdrc_syscfg: | ||
138 | .word SDRC_SYSCONFIG_P | ||
139 | sdrc_mr_0: | ||
140 | .word SDRC_MR_0_P | ||
141 | sdrc_emr2_0: | ||
142 | .word SDRC_EMR2_0_P | ||
143 | sdrc_manual_0: | ||
144 | .word SDRC_MANUAL_0_P | ||
145 | sdrc_mr_1: | ||
146 | .word SDRC_MR_1_P | ||
147 | sdrc_emr2_1: | ||
148 | .word SDRC_EMR2_1_P | ||
149 | sdrc_manual_1: | ||
150 | .word SDRC_MANUAL_1_P | ||
151 | ENTRY(es3_sdrc_fix_sz) | ||
152 | .word . - es3_sdrc_fix | ||
153 | |||
154 | /* Function to call rom code to save secure ram context */ | ||
155 | ENTRY(save_secure_ram_context) | ||
156 | stmfd sp!, {r1-r12, lr} @ save registers on stack | ||
157 | save_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} | ||
178 | sram_phy_addr_mask: | ||
179 | .word SRAM_BASE_P | ||
180 | high_mask: | ||
181 | .word 0xffff | ||
182 | api_params: | ||
183 | .word 0x4, 0x0, 0x0, 0x1, 0x1 | ||
184 | ENTRY(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 |
230 | restore_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 | ||
241 | copy_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 | ||
98 | restore: | 248 | restore: |
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 | ||
303 | l2_inv_api_params: | ||
304 | .word 0x1, 0x00 | ||
305 | l2_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 |
113 | smi: .word 0xE1600070 @ Call SMI monitor (smieq) | 308 | smi: .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) | ||
114 | logic_l1_restore: | 320 | logic_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: | |||
235 | save_context_wfi: | 442 | save_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 | ||
398 | i_dll_wait: | 610 | /* Make sure SDRC accesses are ok */ |
399 | ldr r4, clk_stabilize_delay | 611 | wait_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] | ||
621 | wait_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 | ||
401 | i_dll_delay: | 635 | cm_idlest1_core: |
402 | subs r4, r4, #0x1 | 636 | .word CM_IDLEST1_CORE_V |
403 | bne i_dll_delay | 637 | sdrc_dlla_status: |
404 | ldr r4, sdrc_power | 638 | .word SDRC_DLLA_STATUS_V |
405 | ldr r5, [r4] | 639 | sdrc_dlla_ctrl: |
406 | bic r5, r5, #0x40 | 640 | .word SDRC_DLLA_CTRL_V |
407 | str r5, [r4] | ||
408 | bx lr | ||
409 | pm_prepwstst_core: | 641 | pm_prepwstst_core: |
410 | .word PM_PREPWSTST_CORE_V | 642 | .word PM_PREPWSTST_CORE_V |
643 | pm_prepwstst_core_p: | ||
644 | .word PM_PREPWSTST_CORE_P | ||
411 | pm_prepwstst_mpu: | 645 | pm_prepwstst_mpu: |
412 | .word PM_PREPWSTST_MPU_V | 646 | .word PM_PREPWSTST_MPU_V |
413 | pm_pwstctrl_mpu: | 647 | pm_pwstctrl_mpu: |
414 | .word PM_PWSTCTRL_MPU_P | 648 | .word PM_PWSTCTRL_MPU_P |
415 | scratchpad_base: | 649 | scratchpad_base: |
416 | .word SCRATCHPAD_BASE_P | 650 | .word SCRATCHPAD_BASE_P |
651 | sram_base: | ||
652 | .word SRAM_BASE_P + 0x8000 | ||
417 | sdrc_power: | 653 | sdrc_power: |
418 | .word SDRC_POWER_V | 654 | .word SDRC_POWER_V |
419 | context_mem: | ||
420 | .word 0x803E3E14 | ||
421 | clk_stabilize_delay: | 655 | clk_stabilize_delay: |
422 | .word 0x000001FF | 656 | .word 0x000001FF |
423 | assoc_mask: | 657 | assoc_mask: |
@@ -432,5 +666,7 @@ table_entry: | |||
432 | .word 0x00000C02 | 666 | .word 0x00000C02 |
433 | cache_pred_disable_mask: | 667 | cache_pred_disable_mask: |
434 | .word 0xFFFFE7FB | 668 | .word 0xFFFFE7FB |
669 | control_stat: | ||
670 | .word CONTROL_STAT | ||
435 | ENTRY(omap34xx_cpu_suspend_sz) | 671 | ENTRY(omap34xx_cpu_suspend_sz) |
436 | .word . - omap34xx_cpu_suspend | 672 | .word . - omap34xx_cpu_suspend |