blob: 24ecb0a5cce1f2b7e16d8152b18ca3379ab372b3 [file] [log] [blame]
Kevin Hilman8bd22942009-05-28 10:56:16 -07001/*
2 * linux/arch/arm/mach-omap2/sleep.S
3 *
4 * (C) Copyright 2007
5 * Texas Instruments
6 * Karthik Dasu <karthik-dp@ti.com>
7 *
8 * (C) Copyright 2004
9 * Texas Instruments, <www.ti.com>
10 * Richard Woodruff <r-woodruff2@ti.com>
11 *
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.
16 *
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.
21 *
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,
25 * MA 02111-1307 USA
26 */
27#include <linux/linkage.h>
28#include <asm/assembler.h>
29#include <mach/io.h>
Kevin Hilman8bd22942009-05-28 10:56:16 -070030
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +020031#include "cm.h"
Kevin Hilman8bd22942009-05-28 10:56:16 -070032#include "prm.h"
33#include "sdrc.h"
Paul Walmsley4814ced2010-10-08 11:40:20 -060034#include "control.h"
Kevin Hilman8bd22942009-05-28 10:56:16 -070035
Rajendra Nayaka89b6f02009-05-28 18:13:06 +053036#define SDRC_SCRATCHPAD_SEM_V 0xfa00291c
37
Kevin Hilman8bd22942009-05-28 10:56:16 -070038#define PM_PREPWSTST_CORE_V OMAP34XX_PRM_REGADDR(CORE_MOD, \
39 OMAP3430_PM_PREPWSTST)
Tero Kristo0795a752008-10-13 17:58:50 +030040#define PM_PREPWSTST_CORE_P 0x48306AE8
Kevin Hilman8bd22942009-05-28 10:56:16 -070041#define PM_PREPWSTST_MPU_V OMAP34XX_PRM_REGADDR(MPU_MOD, \
42 OMAP3430_PM_PREPWSTST)
Abhijit Pagare37903002010-01-26 20:12:51 -070043#define PM_PWSTCTRL_MPU_P OMAP3430_PRM_BASE + MPU_MOD + OMAP2_PM_PWSTCTRL
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +020044#define CM_IDLEST1_CORE_V OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST1)
Peter 'p2' De Schrijver9d93b8a22010-12-20 14:05:04 -060045#define CM_IDLEST_CKGEN_V OMAP34XX_CM_REGADDR(PLL_MOD, CM_IDLEST)
Tero Kristo27d59a42008-10-13 13:15:00 +030046#define SRAM_BASE_P 0x40200000
47#define CONTROL_STAT 0x480022F0
Kevin Hilman8bd22942009-05-28 10:56:16 -070048#define SCRATCHPAD_MEM_OFFS 0x310 /* Move this as correct place is
49 * available */
Rajendra Nayak61255ab2008-09-26 17:49:56 +053050#define SCRATCHPAD_BASE_P (OMAP343X_CTRL_BASE + OMAP343X_CONTROL_MEM_WKUP\
51 + SCRATCHPAD_MEM_OFFS)
Kevin Hilman8bd22942009-05-28 10:56:16 -070052#define SDRC_POWER_V OMAP34XX_SDRC_REGADDR(SDRC_POWER)
Tero Kristo0795a752008-10-13 17:58:50 +030053#define SDRC_SYSCONFIG_P (OMAP343X_SDRC_BASE + SDRC_SYSCONFIG)
54#define SDRC_MR_0_P (OMAP343X_SDRC_BASE + SDRC_MR_0)
55#define SDRC_EMR2_0_P (OMAP343X_SDRC_BASE + SDRC_EMR2_0)
56#define SDRC_MANUAL_0_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_0)
57#define SDRC_MR_1_P (OMAP343X_SDRC_BASE + SDRC_MR_1)
58#define SDRC_EMR2_1_P (OMAP343X_SDRC_BASE + SDRC_EMR2_1)
59#define SDRC_MANUAL_1_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_1)
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +020060#define SDRC_DLLA_STATUS_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
61#define SDRC_DLLA_CTRL_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)
Kevin Hilman8bd22942009-05-28 10:56:16 -070062
Rajendra Nayaka89b6f02009-05-28 18:13:06 +053063 .text
Uwe Kleine-König46cd09a2010-06-11 12:16:57 +020064/* Function to acquire the semaphore in scratchpad */
Rajendra Nayaka89b6f02009-05-28 18:13:06 +053065ENTRY(lock_scratchpad_sem)
66 stmfd sp!, {lr} @ save registers on stack
67wait_sem:
68 mov r0,#1
69 ldr r1, sdrc_scratchpad_sem
70wait_loop:
71 ldr r2, [r1] @ load the lock value
72 cmp r2, r0 @ is the lock free ?
73 beq wait_loop @ not free...
74 swp r2, r0, [r1] @ semaphore free so lock it and proceed
75 cmp r2, r0 @ did we succeed ?
76 beq wait_sem @ no - try again
77 ldmfd sp!, {pc} @ restore regs and return
78sdrc_scratchpad_sem:
79 .word SDRC_SCRATCHPAD_SEM_V
80ENTRY(lock_scratchpad_sem_sz)
81 .word . - lock_scratchpad_sem
82
83 .text
84/* Function to release the scratchpad semaphore */
85ENTRY(unlock_scratchpad_sem)
86 stmfd sp!, {lr} @ save registers on stack
87 ldr r3, sdrc_scratchpad_sem
88 mov r2,#0
89 str r2,[r3]
90 ldmfd sp!, {pc} @ restore regs and return
91ENTRY(unlock_scratchpad_sem_sz)
92 .word . - unlock_scratchpad_sem
93
Kevin Hilman8bd22942009-05-28 10:56:16 -070094 .text
95/* Function call to get the restore pointer for resume from OFF */
96ENTRY(get_restore_pointer)
97 stmfd sp!, {lr} @ save registers on stack
98 adr r0, restore
99 ldmfd sp!, {pc} @ restore regs and return
100ENTRY(get_restore_pointer_sz)
Tero Kristo0795a752008-10-13 17:58:50 +0300101 .word . - get_restore_pointer
102
103 .text
104/* Function call to get the restore pointer for for ES3 to resume from OFF */
105ENTRY(get_es3_restore_pointer)
106 stmfd sp!, {lr} @ save registers on stack
107 adr r0, restore_es3
108 ldmfd sp!, {pc} @ restore regs and return
109ENTRY(get_es3_restore_pointer_sz)
110 .word . - get_es3_restore_pointer
111
112ENTRY(es3_sdrc_fix)
113 ldr r4, sdrc_syscfg @ get config addr
114 ldr r5, [r4] @ get value
115 tst r5, #0x100 @ is part access blocked
116 it eq
117 biceq r5, r5, #0x100 @ clear bit if set
118 str r5, [r4] @ write back change
119 ldr r4, sdrc_mr_0 @ get config addr
120 ldr r5, [r4] @ get value
121 str r5, [r4] @ write back change
122 ldr r4, sdrc_emr2_0 @ get config addr
123 ldr r5, [r4] @ get value
124 str r5, [r4] @ write back change
125 ldr r4, sdrc_manual_0 @ get config addr
126 mov r5, #0x2 @ autorefresh command
127 str r5, [r4] @ kick off refreshes
128 ldr r4, sdrc_mr_1 @ get config addr
129 ldr r5, [r4] @ get value
130 str r5, [r4] @ write back change
131 ldr r4, sdrc_emr2_1 @ get config addr
132 ldr r5, [r4] @ get value
133 str r5, [r4] @ write back change
134 ldr r4, sdrc_manual_1 @ get config addr
135 mov r5, #0x2 @ autorefresh command
136 str r5, [r4] @ kick off refreshes
137 bx lr
138sdrc_syscfg:
139 .word SDRC_SYSCONFIG_P
140sdrc_mr_0:
141 .word SDRC_MR_0_P
142sdrc_emr2_0:
143 .word SDRC_EMR2_0_P
144sdrc_manual_0:
145 .word SDRC_MANUAL_0_P
146sdrc_mr_1:
147 .word SDRC_MR_1_P
148sdrc_emr2_1:
149 .word SDRC_EMR2_1_P
150sdrc_manual_1:
151 .word SDRC_MANUAL_1_P
152ENTRY(es3_sdrc_fix_sz)
153 .word . - es3_sdrc_fix
Tero Kristo27d59a42008-10-13 13:15:00 +0300154
155/* Function to call rom code to save secure ram context */
156ENTRY(save_secure_ram_context)
157 stmfd sp!, {r1-r12, lr} @ save registers on stack
158save_secure_ram_debug:
159 /* b save_secure_ram_debug */ @ enable to debug save code
160 adr r3, api_params @ r3 points to parameters
161 str r0, [r3,#0x4] @ r0 has sdram address
162 ldr r12, high_mask
163 and r3, r3, r12
164 ldr r12, sram_phy_addr_mask
165 orr r3, r3, r12
166 mov r0, #25 @ set service ID for PPA
167 mov r12, r0 @ copy secure service ID in r12
168 mov r1, #0 @ set task id for ROM code in r1
Kalle Jokiniemiba50ea72009-03-26 15:59:00 +0200169 mov r2, #4 @ set some flags in r2, r6
Tero Kristo27d59a42008-10-13 13:15:00 +0300170 mov r6, #0xff
171 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
172 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
173 .word 0xE1600071 @ call SMI monitor (smi #1)
174 nop
175 nop
176 nop
177 nop
178 ldmfd sp!, {r1-r12, pc}
179sram_phy_addr_mask:
180 .word SRAM_BASE_P
181high_mask:
182 .word 0xffff
183api_params:
184 .word 0x4, 0x0, 0x0, 0x1, 0x1
185ENTRY(save_secure_ram_context_sz)
186 .word . - save_secure_ram_context
187
Kevin Hilman8bd22942009-05-28 10:56:16 -0700188/*
189 * Forces OMAP into idle state
190 *
191 * omap34xx_suspend() - This bit of code just executes the WFI
192 * for normal idles.
193 *
194 * Note: This code get's copied to internal SRAM at boot. When the OMAP
195 * wakes up it continues execution at the point it went to sleep.
196 */
197ENTRY(omap34xx_cpu_suspend)
198 stmfd sp!, {r0-r12, lr} @ save registers on stack
199loop:
200 /*b loop*/ @Enable to debug by stepping through code
201 /* r0 contains restore pointer in sdram */
202 /* r1 contains information about saving context */
203 ldr r4, sdrc_power @ read the SDRC_POWER register
204 ldr r5, [r4] @ read the contents of SDRC_POWER
205 orr r5, r5, #0x40 @ enable self refresh on idle req
206 str r5, [r4] @ write back to SDRC_POWER register
207
208 cmp r1, #0x0
209 /* If context save is required, do that and execute wfi */
210 bne save_context_wfi
211 /* Data memory barrier and Data sync barrier */
212 mov r1, #0
213 mcr p15, 0, r1, c7, c10, 4
214 mcr p15, 0, r1, c7, c10, 5
215
216 wfi @ wait for interrupt
217
218 nop
219 nop
220 nop
221 nop
222 nop
223 nop
224 nop
225 nop
226 nop
227 nop
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200228 bl wait_sdrc_ok
Kevin Hilman8bd22942009-05-28 10:56:16 -0700229
230 ldmfd sp!, {r0-r12, pc} @ restore regs and return
Tero Kristo0795a752008-10-13 17:58:50 +0300231restore_es3:
232 /*b restore_es3*/ @ Enable to debug restore code
233 ldr r5, pm_prepwstst_core_p
234 ldr r4, [r5]
235 and r4, r4, #0x3
236 cmp r4, #0x0 @ Check if previous power state of CORE is OFF
237 bne restore
238 adr r0, es3_sdrc_fix
239 ldr r1, sram_base
240 ldr r2, es3_sdrc_fix_sz
241 mov r2, r2, ror #2
242copy_to_sram:
243 ldmia r0!, {r3} @ val = *src
244 stmia r1!, {r3} @ *dst = val
245 subs r2, r2, #0x1 @ num_words--
246 bne copy_to_sram
247 ldr r1, sram_base
248 blx r1
Kevin Hilman8bd22942009-05-28 10:56:16 -0700249restore:
Rajendra Nayak61255ab2008-09-26 17:49:56 +0530250 /* b restore*/ @ Enable to debug restore code
Kevin Hilman8bd22942009-05-28 10:56:16 -0700251 /* Check what was the reason for mpu reset and store the reason in r9*/
252 /* 1 - Only L1 and logic lost */
253 /* 2 - Only L2 lost - In this case, we wont be here */
254 /* 3 - Both L1 and L2 lost */
255 ldr r1, pm_pwstctrl_mpu
256 ldr r2, [r1]
257 and r2, r2, #0x3
258 cmp r2, #0x0 @ Check if target power state was OFF or RET
259 moveq r9, #0x3 @ MPU OFF => L1 and L2 lost
260 movne r9, #0x1 @ Only L1 and L2 lost => avoid L2 invalidation
261 bne logic_l1_restore
Tero Kristo27d59a42008-10-13 13:15:00 +0300262 ldr r0, control_stat
263 ldr r1, [r0]
264 and r1, #0x700
265 cmp r1, #0x300
266 beq l2_inv_gp
267 mov r0, #40 @ set service ID for PPA
268 mov r12, r0 @ copy secure Service ID in r12
269 mov r1, #0 @ set task id for ROM code in r1
270 mov r2, #4 @ set some flags in r2, r6
271 mov r6, #0xff
272 adr r3, l2_inv_api_params @ r3 points to dummy parameters
273 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
274 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
275 .word 0xE1600071 @ call SMI monitor (smi #1)
276 /* Write to Aux control register to set some bits */
277 mov r0, #42 @ 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
281 mov r6, #0xff
Tero Kristoa087cad2009-11-12 12:07:20 +0200282 ldr r4, scratchpad_base
283 ldr r3, [r4, #0xBC] @ r3 points to parameters
Tero Kristo27d59a42008-10-13 13:15:00 +0300284 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
285 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
286 .word 0xE1600071 @ call SMI monitor (smi #1)
287
Tero Kristo79dcfdd2009-11-12 12:07:22 +0200288#ifdef CONFIG_OMAP3_L2_AUX_SECURE_SAVE_RESTORE
289 /* Restore L2 aux control register */
290 @ set service ID for PPA
291 mov r0, #CONFIG_OMAP3_L2_AUX_SECURE_SERVICE_SET_ID
292 mov r12, r0 @ copy service ID in r12
293 mov r1, #0 @ set task ID for ROM code in r1
294 mov r2, #4 @ set some flags in r2, r6
295 mov r6, #0xff
296 ldr r4, scratchpad_base
297 ldr r3, [r4, #0xBC]
298 adds r3, r3, #8 @ r3 points to parameters
299 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
300 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
301 .word 0xE1600071 @ call SMI monitor (smi #1)
302#endif
Tero Kristo27d59a42008-10-13 13:15:00 +0300303 b logic_l1_restore
304l2_inv_api_params:
305 .word 0x1, 0x00
Tero Kristo27d59a42008-10-13 13:15:00 +0300306l2_inv_gp:
Kevin Hilman8bd22942009-05-28 10:56:16 -0700307 /* Execute smi to invalidate L2 cache */
308 mov r12, #0x1 @ set up to invalide L2
Tero Kristo27d59a42008-10-13 13:15:00 +0300309smi: .word 0xE1600070 @ Call SMI monitor (smieq)
310 /* Write to Aux control register to set some bits */
Tero Kristoa087cad2009-11-12 12:07:20 +0200311 ldr r4, scratchpad_base
312 ldr r3, [r4,#0xBC]
313 ldr r0, [r3,#4]
Tero Kristo27d59a42008-10-13 13:15:00 +0300314 mov r12, #0x3
315 .word 0xE1600070 @ Call SMI monitor (smieq)
Tero Kristo79dcfdd2009-11-12 12:07:22 +0200316 ldr r4, scratchpad_base
317 ldr r3, [r4,#0xBC]
318 ldr r0, [r3,#12]
319 mov r12, #0x2
320 .word 0xE1600070 @ Call SMI monitor (smieq)
Kevin Hilman8bd22942009-05-28 10:56:16 -0700321logic_l1_restore:
322 mov r1, #0
323 /* Invalidate all instruction caches to PoU
324 * and flush branch target cache */
325 mcr p15, 0, r1, c7, c5, 0
326
327 ldr r4, scratchpad_base
328 ldr r3, [r4,#0xBC]
Tero Kristo79dcfdd2009-11-12 12:07:22 +0200329 adds r3, r3, #16
Kevin Hilman8bd22942009-05-28 10:56:16 -0700330 ldmia r3!, {r4-r6}
331 mov sp, r4
332 msr spsr_cxsf, r5
333 mov lr, r6
334
335 ldmia r3!, {r4-r9}
336 /* Coprocessor access Control Register */
337 mcr p15, 0, r4, c1, c0, 2
338
339 /* TTBR0 */
340 MCR p15, 0, r5, c2, c0, 0
341 /* TTBR1 */
342 MCR p15, 0, r6, c2, c0, 1
343 /* Translation table base control register */
344 MCR p15, 0, r7, c2, c0, 2
345 /*domain access Control Register */
346 MCR p15, 0, r8, c3, c0, 0
347 /* data fault status Register */
348 MCR p15, 0, r9, c5, c0, 0
349
350 ldmia r3!,{r4-r8}
351 /* instruction fault status Register */
352 MCR p15, 0, r4, c5, c0, 1
353 /*Data Auxiliary Fault Status Register */
354 MCR p15, 0, r5, c5, c1, 0
355 /*Instruction Auxiliary Fault Status Register*/
356 MCR p15, 0, r6, c5, c1, 1
357 /*Data Fault Address Register */
358 MCR p15, 0, r7, c6, c0, 0
359 /*Instruction Fault Address Register*/
360 MCR p15, 0, r8, c6, c0, 2
361 ldmia r3!,{r4-r7}
362
363 /* user r/w thread and process ID */
364 MCR p15, 0, r4, c13, c0, 2
365 /* user ro thread and process ID */
366 MCR p15, 0, r5, c13, c0, 3
367 /*Privileged only thread and process ID */
368 MCR p15, 0, r6, c13, c0, 4
369 /* cache size selection */
370 MCR p15, 2, r7, c0, c0, 0
371 ldmia r3!,{r4-r8}
372 /* Data TLB lockdown registers */
373 MCR p15, 0, r4, c10, c0, 0
374 /* Instruction TLB lockdown registers */
375 MCR p15, 0, r5, c10, c0, 1
376 /* Secure or Nonsecure Vector Base Address */
377 MCR p15, 0, r6, c12, c0, 0
378 /* FCSE PID */
379 MCR p15, 0, r7, c13, c0, 0
380 /* Context PID */
381 MCR p15, 0, r8, c13, c0, 1
382
383 ldmia r3!,{r4-r5}
384 /* primary memory remap register */
385 MCR p15, 0, r4, c10, c2, 0
386 /*normal memory remap register */
387 MCR p15, 0, r5, c10, c2, 1
388
389 /* Restore cpsr */
390 ldmia r3!,{r4} /*load CPSR from SDRAM*/
391 msr cpsr, r4 /*store cpsr */
392
393 /* Enabling MMU here */
394 mrc p15, 0, r7, c2, c0, 2 /* Read TTBRControl */
395 /* Extract N (0:2) bits and decide whether to use TTBR0 or TTBR1*/
396 and r7, #0x7
397 cmp r7, #0x0
398 beq usettbr0
399ttbr_error:
400 /* More work needs to be done to support N[0:2] value other than 0
401 * So looping here so that the error can be detected
402 */
403 b ttbr_error
404usettbr0:
405 mrc p15, 0, r2, c2, c0, 0
406 ldr r5, ttbrbit_mask
407 and r2, r5
408 mov r4, pc
409 ldr r5, table_index_mask
410 and r4, r5 /* r4 = 31 to 20 bits of pc */
411 /* Extract the value to be written to table entry */
412 ldr r1, table_entry
413 add r1, r1, r4 /* r1 has value to be written to table entry*/
414 /* Getting the address of table entry to modify */
415 lsr r4, #18
416 add r2, r4 /* r2 has the location which needs to be modified */
417 /* Storing previous entry of location being modified */
418 ldr r5, scratchpad_base
419 ldr r4, [r2]
420 str r4, [r5, #0xC0]
421 /* Modify the table entry */
422 str r1, [r2]
423 /* Storing address of entry being modified
424 * - will be restored after enabling MMU */
425 ldr r5, scratchpad_base
426 str r2, [r5, #0xC4]
427
428 mov r0, #0
429 mcr p15, 0, r0, c7, c5, 4 @ Flush prefetch buffer
430 mcr p15, 0, r0, c7, c5, 6 @ Invalidate branch predictor array
431 mcr p15, 0, r0, c8, c5, 0 @ Invalidate instruction TLB
432 mcr p15, 0, r0, c8, c6, 0 @ Invalidate data TLB
433 /* Restore control register but dont enable caches here*/
434 /* Caches will be enabled after restoring MMU table entry */
435 ldmia r3!, {r4}
436 /* Store previous value of control register in scratchpad */
437 str r4, [r5, #0xC8]
438 ldr r2, cache_pred_disable_mask
439 and r4, r2
440 mcr p15, 0, r4, c1, c0, 0
441
442 ldmfd sp!, {r0-r12, pc} @ restore regs and return
443save_context_wfi:
444 /*b save_context_wfi*/ @ enable to debug save code
445 mov r8, r0 /* Store SDRAM address in r8 */
Tero Kristoa087cad2009-11-12 12:07:20 +0200446 mrc p15, 0, r5, c1, c0, 1 @ Read Auxiliary Control Register
447 mov r4, #0x1 @ Number of parameters for restore call
Tero Kristo79dcfdd2009-11-12 12:07:22 +0200448 stmia r8!, {r4-r5} @ Push parameters for restore call
449 mrc p15, 1, r5, c9, c0, 2 @ Read L2 AUX ctrl register
450 stmia r8!, {r4-r5} @ Push parameters for restore call
Kevin Hilman8bd22942009-05-28 10:56:16 -0700451 /* Check what that target sleep state is:stored in r1*/
452 /* 1 - Only L1 and logic lost */
453 /* 2 - Only L2 lost */
454 /* 3 - Both L1 and L2 lost */
455 cmp r1, #0x2 /* Only L2 lost */
456 beq clean_l2
457 cmp r1, #0x1 /* L2 retained */
458 /* r9 stores whether to clean L2 or not*/
459 moveq r9, #0x0 /* Dont Clean L2 */
460 movne r9, #0x1 /* Clean L2 */
461l1_logic_lost:
462 /* Store sp and spsr to SDRAM */
463 mov r4, sp
464 mrs r5, spsr
465 mov r6, lr
466 stmia r8!, {r4-r6}
467 /* Save all ARM registers */
468 /* Coprocessor access control register */
469 mrc p15, 0, r6, c1, c0, 2
470 stmia r8!, {r6}
471 /* TTBR0, TTBR1 and Translation table base control */
472 mrc p15, 0, r4, c2, c0, 0
473 mrc p15, 0, r5, c2, c0, 1
474 mrc p15, 0, r6, c2, c0, 2
475 stmia r8!, {r4-r6}
476 /* Domain access control register, data fault status register,
477 and instruction fault status register */
478 mrc p15, 0, r4, c3, c0, 0
479 mrc p15, 0, r5, c5, c0, 0
480 mrc p15, 0, r6, c5, c0, 1
481 stmia r8!, {r4-r6}
482 /* Data aux fault status register, instruction aux fault status,
483 datat fault address register and instruction fault address register*/
484 mrc p15, 0, r4, c5, c1, 0
485 mrc p15, 0, r5, c5, c1, 1
486 mrc p15, 0, r6, c6, c0, 0
487 mrc p15, 0, r7, c6, c0, 2
488 stmia r8!, {r4-r7}
489 /* user r/w thread and process ID, user r/o thread and process ID,
490 priv only thread and process ID, cache size selection */
491 mrc p15, 0, r4, c13, c0, 2
492 mrc p15, 0, r5, c13, c0, 3
493 mrc p15, 0, r6, c13, c0, 4
494 mrc p15, 2, r7, c0, c0, 0
495 stmia r8!, {r4-r7}
496 /* Data TLB lockdown, instruction TLB lockdown registers */
497 mrc p15, 0, r5, c10, c0, 0
498 mrc p15, 0, r6, c10, c0, 1
499 stmia r8!, {r5-r6}
500 /* Secure or non secure vector base address, FCSE PID, Context PID*/
501 mrc p15, 0, r4, c12, c0, 0
502 mrc p15, 0, r5, c13, c0, 0
503 mrc p15, 0, r6, c13, c0, 1
504 stmia r8!, {r4-r6}
505 /* Primary remap, normal remap registers */
506 mrc p15, 0, r4, c10, c2, 0
507 mrc p15, 0, r5, c10, c2, 1
508 stmia r8!,{r4-r5}
509
510 /* Store current cpsr*/
511 mrs r2, cpsr
512 stmia r8!, {r2}
513
514 mrc p15, 0, r4, c1, c0, 0
515 /* save control register */
516 stmia r8!, {r4}
517clean_caches:
518 /* Clean Data or unified cache to POU*/
519 /* How to invalidate only L1 cache???? - #FIX_ME# */
520 /* mcr p15, 0, r11, c7, c11, 1 */
521 cmp r9, #1 /* Check whether L2 inval is required or not*/
522 bne skip_l2_inval
523clean_l2:
Richard Woodruff0bd40532010-12-20 14:05:03 -0600524 /*
525 * Jump out to kernel flush routine
526 * - reuse that code is better
527 * - it executes in a cached space so is faster than refetch per-block
528 * - should be faster and will change with kernel
529 * - 'might' have to copy address, load and jump to it
530 * - lr is used since we are running in SRAM currently.
531 */
532 ldr r1, kernel_flush
533 mov lr, pc
534 bx r1
535
Kevin Hilman8bd22942009-05-28 10:56:16 -0700536skip_l2_inval:
537 /* Data memory barrier and Data sync barrier */
538 mov r1, #0
539 mcr p15, 0, r1, c7, c10, 4
540 mcr p15, 0, r1, c7, c10, 5
541
542 wfi @ wait for interrupt
543 nop
544 nop
545 nop
546 nop
547 nop
548 nop
549 nop
550 nop
551 nop
552 nop
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200553 bl wait_sdrc_ok
Kevin Hilman8bd22942009-05-28 10:56:16 -0700554 /* restore regs and return */
555 ldmfd sp!, {r0-r12, pc}
556
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200557/* Make sure SDRC accesses are ok */
558wait_sdrc_ok:
Peter 'p2' De Schrijver9d93b8a22010-12-20 14:05:04 -0600559
560/* DPLL3 must be locked before accessing the SDRC. Maybe the HW ensures this. */
561 ldr r4, cm_idlest_ckgen
562wait_dpll3_lock:
563 ldr r5, [r4]
564 tst r5, #1
565 beq wait_dpll3_lock
566
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200567 ldr r4, cm_idlest1_core
Peter 'p2' De Schrijver9d93b8a22010-12-20 14:05:04 -0600568wait_sdrc_ready:
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200569 ldr r5, [r4]
Peter 'p2' De Schrijver9d93b8a22010-12-20 14:05:04 -0600570 tst r5, #0x2
571 bne wait_sdrc_ready
572 /* allow DLL powerdown upon hw idle req */
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200573 ldr r4, sdrc_power
574 ldr r5, [r4]
575 bic r5, r5, #0x40
576 str r5, [r4]
Peter 'p2' De Schrijver9d93b8a22010-12-20 14:05:04 -0600577is_dll_in_lock_mode:
578
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200579 /* Is dll in lock mode? */
580 ldr r4, sdrc_dlla_ctrl
581 ldr r5, [r4]
582 tst r5, #0x4
583 bxne lr
584 /* wait till dll locks */
Peter 'p2' De Schrijver9d93b8a22010-12-20 14:05:04 -0600585wait_dll_lock_timed:
586 ldr r4, wait_dll_lock_counter
587 add r4, r4, #1
588 str r4, wait_dll_lock_counter
589 ldr r4, sdrc_dlla_status
590 mov r6, #8 /* Wait 20uS for lock */
591wait_dll_lock:
592 subs r6, r6, #0x1
593 beq kick_dll
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200594 ldr r5, [r4]
595 and r5, r5, #0x4
596 cmp r5, #0x4
597 bne wait_dll_lock
598 bx lr
Kevin Hilman8bd22942009-05-28 10:56:16 -0700599
Peter 'p2' De Schrijver9d93b8a22010-12-20 14:05:04 -0600600 /* disable/reenable DLL if not locked */
601kick_dll:
602 ldr r4, sdrc_dlla_ctrl
603 ldr r5, [r4]
604 mov r6, r5
605 bic r6, #(1<<3) /* disable dll */
606 str r6, [r4]
607 dsb
608 orr r6, r6, #(1<<3) /* enable dll */
609 str r6, [r4]
610 dsb
611 ldr r4, kick_counter
612 add r4, r4, #1
613 str r4, kick_counter
614 b wait_dll_lock_timed
615
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200616cm_idlest1_core:
617 .word CM_IDLEST1_CORE_V
Peter 'p2' De Schrijver9d93b8a22010-12-20 14:05:04 -0600618cm_idlest_ckgen:
619 .word CM_IDLEST_CKGEN_V
Peter 'p2' De Schrijver89139dc2009-01-16 18:53:48 +0200620sdrc_dlla_status:
621 .word SDRC_DLLA_STATUS_V
622sdrc_dlla_ctrl:
623 .word SDRC_DLLA_CTRL_V
Kevin Hilman8bd22942009-05-28 10:56:16 -0700624pm_prepwstst_core:
625 .word PM_PREPWSTST_CORE_V
Tero Kristo0795a752008-10-13 17:58:50 +0300626pm_prepwstst_core_p:
627 .word PM_PREPWSTST_CORE_P
Kevin Hilman8bd22942009-05-28 10:56:16 -0700628pm_prepwstst_mpu:
629 .word PM_PREPWSTST_MPU_V
630pm_pwstctrl_mpu:
631 .word PM_PWSTCTRL_MPU_P
632scratchpad_base:
633 .word SCRATCHPAD_BASE_P
Tero Kristo0795a752008-10-13 17:58:50 +0300634sram_base:
635 .word SRAM_BASE_P + 0x8000
Kevin Hilman8bd22942009-05-28 10:56:16 -0700636sdrc_power:
637 .word SDRC_POWER_V
Kevin Hilman8bd22942009-05-28 10:56:16 -0700638clk_stabilize_delay:
639 .word 0x000001FF
640assoc_mask:
641 .word 0x3ff
642numset_mask:
643 .word 0x7fff
644ttbrbit_mask:
645 .word 0xFFFFC000
646table_index_mask:
647 .word 0xFFF00000
648table_entry:
649 .word 0x00000C02
650cache_pred_disable_mask:
651 .word 0xFFFFE7FB
Tero Kristo27d59a42008-10-13 13:15:00 +0300652control_stat:
653 .word CONTROL_STAT
Richard Woodruff0bd40532010-12-20 14:05:03 -0600654kernel_flush:
655 .word v7_flush_dcache_all
Peter 'p2' De Schrijver9d93b8a22010-12-20 14:05:04 -0600656 /*
657 * When exporting to userspace while the counters are in SRAM,
658 * these 2 words need to be at the end to facilitate retrival!
659 */
660kick_counter:
661 .word 0
662wait_dll_lock_counter:
663 .word 0
Kevin Hilman8bd22942009-05-28 10:56:16 -0700664ENTRY(omap34xx_cpu_suspend_sz)
665 .word . - omap34xx_cpu_suspend