ddr3.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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. int get_dimm_params(char *dimm_name)
  182. {
  183. u8 spd_params[256];
  184. int ret;
  185. int old_bus;
  186. i2c_init(CONFIG_SYS_DAVINCI_I2C_SPEED, CONFIG_SYS_DAVINCI_I2C_SLAVE);
  187. old_bus = i2c_get_bus_num();
  188. i2c_set_bus_num(1);
  189. ret = i2c_read(0x53, 0, 1, spd_params, 256);
  190. i2c_set_bus_num(old_bus);
  191. dimm_name[0] = '\0';
  192. if (ret) {
  193. puts("Cannot read DIMM params\n");
  194. return 1;
  195. }
  196. /*
  197. * We need to convert spd data to dimm parameters
  198. * and to DDR3 EMIF and PHY regirsters values.
  199. * For now we just return DIMM type string value.
  200. * Caller may use this value to choose appropriate
  201. * a pre-set DDR3 configuration
  202. */
  203. strncpy(dimm_name, (char *)&spd_params[0x80], 18);
  204. dimm_name[18] = '\0';
  205. return 0;
  206. }
  207. struct pll_init_data ddr3a_333 = DDR3_PLL_333(A);
  208. struct pll_init_data ddr3b_333 = DDR3_PLL_333(B);
  209. struct pll_init_data ddr3a_400 = DDR3_PLL_400(A);
  210. struct pll_init_data ddr3b_400 = DDR3_PLL_400(B);
  211. void ddr3_init(void)
  212. {
  213. char dimm_name[32];
  214. get_dimm_params(dimm_name);
  215. printf("Detected SO-DIMM [%s]\n", dimm_name);
  216. if (!strcmp(dimm_name, "18KSF1G72HZ-1G6E2 ")) {
  217. init_pll(&ddr3a_400);
  218. if (cpu_revision() > 0) {
  219. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC, &ddr3phy_1600_64A);
  220. ddr3_init_ddremif(K2HK_DDR3A_EMIF_CTRL_BASE,
  221. &ddr3_1600_64);
  222. printf("DRAM: Capacity 8 GiB (includes reported below)\n");
  223. } else {
  224. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC, &ddr3phy_1600_32);
  225. ddr3_init_ddremif(K2HK_DDR3A_EMIF_CTRL_BASE,
  226. &ddr3_1600_32);
  227. printf("DRAM: Capacity 4 GiB (includes reported below)\n");
  228. }
  229. } else if (!strcmp(dimm_name, "SQR-SD3T-2G1333SED")) {
  230. init_pll(&ddr3a_333);
  231. if (cpu_revision() > 0) {
  232. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC, &ddr3phy_1333_64A);
  233. ddr3_init_ddremif(K2HK_DDR3A_EMIF_CTRL_BASE,
  234. &ddr3_1333_64);
  235. } else {
  236. ddr3_init_ddrphy(K2HK_DDR3A_DDRPHYC, &ddr3phy_1333_32);
  237. ddr3_init_ddremif(K2HK_DDR3A_EMIF_CTRL_BASE,
  238. &ddr3_1333_32);
  239. }
  240. } else {
  241. printf("Unknown SO-DIMM. Cannot configure DDR3\n");
  242. while (1)
  243. ;
  244. }
  245. init_pll(&ddr3b_333);
  246. ddr3_init_ddrphy(K2HK_DDR3B_DDRPHYC, &ddr3phy_1333_64);
  247. ddr3_init_ddremif(K2HK_DDR3B_EMIF_CTRL_BASE, &ddr3_1333_64);
  248. }