mem_setup.S 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /*
  2. * Copyright (C) 2009 Samsung Electrnoics
  3. * Minkyu Kang <mk7.kang@samsung.com>
  4. * Kyungmin Park <kyungmin.park@samsung.com>
  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. .globl mem_ctrl_asm_init
  26. mem_ctrl_asm_init:
  27. cmp r7, r8
  28. ldreq r0, =S5PC100_DMC_BASE @ 0xE6000000
  29. ldrne r0, =S5PC110_DMC0_BASE @ 0xF0000000
  30. ldrne r6, =S5PC110_DMC1_BASE @ 0xF1400000
  31. /* DLL parameter setting */
  32. ldr r1, =0x50101000
  33. str r1, [r0, #0x018] @ PHYCONTROL0_OFFSET
  34. strne r1, [r6, #0x018] @ PHYCONTROL0_OFFSET
  35. ldr r1, =0x000000f4
  36. str r1, [r0, #0x01C] @ PHYCONTROL1_OFFSET
  37. strne r1, [r6, #0x01C] @ PHYCONTROL1_OFFSET
  38. ldreq r1, =0x0
  39. streq r1, [r0, #0x020] @ PHYCONTROL2_OFFSET
  40. /* DLL on */
  41. ldr r1, =0x50101002
  42. str r1, [r0, #0x018] @ PHYCONTROL0_OFFSET
  43. strne r1, [r6, #0x018] @ PHYCONTROL0_OFFSET
  44. /* DLL start */
  45. ldr r1, =0x50101003
  46. str r1, [r0, #0x018] @ PHYCONTROL0_OFFSET
  47. strne r1, [r6, #0x018] @ PHYCONTROL0_OFFSET
  48. mov r2, #0x4000
  49. wait: subs r2, r2, #0x1
  50. cmp r2, #0x0
  51. bne wait
  52. cmp r7, r8
  53. /* Force value locking for DLL off */
  54. str r1, [r0, #0x018] @ PHYCONTROL0_OFFSET
  55. strne r1, [r6, #0x018] @ PHYCONTROL0_OFFSET
  56. /* DLL off */
  57. ldr r1, =0x50101009
  58. str r1, [r0, #0x018] @ PHYCONTROL0_OFFSET
  59. strne r1, [r6, #0x018] @ PHYCONTROL0_OFFSET
  60. /* auto refresh off */
  61. ldr r1, =0xff001010 | (1 << 7)
  62. ldr r2, =0xff001010 | (1 << 7)
  63. str r1, [r0, #0x000] @ CONCONTROL_OFFSET
  64. strne r2, [r6, #0x000] @ CONCONTROL_OFFSET
  65. /*
  66. * Burst Length 4, 2 chips, 32-bit, LPDDR
  67. * OFF: dynamic self refresh, force precharge, dynamic power down off
  68. */
  69. ldr r1, =0x00212100
  70. ldr r2, =0x00212100
  71. str r1, [r0, #0x004] @ MEMCONTROL_OFFSET
  72. strne r2, [r6, #0x004] @ MEMCONTROL_OFFSET
  73. /*
  74. * Note:
  75. * If Bank0 has Mobile RAM we place it at 0x3800'0000 (s5pc100 only)
  76. * So finally Bank1 OneDRAM should address start at at 0x3000'0000
  77. */
  78. /*
  79. * DMC0: CS0 : S5PC100/S5PC110
  80. * 0x30 -> 0x30000000
  81. * 0xf8 -> 0x37FFFFFF
  82. * [15:12] 0: Linear
  83. * [11:8 ] 2: 9 bits
  84. * [ 7:4 ] 2: 14 bits
  85. * [ 3:0 ] 2: 4 banks
  86. */
  87. ldr r3, =0x30f80222
  88. ldr r4, =0x40f00222
  89. swap_memory:
  90. str r3, [r0, #0x008] @ MEMCONFIG0_OFFSET
  91. str r4, [r0, #0x00C] @ dummy write
  92. /*
  93. * DMC1: CS0 : S5PC110
  94. * 0x40 -> 0x40000000
  95. * 0xf8 -> 0x47FFFFFF (1Gib)
  96. * 0x40 -> 0x40000000
  97. * 0xf0 -> 0x4FFFFFFF (2Gib)
  98. * [15:12] 0: Linear
  99. * [11:8 ] 2: 9 bits - Col (1Gib)
  100. * [11:8 ] 3: 10 bits - Col (2Gib)
  101. * [ 7:4 ] 2: 14 bits - Row
  102. * [ 3:0 ] 2: 4 banks
  103. */
  104. /* Default : 2GiB */
  105. ldr r4, =0x40f01322 @ 2Gib: MCP B
  106. ldr r5, =0x50f81312 @ dummy: MCP D
  107. cmp r9, #1
  108. ldreq r4, =0x40f81222 @ 1Gib: MCP A
  109. cmp r9, #3
  110. ldreq r5, =0x50f81312 @ 2Gib + 1Gib: MCP D
  111. cmp r9, #4
  112. ldreq r5, =0x50f01312 @ 2Gib + 2Gib: MCP E
  113. cmp r7, r8
  114. strne r4, [r6, #0x008] @ MEMCONFIG0_OFFSET
  115. strne r5, [r6, #0x00C] @ MEMCONFIG1_OFFSET
  116. /*
  117. * DMC0: CS1: S5PC100
  118. * 0x38 -> 0x38000000
  119. * 0xf8 -> 0x3fFFFFFF
  120. * [15:12] 0: Linear
  121. * [11:8 ] 2: 9 bits
  122. * [ 7:4 ] 2: 14 bits
  123. * [ 3:0 ] 2: 4 banks
  124. */
  125. eoreq r3, r3, #0x08000000
  126. streq r3, [r0, #0xc] @ MEMCONFIG1_OFFSET
  127. ldr r1, =0x20000000
  128. str r1, [r0, #0x014] @ PRECHCONFIG_OFFSET
  129. strne r1, [r0, #0x014] @ PRECHCONFIG_OFFSET
  130. strne r1, [r6, #0x014] @ PRECHCONFIG_OFFSET
  131. /*
  132. * S5PC100:
  133. * DMC: CS0: 166MHz
  134. * CS1: 166MHz
  135. * S5PC110:
  136. * DMC0: CS0: 166MHz
  137. * DMC1: CS0: 200MHz
  138. *
  139. * 7.8us * 200MHz %LE %LONG1560(0x618)
  140. * 7.8us * 166MHz %LE %LONG1294(0x50E)
  141. * 7.8us * 133MHz %LE %LONG1038(0x40E),
  142. * 7.8us * 100MHz %LE %LONG780(0x30C),
  143. */
  144. ldr r1, =0x0000050E
  145. str r1, [r0, #0x030] @ TIMINGAREF_OFFSET
  146. ldrne r1, =0x00000618
  147. strne r1, [r6, #0x030] @ TIMINGAREF_OFFSET
  148. ldr r1, =0x14233287
  149. str r1, [r0, #0x034] @ TIMINGROW_OFFSET
  150. ldrne r1, =0x182332c8
  151. strne r1, [r6, #0x034] @ TIMINGROW_OFFSET
  152. ldr r1, =0x12130005
  153. str r1, [r0, #0x038] @ TIMINGDATA_OFFSET
  154. ldrne r1, =0x13130005
  155. strne r1, [r6, #0x038] @ TIMINGDATA_OFFSET
  156. ldr r1, =0x0E140222
  157. str r1, [r0, #0x03C] @ TIMINGPOWER_OFFSET
  158. ldrne r1, =0x0E180222
  159. strne r1, [r6, #0x03C] @ TIMINGPOWER_OFFSET
  160. /* chip0 Deselect */
  161. ldr r1, =0x07000000
  162. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  163. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  164. /* chip0 PALL */
  165. ldr r1, =0x01000000
  166. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  167. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  168. /* chip0 REFA */
  169. ldr r1, =0x05000000
  170. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  171. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  172. /* chip0 REFA */
  173. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  174. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  175. /* chip0 MRS */
  176. ldr r1, =0x00000032
  177. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  178. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  179. /* chip0 EMRS */
  180. ldr r1, =0x00020020
  181. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  182. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  183. /* chip1 Deselect */
  184. ldr r1, =0x07100000
  185. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  186. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  187. /* chip1 PALL */
  188. ldr r1, =0x01100000
  189. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  190. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  191. /* chip1 REFA */
  192. ldr r1, =0x05100000
  193. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  194. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  195. /* chip1 REFA */
  196. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  197. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  198. /* chip1 MRS */
  199. ldr r1, =0x00100032
  200. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  201. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  202. /* chip1 EMRS */
  203. ldr r1, =0x00120020
  204. str r1, [r0, #0x010] @ DIRECTCMD_OFFSET
  205. strne r1, [r6, #0x010] @ DIRECTCMD_OFFSET
  206. /* auto refresh on */
  207. ldr r1, =0xFF002030 | (1 << 7)
  208. str r1, [r0, #0x000] @ CONCONTROL_OFFSET
  209. strne r1, [r6, #0x000] @ CONCONTROL_OFFSET
  210. /* PwrdnConfig */
  211. ldr r1, =0x00100002
  212. str r1, [r0, #0x028] @ PWRDNCONFIG_OFFSET
  213. strne r1, [r6, #0x028] @ PWRDNCONFIG_OFFSET
  214. ldr r1, =0x00212113
  215. str r1, [r0, #0x004] @ MEMCONTROL_OFFSET
  216. strne r1, [r6, #0x004] @ MEMCONTROL_OFFSET
  217. /* Skip when S5PC110 */
  218. bne 1f
  219. /* Check OneDRAM access area at s5pc100 */
  220. ldreq r3, =0x38f80222
  221. ldreq r1, =0x37ffff00
  222. str r3, [r1]
  223. ldr r2, [r1]
  224. cmp r2, r3
  225. beq swap_memory
  226. 1:
  227. mov pc, lr
  228. .ltorg