sdram_rk3188.c 25 KB

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