1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  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 
  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 
  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 
  57 
  58 
  59         .arm
  60 
  61 
  62 
  63 
  64 
  65         .text
  66 
  67 
  68 
  69 
  70 
  71 ENTRY(enable_omap3630_toggle_l2_on_restore)
  72         stmfd   sp!, {lr}       @ save registers on stack
  73         
  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 
  83 
  84 
  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 
 109 
 110 
 111 
 112 
 113 
 114 
 115 
 116 
 117 
 118 
 119 
 120 
 121 
 122 
 123 
 124 
 125 
 126 
 127 
 128 
 129         .align  3
 130 ENTRY(omap34xx_cpu_suspend)
 131         stmfd   sp!, {r4 - r11, lr}     @ save registers on stack
 132 
 133         
 134 
 135 
 136 
 137 
 138 
 139 
 140 
 141         
 142 
 143 
 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         
 152 save_context_wfi:
 153         
 154 
 155 
 156 
 157 
 158 
 159 
 160 
 161 
 162         ldr     r1, kernel_flush
 163         mov     lr, pc
 164         bx      r1
 165 
 166         
 167 
 168 
 169 
 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 
 178 
 179 
 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 
 192 
 193 
 194 
 195 
 196 
 197 
 198 
 199 
 200 
 201 
 202 
 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         
 212         dsb
 213         dmb
 214 
 215 
 216 
 217 
 218 
 219 
 220         wfi                             @ wait for interrupt
 221 
 222 
 223 
 224 
 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 
 240 
 241 
 242 
 243 
 244 
 245 
 246 
 247 
 248 
 249 wait_sdrc_ok:
 250 
 251 
 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         
 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         
 271         ldr     r4, sdrc_dlla_ctrl
 272         ldr     r5, [r4]
 273         tst     r5, #0x4
 274         bne     exit_nonoff_modes       @ Return if locked
 275         
 276 wait_dll_lock_timed:
 277         ldr     r4, sdrc_dlla_status
 278         
 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         
 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         
 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 
 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 
 334 
 335 
 336 
 337 
 338 
 339 
 340 
 341 
 342 
 343 
 344 
 345 
 346 
 347 
 348 
 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         
 377         ldr     r1, control_mem_rta
 378         mov     r2, #OMAP36XX_RTA_DISABLE
 379         str     r2, [r1]
 380 ENDPROC(omap3_restore_3630)
 381 
 382         
 383 
 384 ENTRY(omap3_restore)
 385         
 386 
 387 
 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         
 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         
 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         
 454         mov r12, #0x1                   @ set up to invalidate L2
 455         smc     #0                      @ Call SMI monitor (smieq)
 456         
 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         
 479         b       cpu_resume
 480 ENDPROC(omap3_restore)
 481 
 482         .ltorg
 483 
 484 
 485 
 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 
 514 
 515 
 516 
 517 
 518 
 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 
 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