mem_setup.S 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. /*
  2. * Memory setup for SMDKV310 board based on S5PC210
  3. *
  4. * Copyright (C) 2011 Samsung Electronics
  5. *
  6. * See file CREDITS for list of people who contributed to this
  7. * project.
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License as
  11. * published by the Free Software Foundation; either version 2 of
  12. * the License, or (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  22. * MA 02111-1307 USA
  23. */
  24. #include <config.h>
  25. #define SET_MIU
  26. #define MEM_DLL
  27. #ifdef CONFIG_CLK_800_330_165
  28. #define DRAM_CLK_330
  29. #endif
  30. #ifdef CONFIG_CLK_1000_200_200
  31. #define DRAM_CLK_200
  32. #endif
  33. #ifdef CONFIG_CLK_1000_330_165
  34. #define DRAM_CLK_330
  35. #endif
  36. #ifdef CONFIG_CLK_1000_400_200
  37. #define DRAM_CLK_400
  38. #endif
  39. .globl mem_ctrl_asm_init
  40. mem_ctrl_asm_init:
  41. /*
  42. * Async bridge configuration at CPU_core:
  43. * 1: half_sync
  44. * 0: full_sync
  45. */
  46. ldr r0, =0x10010350
  47. mov r1, #1
  48. str r1, [r0]
  49. #ifdef SET_MIU
  50. ldr r0, =S5PC210_MIU_BASE @0x10600000
  51. #ifdef CONFIG_MIU_1BIT_INTERLEAVED
  52. ldr r1, =0x0000000c
  53. str r1, [r0, #0x400] @MIU_INTLV_CONFIG
  54. ldr r1, =0x40000000
  55. str r1, [r0, #0x808] @MIU_INTLV_START_ADDR
  56. ldr r1, =0xbfffffff
  57. str r1, [r0, #0x810] @MIU_INTLV_END_ADDR
  58. ldr r1, =0x00000001
  59. str r1, [r0, #0x800] @MIU_MAPPING_UPDATE
  60. #endif
  61. #ifdef CONFIG_MIU_2BIT_INTERLEAVED
  62. ldr r1, =0x2000150c
  63. str r1, [r0, #0x400] @MIU_INTLV_CONFIG
  64. ldr r1, =0x40000000
  65. str r1, [r0, #0x808] @MIU_INTLV_START_ADDR
  66. ldr r1, =0xbfffffff
  67. str r1, [r0, #0x810] @MIU_INTLV_END_ADDR
  68. ldr r1, =0x00000001
  69. str r1, [r0, #0x800] @MIU_MAPPING_UPDATE
  70. #endif
  71. #ifdef CONFIG_MIU_LINEAR
  72. ldr r1, =0x40000000
  73. str r1, [r0, #0x818] @MIU_SINGLE_MAPPING0_START_ADDR
  74. ldr r1, =0x7fffffff
  75. str r1, [r0, #0x820] @MIU_SINGLE_MAPPING0_END_ADDR
  76. ldr r1, =0x80000000
  77. str r1, [r0, #0x828] @MIU_SINGLE_MAPPING1_START_ADDR
  78. ldr r1, =0xbfffffff
  79. str r1, [r0, #0x830] @MIU_SINGLE_MAPPING1_END_ADDR]
  80. ldr r1, =0x00000006
  81. str r1, [r0, #0x800] @MIU_MAPPING_UPDATE
  82. #endif
  83. #endif
  84. /* DREX0 */
  85. ldr r0, =S5PC210_DMC0_BASE @0x10400000
  86. ldr r1, =0xe0000086
  87. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  88. ldr r1, =0xE3855703
  89. str r1, [r0, #0x44] @DMC_PHYZQCONTROL
  90. mov r2, #0x100000
  91. 1: subs r2, r2, #1
  92. bne 1b
  93. ldr r1, =0xe000008e
  94. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  95. ldr r1, =0xe0000086
  96. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  97. ldr r1, =0x71101008
  98. str r1, [r0, #0x18] @DMC_PHYCONTROL0
  99. ldr r1, =0x7110100A
  100. str r1, [r0, #0x18] @DMC_PHYCONTROL0
  101. ldr r1, =0xe0000086
  102. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  103. ldr r1, =0x7110100B
  104. str r1, [r0, #0x18] @DMC_PHYCONTROL0
  105. ldr r1, =0x00000000
  106. str r1, [r0, #0x20] @DMC_PHYCONTROL2
  107. ldr r1, =0x0FFF301a
  108. str r1, [r0, #0x00] @DMC_CONCONTROL
  109. ldr r1, =0x00312640
  110. str r1, [r0, #0x04] @DMC_MEMCONTROL]
  111. #ifdef MIU_LINEAR
  112. ldr r1, =0x40e01323
  113. str r1, [r0, #0x08] @DMC_MEMCONFIG0
  114. ldr r1, =0x60e01323
  115. str r1, [r0, #0x0C] @DMC_MEMCONFIG1
  116. #else /* @MIU_1BIT_INTERLEAVED | MIU_2BIT_INTERLEAVED */
  117. ldr r1, =0x20e01323
  118. str r1, [r0, #0x08] @DMC_MEMCONFIG0
  119. ldr r1, =0x40e01323
  120. str r1, [r0, #0x0C] @DMC_MEMCONFIG1
  121. #endif
  122. ldr r1, =0xff000000
  123. str r1, [r0, #0x14] @DMC_PRECHCONFIG
  124. ldr r1, =0x000000BC
  125. str r1, [r0, #0x30] @DMC_TIMINGAREF
  126. #ifdef DRAM_CLK_330
  127. ldr r1, =0x3545548d
  128. str r1, [r0, #0x34] @DMC_TIMINGROW
  129. ldr r1, =0x45430506
  130. str r1, [r0, #0x38] @DMC_TIMINGDATA
  131. ldr r1, =0x4439033c
  132. str r1, [r0, #0x3C] @DMC_TIMINGPOWER
  133. #endif
  134. #ifdef DRAM_CLK_400
  135. ldr r1, =0x4046654f
  136. str r1, [r0, #0x34] @DMC_TIMINGROW
  137. ldr r1, =0x56500506
  138. str r1, [r0, #0x38] @DMC_TIMINGDATA
  139. ldr r1, =0x5444033d
  140. str r1, [r0, #0x3C] @DMC_TIMINGPOWER
  141. #endif
  142. ldr r1, =0x07000000
  143. str r1, [r0, #0x10] @DMC_DIRECTCMD
  144. mov r2, #0x100000
  145. 2: subs r2, r2, #1
  146. bne 2b
  147. ldr r1, =0x00020000
  148. str r1, [r0, #0x10] @DMC_DIRECTCMD
  149. ldr r1, =0x00030000
  150. str r1, [r0, #0x10] @DMC_DIRECTCMD
  151. ldr r1, =0x00010002
  152. str r1, [r0, #0x10] @DMC_DIRECTCMD
  153. ldr r1, =0x00000328
  154. str r1, [r0, #0x10] @DMC_DIRECTCMD
  155. mov r2, #0x100000
  156. 3: subs r2, r2, #1
  157. bne 3b
  158. ldr r1, =0x0a000000
  159. str r1, [r0, #0x10] @DMC_DIRECTCMD
  160. mov r2, #0x100000
  161. 4: subs r2, r2, #1
  162. bne 4b
  163. ldr r1, =0x07100000
  164. str r1, [r0, #0x10] @DMC_DIRECTCMD
  165. mov r2, #0x100000
  166. 5: subs r2, r2, #1
  167. bne 5b
  168. ldr r1, =0x00120000
  169. str r1, [r0, #0x10] @DMC_DIRECTCMD
  170. ldr r1, =0x00130000
  171. str r1, [r0, #0x10] @DMC_DIRECTCMD
  172. ldr r1, =0x00110002
  173. str r1, [r0, #0x10] @DMC_DIRECTCMD
  174. ldr r1, =0x00100328
  175. str r1, [r0, #0x10] @DMC_DIRECTCMD
  176. mov r2, #0x100000
  177. 6: subs r2, r2, #1
  178. bne 6b
  179. ldr r1, =0x0a100000
  180. str r1, [r0, #0x10] @DMC_DIRECTCMD
  181. mov r2, #0x100000
  182. 7: subs r2, r2, #1
  183. bne 7b
  184. ldr r1, =0xe000008e
  185. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  186. ldr r1, =0xe0000086
  187. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  188. mov r2, #0x100000
  189. 8: subs r2, r2, #1
  190. bne 8b
  191. /* DREX1 */
  192. ldr r0, =S5PC210_DMC1_BASE @0x10410000
  193. ldr r1, =0xe0000086
  194. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  195. ldr r1, =0xE3855703
  196. str r1, [r0, #0x44] @DMC_PHYZQCONTROL
  197. mov r2, #0x100000
  198. 1: subs r2, r2, #1
  199. bne 1b
  200. ldr r1, =0xe000008e
  201. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  202. ldr r1, =0xe0000086
  203. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  204. ldr r1, =0x71101008
  205. str r1, [r0, #0x18] @DMC_PHYCONTROL0
  206. ldr r1, =0x7110100A
  207. str r1, [r0, #0x18] @DMC_PHYCONTROL0
  208. ldr r1, =0xe0000086
  209. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  210. ldr r1, =0x7110100B
  211. str r1, [r0, #0x18] @DMC_PHYCONTROL0
  212. ldr r1, =0x00000000
  213. str r1, [r0, #0x20] @DMC_PHYCONTROL2
  214. ldr r1, =0x0FFF301a
  215. str r1, [r0, #0x00] @DMC_CONCONTROL
  216. ldr r1, =0x00312640
  217. str r1, [r0, #0x04] @DMC_MEMCONTROL]
  218. #ifdef MIU_LINEAR
  219. ldr r1, =0x40e01323
  220. str r1, [r0, #0x08] @DMC_MEMCONFIG0
  221. ldr r1, =0x60e01323
  222. str r1, [r0, #0x0C] @DMC_MEMCONFIG1
  223. #else /* @MIU_1BIT_INTERLEAVED | MIU_2BIT_INTERLEAVED */
  224. ldr r1, =0x20e01323
  225. str r1, [r0, #0x08] @DMC_MEMCONFIG0
  226. ldr r1, =0x40e01323
  227. str r1, [r0, #0x0C] @DMC_MEMCONFIG1
  228. #endif
  229. ldr r1, =0xff000000
  230. str r1, [r0, #0x14] @DMC_PRECHCONFIG
  231. ldr r1, =0x000000BC
  232. str r1, [r0, #0x30] @DMC_TIMINGAREF
  233. #ifdef DRAM_CLK_330
  234. ldr r1, =0x3545548d
  235. str r1, [r0, #0x34] @DMC_TIMINGROW
  236. ldr r1, =0x45430506
  237. str r1, [r0, #0x38] @DMC_TIMINGDATA
  238. ldr r1, =0x4439033c
  239. str r1, [r0, #0x3C] @DMC_TIMINGPOWER
  240. #endif
  241. #ifdef DRAM_CLK_400
  242. ldr r1, =0x4046654f
  243. str r1, [r0, #0x34] @DMC_TIMINGROW
  244. ldr r1, =0x56500506
  245. str r1, [r0, #0x38] @DMC_TIMINGDATA
  246. ldr r1, =0x5444033d
  247. str r1, [r0, #0x3C] @DMC_TIMINGPOWER
  248. #endif
  249. ldr r1, =0x07000000
  250. str r1, [r0, #0x10] @DMC_DIRECTCMD
  251. mov r2, #0x100000
  252. 2: subs r2, r2, #1
  253. bne 2b
  254. ldr r1, =0x00020000
  255. str r1, [r0, #0x10] @DMC_DIRECTCMD
  256. ldr r1, =0x00030000
  257. str r1, [r0, #0x10] @DMC_DIRECTCMD
  258. ldr r1, =0x00010002
  259. str r1, [r0, #0x10] @DMC_DIRECTCMD
  260. ldr r1, =0x00000328
  261. str r1, [r0, #0x10] @DMC_DIRECTCMD
  262. mov r2, #0x100000
  263. 3: subs r2, r2, #1
  264. bne 3b
  265. ldr r1, =0x0a000000
  266. str r1, [r0, #0x10] @DMC_DIRECTCMD
  267. mov r2, #0x100000
  268. 4: subs r2, r2, #1
  269. bne 4b
  270. ldr r1, =0x07100000
  271. str r1, [r0, #0x10] @DMC_DIRECTCMD
  272. mov r2, #0x100000
  273. 5: subs r2, r2, #1
  274. bne 5b
  275. ldr r1, =0x00120000
  276. str r1, [r0, #0x10] @DMC_DIRECTCMD
  277. ldr r1, =0x00130000
  278. str r1, [r0, #0x10] @DMC_DIRECTCMD
  279. ldr r1, =0x00110002
  280. str r1, [r0, #0x10] @DMC_DIRECTCMD
  281. ldr r1, =0x00100328
  282. str r1, [r0, #0x10] @DMC_DIRECTCMD
  283. mov r2, #0x100000
  284. 6: subs r2, r2, #1
  285. bne 6b
  286. ldr r1, =0x0a100000
  287. str r1, [r0, #0x10] @DMC_DIRECTCMD
  288. mov r2, #0x100000
  289. 7: subs r2, r2, #1
  290. bne 7b
  291. ldr r1, =0xe000008e
  292. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  293. ldr r1, =0xe0000086
  294. str r1, [r0, #0x1C] @DMC_PHYCONTROL1
  295. mov r2, #0x100000
  296. 8: subs r2, r2, #1
  297. bne 8b
  298. /* turn on DREX0, DREX1 */
  299. ldr r0, =0x10400000 @APB_DMC_0_BASE
  300. ldr r1, =0x0FFF303a
  301. str r1, [r0, #0x00] @DMC_CONCONTROL
  302. ldr r0, =0x10410000 @APB_DMC_1_BASE
  303. ldr r1, =0x0FFF303a
  304. str r1, [r0, #0x00] @DMC_CONCONTROL
  305. mov pc, lr