ddr3.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. /*
  2. * Keystone2: DDR3 initialization
  3. *
  4. * (C) Copyright 2012-2014
  5. * Texas Instruments Incorporated, <www.ti.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <common.h>
  10. #include <asm/arch/ddr3.h>
  11. #include <asm/arch/hardware.h>
  12. #include <asm/io.h>
  13. #include <i2c.h>
  14. /************************* *****************************/
  15. static struct ddr3_phy_config ddr3phy_1600_64A = {
  16. .pllcr = 0x0001C000ul,
  17. .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK),
  18. .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)),
  19. .ptr0 = 0x42C21590ul,
  20. .ptr1 = 0xD05612C0ul,
  21. .ptr2 = 0, /* not set in gel */
  22. .ptr3 = 0x0D861A80ul,
  23. .ptr4 = 0x0C827100ul,
  24. .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK | NOSRA_MASK),
  25. .dcr_val = ((1 << 10) | (1 << 27)),
  26. .dtpr0 = 0xA19DBB66ul,
  27. .dtpr1 = 0x12868300ul,
  28. .dtpr2 = 0x50035200ul,
  29. .mr0 = 0x00001C70ul,
  30. .mr1 = 0x00000006ul,
  31. .mr2 = 0x00000018ul,
  32. .dtcr = 0x730035C7ul,
  33. .pgcr2 = 0x00F07A12ul,
  34. .zq0cr1 = 0x0000005Dul,
  35. .zq1cr1 = 0x0000005Bul,
  36. .zq2cr1 = 0x0000005Bul,
  37. .pir_v1 = 0x00000033ul,
  38. .pir_v2 = 0x0000FF81ul,
  39. };
  40. static struct ddr3_emif_config ddr3_1600_64 = {
  41. .sdcfg = 0x6200CE6aul,
  42. .sdtim1 = 0x16709C55ul,
  43. .sdtim2 = 0x00001D4Aul,
  44. .sdtim3 = 0x435DFF54ul,
  45. .sdtim4 = 0x553F0CFFul,
  46. .zqcfg = 0xF0073200ul,
  47. .sdrfc = 0x00001869ul,
  48. };
  49. static struct ddr3_phy_config ddr3phy_1600_32 = {
  50. .pllcr = 0x0001C000ul,
  51. .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK),
  52. .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)),
  53. .ptr0 = 0x42C21590ul,
  54. .ptr1 = 0xD05612C0ul,
  55. .ptr2 = 0, /* not set in gel */
  56. .ptr3 = 0x0D861A80ul,
  57. .ptr4 = 0x0C827100ul,
  58. .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK | NOSRA_MASK),
  59. .dcr_val = ((1 << 10) | (1 << 27)),
  60. .dtpr0 = 0xA19DBB66ul,
  61. .dtpr1 = 0x12868300ul,
  62. .dtpr2 = 0x50035200ul,
  63. .mr0 = 0x00001C70ul,
  64. .mr1 = 0x00000006ul,
  65. .mr2 = 0x00000018ul,
  66. .dtcr = 0x730035C7ul,
  67. .pgcr2 = 0x00F07A12ul,
  68. .zq0cr1 = 0x0000005Dul,
  69. .zq1cr1 = 0x0000005Bul,
  70. .zq2cr1 = 0x0000005Bul,
  71. .pir_v1 = 0x00000033ul,
  72. .pir_v2 = 0x0000FF81ul,
  73. };
  74. static struct ddr3_emif_config ddr3_1600_32 = {
  75. .sdcfg = 0x6200DE6aul,
  76. .sdtim1 = 0x16709C55ul,
  77. .sdtim2 = 0x00001D4Aul,
  78. .sdtim3 = 0x435DFF54ul,
  79. .sdtim4 = 0x553F0CFFul,
  80. .zqcfg = 0x70073200ul,
  81. .sdrfc = 0x00001869ul,
  82. };
  83. /************************* *****************************/
  84. static struct ddr3_phy_config ddr3phy_1333_64A = {
  85. .pllcr = 0x0005C000ul,
  86. .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK),
  87. .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)),
  88. .ptr0 = 0x42C21590ul,
  89. .ptr1 = 0xD05612C0ul,
  90. .ptr2 = 0, /* not set in gel */
  91. .ptr3 = 0x0B4515C2ul,
  92. .ptr4 = 0x0A6E08B4ul,
  93. .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK |
  94. NOSRA_MASK | UDIMM_MASK),
  95. .dcr_val = ((1 << 10) | (1 << 27) | (1 << 29)),
  96. .dtpr0 = 0x8558AA55ul,
  97. .dtpr1 = 0x12857280ul,
  98. .dtpr2 = 0x5002C200ul,
  99. .mr0 = 0x00001A60ul,
  100. .mr1 = 0x00000006ul,
  101. .mr2 = 0x00000010ul,
  102. .dtcr = 0x710035C7ul,
  103. .pgcr2 = 0x00F065B8ul,
  104. .zq0cr1 = 0x0000005Dul,
  105. .zq1cr1 = 0x0000005Bul,
  106. .zq2cr1 = 0x0000005Bul,
  107. .pir_v1 = 0x00000033ul,
  108. .pir_v2 = 0x0000FF81ul,
  109. };
  110. static struct ddr3_emif_config ddr3_1333_64 = {
  111. .sdcfg = 0x62008C62ul,
  112. .sdtim1 = 0x125C8044ul,
  113. .sdtim2 = 0x00001D29ul,
  114. .sdtim3 = 0x32CDFF43ul,
  115. .sdtim4 = 0x543F0ADFul,
  116. .zqcfg = 0xF0073200ul,
  117. .sdrfc = 0x00001457ul,
  118. };
  119. static struct ddr3_phy_config ddr3phy_1333_32 = {
  120. .pllcr = 0x0005C000ul,
  121. .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK),
  122. .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)),
  123. .ptr0 = 0x42C21590ul,
  124. .ptr1 = 0xD05612C0ul,
  125. .ptr2 = 0, /* not set in gel */
  126. .ptr3 = 0x0B4515C2ul,
  127. .ptr4 = 0x0A6E08B4ul,
  128. .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK |
  129. NOSRA_MASK | UDIMM_MASK),
  130. .dcr_val = ((1 << 10) | (1 << 27) | (1 << 29)),
  131. .dtpr0 = 0x8558AA55ul,
  132. .dtpr1 = 0x12857280ul,
  133. .dtpr2 = 0x5002C200ul,
  134. .mr0 = 0x00001A60ul,
  135. .mr1 = 0x00000006ul,
  136. .mr2 = 0x00000010ul,
  137. .dtcr = 0x710035C7ul,
  138. .pgcr2 = 0x00F065B8ul,
  139. .zq0cr1 = 0x0000005Dul,
  140. .zq1cr1 = 0x0000005Bul,
  141. .zq2cr1 = 0x0000005Bul,
  142. .pir_v1 = 0x00000033ul,
  143. .pir_v2 = 0x0000FF81ul,
  144. };
  145. static struct ddr3_emif_config ddr3_1333_32 = {
  146. .sdcfg = 0x62009C62ul,
  147. .sdtim1 = 0x125C8044ul,
  148. .sdtim2 = 0x00001D29ul,
  149. .sdtim3 = 0x32CDFF43ul,
  150. .sdtim4 = 0x543F0ADFul,
  151. .zqcfg = 0xf0073200ul,
  152. .sdrfc = 0x00001457ul,
  153. };
  154. /************************* *****************************/
  155. static struct ddr3_phy_config ddr3phy_1333_64 = {
  156. .pllcr = 0x0005C000ul,
  157. .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK),
  158. .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)),
  159. .ptr0 = 0x42C21590ul,
  160. .ptr1 = 0xD05612C0ul,
  161. .ptr2 = 0, /* not set in gel */
  162. .ptr3 = 0x0B4515C2ul,
  163. .ptr4 = 0x0A6E08B4ul,
  164. .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK | NOSRA_MASK),
  165. .dcr_val = ((1 << 10) | (1 << 27)),
  166. .dtpr0 = 0x8558AA55ul,
  167. .dtpr1 = 0x12857280ul,
  168. .dtpr2 = 0x5002C200ul,
  169. .mr0 = 0x00001A60ul,
  170. .mr1 = 0x00000006ul,
  171. .mr2 = 0x00000010ul,
  172. .dtcr = 0x710035C7ul,
  173. .pgcr2 = 0x00F065B8ul,
  174. .zq0cr1 = 0x0000005Dul,
  175. .zq1cr1 = 0x0000005Bul,
  176. .zq2cr1 = 0x0000005Bul,
  177. .pir_v1 = 0x00000033ul,
  178. .pir_v2 = 0x0000FF81ul,
  179. };
  180. /******************************************************/
  181. /* DDR PHY Configs Updated for PG 2.0
  182. * zq0,1,2cr1 are updated for PG 2.0 specific configs *_pg2 */
  183. static struct ddr3_phy_config ddr3phy_1600_64A_pg2 = {
  184. .pllcr = 0x0001C000ul,
  185. .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK),
  186. .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)),
  187. .ptr0 = 0x42C21590ul,
  188. .ptr1 = 0xD05612C0ul,
  189. .ptr2 = 0, /* not set in gel */
  190. .ptr3 = 0x0D861A80ul,
  191. .ptr4 = 0x0C827100ul,
  192. .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK),
  193. .dcr_val = ((1 << 10)),
  194. .dtpr0 = 0xA19DBB66ul,
  195. .dtpr1 = 0x32868300ul,
  196. .dtpr2 = 0x50035200ul,
  197. .mr0 = 0x00001C70ul,
  198. .mr1 = 0x00000006ul,
  199. .mr2 = 0x00000018ul,
  200. .dtcr = 0x730035C7ul,
  201. .pgcr2 = 0x00F07A12ul,
  202. .zq0cr1 = 0x0001005Dul,
  203. .zq1cr1 = 0x0001005Bul,
  204. .zq2cr1 = 0x0001005Bul,
  205. .pir_v1 = 0x00000033ul,
  206. .pir_v2 = 0x0000FF81ul,
  207. };
  208. static struct ddr3_phy_config ddr3phy_1333_64A_pg2 = {
  209. .pllcr = 0x0005C000ul,
  210. .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK),
  211. .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)),
  212. .ptr0 = 0x42C21590ul,
  213. .ptr1 = 0xD05612C0ul,
  214. .ptr2 = 0, /* not set in gel */
  215. .ptr3 = 0x0B4515C2ul,
  216. .ptr4 = 0x0A6E08B4ul,
  217. .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK),
  218. .dcr_val = ((1 << 10)),
  219. .dtpr0 = 0x8558AA55ul,
  220. .dtpr1 = 0x32857280ul,
  221. .dtpr2 = 0x5002C200ul,
  222. .mr0 = 0x00001A60ul,
  223. .mr1 = 0x00000006ul,
  224. .mr2 = 0x00000010ul,
  225. .dtcr = 0x710035C7ul,
  226. .pgcr2 = 0x00F065B8ul,
  227. .zq0cr1 = 0x0001005Dul,
  228. .zq1cr1 = 0x0001005Bul,
  229. .zq2cr1 = 0x0001005Bul,
  230. .pir_v1 = 0x00000033ul,
  231. .pir_v2 = 0x0000FF81ul,
  232. };
  233. int get_dimm_params(char *dimm_name)
  234. {
  235. u8 spd_params[256];
  236. int ret;
  237. int old_bus;
  238. i2c_init(CONFIG_SYS_DAVINCI_I2C_SPEED, CONFIG_SYS_DAVINCI_I2C_SLAVE);
  239. old_bus = i2c_get_bus_num();
  240. i2c_set_bus_num(1);
  241. ret = i2c_read(0x53, 0, 1, spd_params, 256);
  242. i2c_set_bus_num(old_bus);
  243. dimm_name[0] = '\0';
  244. if (ret) {
  245. puts("Cannot read DIMM params\n");
  246. return 1;
  247. }
  248. /*
  249. * We need to convert spd data to dimm parameters
  250. * and to DDR3 EMIF and PHY regirsters values.
  251. * For now we just return DIMM type string value.
  252. * Caller may use this value to choose appropriate
  253. * a pre-set DDR3 configuration
  254. */
  255. strncpy(dimm_name, (char *)&spd_params[0x80], 18);
  256. dimm_name[18] = '\0';
  257. return 0;
  258. }
  259. struct pll_init_data ddr3a_333 = DDR3_PLL_333(A);
  260. struct pll_init_data ddr3b_333 = DDR3_PLL_333(B);
  261. struct pll_init_data ddr3a_400 = DDR3_PLL_400(A);
  262. struct pll_init_data ddr3b_400 = DDR3_PLL_400(B);
  263. void ddr3_init(void)
  264. {
  265. char dimm_name[32];
  266. get_dimm_params(dimm_name);
  267. printf("Detected SO-DIMM [%s]\n", dimm_name);
  268. if (!strcmp(dimm_name, "18KSF1G72HZ-1G6E2 ")) {
  269. init_pll(&ddr3a_400);
  270. if (cpu_revision() > 0) {
  271. if (cpu_revision() > 1) {
  272. /* PG 2.0 */
  273. /* Reset DDR3A PHY after PLL enabled */
  274. ddr3_reset_ddrphy();
  275. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC,
  276. &ddr3phy_1600_64A_pg2);
  277. } else {
  278. /* PG 1.1 */
  279. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC,
  280. &ddr3phy_1600_64A);
  281. }
  282. ddr3_init_ddremif(K2HK_DDR3A_EMIF_CTRL_BASE,
  283. &ddr3_1600_64);
  284. printf("DRAM: Capacity 8 GiB (includes reported below)\n");
  285. } else {
  286. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC, &ddr3phy_1600_32);
  287. ddr3_init_ddremif(K2HK_DDR3A_EMIF_CTRL_BASE,
  288. &ddr3_1600_32);
  289. printf("DRAM: Capacity 4 GiB (includes reported below)\n");
  290. }
  291. } else if (!strcmp(dimm_name, "SQR-SD3T-2G1333SED")) {
  292. init_pll(&ddr3a_333);
  293. if (cpu_revision() > 0) {
  294. if (cpu_revision() > 1) {
  295. /* PG 2.0 */
  296. /* Reset DDR3A PHY after PLL enabled */
  297. ddr3_reset_ddrphy();
  298. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC,
  299. &ddr3phy_1333_64A_pg2);
  300. } else {
  301. /* PG 1.1 */
  302. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC,
  303. &ddr3phy_1333_64A);
  304. }
  305. ddr3_init_ddremif(K2HK_DDR3A_EMIF_CTRL_BASE,
  306. &ddr3_1333_64);
  307. } else {
  308. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC, &ddr3phy_1333_32);
  309. ddr3_init_ddremif(K2HK_DDR3A_EMIF_CTRL_BASE,
  310. &ddr3_1333_32);
  311. }
  312. } else {
  313. printf("Unknown SO-DIMM. Cannot configure DDR3\n");
  314. while (1)
  315. ;
  316. }
  317. init_pll(&ddr3b_333);
  318. ddr3_init_ddrphy(K2HK_DDR3B_DDRPHYC, &ddr3phy_1333_64);
  319. ddr3_init_ddremif(K2HK_DDR3B_EMIF_CTRL_BASE, &ddr3_1333_64);
  320. }