lowlevel_init.S 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. /*
  2. * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
  3. *
  4. * (C) Copyright 2008-2010 Freescale Semiconductor, Inc.
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License as
  8. * published by the Free Software Foundation; either version 2 of
  9. * the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  19. * MA 02111-1307 USA
  20. */
  21. #include <config.h>
  22. #include <asm/arch/imx-regs.h>
  23. #include <generated/asm-offsets.h>
  24. #include "mx35pdk.h"
  25. /*
  26. * return soc version
  27. * 0x10: TO1
  28. * 0x20: TO2
  29. * 0x30: TO3
  30. */
  31. .macro check_soc_version ret, tmp
  32. ldr \tmp, =IIM_BASE_ADDR
  33. ldr \ret, [\tmp, #IIM_SREV]
  34. cmp \ret, #0x00
  35. moveq \tmp, #ROMPATCH_REV
  36. ldreq \ret, [\tmp]
  37. moveq \ret, \ret, lsl #4
  38. addne \ret, \ret, #0x10
  39. .endm
  40. /*
  41. * AIPS setup - Only setup MPROTx registers.
  42. * The PACR default values are good.
  43. */
  44. .macro init_aips
  45. /*
  46. * Set all MPROTx to be non-bufferable, trusted for R/W,
  47. * not forced to user-mode.
  48. */
  49. ldr r0, =AIPS1_BASE_ADDR
  50. ldr r1, =AIPS_MPR_CONFIG
  51. str r1, [r0, #0x00]
  52. str r1, [r0, #0x04]
  53. ldr r0, =AIPS2_BASE_ADDR
  54. str r1, [r0, #0x00]
  55. str r1, [r0, #0x04]
  56. /*
  57. * Clear the on and off peripheral modules Supervisor Protect bit
  58. * for SDMA to access them. Did not change the AIPS control registers
  59. * (offset 0x20) access type
  60. */
  61. ldr r0, =AIPS1_BASE_ADDR
  62. ldr r1, =AIPS_OPACR_CONFIG
  63. str r1, [r0, #0x40]
  64. str r1, [r0, #0x44]
  65. str r1, [r0, #0x48]
  66. str r1, [r0, #0x4C]
  67. str r1, [r0, #0x50]
  68. ldr r0, =AIPS2_BASE_ADDR
  69. str r1, [r0, #0x40]
  70. str r1, [r0, #0x44]
  71. str r1, [r0, #0x48]
  72. str r1, [r0, #0x4C]
  73. str r1, [r0, #0x50]
  74. .endm
  75. /* MAX (Multi-Layer AHB Crossbar Switch) setup */
  76. .macro init_max
  77. ldr r0, =MAX_BASE_ADDR
  78. /* MPR - priority is M4 > M2 > M3 > M5 > M0 > M1 */
  79. ldr r1, =MAX_MPR_CONFIG
  80. str r1, [r0, #0x000] /* for S0 */
  81. str r1, [r0, #0x100] /* for S1 */
  82. str r1, [r0, #0x200] /* for S2 */
  83. str r1, [r0, #0x300] /* for S3 */
  84. str r1, [r0, #0x400] /* for S4 */
  85. /* SGPCR - always park on last master */
  86. ldr r1, =MAX_SGPCR_CONFIG
  87. str r1, [r0, #0x010] /* for S0 */
  88. str r1, [r0, #0x110] /* for S1 */
  89. str r1, [r0, #0x210] /* for S2 */
  90. str r1, [r0, #0x310] /* for S3 */
  91. str r1, [r0, #0x410] /* for S4 */
  92. /* MGPCR - restore default values */
  93. ldr r1, =MAX_MGPCR_CONFIG
  94. str r1, [r0, #0x800] /* for M0 */
  95. str r1, [r0, #0x900] /* for M1 */
  96. str r1, [r0, #0xA00] /* for M2 */
  97. str r1, [r0, #0xB00] /* for M3 */
  98. str r1, [r0, #0xC00] /* for M4 */
  99. str r1, [r0, #0xD00] /* for M5 */
  100. .endm
  101. /* M3IF setup */
  102. .macro init_m3if
  103. /* Configure M3IF registers */
  104. ldr r1, =M3IF_BASE_ADDR
  105. /*
  106. * M3IF Control Register (M3IFCTL)
  107. * MRRP[0] = L2CC0 not on priority list (0 << 0) = 0x00000000
  108. * MRRP[1] = L2CC1 not on priority list (0 << 0) = 0x00000000
  109. * MRRP[2] = MBX not on priority list (0 << 0) = 0x00000000
  110. * MRRP[3] = MAX1 not on priority list (0 << 0) = 0x00000000
  111. * MRRP[4] = SDMA not on priority list (0 << 0) = 0x00000000
  112. * MRRP[5] = MPEG4 not on priority list (0 << 0) = 0x00000000
  113. * MRRP[6] = IPU1 on priority list (1 << 6) = 0x00000040
  114. * MRRP[7] = IPU2 not on priority list (0 << 0) = 0x00000000
  115. * ------------
  116. * 0x00000040
  117. */
  118. ldr r0, =M3IF_CONFIG
  119. str r0, [r1] /* M3IF control reg */
  120. .endm
  121. /* CPLD on CS5 setup */
  122. .macro init_debug_board
  123. ldr r0, =DBG_BASE_ADDR
  124. ldr r1, =DBG_CSCR_U_CONFIG
  125. str r1, [r0, #0x00]
  126. ldr r1, =DBG_CSCR_L_CONFIG
  127. str r1, [r0, #0x04]
  128. ldr r1, =DBG_CSCR_A_CONFIG
  129. str r1, [r0, #0x08]
  130. .endm
  131. /* clock setup */
  132. .macro init_clock
  133. ldr r0, =CCM_BASE_ADDR
  134. /* default CLKO to 1/32 of the ARM core*/
  135. ldr r1, [r0, #CLKCTL_COSR]
  136. bic r1, r1, #0x00000FF00
  137. bic r1, r1, #0x0000000FF
  138. mov r2, #0x00006C00
  139. add r2, r2, #0x67
  140. orr r1, r1, r2
  141. str r1, [r0, #CLKCTL_COSR]
  142. ldr r2, =CCM_CCMR_CONFIG
  143. str r2, [r0, #CLKCTL_CCMR]
  144. check_soc_version r1, r2
  145. cmp r1, #CHIP_REV_2_0
  146. ldrhs r3, =CCM_MPLL_532_HZ
  147. bhs 1f
  148. ldr r2, [r0, #CLKCTL_PDR0]
  149. tst r2, #CLKMODE_CONSUMER
  150. ldrne r3, =CCM_MPLL_532_HZ /* consumer path*/
  151. ldreq r3, =CCM_MPLL_399_HZ /* auto path*/
  152. 1:
  153. str r3, [r0, #CLKCTL_MPCTL]
  154. ldr r1, =CCM_PPLL_300_HZ
  155. str r1, [r0, #CLKCTL_PPCTL]
  156. ldr r1, =CCM_PDR0_CONFIG
  157. bic r1, r1, #0x800000
  158. str r1, [r0, #CLKCTL_PDR0]
  159. ldr r1, [r0, #CLKCTL_CGR0]
  160. orr r1, r1, #0x0C300000
  161. str r1, [r0, #CLKCTL_CGR0]
  162. ldr r1, [r0, #CLKCTL_CGR1]
  163. orr r1, r1, #0x00000C00
  164. orr r1, r1, #0x00000003
  165. str r1, [r0, #CLKCTL_CGR1]
  166. .endm
  167. .macro setup_sdram
  168. ldr r0, =ESDCTL_BASE_ADDR
  169. mov r3, #0x2000
  170. str r3, [r0, #0x0]
  171. str r3, [r0, #0x8]
  172. /*ip(r12) has used to save lr register in upper calling*/
  173. mov fp, lr
  174. mov r5, #0x00
  175. mov r2, #0x00
  176. mov r1, #CSD0_BASE_ADDR
  177. bl setup_sdram_bank
  178. mov r5, #0x00
  179. mov r2, #0x00
  180. mov r1, #CSD1_BASE_ADDR
  181. bl setup_sdram_bank
  182. mov lr, fp
  183. 1:
  184. ldr r3, =ESDCTL_DELAY_LINE5
  185. str r3, [r0, #0x30]
  186. .endm
  187. .globl lowlevel_init
  188. lowlevel_init:
  189. mov r10, lr
  190. mrc 15, 0, r1, c1, c0, 0
  191. mrc 15, 0, r0, c1, c0, 1
  192. orr r0, r0, #7
  193. mcr 15, 0, r0, c1, c0, 1
  194. orr r1, r1, #(1<<11)
  195. /* Set unaligned access enable */
  196. orr r1, r1, #(1<<22)
  197. /* Set low int latency enable */
  198. orr r1, r1, #(1<<21)
  199. mcr 15, 0, r1, c1, c0, 0
  200. mov r0, #0
  201. /* Set branch prediction enable */
  202. mcr 15, 0, r0, c15, c2, 4
  203. mcr 15, 0, r0, c7, c7, 0 /* invalidate I cache and D cache */
  204. mcr 15, 0, r0, c8, c7, 0 /* invalidate TLBs */
  205. mcr 15, 0, r0, c7, c10, 4 /* Drain the write buffer */
  206. /*
  207. * initializes very early AIPS
  208. * Then it also initializes Multi-Layer AHB Crossbar Switch,
  209. * M3IF
  210. * Also setup the Peripheral Port Remap register inside the core
  211. */
  212. ldr r0, =0x40000015 /* start from AIPS 2GB region */
  213. mcr p15, 0, r0, c15, c2, 4
  214. init_aips
  215. init_max
  216. init_m3if
  217. init_clock
  218. init_debug_board
  219. cmp pc, #PHYS_SDRAM_1
  220. blo init_sdram_start
  221. cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE)
  222. blo skip_sdram_setup
  223. init_sdram_start:
  224. /*init_sdram*/
  225. setup_sdram
  226. skip_sdram_setup:
  227. mov lr, r10
  228. mov pc, lr
  229. /*
  230. * r0: ESDCTL control base, r1: sdram slot base
  231. * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base
  232. */
  233. setup_sdram_bank:
  234. mov r3, #0xE
  235. tst r2, #0x1
  236. orreq r3, r3, #0x300 /*DDR2*/
  237. str r3, [r0, #0x10]
  238. bic r3, r3, #0x00A
  239. str r3, [r0, #0x10]
  240. beq 2f
  241. mov r3, #0x20000
  242. 1: subs r3, r3, #1
  243. bne 1b
  244. 2: tst r2, #0x1
  245. ldreq r3, =ESDCTL_DDR2_CONFIG
  246. ldrne r3, =ESDCTL_MDDR_CONFIG
  247. cmp r1, #CSD1_BASE_ADDR
  248. strlo r3, [r0, #0x4]
  249. strhs r3, [r0, #0xC]
  250. ldr r3, =ESDCTL_0x92220000
  251. strlo r3, [r0, #0x0]
  252. strhs r3, [r0, #0x8]
  253. mov r3, #0xDA
  254. ldr r4, =ESDCTL_PRECHARGE
  255. strb r3, [r1, r4]
  256. tst r2, #0x1
  257. bne skip_set_mode
  258. cmp r1, #CSD1_BASE_ADDR
  259. ldr r3, =ESDCTL_0xB2220000
  260. strlo r3, [r0, #0x0]
  261. strhs r3, [r0, #0x8]
  262. mov r3, #0xDA
  263. ldr r4, =ESDCTL_DDR2_EMR2
  264. strb r3, [r1, r4]
  265. ldr r4, =ESDCTL_DDR2_EMR3
  266. strb r3, [r1, r4]
  267. ldr r4, =ESDCTL_DDR2_EN_DLL
  268. strb r3, [r1, r4]
  269. ldr r4, =ESDCTL_DDR2_RESET_DLL
  270. strb r3, [r1, r4]
  271. ldr r3, =ESDCTL_0x92220000
  272. strlo r3, [r0, #0x0]
  273. strhs r3, [r0, #0x8]
  274. mov r3, #0xDA
  275. ldr r4, =ESDCTL_PRECHARGE
  276. strb r3, [r1, r4]
  277. skip_set_mode:
  278. cmp r1, #CSD1_BASE_ADDR
  279. ldr r3, =ESDCTL_0xA2220000
  280. strlo r3, [r0, #0x0]
  281. strhs r3, [r0, #0x8]
  282. mov r3, #0xDA
  283. strb r3, [r1]
  284. strb r3, [r1]
  285. ldr r3, =ESDCTL_0xB2220000
  286. strlo r3, [r0, #0x0]
  287. strhs r3, [r0, #0x8]
  288. tst r2, #0x1
  289. ldreq r4, =ESDCTL_DDR2_MR
  290. ldrne r4, =ESDCTL_MDDR_MR
  291. mov r3, #0xDA
  292. strb r3, [r1, r4]
  293. ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT
  294. streqb r3, [r1, r4]
  295. ldreq r4, =ESDCTL_DDR2_EN_DLL
  296. ldrne r4, =ESDCTL_MDDR_EMR
  297. strb r3, [r1, r4]
  298. cmp r1, #CSD1_BASE_ADDR
  299. ldr r3, =ESDCTL_0x82228080
  300. strlo r3, [r0, #0x0]
  301. strhs r3, [r0, #0x8]
  302. tst r2, #0x1
  303. moveq r4, #0x20000
  304. movne r4, #0x200
  305. 1: subs r4, r4, #1
  306. bne 1b
  307. str r3, [r1, #0x100]
  308. ldr r4, [r1, #0x100]
  309. cmp r3, r4
  310. movne r3, #1
  311. moveq r3, #0
  312. mov pc, lr