sleep43xx.S 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. /*
  2. * Low level suspend code for AM43XX SoCs
  3. *
  4. * Copyright (C) 2013-2016 Texas Instruments Incorporated - http://www.ti.com/
  5. * Dave Gerlach, Vaibhav Bedia
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation version 2.
  10. *
  11. * This program is distributed "as is" WITHOUT ANY WARRANTY of any
  12. * kind, whether express or implied; without even the implied warranty
  13. * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. */
  16. #include <linux/linkage.h>
  17. #include <linux/platform_data/pm33xx.h>
  18. #include <asm/memory.h>
  19. #include <asm/assembler.h>
  20. #include "iomap.h"
  21. #include "cm33xx.h"
  22. #include "prm33xx.h"
  23. #include "prcm43xx.h"
  24. #include "common.h"
  25. #include "omap-secure.h"
  26. #include "omap44xx.h"
  27. #include <asm/hardware/cache-l2x0.h>
  28. #define AM33XX_CM_CLKCTRL_MODULEMODE_DISABLE 0x0003
  29. #define AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE 0x0002
  30. #define AM43XX_EMIF_POWEROFF_ENABLE 0x1
  31. #define AM43XX_EMIF_POWEROFF_DISABLE 0x0
  32. #define AM43XX_CM_CLKSTCTRL_CLKTRCTRL_SW_SLEEP 0x1
  33. #define AM43XX_CM_CLKSTCTRL_CLKTRCTRL_HW_AUTO 0x3
  34. #define AM43XX_CM_BASE 0x44DF0000
  35. #define AM43XX_CTRL_CKE_OVERRIDE 0x44E1131C
  36. #define AM43XX_CM_REGADDR(inst, reg) \
  37. AM33XX_L4_WK_IO_ADDRESS(AM43XX_CM_BASE + (inst) + (reg))
  38. #define AM43XX_PM_MPU_PWRSTCTRL AM43XX_CM_REGADDR(0x0300, 0x00)
  39. #define AM43XX_CM_MPU_CLKSTCTRL AM43XX_CM_REGADDR(0x8300, 0x00)
  40. #define AM43XX_CM_MPU_MPU_CLKCTRL AM43XX_CM_REGADDR(0x8300, 0x20)
  41. #define AM43XX_CM_PER_EMIF_CLKCTRL AM43XX_CM_REGADDR(0x8800, 0x0720)
  42. #define AM43XX_CM_PER_EMIF_CLKCTRL_OFFSET 0x0720
  43. #define AM43XX_PRM_EMIF_CTRL_OFFSET 0x30
  44. /* replicated define because linux/bitops.h cannot be included in assembly */
  45. #define BIT(nr) (1 << (nr))
  46. #define RTC_SECONDS_REG 0x0
  47. #define RTC_PMIC_REG 0x98
  48. #define RTC_PMIC_POWER_EN BIT(16)
  49. #define RTC_PMIC_EXT_WAKEUP_STS BIT(12)
  50. #define RTC_PMIC_EXT_WAKEUP_POL BIT(4)
  51. #define RTC_PMIC_EXT_WAKEUP_EN BIT(0)
  52. .data
  53. .align 3
  54. ENTRY(am43xx_do_wfi)
  55. stmfd sp!, {r4 - r11, lr} @ save registers on stack
  56. /* Save wfi_flags arg to data space */
  57. mov r4, r0
  58. adr r3, am43xx_pm_ro_sram_data
  59. ldr r2, [r3, #AMX3_PM_RO_SRAM_DATA_VIRT_OFFSET]
  60. str r4, [r2, #AMX3_PM_WFI_FLAGS_OFFSET]
  61. /* Retrieve l2 cache virt address BEFORE we shut off EMIF */
  62. ldr r1, get_l2cache_base
  63. blx r1
  64. mov r8, r0
  65. /* Only flush cache is we know we are losing MPU context */
  66. tst r4, #WFI_FLAG_FLUSH_CACHE
  67. beq cache_skip_flush
  68. /*
  69. * Flush all data from the L1 and L2 data cache before disabling
  70. * SCTLR.C bit.
  71. */
  72. ldr r1, kernel_flush
  73. blx r1
  74. /*
  75. * Clear the SCTLR.C bit to prevent further data cache
  76. * allocation. Clearing SCTLR.C would make all the data accesses
  77. * strongly ordered and would not hit the cache.
  78. */
  79. mrc p15, 0, r0, c1, c0, 0
  80. bic r0, r0, #(1 << 2) @ Disable the C bit
  81. mcr p15, 0, r0, c1, c0, 0
  82. isb
  83. dsb
  84. /*
  85. * Invalidate L1 and L2 data cache.
  86. */
  87. ldr r1, kernel_flush
  88. blx r1
  89. /*
  90. * The kernel doesn't interwork: v7_flush_dcache_all in particluar will
  91. * always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled.
  92. * This sequence switches back to ARM. Note that .align may insert a
  93. * nop: bx pc needs to be word-aligned in order to work.
  94. */
  95. THUMB( .thumb )
  96. THUMB( .align )
  97. THUMB( bx pc )
  98. THUMB( nop )
  99. .arm
  100. #ifdef CONFIG_CACHE_L2X0
  101. /*
  102. * Clean and invalidate the L2 cache.
  103. */
  104. #ifdef CONFIG_PL310_ERRATA_727915
  105. mov r0, #0x03
  106. mov r12, #OMAP4_MON_L2X0_DBG_CTRL_INDEX
  107. dsb
  108. smc #0
  109. dsb
  110. #endif
  111. mov r0, r8
  112. adr r4, am43xx_pm_ro_sram_data
  113. ldr r3, [r4, #AMX3_PM_RO_SRAM_DATA_VIRT_OFFSET]
  114. mov r2, r0
  115. ldr r0, [r2, #L2X0_AUX_CTRL]
  116. str r0, [r3, #AMX3_PM_L2_AUX_CTRL_VAL_OFFSET]
  117. ldr r0, [r2, #L310_PREFETCH_CTRL]
  118. str r0, [r3, #AMX3_PM_L2_PREFETCH_CTRL_VAL_OFFSET]
  119. ldr r0, l2_val
  120. str r0, [r2, #L2X0_CLEAN_INV_WAY]
  121. wait:
  122. ldr r0, [r2, #L2X0_CLEAN_INV_WAY]
  123. ldr r1, l2_val
  124. ands r0, r0, r1
  125. bne wait
  126. #ifdef CONFIG_PL310_ERRATA_727915
  127. mov r0, #0x00
  128. mov r12, #OMAP4_MON_L2X0_DBG_CTRL_INDEX
  129. dsb
  130. smc #0
  131. dsb
  132. #endif
  133. l2x_sync:
  134. mov r0, r8
  135. mov r2, r0
  136. mov r0, #0x0
  137. str r0, [r2, #L2X0_CACHE_SYNC]
  138. sync:
  139. ldr r0, [r2, #L2X0_CACHE_SYNC]
  140. ands r0, r0, #0x1
  141. bne sync
  142. #endif
  143. /* Restore wfi_flags */
  144. adr r3, am43xx_pm_ro_sram_data
  145. ldr r2, [r3, #AMX3_PM_RO_SRAM_DATA_VIRT_OFFSET]
  146. ldr r4, [r2, #AMX3_PM_WFI_FLAGS_OFFSET]
  147. cache_skip_flush:
  148. /*
  149. * If we are trying to enter RTC+DDR mode we must perform
  150. * a read from the rtc address space to ensure translation
  151. * presence in the TLB to avoid page table walk after DDR
  152. * is unavailable.
  153. */
  154. tst r4, #WFI_FLAG_RTC_ONLY
  155. beq skip_rtc_va_refresh
  156. adr r3, am43xx_pm_ro_sram_data
  157. ldr r1, [r3, #AMX3_PM_RTC_BASE_VIRT_OFFSET]
  158. ldr r0, [r1]
  159. skip_rtc_va_refresh:
  160. /* Check if we want self refresh, if so enter SR */
  161. tst r4, #WFI_FLAG_SELF_REFRESH
  162. beq emif_skip_enter_sr
  163. adr r9, am43xx_emif_sram_table
  164. ldr r3, [r9, #EMIF_PM_ENTER_SR_OFFSET]
  165. blx r3
  166. emif_skip_enter_sr:
  167. /* Only necessary if PER is losing context */
  168. tst r4, #WFI_FLAG_SAVE_EMIF
  169. beq emif_skip_save
  170. adr r9, am43xx_emif_sram_table
  171. ldr r3, [r9, #EMIF_PM_SAVE_CONTEXT_OFFSET]
  172. blx r3
  173. emif_skip_save:
  174. /* Only can disable EMIF if we have entered self refresh */
  175. tst r4, #WFI_FLAG_SELF_REFRESH
  176. beq emif_skip_disable
  177. /* Disable EMIF */
  178. ldr r1, am43xx_virt_emif_clkctrl
  179. ldr r2, [r1]
  180. bic r2, r2, #AM33XX_CM_CLKCTRL_MODULEMODE_DISABLE
  181. str r2, [r1]
  182. wait_emif_disable:
  183. ldr r2, [r1]
  184. ldr r3, module_disabled_val
  185. cmp r2, r3
  186. bne wait_emif_disable
  187. emif_skip_disable:
  188. tst r4, #WFI_FLAG_RTC_ONLY
  189. beq skip_rtc_only
  190. adr r3, am43xx_pm_ro_sram_data
  191. ldr r1, [r3, #AMX3_PM_RTC_BASE_VIRT_OFFSET]
  192. ldr r0, [r1, #RTC_PMIC_REG]
  193. orr r0, r0, #RTC_PMIC_POWER_EN
  194. orr r0, r0, #RTC_PMIC_EXT_WAKEUP_STS
  195. orr r0, r0, #RTC_PMIC_EXT_WAKEUP_EN
  196. orr r0, r0, #RTC_PMIC_EXT_WAKEUP_POL
  197. str r0, [r1, #RTC_PMIC_REG]
  198. ldr r0, [r1, #RTC_PMIC_REG]
  199. /* Wait for 2 seconds to lose power */
  200. mov r3, #2
  201. ldr r2, [r1, #RTC_SECONDS_REG]
  202. rtc_loop:
  203. ldr r0, [r1, #RTC_SECONDS_REG]
  204. cmp r0, r2
  205. beq rtc_loop
  206. mov r2, r0
  207. subs r3, r3, #1
  208. bne rtc_loop
  209. b re_enable_emif
  210. skip_rtc_only:
  211. tst r4, #WFI_FLAG_WAKE_M3
  212. beq wkup_m3_skip
  213. /*
  214. * For the MPU WFI to be registered as an interrupt
  215. * to WKUP_M3, MPU_CLKCTRL.MODULEMODE needs to be set
  216. * to DISABLED
  217. */
  218. ldr r1, am43xx_virt_mpu_clkctrl
  219. ldr r2, [r1]
  220. bic r2, r2, #AM33XX_CM_CLKCTRL_MODULEMODE_DISABLE
  221. str r2, [r1]
  222. /*
  223. * Put MPU CLKDM to SW_SLEEP
  224. */
  225. ldr r1, am43xx_virt_mpu_clkstctrl
  226. mov r2, #AM43XX_CM_CLKSTCTRL_CLKTRCTRL_SW_SLEEP
  227. str r2, [r1]
  228. wkup_m3_skip:
  229. /*
  230. * Execute a barrier instruction to ensure that all cache,
  231. * TLB and branch predictor maintenance operations issued
  232. * have completed.
  233. */
  234. dsb
  235. dmb
  236. /*
  237. * Execute a WFI instruction and wait until the
  238. * STANDBYWFI output is asserted to indicate that the
  239. * CPU is in idle and low power state. CPU can specualatively
  240. * prefetch the instructions so add NOPs after WFI. Sixteen
  241. * NOPs as per Cortex-A9 pipeline.
  242. */
  243. wfi
  244. nop
  245. nop
  246. nop
  247. nop
  248. nop
  249. nop
  250. nop
  251. nop
  252. nop
  253. nop
  254. nop
  255. nop
  256. nop
  257. nop
  258. nop
  259. nop
  260. /* We come here in case of an abort due to a late interrupt */
  261. ldr r1, am43xx_virt_mpu_clkstctrl
  262. mov r2, #AM43XX_CM_CLKSTCTRL_CLKTRCTRL_HW_AUTO
  263. str r2, [r1]
  264. /* Set MPU_CLKCTRL.MODULEMODE back to ENABLE */
  265. ldr r1, am43xx_virt_mpu_clkctrl
  266. mov r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
  267. str r2, [r1]
  268. re_enable_emif:
  269. /* Re-enable EMIF */
  270. ldr r1, am43xx_virt_emif_clkctrl
  271. mov r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
  272. str r2, [r1]
  273. wait_emif_enable:
  274. ldr r3, [r1]
  275. cmp r2, r3
  276. bne wait_emif_enable
  277. tst r4, #WFI_FLAG_FLUSH_CACHE
  278. beq cache_skip_restore
  279. /*
  280. * Set SCTLR.C bit to allow data cache allocation
  281. */
  282. mrc p15, 0, r0, c1, c0, 0
  283. orr r0, r0, #(1 << 2) @ Enable the C bit
  284. mcr p15, 0, r0, c1, c0, 0
  285. isb
  286. cache_skip_restore:
  287. /* Only necessary if PER is losing context */
  288. tst r4, #WFI_FLAG_SELF_REFRESH
  289. beq emif_skip_exit_sr_abt
  290. adr r9, am43xx_emif_sram_table
  291. ldr r1, [r9, #EMIF_PM_ABORT_SR_OFFSET]
  292. blx r1
  293. emif_skip_exit_sr_abt:
  294. /* Let the suspend code know about the abort */
  295. mov r0, #1
  296. ldmfd sp!, {r4 - r11, pc} @ restore regs and return
  297. ENDPROC(am43xx_do_wfi)
  298. .align
  299. ENTRY(am43xx_resume_offset)
  300. .word . - am43xx_do_wfi
  301. ENTRY(am43xx_resume_from_deep_sleep)
  302. /* Set MPU CLKSTCTRL to HW AUTO so that CPUidle works properly */
  303. ldr r1, am43xx_virt_mpu_clkstctrl
  304. mov r2, #AM43XX_CM_CLKSTCTRL_CLKTRCTRL_HW_AUTO
  305. str r2, [r1]
  306. /* For AM43xx, use EMIF power down until context is restored */
  307. ldr r2, am43xx_phys_emif_poweroff
  308. mov r1, #AM43XX_EMIF_POWEROFF_ENABLE
  309. str r1, [r2, #0x0]
  310. /* Re-enable EMIF */
  311. ldr r1, am43xx_phys_emif_clkctrl
  312. mov r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
  313. str r2, [r1]
  314. wait_emif_enable1:
  315. ldr r3, [r1]
  316. cmp r2, r3
  317. bne wait_emif_enable1
  318. adr r9, am43xx_emif_sram_table
  319. ldr r1, [r9, #EMIF_PM_RESTORE_CONTEXT_OFFSET]
  320. blx r1
  321. ldr r1, [r9, #EMIF_PM_EXIT_SR_OFFSET]
  322. blx r1
  323. ldr r2, am43xx_phys_emif_poweroff
  324. mov r1, #AM43XX_EMIF_POWEROFF_DISABLE
  325. str r1, [r2, #0x0]
  326. #ifdef CONFIG_CACHE_L2X0
  327. ldr r2, l2_cache_base
  328. ldr r0, [r2, #L2X0_CTRL]
  329. and r0, #0x0f
  330. cmp r0, #1
  331. beq skip_l2en @ Skip if already enabled
  332. adr r4, am43xx_pm_ro_sram_data
  333. ldr r3, [r4, #AMX3_PM_RO_SRAM_DATA_PHYS_OFFSET]
  334. ldr r0, [r3, #AMX3_PM_L2_PREFETCH_CTRL_VAL_OFFSET]
  335. ldr r12, l2_smc1
  336. dsb
  337. smc #0
  338. dsb
  339. set_aux_ctrl:
  340. ldr r0, [r3, #AMX3_PM_L2_AUX_CTRL_VAL_OFFSET]
  341. ldr r12, l2_smc2
  342. dsb
  343. smc #0
  344. dsb
  345. /* L2 invalidate on resume */
  346. ldr r0, l2_val
  347. ldr r2, l2_cache_base
  348. str r0, [r2, #L2X0_INV_WAY]
  349. wait2:
  350. ldr r0, [r2, #L2X0_INV_WAY]
  351. ldr r1, l2_val
  352. ands r0, r0, r1
  353. bne wait2
  354. #ifdef CONFIG_PL310_ERRATA_727915
  355. mov r0, #0x00
  356. mov r12, #OMAP4_MON_L2X0_DBG_CTRL_INDEX
  357. dsb
  358. smc #0
  359. dsb
  360. #endif
  361. l2x_sync2:
  362. ldr r2, l2_cache_base
  363. mov r0, #0x0
  364. str r0, [r2, #L2X0_CACHE_SYNC]
  365. sync2:
  366. ldr r0, [r2, #L2X0_CACHE_SYNC]
  367. ands r0, r0, #0x1
  368. bne sync2
  369. mov r0, #0x1
  370. ldr r12, l2_smc3
  371. dsb
  372. smc #0
  373. dsb
  374. #endif
  375. skip_l2en:
  376. /* We are back. Branch to the common CPU resume routine */
  377. mov r0, #0
  378. ldr pc, resume_addr
  379. ENDPROC(am43xx_resume_from_deep_sleep)
  380. /*
  381. * Local variables
  382. */
  383. .align
  384. get_l2cache_base:
  385. .word omap4_get_l2cache_base
  386. kernel_flush:
  387. .word v7_flush_dcache_all
  388. ddr_start:
  389. .word PAGE_OFFSET
  390. am43xx_phys_emif_poweroff:
  391. .word (AM43XX_CM_BASE + AM43XX_PRM_DEVICE_INST + \
  392. AM43XX_PRM_EMIF_CTRL_OFFSET)
  393. am43xx_virt_mpu_pwrstctrl:
  394. .word (AM43XX_PM_MPU_PWRSTCTRL)
  395. am43xx_virt_mpu_clkstctrl:
  396. .word (AM43XX_CM_MPU_CLKSTCTRL)
  397. am43xx_virt_mpu_clkctrl:
  398. .word (AM43XX_CM_MPU_MPU_CLKCTRL)
  399. am43xx_virt_emif_clkctrl:
  400. .word (AM43XX_CM_PER_EMIF_CLKCTRL)
  401. am43xx_phys_emif_clkctrl:
  402. .word (AM43XX_CM_BASE + AM43XX_CM_PER_INST + \
  403. AM43XX_CM_PER_EMIF_CLKCTRL_OFFSET)
  404. module_disabled_val:
  405. .word 0x30000
  406. /* L2 cache related defines for AM437x */
  407. l2_cache_base:
  408. .word OMAP44XX_L2CACHE_BASE
  409. l2_smc1:
  410. .word OMAP4_MON_L2X0_PREFETCH_INDEX
  411. l2_smc2:
  412. .word OMAP4_MON_L2X0_AUXCTRL_INDEX
  413. l2_smc3:
  414. .word OMAP4_MON_L2X0_CTRL_INDEX
  415. l2_val:
  416. .word 0xffff
  417. /* DDR related defines */
  418. ENTRY(am43xx_emif_sram_table)
  419. .space EMIF_PM_FUNCTIONS_SIZE
  420. ENTRY(am43xx_pm_sram)
  421. .word am43xx_do_wfi
  422. .word am43xx_do_wfi_sz
  423. .word am43xx_resume_offset
  424. .word am43xx_emif_sram_table
  425. .word am43xx_pm_ro_sram_data
  426. resume_addr:
  427. .word cpu_resume - PAGE_OFFSET + 0x80000000
  428. ENTRY(am43xx_pm_ro_sram_data)
  429. .space AMX3_PM_RO_SRAM_DATA_SIZE
  430. ENTRY(am43xx_do_wfi_sz)
  431. .word . - am43xx_do_wfi