ddr_ark1668ed.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. #include <common.h>
  2. #include <linux/delay.h>
  3. #include <asm/arch/ark1668ed-sysreg.h>
  4. #define REGS_DDRCTL_BASE 0x51400000
  5. #define REGS_DDRPHY_BASE 0x51500000
  6. #define DDRPLL_CLK 400
  7. #define ApbReadFun(base) *(volatile unsigned int *)(base)
  8. #define DDR_CLK (DDRPLL_CLK * 2)
  9. #define n_clk (DDRPLL_CLK)
  10. #define CWL 8
  11. #define CAS_Latency 11//10
  12. #define MR2_CWL MCTL_MR2_CWL_8
  13. #define MR0_CL MCTL_MR0_CAS_Latency_11
  14. #define AL_0 1
  15. #define AL 0
  16. // MR0 (Mode Register 0)
  17. #define MCTL_MR0_BL_8_Fixed (0 << 0) // 8 (Fixed)
  18. #define MCTL_MR0_BL_ON_THE_FLY (1 << 0) // BC4 or 8 (on the fly)
  19. #define MCTL_MR0_BL_BC4_Fixed (2 << 0) // BC4 (Fixed)
  20. #define MCTL_MR0_CL (1 << 2)
  21. #define MCTL_MR0_RBT_Nibble_Sequential (0 << 3)
  22. #define MCTL_MR0_RBT_Interleave (1 << 3)
  23. #define MCTL_MR0_CAS_Latency_5 (1 << 4)
  24. #define MCTL_MR0_CAS_Latency_6 (2 << 4)
  25. #define MCTL_MR0_CAS_Latency_7 (3 << 4)
  26. #define MCTL_MR0_CAS_Latency_8 (4 << 4)
  27. #define MCTL_MR0_CAS_Latency_9 (5 << 4)
  28. #define MCTL_MR0_CAS_Latency_10 (6 << 4)
  29. #define MCTL_MR0_CAS_Latency_11 (7 << 4)
  30. #define MCTL_MR0_CAS_Latency_12 (1 << 2)
  31. #define MCTL_MR0_CAS_Latency_13 ((1 << 2) | (1 << 4))
  32. #define MCTL_MR0_CAS_Latency_14 ((1 << 2) | (1 << 5))
  33. #define MCTL_MR0_CAS_Latency_15 ((1 << 2) | (1 << 4) | (1 << 5))
  34. #define MCTL_MR0_CAS_Latency_16 ((1 << 2) | (1 << 6))
  35. #define MCTL_MR0_TM_Normal (0 << 7)
  36. #define MCTL_MR0_TM_Test (1 << 7)
  37. //DLL Reset
  38. //The DLL Reset bit is self-clearing, meaning that it returns back to the value of ??0?ˉ after the DLL reset function
  39. //has been issued. Once the DLL is enabled, a subsequent DLL Reset should be applied. Any time that
  40. //the DLL reset function is used, tDLLK must be met before any functions that require the DLL can be used
  41. #define MCTL_MR0_DLL_Reset_No (0 << 8)
  42. #define MCTL_MR0_DLL_Reset_Yes (1 << 8)
  43. #define MCTL_MR0_WR_16 (0)
  44. #define MCTL_MR0_WR_5 (1)
  45. #define MCTL_MR0_WR_6 (2)
  46. #define MCTL_MR0_WR_7 (3)
  47. #define MCTL_MR0_WR_8 (4)
  48. #define MCTL_MR0_WR_10 (5)
  49. #define MCTL_MR0_WR_12 (6)
  50. #define MCTL_MR0_WR_14 (7)
  51. #define MCTL_MR0_WR(cycle) (((cycle)&0x07) << 9) // Write recovery for autoprecharge
  52. // DLL Control for Precharge PD
  53. #define MCTL_MR0_PPD_Slow_exit (0 << 12) // Slow exit (DLL off)
  54. #define MCTL_MR0_PPD_Fast_exit (1 << 12) // Fast exit (DLL on)
  55. #define MCTL_MR0_PPD_MASK (1 << 12)
  56. // MR1 (Mode Register 1)
  57. #define MCTL_MR1_DLL_Enable (0 << 0) // 0 Enable
  58. #define MCTL_MR1_DLL_Disable (1 << 0) // 1 Disable
  59. // A5 A1 Output Driver Impedance Control (RZQ = 240 |?)
  60. #define MCTL_MR1_DIC_RZQ_6 ((0 << 1) | (0 << 5))
  61. #define MCTL_MR1_DIC_RZQ_7 ((1 << 1) | (0 << 5))
  62. #define MCTL_MR1_Rtt_Nom_disabled ((0 << 9) | (0 << 6) | (0 << 2))
  63. #define MCTL_MR1_Rtt_Nom_RZQ_4 ((0 << 9) | (0 << 6) | (1 << 2))
  64. #define MCTL_MR1_Rtt_Nom_RZQ_2 ((0 << 9) | (1 << 6) | (0 << 2))
  65. #define MCTL_MR1_Rtt_Nom_RZQ_6 ((0 << 9) | (1 << 6) | (1 << 2))
  66. #define MCTL_MR1_Rtt_Nom_RZQ_12 ((1 << 9) | (0 << 6) | (0 << 2))
  67. #define MCTL_MR1_Rtt_Nom_RZQ_8 ((1 << 9) | (0 << 6) | (1 << 2))
  68. #define MCTL_MR1_AL_0_disabled (0 << 3)
  69. #define MCTL_MR1_AL_CL_1 (1 << 3)
  70. #define MCTL_MR1_AL_CL_2 (2 << 3)
  71. #define MCTL_MR1_Write_leveling_Disabled (0 << 7)
  72. #define MCTL_MR1_Write_leveling_Enabled (1 << 7)
  73. //#define MCTL_MR1_TDQS_Disabled (0 << 11)
  74. //#define MCTL_MR1_TDQS_Enabled (1 << 11)
  75. #define MCTL_MR1_Qoff_Output_buffer_enabled (0 << 12)
  76. #define MCTL_MR1_Qoff_Output_buffer_disabled (1 << 12) // Outputs disabled - DQs, DQSs, DQS#s.
  77. // MR2 (Mode Register 2)
  78. // A5 A4 A3 CAS write Latency (CWL)
  79. #define MCTL_MR2_CWL_5 (0 << 3) // 5 (tCK(avg) ?Y 2.5ns)
  80. #define MCTL_MR2_CWL_6 (1 << 3) // 6 (2.5ns > tCK(avg) ?Y 1.875ns)
  81. #define MCTL_MR2_CWL_7 (2 << 3) // 7 (1.875ns > tCK(avg) ?Y 1.5ns)
  82. #define MCTL_MR2_CWL_8 (3 << 3) // 8 (1.5ns > tCK(avg) ?Y 1.25ns)
  83. #define MCTL_MR2_CWL_9 (4 << 3) // 9 (1.25ns > tCK(avg) ?Y 1.07ns)
  84. #define MCTL_MR2_CWL_10 (5 << 3) // 9 (1.07ns > tCK(avg) ?Y 0.935ns)
  85. // A6 Auto Self-Refresh (ASR)
  86. #define MCTL_MR2_ASR_SRT (0 << 6) // 0 Manual SR Reference (SRT)
  87. #define MCTL_MR2_ASR_enable (1 << 6) // 1 ASR enable (Optional)
  88. // A7 Self-Refresh Temperature (SRT) Range
  89. #define MCTL_MR2_SRT_Normal_range (0 << 7) // 0 Normal operating temperature range
  90. #define MCTL_MR2_SRT_Extended_range (1 << 7) // 1 Extended (optional) operating temperature range
  91. // A10 A9 Rtt_WR *2
  92. #define MCTL_MR2_Rtt_WR_Dynamic_ODT_off (0 << 9) // 0 0 Dynamic ODT off (Write does not affect Rtt value)
  93. #define MCTL_MR2_Rtt_WR_RZQ_4 (1 << 9) // 0 1 RZQ/4
  94. #define MCTL_MR2_Rtt_WR_RZQ_2 (2 << 9) // 1 0 RZQ/2
  95. // Multi purpose registers
  96. // MR3 (Mode Register MR3)
  97. #define MCTL_MR3_MPR_location_Predefined pattern(0 << 0)
  98. #define MCTL_MR3_MPR_Normal_operation (0 << 2)
  99. #define MCTL_MR3_MPR_Dataflow_from_MPR (1 << 2)
  100. #define DDR_CALC(time) (unsigned int)((((time) * (DDR_CLK) * 105 + 1000*100 - 1) / (1000*100))+1)
  101. #define DDR_CALC_EXACT_VALUE(time) (unsigned int)(((time) * (n_clk) * 100 + 1000*100 - 1) / (1000*100))
  102. #define RAFB32(n) (~(0xffffffff << n))
  103. #define LAFB32(n) (~(0xffffffff >> n))
  104. #define ddrs_mstr_addr (REGS_DDRCTL_BASE + 0x00000000)
  105. #define ddrs_stat_addr (REGS_DDRCTL_BASE + 0x00000004)
  106. #define ddrs_mrctrl0_addr (REGS_DDRCTL_BASE + 0x00000010)
  107. #define ddrs_mrctrl1_addr (REGS_DDRCTL_BASE + 0x00000014)
  108. #define ddrs_pwrctl_addr (REGS_DDRCTL_BASE + 0x00000030)
  109. #define ddrs_hwlpctl_addr (REGS_DDRCTL_BASE + 0x00000038)
  110. #define ddrs_rfshctl3_addr (REGS_DDRCTL_BASE + 0x00000060)
  111. #define ddrs_rfshtmg_addr (REGS_DDRCTL_BASE + 0x00000064)
  112. #define ddrs_init0_addr (REGS_DDRCTL_BASE + 0x000000d0)
  113. #define ddrs_init1_addr (REGS_DDRCTL_BASE + 0x000000d4)
  114. #define ddrs_init2_addr (REGS_DDRCTL_BASE + 0x000000d8)
  115. #define ddrs_init3_addr (REGS_DDRCTL_BASE + 0x000000dc)
  116. #define ddrs_init4_addr (REGS_DDRCTL_BASE + 0x000000e0)
  117. #define ddrs_zqctl_addr (REGS_DDRCTL_BASE + 0x00000180)
  118. #define ddrs_dfitmg0_addr (REGS_DDRCTL_BASE + 0x00000190)
  119. #define ddrs_dfitmg1_addr (REGS_DDRCTL_BASE + 0x00000194)
  120. #define ddrs_dfimisc_addr (REGS_DDRCTL_BASE + 0x000001b0)
  121. #define ddrs_dbg1_addr (REGS_DDRCTL_BASE + 0x00000304)
  122. #define ddrs_dbgcam_addr (REGS_DDRCTL_BASE + 0x00000308)
  123. #define ddrs_swstat_addr (REGS_DDRCTL_BASE + 0x00000324)
  124. #define ddrs_swctlstatic_addr (REGS_DDRCTL_BASE + 0x00000328)
  125. #define ddrs_swctl_addr (REGS_DDRCTL_BASE + 0x00000320)
  126. #define ddrs_pcfg_0_addr (REGS_DDRCTL_BASE + 0x00000404 + 0x00000000)
  127. #define ddrs_pcfg_1_addr (REGS_DDRCTL_BASE + 0x00000404 + 0x000000b0)
  128. #define ddrs_pcfg_2_addr (REGS_DDRCTL_BASE + 0x00000404 + 0x00000160)
  129. #define ddrs_pcfg_3_addr (REGS_DDRCTL_BASE + 0x00000404 + 0x00000210)
  130. #define ddrs_pcfg_w0_addr (REGS_DDRCTL_BASE + 0x00000408 + 0x00000000)
  131. #define ddrs_pcfg_w1_addr (REGS_DDRCTL_BASE + 0x00000408 + 0x000000b0)
  132. #define ddrs_pcfg_w2_addr (REGS_DDRCTL_BASE + 0x00000408 + 0x00000160)
  133. #define ddrs_pcfg_w3_addr (REGS_DDRCTL_BASE + 0x00000408 + 0x00000210)
  134. #define ddrs_pctrl_0_addr (REGS_DDRCTL_BASE + 0x00000490 + 0x00000000)
  135. #define ddrs_pctrl_1_addr (REGS_DDRCTL_BASE + 0x00000490 + 0x000000b0)
  136. #define ddrs_pctrl_2_addr (REGS_DDRCTL_BASE + 0x00000490 + 0x00000160)
  137. #define ddrs_pctrl_3_addr (REGS_DDRCTL_BASE + 0x00000490 + 0x00000210)
  138. #define ddrs_pcfgrqos0_0_addr (REGS_DDRCTL_BASE + 0x00000494 + 0x00000000)
  139. #define ddrs_pcfgrqos0_1_addr (REGS_DDRCTL_BASE + 0x00000494 + 0x000000b0)
  140. #define ddrs_pcfgrqos0_2_addr (REGS_DDRCTL_BASE + 0x00000494 + 0x00000160)
  141. #define ddrs_pcfgrqos0_3_addr (REGS_DDRCTL_BASE + 0x00000494 + 0x00000210)
  142. #define ddrs_pcfgrqos1_0_addr (REGS_DDRCTL_BASE + 0x00000498 + 0x00000000)
  143. #define ddrs_pcfgrqos1_1_addr (REGS_DDRCTL_BASE + 0x00000498 + 0x000000b0)
  144. #define ddrs_pcfgrqos1_2_addr (REGS_DDRCTL_BASE + 0x00000498 + 0x00000160)
  145. #define ddrs_pcfgrqos1_3_addr (REGS_DDRCTL_BASE + 0x00000498 + 0x00000210)
  146. #define ddrs_pcfgwqos0_0_addr (REGS_DDRCTL_BASE + 0x0000049c + 0x00000000)
  147. #define ddrs_pcfgwqos0_1_addr (REGS_DDRCTL_BASE + 0x0000049c + 0x000000b0)
  148. #define ddrs_pcfgwqos0_2_addr (REGS_DDRCTL_BASE + 0x0000049c + 0x00000160)
  149. #define ddrs_pcfgwqos0_3_addr (REGS_DDRCTL_BASE + 0x0000049c + 0x00000210)
  150. #define ddrs_pcfgwqos1_0_addr (REGS_DDRCTL_BASE + 0x000004a0 + 0x00000000)
  151. #define ddrs_pcfgwqos1_1_addr (REGS_DDRCTL_BASE + 0x000004a0 + 0x000000b0)
  152. #define ddrs_pcfgwqos1_2_addr (REGS_DDRCTL_BASE + 0x000004a0 + 0x00000160)
  153. #define ddrs_pcfgwqos1_3_addr (REGS_DDRCTL_BASE + 0x000004a0 + 0x00000210)
  154. #define ddrs_dramtmg0_addr (REGS_DDRCTL_BASE + 0x00000100)
  155. #define ddrs_dramtmg1_addr (REGS_DDRCTL_BASE + 0x00000104)
  156. #define ddrs_dramtmg2_addr (REGS_DDRCTL_BASE + 0x00000108)
  157. #define ddrs_dramtmg3_addr (REGS_DDRCTL_BASE + 0x0000010c)
  158. #define ddrs_dramtmg4_addr (REGS_DDRCTL_BASE + 0x00000110)
  159. #define ddrs_dramtmg5_addr (REGS_DDRCTL_BASE + 0x00000114)
  160. #define ddrs_dramtmg8_addr (REGS_DDRCTL_BASE + 0x00000120)
  161. #define ddrs_addrmap0_addr (REGS_DDRCTL_BASE + 0x00000200)
  162. #define ddrs_addrmap1_addr (REGS_DDRCTL_BASE + 0x00000204)
  163. #define ddrs_addrmap2_addr (REGS_DDRCTL_BASE + 0x00000208)
  164. #define ddrs_addrmap3_addr (REGS_DDRCTL_BASE + 0x0000020c)
  165. #define ddrs_addrmap4_addr (REGS_DDRCTL_BASE + 0x00000210)
  166. #define ddrs_addrmap5_addr (REGS_DDRCTL_BASE + 0x00000214)
  167. #define ddrs_addrmap6_addr (REGS_DDRCTL_BASE + 0x00000218)
  168. #define ddrs_addrmap7_addr (REGS_DDRCTL_BASE + 0x0000021c)
  169. #define ddrs_addrmap8_addr (REGS_DDRCTL_BASE + 0x00000220)
  170. #define ddrs_addrmap9_addr (REGS_DDRCTL_BASE + 0x00000224)
  171. #define ddrs_addrmap10_addr (REGS_DDRCTL_BASE + 0x00000228)
  172. #define ddrs_addrmap11_addr (REGS_DDRCTL_BASE + 0x0000022c)
  173. #define ddrs_odtcfg_addr (REGS_DDRCTL_BASE + 0x00000240)
  174. #define ddrs_sched_addr (REGS_DDRCTL_BASE + 0x00000250)
  175. #define ddrs_sched1_addr (REGS_DDRCTL_BASE + 0x00000254)
  176. #define ddrs_per1_addr (REGS_DDRCTL_BASE + 0x0000025c)
  177. #define ddrs_per2_addr (REGS_DDRCTL_BASE + 0x00000264)
  178. #define ddrs_per3_addr (REGS_DDRCTL_BASE + 0x0000026c)
  179. #define ddrsphy_pir_addr (REGS_DDRPHY_BASE + (0x00000001 << 2))
  180. #define ddrsphy_pgsr0_addr (REGS_DDRPHY_BASE + (0x00000004 << 2))
  181. #define ddrsphy_pllcr_addr (REGS_DDRPHY_BASE + (0x00000006 << 2))
  182. #define ddrsphy_ptr0_addr (REGS_DDRPHY_BASE + (0x00000007 << 2))
  183. #define ddrsphy_ptr1_addr (REGS_DDRPHY_BASE + (0x00000008 << 2))
  184. #define ddrsphy_ptr2_addr (REGS_DDRPHY_BASE + (0x00000009 << 2))
  185. #define ddrsphy_ptr3_addr (REGS_DDRPHY_BASE + (0x0000000a << 2))
  186. #define ddrsphy_ptr4_addr (REGS_DDRPHY_BASE + (0x0000000b << 2))
  187. #define ddrsphy_dxccr_addr (REGS_DDRPHY_BASE + (0x0000000f << 2))
  188. #define ddrsphy_dsgcr_addr (REGS_DDRPHY_BASE + (0x00000010 << 2))
  189. #define ddrsphy_dcr_addr (REGS_DDRPHY_BASE + (0x00000011 << 2))
  190. #define ddrsphy_dtpr0_addr (REGS_DDRPHY_BASE + (0x00000012 << 2))
  191. #define ddrsphy_dtpr1_addr (REGS_DDRPHY_BASE + (0x00000013 << 2))
  192. #define ddrsphy_dtpr2_addr (REGS_DDRPHY_BASE + (0x00000014 << 2))
  193. #define ddrsphy_mr0_addr (REGS_DDRPHY_BASE + (0x00000015 << 2))
  194. #define ddrsphy_mr1_addr (REGS_DDRPHY_BASE + (0x00000016 << 2))
  195. #define ddrsphy_mr2_addr (REGS_DDRPHY_BASE + (0x00000017 << 2))
  196. #define ddrsphy_mr3_addr (REGS_DDRPHY_BASE + (0x00000018 << 2))
  197. #define ddrsphy_dtcr_addr (REGS_DDRPHY_BASE + (0x0000001a << 2))
  198. #define ddrsphy_pgcr2_addr (REGS_DDRPHY_BASE + (0x00000023 << 2))
  199. #define ddrsphy_zq0cr0_addr (REGS_DDRPHY_BASE + (0x00000060 << 2))
  200. #define ddrsphy_zq0cr1_addr (REGS_DDRPHY_BASE + (0x00000061 << 2))
  201. #define ddrsphy_zq0sr0_addr (REGS_DDRPHY_BASE + (0x00000062 << 2))
  202. #define ddrsphy_zq0sr1_addr (REGS_DDRPHY_BASE + (0x00000063 << 2))
  203. static void ApbWriteFun(unsigned int addr, unsigned int data)
  204. {
  205. * (volatile unsigned int *) addr = data;
  206. }
  207. static void ApbWriteFun_qussi(unsigned int addr, unsigned int data)
  208. {
  209. ApbWriteFun(ddrs_swctl_addr, 0x0);
  210. *(volatile unsigned int *) addr = data;
  211. ApbWriteFun(ddrs_swctl_addr, 0x1);
  212. }
  213. void ddr_init(void)
  214. {
  215. uint32_t rdata, tmp;
  216. uint32_t rval;
  217. uint32_t val = 0;
  218. int mrdata;
  219. unsigned int WR;
  220. (void)val;
  221. //int loop;
  222. //ddr param based on ddr clk cycles
  223. unsigned int WL = CWL + AL;
  224. unsigned int RL = CAS_Latency + AL; //The overall Read Latency (RL) is defined as Additive Latency (AL) + CAS Latency (CL); RL = AL + CL.
  225. unsigned int tRCD = CAS_Latency;
  226. unsigned int TRAS = DDR_CALC(36); // OK, Activate to precharge command delay,
  227. unsigned int TRC = tRCD + TRAS; // OK
  228. unsigned int tRRD = max(4u, DDR_CALC(7.5)); // tRRD = max(4tCK,7.5ns)
  229. unsigned int TRTP = max(4u, DDR_CALC(7.5)); // OK, Internal read to precharge command delay.
  230. unsigned int tWTR = max(4u, DDR_CALC(7.5));
  231. unsigned int tRP = CAS_Latency; // NG
  232. unsigned int tMRD = 4; // tMRD 4 - 4 - nCK
  233. unsigned int TMOD = max(12u, DDR_CALC(15)); // DDR3 Legal Values: 0..31
  234. unsigned int TXP = max(3u, DDR_CALC(6));
  235. //unsigned int tRFC = DDR_CALC(110);
  236. unsigned int tCKSRX = max(5u, DDR_CALC(10));
  237. WR = DDR_CALC(15);
  238. //controller param, based on DFI clk cycles
  239. unsigned int wr2pre = (WL + 4 + WR + 1) / 2;
  240. unsigned int tfaw = DDR_CALC_EXACT_VALUE(40);
  241. unsigned int tras_min = DDR_CALC_EXACT_VALUE(36);
  242. unsigned int tras_max = 11; //11; // 9*trefi/1024
  243. unsigned int txp = 3; // 6ns
  244. unsigned int trtp = (TRTP + 1) / 2;
  245. unsigned int trc = 20; // DDR_CALC_EXACT_VALUE(46);
  246. unsigned int twtr = 8; // 7.5ns
  247. unsigned int tCKE = (max(3u, DDR_CALC(5)) + 1) / 2;
  248. unsigned int tXS = DDR_CALC_EXACT_VALUE(110+10)/32;
  249. // unsigned int twr2pre = 15;
  250. int retries = 10;
  251. int timeout;
  252. restart:
  253. if (WR < 6)
  254. WR = 6;
  255. else if (WR == 9)
  256. WR = 10;
  257. else if (WR == 11)
  258. WR = 12;
  259. else if (WR == 13)
  260. WR = 14;
  261. else if (WR == 15)
  262. WR = 16;
  263. #if 1
  264. ApbWriteFun_qussi(ddrs_pctrl_0_addr, 0x1);
  265. ApbWriteFun_qussi(ddrs_pctrl_1_addr, 0x1);
  266. ApbWriteFun_qussi(ddrs_pctrl_2_addr, 0x1);
  267. ApbWriteFun_qussi(ddrs_pctrl_3_addr, 0x1);
  268. rval = rSYS_SOFTRESET_CTL1;
  269. rval &= ~(0x3f << 16);
  270. rSYS_SOFTRESET_CTL1 = rval;
  271. udelay(1000);
  272. rval |= 0x3f << 16;
  273. rSYS_SOFTRESET_CTL1 = rval;
  274. udelay(1000);
  275. #endif
  276. // Controller Initialization
  277. rval = readl(ddrs_mstr_addr);
  278. rval |= (1 << 10) | (1 << 0);
  279. writel(rval, ddrs_mstr_addr);
  280. // init ddr
  281. // step 1-3
  282. //Enables static register programming outside reset
  283. ApbWriteFun(ddrs_swctlstatic_addr, 0x1);
  284. //24:16 dram_rstn_x1024
  285. //For use with a Synopsys DDR PHY, this must be set to a minimum of 1.
  286. //ApbWriteFun(ddrs_init1_addr, 0x0001000f);
  287. ApbWriteFun(ddrs_init1_addr, 0x00010001);
  288. //[31:30] skip_dram_init
  289. //00 - SDRAM Initialization routine is run after power-up
  290. //01 - SDRAM Initialization routine is skipped after power-up.The controller starts up in normal Mode
  291. //25:16 post_cke_x1024
  292. //Indicates the number of cycles to wait after driving CKE high to start the SDRAM initialization sequence.
  293. //11:0 pre_cke_x1024
  294. //Indicates the number of cycles to wait after reset before driving CKE high to start the SDRAM initialization sequence.
  295. //ApbWriteFun_qussi(ddrs_init0_addr, 0x400f000f);
  296. ApbWriteFun_qussi(ddrs_init0_addr, 0x40ff00ff);
  297. rdata =
  298. (CAS_Latency-CWL) << 2 // rd_odt_delay
  299. | 1 << 8 // rd_odt_hold //6
  300. | 0 << 16 // wr_odt_delay //0
  301. | 1 << 24 // wr_odt_hold //6
  302. ;
  303. ApbWriteFun_qussi(ddrs_odtcfg_addr, rdata); // new add 20240925
  304. #if 1 //RBC
  305. tmp = (8 << 16) | (8 << 8) | (8 << 0);
  306. ApbWriteFun(ddrs_addrmap1_addr, tmp);
  307. tmp = (0x0 << 24) | (0x0 << 16) | (0x0 << 8) | (0x0 << 0);
  308. ApbWriteFun(ddrs_addrmap2_addr, tmp);
  309. tmp = (0x0 << 24) | (0x0 << 16) | (0x0 << 8) | (0x0 << 0);
  310. ApbWriteFun(ddrs_addrmap3_addr, tmp);
  311. tmp = (0x1f << 24) | (0x1f << 16) | (0x1f << 8) | (0x1f << 0);
  312. ApbWriteFun(ddrs_addrmap4_addr, tmp);
  313. tmp = (0x7 << 24) | (0x7 << 16) | (0x7 << 8) | (0x7 << 0);
  314. ApbWriteFun(ddrs_addrmap5_addr, tmp);
  315. // tmp = (0x0<<24) | (0x0<<16) | (0x0 << 8) | (0x7 << 0);//128M
  316. tmp = (0x0<<24) | (0x7<<16) | (0x7 << 8) | (0x7 << 0);//512M
  317. ApbWriteFun(ddrs_addrmap6_addr, tmp);
  318. #endif
  319. #if 0 //BRC
  320. tmp = (21 << 16) | (21 << 8) | (21 << 0);
  321. ApbWriteFun(ddrs_addrmap1_addr, tmp);
  322. tmp = (0x0 << 24) | (0x0 << 16) | (0x0 << 8) | (0x0 << 0);
  323. ApbWriteFun(ddrs_addrmap2_addr, tmp);
  324. tmp = (0x0 << 24) | (0x0 << 16) | (0x0 << 8) | (0x0 << 0);
  325. ApbWriteFun(ddrs_addrmap3_addr, tmp);
  326. tmp = (0x1f << 24) | (0x1f << 16) | (0x1f << 8) | (0x1f << 0);
  327. ApbWriteFun(ddrs_addrmap4_addr, tmp);
  328. tmp = (0x4 << 24) | (0x4 << 16) | (0x4 << 8) | (0X4 << 0);
  329. ApbWriteFun(ddrs_addrmap5_addr, tmp);
  330. tmp = (0x0 << 24) | (0x0 << 16) | (0x0 << 8) | (0x4 << 0);
  331. ApbWriteFun(ddrs_addrmap6_addr, tmp);
  332. #endif
  333. ApbWriteFun_qussi(ddrs_pctrl_0_addr, 0x1);
  334. ApbWriteFun_qussi(ddrs_pctrl_1_addr, 0x1);
  335. ApbWriteFun_qussi(ddrs_pctrl_2_addr, 0x1);
  336. ApbWriteFun_qussi(ddrs_pctrl_3_addr, 0x1);
  337. ApbWriteFun(ddrs_pcfg_0_addr, 0x05001);
  338. ApbWriteFun(ddrs_pcfg_1_addr, 0x013ff);
  339. ApbWriteFun(ddrs_pcfg_2_addr, 0x013ff);
  340. ApbWriteFun(ddrs_pcfg_3_addr, 0x013ff);
  341. ApbWriteFun(ddrs_pcfg_w0_addr, 0x05001);
  342. ApbWriteFun(ddrs_pcfg_w1_addr, 0x013ff);
  343. ApbWriteFun(ddrs_pcfg_w2_addr, 0x013ff);
  344. ApbWriteFun(ddrs_pcfg_w3_addr, 0x013ff);
  345. ApbWriteFun_qussi(ddrs_pcfgrqos0_0_addr, 0x00020e00);
  346. ApbWriteFun_qussi(ddrs_pcfgrqos0_1_addr, 0x00000e00);
  347. ApbWriteFun_qussi(ddrs_pcfgrqos0_2_addr, 0x00000e00);
  348. ApbWriteFun_qussi(ddrs_pcfgrqos0_3_addr, 0x00000e00);
  349. ApbWriteFun_qussi(ddrs_pcfgrqos1_0_addr, 0x00010001);
  350. ApbWriteFun_qussi(ddrs_pcfgrqos1_1_addr, 0xffffffff);
  351. ApbWriteFun_qussi(ddrs_pcfgrqos1_2_addr, 0xffffffff);
  352. ApbWriteFun_qussi(ddrs_pcfgrqos1_3_addr, 0xffffffff);
  353. ApbWriteFun_qussi(ddrs_pcfgwqos0_0_addr, 0x00000e00);
  354. ApbWriteFun_qussi(ddrs_pcfgwqos0_1_addr, 0x00000e00);
  355. ApbWriteFun_qussi(ddrs_pcfgwqos0_2_addr, 0x00000e00);
  356. ApbWriteFun_qussi(ddrs_pcfgwqos0_3_addr, 0x00000e00);
  357. ApbWriteFun_qussi(ddrs_pcfgwqos1_0_addr, 0xffffffff);
  358. ApbWriteFun_qussi(ddrs_pcfgwqos1_1_addr, 0xffffffff);
  359. ApbWriteFun_qussi(ddrs_pcfgwqos1_2_addr, 0xffffffff);
  360. ApbWriteFun_qussi(ddrs_pcfgwqos1_3_addr, 0xffffffff);
  361. rval = readl(ddrs_sched_addr);
  362. rval &= ~((0x7f << 8) | (1 << 2));
  363. rval |= (0x10 << 8) | (1 << 2);
  364. ApbWriteFun_qussi(ddrs_sched_addr, rval);
  365. rval = readl(ddrs_sched1_addr);
  366. rval &= ~0xff;
  367. rval |= 0x40;
  368. ApbWriteFun(ddrs_sched1_addr, rval);
  369. ApbWriteFun_qussi(ddrs_per1_addr, 0xff000001);
  370. ApbWriteFun_qussi(ddrs_per2_addr, 0x0800007f);
  371. ApbWriteFun_qussi(ddrs_per3_addr, 0x0800007f);
  372. ApbWriteFun_qussi(ddrs_dfimisc_addr, 0x0);
  373. //PHY Timing Register
  374. tmp = (534 << 21) | (62134 << 6) | (63 << 0);
  375. ApbWriteFun(ddrsphy_ptr0_addr, tmp); //PTR0, phy reset = 32
  376. //ApbWriteFun(0x5150002C, 0x04B05F40); //PTR4, DRAM Initial,RESET=1/RESET=0
  377. ApbWriteFun(ddrsphy_ptr4_addr, 0x0ff3ffff); //PTR4, DRAM Initial,RESET=1/RESET=0
  378. //ApbWriteFun(ddrsphy_pgcr2_addr, 0x0ff3ffff); //PTR4, DRAM Initial,RESET=1/RESET=0
  379. rdata = *((volatile unsigned int *)(ddrsphy_pgcr2_addr));
  380. rdata &= ~((0xf << 24) | 0x3FFFF);
  381. rdata |= (0xf << 24) | 0x2000;
  382. ApbWriteFun(ddrsphy_pgcr2_addr, rdata);
  383. udelay(100);
  384. // ApbWriteFun(0x51500068, 0x9F0035c7); //DTCR,Data Training Configuration Register
  385. //ApbWriteFun(ddrsphy_dtcr_addr, 0x914075c7); //DTCR,Data Training Configuration Register
  386. ApbWriteFun(ddrsphy_dtcr_addr, 0x914035c7); //DTCR,Data Training Configuration Register
  387. //ApbWriteFun(0x51500068, 0x914075c7); //DTCR,Data Training Configuration Register
  388. //phy parameters
  389. // ApbWriteFun(0x51500040, 0xF000645F); //DSGCR,DDR System General Configuration Register,rr_mode=0, dqs gate extension
  390. ApbWriteFun(ddrsphy_dsgcr_addr, 0xF000641F); //DSGCR,DDR System General Configuration Register,rr_mode=0
  391. //ApbWriteFun(0x51500040, 0xF004641F); //DSGCR,DDR System General Configuration Register,rr_mode=1
  392. ApbWriteFun(ddrsphy_dcr_addr, 0x0000040B); //DCR, 8-bank,DDR-MODE=DDR3
  393. rdata = *((volatile unsigned int *)(ddrsphy_dxccr_addr));
  394. rdata &= ~((1 << 0) | (3 << 13));
  395. rdata |= (1 << 0) | (3 << 13);
  396. ApbWriteFun(ddrsphy_dxccr_addr, rdata);
  397. //DRAM Timing Parameters Register
  398. //These timing parameters are in DRAM clock cycles
  399. //DTPR0
  400. //[3:0] tRTP 8
  401. //[7:4] tWTR 8
  402. //[11:8] tRP 11
  403. //[15:12] tRCD 11
  404. //[21:16] tRAS 32
  405. //[25:22] tRRD 8
  406. //[31:26] tRC 43
  407. //ApbWriteFun(0x51500048, 0xc226ee88);//DTPR0
  408. //DTPR0 DRAM Timing Parameter Register 0
  409. rdata = 0
  410. | (TRTP << 0) // [3:0] tRTP Internal read to precharge command delay. Valid values are 2 to 15.
  411. | (tWTR << 4) // [7:4] tWTR Internal write to read command delay. Valid values are 1 to 15.
  412. | (tRP << 8) // [11:8] tRP Precharge command period: The minimum time between a precharge command and any other command.
  413. | (tRCD << 12) // [15:12] tRCD Activate to read or write delay.
  414. | (TRAS << 16) // [21:16] tRAS Activate to precharge command delay.
  415. | (tRRD << 22) // [25:22] tRRD Activate to activate command delay (different banks).
  416. | (TRC << 26) // [31:26] tRC Activate to activate command delay (same bank).
  417. ;
  418. ApbWriteFun(ddrsphy_dtpr0_addr, rdata); // 0x012 ¨C 0x014 DTPR0-2
  419. //printf("ddrsphy_dtpr0_addr:TRTP 0x%x,tWTR 0x%x,tRP 0x%x,tRCD 0x%x,TRAS 0x%x,tRRD 0x%x,TRC 0x%x\n", TRTP,tWTR,tRP,tRCD,TRAS,tRRD,TRC);
  420. //udelay(100);
  421. //ApbWriteFun(0x51500048, 0xc21dee88);//DTPR0
  422. //DTPR1
  423. //[1:0] tMRD 0
  424. //[4:2] tMOD 0
  425. //[10:5] tFAW 24
  426. //[19:11] tRFC 58
  427. //[25:20] tWLMRD
  428. //[29:26] tWLO
  429. //[31:30] tAOND
  430. //ApbWriteFun(0x5150004C, 0x1a8373cc);//DTPR1
  431. unsigned int tMOD;
  432. if (TMOD == 12)
  433. tMOD = 0;
  434. else if (TMOD == 13)
  435. tMOD = 1;
  436. else if (TMOD == 14)
  437. tMOD = 2;
  438. else if (TMOD == 15)
  439. tMOD = 3;
  440. else if (TMOD == 16)
  441. tMOD = 4;
  442. else if (TMOD == 17)
  443. tMOD = 5;
  444. else
  445. tMOD = 0;
  446. rdata = 0
  447. | ((tMRD - 4) << 0) // [1:0] tMRD Load mode cycle time: The minimum time between a load mode register command
  448. // and any other command. For DDR3 this is the minimum time between two load mode register commands.
  449. // For DDR3, the value used for tMRD is 4 plus the value programmed in these bits,
  450. // i.e. tMRD value for DDR3 ranges from 4 to 7.
  451. | (tMOD << 2) // [4:2] tMOD Load mode update delay (DDR3 only). The minimum time between a load mode
  452. // register command and a non-load mode register command. Valid values are:
  453. // 000 = 12
  454. // 001 = 13
  455. // 010 = 14
  456. // 011 = 15
  457. // 100 = 16
  458. // 101 = 17
  459. // 110 ¨C 111 = Reserved
  460. | (DDR_CALC(40) << 5) // [10:5] tFAW 4-bank activate period. No more than 4-bank activate commands may be issued in a
  461. // given tFAW period. Only applies to 8-bank devices. Valid values are 2 to 63.
  462. // tFAW 40 ns
  463. | (DDR_CALC(110) << 11) // [19:11] tRFC Refresh-to-Refresh: Indicates the minimum time, in clock cycles, between two
  464. // refresh commands or between a refresh and an active command
  465. | (40 << 20) // [25:20] tWLMRD Minimum delay from when write leveling mode is programmed to the first
  466. // DQS/DQS# rising edge (40 nCK)
  467. | (0 << 26) // [29:26] tWLO Write leveling output delay:
  468. // tWLO 0 7.5 ns
  469. | (0x00 << 30) // [31:30] tAOND/tAOFD ODT turn-on/turn-off delays (DDR2 only).
  470. ;
  471. ApbWriteFun(ddrsphy_dtpr1_addr, rdata); // 0x012 ¨C 0x014 DTPR0-2
  472. //printf("ddrsphy_dtpr1_addr:tMRD 0x%x,tMOD 0x%x,tFAW 0x%x,tRFC 0x%x\n", (tMRD - 4),tMOD,DDR_CALC(40),DDR_CALC(110));
  473. //ApbWriteFun(0x5150004C, 0x1a83742c);//DTPR1
  474. //DTPR2
  475. //[9:0] tXS Self refresh exit delay. The minimum time between a self refresh exit command and
  476. //[14:10] tXP Power down exit delay. The minimum time between a power down exit command
  477. //[18:15] tCKE CKE minimum pulse width. Also specifies the minimum time that the SDRAM must
  478. //[28:19] tDLLK DLL locking time. Valid values are 2 to 1023. 512
  479. //[29] tRTODT Read to ODT delay (DDR3 only). Specifies whether ODT can be enabled
  480. //[30] tRTW Read to Write command delay. Valid values are:
  481. //[31] tCCD Read to read and write to write command delay. Valid values are:
  482. // ApbWriteFun(0x51500050, 0x1003e078);//DTPR2
  483. // DTPR2
  484. rdata = 0
  485. | (max(5u, DDR_CALC(110 + 10)) << 0) //[9:0] tXS Self refresh exit delay.
  486. //tXSmin: max(5 tCK, tRFC(min) + 10ns)
  487. //tRFC 110 ns
  488. | (TXP << 10) //[14:10] tXP Power down exit delay.
  489. //tXPmin: max(3tCK, 6ns)
  490. | (max(3u, DDR_CALC(5)) << 15) //[18:15] tCKE CKE minimum pulse width.
  491. //tCKE min: max(3tCK, 5ns)
  492. | (512 << 19) //[28:19] tDLLK DLL locking time. Valid values are 2 to 1023. (tDLLK 512 nCK)
  493. | (0x01 << 29) //[29] tRTODT Read to ODT delay (DDR3 only). Specifies whether ODT can be enabled
  494. //immediately after the read post-amble or one clock delay has to be added. Valid
  495. //values are:
  496. //0 = ODT may be turned on immediately after read post-amble
  497. //1 = ODT may not be turned on until one clock after the read post-amble
  498. //If tRTODT is set to 1, then the read-to-write latency is increased by 1 if ODT is
  499. //enabled.
  500. | (0x01 << 30) //[30] tRTW Read to Write command delay. Valid values are:
  501. //0 = standard bus turn around delay
  502. //1 = add 1 clock to standard bus turn around delay
  503. //This parameter allows the user to increase the delay between issuing Write
  504. //commands to the SDRAM when preceded by Read commands. This provides an
  505. //option to increase bus turn-around margin for high frequency systems.
  506. | (0x01UL << 31) //[31] tCCD Read to read and write to write command delay. Valid values are:
  507. //0 = BL/2 for DDR2 and 4 for DDR3
  508. //1 = BL/2 + 1 for DDR2 and 5 for DDR3
  509. //tCCD 4 - 4 - nCK
  510. ;
  511. ApbWriteFun(ddrsphy_dtpr2_addr, rdata); // 0x012 ¨C 0x014 DTPR0-2
  512. // printf("ddrsphy_dtpr2_addr:0x%x\n", rdata);
  513. // step 4
  514. ApbWriteFun(ddrsphy_pir_addr, 0x33); //[0-INIT]£¬[1-ZCAL][4-PLLINIT][5-DCAL]
  515. timeout = 100;
  516. while (timeout--) {
  517. udelay(20);
  518. rdata = *((volatile unsigned int *)(ddrsphy_pgsr0_addr));
  519. if ((rdata & 0x0F) == 0xf)
  520. break;
  521. }
  522. if (timeout < 0 && retries--) {
  523. printf("DDR_Init step4 timeout, retry...\n");
  524. goto restart;
  525. }
  526. if (retries < 0) {
  527. printf("DDR_Init step4 fail!\n");
  528. return;
  529. }
  530. // rdata = *((volatile unsigned int *)(ddrsphy_zq0sr0_addr));
  531. // printf("ddrsphy_zq0sr0_addr:0x%x\n",rdata );
  532. rdata =
  533. (tras_min << 0) //5:0 t_ras_min
  534. | (tras_max << 8) //14:8 t_ras_max,Specifies the maximum time between activate and precharge to same bank
  535. | (tfaw << 16) //21:16 t_faw
  536. | (wr2pre << 24) //30:24 wr2pre
  537. ; //Specifications: WL + BL/2 + tWR
  538. ApbWriteFun_qussi(ddrs_dramtmg0_addr, rdata);
  539. // printf("ddrs_dramtmg0_addr:tras_min 0x%x,tras_max 0x%x,tfaw 0x%x,wr2pre 0x%x\n", tras_min,tras_max,tfaw,wr2pre);
  540. //ApbWriteFun(ddrs_dramtmg0_addr, 0x150f4411);
  541. //rdata = *((volatile unsigned int *)(ddrs_dramtmg0_addr));
  542. //20:16 t_xp,Specifies the minimum time after power-down exit to any operation.
  543. //13:8 rd2pre=tRTP,
  544. // DDR3 - tAL + max (RoundUp(tRTP/tCK), 4)
  545. //6:0 t_rc,Specifies the minimum time between activates to same bank.
  546. // tRC/2
  547. //ApbWriteFun(ddrs_dramtmg1_addr, 0x00020614);
  548. rdata =
  549. (trc << 0) //6:0 t_rc,Specifies the minimum time between activates to same bank.
  550. // tRC/2
  551. | (trtp << 8) //13:8 rd2pre=tRTP,
  552. // DDR3 - tAL + max (RoundUp(tRTP/tCK), 4)
  553. | (txp << 16) //20:16 t_xp,Specifies the minimum time after power-down exit to any operation.
  554. ;
  555. ApbWriteFun_qussi(ddrs_dramtmg1_addr, rdata);
  556. // printf("ddrs_dramtmg1_addr:trc 0x%x,trtp 0x%x,txp 0x%x\n", trc,trtp,txp);
  557. //ApbWriteFun(ddrs_dramtmg1_addr, 0x00030818);
  558. // rdata = *((volatile unsigned int *)(ddrs_dramtmg1_addr));
  559. //WL/RL
  560. //29:24 write_latency=WL
  561. // This register field is not required for DDR2 and DDR3, as the
  562. // DFI read and write latencies defined in DFITMG0 and
  563. // DFITMG1 are sufficient for those protocols
  564. //21:16 read_latency=RL
  565. // This register field is not required for DDR2 and DDR3, as the
  566. // DFI read and write latencies defined in DFITMG0 and
  567. // DFITMG1 are sufficient for those protocols
  568. //13:8 rd2wr,Minimum time from read command to write command
  569. // DDR2/3/mDDR: RL + BL/2 + 2 - WL
  570. //5:0 wr2rd.
  571. // CWL + BL/2 + tWTR
  572. // For DDR3:
  573. // RL = CL + AL
  574. // WL = CWL + AL
  575. //ApbWriteFun(ddrs_dramtmg2_addr, 0x0305080f);
  576. //WL/RL
  577. rdata =
  578. (((CWL + 4 + twtr + 1) / 2) << 0) //5:0 wr2rd.
  579. // CWL + BL/2 + tWTR
  580. | (((RL + 6 - WL + 1) / 2) << 8) //13:8 rd2wr,Minimum time from read command to write command
  581. // DDR2/3/mDDR: RL + BL/2 + 2 - WL
  582. | (((RL + 1) / 2) << 16) //21:16 read_latency=RL
  583. //This register field is not required for DDR2 and DDR3, as the
  584. //DFI read and write latencies defined in DFITMG0 and
  585. //DFITMG1 are sufficient for those protocols
  586. | (((WL + 1) / 2) << 24) //29:24 write_latency=WL
  587. //This register field is not required for DDR2 and DDR3, as the
  588. //DFI read and write latencies defined in DFITMG0 and
  589. ;
  590. ApbWriteFun_qussi(ddrs_dramtmg2_addr, rdata);
  591. //ApbWriteFun(ddrs_dramtmg2_addr, 0x050e0f1A);
  592. //rdata = *((volatile unsigned int *)(ddrs_dramtmg2_addr));
  593. rdata =
  594. (((TMOD + 1) / 2) << 0)
  595. | (((tMRD + 1) / 2) << 12)
  596. ;
  597. ApbWriteFun_qussi(ddrs_dramtmg3_addr, rdata);
  598. //ApbWriteFun(ddrs_dramtmg3_addr, 0x0000400f);
  599. //rdata = *((volatile unsigned int *)(ddrs_dramtmg3_addr));
  600. //28:24 t_rcd, Indicates the minimum time from activate to read or write command to same bank.
  601. //19:16 t_ccd, is the minimum time between two reads or two writes.
  602. //11:8 t_rrd, Minimum time between activates from bank "a" to bank "b"
  603. //4:0 t_rp, Indicates the minimum time from single-bank precharge to activate of same bank.
  604. rdata =
  605. (((tRP + 1) / 2) << 0) //4:0 t_rp, Indicates the minimum time from single-bank precharge to activate of same bank.
  606. | (((tRRD + 1) / 2) << 8) //11:8 t_rrd, Minimum time between activates from bank "a" to bank "b"
  607. | (2 << 22) //19:16 t_ccd, is the minimum time between two reads or two writes.
  608. | (((tRCD + 1) / 2) << 24) //28:24 t_rcd, Indicates the minimum time from activate to read or write command to same bank.
  609. ;
  610. ApbWriteFun_qussi(ddrs_dramtmg4_addr, rdata);
  611. //printf("ddrs_dramtmg4_addr:0x%x\n", rdata);
  612. //ApbWriteFun(ddrs_dramtmg4_addr, 0x06040407);
  613. rdata =
  614. (tCKE << 0) // tCKE
  615. | ((tCKE + 1) << 8) // tCKESR = tCKE + 1
  616. | (((tCKSRX + 1) / 2) << 16) // tCKSRE
  617. | (((tCKSRX + 1) / 2) << 24) // tCKSRX
  618. ;
  619. ApbWriteFun_qussi(ddrs_dramtmg5_addr, rdata);
  620. //ApbWriteFun(ddrs_dramtmg5_addr, 0x0a0a0403);
  621. rdata =
  622. ((tXS + 1) << 0) // tXS x 32
  623. | (8 << 8) // tXSDLL x 32 = 512 / (2*32)
  624. ;
  625. ApbWriteFun_qussi(ddrs_dramtmg8_addr, rdata);
  626. //ApbWriteFun(ddrs_dramtmg8_addr, 0x00001406);
  627. //28:24 dfi_t_ctrl_delay
  628. //22:16 dfi_t_rddata_en
  629. //13:8 dfi_tphy_wrdata
  630. //5:0 dfi_tphy_wrlat
  631. //ApbWriteFun(ddrs_dfitmg0_addr, 0x02020102);
  632. // DFITRDDATAEN
  633. // trddata_en
  634. rdata =
  635. (((WL - 3) / 2) << 0) // dfi_tphy_wrlat
  636. | (1 << 8) // dfi_tphy_wrdata
  637. | (((RL - 3) / 2) << 16) // dfi_t_rddata_en
  638. | (2 << 24) // dfi_t_ctrl_delay
  639. ;
  640. ApbWriteFun_qussi(ddrs_dfitmg0_addr, rdata);
  641. // delay(3000);
  642. //DFITMG1
  643. //31:28 dfi_t_cmd_lat
  644. //20:16 dfi_t_wrdata_delay
  645. //12:8 dfi_t_dram_clk_disable
  646. ApbWriteFun_qussi(ddrs_dfitmg1_addr, 0x01010202);
  647. timeout = 100;
  648. while (timeout--) {
  649. udelay(20);
  650. rdata = *((volatile unsigned int *)(ddrs_stat_addr));
  651. if ((rdata & 0x03) == 0x01)
  652. break;
  653. }
  654. if (timeout < 0 && retries--) {
  655. printf("DDR_Init step10 timeout, retry...\n");
  656. goto restart;
  657. }
  658. if (retries < 0) {
  659. printf("DDR_Init step10 fail!\n");
  660. return;
  661. }
  662. ApbWriteFun_qussi(ddrs_rfshctl3_addr, 0x1);
  663. ApbWriteFun_qussi(ddrs_rfshtmg_addr, 0x88002c);
  664. ApbWriteFun_qussi(ddrs_pwrctl_addr, 0x00);
  665. mrdata = 0
  666. | MR2_CWL
  667. | MCTL_MR2_Rtt_WR_RZQ_4;
  668. ApbWriteFun(ddrsphy_mr2_addr, mrdata);
  669. ApbWriteFun(ddrsphy_mr3_addr, 0x00000000);
  670. mrdata = 0
  671. | MCTL_MR1_DLL_Enable
  672. | MCTL_MR1_DIC_RZQ_7 // Output Driver Impedance Control
  673. | MCTL_MR1_Rtt_Nom_RZQ_6 // If RTT_Nom is used during Writes, only the values RZQ/2, RZQ/4 and RZQ/6 are allowed.
  674. #if AL_0
  675. | MCTL_MR1_AL_0_disabled
  676. #elif AL_1
  677. | MCTL_MR1_AL_CL_1
  678. #elif AL_2
  679. | MCTL_MR1_AL_CL_2
  680. #endif
  681. //| MCTL_MR1_Write_leveling_Enabled
  682. | MCTL_MR1_Write_leveling_Disabled
  683. | MCTL_MR1_Qoff_Output_buffer_enabled
  684. ;
  685. ApbWriteFun(ddrsphy_mr1_addr, mrdata);
  686. unsigned int WR_cycle;
  687. if (WR == 16)
  688. WR_cycle = 0;
  689. else if (WR == 5)
  690. WR_cycle = 1;
  691. else if (WR == 6)
  692. WR_cycle = 2;
  693. else if (WR == 7)
  694. WR_cycle = 3;
  695. else if (WR == 8)
  696. WR_cycle = 4;
  697. else if (WR == 10)
  698. WR_cycle = 5;
  699. else if (WR == 12)
  700. WR_cycle = 6;
  701. else if (WR == 14)
  702. WR_cycle = 7;
  703. else
  704. return;
  705. mrdata = 0
  706. | MCTL_MR0_BL_8_Fixed
  707. | MR0_CL
  708. | MCTL_MR0_TM_Normal
  709. | MCTL_MR0_DLL_Reset_Yes
  710. | MCTL_MR0_WR(WR_cycle)
  711. | MCTL_MR0_PPD_Fast_exit
  712. ;
  713. ApbWriteFun(ddrsphy_mr0_addr, mrdata); // 0x015 MR0
  714. udelay(1000);
  715. ApbWriteFun(ddrsphy_pir_addr, 0x00050ff3);
  716. udelay(3000);
  717. // step 16
  718. timeout = 100;
  719. while (timeout--) {
  720. udelay(20);
  721. rdata = *((volatile unsigned int *)(ddrsphy_pgsr0_addr));
  722. //PrintVariableValueHex("ddrsphy_pgsr0_addr : ", rdata);
  723. if (rdata == 0x900000ff)
  724. break;
  725. }
  726. if (timeout < 0 && retries--) {
  727. printf("DDR_Init step16 timeout, retry...\n");
  728. goto restart;
  729. }
  730. if (retries < 0) {
  731. printf("DDR_Init step16 fail!\n");
  732. return;
  733. }
  734. ApbWriteFun_qussi(ddrs_rfshctl3_addr, 0x0);
  735. ApbWriteFun(ddrs_swctlstatic_addr, 0x0);
  736. }
  737. void ddr3_sdramc_init(void)
  738. {
  739. ddr_init();
  740. }