sdram_rk3399.c 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238
  1. /*
  2. * (C) Copyright 2016-2017 Rockchip Inc.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0
  5. *
  6. * Adapted from coreboot.
  7. */
  8. #include <common.h>
  9. #include <clk.h>
  10. #include <dm.h>
  11. #include <dt-structs.h>
  12. #include <ram.h>
  13. #include <regmap.h>
  14. #include <syscon.h>
  15. #include <asm/io.h>
  16. #include <asm/arch/clock.h>
  17. #include <asm/arch/sdram_common.h>
  18. #include <asm/arch/sdram_rk3399.h>
  19. #include <asm/arch/cru_rk3399.h>
  20. #include <asm/arch/grf_rk3399.h>
  21. #include <asm/arch/hardware.h>
  22. #include <linux/err.h>
  23. #include <time.h>
  24. DECLARE_GLOBAL_DATA_PTR;
  25. struct chan_info {
  26. struct rk3399_ddr_pctl_regs *pctl;
  27. struct rk3399_ddr_pi_regs *pi;
  28. struct rk3399_ddr_publ_regs *publ;
  29. struct rk3399_msch_regs *msch;
  30. };
  31. struct dram_info {
  32. #ifdef CONFIG_SPL_BUILD
  33. struct chan_info chan[2];
  34. struct clk ddr_clk;
  35. struct rk3399_cru *cru;
  36. struct rk3399_pmucru *pmucru;
  37. struct rk3399_pmusgrf_regs *pmusgrf;
  38. struct rk3399_ddr_cic_regs *cic;
  39. #endif
  40. struct ram_info info;
  41. struct rk3399_pmugrf_regs *pmugrf;
  42. };
  43. #define PRESET_SGRF_HOLD(n) ((0x1 << (6 + 16)) | ((n) << 6))
  44. #define PRESET_GPIO0_HOLD(n) ((0x1 << (7 + 16)) | ((n) << 7))
  45. #define PRESET_GPIO1_HOLD(n) ((0x1 << (8 + 16)) | ((n) << 8))
  46. #define PHY_DRV_ODT_Hi_Z 0x0
  47. #define PHY_DRV_ODT_240 0x1
  48. #define PHY_DRV_ODT_120 0x8
  49. #define PHY_DRV_ODT_80 0x9
  50. #define PHY_DRV_ODT_60 0xc
  51. #define PHY_DRV_ODT_48 0xd
  52. #define PHY_DRV_ODT_40 0xe
  53. #define PHY_DRV_ODT_34_3 0xf
  54. #ifdef CONFIG_SPL_BUILD
  55. struct rockchip_dmc_plat {
  56. #if CONFIG_IS_ENABLED(OF_PLATDATA)
  57. struct dtd_rockchip_rk3399_dmc dtplat;
  58. #else
  59. struct rk3399_sdram_params sdram_params;
  60. #endif
  61. struct regmap *map;
  62. };
  63. static void copy_to_reg(u32 *dest, const u32 *src, u32 n)
  64. {
  65. int i;
  66. for (i = 0; i < n / sizeof(u32); i++) {
  67. writel(*src, dest);
  68. src++;
  69. dest++;
  70. }
  71. }
  72. static void phy_dll_bypass_set(struct rk3399_ddr_publ_regs *ddr_publ_regs,
  73. u32 freq)
  74. {
  75. u32 *denali_phy = ddr_publ_regs->denali_phy;
  76. /* From IP spec, only freq small than 125 can enter dll bypass mode */
  77. if (freq <= 125) {
  78. /* phy_sw_master_mode_X PHY_86/214/342/470 4bits offset_8 */
  79. setbits_le32(&denali_phy[86], (0x3 << 2) << 8);
  80. setbits_le32(&denali_phy[214], (0x3 << 2) << 8);
  81. setbits_le32(&denali_phy[342], (0x3 << 2) << 8);
  82. setbits_le32(&denali_phy[470], (0x3 << 2) << 8);
  83. /* phy_adrctl_sw_master_mode PHY_547/675/803 4bits offset_16 */
  84. setbits_le32(&denali_phy[547], (0x3 << 2) << 16);
  85. setbits_le32(&denali_phy[675], (0x3 << 2) << 16);
  86. setbits_le32(&denali_phy[803], (0x3 << 2) << 16);
  87. } else {
  88. /* phy_sw_master_mode_X PHY_86/214/342/470 4bits offset_8 */
  89. clrbits_le32(&denali_phy[86], (0x3 << 2) << 8);
  90. clrbits_le32(&denali_phy[214], (0x3 << 2) << 8);
  91. clrbits_le32(&denali_phy[342], (0x3 << 2) << 8);
  92. clrbits_le32(&denali_phy[470], (0x3 << 2) << 8);
  93. /* phy_adrctl_sw_master_mode PHY_547/675/803 4bits offset_16 */
  94. clrbits_le32(&denali_phy[547], (0x3 << 2) << 16);
  95. clrbits_le32(&denali_phy[675], (0x3 << 2) << 16);
  96. clrbits_le32(&denali_phy[803], (0x3 << 2) << 16);
  97. }
  98. }
  99. static void set_memory_map(const struct chan_info *chan, u32 channel,
  100. const struct rk3399_sdram_params *sdram_params)
  101. {
  102. const struct rk3399_sdram_channel *sdram_ch =
  103. &sdram_params->ch[channel];
  104. u32 *denali_ctl = chan->pctl->denali_ctl;
  105. u32 *denali_pi = chan->pi->denali_pi;
  106. u32 cs_map;
  107. u32 reduc;
  108. u32 row;
  109. /* Get row number from ddrconfig setting */
  110. if (sdram_ch->ddrconfig < 2 || sdram_ch->ddrconfig == 4)
  111. row = 16;
  112. else if (sdram_ch->ddrconfig == 3)
  113. row = 14;
  114. else
  115. row = 15;
  116. cs_map = (sdram_ch->rank > 1) ? 3 : 1;
  117. reduc = (sdram_ch->bw == 2) ? 0 : 1;
  118. /* Set the dram configuration to ctrl */
  119. clrsetbits_le32(&denali_ctl[191], 0xF, (12 - sdram_ch->col));
  120. clrsetbits_le32(&denali_ctl[190], (0x3 << 16) | (0x7 << 24),
  121. ((3 - sdram_ch->bk) << 16) |
  122. ((16 - row) << 24));
  123. clrsetbits_le32(&denali_ctl[196], 0x3 | (1 << 16),
  124. cs_map | (reduc << 16));
  125. /* PI_199 PI_COL_DIFF:RW:0:4 */
  126. clrsetbits_le32(&denali_pi[199], 0xF, (12 - sdram_ch->col));
  127. /* PI_155 PI_ROW_DIFF:RW:24:3 PI_BANK_DIFF:RW:16:2 */
  128. clrsetbits_le32(&denali_pi[155], (0x3 << 16) | (0x7 << 24),
  129. ((3 - sdram_ch->bk) << 16) |
  130. ((16 - row) << 24));
  131. /* PI_41 PI_CS_MAP:RW:24:4 */
  132. clrsetbits_le32(&denali_pi[41], 0xf << 24, cs_map << 24);
  133. if ((sdram_ch->rank == 1) && (sdram_params->base.dramtype == DDR3))
  134. writel(0x2EC7FFFF, &denali_pi[34]);
  135. }
  136. static void set_ds_odt(const struct chan_info *chan,
  137. const struct rk3399_sdram_params *sdram_params)
  138. {
  139. u32 *denali_phy = chan->publ->denali_phy;
  140. u32 tsel_idle_en, tsel_wr_en, tsel_rd_en;
  141. u32 tsel_idle_select_p, tsel_wr_select_p, tsel_rd_select_p;
  142. u32 ca_tsel_wr_select_p, ca_tsel_wr_select_n;
  143. u32 tsel_idle_select_n, tsel_wr_select_n, tsel_rd_select_n;
  144. u32 reg_value;
  145. if (sdram_params->base.dramtype == LPDDR4) {
  146. tsel_rd_select_p = PHY_DRV_ODT_Hi_Z;
  147. tsel_wr_select_p = PHY_DRV_ODT_40;
  148. ca_tsel_wr_select_p = PHY_DRV_ODT_40;
  149. tsel_idle_select_p = PHY_DRV_ODT_Hi_Z;
  150. tsel_rd_select_n = PHY_DRV_ODT_240;
  151. tsel_wr_select_n = PHY_DRV_ODT_40;
  152. ca_tsel_wr_select_n = PHY_DRV_ODT_40;
  153. tsel_idle_select_n = PHY_DRV_ODT_240;
  154. } else if (sdram_params->base.dramtype == LPDDR3) {
  155. tsel_rd_select_p = PHY_DRV_ODT_240;
  156. tsel_wr_select_p = PHY_DRV_ODT_34_3;
  157. ca_tsel_wr_select_p = PHY_DRV_ODT_48;
  158. tsel_idle_select_p = PHY_DRV_ODT_240;
  159. tsel_rd_select_n = PHY_DRV_ODT_Hi_Z;
  160. tsel_wr_select_n = PHY_DRV_ODT_34_3;
  161. ca_tsel_wr_select_n = PHY_DRV_ODT_48;
  162. tsel_idle_select_n = PHY_DRV_ODT_Hi_Z;
  163. } else {
  164. tsel_rd_select_p = PHY_DRV_ODT_240;
  165. tsel_wr_select_p = PHY_DRV_ODT_34_3;
  166. ca_tsel_wr_select_p = PHY_DRV_ODT_34_3;
  167. tsel_idle_select_p = PHY_DRV_ODT_240;
  168. tsel_rd_select_n = PHY_DRV_ODT_240;
  169. tsel_wr_select_n = PHY_DRV_ODT_34_3;
  170. ca_tsel_wr_select_n = PHY_DRV_ODT_34_3;
  171. tsel_idle_select_n = PHY_DRV_ODT_240;
  172. }
  173. if (sdram_params->base.odt == 1)
  174. tsel_rd_en = 1;
  175. else
  176. tsel_rd_en = 0;
  177. tsel_wr_en = 0;
  178. tsel_idle_en = 0;
  179. /*
  180. * phy_dq_tsel_select_X 24bits DENALI_PHY_6/134/262/390 offset_0
  181. * sets termination values for read/idle cycles and drive strength
  182. * for write cycles for DQ/DM
  183. */
  184. reg_value = tsel_rd_select_n | (tsel_rd_select_p << 0x4) |
  185. (tsel_wr_select_n << 8) | (tsel_wr_select_p << 12) |
  186. (tsel_idle_select_n << 16) | (tsel_idle_select_p << 20);
  187. clrsetbits_le32(&denali_phy[6], 0xffffff, reg_value);
  188. clrsetbits_le32(&denali_phy[134], 0xffffff, reg_value);
  189. clrsetbits_le32(&denali_phy[262], 0xffffff, reg_value);
  190. clrsetbits_le32(&denali_phy[390], 0xffffff, reg_value);
  191. /*
  192. * phy_dqs_tsel_select_X 24bits DENALI_PHY_7/135/263/391 offset_0
  193. * sets termination values for read/idle cycles and drive strength
  194. * for write cycles for DQS
  195. */
  196. clrsetbits_le32(&denali_phy[7], 0xffffff, reg_value);
  197. clrsetbits_le32(&denali_phy[135], 0xffffff, reg_value);
  198. clrsetbits_le32(&denali_phy[263], 0xffffff, reg_value);
  199. clrsetbits_le32(&denali_phy[391], 0xffffff, reg_value);
  200. /* phy_adr_tsel_select_ 8bits DENALI_PHY_544/672/800 offset_0 */
  201. reg_value = ca_tsel_wr_select_n | (ca_tsel_wr_select_p << 0x4);
  202. clrsetbits_le32(&denali_phy[544], 0xff, reg_value);
  203. clrsetbits_le32(&denali_phy[672], 0xff, reg_value);
  204. clrsetbits_le32(&denali_phy[800], 0xff, reg_value);
  205. /* phy_pad_addr_drive 8bits DENALI_PHY_928 offset_0 */
  206. clrsetbits_le32(&denali_phy[928], 0xff, reg_value);
  207. /* phy_pad_rst_drive 8bits DENALI_PHY_937 offset_0 */
  208. clrsetbits_le32(&denali_phy[937], 0xff, reg_value);
  209. /* phy_pad_cke_drive 8bits DENALI_PHY_935 offset_0 */
  210. clrsetbits_le32(&denali_phy[935], 0xff, reg_value);
  211. /* phy_pad_cs_drive 8bits DENALI_PHY_939 offset_0 */
  212. clrsetbits_le32(&denali_phy[939], 0xff, reg_value);
  213. /* phy_pad_clk_drive 8bits DENALI_PHY_929 offset_0 */
  214. clrsetbits_le32(&denali_phy[929], 0xff, reg_value);
  215. /* phy_pad_fdbk_drive 23bit DENALI_PHY_924/925 */
  216. clrsetbits_le32(&denali_phy[924], 0xff,
  217. tsel_wr_select_n | (tsel_wr_select_p << 4));
  218. clrsetbits_le32(&denali_phy[925], 0xff,
  219. tsel_rd_select_n | (tsel_rd_select_p << 4));
  220. /* phy_dq_tsel_enable_X 3bits DENALI_PHY_5/133/261/389 offset_16 */
  221. reg_value = (tsel_rd_en | (tsel_wr_en << 1) | (tsel_idle_en << 2))
  222. << 16;
  223. clrsetbits_le32(&denali_phy[5], 0x7 << 16, reg_value);
  224. clrsetbits_le32(&denali_phy[133], 0x7 << 16, reg_value);
  225. clrsetbits_le32(&denali_phy[261], 0x7 << 16, reg_value);
  226. clrsetbits_le32(&denali_phy[389], 0x7 << 16, reg_value);
  227. /* phy_dqs_tsel_enable_X 3bits DENALI_PHY_6/134/262/390 offset_24 */
  228. reg_value = (tsel_rd_en | (tsel_wr_en << 1) | (tsel_idle_en << 2))
  229. << 24;
  230. clrsetbits_le32(&denali_phy[6], 0x7 << 24, reg_value);
  231. clrsetbits_le32(&denali_phy[134], 0x7 << 24, reg_value);
  232. clrsetbits_le32(&denali_phy[262], 0x7 << 24, reg_value);
  233. clrsetbits_le32(&denali_phy[390], 0x7 << 24, reg_value);
  234. /* phy_adr_tsel_enable_ 1bit DENALI_PHY_518/646/774 offset_8 */
  235. reg_value = tsel_wr_en << 8;
  236. clrsetbits_le32(&denali_phy[518], 0x1 << 8, reg_value);
  237. clrsetbits_le32(&denali_phy[646], 0x1 << 8, reg_value);
  238. clrsetbits_le32(&denali_phy[774], 0x1 << 8, reg_value);
  239. /* phy_pad_addr_term tsel 1bit DENALI_PHY_933 offset_17 */
  240. reg_value = tsel_wr_en << 17;
  241. clrsetbits_le32(&denali_phy[933], 0x1 << 17, reg_value);
  242. /*
  243. * pad_rst/cke/cs/clk_term tsel 1bits
  244. * DENALI_PHY_938/936/940/934 offset_17
  245. */
  246. clrsetbits_le32(&denali_phy[938], 0x1 << 17, reg_value);
  247. clrsetbits_le32(&denali_phy[936], 0x1 << 17, reg_value);
  248. clrsetbits_le32(&denali_phy[940], 0x1 << 17, reg_value);
  249. clrsetbits_le32(&denali_phy[934], 0x1 << 17, reg_value);
  250. /* phy_pad_fdbk_term 1bit DENALI_PHY_930 offset_17 */
  251. clrsetbits_le32(&denali_phy[930], 0x1 << 17, reg_value);
  252. }
  253. static int phy_io_config(const struct chan_info *chan,
  254. const struct rk3399_sdram_params *sdram_params)
  255. {
  256. u32 *denali_phy = chan->publ->denali_phy;
  257. u32 vref_mode_dq, vref_value_dq, vref_mode_ac, vref_value_ac;
  258. u32 mode_sel;
  259. u32 reg_value;
  260. u32 drv_value, odt_value;
  261. u32 speed;
  262. /* vref setting */
  263. if (sdram_params->base.dramtype == LPDDR4) {
  264. /* LPDDR4 */
  265. vref_mode_dq = 0x6;
  266. vref_value_dq = 0x1f;
  267. vref_mode_ac = 0x6;
  268. vref_value_ac = 0x1f;
  269. } else if (sdram_params->base.dramtype == LPDDR3) {
  270. if (sdram_params->base.odt == 1) {
  271. vref_mode_dq = 0x5; /* LPDDR3 ODT */
  272. drv_value = (readl(&denali_phy[6]) >> 12) & 0xf;
  273. odt_value = (readl(&denali_phy[6]) >> 4) & 0xf;
  274. if (drv_value == PHY_DRV_ODT_48) {
  275. switch (odt_value) {
  276. case PHY_DRV_ODT_240:
  277. vref_value_dq = 0x16;
  278. break;
  279. case PHY_DRV_ODT_120:
  280. vref_value_dq = 0x26;
  281. break;
  282. case PHY_DRV_ODT_60:
  283. vref_value_dq = 0x36;
  284. break;
  285. default:
  286. debug("Invalid ODT value.\n");
  287. return -EINVAL;
  288. }
  289. } else if (drv_value == PHY_DRV_ODT_40) {
  290. switch (odt_value) {
  291. case PHY_DRV_ODT_240:
  292. vref_value_dq = 0x19;
  293. break;
  294. case PHY_DRV_ODT_120:
  295. vref_value_dq = 0x23;
  296. break;
  297. case PHY_DRV_ODT_60:
  298. vref_value_dq = 0x31;
  299. break;
  300. default:
  301. debug("Invalid ODT value.\n");
  302. return -EINVAL;
  303. }
  304. } else if (drv_value == PHY_DRV_ODT_34_3) {
  305. switch (odt_value) {
  306. case PHY_DRV_ODT_240:
  307. vref_value_dq = 0x17;
  308. break;
  309. case PHY_DRV_ODT_120:
  310. vref_value_dq = 0x20;
  311. break;
  312. case PHY_DRV_ODT_60:
  313. vref_value_dq = 0x2e;
  314. break;
  315. default:
  316. debug("Invalid ODT value.\n");
  317. return -EINVAL;
  318. }
  319. } else {
  320. debug("Invalid DRV value.\n");
  321. return -EINVAL;
  322. }
  323. } else {
  324. vref_mode_dq = 0x2; /* LPDDR3 */
  325. vref_value_dq = 0x1f;
  326. }
  327. vref_mode_ac = 0x2;
  328. vref_value_ac = 0x1f;
  329. } else if (sdram_params->base.dramtype == DDR3) {
  330. /* DDR3L */
  331. vref_mode_dq = 0x1;
  332. vref_value_dq = 0x1f;
  333. vref_mode_ac = 0x1;
  334. vref_value_ac = 0x1f;
  335. } else {
  336. debug("Unknown DRAM type.\n");
  337. return -EINVAL;
  338. }
  339. reg_value = (vref_mode_dq << 9) | (0x1 << 8) | vref_value_dq;
  340. /* PHY_913 PHY_PAD_VREF_CTRL_DQ_0 12bits offset_8 */
  341. clrsetbits_le32(&denali_phy[913], 0xfff << 8, reg_value << 8);
  342. /* PHY_914 PHY_PAD_VREF_CTRL_DQ_1 12bits offset_0 */
  343. clrsetbits_le32(&denali_phy[914], 0xfff, reg_value);
  344. /* PHY_914 PHY_PAD_VREF_CTRL_DQ_2 12bits offset_16 */
  345. clrsetbits_le32(&denali_phy[914], 0xfff << 16, reg_value << 16);
  346. /* PHY_915 PHY_PAD_VREF_CTRL_DQ_3 12bits offset_0 */
  347. clrsetbits_le32(&denali_phy[915], 0xfff, reg_value);
  348. reg_value = (vref_mode_ac << 9) | (0x1 << 8) | vref_value_ac;
  349. /* PHY_915 PHY_PAD_VREF_CTRL_AC 12bits offset_16 */
  350. clrsetbits_le32(&denali_phy[915], 0xfff << 16, reg_value << 16);
  351. if (sdram_params->base.dramtype == LPDDR4)
  352. mode_sel = 0x6;
  353. else if (sdram_params->base.dramtype == LPDDR3)
  354. mode_sel = 0x0;
  355. else if (sdram_params->base.dramtype == DDR3)
  356. mode_sel = 0x1;
  357. else
  358. return -EINVAL;
  359. /* PHY_924 PHY_PAD_FDBK_DRIVE */
  360. clrsetbits_le32(&denali_phy[924], 0x7 << 15, mode_sel << 15);
  361. /* PHY_926 PHY_PAD_DATA_DRIVE */
  362. clrsetbits_le32(&denali_phy[926], 0x7 << 6, mode_sel << 6);
  363. /* PHY_927 PHY_PAD_DQS_DRIVE */
  364. clrsetbits_le32(&denali_phy[927], 0x7 << 6, mode_sel << 6);
  365. /* PHY_928 PHY_PAD_ADDR_DRIVE */
  366. clrsetbits_le32(&denali_phy[928], 0x7 << 14, mode_sel << 14);
  367. /* PHY_929 PHY_PAD_CLK_DRIVE */
  368. clrsetbits_le32(&denali_phy[929], 0x7 << 14, mode_sel << 14);
  369. /* PHY_935 PHY_PAD_CKE_DRIVE */
  370. clrsetbits_le32(&denali_phy[935], 0x7 << 14, mode_sel << 14);
  371. /* PHY_937 PHY_PAD_RST_DRIVE */
  372. clrsetbits_le32(&denali_phy[937], 0x7 << 14, mode_sel << 14);
  373. /* PHY_939 PHY_PAD_CS_DRIVE */
  374. clrsetbits_le32(&denali_phy[939], 0x7 << 14, mode_sel << 14);
  375. /* speed setting */
  376. if (sdram_params->base.ddr_freq < 400)
  377. speed = 0x0;
  378. else if (sdram_params->base.ddr_freq < 800)
  379. speed = 0x1;
  380. else if (sdram_params->base.ddr_freq < 1200)
  381. speed = 0x2;
  382. else
  383. speed = 0x3;
  384. /* PHY_924 PHY_PAD_FDBK_DRIVE */
  385. clrsetbits_le32(&denali_phy[924], 0x3 << 21, speed << 21);
  386. /* PHY_926 PHY_PAD_DATA_DRIVE */
  387. clrsetbits_le32(&denali_phy[926], 0x3 << 9, speed << 9);
  388. /* PHY_927 PHY_PAD_DQS_DRIVE */
  389. clrsetbits_le32(&denali_phy[927], 0x3 << 9, speed << 9);
  390. /* PHY_928 PHY_PAD_ADDR_DRIVE */
  391. clrsetbits_le32(&denali_phy[928], 0x3 << 17, speed << 17);
  392. /* PHY_929 PHY_PAD_CLK_DRIVE */
  393. clrsetbits_le32(&denali_phy[929], 0x3 << 17, speed << 17);
  394. /* PHY_935 PHY_PAD_CKE_DRIVE */
  395. clrsetbits_le32(&denali_phy[935], 0x3 << 17, speed << 17);
  396. /* PHY_937 PHY_PAD_RST_DRIVE */
  397. clrsetbits_le32(&denali_phy[937], 0x3 << 17, speed << 17);
  398. /* PHY_939 PHY_PAD_CS_DRIVE */
  399. clrsetbits_le32(&denali_phy[939], 0x3 << 17, speed << 17);
  400. return 0;
  401. }
  402. static int pctl_cfg(const struct chan_info *chan, u32 channel,
  403. const struct rk3399_sdram_params *sdram_params)
  404. {
  405. u32 *denali_ctl = chan->pctl->denali_ctl;
  406. u32 *denali_pi = chan->pi->denali_pi;
  407. u32 *denali_phy = chan->publ->denali_phy;
  408. const u32 *params_ctl = sdram_params->pctl_regs.denali_ctl;
  409. const u32 *params_phy = sdram_params->phy_regs.denali_phy;
  410. u32 tmp, tmp1, tmp2;
  411. u32 pwrup_srefresh_exit;
  412. int ret;
  413. const ulong timeout_ms = 200;
  414. /*
  415. * work around controller bug:
  416. * Do not program DRAM_CLASS until NO_PHY_IND_TRAIN_INT is programmed
  417. */
  418. copy_to_reg(&denali_ctl[1], &params_ctl[1],
  419. sizeof(struct rk3399_ddr_pctl_regs) - 4);
  420. writel(params_ctl[0], &denali_ctl[0]);
  421. copy_to_reg(denali_pi, &sdram_params->pi_regs.denali_pi[0],
  422. sizeof(struct rk3399_ddr_pi_regs));
  423. /* rank count need to set for init */
  424. set_memory_map(chan, channel, sdram_params);
  425. writel(sdram_params->phy_regs.denali_phy[910], &denali_phy[910]);
  426. writel(sdram_params->phy_regs.denali_phy[911], &denali_phy[911]);
  427. writel(sdram_params->phy_regs.denali_phy[912], &denali_phy[912]);
  428. pwrup_srefresh_exit = readl(&denali_ctl[68]) & PWRUP_SREFRESH_EXIT;
  429. clrbits_le32(&denali_ctl[68], PWRUP_SREFRESH_EXIT);
  430. /* PHY_DLL_RST_EN */
  431. clrsetbits_le32(&denali_phy[957], 0x3 << 24, 1 << 24);
  432. setbits_le32(&denali_pi[0], START);
  433. setbits_le32(&denali_ctl[0], START);
  434. /* Wating for phy DLL lock */
  435. while (1) {
  436. tmp = readl(&denali_phy[920]);
  437. tmp1 = readl(&denali_phy[921]);
  438. tmp2 = readl(&denali_phy[922]);
  439. if ((((tmp >> 16) & 0x1) == 0x1) &&
  440. (((tmp1 >> 16) & 0x1) == 0x1) &&
  441. (((tmp1 >> 0) & 0x1) == 0x1) &&
  442. (((tmp2 >> 0) & 0x1) == 0x1))
  443. break;
  444. }
  445. copy_to_reg(&denali_phy[896], &params_phy[896], (958 - 895) * 4);
  446. copy_to_reg(&denali_phy[0], &params_phy[0], (90 - 0 + 1) * 4);
  447. copy_to_reg(&denali_phy[128], &params_phy[128], (218 - 128 + 1) * 4);
  448. copy_to_reg(&denali_phy[256], &params_phy[256], (346 - 256 + 1) * 4);
  449. copy_to_reg(&denali_phy[384], &params_phy[384], (474 - 384 + 1) * 4);
  450. copy_to_reg(&denali_phy[512], &params_phy[512], (549 - 512 + 1) * 4);
  451. copy_to_reg(&denali_phy[640], &params_phy[640], (677 - 640 + 1) * 4);
  452. copy_to_reg(&denali_phy[768], &params_phy[768], (805 - 768 + 1) * 4);
  453. set_ds_odt(chan, sdram_params);
  454. /*
  455. * phy_dqs_tsel_wr_timing_X 8bits DENALI_PHY_84/212/340/468 offset_8
  456. * dqs_tsel_wr_end[7:4] add Half cycle
  457. */
  458. tmp = (readl(&denali_phy[84]) >> 8) & 0xff;
  459. clrsetbits_le32(&denali_phy[84], 0xff << 8, (tmp + 0x10) << 8);
  460. tmp = (readl(&denali_phy[212]) >> 8) & 0xff;
  461. clrsetbits_le32(&denali_phy[212], 0xff << 8, (tmp + 0x10) << 8);
  462. tmp = (readl(&denali_phy[340]) >> 8) & 0xff;
  463. clrsetbits_le32(&denali_phy[340], 0xff << 8, (tmp + 0x10) << 8);
  464. tmp = (readl(&denali_phy[468]) >> 8) & 0xff;
  465. clrsetbits_le32(&denali_phy[468], 0xff << 8, (tmp + 0x10) << 8);
  466. /*
  467. * phy_dqs_tsel_wr_timing_X 8bits DENALI_PHY_83/211/339/467 offset_8
  468. * dq_tsel_wr_end[7:4] add Half cycle
  469. */
  470. tmp = (readl(&denali_phy[83]) >> 16) & 0xff;
  471. clrsetbits_le32(&denali_phy[83], 0xff << 16, (tmp + 0x10) << 16);
  472. tmp = (readl(&denali_phy[211]) >> 16) & 0xff;
  473. clrsetbits_le32(&denali_phy[211], 0xff << 16, (tmp + 0x10) << 16);
  474. tmp = (readl(&denali_phy[339]) >> 16) & 0xff;
  475. clrsetbits_le32(&denali_phy[339], 0xff << 16, (tmp + 0x10) << 16);
  476. tmp = (readl(&denali_phy[467]) >> 16) & 0xff;
  477. clrsetbits_le32(&denali_phy[467], 0xff << 16, (tmp + 0x10) << 16);
  478. ret = phy_io_config(chan, sdram_params);
  479. if (ret)
  480. return ret;
  481. /* PHY_DLL_RST_EN */
  482. clrsetbits_le32(&denali_phy[957], 0x3 << 24, 0x2 << 24);
  483. /* Wating for PHY and DRAM init complete */
  484. tmp = get_timer(0);
  485. do {
  486. if (get_timer(tmp) > timeout_ms) {
  487. pr_err("DRAM (%s): phy failed to lock within %ld ms\n",
  488. __func__, timeout_ms);
  489. return -ETIME;
  490. }
  491. } while (!(readl(&denali_ctl[203]) & (1 << 3)));
  492. debug("DRAM (%s): phy locked after %ld ms\n", __func__, get_timer(tmp));
  493. clrsetbits_le32(&denali_ctl[68], PWRUP_SREFRESH_EXIT,
  494. pwrup_srefresh_exit);
  495. return 0;
  496. }
  497. static void select_per_cs_training_index(const struct chan_info *chan,
  498. u32 rank)
  499. {
  500. u32 *denali_phy = chan->publ->denali_phy;
  501. /* PHY_84 PHY_PER_CS_TRAINING_EN_0 1bit offset_16 */
  502. if ((readl(&denali_phy[84])>>16) & 1) {
  503. /*
  504. * PHY_8/136/264/392
  505. * phy_per_cs_training_index_X 1bit offset_24
  506. */
  507. clrsetbits_le32(&denali_phy[8], 0x1 << 24, rank << 24);
  508. clrsetbits_le32(&denali_phy[136], 0x1 << 24, rank << 24);
  509. clrsetbits_le32(&denali_phy[264], 0x1 << 24, rank << 24);
  510. clrsetbits_le32(&denali_phy[392], 0x1 << 24, rank << 24);
  511. }
  512. }
  513. static void override_write_leveling_value(const struct chan_info *chan)
  514. {
  515. u32 *denali_ctl = chan->pctl->denali_ctl;
  516. u32 *denali_phy = chan->publ->denali_phy;
  517. u32 byte;
  518. /* PHY_896 PHY_FREQ_SEL_MULTICAST_EN 1bit offset_0 */
  519. setbits_le32(&denali_phy[896], 1);
  520. /*
  521. * PHY_8/136/264/392
  522. * phy_per_cs_training_multicast_en_X 1bit offset_16
  523. */
  524. clrsetbits_le32(&denali_phy[8], 0x1 << 16, 1 << 16);
  525. clrsetbits_le32(&denali_phy[136], 0x1 << 16, 1 << 16);
  526. clrsetbits_le32(&denali_phy[264], 0x1 << 16, 1 << 16);
  527. clrsetbits_le32(&denali_phy[392], 0x1 << 16, 1 << 16);
  528. for (byte = 0; byte < 4; byte++)
  529. clrsetbits_le32(&denali_phy[63 + (128 * byte)], 0xffff << 16,
  530. 0x200 << 16);
  531. /* PHY_896 PHY_FREQ_SEL_MULTICAST_EN 1bit offset_0 */
  532. clrbits_le32(&denali_phy[896], 1);
  533. /* CTL_200 ctrlupd_req 1bit offset_8 */
  534. clrsetbits_le32(&denali_ctl[200], 0x1 << 8, 0x1 << 8);
  535. }
  536. static int data_training_ca(const struct chan_info *chan, u32 channel,
  537. const struct rk3399_sdram_params *sdram_params)
  538. {
  539. u32 *denali_pi = chan->pi->denali_pi;
  540. u32 *denali_phy = chan->publ->denali_phy;
  541. u32 i, tmp;
  542. u32 obs_0, obs_1, obs_2, obs_err = 0;
  543. u32 rank = sdram_params->ch[channel].rank;
  544. for (i = 0; i < rank; i++) {
  545. select_per_cs_training_index(chan, i);
  546. /* PI_100 PI_CALVL_EN:RW:8:2 */
  547. clrsetbits_le32(&denali_pi[100], 0x3 << 8, 0x2 << 8);
  548. /* PI_92 PI_CALVL_REQ:WR:16:1,PI_CALVL_CS:RW:24:2 */
  549. clrsetbits_le32(&denali_pi[92],
  550. (0x1 << 16) | (0x3 << 24),
  551. (0x1 << 16) | (i << 24));
  552. /* Waiting for training complete */
  553. while (1) {
  554. /* PI_174 PI_INT_STATUS:RD:8:18 */
  555. tmp = readl(&denali_pi[174]) >> 8;
  556. /*
  557. * check status obs
  558. * PHY_532/660/789 phy_adr_calvl_obs1_:0:32
  559. */
  560. obs_0 = readl(&denali_phy[532]);
  561. obs_1 = readl(&denali_phy[660]);
  562. obs_2 = readl(&denali_phy[788]);
  563. if (((obs_0 >> 30) & 0x3) ||
  564. ((obs_1 >> 30) & 0x3) ||
  565. ((obs_2 >> 30) & 0x3))
  566. obs_err = 1;
  567. if ((((tmp >> 11) & 0x1) == 0x1) &&
  568. (((tmp >> 13) & 0x1) == 0x1) &&
  569. (((tmp >> 5) & 0x1) == 0x0) &&
  570. (obs_err == 0))
  571. break;
  572. else if ((((tmp >> 5) & 0x1) == 0x1) ||
  573. (obs_err == 1))
  574. return -EIO;
  575. }
  576. /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
  577. writel(0x00003f7c, (&denali_pi[175]));
  578. }
  579. clrbits_le32(&denali_pi[100], 0x3 << 8);
  580. return 0;
  581. }
  582. static int data_training_wl(const struct chan_info *chan, u32 channel,
  583. const struct rk3399_sdram_params *sdram_params)
  584. {
  585. u32 *denali_pi = chan->pi->denali_pi;
  586. u32 *denali_phy = chan->publ->denali_phy;
  587. u32 i, tmp;
  588. u32 obs_0, obs_1, obs_2, obs_3, obs_err = 0;
  589. u32 rank = sdram_params->ch[channel].rank;
  590. for (i = 0; i < rank; i++) {
  591. select_per_cs_training_index(chan, i);
  592. /* PI_60 PI_WRLVL_EN:RW:8:2 */
  593. clrsetbits_le32(&denali_pi[60], 0x3 << 8, 0x2 << 8);
  594. /* PI_59 PI_WRLVL_REQ:WR:8:1,PI_WRLVL_CS:RW:16:2 */
  595. clrsetbits_le32(&denali_pi[59],
  596. (0x1 << 8) | (0x3 << 16),
  597. (0x1 << 8) | (i << 16));
  598. /* Waiting for training complete */
  599. while (1) {
  600. /* PI_174 PI_INT_STATUS:RD:8:18 */
  601. tmp = readl(&denali_pi[174]) >> 8;
  602. /*
  603. * check status obs, if error maybe can not
  604. * get leveling done PHY_40/168/296/424
  605. * phy_wrlvl_status_obs_X:0:13
  606. */
  607. obs_0 = readl(&denali_phy[40]);
  608. obs_1 = readl(&denali_phy[168]);
  609. obs_2 = readl(&denali_phy[296]);
  610. obs_3 = readl(&denali_phy[424]);
  611. if (((obs_0 >> 12) & 0x1) ||
  612. ((obs_1 >> 12) & 0x1) ||
  613. ((obs_2 >> 12) & 0x1) ||
  614. ((obs_3 >> 12) & 0x1))
  615. obs_err = 1;
  616. if ((((tmp >> 10) & 0x1) == 0x1) &&
  617. (((tmp >> 13) & 0x1) == 0x1) &&
  618. (((tmp >> 4) & 0x1) == 0x0) &&
  619. (obs_err == 0))
  620. break;
  621. else if ((((tmp >> 4) & 0x1) == 0x1) ||
  622. (obs_err == 1))
  623. return -EIO;
  624. }
  625. /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
  626. writel(0x00003f7c, (&denali_pi[175]));
  627. }
  628. override_write_leveling_value(chan);
  629. clrbits_le32(&denali_pi[60], 0x3 << 8);
  630. return 0;
  631. }
  632. static int data_training_rg(const struct chan_info *chan, u32 channel,
  633. const struct rk3399_sdram_params *sdram_params)
  634. {
  635. u32 *denali_pi = chan->pi->denali_pi;
  636. u32 *denali_phy = chan->publ->denali_phy;
  637. u32 i, tmp;
  638. u32 obs_0, obs_1, obs_2, obs_3, obs_err = 0;
  639. u32 rank = sdram_params->ch[channel].rank;
  640. for (i = 0; i < rank; i++) {
  641. select_per_cs_training_index(chan, i);
  642. /* PI_80 PI_RDLVL_GATE_EN:RW:24:2 */
  643. clrsetbits_le32(&denali_pi[80], 0x3 << 24, 0x2 << 24);
  644. /*
  645. * PI_74 PI_RDLVL_GATE_REQ:WR:16:1
  646. * PI_RDLVL_CS:RW:24:2
  647. */
  648. clrsetbits_le32(&denali_pi[74],
  649. (0x1 << 16) | (0x3 << 24),
  650. (0x1 << 16) | (i << 24));
  651. /* Waiting for training complete */
  652. while (1) {
  653. /* PI_174 PI_INT_STATUS:RD:8:18 */
  654. tmp = readl(&denali_pi[174]) >> 8;
  655. /*
  656. * check status obs
  657. * PHY_43/171/299/427
  658. * PHY_GTLVL_STATUS_OBS_x:16:8
  659. */
  660. obs_0 = readl(&denali_phy[43]);
  661. obs_1 = readl(&denali_phy[171]);
  662. obs_2 = readl(&denali_phy[299]);
  663. obs_3 = readl(&denali_phy[427]);
  664. if (((obs_0 >> (16 + 6)) & 0x3) ||
  665. ((obs_1 >> (16 + 6)) & 0x3) ||
  666. ((obs_2 >> (16 + 6)) & 0x3) ||
  667. ((obs_3 >> (16 + 6)) & 0x3))
  668. obs_err = 1;
  669. if ((((tmp >> 9) & 0x1) == 0x1) &&
  670. (((tmp >> 13) & 0x1) == 0x1) &&
  671. (((tmp >> 3) & 0x1) == 0x0) &&
  672. (obs_err == 0))
  673. break;
  674. else if ((((tmp >> 3) & 0x1) == 0x1) ||
  675. (obs_err == 1))
  676. return -EIO;
  677. }
  678. /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
  679. writel(0x00003f7c, (&denali_pi[175]));
  680. }
  681. clrbits_le32(&denali_pi[80], 0x3 << 24);
  682. return 0;
  683. }
  684. static int data_training_rl(const struct chan_info *chan, u32 channel,
  685. const struct rk3399_sdram_params *sdram_params)
  686. {
  687. u32 *denali_pi = chan->pi->denali_pi;
  688. u32 i, tmp;
  689. u32 rank = sdram_params->ch[channel].rank;
  690. for (i = 0; i < rank; i++) {
  691. select_per_cs_training_index(chan, i);
  692. /* PI_80 PI_RDLVL_EN:RW:16:2 */
  693. clrsetbits_le32(&denali_pi[80], 0x3 << 16, 0x2 << 16);
  694. /* PI_74 PI_RDLVL_REQ:WR:8:1,PI_RDLVL_CS:RW:24:2 */
  695. clrsetbits_le32(&denali_pi[74],
  696. (0x1 << 8) | (0x3 << 24),
  697. (0x1 << 8) | (i << 24));
  698. /* Waiting for training complete */
  699. while (1) {
  700. /* PI_174 PI_INT_STATUS:RD:8:18 */
  701. tmp = readl(&denali_pi[174]) >> 8;
  702. /*
  703. * make sure status obs not report error bit
  704. * PHY_46/174/302/430
  705. * phy_rdlvl_status_obs_X:16:8
  706. */
  707. if ((((tmp >> 8) & 0x1) == 0x1) &&
  708. (((tmp >> 13) & 0x1) == 0x1) &&
  709. (((tmp >> 2) & 0x1) == 0x0))
  710. break;
  711. else if (((tmp >> 2) & 0x1) == 0x1)
  712. return -EIO;
  713. }
  714. /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
  715. writel(0x00003f7c, (&denali_pi[175]));
  716. }
  717. clrbits_le32(&denali_pi[80], 0x3 << 16);
  718. return 0;
  719. }
  720. static int data_training_wdql(const struct chan_info *chan, u32 channel,
  721. const struct rk3399_sdram_params *sdram_params)
  722. {
  723. u32 *denali_pi = chan->pi->denali_pi;
  724. u32 i, tmp;
  725. u32 rank = sdram_params->ch[channel].rank;
  726. for (i = 0; i < rank; i++) {
  727. select_per_cs_training_index(chan, i);
  728. /*
  729. * disable PI_WDQLVL_VREF_EN before wdq leveling?
  730. * PI_181 PI_WDQLVL_VREF_EN:RW:8:1
  731. */
  732. clrbits_le32(&denali_pi[181], 0x1 << 8);
  733. /* PI_124 PI_WDQLVL_EN:RW:16:2 */
  734. clrsetbits_le32(&denali_pi[124], 0x3 << 16, 0x2 << 16);
  735. /* PI_121 PI_WDQLVL_REQ:WR:8:1,PI_WDQLVL_CS:RW:16:2 */
  736. clrsetbits_le32(&denali_pi[121],
  737. (0x1 << 8) | (0x3 << 16),
  738. (0x1 << 8) | (i << 16));
  739. /* Waiting for training complete */
  740. while (1) {
  741. /* PI_174 PI_INT_STATUS:RD:8:18 */
  742. tmp = readl(&denali_pi[174]) >> 8;
  743. if ((((tmp >> 12) & 0x1) == 0x1) &&
  744. (((tmp >> 13) & 0x1) == 0x1) &&
  745. (((tmp >> 6) & 0x1) == 0x0))
  746. break;
  747. else if (((tmp >> 6) & 0x1) == 0x1)
  748. return -EIO;
  749. }
  750. /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
  751. writel(0x00003f7c, (&denali_pi[175]));
  752. }
  753. clrbits_le32(&denali_pi[124], 0x3 << 16);
  754. return 0;
  755. }
  756. static int data_training(const struct chan_info *chan, u32 channel,
  757. const struct rk3399_sdram_params *sdram_params,
  758. u32 training_flag)
  759. {
  760. u32 *denali_phy = chan->publ->denali_phy;
  761. /* PHY_927 PHY_PAD_DQS_DRIVE RPULL offset_22 */
  762. setbits_le32(&denali_phy[927], (1 << 22));
  763. if (training_flag == PI_FULL_TRAINING) {
  764. if (sdram_params->base.dramtype == LPDDR4) {
  765. training_flag = PI_CA_TRAINING | PI_WRITE_LEVELING |
  766. PI_READ_GATE_TRAINING |
  767. PI_READ_LEVELING | PI_WDQ_LEVELING;
  768. } else if (sdram_params->base.dramtype == LPDDR3) {
  769. training_flag = PI_CA_TRAINING | PI_WRITE_LEVELING |
  770. PI_READ_GATE_TRAINING;
  771. } else if (sdram_params->base.dramtype == DDR3) {
  772. training_flag = PI_WRITE_LEVELING |
  773. PI_READ_GATE_TRAINING |
  774. PI_READ_LEVELING;
  775. }
  776. }
  777. /* ca training(LPDDR4,LPDDR3 support) */
  778. if ((training_flag & PI_CA_TRAINING) == PI_CA_TRAINING)
  779. data_training_ca(chan, channel, sdram_params);
  780. /* write leveling(LPDDR4,LPDDR3,DDR3 support) */
  781. if ((training_flag & PI_WRITE_LEVELING) == PI_WRITE_LEVELING)
  782. data_training_wl(chan, channel, sdram_params);
  783. /* read gate training(LPDDR4,LPDDR3,DDR3 support) */
  784. if ((training_flag & PI_READ_GATE_TRAINING) == PI_READ_GATE_TRAINING)
  785. data_training_rg(chan, channel, sdram_params);
  786. /* read leveling(LPDDR4,LPDDR3,DDR3 support) */
  787. if ((training_flag & PI_READ_LEVELING) == PI_READ_LEVELING)
  788. data_training_rl(chan, channel, sdram_params);
  789. /* wdq leveling(LPDDR4 support) */
  790. if ((training_flag & PI_WDQ_LEVELING) == PI_WDQ_LEVELING)
  791. data_training_wdql(chan, channel, sdram_params);
  792. /* PHY_927 PHY_PAD_DQS_DRIVE RPULL offset_22 */
  793. clrbits_le32(&denali_phy[927], (1 << 22));
  794. return 0;
  795. }
  796. static void set_ddrconfig(const struct chan_info *chan,
  797. const struct rk3399_sdram_params *sdram_params,
  798. unsigned char channel, u32 ddrconfig)
  799. {
  800. /* only need to set ddrconfig */
  801. struct rk3399_msch_regs *ddr_msch_regs = chan->msch;
  802. unsigned int cs0_cap = 0;
  803. unsigned int cs1_cap = 0;
  804. cs0_cap = (1 << (sdram_params->ch[channel].cs0_row
  805. + sdram_params->ch[channel].col
  806. + sdram_params->ch[channel].bk
  807. + sdram_params->ch[channel].bw - 20));
  808. if (sdram_params->ch[channel].rank > 1)
  809. cs1_cap = cs0_cap >> (sdram_params->ch[channel].cs0_row
  810. - sdram_params->ch[channel].cs1_row);
  811. if (sdram_params->ch[channel].row_3_4) {
  812. cs0_cap = cs0_cap * 3 / 4;
  813. cs1_cap = cs1_cap * 3 / 4;
  814. }
  815. writel(ddrconfig | (ddrconfig << 8), &ddr_msch_regs->ddrconf);
  816. writel(((cs0_cap / 32) & 0xff) | (((cs1_cap / 32) & 0xff) << 8),
  817. &ddr_msch_regs->ddrsize);
  818. }
  819. static void dram_all_config(struct dram_info *dram,
  820. const struct rk3399_sdram_params *sdram_params)
  821. {
  822. u32 sys_reg = 0;
  823. unsigned int channel, idx;
  824. sys_reg |= sdram_params->base.dramtype << SYS_REG_DDRTYPE_SHIFT;
  825. sys_reg |= (sdram_params->base.num_channels - 1)
  826. << SYS_REG_NUM_CH_SHIFT;
  827. for (channel = 0, idx = 0;
  828. (idx < sdram_params->base.num_channels) && (channel < 2);
  829. channel++) {
  830. const struct rk3399_sdram_channel *info =
  831. &sdram_params->ch[channel];
  832. struct rk3399_msch_regs *ddr_msch_regs;
  833. const struct rk3399_msch_timings *noc_timing;
  834. if (sdram_params->ch[channel].col == 0)
  835. continue;
  836. idx++;
  837. sys_reg |= info->row_3_4 << SYS_REG_ROW_3_4_SHIFT(channel);
  838. sys_reg |= 1 << SYS_REG_CHINFO_SHIFT(channel);
  839. sys_reg |= (info->rank - 1) << SYS_REG_RANK_SHIFT(channel);
  840. sys_reg |= (info->col - 9) << SYS_REG_COL_SHIFT(channel);
  841. sys_reg |= info->bk == 3 ? 0 : 1 << SYS_REG_BK_SHIFT(channel);
  842. sys_reg |= (info->cs0_row - 13) << SYS_REG_CS0_ROW_SHIFT(channel);
  843. sys_reg |= (info->cs1_row - 13) << SYS_REG_CS1_ROW_SHIFT(channel);
  844. sys_reg |= (2 >> info->bw) << SYS_REG_BW_SHIFT(channel);
  845. sys_reg |= (2 >> info->dbw) << SYS_REG_DBW_SHIFT(channel);
  846. ddr_msch_regs = dram->chan[channel].msch;
  847. noc_timing = &sdram_params->ch[channel].noc_timings;
  848. writel(noc_timing->ddrtiminga0,
  849. &ddr_msch_regs->ddrtiminga0);
  850. writel(noc_timing->ddrtimingb0,
  851. &ddr_msch_regs->ddrtimingb0);
  852. writel(noc_timing->ddrtimingc0,
  853. &ddr_msch_regs->ddrtimingc0);
  854. writel(noc_timing->devtodev0,
  855. &ddr_msch_regs->devtodev0);
  856. writel(noc_timing->ddrmode,
  857. &ddr_msch_regs->ddrmode);
  858. /* rank 1 memory clock disable (dfi_dram_clk_disable = 1) */
  859. if (sdram_params->ch[channel].rank == 1)
  860. setbits_le32(&dram->chan[channel].pctl->denali_ctl[276],
  861. 1 << 17);
  862. }
  863. writel(sys_reg, &dram->pmugrf->os_reg2);
  864. rk_clrsetreg(&dram->pmusgrf->soc_con4, 0x1f << 10,
  865. sdram_params->base.stride << 10);
  866. /* reboot hold register set */
  867. writel(PRESET_SGRF_HOLD(0) | PRESET_GPIO0_HOLD(1) |
  868. PRESET_GPIO1_HOLD(1),
  869. &dram->pmucru->pmucru_rstnhold_con[1]);
  870. clrsetbits_le32(&dram->cru->glb_rst_con, 0x3, 0x3);
  871. }
  872. static int switch_to_phy_index1(struct dram_info *dram,
  873. const struct rk3399_sdram_params *sdram_params)
  874. {
  875. u32 channel;
  876. u32 *denali_phy;
  877. u32 ch_count = sdram_params->base.num_channels;
  878. int ret;
  879. int i = 0;
  880. writel(RK_CLRSETBITS(0x03 << 4 | 1 << 2 | 1,
  881. 1 << 4 | 1 << 2 | 1),
  882. &dram->cic->cic_ctrl0);
  883. while (!(readl(&dram->cic->cic_status0) & (1 << 2))) {
  884. mdelay(10);
  885. i++;
  886. if (i > 10) {
  887. debug("index1 frequency change overtime\n");
  888. return -ETIME;
  889. }
  890. }
  891. i = 0;
  892. writel(RK_CLRSETBITS(1 << 1, 1 << 1), &dram->cic->cic_ctrl0);
  893. while (!(readl(&dram->cic->cic_status0) & (1 << 0))) {
  894. mdelay(10);
  895. if (i > 10) {
  896. debug("index1 frequency done overtime\n");
  897. return -ETIME;
  898. }
  899. }
  900. for (channel = 0; channel < ch_count; channel++) {
  901. denali_phy = dram->chan[channel].publ->denali_phy;
  902. clrsetbits_le32(&denali_phy[896], (0x3 << 8) | 1, 1 << 8);
  903. ret = data_training(&dram->chan[channel], channel,
  904. sdram_params, PI_FULL_TRAINING);
  905. if (ret) {
  906. debug("index1 training failed\n");
  907. return ret;
  908. }
  909. }
  910. return 0;
  911. }
  912. static int sdram_init(struct dram_info *dram,
  913. const struct rk3399_sdram_params *sdram_params)
  914. {
  915. unsigned char dramtype = sdram_params->base.dramtype;
  916. unsigned int ddr_freq = sdram_params->base.ddr_freq;
  917. int channel;
  918. debug("Starting SDRAM initialization...\n");
  919. if ((dramtype == DDR3 && ddr_freq > 933) ||
  920. (dramtype == LPDDR3 && ddr_freq > 933) ||
  921. (dramtype == LPDDR4 && ddr_freq > 800)) {
  922. debug("SDRAM frequency is to high!");
  923. return -E2BIG;
  924. }
  925. for (channel = 0; channel < 2; channel++) {
  926. const struct chan_info *chan = &dram->chan[channel];
  927. struct rk3399_ddr_publ_regs *publ = chan->publ;
  928. phy_dll_bypass_set(publ, ddr_freq);
  929. if (channel >= sdram_params->base.num_channels)
  930. continue;
  931. if (pctl_cfg(chan, channel, sdram_params) != 0) {
  932. printf("pctl_cfg fail, reset\n");
  933. return -EIO;
  934. }
  935. /* LPDDR2/LPDDR3 need to wait DAI complete, max 10us */
  936. if (dramtype == LPDDR3)
  937. udelay(10);
  938. if (data_training(chan, channel,
  939. sdram_params, PI_FULL_TRAINING)) {
  940. printf("SDRAM initialization failed, reset\n");
  941. return -EIO;
  942. }
  943. set_ddrconfig(chan, sdram_params, channel,
  944. sdram_params->ch[channel].ddrconfig);
  945. }
  946. dram_all_config(dram, sdram_params);
  947. switch_to_phy_index1(dram, sdram_params);
  948. debug("Finish SDRAM initialization...\n");
  949. return 0;
  950. }
  951. static int rk3399_dmc_ofdata_to_platdata(struct udevice *dev)
  952. {
  953. #if !CONFIG_IS_ENABLED(OF_PLATDATA)
  954. struct rockchip_dmc_plat *plat = dev_get_platdata(dev);
  955. int ret;
  956. ret = dev_read_u32_array(dev, "rockchip,sdram-params",
  957. (u32 *)&plat->sdram_params,
  958. sizeof(plat->sdram_params) / sizeof(u32));
  959. if (ret) {
  960. printf("%s: Cannot read rockchip,sdram-params %d\n",
  961. __func__, ret);
  962. return ret;
  963. }
  964. ret = regmap_init_mem(dev, &plat->map);
  965. if (ret)
  966. printf("%s: regmap failed %d\n", __func__, ret);
  967. #endif
  968. return 0;
  969. }
  970. #if CONFIG_IS_ENABLED(OF_PLATDATA)
  971. static int conv_of_platdata(struct udevice *dev)
  972. {
  973. struct rockchip_dmc_plat *plat = dev_get_platdata(dev);
  974. struct dtd_rockchip_rk3399_dmc *dtplat = &plat->dtplat;
  975. int ret;
  976. ret = regmap_init_mem_platdata(dev, dtplat->reg,
  977. ARRAY_SIZE(dtplat->reg) / 2,
  978. &plat->map);
  979. if (ret)
  980. return ret;
  981. return 0;
  982. }
  983. #endif
  984. static int rk3399_dmc_init(struct udevice *dev)
  985. {
  986. struct dram_info *priv = dev_get_priv(dev);
  987. struct rockchip_dmc_plat *plat = dev_get_platdata(dev);
  988. int ret;
  989. #if !CONFIG_IS_ENABLED(OF_PLATDATA)
  990. struct rk3399_sdram_params *params = &plat->sdram_params;
  991. #else
  992. struct dtd_rockchip_rk3399_dmc *dtplat = &plat->dtplat;
  993. struct rk3399_sdram_params *params =
  994. (void *)dtplat->rockchip_sdram_params;
  995. ret = conv_of_platdata(dev);
  996. if (ret)
  997. return ret;
  998. #endif
  999. priv->cic = syscon_get_first_range(ROCKCHIP_SYSCON_CIC);
  1000. priv->pmugrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF);
  1001. priv->pmusgrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUSGRF);
  1002. priv->pmucru = rockchip_get_pmucru();
  1003. priv->cru = rockchip_get_cru();
  1004. priv->chan[0].pctl = regmap_get_range(plat->map, 0);
  1005. priv->chan[0].pi = regmap_get_range(plat->map, 1);
  1006. priv->chan[0].publ = regmap_get_range(plat->map, 2);
  1007. priv->chan[0].msch = regmap_get_range(plat->map, 3);
  1008. priv->chan[1].pctl = regmap_get_range(plat->map, 4);
  1009. priv->chan[1].pi = regmap_get_range(plat->map, 5);
  1010. priv->chan[1].publ = regmap_get_range(plat->map, 6);
  1011. priv->chan[1].msch = regmap_get_range(plat->map, 7);
  1012. debug("con reg %p %p %p %p %p %p %p %p\n",
  1013. priv->chan[0].pctl, priv->chan[0].pi,
  1014. priv->chan[0].publ, priv->chan[0].msch,
  1015. priv->chan[1].pctl, priv->chan[1].pi,
  1016. priv->chan[1].publ, priv->chan[1].msch);
  1017. debug("cru %p, cic %p, grf %p, sgrf %p, pmucru %p\n", priv->cru,
  1018. priv->cic, priv->pmugrf, priv->pmusgrf, priv->pmucru);
  1019. #if CONFIG_IS_ENABLED(OF_PLATDATA)
  1020. ret = clk_get_by_index_platdata(dev, 0, dtplat->clocks, &priv->ddr_clk);
  1021. #else
  1022. ret = clk_get_by_index(dev, 0, &priv->ddr_clk);
  1023. #endif
  1024. if (ret) {
  1025. printf("%s clk get failed %d\n", __func__, ret);
  1026. return ret;
  1027. }
  1028. ret = clk_set_rate(&priv->ddr_clk, params->base.ddr_freq * MHz);
  1029. if (ret < 0) {
  1030. printf("%s clk set failed %d\n", __func__, ret);
  1031. return ret;
  1032. }
  1033. ret = sdram_init(priv, params);
  1034. if (ret < 0) {
  1035. printf("%s DRAM init failed%d\n", __func__, ret);
  1036. return ret;
  1037. }
  1038. return 0;
  1039. }
  1040. #endif
  1041. static int rk3399_dmc_probe(struct udevice *dev)
  1042. {
  1043. #ifdef CONFIG_SPL_BUILD
  1044. if (rk3399_dmc_init(dev))
  1045. return 0;
  1046. #else
  1047. struct dram_info *priv = dev_get_priv(dev);
  1048. priv->pmugrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF);
  1049. debug("%s: pmugrf=%p\n", __func__, priv->pmugrf);
  1050. priv->info.base = CONFIG_SYS_SDRAM_BASE;
  1051. priv->info.size = rockchip_sdram_size(
  1052. (phys_addr_t)&priv->pmugrf->os_reg2);
  1053. #endif
  1054. return 0;
  1055. }
  1056. static int rk3399_dmc_get_info(struct udevice *dev, struct ram_info *info)
  1057. {
  1058. struct dram_info *priv = dev_get_priv(dev);
  1059. *info = priv->info;
  1060. return 0;
  1061. }
  1062. static struct ram_ops rk3399_dmc_ops = {
  1063. .get_info = rk3399_dmc_get_info,
  1064. };
  1065. static const struct udevice_id rk3399_dmc_ids[] = {
  1066. { .compatible = "rockchip,rk3399-dmc" },
  1067. { }
  1068. };
  1069. U_BOOT_DRIVER(dmc_rk3399) = {
  1070. .name = "rockchip_rk3399_dmc",
  1071. .id = UCLASS_RAM,
  1072. .of_match = rk3399_dmc_ids,
  1073. .ops = &rk3399_dmc_ops,
  1074. #ifdef CONFIG_SPL_BUILD
  1075. .ofdata_to_platdata = rk3399_dmc_ofdata_to_platdata,
  1076. #endif
  1077. .probe = rk3399_dmc_probe,
  1078. .priv_auto_alloc_size = sizeof(struct dram_info),
  1079. #ifdef CONFIG_SPL_BUILD
  1080. .platdata_auto_alloc_size = sizeof(struct rockchip_dmc_plat),
  1081. #endif
  1082. };