head-kzm9g.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. LIST "KZM9G low-level initialization routine."
  2. LIST "Adapted from u-boot KZM9G support code."
  3. LIST "Copyright (C) 2013 Ulrich Hecht"
  4. LIST "This program is free software; you can redistribute it and/or modify"
  5. LIST "it under the terms of the GNU General Public License version 2 as"
  6. LIST "published by the Free Software Foundation."
  7. LIST "This program is distributed in the hope that it will be useful,"
  8. LIST "but WITHOUT ANY WARRANTY; without even the implied warranty of"
  9. LIST "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"
  10. LIST "GNU General Public License for more details."
  11. LIST "Register definitions:"
  12. LIST "Secure control register"
  13. #define LIFEC_SEC_SRC (0xE6110008)
  14. LIST "RWDT"
  15. #define RWDT_BASE (0xE6020000)
  16. #define RWTCSRA0 (RWDT_BASE + 0x04)
  17. LIST "HPB Semaphore Control Registers"
  18. #define HPBSCR_BASE (0xE6000000)
  19. #define HPBCTRL6 (HPBSCR_BASE + 0x1030)
  20. #define SBSC1_BASE (0xFE400000)
  21. #define SDCR0A (SBSC1_BASE + 0x0008)
  22. #define SDCR1A (SBSC1_BASE + 0x000C)
  23. #define SDPCRA (SBSC1_BASE + 0x0010)
  24. #define SDCR0SA (SBSC1_BASE + 0x0018)
  25. #define SDCR1SA (SBSC1_BASE + 0x001C)
  26. #define RTCSRA (SBSC1_BASE + 0x0020)
  27. #define RTCORA (SBSC1_BASE + 0x0028)
  28. #define RTCORHA (SBSC1_BASE + 0x002C)
  29. #define SDWCRC0A (SBSC1_BASE + 0x0040)
  30. #define SDWCRC1A (SBSC1_BASE + 0x0044)
  31. #define SDWCR00A (SBSC1_BASE + 0x0048)
  32. #define SDWCR01A (SBSC1_BASE + 0x004C)
  33. #define SDWCR10A (SBSC1_BASE + 0x0050)
  34. #define SDWCR11A (SBSC1_BASE + 0x0054)
  35. #define SDWCR2A (SBSC1_BASE + 0x0060)
  36. #define SDWCRC2A (SBSC1_BASE + 0x0064)
  37. #define ZQCCRA (SBSC1_BASE + 0x0068)
  38. #define SDMRACR0A (SBSC1_BASE + 0x0084)
  39. #define SDMRTMPCRA (SBSC1_BASE + 0x008C)
  40. #define SDMRTMPMSKA (SBSC1_BASE + 0x0094)
  41. #define SDGENCNTA (SBSC1_BASE + 0x009C)
  42. #define SDDRVCR0A (SBSC1_BASE + 0x00B4)
  43. #define DLLCNT0A (SBSC1_BASE + 0x0354)
  44. #define SDMRA1 (0xFE500000)
  45. #define SDMRA2 (0xFE5C0000)
  46. #define SDMRA3 (0xFE504000)
  47. #define SBSC2_BASE (0xFB400000)
  48. #define SDCR0B (SBSC2_BASE + 0x0008)
  49. #define SDCR1B (SBSC2_BASE + 0x000C)
  50. #define SDPCRB (SBSC2_BASE + 0x0010)
  51. #define SDCR0SB (SBSC2_BASE + 0x0018)
  52. #define SDCR1SB (SBSC2_BASE + 0x001C)
  53. #define RTCSRB (SBSC2_BASE + 0x0020)
  54. #define RTCORB (SBSC2_BASE + 0x0028)
  55. #define RTCORHB (SBSC2_BASE + 0x002C)
  56. #define SDWCRC0B (SBSC2_BASE + 0x0040)
  57. #define SDWCRC1B (SBSC2_BASE + 0x0044)
  58. #define SDWCR00B (SBSC2_BASE + 0x0048)
  59. #define SDWCR01B (SBSC2_BASE + 0x004C)
  60. #define SDWCR10B (SBSC2_BASE + 0x0050)
  61. #define SDWCR11B (SBSC2_BASE + 0x0054)
  62. #define SDPDCR0B (SBSC2_BASE + 0x0058)
  63. #define SDWCR2B (SBSC2_BASE + 0x0060)
  64. #define SDWCRC2B (SBSC2_BASE + 0x0064)
  65. #define ZQCCRB (SBSC2_BASE + 0x0068)
  66. #define SDMRACR0B (SBSC2_BASE + 0x0084)
  67. #define SDMRTMPCRB (SBSC2_BASE + 0x008C)
  68. #define SDMRTMPMSKB (SBSC2_BASE + 0x0094)
  69. #define SDGENCNTB (SBSC2_BASE + 0x009C)
  70. #define DPHYCNT0B (SBSC2_BASE + 0x00A0)
  71. #define DPHYCNT1B (SBSC2_BASE + 0x00A4)
  72. #define DPHYCNT2B (SBSC2_BASE + 0x00A8)
  73. #define SDDRVCR0B (SBSC2_BASE + 0x00B4)
  74. #define DLLCNT0B (SBSC2_BASE + 0x0354)
  75. #define SDMRB1 (0xFB500000)
  76. #define SDMRB2 (0xFB5C0000)
  77. #define SDMRB3 (0xFB504000)
  78. #define CPG_BASE (0xE6150000)
  79. #define FRQCRA (CPG_BASE + 0x0000)
  80. #define FRQCRB (CPG_BASE + 0x0004)
  81. #define FRQCRD (CPG_BASE + 0x00E4)
  82. #define VCLKCR1 (CPG_BASE + 0x0008)
  83. #define VCLKCR2 (CPG_BASE + 0x000C)
  84. #define VCLKCR3 (CPG_BASE + 0x001C)
  85. #define ZBCKCR (CPG_BASE + 0x0010)
  86. #define FLCKCR (CPG_BASE + 0x0014)
  87. #define SD0CKCR (CPG_BASE + 0x0074)
  88. #define SD1CKCR (CPG_BASE + 0x0078)
  89. #define SD2CKCR (CPG_BASE + 0x007C)
  90. #define FSIACKCR (CPG_BASE + 0x0018)
  91. #define SUBCKCR (CPG_BASE + 0x0080)
  92. #define SPUACKCR (CPG_BASE + 0x0084)
  93. #define SPUVCKCR (CPG_BASE + 0x0094)
  94. #define MSUCKCR (CPG_BASE + 0x0088)
  95. #define HSICKCR (CPG_BASE + 0x008C)
  96. #define FSIBCKCR (CPG_BASE + 0x0090)
  97. #define MFCK1CR (CPG_BASE + 0x0098)
  98. #define MFCK2CR (CPG_BASE + 0x009C)
  99. #define DSITCKCR (CPG_BASE + 0x0060)
  100. #define DSI0PCKCR (CPG_BASE + 0x0064)
  101. #define DSI1PCKCR (CPG_BASE + 0x0068)
  102. #define DSI0PHYCR (CPG_BASE + 0x006C)
  103. #define DVFSCR3 (CPG_BASE + 0x0174)
  104. #define DVFSCR4 (CPG_BASE + 0x0178)
  105. #define DVFSCR5 (CPG_BASE + 0x017C)
  106. #define MPMODE (CPG_BASE + 0x00CC)
  107. #define PLLECR (CPG_BASE + 0x00D0)
  108. #define PLL0CR (CPG_BASE + 0x00D8)
  109. #define PLL1CR (CPG_BASE + 0x0028)
  110. #define PLL2CR (CPG_BASE + 0x002C)
  111. #define PLL3CR (CPG_BASE + 0x00DC)
  112. #define PLL0STPCR (CPG_BASE + 0x00F0)
  113. #define PLL1STPCR (CPG_BASE + 0x00C8)
  114. #define PLL2STPCR (CPG_BASE + 0x00F8)
  115. #define PLL3STPCR (CPG_BASE + 0x00FC)
  116. #define RMSTPCR0 (CPG_BASE + 0x0110)
  117. #define RMSTPCR1 (CPG_BASE + 0x0114)
  118. #define RMSTPCR2 (CPG_BASE + 0x0118)
  119. #define RMSTPCR3 (CPG_BASE + 0x011C)
  120. #define RMSTPCR4 (CPG_BASE + 0x0120)
  121. #define RMSTPCR5 (CPG_BASE + 0x0124)
  122. #define SMSTPCR0 (CPG_BASE + 0x0130)
  123. #define SMSTPCR2 (CPG_BASE + 0x0138)
  124. #define SMSTPCR3 (CPG_BASE + 0x013C)
  125. #define CPGXXCR4 (CPG_BASE + 0x0150)
  126. #define SRCR0 (CPG_BASE + 0x80A0)
  127. #define SRCR2 (CPG_BASE + 0x80B0)
  128. #define SRCR3 (CPG_BASE + 0x80A8)
  129. #define VREFCR (CPG_BASE + 0x00EC)
  130. #define PCLKCR (CPG_BASE + 0x1020)
  131. #define PORT32CR (0xE6051020)
  132. #define PORT33CR (0xE6051021)
  133. #define PORT34CR (0xE6051022)
  134. #define PORT35CR (0xE6051023)
  135. LIST "DRAM initialization code:"
  136. EW RWTCSRA0, 0xA507
  137. ED_AND LIFEC_SEC_SRC, 0xFFFF7FFF
  138. ED_AND SMSTPCR3,0xFFFF7FFF
  139. ED_AND SRCR3, 0xFFFF7FFF
  140. ED_AND SMSTPCR2,0xFFFBFFFF
  141. ED_AND SRCR2, 0xFFFBFFFF
  142. ED PLLECR, 0x00000000
  143. WAIT_MASK PLLECR, 0x00000F00, 0x00000000
  144. WAIT_MASK FRQCRB, 0x80000000, 0x00000000
  145. ED PLL0CR, 0x2D000000
  146. ED PLL1CR, 0x17100000
  147. ED FRQCRB, 0x96235880
  148. WAIT_MASK FRQCRB, 0x80000000, 0x00000000
  149. ED FLCKCR, 0x0000000B
  150. ED_AND SMSTPCR0, 0xFFFFFFFD
  151. ED_AND SRCR0, 0xFFFFFFFD
  152. ED 0xE6001628, 0x514
  153. ED 0xE6001648, 0x514
  154. ED 0xE6001658, 0x514
  155. ED 0xE6001678, 0x514
  156. ED DVFSCR4, 0x00092000
  157. ED DVFSCR5, 0x000000DC
  158. ED PLLECR, 0x00000000
  159. WAIT_MASK PLLECR, 0x00000F00, 0x00000000
  160. ED FRQCRA, 0x0012453C
  161. ED FRQCRB, 0x80431350
  162. WAIT_MASK FRQCRB, 0x80000000, 0x00000000
  163. ED FRQCRD, 0x00000B0B
  164. WAIT_MASK FRQCRD, 0x80000000, 0x00000000
  165. ED PCLKCR, 0x00000003
  166. ED VCLKCR1, 0x0000012F
  167. ED VCLKCR2, 0x00000119
  168. ED VCLKCR3, 0x00000119
  169. ED ZBCKCR, 0x00000002
  170. ED FLCKCR, 0x00000005
  171. ED SD0CKCR, 0x00000080
  172. ED SD1CKCR, 0x00000080
  173. ED SD2CKCR, 0x00000080
  174. ED FSIACKCR, 0x0000003F
  175. ED FSIBCKCR, 0x0000003F
  176. ED SUBCKCR, 0x00000080
  177. ED SPUACKCR, 0x0000000B
  178. ED SPUVCKCR, 0x0000000B
  179. ED MSUCKCR, 0x0000013F
  180. ED HSICKCR, 0x00000080
  181. ED MFCK1CR, 0x0000003F
  182. ED MFCK2CR, 0x0000003F
  183. ED DSITCKCR, 0x00000107
  184. ED DSI0PCKCR, 0x00000313
  185. ED DSI1PCKCR, 0x0000130D
  186. ED DSI0PHYCR, 0x2A800E0E
  187. ED PLL0CR, 0x1E000000
  188. ED PLL0CR, 0x2D000000
  189. ED PLL1CR, 0x17100000
  190. ED PLL2CR, 0x27000080
  191. ED PLL3CR, 0x1D000000
  192. ED PLL0STPCR, 0x00080000
  193. ED PLL1STPCR, 0x000120C0
  194. ED PLL2STPCR, 0x00012000
  195. ED PLL3STPCR, 0x00000030
  196. ED PLLECR, 0x0000000B
  197. WAIT_MASK PLLECR, 0x00000B00, 0x00000B00
  198. ED DVFSCR3, 0x000120F0
  199. ED MPMODE, 0x00000020
  200. ED VREFCR, 0x0000028A
  201. ED RMSTPCR0, 0xE4628087
  202. ED RMSTPCR1, 0xFFFFFFFF
  203. ED RMSTPCR2, 0x53FFFFFF
  204. ED RMSTPCR3, 0xFFFFFFFF
  205. ED RMSTPCR4, 0x00800D3D
  206. ED RMSTPCR5, 0xFFFFF3FF
  207. ED SMSTPCR2, 0x00000000
  208. ED SRCR2, 0x00040000
  209. ED_AND PLLECR, 0xFFFFFFF7
  210. WAIT_MASK PLLECR, 0x00000800, 0x00000000
  211. LIST "set SBSC operational"
  212. ED HPBCTRL6, 0x00000001
  213. WAIT_MASK HPBCTRL6, 0x00000001, 0x00000001
  214. LIST "set SBSC operating frequency"
  215. ED FRQCRD, 0x00001414
  216. WAIT_MASK FRQCRD, 0x80000000, 0x00000000
  217. ED PLL3CR, 0x1D000000
  218. ED_OR PLLECR, 0x00000008
  219. WAIT_MASK PLLECR, 0x00000800, 0x00000800
  220. LIST "enable DLL oscillation in DDRPHY"
  221. ED_OR DLLCNT0A, 0x00000002
  222. LIST "wait >= 100 ns"
  223. ED SDGENCNTA, 0x00000005
  224. WAIT_MASK SDGENCNTA, 0xFFFFFFFF, 0x00000000
  225. LIST "target LPDDR2 device settings"
  226. ED SDCR0A, 0xACC90159
  227. ED SDCR1A, 0x00010059
  228. ED SDWCRC0A, 0x50874114
  229. ED SDWCRC1A, 0x33199B37
  230. ED SDWCRC2A, 0x008F2313
  231. ED SDWCR00A, 0x31020707
  232. ED SDWCR01A, 0x0017040A
  233. ED SDWCR10A, 0x31020707
  234. ED SDWCR11A, 0x0017040A
  235. ED SDDRVCR0A, 0x055557ff
  236. ED SDWCR2A, 0x30000000
  237. LIST "drive CKE high"
  238. ED_OR SDPCRA, 0x00000080
  239. WAIT_MASK SDPCRA, 0x00000080, 0x00000080
  240. LIST "wait >= 200 us"
  241. ED SDGENCNTA, 0x00002710
  242. WAIT_MASK SDGENCNTA, 0xFFFFFFFF, 0x00000000
  243. LIST "issue reset command to LPDDR2 device"
  244. ED SDMRACR0A, 0x0000003F
  245. ED SDMRA1, 0x00000000
  246. LIST "wait >= 10 (or 1) us (docs inconsistent)"
  247. ED SDGENCNTA, 0x000001F4
  248. WAIT_MASK SDGENCNTA, 0xFFFFFFFF, 0x00000000
  249. LIST "MRW ZS initialization calibration command"
  250. ED SDMRACR0A, 0x0000FF0A
  251. ED SDMRA3, 0x00000000
  252. LIST "wait >= 1 us"
  253. ED SDGENCNTA, 0x00000032
  254. WAIT_MASK SDGENCNTA, 0xFFFFFFFF, 0x00000000
  255. LIST "specify operating mode in LPDDR2"
  256. ED SDMRACR0A, 0x00002201
  257. ED SDMRA1, 0x00000000
  258. ED SDMRACR0A, 0x00000402
  259. ED SDMRA1, 0x00000000
  260. ED SDMRACR0A, 0x00000203
  261. ED SDMRA1, 0x00000000
  262. LIST "initialize DDR interface"
  263. ED SDMRA2, 0x00000000
  264. LIST "temperature sensor control"
  265. ED SDMRTMPCRA, 0x88800004
  266. ED SDMRTMPMSKA,0x00000004
  267. LIST "auto-refreshing control"
  268. ED RTCORA, 0xA55A0032
  269. ED RTCORHA, 0xA55A000C
  270. ED RTCSRA, 0xA55A2048
  271. ED_OR SDCR0A, 0x00000800
  272. ED_OR SDCR1A, 0x00000400
  273. LIST "auto ZQ calibration control"
  274. ED ZQCCRA, 0xFFF20000
  275. ED_OR DLLCNT0B, 0x00000002
  276. ED SDGENCNTB, 0x00000005
  277. WAIT_MASK SDGENCNTB, 0xFFFFFFFF, 0x00000000
  278. ED SDCR0B, 0xACC90159
  279. ED SDCR1B, 0x00010059
  280. ED SDWCRC0B, 0x50874114
  281. ED SDWCRC1B, 0x33199B37
  282. ED SDWCRC2B, 0x008F2313
  283. ED SDWCR00B, 0x31020707
  284. ED SDWCR01B, 0x0017040A
  285. ED SDWCR10B, 0x31020707
  286. ED SDWCR11B, 0x0017040A
  287. ED SDDRVCR0B, 0x055557ff
  288. ED SDWCR2B, 0x30000000
  289. ED_OR SDPCRB, 0x00000080
  290. WAIT_MASK SDPCRB, 0x00000080, 0x00000080
  291. ED SDGENCNTB, 0x00002710
  292. WAIT_MASK SDGENCNTB, 0xFFFFFFFF, 0x00000000
  293. ED SDMRACR0B, 0x0000003F
  294. LIST "upstream u-boot writes to SDMRA1A for both SBSC 1 and 2, which does"
  295. LIST "not seem to make a lot of sense..."
  296. ED SDMRB1, 0x00000000
  297. ED SDGENCNTB, 0x000001F4
  298. WAIT_MASK SDGENCNTB, 0xFFFFFFFF, 0x00000000
  299. ED SDMRACR0B, 0x0000FF0A
  300. ED SDMRB3, 0x00000000
  301. ED SDGENCNTB, 0x00000032
  302. WAIT_MASK SDGENCNTB, 0xFFFFFFFF, 0x00000000
  303. ED SDMRACR0B, 0x00002201
  304. ED SDMRB1, 0x00000000
  305. ED SDMRACR0B, 0x00000402
  306. ED SDMRB1, 0x00000000
  307. ED SDMRACR0B, 0x00000203
  308. ED SDMRB1, 0x00000000
  309. ED SDMRB2, 0x00000000
  310. ED SDMRTMPCRB, 0x88800004
  311. ED SDMRTMPMSKB, 0x00000004
  312. ED RTCORB, 0xA55A0032
  313. ED RTCORHB, 0xA55A000C
  314. ED RTCSRB, 0xA55A2048
  315. ED_OR SDCR0B, 0x00000800
  316. ED_OR SDCR1B, 0x00000400
  317. ED ZQCCRB, 0xFFF20000
  318. ED_OR SDPDCR0B, 0x00030000
  319. ED DPHYCNT1B, 0xA5390000
  320. ED DPHYCNT0B, 0x00001200
  321. ED DPHYCNT1B, 0x07CE0000
  322. ED DPHYCNT0B, 0x00001247
  323. WAIT_MASK DPHYCNT2B, 0xFFFFFFFF, 0x07CE0000
  324. ED_AND SDPDCR0B, 0xFFFCFFFF
  325. ED FRQCRD, 0x00000B0B
  326. WAIT_MASK FRQCRD, 0x80000000, 0x00000000
  327. ED CPGXXCR4, 0xfffffffc
  328. LIST "Setup SCIF4 / workaround"
  329. EB PORT32CR, 0x12
  330. EB PORT33CR, 0x22
  331. EB PORT34CR, 0x12
  332. EB PORT35CR, 0x22
  333. EW 0xE6C80000, 0
  334. EB 0xE6C80004, 0x19
  335. EW 0xE6C80008, 0x0030
  336. EW 0xE6C80018, 0
  337. EW 0xE6C80030, 0x0014
  338. LIST "Magic to avoid hangs and corruption on DRAM writes."
  339. LIST "It has been observed that the system would most often hang while"
  340. LIST "decompressing the kernel, and if it didn't it would always write"
  341. LIST "a corrupt image to DRAM."
  342. LIST "This problem does not occur in u-boot, and the reason is that"
  343. LIST "u-boot performs an additional cache invalidation after setting up"
  344. LIST "the DRAM controller. Such an invalidation should not be necessary at"
  345. LIST "this point, and attempts at removing parts of the routine to arrive"
  346. LIST "at the minimal snippet of code necessary to avoid the DRAM stability"
  347. LIST "problem yielded the following:"
  348. MRC p15, 0, r0, c1, c0, 0
  349. MCR p15, 0, r0, c1, c0, 0