Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / arch / arm / mach-omap2 / sleep34xx.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * (C) Copyright 2007
4  * Texas Instruments
5  * Karthik Dasu <karthik-dp@ti.com>
6  *
7  * (C) Copyright 2004
8  * Texas Instruments, <www.ti.com>
9  * Richard Woodruff <r-woodruff2@ti.com>
10  */
11 #include <linux/linkage.h>
12
13 #include <asm/assembler.h>
14
15 #include "omap34xx.h"
16 #include "iomap.h"
17 #include "cm3xxx.h"
18 #include "prm3xxx.h"
19 #include "sdrc.h"
20 #include "sram.h"
21 #include "control.h"
22
23 /*
24  * Registers access definitions
25  */
26 #define SDRC_SCRATCHPAD_SEM_OFFS        0xc
27 #define SDRC_SCRATCHPAD_SEM_V   OMAP343X_SCRATCHPAD_REGADDR\
28                                         (SDRC_SCRATCHPAD_SEM_OFFS)
29 #define PM_PREPWSTST_CORE_P     OMAP3430_PRM_BASE + CORE_MOD +\
30                                         OMAP3430_PM_PREPWSTST
31 #define PM_PWSTCTRL_MPU_P       OMAP3430_PRM_BASE + MPU_MOD + OMAP2_PM_PWSTCTRL
32 #define CM_IDLEST1_CORE_V       OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST1)
33 #define CM_IDLEST_CKGEN_V       OMAP34XX_CM_REGADDR(PLL_MOD, CM_IDLEST)
34 #define SRAM_BASE_P             OMAP3_SRAM_PA
35 #define CONTROL_STAT            OMAP343X_CTRL_BASE + OMAP343X_CONTROL_STATUS
36 #define CONTROL_MEM_RTA_CTRL    (OMAP343X_CTRL_BASE +\
37                                         OMAP36XX_CONTROL_MEM_RTA_CTRL)
38
39 /* Move this as correct place is available */
40 #define SCRATCHPAD_MEM_OFFS     0x310
41 #define SCRATCHPAD_BASE_P       (OMAP343X_CTRL_BASE +\
42                                         OMAP343X_CONTROL_MEM_WKUP +\
43                                         SCRATCHPAD_MEM_OFFS)
44 #define SDRC_POWER_V            OMAP34XX_SDRC_REGADDR(SDRC_POWER)
45 #define SDRC_SYSCONFIG_P        (OMAP343X_SDRC_BASE + SDRC_SYSCONFIG)
46 #define SDRC_MR_0_P             (OMAP343X_SDRC_BASE + SDRC_MR_0)
47 #define SDRC_EMR2_0_P           (OMAP343X_SDRC_BASE + SDRC_EMR2_0)
48 #define SDRC_MANUAL_0_P         (OMAP343X_SDRC_BASE + SDRC_MANUAL_0)
49 #define SDRC_MR_1_P             (OMAP343X_SDRC_BASE + SDRC_MR_1)
50 #define SDRC_EMR2_1_P           (OMAP343X_SDRC_BASE + SDRC_EMR2_1)
51 #define SDRC_MANUAL_1_P         (OMAP343X_SDRC_BASE + SDRC_MANUAL_1)
52 #define SDRC_DLLA_STATUS_V      OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
53 #define SDRC_DLLA_CTRL_V        OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)
54
55 /*
56  * This file needs be built unconditionally as ARM to interoperate correctly
57  * with non-Thumb-2-capable firmware.
58  */
59         .arm
60
61 /*
62  * API functions
63  */
64
65         .text
66 /*
67  * L2 cache needs to be toggled for stable OFF mode functionality on 3630.
68  * This function sets up a flag that will allow for this toggling to take
69  * place on 3630. Hopefully some version in the future may not need this.
70  */
71 ENTRY(enable_omap3630_toggle_l2_on_restore)
72         stmfd   sp!, {lr}       @ save registers on stack
73         /* Setup so that we will disable and enable l2 */
74         mov     r1, #0x1
75         adrl    r3, l2dis_3630_offset   @ may be too distant for plain adr
76         ldr     r2, [r3]                @ value for offset
77         str     r1, [r2, r3]            @ write to l2dis_3630
78         ldmfd   sp!, {pc}       @ restore regs and return
79 ENDPROC(enable_omap3630_toggle_l2_on_restore)
80
81 /*
82  * Function to call rom code to save secure ram context.
83  *
84  * r0 = physical address of the parameters
85  */
86         .arch armv7-a
87         .arch_extension sec
88 ENTRY(save_secure_ram_context)
89         stmfd   sp!, {r4 - r11, lr}     @ save registers on stack
90         mov     r3, r0                  @ physical address of parameters
91         mov     r0, #25                 @ set service ID for PPA
92         mov     r12, r0                 @ copy secure service ID in r12
93         mov     r1, #0                  @ set task id for ROM code in r1
94         mov     r2, #4                  @ set some flags in r2, r6
95         mov     r6, #0xff
96         dsb                             @ data write barrier
97         dmb                             @ data memory barrier
98         smc     #1                      @ call SMI monitor (smi #1)
99         nop
100         nop
101         nop
102         nop
103         ldmfd   sp!, {r4 - r11, pc}
104 ENDPROC(save_secure_ram_context)
105
106 /*
107  * ======================
108  * == Idle entry point ==
109  * ======================
110  */
111
112 /*
113  * Forces OMAP into idle state
114  *
115  * omap34xx_cpu_suspend() - This bit of code saves the CPU context if needed
116  * and executes the WFI instruction. Calling WFI effectively changes the
117  * power domains states to the desired target power states.
118  *
119  *
120  * Notes:
121  * - only the minimum set of functions gets copied to internal SRAM at boot
122  *   and after wake-up from OFF mode, cf. omap_push_sram_idle. The function
123  *   pointers in SDRAM or SRAM are called depending on the desired low power
124  *   target state.
125  * - when the OMAP wakes up it continues at different execution points
126  *   depending on the low power mode (non-OFF vs OFF modes),
127  *   cf. 'Resume path for xxx mode' comments.
128  */
129         .align  3
130 ENTRY(omap34xx_cpu_suspend)
131         stmfd   sp!, {r4 - r11, lr}     @ save registers on stack
132
133         /*
134          * r0 contains information about saving context:
135          *   0 - No context lost
136          *   1 - Only L1 and logic lost
137          *   2 - Only L2 lost (Even L1 is retained we clean it along with L2)
138          *   3 - Both L1 and L2 lost and logic lost
139          */
140
141         /*
142          * For OFF mode: save context and jump to WFI in SDRAM (omap3_do_wfi)
143          * For non-OFF modes: jump to the WFI code in SRAM (omap3_do_wfi_sram)
144          */
145         ldr     r4, omap3_do_wfi_sram_addr
146         ldr     r5, [r4]
147         cmp     r0, #0x0                @ If no context save required,
148         bxeq    r5                      @  jump to the WFI code in SRAM
149
150
151         /* Otherwise fall through to the save context code */
152 save_context_wfi:
153         /*
154          * jump out to kernel flush routine
155          *  - reuse that code is better
156          *  - it executes in a cached space so is faster than refetch per-block
157          *  - should be faster and will change with kernel
158          *  - 'might' have to copy address, load and jump to it
159          * Flush all data from the L1 data cache before disabling
160          * SCTLR.C bit.
161          */
162         ldr     r1, kernel_flush
163         mov     lr, pc
164         bx      r1
165
166         /*
167          * Clear the SCTLR.C bit to prevent further data cache
168          * allocation. Clearing SCTLR.C would make all the data accesses
169          * strongly ordered and would not hit the cache.
170          */
171         mrc     p15, 0, r0, c1, c0, 0
172         bic     r0, r0, #(1 << 2)       @ Disable the C bit
173         mcr     p15, 0, r0, c1, c0, 0
174         isb
175
176         /*
177          * Invalidate L1 data cache. Even though only invalidate is
178          * necessary exported flush API is used here. Doing clean
179          * on already clean cache would be almost NOP.
180          */
181         ldr     r1, kernel_flush
182         blx     r1
183         b       omap3_do_wfi
184 ENDPROC(omap34xx_cpu_suspend)
185 omap3_do_wfi_sram_addr:
186         .word omap3_do_wfi_sram
187 kernel_flush:
188         .word v7_flush_dcache_all
189
190 /* ===================================
191  * == WFI instruction => Enter idle ==
192  * ===================================
193  */
194
195 /*
196  * Do WFI instruction
197  * Includes the resume path for non-OFF modes
198  *
199  * This code gets copied to internal SRAM and is accessible
200  * from both SDRAM and SRAM:
201  * - executed from SRAM for non-off modes (omap3_do_wfi_sram),
202  * - executed from SDRAM for OFF mode (omap3_do_wfi).
203  */
204         .align  3
205 ENTRY(omap3_do_wfi)
206         ldr     r4, sdrc_power          @ read the SDRC_POWER register
207         ldr     r5, [r4]                @ read the contents of SDRC_POWER
208         orr     r5, r5, #0x40           @ enable self refresh on idle req
209         str     r5, [r4]                @ write back to SDRC_POWER register
210
211         /* Data memory barrier and Data sync barrier */
212         dsb
213         dmb
214
215 /*
216  * ===================================
217  * == WFI instruction => Enter idle ==
218  * ===================================
219  */
220         wfi                             @ wait for interrupt
221
222 /*
223  * ===================================
224  * == Resume path for non-OFF modes ==
225  * ===================================
226  */
227         nop
228         nop
229         nop
230         nop
231         nop
232         nop
233         nop
234         nop
235         nop
236         nop
237
238 /*
239  * This function implements the erratum ID i581 WA:
240  *  SDRC state restore before accessing the SDRAM
241  *
242  * Only used at return from non-OFF mode. For OFF
243  * mode the ROM code configures the SDRC and
244  * the DPLL before calling the restore code directly
245  * from DDR.
246  */
247
248 /* Make sure SDRC accesses are ok */
249 wait_sdrc_ok:
250
251 /* DPLL3 must be locked before accessing the SDRC. Maybe the HW ensures this */
252         ldr     r4, cm_idlest_ckgen
253 wait_dpll3_lock:
254         ldr     r5, [r4]
255         tst     r5, #1
256         beq     wait_dpll3_lock
257
258         ldr     r4, cm_idlest1_core
259 wait_sdrc_ready:
260         ldr     r5, [r4]
261         tst     r5, #0x2
262         bne     wait_sdrc_ready
263         /* allow DLL powerdown upon hw idle req */
264         ldr     r4, sdrc_power
265         ldr     r5, [r4]
266         bic     r5, r5, #0x40
267         str     r5, [r4]
268
269 is_dll_in_lock_mode:
270         /* Is dll in lock mode? */
271         ldr     r4, sdrc_dlla_ctrl
272         ldr     r5, [r4]
273         tst     r5, #0x4
274         bne     exit_nonoff_modes       @ Return if locked
275         /* wait till dll locks */
276 wait_dll_lock_timed:
277         ldr     r4, sdrc_dlla_status
278         /* Wait 20uS for lock */
279         mov     r6, #8
280 wait_dll_lock:
281         subs    r6, r6, #0x1
282         beq     kick_dll
283         ldr     r5, [r4]
284         and     r5, r5, #0x4
285         cmp     r5, #0x4
286         bne     wait_dll_lock
287         b       exit_nonoff_modes       @ Return when locked
288
289         /* disable/reenable DLL if not locked */
290 kick_dll:
291         ldr     r4, sdrc_dlla_ctrl
292         ldr     r5, [r4]
293         mov     r6, r5
294         bic     r6, #(1<<3)             @ disable dll
295         str     r6, [r4]
296         dsb
297         orr     r6, r6, #(1<<3)         @ enable dll
298         str     r6, [r4]
299         dsb
300         b       wait_dll_lock_timed
301
302 exit_nonoff_modes:
303         /* Re-enable C-bit if needed */
304         mrc     p15, 0, r0, c1, c0, 0
305         tst     r0, #(1 << 2)           @ Check C bit enabled?
306         orreq   r0, r0, #(1 << 2)       @ Enable the C bit if cleared
307         mcreq   p15, 0, r0, c1, c0, 0
308         isb
309
310 /*
311  * ===================================
312  * == Exit point from non-OFF modes ==
313  * ===================================
314  */
315         ldmfd   sp!, {r4 - r11, pc}     @ restore regs and return
316 ENDPROC(omap3_do_wfi)
317 sdrc_power:
318         .word   SDRC_POWER_V
319 cm_idlest1_core:
320         .word   CM_IDLEST1_CORE_V
321 cm_idlest_ckgen:
322         .word   CM_IDLEST_CKGEN_V
323 sdrc_dlla_status:
324         .word   SDRC_DLLA_STATUS_V
325 sdrc_dlla_ctrl:
326         .word   SDRC_DLLA_CTRL_V
327 ENTRY(omap3_do_wfi_sz)
328         .word   . - omap3_do_wfi
329
330
331 /*
332  * ==============================
333  * == Resume path for OFF mode ==
334  * ==============================
335  */
336
337 /*
338  * The restore_* functions are called by the ROM code
339  *  when back from WFI in OFF mode.
340  * Cf. the get_*restore_pointer functions.
341  *
342  *  restore_es3: applies to 34xx >= ES3.0
343  *  restore_3630: applies to 36xx
344  *  restore: common code for 3xxx
345  *
346  * Note: when back from CORE and MPU OFF mode we are running
347  *  from SDRAM, without MMU, without the caches and prediction.
348  *  Also the SRAM content has been cleared.
349  */
350 ENTRY(omap3_restore_es3)
351         ldr     r5, pm_prepwstst_core_p
352         ldr     r4, [r5]
353         and     r4, r4, #0x3
354         cmp     r4, #0x0        @ Check if previous power state of CORE is OFF
355         bne     omap3_restore   @ Fall through to OMAP3 common code
356         adr     r0, es3_sdrc_fix
357         ldr     r1, sram_base
358         ldr     r2, es3_sdrc_fix_sz
359         mov     r2, r2, ror #2
360 copy_to_sram:
361         ldmia   r0!, {r3}       @ val = *src
362         stmia   r1!, {r3}       @ *dst = val
363         subs    r2, r2, #0x1    @ num_words--
364         bne     copy_to_sram
365         ldr     r1, sram_base
366         blx     r1
367         b       omap3_restore   @ Fall through to OMAP3 common code
368 ENDPROC(omap3_restore_es3)
369
370 ENTRY(omap3_restore_3630)
371         ldr     r1, pm_prepwstst_core_p
372         ldr     r2, [r1]
373         and     r2, r2, #0x3
374         cmp     r2, #0x0        @ Check if previous power state of CORE is OFF
375         bne     omap3_restore   @ Fall through to OMAP3 common code
376         /* Disable RTA before giving control */
377         ldr     r1, control_mem_rta
378         mov     r2, #OMAP36XX_RTA_DISABLE
379         str     r2, [r1]
380 ENDPROC(omap3_restore_3630)
381
382         /* Fall through to common code for the remaining logic */
383
384 ENTRY(omap3_restore)
385         /*
386          * Read the pwstctrl register to check the reason for mpu reset.
387          * This tells us what was lost.
388          */
389         ldr     r1, pm_pwstctrl_mpu
390         ldr     r2, [r1]
391         and     r2, r2, #0x3
392         cmp     r2, #0x0        @ Check if target power state was OFF or RET
393         bne     logic_l1_restore
394
395         adr     r1, l2dis_3630_offset   @ address for offset
396         ldr     r0, [r1]                @ value for offset
397         ldr     r0, [r1, r0]            @ value at l2dis_3630
398         cmp     r0, #0x1        @ should we disable L2 on 3630?
399         bne     skipl2dis
400         mrc     p15, 0, r0, c1, c0, 1
401         bic     r0, r0, #2      @ disable L2 cache
402         mcr     p15, 0, r0, c1, c0, 1
403 skipl2dis:
404         ldr     r0, control_stat
405         ldr     r1, [r0]
406         and     r1, #0x700
407         cmp     r1, #0x300
408         beq     l2_inv_gp
409         adr     r0, l2_inv_api_params_offset
410         ldr     r3, [r0]
411         add     r3, r3, r0              @ r3 points to dummy parameters
412         mov     r0, #40                 @ set service ID for PPA
413         mov     r12, r0                 @ copy secure Service ID in r12
414         mov     r1, #0                  @ set task id for ROM code in r1
415         mov     r2, #4                  @ set some flags in r2, r6
416         mov     r6, #0xff
417         dsb                             @ data write barrier
418         dmb                             @ data memory barrier
419         smc     #1                      @ call SMI monitor (smi #1)
420         /* Write to Aux control register to set some bits */
421         mov     r0, #42                 @ set service ID for PPA
422         mov     r12, r0                 @ copy secure Service ID in r12
423         mov     r1, #0                  @ set task id for ROM code in r1
424         mov     r2, #4                  @ set some flags in r2, r6
425         mov     r6, #0xff
426         ldr     r4, scratchpad_base
427         ldr     r3, [r4, #0xBC]         @ r3 points to parameters
428         dsb                             @ data write barrier
429         dmb                             @ data memory barrier
430         smc     #1                      @ call SMI monitor (smi #1)
431
432 #ifdef CONFIG_OMAP3_L2_AUX_SECURE_SAVE_RESTORE
433         /* Restore L2 aux control register */
434                                         @ set service ID for PPA
435         mov     r0, #CONFIG_OMAP3_L2_AUX_SECURE_SERVICE_SET_ID
436         mov     r12, r0                 @ copy service ID in r12
437         mov     r1, #0                  @ set task ID for ROM code in r1
438         mov     r2, #4                  @ set some flags in r2, r6
439         mov     r6, #0xff
440         ldr     r4, scratchpad_base
441         ldr     r3, [r4, #0xBC]
442         adds    r3, r3, #8              @ r3 points to parameters
443         dsb                             @ data write barrier
444         dmb                             @ data memory barrier
445         smc     #1                      @ call SMI monitor (smi #1)
446 #endif
447         b       logic_l1_restore
448
449         .align
450 l2_inv_api_params_offset:
451         .long   l2_inv_api_params - .
452 l2_inv_gp:
453         /* Execute smi to invalidate L2 cache */
454         mov r12, #0x1                   @ set up to invalidate L2
455         smc     #0                      @ Call SMI monitor (smieq)
456         /* Write to Aux control register to set some bits */
457         ldr     r4, scratchpad_base
458         ldr     r3, [r4,#0xBC]
459         ldr     r0, [r3,#4]
460         mov     r12, #0x3
461         smc     #0                      @ Call SMI monitor (smieq)
462         ldr     r4, scratchpad_base
463         ldr     r3, [r4,#0xBC]
464         ldr     r0, [r3,#12]
465         mov     r12, #0x2
466         smc     #0                      @ Call SMI monitor (smieq)
467 logic_l1_restore:
468         adr     r0, l2dis_3630_offset   @ adress for offset
469         ldr     r1, [r0]                @ value for offset
470         ldr     r1, [r0, r1]            @ value at l2dis_3630
471         cmp     r1, #0x1                @ Test if L2 re-enable needed on 3630
472         bne     skipl2reen
473         mrc     p15, 0, r1, c1, c0, 1
474         orr     r1, r1, #2              @ re-enable L2 cache
475         mcr     p15, 0, r1, c1, c0, 1
476 skipl2reen:
477
478         /* Now branch to the common CPU resume function */
479         b       cpu_resume
480 ENDPROC(omap3_restore)
481
482         .ltorg
483
484 /*
485  * Local variables
486  */
487 pm_prepwstst_core_p:
488         .word   PM_PREPWSTST_CORE_P
489 pm_pwstctrl_mpu:
490         .word   PM_PWSTCTRL_MPU_P
491 scratchpad_base:
492         .word   SCRATCHPAD_BASE_P
493 sram_base:
494         .word   SRAM_BASE_P + 0x8000
495 control_stat:
496         .word   CONTROL_STAT
497 control_mem_rta:
498         .word   CONTROL_MEM_RTA_CTRL
499 l2dis_3630_offset:
500         .long   l2dis_3630 - .
501
502         .data
503         .align  2
504 l2dis_3630:
505         .word   0
506
507         .data
508         .align  2
509 l2_inv_api_params:
510         .word   0x1, 0x00
511
512 /*
513  * Internal functions
514  */
515
516 /*
517  * This function implements the erratum ID i443 WA, applies to 34xx >= ES3.0
518  * Copied to and run from SRAM in order to reconfigure the SDRC parameters.
519  */
520         .text
521         .align  3
522 ENTRY(es3_sdrc_fix)
523         ldr     r4, sdrc_syscfg         @ get config addr
524         ldr     r5, [r4]                @ get value
525         tst     r5, #0x100              @ is part access blocked
526         it      eq
527         biceq   r5, r5, #0x100          @ clear bit if set
528         str     r5, [r4]                @ write back change
529         ldr     r4, sdrc_mr_0           @ get config addr
530         ldr     r5, [r4]                @ get value
531         str     r5, [r4]                @ write back change
532         ldr     r4, sdrc_emr2_0         @ get config addr
533         ldr     r5, [r4]                @ get value
534         str     r5, [r4]                @ write back change
535         ldr     r4, sdrc_manual_0       @ get config addr
536         mov     r5, #0x2                @ autorefresh command
537         str     r5, [r4]                @ kick off refreshes
538         ldr     r4, sdrc_mr_1           @ get config addr
539         ldr     r5, [r4]                @ get value
540         str     r5, [r4]                @ write back change
541         ldr     r4, sdrc_emr2_1         @ get config addr
542         ldr     r5, [r4]                @ get value
543         str     r5, [r4]                @ write back change
544         ldr     r4, sdrc_manual_1       @ get config addr
545         mov     r5, #0x2                @ autorefresh command
546         str     r5, [r4]                @ kick off refreshes
547         bx      lr
548
549 /*
550  * Local variables
551  */
552         .align
553 sdrc_syscfg:
554         .word   SDRC_SYSCONFIG_P
555 sdrc_mr_0:
556         .word   SDRC_MR_0_P
557 sdrc_emr2_0:
558         .word   SDRC_EMR2_0_P
559 sdrc_manual_0:
560         .word   SDRC_MANUAL_0_P
561 sdrc_mr_1:
562         .word   SDRC_MR_1_P
563 sdrc_emr2_1:
564         .word   SDRC_EMR2_1_P
565 sdrc_manual_1:
566         .word   SDRC_MANUAL_1_P
567 ENDPROC(es3_sdrc_fix)
568 ENTRY(es3_sdrc_fix_sz)
569         .word   . - es3_sdrc_fix