sdram_rk3288.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979
  1. /*
  2. * (C) Copyright 2015 Google, Inc
  3. * Copyright 2014 Rockchip Inc.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0
  6. *
  7. * Adapted from coreboot.
  8. */
  9. #include <common.h>
  10. #include <clk.h>
  11. #include <dm.h>
  12. #include <dt-structs.h>
  13. #include <errno.h>
  14. #include <ram.h>
  15. #include <regmap.h>
  16. #include <syscon.h>
  17. #include <asm/io.h>
  18. #include <asm/arch/clock.h>
  19. #include <asm/arch/cru_rk3288.h>
  20. #include <asm/arch/ddr_rk3288.h>
  21. #include <asm/arch/grf_rk3288.h>
  22. #include <asm/arch/pmu_rk3288.h>
  23. #include <asm/arch/sdram.h>
  24. #include <linux/err.h>
  25. #include <power/regulator.h>
  26. #include <power/rk808_pmic.h>
  27. DECLARE_GLOBAL_DATA_PTR;
  28. struct chan_info {
  29. struct rk3288_ddr_pctl *pctl;
  30. struct rk3288_ddr_publ *publ;
  31. struct rk3288_msch *msch;
  32. };
  33. struct dram_info {
  34. struct chan_info chan[2];
  35. struct ram_info info;
  36. struct clk ddr_clk;
  37. struct rk3288_cru *cru;
  38. struct rk3288_grf *grf;
  39. struct rk3288_sgrf *sgrf;
  40. struct rk3288_pmu *pmu;
  41. bool is_veyron;
  42. };
  43. struct rk3288_sdram_params {
  44. #if CONFIG_IS_ENABLED(OF_PLATDATA)
  45. struct dtd_rockchip_rk3288_dmc of_plat;
  46. #endif
  47. struct rk3288_sdram_channel ch[2];
  48. struct rk3288_sdram_pctl_timing pctl_timing;
  49. struct rk3288_sdram_phy_timing phy_timing;
  50. struct rk3288_base_params base;
  51. int num_channels;
  52. struct regmap *map;
  53. };
  54. #ifdef CONFIG_SPL_BUILD
  55. static void copy_to_reg(u32 *dest, const u32 *src, u32 n)
  56. {
  57. int i;
  58. for (i = 0; i < n / sizeof(u32); i++) {
  59. writel(*src, dest);
  60. src++;
  61. dest++;
  62. }
  63. }
  64. static void ddr_reset(struct rk3288_cru *cru, u32 ch, u32 ctl, u32 phy)
  65. {
  66. u32 phy_ctl_srstn_shift = 4 + 5 * ch;
  67. u32 ctl_psrstn_shift = 3 + 5 * ch;
  68. u32 ctl_srstn_shift = 2 + 5 * ch;
  69. u32 phy_psrstn_shift = 1 + 5 * ch;
  70. u32 phy_srstn_shift = 5 * ch;
  71. rk_clrsetreg(&cru->cru_softrst_con[10],
  72. 1 << phy_ctl_srstn_shift | 1 << ctl_psrstn_shift |
  73. 1 << ctl_srstn_shift | 1 << phy_psrstn_shift |
  74. 1 << phy_srstn_shift,
  75. phy << phy_ctl_srstn_shift | ctl << ctl_psrstn_shift |
  76. ctl << ctl_srstn_shift | phy << phy_psrstn_shift |
  77. phy << phy_srstn_shift);
  78. }
  79. static void ddr_phy_ctl_reset(struct rk3288_cru *cru, u32 ch, u32 n)
  80. {
  81. u32 phy_ctl_srstn_shift = 4 + 5 * ch;
  82. rk_clrsetreg(&cru->cru_softrst_con[10],
  83. 1 << phy_ctl_srstn_shift, n << phy_ctl_srstn_shift);
  84. }
  85. static void phy_pctrl_reset(struct rk3288_cru *cru,
  86. struct rk3288_ddr_publ *publ,
  87. u32 channel)
  88. {
  89. int i;
  90. ddr_reset(cru, channel, 1, 1);
  91. udelay(1);
  92. clrbits_le32(&publ->acdllcr, ACDLLCR_DLLSRST);
  93. for (i = 0; i < 4; i++)
  94. clrbits_le32(&publ->datx8[i].dxdllcr, DXDLLCR_DLLSRST);
  95. udelay(10);
  96. setbits_le32(&publ->acdllcr, ACDLLCR_DLLSRST);
  97. for (i = 0; i < 4; i++)
  98. setbits_le32(&publ->datx8[i].dxdllcr, DXDLLCR_DLLSRST);
  99. udelay(10);
  100. ddr_reset(cru, channel, 1, 0);
  101. udelay(10);
  102. ddr_reset(cru, channel, 0, 0);
  103. udelay(10);
  104. }
  105. static void phy_dll_bypass_set(struct rk3288_ddr_publ *publ,
  106. u32 freq)
  107. {
  108. int i;
  109. if (freq <= 250000000) {
  110. if (freq <= 150000000)
  111. clrbits_le32(&publ->dllgcr, SBIAS_BYPASS);
  112. else
  113. setbits_le32(&publ->dllgcr, SBIAS_BYPASS);
  114. setbits_le32(&publ->acdllcr, ACDLLCR_DLLDIS);
  115. for (i = 0; i < 4; i++)
  116. setbits_le32(&publ->datx8[i].dxdllcr,
  117. DXDLLCR_DLLDIS);
  118. setbits_le32(&publ->pir, PIR_DLLBYP);
  119. } else {
  120. clrbits_le32(&publ->dllgcr, SBIAS_BYPASS);
  121. clrbits_le32(&publ->acdllcr, ACDLLCR_DLLDIS);
  122. for (i = 0; i < 4; i++) {
  123. clrbits_le32(&publ->datx8[i].dxdllcr,
  124. DXDLLCR_DLLDIS);
  125. }
  126. clrbits_le32(&publ->pir, PIR_DLLBYP);
  127. }
  128. }
  129. static void dfi_cfg(struct rk3288_ddr_pctl *pctl, u32 dramtype)
  130. {
  131. writel(DFI_INIT_START, &pctl->dfistcfg0);
  132. writel(DFI_DRAM_CLK_SR_EN | DFI_DRAM_CLK_DPD_EN,
  133. &pctl->dfistcfg1);
  134. writel(DFI_PARITY_INTR_EN | DFI_PARITY_EN, &pctl->dfistcfg2);
  135. writel(7 << TLP_RESP_TIME_SHIFT | LP_SR_EN | LP_PD_EN,
  136. &pctl->dfilpcfg0);
  137. writel(2 << TCTRL_DELAY_TIME_SHIFT, &pctl->dfitctrldelay);
  138. writel(1 << TPHY_WRDATA_TIME_SHIFT, &pctl->dfitphywrdata);
  139. writel(0xf << TPHY_RDLAT_TIME_SHIFT, &pctl->dfitphyrdlat);
  140. writel(2 << TDRAM_CLK_DIS_TIME_SHIFT, &pctl->dfitdramclkdis);
  141. writel(2 << TDRAM_CLK_EN_TIME_SHIFT, &pctl->dfitdramclken);
  142. writel(1, &pctl->dfitphyupdtype0);
  143. /* cs0 and cs1 write odt enable */
  144. writel((RANK0_ODT_WRITE_SEL | RANK1_ODT_WRITE_SEL),
  145. &pctl->dfiodtcfg);
  146. /* odt write length */
  147. writel(7 << ODT_LEN_BL8_W_SHIFT, &pctl->dfiodtcfg1);
  148. /* phyupd and ctrlupd disabled */
  149. writel(0, &pctl->dfiupdcfg);
  150. }
  151. static void ddr_set_enable(struct rk3288_grf *grf, uint channel, bool enable)
  152. {
  153. uint val = 0;
  154. if (enable) {
  155. val = 1 << (channel ? DDR1_16BIT_EN_SHIFT :
  156. DDR0_16BIT_EN_SHIFT);
  157. }
  158. rk_clrsetreg(&grf->soc_con0,
  159. 1 << (channel ? DDR1_16BIT_EN_SHIFT : DDR0_16BIT_EN_SHIFT),
  160. val);
  161. }
  162. static void ddr_set_ddr3_mode(struct rk3288_grf *grf, uint channel,
  163. bool ddr3_mode)
  164. {
  165. uint mask, val;
  166. mask = 1 << (channel ? MSCH1_MAINDDR3_SHIFT : MSCH0_MAINDDR3_SHIFT);
  167. val = ddr3_mode << (channel ? MSCH1_MAINDDR3_SHIFT :
  168. MSCH0_MAINDDR3_SHIFT);
  169. rk_clrsetreg(&grf->soc_con0, mask, val);
  170. }
  171. static void ddr_set_en_bst_odt(struct rk3288_grf *grf, uint channel,
  172. bool enable, bool enable_bst, bool enable_odt)
  173. {
  174. uint mask;
  175. bool disable_bst = !enable_bst;
  176. mask = channel ?
  177. (1 << LPDDR3_EN1_SHIFT | 1 << UPCTL1_BST_DIABLE_SHIFT |
  178. 1 << UPCTL1_LPDDR3_ODT_EN_SHIFT) :
  179. (1 << LPDDR3_EN0_SHIFT | 1 << UPCTL0_BST_DIABLE_SHIFT |
  180. 1 << UPCTL0_LPDDR3_ODT_EN_SHIFT);
  181. rk_clrsetreg(&grf->soc_con2, mask,
  182. enable << (channel ? LPDDR3_EN1_SHIFT : LPDDR3_EN0_SHIFT) |
  183. disable_bst << (channel ? UPCTL1_BST_DIABLE_SHIFT :
  184. UPCTL0_BST_DIABLE_SHIFT) |
  185. enable_odt << (channel ? UPCTL1_LPDDR3_ODT_EN_SHIFT :
  186. UPCTL0_LPDDR3_ODT_EN_SHIFT));
  187. }
  188. static void pctl_cfg(u32 channel, struct rk3288_ddr_pctl *pctl,
  189. const struct rk3288_sdram_params *sdram_params,
  190. struct rk3288_grf *grf)
  191. {
  192. unsigned int burstlen;
  193. burstlen = (sdram_params->base.noc_timing >> 18) & 0x7;
  194. copy_to_reg(&pctl->togcnt1u, &sdram_params->pctl_timing.togcnt1u,
  195. sizeof(sdram_params->pctl_timing));
  196. switch (sdram_params->base.dramtype) {
  197. case LPDDR3:
  198. writel(sdram_params->pctl_timing.tcl - 1,
  199. &pctl->dfitrddataen);
  200. writel(sdram_params->pctl_timing.tcwl,
  201. &pctl->dfitphywrlat);
  202. burstlen >>= 1;
  203. writel(LPDDR2_S4 | 0 << MDDR_LPDDR2_CLK_STOP_IDLE_SHIFT |
  204. LPDDR2_EN | burstlen << BURSTLENGTH_SHIFT |
  205. (6 - 4) << TFAW_SHIFT | PD_EXIT_FAST |
  206. 1 << PD_TYPE_SHIFT | 0 << PD_IDLE_SHIFT,
  207. &pctl->mcfg);
  208. ddr_set_ddr3_mode(grf, channel, false);
  209. ddr_set_enable(grf, channel, true);
  210. ddr_set_en_bst_odt(grf, channel, true, false,
  211. sdram_params->base.odt);
  212. break;
  213. case DDR3:
  214. if (sdram_params->phy_timing.mr[1] & DDR3_DLL_DISABLE) {
  215. writel(sdram_params->pctl_timing.tcl - 3,
  216. &pctl->dfitrddataen);
  217. } else {
  218. writel(sdram_params->pctl_timing.tcl - 2,
  219. &pctl->dfitrddataen);
  220. }
  221. writel(sdram_params->pctl_timing.tcwl - 1,
  222. &pctl->dfitphywrlat);
  223. writel(0 << MDDR_LPDDR2_CLK_STOP_IDLE_SHIFT | DDR3_EN |
  224. DDR2_DDR3_BL_8 | (6 - 4) << TFAW_SHIFT | PD_EXIT_SLOW |
  225. 1 << PD_TYPE_SHIFT | 0 << PD_IDLE_SHIFT,
  226. &pctl->mcfg);
  227. ddr_set_ddr3_mode(grf, channel, true);
  228. ddr_set_enable(grf, channel, true);
  229. ddr_set_en_bst_odt(grf, channel, false, true, false);
  230. break;
  231. }
  232. setbits_le32(&pctl->scfg, 1);
  233. }
  234. static void phy_cfg(const struct chan_info *chan, u32 channel,
  235. const struct rk3288_sdram_params *sdram_params)
  236. {
  237. struct rk3288_ddr_publ *publ = chan->publ;
  238. struct rk3288_msch *msch = chan->msch;
  239. uint ddr_freq_mhz = sdram_params->base.ddr_freq / 1000000;
  240. u32 dinit2, tmp;
  241. int i;
  242. dinit2 = DIV_ROUND_UP(ddr_freq_mhz * 200000, 1000);
  243. /* DDR PHY Timing */
  244. copy_to_reg(&publ->dtpr[0], &sdram_params->phy_timing.dtpr0,
  245. sizeof(sdram_params->phy_timing));
  246. writel(sdram_params->base.noc_timing, &msch->ddrtiming);
  247. writel(0x3f, &msch->readlatency);
  248. writel(sdram_params->base.noc_activate, &msch->activate);
  249. writel(2 << BUSWRTORD_SHIFT | 2 << BUSRDTOWR_SHIFT |
  250. 1 << BUSRDTORD_SHIFT, &msch->devtodev);
  251. writel(DIV_ROUND_UP(ddr_freq_mhz * 5120, 1000) << PRT_DLLLOCK_SHIFT |
  252. DIV_ROUND_UP(ddr_freq_mhz * 50, 1000) << PRT_DLLSRST_SHIFT |
  253. 8 << PRT_ITMSRST_SHIFT, &publ->ptr[0]);
  254. writel(DIV_ROUND_UP(ddr_freq_mhz * 500000, 1000) << PRT_DINIT0_SHIFT |
  255. DIV_ROUND_UP(ddr_freq_mhz * 400, 1000) << PRT_DINIT1_SHIFT,
  256. &publ->ptr[1]);
  257. writel(min(dinit2, 0x1ffffU) << PRT_DINIT2_SHIFT |
  258. DIV_ROUND_UP(ddr_freq_mhz * 1000, 1000) << PRT_DINIT3_SHIFT,
  259. &publ->ptr[2]);
  260. switch (sdram_params->base.dramtype) {
  261. case LPDDR3:
  262. clrsetbits_le32(&publ->pgcr, 0x1F,
  263. 0 << PGCR_DFTLMT_SHIFT |
  264. 0 << PGCR_DFTCMP_SHIFT |
  265. 1 << PGCR_DQSCFG_SHIFT |
  266. 0 << PGCR_ITMDMD_SHIFT);
  267. /* DDRMODE select LPDDR3 */
  268. clrsetbits_le32(&publ->dcr, DDRMD_MASK << DDRMD_SHIFT,
  269. DDRMD_LPDDR2_LPDDR3 << DDRMD_SHIFT);
  270. clrsetbits_le32(&publ->dxccr,
  271. DQSNRES_MASK << DQSNRES_SHIFT |
  272. DQSRES_MASK << DQSRES_SHIFT,
  273. 4 << DQSRES_SHIFT | 0xc << DQSNRES_SHIFT);
  274. tmp = readl(&publ->dtpr[1]);
  275. tmp = ((tmp >> TDQSCKMAX_SHIFT) & TDQSCKMAX_MASK) -
  276. ((tmp >> TDQSCK_SHIFT) & TDQSCK_MASK);
  277. clrsetbits_le32(&publ->dsgcr,
  278. DQSGE_MASK << DQSGE_SHIFT |
  279. DQSGX_MASK << DQSGX_SHIFT,
  280. tmp << DQSGE_SHIFT | tmp << DQSGX_SHIFT);
  281. break;
  282. case DDR3:
  283. clrbits_le32(&publ->pgcr, 0x1f);
  284. clrsetbits_le32(&publ->dcr, DDRMD_MASK << DDRMD_SHIFT,
  285. DDRMD_DDR3 << DDRMD_SHIFT);
  286. break;
  287. }
  288. if (sdram_params->base.odt) {
  289. /*dynamic RTT enable */
  290. for (i = 0; i < 4; i++)
  291. setbits_le32(&publ->datx8[i].dxgcr, DQSRTT | DQRTT);
  292. } else {
  293. /*dynamic RTT disable */
  294. for (i = 0; i < 4; i++)
  295. clrbits_le32(&publ->datx8[i].dxgcr, DQSRTT | DQRTT);
  296. }
  297. }
  298. static void phy_init(struct rk3288_ddr_publ *publ)
  299. {
  300. setbits_le32(&publ->pir, PIR_INIT | PIR_DLLSRST
  301. | PIR_DLLLOCK | PIR_ZCAL | PIR_ITMSRST | PIR_CLRSR);
  302. udelay(1);
  303. while ((readl(&publ->pgsr) &
  304. (PGSR_IDONE | PGSR_DLDONE | PGSR_ZCDONE)) !=
  305. (PGSR_IDONE | PGSR_DLDONE | PGSR_ZCDONE))
  306. ;
  307. }
  308. static void send_command(struct rk3288_ddr_pctl *pctl, u32 rank,
  309. u32 cmd, u32 arg)
  310. {
  311. writel((START_CMD | (rank << 20) | arg | cmd), &pctl->mcmd);
  312. udelay(1);
  313. while (readl(&pctl->mcmd) & START_CMD)
  314. ;
  315. }
  316. static inline void send_command_op(struct rk3288_ddr_pctl *pctl,
  317. u32 rank, u32 cmd, u32 ma, u32 op)
  318. {
  319. send_command(pctl, rank, cmd, (ma & LPDDR2_MA_MASK) << LPDDR2_MA_SHIFT |
  320. (op & LPDDR2_OP_MASK) << LPDDR2_OP_SHIFT);
  321. }
  322. static void memory_init(struct rk3288_ddr_publ *publ,
  323. u32 dramtype)
  324. {
  325. setbits_le32(&publ->pir,
  326. (PIR_INIT | PIR_DRAMINIT | PIR_LOCKBYP
  327. | PIR_ZCALBYP | PIR_CLRSR | PIR_ICPC
  328. | (dramtype == DDR3 ? PIR_DRAMRST : 0)));
  329. udelay(1);
  330. while ((readl(&publ->pgsr) & (PGSR_IDONE | PGSR_DLDONE))
  331. != (PGSR_IDONE | PGSR_DLDONE))
  332. ;
  333. }
  334. static void move_to_config_state(struct rk3288_ddr_publ *publ,
  335. struct rk3288_ddr_pctl *pctl)
  336. {
  337. unsigned int state;
  338. while (1) {
  339. state = readl(&pctl->stat) & PCTL_STAT_MSK;
  340. switch (state) {
  341. case LOW_POWER:
  342. writel(WAKEUP_STATE, &pctl->sctl);
  343. while ((readl(&pctl->stat) & PCTL_STAT_MSK)
  344. != ACCESS)
  345. ;
  346. /* wait DLL lock */
  347. while ((readl(&publ->pgsr) & PGSR_DLDONE)
  348. != PGSR_DLDONE)
  349. ;
  350. /* if at low power state,need wakeup first,
  351. * and then enter the config
  352. * so here no break.
  353. */
  354. case ACCESS:
  355. /* no break */
  356. case INIT_MEM:
  357. writel(CFG_STATE, &pctl->sctl);
  358. while ((readl(&pctl->stat) & PCTL_STAT_MSK) != CONFIG)
  359. ;
  360. break;
  361. case CONFIG:
  362. return;
  363. default:
  364. break;
  365. }
  366. }
  367. }
  368. static void set_bandwidth_ratio(const struct chan_info *chan, u32 channel,
  369. u32 n, struct rk3288_grf *grf)
  370. {
  371. struct rk3288_ddr_pctl *pctl = chan->pctl;
  372. struct rk3288_ddr_publ *publ = chan->publ;
  373. struct rk3288_msch *msch = chan->msch;
  374. if (n == 1) {
  375. setbits_le32(&pctl->ppcfg, 1);
  376. rk_setreg(&grf->soc_con0, 1 << (8 + channel));
  377. setbits_le32(&msch->ddrtiming, 1 << 31);
  378. /* Data Byte disable*/
  379. clrbits_le32(&publ->datx8[2].dxgcr, 1);
  380. clrbits_le32(&publ->datx8[3].dxgcr, 1);
  381. /* disable DLL */
  382. setbits_le32(&publ->datx8[2].dxdllcr, DXDLLCR_DLLDIS);
  383. setbits_le32(&publ->datx8[3].dxdllcr, DXDLLCR_DLLDIS);
  384. } else {
  385. clrbits_le32(&pctl->ppcfg, 1);
  386. rk_clrreg(&grf->soc_con0, 1 << (8 + channel));
  387. clrbits_le32(&msch->ddrtiming, 1 << 31);
  388. /* Data Byte enable*/
  389. setbits_le32(&publ->datx8[2].dxgcr, 1);
  390. setbits_le32(&publ->datx8[3].dxgcr, 1);
  391. /* enable DLL */
  392. clrbits_le32(&publ->datx8[2].dxdllcr, DXDLLCR_DLLDIS);
  393. clrbits_le32(&publ->datx8[3].dxdllcr, DXDLLCR_DLLDIS);
  394. /* reset DLL */
  395. clrbits_le32(&publ->datx8[2].dxdllcr, DXDLLCR_DLLSRST);
  396. clrbits_le32(&publ->datx8[3].dxdllcr, DXDLLCR_DLLSRST);
  397. udelay(10);
  398. setbits_le32(&publ->datx8[2].dxdllcr, DXDLLCR_DLLSRST);
  399. setbits_le32(&publ->datx8[3].dxdllcr, DXDLLCR_DLLSRST);
  400. }
  401. setbits_le32(&pctl->dfistcfg0, 1 << 2);
  402. }
  403. static int data_training(const struct chan_info *chan, u32 channel,
  404. const struct rk3288_sdram_params *sdram_params)
  405. {
  406. unsigned int j;
  407. int ret = 0;
  408. u32 rank;
  409. int i;
  410. u32 step[2] = { PIR_QSTRN, PIR_RVTRN };
  411. struct rk3288_ddr_publ *publ = chan->publ;
  412. struct rk3288_ddr_pctl *pctl = chan->pctl;
  413. /* disable auto refresh */
  414. writel(0, &pctl->trefi);
  415. if (sdram_params->base.dramtype != LPDDR3)
  416. setbits_le32(&publ->pgcr, 1 << PGCR_DQSCFG_SHIFT);
  417. rank = sdram_params->ch[channel].rank | 1;
  418. for (j = 0; j < ARRAY_SIZE(step); j++) {
  419. /*
  420. * trigger QSTRN and RVTRN
  421. * clear DTDONE status
  422. */
  423. setbits_le32(&publ->pir, PIR_CLRSR);
  424. /* trigger DTT */
  425. setbits_le32(&publ->pir,
  426. PIR_INIT | step[j] | PIR_LOCKBYP | PIR_ZCALBYP |
  427. PIR_CLRSR);
  428. udelay(1);
  429. /* wait echo byte DTDONE */
  430. while ((readl(&publ->datx8[0].dxgsr[0]) & rank)
  431. != rank)
  432. ;
  433. while ((readl(&publ->datx8[1].dxgsr[0]) & rank)
  434. != rank)
  435. ;
  436. if (!(readl(&pctl->ppcfg) & 1)) {
  437. while ((readl(&publ->datx8[2].dxgsr[0])
  438. & rank) != rank)
  439. ;
  440. while ((readl(&publ->datx8[3].dxgsr[0])
  441. & rank) != rank)
  442. ;
  443. }
  444. if (readl(&publ->pgsr) &
  445. (PGSR_DTERR | PGSR_RVERR | PGSR_RVEIRR)) {
  446. ret = -1;
  447. break;
  448. }
  449. }
  450. /* send some auto refresh to complement the lost while DTT */
  451. for (i = 0; i < (rank > 1 ? 8 : 4); i++)
  452. send_command(pctl, rank, REF_CMD, 0);
  453. if (sdram_params->base.dramtype != LPDDR3)
  454. clrbits_le32(&publ->pgcr, 1 << PGCR_DQSCFG_SHIFT);
  455. /* resume auto refresh */
  456. writel(sdram_params->pctl_timing.trefi, &pctl->trefi);
  457. return ret;
  458. }
  459. static void move_to_access_state(const struct chan_info *chan)
  460. {
  461. struct rk3288_ddr_publ *publ = chan->publ;
  462. struct rk3288_ddr_pctl *pctl = chan->pctl;
  463. unsigned int state;
  464. while (1) {
  465. state = readl(&pctl->stat) & PCTL_STAT_MSK;
  466. switch (state) {
  467. case LOW_POWER:
  468. if (((readl(&pctl->stat) >> LP_TRIG_SHIFT) &
  469. LP_TRIG_MASK) == 1)
  470. return;
  471. writel(WAKEUP_STATE, &pctl->sctl);
  472. while ((readl(&pctl->stat) & PCTL_STAT_MSK) != ACCESS)
  473. ;
  474. /* wait DLL lock */
  475. while ((readl(&publ->pgsr) & PGSR_DLDONE)
  476. != PGSR_DLDONE)
  477. ;
  478. break;
  479. case INIT_MEM:
  480. writel(CFG_STATE, &pctl->sctl);
  481. while ((readl(&pctl->stat) & PCTL_STAT_MSK) != CONFIG)
  482. ;
  483. case CONFIG:
  484. writel(GO_STATE, &pctl->sctl);
  485. while ((readl(&pctl->stat) & PCTL_STAT_MSK) == CONFIG)
  486. ;
  487. break;
  488. case ACCESS:
  489. return;
  490. default:
  491. break;
  492. }
  493. }
  494. }
  495. static void dram_cfg_rbc(const struct chan_info *chan, u32 chnum,
  496. const struct rk3288_sdram_params *sdram_params)
  497. {
  498. struct rk3288_ddr_publ *publ = chan->publ;
  499. if (sdram_params->ch[chnum].bk == 3)
  500. clrsetbits_le32(&publ->dcr, PDQ_MASK << PDQ_SHIFT,
  501. 1 << PDQ_SHIFT);
  502. else
  503. clrbits_le32(&publ->dcr, PDQ_MASK << PDQ_SHIFT);
  504. writel(sdram_params->base.ddrconfig, &chan->msch->ddrconf);
  505. }
  506. static void dram_all_config(const struct dram_info *dram,
  507. const struct rk3288_sdram_params *sdram_params)
  508. {
  509. unsigned int chan;
  510. u32 sys_reg = 0;
  511. sys_reg |= sdram_params->base.dramtype << SYS_REG_DDRTYPE_SHIFT;
  512. sys_reg |= (sdram_params->num_channels - 1) << SYS_REG_NUM_CH_SHIFT;
  513. for (chan = 0; chan < sdram_params->num_channels; chan++) {
  514. const struct rk3288_sdram_channel *info =
  515. &sdram_params->ch[chan];
  516. sys_reg |= info->row_3_4 << SYS_REG_ROW_3_4_SHIFT(chan);
  517. sys_reg |= chan << SYS_REG_CHINFO_SHIFT(chan);
  518. sys_reg |= (info->rank - 1) << SYS_REG_RANK_SHIFT(chan);
  519. sys_reg |= (info->col - 9) << SYS_REG_COL_SHIFT(chan);
  520. sys_reg |= info->bk == 3 ? 1 << SYS_REG_BK_SHIFT(chan) : 0;
  521. sys_reg |= (info->cs0_row - 13) << SYS_REG_CS0_ROW_SHIFT(chan);
  522. sys_reg |= (info->cs1_row - 13) << SYS_REG_CS1_ROW_SHIFT(chan);
  523. sys_reg |= info->bw << SYS_REG_BW_SHIFT(chan);
  524. sys_reg |= info->dbw << SYS_REG_DBW_SHIFT(chan);
  525. dram_cfg_rbc(&dram->chan[chan], chan, sdram_params);
  526. }
  527. writel(sys_reg, &dram->pmu->sys_reg[2]);
  528. rk_clrsetreg(&dram->sgrf->soc_con2, 0x1f, sdram_params->base.stride);
  529. }
  530. static int sdram_init(struct dram_info *dram,
  531. const struct rk3288_sdram_params *sdram_params)
  532. {
  533. int channel;
  534. int zqcr;
  535. int ret;
  536. debug("%s start\n", __func__);
  537. if ((sdram_params->base.dramtype == DDR3 &&
  538. sdram_params->base.ddr_freq > 800000000) ||
  539. (sdram_params->base.dramtype == LPDDR3 &&
  540. sdram_params->base.ddr_freq > 533000000)) {
  541. debug("SDRAM frequency is too high!");
  542. return -E2BIG;
  543. }
  544. debug("ddr clk dpll\n");
  545. ret = clk_set_rate(&dram->ddr_clk, sdram_params->base.ddr_freq);
  546. debug("ret=%d\n", ret);
  547. if (ret) {
  548. debug("Could not set DDR clock\n");
  549. return ret;
  550. }
  551. for (channel = 0; channel < 2; channel++) {
  552. const struct chan_info *chan = &dram->chan[channel];
  553. struct rk3288_ddr_pctl *pctl = chan->pctl;
  554. struct rk3288_ddr_publ *publ = chan->publ;
  555. phy_pctrl_reset(dram->cru, publ, channel);
  556. phy_dll_bypass_set(publ, sdram_params->base.ddr_freq);
  557. if (channel >= sdram_params->num_channels)
  558. continue;
  559. dfi_cfg(pctl, sdram_params->base.dramtype);
  560. pctl_cfg(channel, pctl, sdram_params, dram->grf);
  561. phy_cfg(chan, channel, sdram_params);
  562. phy_init(publ);
  563. writel(POWER_UP_START, &pctl->powctl);
  564. while (!(readl(&pctl->powstat) & POWER_UP_DONE))
  565. ;
  566. memory_init(publ, sdram_params->base.dramtype);
  567. move_to_config_state(publ, pctl);
  568. if (sdram_params->base.dramtype == LPDDR3) {
  569. send_command(pctl, 3, DESELECT_CMD, 0);
  570. udelay(1);
  571. send_command(pctl, 3, PREA_CMD, 0);
  572. udelay(1);
  573. send_command_op(pctl, 3, MRS_CMD, 63, 0xfc);
  574. udelay(1);
  575. send_command_op(pctl, 3, MRS_CMD, 1,
  576. sdram_params->phy_timing.mr[1]);
  577. udelay(1);
  578. send_command_op(pctl, 3, MRS_CMD, 2,
  579. sdram_params->phy_timing.mr[2]);
  580. udelay(1);
  581. send_command_op(pctl, 3, MRS_CMD, 3,
  582. sdram_params->phy_timing.mr[3]);
  583. udelay(1);
  584. }
  585. set_bandwidth_ratio(chan, channel,
  586. sdram_params->ch[channel].bw, dram->grf);
  587. /*
  588. * set cs
  589. * CS0, n=1
  590. * CS1, n=2
  591. * CS0 & CS1, n = 3
  592. */
  593. clrsetbits_le32(&publ->pgcr, 0xF << 18,
  594. (sdram_params->ch[channel].rank | 1) << 18);
  595. /* DS=40ohm,ODT=155ohm */
  596. zqcr = 1 << ZDEN_SHIFT | 2 << PU_ONDIE_SHIFT |
  597. 2 << PD_ONDIE_SHIFT | 0x19 << PU_OUTPUT_SHIFT |
  598. 0x19 << PD_OUTPUT_SHIFT;
  599. writel(zqcr, &publ->zq1cr[0]);
  600. writel(zqcr, &publ->zq0cr[0]);
  601. if (sdram_params->base.dramtype == LPDDR3) {
  602. /* LPDDR2/LPDDR3 need to wait DAI complete, max 10us */
  603. udelay(10);
  604. send_command_op(pctl,
  605. sdram_params->ch[channel].rank | 1,
  606. MRS_CMD, 11,
  607. sdram_params->base.odt ? 3 : 0);
  608. if (channel == 0) {
  609. writel(0, &pctl->mrrcfg0);
  610. send_command_op(pctl, 1, MRR_CMD, 8, 0);
  611. /* S8 */
  612. if ((readl(&pctl->mrrstat0) & 0x3) != 3) {
  613. debug("failed!");
  614. return -EREMOTEIO;
  615. }
  616. }
  617. }
  618. if (-1 == data_training(chan, channel, sdram_params)) {
  619. if (sdram_params->base.dramtype == LPDDR3) {
  620. ddr_phy_ctl_reset(dram->cru, channel, 1);
  621. udelay(10);
  622. ddr_phy_ctl_reset(dram->cru, channel, 0);
  623. udelay(10);
  624. }
  625. debug("failed!");
  626. return -EIO;
  627. }
  628. if (sdram_params->base.dramtype == LPDDR3) {
  629. u32 i;
  630. writel(0, &pctl->mrrcfg0);
  631. for (i = 0; i < 17; i++)
  632. send_command_op(pctl, 1, MRR_CMD, i, 0);
  633. }
  634. move_to_access_state(chan);
  635. }
  636. dram_all_config(dram, sdram_params);
  637. debug("%s done\n", __func__);
  638. return 0;
  639. }
  640. #endif /* CONFIG_SPL_BUILD */
  641. size_t sdram_size_mb(struct rk3288_pmu *pmu)
  642. {
  643. u32 rank, col, bk, cs0_row, cs1_row, bw, row_3_4;
  644. size_t chipsize_mb = 0;
  645. size_t size_mb = 0;
  646. u32 ch;
  647. u32 sys_reg = readl(&pmu->sys_reg[2]);
  648. u32 chans;
  649. chans = 1 + ((sys_reg >> SYS_REG_NUM_CH_SHIFT) & SYS_REG_NUM_CH_MASK);
  650. for (ch = 0; ch < chans; ch++) {
  651. rank = 1 + (sys_reg >> SYS_REG_RANK_SHIFT(ch) &
  652. SYS_REG_RANK_MASK);
  653. col = 9 + (sys_reg >> SYS_REG_COL_SHIFT(ch) & SYS_REG_COL_MASK);
  654. bk = sys_reg & (1 << SYS_REG_BK_SHIFT(ch)) ? 3 : 0;
  655. cs0_row = 13 + (sys_reg >> SYS_REG_CS0_ROW_SHIFT(ch) &
  656. SYS_REG_CS0_ROW_MASK);
  657. cs1_row = 13 + (sys_reg >> SYS_REG_CS1_ROW_SHIFT(ch) &
  658. SYS_REG_CS1_ROW_MASK);
  659. bw = (sys_reg >> SYS_REG_BW_SHIFT(ch)) &
  660. SYS_REG_BW_MASK;
  661. row_3_4 = sys_reg >> SYS_REG_ROW_3_4_SHIFT(ch) &
  662. SYS_REG_ROW_3_4_MASK;
  663. chipsize_mb = (1 << (cs0_row + col + bk + bw - 20));
  664. if (rank > 1)
  665. chipsize_mb += chipsize_mb >>
  666. (cs0_row - cs1_row);
  667. if (row_3_4)
  668. chipsize_mb = chipsize_mb * 3 / 4;
  669. size_mb += chipsize_mb;
  670. }
  671. /*
  672. * we use the 0x00000000~0xfeffffff space since 0xff000000~0xffffffff
  673. * is SoC register space (i.e. reserved)
  674. */
  675. size_mb = min(size_mb, 0xff000000 >> 20);
  676. return size_mb;
  677. }
  678. #ifdef CONFIG_SPL_BUILD
  679. # ifdef CONFIG_ROCKCHIP_FAST_SPL
  680. static int veyron_init(struct dram_info *priv)
  681. {
  682. struct udevice *pmic;
  683. int ret;
  684. ret = uclass_first_device_err(UCLASS_PMIC, &pmic);
  685. if (ret)
  686. return ret;
  687. /* Slowly raise to max CPU voltage to prevent overshoot */
  688. ret = rk808_spl_configure_buck(pmic, 1, 1200000);
  689. if (ret)
  690. return ret;
  691. udelay(175);/* Must wait for voltage to stabilize, 2mV/us */
  692. ret = rk808_spl_configure_buck(pmic, 1, 1400000);
  693. if (ret)
  694. return ret;
  695. udelay(100);/* Must wait for voltage to stabilize, 2mV/us */
  696. rkclk_configure_cpu(priv->cru, priv->grf);
  697. return 0;
  698. }
  699. # endif
  700. static int setup_sdram(struct udevice *dev)
  701. {
  702. struct dram_info *priv = dev_get_priv(dev);
  703. struct rk3288_sdram_params *params = dev_get_platdata(dev);
  704. # ifdef CONFIG_ROCKCHIP_FAST_SPL
  705. if (priv->is_veyron) {
  706. int ret;
  707. ret = veyron_init(priv);
  708. if (ret)
  709. return ret;
  710. }
  711. # endif
  712. return sdram_init(priv, params);
  713. }
  714. static int rk3288_dmc_ofdata_to_platdata(struct udevice *dev)
  715. {
  716. #if !CONFIG_IS_ENABLED(OF_PLATDATA)
  717. struct rk3288_sdram_params *params = dev_get_platdata(dev);
  718. const void *blob = gd->fdt_blob;
  719. int node = dev->of_offset;
  720. int i, ret;
  721. params->num_channels = fdtdec_get_int(blob, node,
  722. "rockchip,num-channels", 1);
  723. for (i = 0; i < params->num_channels; i++) {
  724. ret = fdtdec_get_byte_array(blob, node,
  725. "rockchip,sdram-channel",
  726. (u8 *)&params->ch[i],
  727. sizeof(params->ch[i]));
  728. if (ret) {
  729. debug("%s: Cannot read rockchip,sdram-channel\n",
  730. __func__);
  731. return -EINVAL;
  732. }
  733. }
  734. ret = fdtdec_get_int_array(blob, node, "rockchip,pctl-timing",
  735. (u32 *)&params->pctl_timing,
  736. sizeof(params->pctl_timing) / sizeof(u32));
  737. if (ret) {
  738. debug("%s: Cannot read rockchip,pctl-timing\n", __func__);
  739. return -EINVAL;
  740. }
  741. ret = fdtdec_get_int_array(blob, node, "rockchip,phy-timing",
  742. (u32 *)&params->phy_timing,
  743. sizeof(params->phy_timing) / sizeof(u32));
  744. if (ret) {
  745. debug("%s: Cannot read rockchip,phy-timing\n", __func__);
  746. return -EINVAL;
  747. }
  748. ret = fdtdec_get_int_array(blob, node, "rockchip,sdram-params",
  749. (u32 *)&params->base,
  750. sizeof(params->base) / sizeof(u32));
  751. if (ret) {
  752. debug("%s: Cannot read rockchip,sdram-params\n", __func__);
  753. return -EINVAL;
  754. }
  755. #ifdef CONFIG_ROCKCHIP_FAST_SPL
  756. struct dram_info *priv = dev_get_priv(dev);
  757. priv->is_veyron = !fdt_node_check_compatible(blob, 0, "google,veyron");
  758. #endif
  759. ret = regmap_init_mem(dev, &params->map);
  760. if (ret)
  761. return ret;
  762. #endif
  763. return 0;
  764. }
  765. #endif /* CONFIG_SPL_BUILD */
  766. #if CONFIG_IS_ENABLED(OF_PLATDATA)
  767. static int conv_of_platdata(struct udevice *dev)
  768. {
  769. struct rk3288_sdram_params *plat = dev_get_platdata(dev);
  770. struct dtd_rockchip_rk3288_dmc *of_plat = &plat->of_plat;
  771. int i, ret;
  772. for (i = 0; i < 2; i++) {
  773. memcpy(&plat->ch[i], of_plat->rockchip_sdram_channel,
  774. sizeof(plat->ch[i]));
  775. }
  776. memcpy(&plat->pctl_timing, of_plat->rockchip_pctl_timing,
  777. sizeof(plat->pctl_timing));
  778. memcpy(&plat->phy_timing, of_plat->rockchip_phy_timing,
  779. sizeof(plat->phy_timing));
  780. memcpy(&plat->base, of_plat->rockchip_sdram_params, sizeof(plat->base));
  781. plat->num_channels = of_plat->rockchip_num_channels;
  782. ret = regmap_init_mem_platdata(dev, of_plat->reg,
  783. ARRAY_SIZE(of_plat->reg) / 2,
  784. &plat->map);
  785. if (ret)
  786. return ret;
  787. return 0;
  788. }
  789. #endif
  790. static int rk3288_dmc_probe(struct udevice *dev)
  791. {
  792. #ifdef CONFIG_SPL_BUILD
  793. struct rk3288_sdram_params *plat = dev_get_platdata(dev);
  794. #endif
  795. struct dram_info *priv = dev_get_priv(dev);
  796. struct regmap *map;
  797. int ret;
  798. struct udevice *dev_clk;
  799. #if CONFIG_IS_ENABLED(OF_PLATDATA)
  800. ret = conv_of_platdata(dev);
  801. if (ret)
  802. return ret;
  803. #endif
  804. map = syscon_get_regmap_by_driver_data(ROCKCHIP_SYSCON_NOC);
  805. if (IS_ERR(map))
  806. return PTR_ERR(map);
  807. priv->chan[0].msch = regmap_get_range(map, 0);
  808. priv->chan[1].msch = (struct rk3288_msch *)
  809. (regmap_get_range(map, 0) + 0x80);
  810. priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
  811. priv->sgrf = syscon_get_first_range(ROCKCHIP_SYSCON_SGRF);
  812. priv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);
  813. #ifdef CONFIG_SPL_BUILD
  814. priv->chan[0].pctl = regmap_get_range(plat->map, 0);
  815. priv->chan[0].publ = regmap_get_range(plat->map, 1);
  816. priv->chan[1].pctl = regmap_get_range(plat->map, 2);
  817. priv->chan[1].publ = regmap_get_range(plat->map, 3);
  818. #endif
  819. ret = uclass_get_device(UCLASS_CLK, 0, &dev_clk);
  820. if (ret)
  821. return ret;
  822. priv->ddr_clk.id = CLK_DDR;
  823. ret = clk_request(dev_clk, &priv->ddr_clk);
  824. if (ret)
  825. return ret;
  826. priv->cru = rockchip_get_cru();
  827. if (IS_ERR(priv->cru))
  828. return PTR_ERR(priv->cru);
  829. #ifdef CONFIG_SPL_BUILD
  830. ret = setup_sdram(dev);
  831. if (ret)
  832. return ret;
  833. #endif
  834. priv->info.base = 0;
  835. priv->info.size = sdram_size_mb(priv->pmu) << 20;
  836. return 0;
  837. }
  838. static int rk3288_dmc_get_info(struct udevice *dev, struct ram_info *info)
  839. {
  840. struct dram_info *priv = dev_get_priv(dev);
  841. *info = priv->info;
  842. return 0;
  843. }
  844. static struct ram_ops rk3288_dmc_ops = {
  845. .get_info = rk3288_dmc_get_info,
  846. };
  847. static const struct udevice_id rk3288_dmc_ids[] = {
  848. { .compatible = "rockchip,rk3288-dmc" },
  849. { }
  850. };
  851. U_BOOT_DRIVER(dmc_rk3288) = {
  852. .name = "rockchip_rk3288_dmc",
  853. .id = UCLASS_RAM,
  854. .of_match = rk3288_dmc_ids,
  855. .ops = &rk3288_dmc_ops,
  856. #ifdef CONFIG_SPL_BUILD
  857. .ofdata_to_platdata = rk3288_dmc_ofdata_to_platdata,
  858. #endif
  859. .probe = rk3288_dmc_probe,
  860. .priv_auto_alloc_size = sizeof(struct dram_info),
  861. #ifdef CONFIG_SPL_BUILD
  862. .platdata_auto_alloc_size = sizeof(struct rk3288_sdram_params),
  863. #endif
  864. };