2 * linux/arch/arm/mach-omap2/sleep.S
6 * Karthik Dasu <karthik-dp@ti.com>
9 * Texas Instruments, <www.ti.com>
10 * Richard Woodruff <r-woodruff2@ti.com>
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of
15 * the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
27 #include <linux/linkage.h>
28 #include <asm/assembler.h>
36 #define SDRC_SCRATCHPAD_SEM_V 0xfa00291c
38 #define PM_PREPWSTST_CORE_P 0x48306AE8
39 #define PM_PWSTCTRL_MPU_P OMAP3430_PRM_BASE + MPU_MOD + OMAP2_PM_PWSTCTRL
40 #define CM_IDLEST1_CORE_V OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST1)
41 #define CM_IDLEST_CKGEN_V OMAP34XX_CM_REGADDR(PLL_MOD, CM_IDLEST)
42 #define SRAM_BASE_P 0x40200000
43 #define CONTROL_STAT 0x480022F0
44 #define CONTROL_MEM_RTA_CTRL (OMAP343X_CTRL_BASE\
45 + OMAP36XX_CONTROL_MEM_RTA_CTRL)
46 #define SCRATCHPAD_MEM_OFFS 0x310 /* Move this as correct place is
48 #define SCRATCHPAD_BASE_P (OMAP343X_CTRL_BASE + OMAP343X_CONTROL_MEM_WKUP\
49 + SCRATCHPAD_MEM_OFFS)
50 #define SDRC_POWER_V OMAP34XX_SDRC_REGADDR(SDRC_POWER)
51 #define SDRC_SYSCONFIG_P (OMAP343X_SDRC_BASE + SDRC_SYSCONFIG)
52 #define SDRC_MR_0_P (OMAP343X_SDRC_BASE + SDRC_MR_0)
53 #define SDRC_EMR2_0_P (OMAP343X_SDRC_BASE + SDRC_EMR2_0)
54 #define SDRC_MANUAL_0_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_0)
55 #define SDRC_MR_1_P (OMAP343X_SDRC_BASE + SDRC_MR_1)
56 #define SDRC_EMR2_1_P (OMAP343X_SDRC_BASE + SDRC_EMR2_1)
57 #define SDRC_MANUAL_1_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_1)
58 #define SDRC_DLLA_STATUS_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
59 #define SDRC_DLLA_CTRL_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)
67 /* Function call to get the restore pointer for resume from OFF */
68 ENTRY(get_restore_pointer)
69 stmfd sp!, {lr} @ save registers on stack
71 ldmfd sp!, {pc} @ restore regs and return
72 ENTRY(get_restore_pointer_sz)
73 .word . - get_restore_pointer
75 /* Function call to get the restore pointer for 3630 resume from OFF */
76 ENTRY(get_omap3630_restore_pointer)
77 stmfd sp!, {lr} @ save registers on stack
79 ldmfd sp!, {pc} @ restore regs and return
80 ENTRY(get_omap3630_restore_pointer_sz)
81 .word . - get_omap3630_restore_pointer
85 * L2 cache needs to be toggled for stable OFF mode functionality on 3630.
86 * This function sets up a fflag that will allow for this toggling to take
87 * place on 3630. Hopefully some version in the future maynot need this
89 ENTRY(enable_omap3630_toggle_l2_on_restore)
90 stmfd sp!, {lr} @ save registers on stack
91 /* Setup so that we will disable and enable l2 */
94 ldmfd sp!, {pc} @ restore regs and return
97 /* Function call to get the restore pointer for for ES3 to resume from OFF */
98 ENTRY(get_es3_restore_pointer)
99 stmfd sp!, {lr} @ save registers on stack
101 ldmfd sp!, {pc} @ restore regs and return
102 ENTRY(get_es3_restore_pointer_sz)
103 .word . - get_es3_restore_pointer
106 ldr r4, sdrc_syscfg @ get config addr
107 ldr r5, [r4] @ get value
108 tst r5, #0x100 @ is part access blocked
110 biceq r5, r5, #0x100 @ clear bit if set
111 str r5, [r4] @ write back change
112 ldr r4, sdrc_mr_0 @ get config addr
113 ldr r5, [r4] @ get value
114 str r5, [r4] @ write back change
115 ldr r4, sdrc_emr2_0 @ get config addr
116 ldr r5, [r4] @ get value
117 str r5, [r4] @ write back change
118 ldr r4, sdrc_manual_0 @ get config addr
119 mov r5, #0x2 @ autorefresh command
120 str r5, [r4] @ kick off refreshes
121 ldr r4, sdrc_mr_1 @ get config addr
122 ldr r5, [r4] @ get value
123 str r5, [r4] @ write back change
124 ldr r4, sdrc_emr2_1 @ get config addr
125 ldr r5, [r4] @ get value
126 str r5, [r4] @ write back change
127 ldr r4, sdrc_manual_1 @ get config addr
128 mov r5, #0x2 @ autorefresh command
129 str r5, [r4] @ kick off refreshes
132 .word SDRC_SYSCONFIG_P
138 .word SDRC_MANUAL_0_P
144 .word SDRC_MANUAL_1_P
145 ENTRY(es3_sdrc_fix_sz)
146 .word . - es3_sdrc_fix
148 /* Function to call rom code to save secure ram context */
149 ENTRY(save_secure_ram_context)
150 stmfd sp!, {r1-r12, lr} @ save registers on stack
152 adr r3, api_params @ r3 points to parameters
153 str r0, [r3,#0x4] @ r0 has sdram address
156 ldr r12, sram_phy_addr_mask
158 mov r0, #25 @ set service ID for PPA
159 mov r12, r0 @ copy secure service ID in r12
160 mov r1, #0 @ set task id for ROM code in r1
161 mov r2, #4 @ set some flags in r2, r6
163 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
164 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
165 .word 0xE1600071 @ call SMI monitor (smi #1)
170 ldmfd sp!, {r1-r12, pc}
176 .word 0x4, 0x0, 0x0, 0x1, 0x1
177 ENTRY(save_secure_ram_context_sz)
178 .word . - save_secure_ram_context
181 * Forces OMAP into idle state
183 * omap34xx_suspend() - This bit of code just executes the WFI
186 * Note: This code get's copied to internal SRAM at boot. When the OMAP
187 * wakes up it continues execution at the point it went to sleep.
189 ENTRY(omap34xx_cpu_suspend)
190 stmfd sp!, {r0-r12, lr} @ save registers on stack
192 /* r0 contains restore pointer in sdram */
193 /* r1 contains information about saving context */
194 ldr r4, sdrc_power @ read the SDRC_POWER register
195 ldr r5, [r4] @ read the contents of SDRC_POWER
196 orr r5, r5, #0x40 @ enable self refresh on idle req
197 str r5, [r4] @ write back to SDRC_POWER register
200 /* If context save is required, do that and execute wfi */
202 /* Data memory barrier and Data sync barrier */
204 mcr p15, 0, r1, c7, c10, 4
205 mcr p15, 0, r1, c7, c10, 5
207 wfi @ wait for interrupt
221 ldmfd sp!, {r0-r12, pc} @ restore regs and return
223 ldr r5, pm_prepwstst_core_p
226 cmp r4, #0x0 @ Check if previous power state of CORE is OFF
230 ldr r2, es3_sdrc_fix_sz
233 ldmia r0!, {r3} @ val = *src
234 stmia r1!, {r3} @ *dst = val
235 subs r2, r2, #0x1 @ num_words--
242 ldr r1, pm_prepwstst_core_p
245 cmp r2, #0x0 @ Check if previous power state of CORE is OFF
247 /* Disable RTA before giving control */
248 ldr r1, control_mem_rta
249 mov r2, #OMAP36XX_RTA_DISABLE
251 /* Fall thru for the remaining logic */
253 /* Check what was the reason for mpu reset and store the reason in r9*/
254 /* 1 - Only L1 and logic lost */
255 /* 2 - Only L2 lost - In this case, we wont be here */
256 /* 3 - Both L1 and L2 lost */
257 ldr r1, pm_pwstctrl_mpu
260 cmp r2, #0x0 @ Check if target power state was OFF or RET
261 moveq r9, #0x3 @ MPU OFF => L1 and L2 lost
262 movne r9, #0x1 @ Only L1 and L2 lost => avoid L2 invalidation
266 cmp r0, #0x1 @ should we disable L2 on 3630?
268 mrc p15, 0, r0, c1, c0, 1
269 bic r0, r0, #2 @ disable L2 cache
270 mcr p15, 0, r0, c1, c0, 1
277 mov r0, #40 @ set service ID for PPA
278 mov r12, r0 @ copy secure Service ID in r12
279 mov r1, #0 @ set task id for ROM code in r1
280 mov r2, #4 @ set some flags in r2, r6
282 adr r3, l2_inv_api_params @ r3 points to dummy 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 /* Write to Aux control register to set some bits */
287 mov r0, #42 @ set service ID for PPA
288 mov r12, r0 @ copy secure Service ID in r12
289 mov r1, #0 @ set task id for ROM code in r1
290 mov r2, #4 @ set some flags in r2, r6
292 ldr r4, scratchpad_base
293 ldr r3, [r4, #0xBC] @ r3 points to parameters
294 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
295 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
296 .word 0xE1600071 @ call SMI monitor (smi #1)
298 #ifdef CONFIG_OMAP3_L2_AUX_SECURE_SAVE_RESTORE
299 /* Restore L2 aux control register */
300 @ set service ID for PPA
301 mov r0, #CONFIG_OMAP3_L2_AUX_SECURE_SERVICE_SET_ID
302 mov r12, r0 @ copy service ID in r12
303 mov r1, #0 @ set task ID for ROM code in r1
304 mov r2, #4 @ set some flags in r2, r6
306 ldr r4, scratchpad_base
308 adds r3, r3, #8 @ r3 points to parameters
309 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
310 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
311 .word 0xE1600071 @ call SMI monitor (smi #1)
317 /* Execute smi to invalidate L2 cache */
318 mov r12, #0x1 @ set up to invalide L2
319 smi: .word 0xE1600070 @ Call SMI monitor (smieq)
320 /* Write to Aux control register to set some bits */
321 ldr r4, scratchpad_base
325 .word 0xE1600070 @ Call SMI monitor (smieq)
326 ldr r4, scratchpad_base
330 .word 0xE1600070 @ Call SMI monitor (smieq)
333 cmp r1, #0x1 @ Do we need to re-enable L2 on 3630?
335 mrc p15, 0, r1, c1, c0, 1
336 orr r1, r1, #2 @ re-enable L2 cache
337 mcr p15, 0, r1, c1, c0, 1
340 /* Invalidate all instruction caches to PoU
341 * and flush branch target cache */
342 mcr p15, 0, r1, c7, c5, 0
344 ldr r4, scratchpad_base
353 /* Coprocessor access Control Register */
354 mcr p15, 0, r4, c1, c0, 2
357 MCR p15, 0, r5, c2, c0, 0
359 MCR p15, 0, r6, c2, c0, 1
360 /* Translation table base control register */
361 MCR p15, 0, r7, c2, c0, 2
362 /*domain access Control Register */
363 MCR p15, 0, r8, c3, c0, 0
364 /* data fault status Register */
365 MCR p15, 0, r9, c5, c0, 0
368 /* instruction fault status Register */
369 MCR p15, 0, r4, c5, c0, 1
370 /*Data Auxiliary Fault Status Register */
371 MCR p15, 0, r5, c5, c1, 0
372 /*Instruction Auxiliary Fault Status Register*/
373 MCR p15, 0, r6, c5, c1, 1
374 /*Data Fault Address Register */
375 MCR p15, 0, r7, c6, c0, 0
376 /*Instruction Fault Address Register*/
377 MCR p15, 0, r8, c6, c0, 2
380 /* user r/w thread and process ID */
381 MCR p15, 0, r4, c13, c0, 2
382 /* user ro thread and process ID */
383 MCR p15, 0, r5, c13, c0, 3
384 /*Privileged only thread and process ID */
385 MCR p15, 0, r6, c13, c0, 4
386 /* cache size selection */
387 MCR p15, 2, r7, c0, c0, 0
389 /* Data TLB lockdown registers */
390 MCR p15, 0, r4, c10, c0, 0
391 /* Instruction TLB lockdown registers */
392 MCR p15, 0, r5, c10, c0, 1
393 /* Secure or Nonsecure Vector Base Address */
394 MCR p15, 0, r6, c12, c0, 0
396 MCR p15, 0, r7, c13, c0, 0
398 MCR p15, 0, r8, c13, c0, 1
401 /* primary memory remap register */
402 MCR p15, 0, r4, c10, c2, 0
403 /*normal memory remap register */
404 MCR p15, 0, r5, c10, c2, 1
407 ldmia r3!,{r4} /*load CPSR from SDRAM*/
408 msr cpsr, r4 /*store cpsr */
410 /* Enabling MMU here */
411 mrc p15, 0, r7, c2, c0, 2 /* Read TTBRControl */
412 /* Extract N (0:2) bits and decide whether to use TTBR0 or TTBR1*/
417 /* More work needs to be done to support N[0:2] value other than 0
418 * So looping here so that the error can be detected
422 mrc p15, 0, r2, c2, c0, 0
426 ldr r5, table_index_mask
427 and r4, r5 /* r4 = 31 to 20 bits of pc */
428 /* Extract the value to be written to table entry */
430 add r1, r1, r4 /* r1 has value to be written to table entry*/
431 /* Getting the address of table entry to modify */
433 add r2, r4 /* r2 has the location which needs to be modified */
434 /* Storing previous entry of location being modified */
435 ldr r5, scratchpad_base
438 /* Modify the table entry */
440 /* Storing address of entry being modified
441 * - will be restored after enabling MMU */
442 ldr r5, scratchpad_base
446 mcr p15, 0, r0, c7, c5, 4 @ Flush prefetch buffer
447 mcr p15, 0, r0, c7, c5, 6 @ Invalidate branch predictor array
448 mcr p15, 0, r0, c8, c5, 0 @ Invalidate instruction TLB
449 mcr p15, 0, r0, c8, c6, 0 @ Invalidate data TLB
450 /* Restore control register but dont enable caches here*/
451 /* Caches will be enabled after restoring MMU table entry */
453 /* Store previous value of control register in scratchpad */
455 ldr r2, cache_pred_disable_mask
457 mcr p15, 0, r4, c1, c0, 0
459 ldmfd sp!, {r0-r12, pc} @ restore regs and return
461 mov r8, r0 /* Store SDRAM address in r8 */
462 mrc p15, 0, r5, c1, c0, 1 @ Read Auxiliary Control Register
463 mov r4, #0x1 @ Number of parameters for restore call
464 stmia r8!, {r4-r5} @ Push parameters for restore call
465 mrc p15, 1, r5, c9, c0, 2 @ Read L2 AUX ctrl register
466 stmia r8!, {r4-r5} @ Push parameters for restore call
467 /* Check what that target sleep state is:stored in r1*/
468 /* 1 - Only L1 and logic lost */
469 /* 2 - Only L2 lost */
470 /* 3 - Both L1 and L2 lost */
471 cmp r1, #0x2 /* Only L2 lost */
473 cmp r1, #0x1 /* L2 retained */
474 /* r9 stores whether to clean L2 or not*/
475 moveq r9, #0x0 /* Dont Clean L2 */
476 movne r9, #0x1 /* Clean L2 */
478 /* Store sp and spsr to SDRAM */
483 /* Save all ARM registers */
484 /* Coprocessor access control register */
485 mrc p15, 0, r6, c1, c0, 2
487 /* TTBR0, TTBR1 and Translation table base control */
488 mrc p15, 0, r4, c2, c0, 0
489 mrc p15, 0, r5, c2, c0, 1
490 mrc p15, 0, r6, c2, c0, 2
492 /* Domain access control register, data fault status register,
493 and instruction fault status register */
494 mrc p15, 0, r4, c3, c0, 0
495 mrc p15, 0, r5, c5, c0, 0
496 mrc p15, 0, r6, c5, c0, 1
498 /* Data aux fault status register, instruction aux fault status,
499 datat fault address register and instruction fault address register*/
500 mrc p15, 0, r4, c5, c1, 0
501 mrc p15, 0, r5, c5, c1, 1
502 mrc p15, 0, r6, c6, c0, 0
503 mrc p15, 0, r7, c6, c0, 2
505 /* user r/w thread and process ID, user r/o thread and process ID,
506 priv only thread and process ID, cache size selection */
507 mrc p15, 0, r4, c13, c0, 2
508 mrc p15, 0, r5, c13, c0, 3
509 mrc p15, 0, r6, c13, c0, 4
510 mrc p15, 2, r7, c0, c0, 0
512 /* Data TLB lockdown, instruction TLB lockdown registers */
513 mrc p15, 0, r5, c10, c0, 0
514 mrc p15, 0, r6, c10, c0, 1
516 /* Secure or non secure vector base address, FCSE PID, Context PID*/
517 mrc p15, 0, r4, c12, c0, 0
518 mrc p15, 0, r5, c13, c0, 0
519 mrc p15, 0, r6, c13, c0, 1
521 /* Primary remap, normal remap registers */
522 mrc p15, 0, r4, c10, c2, 0
523 mrc p15, 0, r5, c10, c2, 1
526 /* Store current cpsr*/
530 mrc p15, 0, r4, c1, c0, 0
531 /* save control register */
534 /* Clean Data or unified cache to POU*/
535 /* How to invalidate only L1 cache???? - #FIX_ME# */
536 /* mcr p15, 0, r11, c7, c11, 1 */
537 cmp r9, #1 /* Check whether L2 inval is required or not*/
541 * Jump out to kernel flush routine
542 * - reuse that code is better
543 * - it executes in a cached space so is faster than refetch per-block
544 * - should be faster and will change with kernel
545 * - 'might' have to copy address, load and jump to it
546 * - lr is used since we are running in SRAM currently.
553 /* Data memory barrier and Data sync barrier */
555 mcr p15, 0, r1, c7, c10, 4
556 mcr p15, 0, r1, c7, c10, 5
558 wfi @ wait for interrupt
570 /* restore regs and return */
571 ldmfd sp!, {r0-r12, pc}
573 /* Make sure SDRC accesses are ok */
576 /* DPLL3 must be locked before accessing the SDRC. Maybe the HW ensures this. */
577 ldr r4, cm_idlest_ckgen
583 ldr r4, cm_idlest1_core
588 /* allow DLL powerdown upon hw idle req */
595 /* Is dll in lock mode? */
596 ldr r4, sdrc_dlla_ctrl
600 /* wait till dll locks */
602 ldr r4, wait_dll_lock_counter
604 str r4, wait_dll_lock_counter
605 ldr r4, sdrc_dlla_status
606 mov r6, #8 /* Wait 20uS for lock */
616 /* disable/reenable DLL if not locked */
618 ldr r4, sdrc_dlla_ctrl
621 bic r6, #(1<<3) /* disable dll */
624 orr r6, r6, #(1<<3) /* enable dll */
630 b wait_dll_lock_timed
633 .word CM_IDLEST1_CORE_V
635 .word CM_IDLEST_CKGEN_V
637 .word SDRC_DLLA_STATUS_V
639 .word SDRC_DLLA_CTRL_V
641 .word PM_PREPWSTST_CORE_P
643 .word PM_PWSTCTRL_MPU_P
645 .word SCRATCHPAD_BASE_P
647 .word SRAM_BASE_P + 0x8000
656 cache_pred_disable_mask:
661 .word CONTROL_MEM_RTA_CTRL
663 .word v7_flush_dcache_all
667 * When exporting to userspace while the counters are in SRAM,
668 * these 2 words need to be at the end to facilitate retrival!
672 wait_dll_lock_counter:
674 ENTRY(omap34xx_cpu_suspend_sz)
675 .word . - omap34xx_cpu_suspend