diff options
author | Tero Kristo <tero.kristo@nokia.com> | 2009-11-12 05:07:22 -0500 |
---|---|---|
committer | Kevin Hilman <khilman@deeprootsystems.com> | 2010-02-23 14:05:07 -0500 |
commit | 79dcfdd407208cba06bd446e93b0809df1cf10d1 (patch) | |
tree | c8ff2e60e7cf2544f8c43caedbc40920e4d52a65 /arch | |
parent | a89b6f006201469a74dfc0cc4e953648b6a1c69d (diff) |
OMAP3: PM: Added support for L2 aux ctrl register save and restore
This patch adds a save and restore mechanism for ARM L2 auxiliary control
register. The feature is enabled by default for GP devices, but for HS/EMU
devices the user must enable the service and define the PPA service ID to
be used for setting L2 aux ctrl, as this is not currently supported by the
bootloader. If nobody alters the contents of L2 aux ctrl from its reset
value, this feature is not needed.
Kconfig option to enable HS/EMU L2 aux save and restore:
- OMAP3_L2_AUX_SECURE_SAVE_RESTORE
Kconfig option to select HS/EMU PPA service for setting L2 aux ctrl:
- OMAP3_L2_AUX_SECURE_SERVICE_SET_ID
Signed-off-by: Tero Kristo <tero.kristo@nokia.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-omap2/sleep34xx.S | 26 | ||||
-rw-r--r-- | arch/arm/plat-omap/Kconfig | 17 |
2 files changed, 41 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S index 12a8ba0e0a3c..d522cd70bf53 100644 --- a/arch/arm/mach-omap2/sleep34xx.S +++ b/arch/arm/mach-omap2/sleep34xx.S | |||
@@ -284,6 +284,21 @@ restore: | |||
284 | mcr p15, 0, r0, c7, c10, 5 @ data memory barrier | 284 | mcr p15, 0, r0, c7, c10, 5 @ data memory barrier |
285 | .word 0xE1600071 @ call SMI monitor (smi #1) | 285 | .word 0xE1600071 @ call SMI monitor (smi #1) |
286 | 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 | ||
287 | b logic_l1_restore | 302 | b logic_l1_restore |
288 | l2_inv_api_params: | 303 | l2_inv_api_params: |
289 | .word 0x1, 0x00 | 304 | .word 0x1, 0x00 |
@@ -297,6 +312,11 @@ smi: .word 0xE1600070 @ Call SMI monitor (smieq) | |||
297 | ldr r0, [r3,#4] | 312 | ldr r0, [r3,#4] |
298 | mov r12, #0x3 | 313 | mov r12, #0x3 |
299 | .word 0xE1600070 @ Call SMI monitor (smieq) | 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) | ||
300 | logic_l1_restore: | 320 | logic_l1_restore: |
301 | mov r1, #0 | 321 | mov r1, #0 |
302 | /* Invalidate all instruction caches to PoU | 322 | /* Invalidate all instruction caches to PoU |
@@ -305,7 +325,7 @@ logic_l1_restore: | |||
305 | 325 | ||
306 | ldr r4, scratchpad_base | 326 | ldr r4, scratchpad_base |
307 | ldr r3, [r4,#0xBC] | 327 | ldr r3, [r4,#0xBC] |
308 | adds r3, r3, #8 | 328 | adds r3, r3, #16 |
309 | ldmia r3!, {r4-r6} | 329 | ldmia r3!, {r4-r6} |
310 | mov sp, r4 | 330 | mov sp, r4 |
311 | msr spsr_cxsf, r5 | 331 | msr spsr_cxsf, r5 |
@@ -424,7 +444,9 @@ save_context_wfi: | |||
424 | mov r8, r0 /* Store SDRAM address in r8 */ | 444 | mov r8, r0 /* Store SDRAM address in r8 */ |
425 | mrc p15, 0, r5, c1, c0, 1 @ Read Auxiliary Control Register | 445 | mrc p15, 0, r5, c1, c0, 1 @ Read Auxiliary Control Register |
426 | mov r4, #0x1 @ Number of parameters for restore call | 446 | mov r4, #0x1 @ Number of parameters for restore call |
427 | stmia r8!, {r4-r5} | 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 | ||
428 | /* Check what that target sleep state is:stored in r1*/ | 450 | /* Check what that target sleep state is:stored in r1*/ |
429 | /* 1 - Only L1 and logic lost */ | 451 | /* 1 - Only L1 and logic lost */ |
430 | /* 2 - Only L2 lost */ | 452 | /* 2 - Only L2 lost */ |
diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index 97d0c79ffd2b..be9484a28b12 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig | |||
@@ -135,6 +135,23 @@ config OMAP_32K_TIMER | |||
135 | 135 | ||
136 | endchoice | 136 | endchoice |
137 | 137 | ||
138 | config OMAP3_L2_AUX_SECURE_SAVE_RESTORE | ||
139 | bool "OMAP3 HS/EMU save and restore for L2 AUX control register" | ||
140 | depends on ARCH_OMAP3 && PM | ||
141 | default n | ||
142 | help | ||
143 | Without this option, L2 Auxiliary control register contents are | ||
144 | lost during off-mode entry on HS/EMU devices. This feature | ||
145 | requires support from PPA / boot-loader in HS/EMU devices, which | ||
146 | currently does not exist by default. | ||
147 | |||
148 | config OMAP3_L2_AUX_SECURE_SERVICE_SET_ID | ||
149 | int "Service ID for the support routine to set L2 AUX control" | ||
150 | depends on OMAP3_L2_AUX_SECURE_SAVE_RESTORE | ||
151 | default 43 | ||
152 | help | ||
153 | PPA routine service ID for setting L2 auxiliary control register. | ||
154 | |||
138 | config OMAP_32K_TIMER_HZ | 155 | config OMAP_32K_TIMER_HZ |
139 | int "Kernel internal timer frequency for 32KHz timer" | 156 | int "Kernel internal timer frequency for 32KHz timer" |
140 | range 32 1024 | 157 | range 32 1024 |