lowlevel_init.S 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. /*
  2. * Board specific setup info
  3. *
  4. * (C) Copyright 2008
  5. * Texas Instruments, <www.ti.com>
  6. *
  7. * Initial Code by:
  8. * Richard Woodruff <r-woodruff2@ti.com>
  9. * Syed Mohammed Khasim <khasim@ti.com>
  10. *
  11. * SPDX-License-Identifier: GPL-2.0+
  12. */
  13. #include <config.h>
  14. #include <version.h>
  15. #include <asm/arch/mem.h>
  16. #include <asm/arch/clocks_omap3.h>
  17. #include <linux/linkage.h>
  18. #ifdef CONFIG_SPL_BUILD
  19. ENTRY(save_boot_params)
  20. ldr r4, =omap3_boot_device
  21. ldr r5, [r0, #0x4]
  22. and r5, r5, #0xff
  23. str r5, [r4]
  24. b save_boot_params_ret
  25. ENDPROC(save_boot_params)
  26. #endif
  27. /*
  28. * Funtion for making PPA HAL API calls in secure devices
  29. * Input:
  30. * R0 - Service ID
  31. * R1 - paramer list
  32. */
  33. ENTRY(do_omap3_emu_romcode_call)
  34. PUSH {r4-r12, lr} @ Save all registers from ROM code!
  35. MOV r12, r0 @ Copy the Secure Service ID in R12
  36. MOV r3, r1 @ Copy the pointer to va_list in R3
  37. MOV r1, #0 @ Process ID - 0
  38. MOV r2, #OMAP3_EMU_HAL_START_HAL_CRITICAL @ Copy the pointer
  39. @ to va_list in R3
  40. MOV r6, #0xFF @ Indicate new Task call
  41. mcr p15, 0, r0, c7, c10, 4 @ DSB
  42. mcr p15, 0, r0, c7, c10, 5 @ DMB
  43. .word 0xe1600071 @ SMC #1 to call PPA service - hand assembled
  44. @ because we use -march=armv5
  45. POP {r4-r12, pc}
  46. ENDPROC(do_omap3_emu_romcode_call)
  47. #if !defined(CONFIG_SYS_NAND_BOOT) && !defined(CONFIG_SYS_NAND_BOOT)
  48. /**************************************************************************
  49. * cpy_clk_code: relocates clock code into SRAM where its safer to execute
  50. * R1 = SRAM destination address.
  51. *************************************************************************/
  52. ENTRY(cpy_clk_code)
  53. /* Copy DPLL code into SRAM */
  54. adr r0, go_to_speed /* copy from start of go_to_speed... */
  55. adr r2, lowlevel_init /* ... up to start of low_level_init */
  56. next2:
  57. ldmia r0!, {r3 - r10} /* copy from source address [r0] */
  58. stmia r1!, {r3 - r10} /* copy to target address [r1] */
  59. cmp r0, r2 /* until source end address [r2] */
  60. blo next2
  61. mov pc, lr /* back to caller */
  62. ENDPROC(cpy_clk_code)
  63. /* ***************************************************************************
  64. * go_to_speed: -Moves to bypass, -Commits clock dividers, -puts dpll at speed
  65. * -executed from SRAM.
  66. * R0 = CM_CLKEN_PLL-bypass value
  67. * R1 = CM_CLKSEL1_PLL-m, n, and divider values
  68. * R2 = CM_CLKSEL_CORE-divider values
  69. * R3 = CM_IDLEST_CKGEN - addr dpll lock wait
  70. *
  71. * Note: If core unlocks/relocks and SDRAM is running fast already it gets
  72. * confused. A reset of the controller gets it back. Taking away its
  73. * L3 when its not in self refresh seems bad for it. Normally, this
  74. * code runs from flash before SDR is init so that should be ok.
  75. ****************************************************************************/
  76. ENTRY(go_to_speed)
  77. stmfd sp!, {r4 - r6}
  78. /* move into fast relock bypass */
  79. ldr r4, pll_ctl_add
  80. str r0, [r4]
  81. wait1:
  82. ldr r5, [r3] /* get status */
  83. and r5, r5, #0x1 /* isolate core status */
  84. cmp r5, #0x1 /* still locked? */
  85. beq wait1 /* if lock, loop */
  86. /* set new dpll dividers _after_ in bypass */
  87. ldr r5, pll_div_add1
  88. str r1, [r5] /* set m, n, m2 */
  89. ldr r5, pll_div_add2
  90. str r2, [r5] /* set l3/l4/.. dividers*/
  91. ldr r5, pll_div_add3 /* wkup */
  92. ldr r2, pll_div_val3 /* rsm val */
  93. str r2, [r5]
  94. ldr r5, pll_div_add4 /* gfx */
  95. ldr r2, pll_div_val4
  96. str r2, [r5]
  97. ldr r5, pll_div_add5 /* emu */
  98. ldr r2, pll_div_val5
  99. str r2, [r5]
  100. /* now prepare GPMC (flash) for new dpll speed */
  101. /* flash needs to be stable when we jump back to it */
  102. ldr r5, flash_cfg3_addr
  103. ldr r2, flash_cfg3_val
  104. str r2, [r5]
  105. ldr r5, flash_cfg4_addr
  106. ldr r2, flash_cfg4_val
  107. str r2, [r5]
  108. ldr r5, flash_cfg5_addr
  109. ldr r2, flash_cfg5_val
  110. str r2, [r5]
  111. ldr r5, flash_cfg1_addr
  112. ldr r2, [r5]
  113. orr r2, r2, #0x3 /* up gpmc divider */
  114. str r2, [r5]
  115. /* lock DPLL3 and wait a bit */
  116. orr r0, r0, #0x7 /* set up for lock mode */
  117. str r0, [r4] /* lock */
  118. nop /* ARM slow at this point working at sys_clk */
  119. nop
  120. nop
  121. nop
  122. wait2:
  123. ldr r5, [r3] /* get status */
  124. and r5, r5, #0x1 /* isolate core status */
  125. cmp r5, #0x1 /* still locked? */
  126. bne wait2 /* if lock, loop */
  127. nop
  128. nop
  129. nop
  130. nop
  131. ldmfd sp!, {r4 - r6}
  132. mov pc, lr /* back to caller, locked */
  133. ENDPROC(go_to_speed)
  134. _go_to_speed: .word go_to_speed
  135. /* these constants need to be close for PIC code */
  136. /* The Nor has to be in the Flash Base CS0 for this condition to happen */
  137. flash_cfg1_addr:
  138. .word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG1)
  139. flash_cfg3_addr:
  140. .word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG3)
  141. flash_cfg3_val:
  142. .word STNOR_GPMC_CONFIG3
  143. flash_cfg4_addr:
  144. .word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG4)
  145. flash_cfg4_val:
  146. .word STNOR_GPMC_CONFIG4
  147. flash_cfg5_val:
  148. .word STNOR_GPMC_CONFIG5
  149. flash_cfg5_addr:
  150. .word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG5)
  151. pll_ctl_add:
  152. .word CM_CLKEN_PLL
  153. pll_div_add1:
  154. .word CM_CLKSEL1_PLL
  155. pll_div_add2:
  156. .word CM_CLKSEL_CORE
  157. pll_div_add3:
  158. .word CM_CLKSEL_WKUP
  159. pll_div_val3:
  160. .word (WKUP_RSM << 1)
  161. pll_div_add4:
  162. .word CM_CLKSEL_GFX
  163. pll_div_val4:
  164. .word (GFX_DIV << 0)
  165. pll_div_add5:
  166. .word CM_CLKSEL1_EMU
  167. pll_div_val5:
  168. .word CLSEL1_EMU_VAL
  169. #endif
  170. ENTRY(lowlevel_init)
  171. ldr sp, SRAM_STACK
  172. str ip, [sp] /* stash ip register */
  173. mov ip, lr /* save link reg across call */
  174. #if !defined(CONFIG_SYS_NAND_BOOT) && !defined(CONFIG_SYS_ONENAND_BOOT)
  175. /*
  176. * No need to copy/exec the clock code - DPLL adjust already done
  177. * in NAND/oneNAND Boot.
  178. */
  179. ldr r1, =SRAM_CLK_CODE
  180. bl cpy_clk_code
  181. #endif /* NAND Boot */
  182. mov lr, ip /* restore link reg */
  183. ldr ip, [sp] /* restore save ip */
  184. /* tail-call s_init to setup pll, mux, memory */
  185. b s_init
  186. ENDPROC(lowlevel_init)
  187. /* the literal pools origin */
  188. .ltorg
  189. REG_CONTROL_STATUS:
  190. .word CONTROL_STATUS
  191. SRAM_STACK:
  192. .word LOW_LEVEL_SRAM_STACK
  193. /* DPLL(1-4) PARAM TABLES */
  194. /*
  195. * Each of the tables has M, N, FREQSEL, M2 values defined for nominal
  196. * OPP (1.2V). The fields are defined according to dpll_param struct (clock.c).
  197. * The values are defined for all possible sysclk and for ES1 and ES2.
  198. */
  199. mpu_dpll_param:
  200. /* 12MHz */
  201. /* ES1 */
  202. .word MPU_M_12_ES1, MPU_N_12_ES1, MPU_FSEL_12_ES1, MPU_M2_12_ES1
  203. /* ES2 */
  204. .word MPU_M_12_ES2, MPU_N_12_ES2, MPU_FSEL_12_ES2, MPU_M2_ES2
  205. /* 3410 */
  206. .word MPU_M_12, MPU_N_12, MPU_FSEL_12, MPU_M2_12
  207. /* 13MHz */
  208. /* ES1 */
  209. .word MPU_M_13_ES1, MPU_N_13_ES1, MPU_FSEL_13_ES1, MPU_M2_13_ES1
  210. /* ES2 */
  211. .word MPU_M_13_ES2, MPU_N_13_ES2, MPU_FSEL_13_ES2, MPU_M2_13_ES2
  212. /* 3410 */
  213. .word MPU_M_13, MPU_N_13, MPU_FSEL_13, MPU_M2_13
  214. /* 19.2MHz */
  215. /* ES1 */
  216. .word MPU_M_19P2_ES1, MPU_N_19P2_ES1, MPU_FSEL_19P2_ES1, MPU_M2_19P2_ES1
  217. /* ES2 */
  218. .word MPU_M_19P2_ES2, MPU_N_19P2_ES2, MPU_FSEL_19P2_ES2, MPU_M2_19P2_ES2
  219. /* 3410 */
  220. .word MPU_M_19P2, MPU_N_19P2, MPU_FSEL_19P2, MPU_M2_19P2
  221. /* 26MHz */
  222. /* ES1 */
  223. .word MPU_M_26_ES1, MPU_N_26_ES1, MPU_FSEL_26_ES1, MPU_M2_26_ES1
  224. /* ES2 */
  225. .word MPU_M_26_ES2, MPU_N_26_ES2, MPU_FSEL_26_ES2, MPU_M2_26_ES2
  226. /* 3410 */
  227. .word MPU_M_26, MPU_N_26, MPU_FSEL_26, MPU_M2_26
  228. /* 38.4MHz */
  229. /* ES1 */
  230. .word MPU_M_38P4_ES1, MPU_N_38P4_ES1, MPU_FSEL_38P4_ES1, MPU_M2_38P4_ES1
  231. /* ES2 */
  232. .word MPU_M_38P4_ES2, MPU_N_38P4_ES2, MPU_FSEL_38P4_ES2, MPU_M2_38P4_ES2
  233. /* 3410 */
  234. .word MPU_M_38P4, MPU_N_38P4, MPU_FSEL_38P4, MPU_M2_38P4
  235. .globl get_mpu_dpll_param
  236. get_mpu_dpll_param:
  237. adr r0, mpu_dpll_param
  238. mov pc, lr
  239. iva_dpll_param:
  240. /* 12MHz */
  241. /* ES1 */
  242. .word IVA_M_12_ES1, IVA_N_12_ES1, IVA_FSEL_12_ES1, IVA_M2_12_ES1
  243. /* ES2 */
  244. .word IVA_M_12_ES2, IVA_N_12_ES2, IVA_FSEL_12_ES2, IVA_M2_12_ES2
  245. /* 3410 */
  246. .word IVA_M_12, IVA_N_12, IVA_FSEL_12, IVA_M2_12
  247. /* 13MHz */
  248. /* ES1 */
  249. .word IVA_M_13_ES1, IVA_N_13_ES1, IVA_FSEL_13_ES1, IVA_M2_13_ES1
  250. /* ES2 */
  251. .word IVA_M_13_ES2, IVA_N_13_ES2, IVA_FSEL_13_ES2, IVA_M2_13_ES2
  252. /* 3410 */
  253. .word IVA_M_13, IVA_N_13, IVA_FSEL_13, IVA_M2_13
  254. /* 19.2MHz */
  255. /* ES1 */
  256. .word IVA_M_19P2_ES1, IVA_N_19P2_ES1, IVA_FSEL_19P2_ES1, IVA_M2_19P2_ES1
  257. /* ES2 */
  258. .word IVA_M_19P2_ES2, IVA_N_19P2_ES2, IVA_FSEL_19P2_ES2, IVA_M2_19P2_ES2
  259. /* 3410 */
  260. .word IVA_M_19P2, IVA_N_19P2, IVA_FSEL_19P2, IVA_M2_19P2
  261. /* 26MHz */
  262. /* ES1 */
  263. .word IVA_M_26_ES1, IVA_N_26_ES1, IVA_FSEL_26_ES1, IVA_M2_26_ES1
  264. /* ES2 */
  265. .word IVA_M_26_ES2, IVA_N_26_ES2, IVA_FSEL_26_ES2, IVA_M2_26_ES2
  266. /* 3410 */
  267. .word IVA_M_26, IVA_N_26, IVA_FSEL_26, IVA_M2_26
  268. /* 38.4MHz */
  269. /* ES1 */
  270. .word IVA_M_38P4_ES1, IVA_N_38P4_ES1, IVA_FSEL_38P4_ES1, IVA_M2_38P4_ES1
  271. /* ES2 */
  272. .word IVA_M_38P4_ES2, IVA_N_38P4_ES2, IVA_FSEL_38P4_ES2, IVA_M2_38P4_ES2
  273. /* 3410 */
  274. .word IVA_M_38P4, IVA_N_38P4, IVA_FSEL_38P4, IVA_M2_38P4
  275. .globl get_iva_dpll_param
  276. get_iva_dpll_param:
  277. adr r0, iva_dpll_param
  278. mov pc, lr
  279. /* Core DPLL targets for L3 at 166 & L133 */
  280. core_dpll_param:
  281. /* 12MHz */
  282. /* ES1 */
  283. .word CORE_M_12_ES1, CORE_N_12_ES1, CORE_FSL_12_ES1, CORE_M2_12_ES1
  284. /* ES2 */
  285. .word CORE_M_12, CORE_N_12, CORE_FSEL_12, CORE_M2_12
  286. /* 3410 */
  287. .word CORE_M_12, CORE_N_12, CORE_FSEL_12, CORE_M2_12
  288. /* 13MHz */
  289. /* ES1 */
  290. .word CORE_M_13_ES1, CORE_N_13_ES1, CORE_FSL_13_ES1, CORE_M2_13_ES1
  291. /* ES2 */
  292. .word CORE_M_13, CORE_N_13, CORE_FSEL_13, CORE_M2_13
  293. /* 3410 */
  294. .word CORE_M_13, CORE_N_13, CORE_FSEL_13, CORE_M2_13
  295. /* 19.2MHz */
  296. /* ES1 */
  297. .word CORE_M_19P2_ES1, CORE_N_19P2_ES1, CORE_FSL_19P2_ES1, CORE_M2_19P2_ES1
  298. /* ES2 */
  299. .word CORE_M_19P2, CORE_N_19P2, CORE_FSEL_19P2, CORE_M2_19P2
  300. /* 3410 */
  301. .word CORE_M_19P2, CORE_N_19P2, CORE_FSEL_19P2, CORE_M2_19P2
  302. /* 26MHz */
  303. /* ES1 */
  304. .word CORE_M_26_ES1, CORE_N_26_ES1, CORE_FSL_26_ES1, CORE_M2_26_ES1
  305. /* ES2 */
  306. .word CORE_M_26, CORE_N_26, CORE_FSEL_26, CORE_M2_26
  307. /* 3410 */
  308. .word CORE_M_26, CORE_N_26, CORE_FSEL_26, CORE_M2_26
  309. /* 38.4MHz */
  310. /* ES1 */
  311. .word CORE_M_38P4_ES1, CORE_N_38P4_ES1, CORE_FSL_38P4_ES1, CORE_M2_38P4_ES1
  312. /* ES2 */
  313. .word CORE_M_38P4, CORE_N_38P4, CORE_FSEL_38P4, CORE_M2_38P4
  314. /* 3410 */
  315. .word CORE_M_38P4, CORE_N_38P4, CORE_FSEL_38P4, CORE_M2_38P4
  316. .globl get_core_dpll_param
  317. get_core_dpll_param:
  318. adr r0, core_dpll_param
  319. mov pc, lr
  320. /* PER DPLL values are same for both ES1 and ES2 */
  321. per_dpll_param:
  322. /* 12MHz */
  323. .word PER_M_12, PER_N_12, PER_FSEL_12, PER_M2_12
  324. /* 13MHz */
  325. .word PER_M_13, PER_N_13, PER_FSEL_13, PER_M2_13
  326. /* 19.2MHz */
  327. .word PER_M_19P2, PER_N_19P2, PER_FSEL_19P2, PER_M2_19P2
  328. /* 26MHz */
  329. .word PER_M_26, PER_N_26, PER_FSEL_26, PER_M2_26
  330. /* 38.4MHz */
  331. .word PER_M_38P4, PER_N_38P4, PER_FSEL_38P4, PER_M2_38P4
  332. .globl get_per_dpll_param
  333. get_per_dpll_param:
  334. adr r0, per_dpll_param
  335. mov pc, lr
  336. /* PER2 DPLL values */
  337. per2_dpll_param:
  338. /* 12MHz */
  339. .word PER2_M_12, PER2_N_12, PER2_FSEL_12, PER2_M2_12
  340. /* 13MHz */
  341. .word PER2_M_13, PER2_N_13, PER2_FSEL_13, PER2_M2_13
  342. /* 19.2MHz */
  343. .word PER2_M_19P2, PER2_N_19P2, PER2_FSEL_19P2, PER2_M2_19P2
  344. /* 26MHz */
  345. .word PER2_M_26, PER2_N_26, PER2_FSEL_26, PER2_M2_26
  346. /* 38.4MHz */
  347. .word PER2_M_38P4, PER2_N_38P4, PER2_FSEL_38P4, PER2_M2_38P4
  348. .globl get_per2_dpll_param
  349. get_per2_dpll_param:
  350. adr r0, per2_dpll_param
  351. mov pc, lr
  352. /*
  353. * Tables for 36XX/37XX devices
  354. *
  355. */
  356. mpu_36x_dpll_param:
  357. /* 12MHz */
  358. .word 50, 0, 0, 1
  359. /* 13MHz */
  360. .word 600, 12, 0, 1
  361. /* 19.2MHz */
  362. .word 125, 3, 0, 1
  363. /* 26MHz */
  364. .word 300, 12, 0, 1
  365. /* 38.4MHz */
  366. .word 125, 7, 0, 1
  367. iva_36x_dpll_param:
  368. /* 12MHz */
  369. .word 130, 2, 0, 1
  370. /* 13MHz */
  371. .word 20, 0, 0, 1
  372. /* 19.2MHz */
  373. .word 325, 11, 0, 1
  374. /* 26MHz */
  375. .word 10, 0, 0, 1
  376. /* 38.4MHz */
  377. .word 325, 23, 0, 1
  378. core_36x_dpll_param:
  379. /* 12MHz */
  380. .word 100, 2, 0, 1
  381. /* 13MHz */
  382. .word 400, 12, 0, 1
  383. /* 19.2MHz */
  384. .word 375, 17, 0, 1
  385. /* 26MHz */
  386. .word 200, 12, 0, 1
  387. /* 38.4MHz */
  388. .word 375, 35, 0, 1
  389. per_36x_dpll_param:
  390. /* SYSCLK M N M2 M3 M4 M5 M6 m2DIV */
  391. .word 12000, 360, 4, 9, 16, 5, 4, 3, 1
  392. .word 13000, 864, 12, 9, 16, 9, 4, 3, 1
  393. .word 19200, 360, 7, 9, 16, 5, 4, 3, 1
  394. .word 26000, 432, 12, 9, 16, 9, 4, 3, 1
  395. .word 38400, 360, 15, 9, 16, 5, 4, 3, 1
  396. per2_36x_dpll_param:
  397. /* 12MHz */
  398. .word PER2_36XX_M_12, PER2_36XX_N_12, 0, PER2_36XX_M2_12
  399. /* 13MHz */
  400. .word PER2_36XX_M_13, PER2_36XX_N_13, 0, PER2_36XX_M2_13
  401. /* 19.2MHz */
  402. .word PER2_36XX_M_19P2, PER2_36XX_N_19P2, 0, PER2_36XX_M2_19P2
  403. /* 26MHz */
  404. .word PER2_36XX_M_26, PER2_36XX_N_26, 0, PER2_36XX_M2_26
  405. /* 38.4MHz */
  406. .word PER2_36XX_M_38P4, PER2_36XX_N_38P4, 0, PER2_36XX_M2_38P4
  407. ENTRY(get_36x_mpu_dpll_param)
  408. adr r0, mpu_36x_dpll_param
  409. mov pc, lr
  410. ENDPROC(get_36x_mpu_dpll_param)
  411. ENTRY(get_36x_iva_dpll_param)
  412. adr r0, iva_36x_dpll_param
  413. mov pc, lr
  414. ENDPROC(get_36x_iva_dpll_param)
  415. ENTRY(get_36x_core_dpll_param)
  416. adr r0, core_36x_dpll_param
  417. mov pc, lr
  418. ENDPROC(get_36x_core_dpll_param)
  419. ENTRY(get_36x_per_dpll_param)
  420. adr r0, per_36x_dpll_param
  421. mov pc, lr
  422. ENDPROC(get_36x_per_dpll_param)
  423. ENTRY(get_36x_per2_dpll_param)
  424. adr r0, per2_36x_dpll_param
  425. mov pc, lr
  426. ENDPROC(get_36x_per2_dpll_param)