sdram.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  1. /*
  2. * Copyright Altera Corporation (C) 2014-2015
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <div64.h>
  8. #include <watchdog.h>
  9. #include <asm/arch/fpga_manager.h>
  10. #include <asm/arch/sdram.h>
  11. #include <asm/arch/sdram_config.h>
  12. #include <asm/arch/system_manager.h>
  13. #include <asm/io.h>
  14. /* define constant for 4G memory - used for SDRAM errata workaround */
  15. #define MEMSIZE_4G (4ULL * 1024ULL * 1024ULL * 1024ULL)
  16. DECLARE_GLOBAL_DATA_PTR;
  17. static struct socfpga_system_manager *sysmgr_regs =
  18. (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
  19. static struct socfpga_sdr_ctrl *sdr_ctrl =
  20. (struct socfpga_sdr_ctrl *)(SOCFPGA_SDR_ADDRESS + SDR_CTRLGRP_ADDRESS);
  21. static int compute_errata_rows(unsigned long long memsize, int cs, int width,
  22. int rows, int banks, int cols)
  23. {
  24. unsigned long long newrows;
  25. int inewrowslog2;
  26. int bits;
  27. debug("workaround rows - memsize %lld\n", memsize);
  28. debug("workaround rows - cs %d\n", cs);
  29. debug("workaround rows - width %d\n", width);
  30. debug("workaround rows - rows %d\n", rows);
  31. debug("workaround rows - banks %d\n", banks);
  32. debug("workaround rows - cols %d\n", cols);
  33. newrows = lldiv(memsize, (cs * (width / 8)));
  34. debug("rows workaround - term1 %lld\n", newrows);
  35. newrows = lldiv(newrows, ((1 << banks) * (1 << cols)));
  36. debug("rows workaround - term2 %lld\n", newrows);
  37. /* Compute the hamming weight - same as number of bits set.
  38. * Need to see if result is ordinal power of 2 before
  39. * attempting log2 of result.
  40. */
  41. bits = hweight32(newrows);
  42. debug("rows workaround - bits %d\n", bits);
  43. if (bits != 1) {
  44. printf("SDRAM workaround failed, bits set %d\n", bits);
  45. return rows;
  46. }
  47. if (newrows > UINT_MAX) {
  48. printf("SDRAM workaround rangecheck failed, %lld\n", newrows);
  49. return rows;
  50. }
  51. inewrowslog2 = __ilog2((unsigned int)newrows);
  52. debug("rows workaround - ilog2 %d, %d\n", inewrowslog2,
  53. (int)newrows);
  54. if (inewrowslog2 == -1) {
  55. printf("SDRAM workaround failed, newrows %d\n", (int)newrows);
  56. return rows;
  57. }
  58. return inewrowslog2;
  59. }
  60. /* SDRAM protection rules vary from 0-19, a total of 20 rules. */
  61. static void sdram_set_rule(struct sdram_prot_rule *prule)
  62. {
  63. uint32_t lo_addr_bits;
  64. uint32_t hi_addr_bits;
  65. int ruleno = prule->rule;
  66. /* Select the rule */
  67. writel(ruleno, &sdr_ctrl->prot_rule_rdwr);
  68. /* Obtain the address bits */
  69. lo_addr_bits = (uint32_t)(((prule->sdram_start) >> 20ULL) & 0xFFF);
  70. hi_addr_bits = (uint32_t)((((prule->sdram_end-1) >> 20ULL)) & 0xFFF);
  71. debug("sdram set rule start %x, %lld\n", lo_addr_bits,
  72. prule->sdram_start);
  73. debug("sdram set rule end %x, %lld\n", hi_addr_bits,
  74. prule->sdram_end);
  75. /* Set rule addresses */
  76. writel(lo_addr_bits | (hi_addr_bits << 12), &sdr_ctrl->prot_rule_addr);
  77. /* Set rule protection ids */
  78. writel(prule->lo_prot_id | (prule->hi_prot_id << 12),
  79. &sdr_ctrl->prot_rule_id);
  80. /* Set the rule data */
  81. writel(prule->security | (prule->valid << 2) |
  82. (prule->portmask << 3) | (prule->result << 13),
  83. &sdr_ctrl->prot_rule_data);
  84. /* write the rule */
  85. writel(ruleno | (1L << 5), &sdr_ctrl->prot_rule_rdwr);
  86. /* Set rule number to 0 by default */
  87. writel(0, &sdr_ctrl->prot_rule_rdwr);
  88. }
  89. static void sdram_get_rule(struct sdram_prot_rule *prule)
  90. {
  91. uint32_t addr;
  92. uint32_t id;
  93. uint32_t data;
  94. int ruleno = prule->rule;
  95. /* Read the rule */
  96. writel(ruleno, &sdr_ctrl->prot_rule_rdwr);
  97. writel(ruleno | (1L << 6), &sdr_ctrl->prot_rule_rdwr);
  98. /* Get the addresses */
  99. addr = readl(&sdr_ctrl->prot_rule_addr);
  100. prule->sdram_start = (addr & 0xFFF) << 20;
  101. prule->sdram_end = ((addr >> 12) & 0xFFF) << 20;
  102. /* Get the configured protection IDs */
  103. id = readl(&sdr_ctrl->prot_rule_id);
  104. prule->lo_prot_id = id & 0xFFF;
  105. prule->hi_prot_id = (id >> 12) & 0xFFF;
  106. /* Get protection data */
  107. data = readl(&sdr_ctrl->prot_rule_data);
  108. prule->security = data & 0x3;
  109. prule->valid = (data >> 2) & 0x1;
  110. prule->portmask = (data >> 3) & 0x3FF;
  111. prule->result = (data >> 13) & 0x1;
  112. }
  113. static void sdram_set_protection_config(uint64_t sdram_start, uint64_t sdram_end)
  114. {
  115. struct sdram_prot_rule rule;
  116. int rules;
  117. /* Start with accepting all SDRAM transaction */
  118. writel(0x0, &sdr_ctrl->protport_default);
  119. /* Clear all protection rules for warm boot case */
  120. memset(&rule, 0, sizeof(struct sdram_prot_rule));
  121. for (rules = 0; rules < 20; rules++) {
  122. rule.rule = rules;
  123. sdram_set_rule(&rule);
  124. }
  125. /* new rule: accept SDRAM */
  126. rule.sdram_start = sdram_start;
  127. rule.sdram_end = sdram_end;
  128. rule.lo_prot_id = 0x0;
  129. rule.hi_prot_id = 0xFFF;
  130. rule.portmask = 0x3FF;
  131. rule.security = 0x3;
  132. rule.result = 0;
  133. rule.valid = 1;
  134. rule.rule = 0;
  135. /* set new rule */
  136. sdram_set_rule(&rule);
  137. /* default rule: reject everything */
  138. writel(0x3ff, &sdr_ctrl->protport_default);
  139. }
  140. static void sdram_dump_protection_config(void)
  141. {
  142. struct sdram_prot_rule rule;
  143. int rules;
  144. debug("SDRAM Prot rule, default %x\n",
  145. readl(&sdr_ctrl->protport_default));
  146. for (rules = 0; rules < 20; rules++) {
  147. sdram_get_rule(&rule);
  148. debug("Rule %d, rules ...\n", rules);
  149. debug(" sdram start %llx\n", rule.sdram_start);
  150. debug(" sdram end %llx\n", rule.sdram_end);
  151. debug(" low prot id %d, hi prot id %d\n",
  152. rule.lo_prot_id,
  153. rule.hi_prot_id);
  154. debug(" portmask %x\n", rule.portmask);
  155. debug(" security %d\n", rule.security);
  156. debug(" result %d\n", rule.result);
  157. debug(" valid %d\n", rule.valid);
  158. }
  159. }
  160. /* Function to write to register and verify the write */
  161. static unsigned sdram_write_verify(unsigned int *addr, unsigned reg_value)
  162. {
  163. #ifndef SDRAM_MMR_SKIP_VERIFY
  164. unsigned reg_value1;
  165. #endif
  166. debug(" Write - Address ");
  167. debug("0x%08x Data 0x%08x\n", (u32)addr, reg_value);
  168. /* Write to register */
  169. writel(reg_value, addr);
  170. #ifndef SDRAM_MMR_SKIP_VERIFY
  171. debug(" Read and verify...");
  172. /* Read back the wrote value */
  173. reg_value1 = readl(addr);
  174. /* Indicate failure if value not matched */
  175. if (reg_value1 != reg_value) {
  176. debug("FAIL - Address 0x%08x Expected 0x%08x Data 0x%08x\n",
  177. (u32)addr, reg_value, reg_value1);
  178. return 1;
  179. }
  180. debug("correct!\n");
  181. #endif /* SDRAM_MMR_SKIP_VERIFY */
  182. return 0;
  183. }
  184. static void set_sdr_ctrlcfg(void)
  185. {
  186. int addrorder;
  187. debug("\nConfiguring CTRLCFG\n");
  188. clrsetbits_le32(&sdr_ctrl->ctrl_cfg, SDR_CTRLGRP_CTRLCFG_MEMTYPE_MASK,
  189. CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMTYPE <<
  190. SDR_CTRLGRP_CTRLCFG_MEMTYPE_LSB);
  191. clrsetbits_le32(&sdr_ctrl->ctrl_cfg, SDR_CTRLGRP_CTRLCFG_MEMBL_MASK,
  192. CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMBL <<
  193. SDR_CTRLGRP_CTRLCFG_MEMBL_LSB);
  194. /* SDRAM Failure When Accessing Non-Existent Memory
  195. * Set the addrorder field of the SDRAM control register
  196. * based on the CSBITs setting.
  197. */
  198. switch (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS) {
  199. case 1:
  200. addrorder = 0; /* chip, row, bank, column */
  201. if (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ADDRORDER != 0)
  202. debug("INFO: Changing address order to 0 (chip, row, \
  203. bank, column)\n");
  204. break;
  205. case 2:
  206. addrorder = 2; /* row, chip, bank, column */
  207. if (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ADDRORDER != 2)
  208. debug("INFO: Changing address order to 2 (row, chip, \
  209. bank, column)\n");
  210. break;
  211. default:
  212. addrorder = CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ADDRORDER;
  213. break;
  214. }
  215. clrsetbits_le32(&sdr_ctrl->ctrl_cfg, SDR_CTRLGRP_CTRLCFG_ADDRORDER_MASK,
  216. addrorder << SDR_CTRLGRP_CTRLCFG_ADDRORDER_LSB);
  217. clrsetbits_le32(&sdr_ctrl->ctrl_cfg, SDR_CTRLGRP_CTRLCFG_ECCEN_MASK,
  218. CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCEN <<
  219. SDR_CTRLGRP_CTRLCFG_ECCEN_LSB);
  220. clrsetbits_le32(&sdr_ctrl->ctrl_cfg, SDR_CTRLGRP_CTRLCFG_ECCCORREN_MASK,
  221. CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCCORREN <<
  222. SDR_CTRLGRP_CTRLCFG_ECCCORREN_LSB);
  223. clrsetbits_le32(&sdr_ctrl->ctrl_cfg, SDR_CTRLGRP_CTRLCFG_REORDEREN_MASK,
  224. CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_REORDEREN <<
  225. SDR_CTRLGRP_CTRLCFG_REORDEREN_LSB);
  226. clrsetbits_le32(&sdr_ctrl->ctrl_cfg, SDR_CTRLGRP_CTRLCFG_STARVELIMIT_MASK,
  227. CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_STARVELIMIT <<
  228. SDR_CTRLGRP_CTRLCFG_STARVELIMIT_LSB);
  229. clrsetbits_le32(&sdr_ctrl->ctrl_cfg, SDR_CTRLGRP_CTRLCFG_DQSTRKEN_MASK,
  230. CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_DQSTRKEN <<
  231. SDR_CTRLGRP_CTRLCFG_DQSTRKEN_LSB);
  232. clrsetbits_le32(&sdr_ctrl->ctrl_cfg, SDR_CTRLGRP_CTRLCFG_NODMPINS_MASK,
  233. CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_NODMPINS <<
  234. SDR_CTRLGRP_CTRLCFG_NODMPINS_LSB);
  235. }
  236. static void set_sdr_dram_timing1(void)
  237. {
  238. debug("Configuring DRAMTIMING1\n");
  239. clrsetbits_le32(&sdr_ctrl->dram_timing1, SDR_CTRLGRP_DRAMTIMING1_TCWL_MASK,
  240. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCWL <<
  241. SDR_CTRLGRP_DRAMTIMING1_TCWL_LSB);
  242. clrsetbits_le32(&sdr_ctrl->dram_timing1, SDR_CTRLGRP_DRAMTIMING1_TAL_MASK,
  243. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_AL <<
  244. SDR_CTRLGRP_DRAMTIMING1_TAL_LSB);
  245. clrsetbits_le32(&sdr_ctrl->dram_timing1, SDR_CTRLGRP_DRAMTIMING1_TCL_MASK,
  246. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCL <<
  247. SDR_CTRLGRP_DRAMTIMING1_TCL_LSB);
  248. clrsetbits_le32(&sdr_ctrl->dram_timing1, SDR_CTRLGRP_DRAMTIMING1_TRRD_MASK,
  249. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRRD <<
  250. SDR_CTRLGRP_DRAMTIMING1_TRRD_LSB);
  251. clrsetbits_le32(&sdr_ctrl->dram_timing1, SDR_CTRLGRP_DRAMTIMING1_TFAW_MASK,
  252. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TFAW <<
  253. SDR_CTRLGRP_DRAMTIMING1_TFAW_LSB);
  254. clrsetbits_le32(&sdr_ctrl->dram_timing1, SDR_CTRLGRP_DRAMTIMING1_TRFC_MASK,
  255. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRFC <<
  256. SDR_CTRLGRP_DRAMTIMING1_TRFC_LSB);
  257. }
  258. static void set_sdr_dram_timing2(void)
  259. {
  260. debug("Configuring DRAMTIMING2\n");
  261. clrsetbits_le32(&sdr_ctrl->dram_timing2, SDR_CTRLGRP_DRAMTIMING2_TREFI_MASK,
  262. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TREFI <<
  263. SDR_CTRLGRP_DRAMTIMING2_TREFI_LSB);
  264. clrsetbits_le32(&sdr_ctrl->dram_timing2, SDR_CTRLGRP_DRAMTIMING2_TRCD_MASK,
  265. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRCD <<
  266. SDR_CTRLGRP_DRAMTIMING2_TRCD_LSB);
  267. clrsetbits_le32(&sdr_ctrl->dram_timing2, SDR_CTRLGRP_DRAMTIMING2_TRP_MASK,
  268. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRP <<
  269. SDR_CTRLGRP_DRAMTIMING2_TRP_LSB);
  270. clrsetbits_le32(&sdr_ctrl->dram_timing2, SDR_CTRLGRP_DRAMTIMING2_TWR_MASK,
  271. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWR <<
  272. SDR_CTRLGRP_DRAMTIMING2_TWR_LSB);
  273. clrsetbits_le32(&sdr_ctrl->dram_timing2, SDR_CTRLGRP_DRAMTIMING2_TWTR_MASK,
  274. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWTR <<
  275. SDR_CTRLGRP_DRAMTIMING2_TWTR_LSB);
  276. }
  277. static void set_sdr_dram_timing3(void)
  278. {
  279. debug("Configuring DRAMTIMING3\n");
  280. clrsetbits_le32(&sdr_ctrl->dram_timing3, SDR_CTRLGRP_DRAMTIMING3_TRTP_MASK,
  281. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRTP <<
  282. SDR_CTRLGRP_DRAMTIMING3_TRTP_LSB);
  283. clrsetbits_le32(&sdr_ctrl->dram_timing3, SDR_CTRLGRP_DRAMTIMING3_TRAS_MASK,
  284. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRAS <<
  285. SDR_CTRLGRP_DRAMTIMING3_TRAS_LSB);
  286. clrsetbits_le32(&sdr_ctrl->dram_timing3, SDR_CTRLGRP_DRAMTIMING3_TRC_MASK,
  287. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRC <<
  288. SDR_CTRLGRP_DRAMTIMING3_TRC_LSB);
  289. clrsetbits_le32(&sdr_ctrl->dram_timing3, SDR_CTRLGRP_DRAMTIMING3_TMRD_MASK,
  290. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TMRD <<
  291. SDR_CTRLGRP_DRAMTIMING3_TMRD_LSB);
  292. clrsetbits_le32(&sdr_ctrl->dram_timing3, SDR_CTRLGRP_DRAMTIMING3_TCCD_MASK,
  293. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TCCD <<
  294. SDR_CTRLGRP_DRAMTIMING3_TCCD_LSB);
  295. }
  296. static void set_sdr_dram_timing4(void)
  297. {
  298. debug("Configuring DRAMTIMING4\n");
  299. clrsetbits_le32(&sdr_ctrl->dram_timing4,
  300. SDR_CTRLGRP_DRAMTIMING4_SELFRFSHEXIT_MASK,
  301. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_SELFRFSHEXIT <<
  302. SDR_CTRLGRP_DRAMTIMING4_SELFRFSHEXIT_LSB);
  303. clrsetbits_le32(&sdr_ctrl->dram_timing4,
  304. SDR_CTRLGRP_DRAMTIMING4_PWRDOWNEXIT_MASK,
  305. CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_PWRDOWNEXIT <<
  306. SDR_CTRLGRP_DRAMTIMING4_PWRDOWNEXIT_LSB);
  307. }
  308. static void set_sdr_dram_lowpwr_timing(void)
  309. {
  310. debug("Configuring LOWPWRTIMING\n");
  311. clrsetbits_le32(&sdr_ctrl->lowpwr_timing,
  312. SDR_CTRLGRP_LOWPWRTIMING_AUTOPDCYCLES_MASK,
  313. CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_AUTOPDCYCLES <<
  314. SDR_CTRLGRP_LOWPWRTIMING_AUTOPDCYCLES_LSB);
  315. clrsetbits_le32(&sdr_ctrl->lowpwr_timing,
  316. SDR_CTRLGRP_LOWPWRTIMING_CLKDISABLECYCLES_MASK,
  317. CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_CLKDISABLECYCLES <<
  318. SDR_CTRLGRP_LOWPWRTIMING_CLKDISABLECYCLES_LSB);
  319. }
  320. static void set_sdr_addr_rw(void)
  321. {
  322. int cs = CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS;
  323. int width = 8;
  324. int rows = CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS;
  325. int banks = CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_BANKBITS;
  326. int cols = CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_COLBITS;
  327. unsigned long long workaround_memsize = MEMSIZE_4G;
  328. debug("Configuring DRAMADDRW\n");
  329. clrsetbits_le32(&sdr_ctrl->dram_addrw, SDR_CTRLGRP_DRAMADDRW_COLBITS_MASK,
  330. CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_COLBITS <<
  331. SDR_CTRLGRP_DRAMADDRW_COLBITS_LSB);
  332. /*
  333. * SDRAM Failure When Accessing Non-Existent Memory
  334. * Update Preloader to artificially increase the number of rows so
  335. * that the memory thinks it has 4GB of RAM.
  336. */
  337. rows = compute_errata_rows(workaround_memsize, cs, width, rows, banks,
  338. cols);
  339. clrsetbits_le32(&sdr_ctrl->dram_addrw, SDR_CTRLGRP_DRAMADDRW_ROWBITS_MASK,
  340. rows << SDR_CTRLGRP_DRAMADDRW_ROWBITS_LSB);
  341. clrsetbits_le32(&sdr_ctrl->dram_addrw, SDR_CTRLGRP_DRAMADDRW_BANKBITS_MASK,
  342. CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_BANKBITS <<
  343. SDR_CTRLGRP_DRAMADDRW_BANKBITS_LSB);
  344. /* SDRAM Failure When Accessing Non-Existent Memory
  345. * Set SDR_CTRLGRP_DRAMADDRW_CSBITS_LSB to
  346. * log2(number of chip select bits). Since there's only
  347. * 1 or 2 chip selects, log2(1) => 0, and log2(2) => 1,
  348. * which is the same as "chip selects" - 1.
  349. */
  350. clrsetbits_le32(&sdr_ctrl->dram_addrw, SDR_CTRLGRP_DRAMADDRW_CSBITS_MASK,
  351. (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS - 1) <<
  352. SDR_CTRLGRP_DRAMADDRW_CSBITS_LSB);
  353. }
  354. static void set_sdr_static_cfg(void)
  355. {
  356. debug("Configuring STATICCFG\n");
  357. clrsetbits_le32(&sdr_ctrl->static_cfg, SDR_CTRLGRP_STATICCFG_MEMBL_MASK,
  358. CONFIG_HPS_SDR_CTRLCFG_STATICCFG_MEMBL <<
  359. SDR_CTRLGRP_STATICCFG_MEMBL_LSB);
  360. clrsetbits_le32(&sdr_ctrl->static_cfg,
  361. SDR_CTRLGRP_STATICCFG_USEECCASDATA_MASK,
  362. CONFIG_HPS_SDR_CTRLCFG_STATICCFG_USEECCASDATA <<
  363. SDR_CTRLGRP_STATICCFG_USEECCASDATA_LSB);
  364. }
  365. static void set_sdr_fifo_cfg(void)
  366. {
  367. debug("Configuring FIFOCFG\n");
  368. clrsetbits_le32(&sdr_ctrl->fifo_cfg, SDR_CTRLGRP_FIFOCFG_SYNCMODE_MASK,
  369. CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_SYNCMODE <<
  370. SDR_CTRLGRP_FIFOCFG_SYNCMODE_LSB);
  371. clrsetbits_le32(&sdr_ctrl->fifo_cfg, SDR_CTRLGRP_FIFOCFG_INCSYNC_MASK,
  372. CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_INCSYNC <<
  373. SDR_CTRLGRP_FIFOCFG_INCSYNC_LSB);
  374. }
  375. static void set_sdr_mp_weight(void)
  376. {
  377. debug("Configuring MPWEIGHT_MPWEIGHT_0\n");
  378. clrsetbits_le32(&sdr_ctrl->mp_weight0,
  379. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_0_STATICWEIGHT_31_0_MASK,
  380. CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_0_STATICWEIGHT_31_0 <<
  381. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_0_STATICWEIGHT_31_0_LSB);
  382. clrsetbits_le32(&sdr_ctrl->mp_weight1,
  383. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_STATICWEIGHT_49_32_MASK,
  384. CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_STATICWEIGHT_49_32 <<
  385. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_STATICWEIGHT_49_32_LSB);
  386. clrsetbits_le32(&sdr_ctrl->mp_weight1,
  387. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_SUMOFWEIGHTS_13_0_MASK,
  388. CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_SUMOFWEIGHT_13_0 <<
  389. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_SUMOFWEIGHTS_13_0_LSB);
  390. clrsetbits_le32(&sdr_ctrl->mp_weight2,
  391. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_2_SUMOFWEIGHTS_45_14_MASK,
  392. CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_2_SUMOFWEIGHT_45_14 <<
  393. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_2_SUMOFWEIGHTS_45_14_LSB);
  394. clrsetbits_le32(&sdr_ctrl->mp_weight3,
  395. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_3_SUMOFWEIGHTS_63_46_MASK,
  396. CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_3_SUMOFWEIGHT_63_46 <<
  397. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_3_SUMOFWEIGHTS_63_46_LSB);
  398. }
  399. static void set_sdr_mp_pacing(void)
  400. {
  401. debug("Configuring MPPACING_MPPACING_0\n");
  402. clrsetbits_le32(&sdr_ctrl->mp_pacing0,
  403. SDR_CTRLGRP_MPPACING_MPPACING_0_THRESHOLD1_31_0_MASK,
  404. CONFIG_HPS_SDR_CTRLCFG_MPPACING_0_THRESHOLD1_31_0 <<
  405. SDR_CTRLGRP_MPPACING_MPPACING_0_THRESHOLD1_31_0_LSB);
  406. clrsetbits_le32(&sdr_ctrl->mp_pacing1,
  407. SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD1_59_32_MASK,
  408. CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD1_59_32 <<
  409. SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD1_59_32_LSB);
  410. clrsetbits_le32(&sdr_ctrl->mp_pacing1,
  411. SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD2_3_0_MASK,
  412. CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD2_3_0 <<
  413. SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD2_3_0_LSB);
  414. clrsetbits_le32(&sdr_ctrl->mp_pacing2,
  415. SDR_CTRLGRP_MPPACING_MPPACING_2_THRESHOLD2_35_4_MASK,
  416. CONFIG_HPS_SDR_CTRLCFG_MPPACING_2_THRESHOLD2_35_4 <<
  417. SDR_CTRLGRP_MPPACING_MPPACING_2_THRESHOLD2_35_4_LSB);
  418. clrsetbits_le32(&sdr_ctrl->mp_pacing3,
  419. SDR_CTRLGRP_MPPACING_MPPACING_3_THRESHOLD2_59_36_MASK,
  420. CONFIG_HPS_SDR_CTRLCFG_MPPACING_3_THRESHOLD2_59_36 <<
  421. SDR_CTRLGRP_MPPACING_MPPACING_3_THRESHOLD2_59_36_LSB);
  422. }
  423. static void set_sdr_mp_threshold(void)
  424. {
  425. debug("Configuring MPTHRESHOLDRST_MPTHRESHOLDRST_0\n");
  426. clrsetbits_le32(&sdr_ctrl->mp_threshold0,
  427. SDR_CTRLGRP_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0_MASK,
  428. CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0 <<
  429. SDR_CTRLGRP_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0_LSB);
  430. clrsetbits_le32(&sdr_ctrl->mp_threshold1,
  431. SDR_CTRLGRP_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32_MASK,
  432. SDR_CTRLGRP_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32_MASK <<
  433. SDR_CTRLGRP_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32_LSB);
  434. clrsetbits_le32(&sdr_ctrl->mp_threshold2,
  435. SDR_CTRLGRP_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64_MASK,
  436. CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64 <<
  437. SDR_CTRLGRP_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64_LSB);
  438. }
  439. /* Function to initialize SDRAM MMR */
  440. unsigned sdram_mmr_init_full(unsigned int sdr_phy_reg)
  441. {
  442. unsigned long reg_value;
  443. unsigned long status = 0;
  444. #if defined(CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS) && \
  445. defined(CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS) && \
  446. defined(CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_BANKBITS) && \
  447. defined(CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_COLBITS) && \
  448. defined(CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS)
  449. writel(CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS,
  450. &sysmgr_regs->iswgrp_handoff[4]);
  451. #endif
  452. set_sdr_ctrlcfg();
  453. set_sdr_dram_timing1();
  454. set_sdr_dram_timing2();
  455. set_sdr_dram_timing3();
  456. set_sdr_dram_timing4();
  457. set_sdr_dram_lowpwr_timing();
  458. set_sdr_addr_rw();
  459. debug("Configuring DRAMIFWIDTH\n");
  460. clrsetbits_le32(&sdr_ctrl->dram_if_width,
  461. SDR_CTRLGRP_DRAMIFWIDTH_IFWIDTH_MASK,
  462. CONFIG_HPS_SDR_CTRLCFG_DRAMIFWIDTH_IFWIDTH <<
  463. SDR_CTRLGRP_DRAMIFWIDTH_IFWIDTH_LSB);
  464. debug("Configuring DRAMDEVWIDTH\n");
  465. clrsetbits_le32(&sdr_ctrl->dram_dev_width,
  466. SDR_CTRLGRP_DRAMDEVWIDTH_DEVWIDTH_MASK,
  467. CONFIG_HPS_SDR_CTRLCFG_DRAMDEVWIDTH_DEVWIDTH <<
  468. SDR_CTRLGRP_DRAMDEVWIDTH_DEVWIDTH_LSB);
  469. debug("Configuring LOWPWREQ\n");
  470. clrsetbits_le32(&sdr_ctrl->lowpwr_eq,
  471. SDR_CTRLGRP_LOWPWREQ_SELFRFSHMASK_MASK,
  472. CONFIG_HPS_SDR_CTRLCFG_LOWPWREQ_SELFRFSHMASK <<
  473. SDR_CTRLGRP_LOWPWREQ_SELFRFSHMASK_LSB);
  474. debug("Configuring DRAMINTR\n");
  475. clrsetbits_le32(&sdr_ctrl->dram_intr, SDR_CTRLGRP_DRAMINTR_INTREN_MASK,
  476. CONFIG_HPS_SDR_CTRLCFG_DRAMINTR_INTREN <<
  477. SDR_CTRLGRP_DRAMINTR_INTREN_LSB);
  478. set_sdr_static_cfg();
  479. debug("Configuring CTRLWIDTH\n");
  480. clrsetbits_le32(&sdr_ctrl->ctrl_width,
  481. SDR_CTRLGRP_CTRLWIDTH_CTRLWIDTH_MASK,
  482. CONFIG_HPS_SDR_CTRLCFG_CTRLWIDTH_CTRLWIDTH <<
  483. SDR_CTRLGRP_CTRLWIDTH_CTRLWIDTH_LSB);
  484. debug("Configuring PORTCFG\n");
  485. clrsetbits_le32(&sdr_ctrl->port_cfg, SDR_CTRLGRP_PORTCFG_AUTOPCHEN_MASK,
  486. CONFIG_HPS_SDR_CTRLCFG_PORTCFG_AUTOPCHEN <<
  487. SDR_CTRLGRP_PORTCFG_AUTOPCHEN_LSB);
  488. set_sdr_fifo_cfg();
  489. debug("Configuring MPPRIORITY\n");
  490. clrsetbits_le32(&sdr_ctrl->mp_priority,
  491. SDR_CTRLGRP_MPPRIORITY_USERPRIORITY_MASK,
  492. CONFIG_HPS_SDR_CTRLCFG_MPPRIORITY_USERPRIORITY <<
  493. SDR_CTRLGRP_MPPRIORITY_USERPRIORITY_LSB);
  494. set_sdr_mp_weight();
  495. set_sdr_mp_pacing();
  496. set_sdr_mp_threshold();
  497. debug("Configuring PHYCTRL_PHYCTRL_0\n");
  498. setbits_le32(&sdr_ctrl->phy_ctrl0,
  499. CONFIG_HPS_SDR_CTRLCFG_PHYCTRL_PHYCTRL_0);
  500. debug("Configuring CPORTWIDTH\n");
  501. clrsetbits_le32(&sdr_ctrl->cport_width,
  502. SDR_CTRLGRP_CPORTWIDTH_CMDPORTWIDTH_MASK,
  503. CONFIG_HPS_SDR_CTRLCFG_CPORTWIDTH_CPORTWIDTH <<
  504. SDR_CTRLGRP_CPORTWIDTH_CMDPORTWIDTH_LSB);
  505. debug(" Write - Address ");
  506. debug("0x%08x Data 0x%08x\n",
  507. (unsigned)(&sdr_ctrl->cport_width),
  508. (unsigned)reg_value);
  509. reg_value = readl(&sdr_ctrl->cport_width);
  510. debug(" Read value without verify 0x%08x\n", (unsigned)reg_value);
  511. debug("Configuring CPORTWMAP\n");
  512. clrsetbits_le32(&sdr_ctrl->cport_wmap,
  513. SDR_CTRLGRP_CPORTWMAP_CPORTWFIFOMAP_MASK,
  514. CONFIG_HPS_SDR_CTRLCFG_CPORTWMAP_CPORTWMAP <<
  515. SDR_CTRLGRP_CPORTWMAP_CPORTWFIFOMAP_LSB);
  516. debug(" Write - Address ");
  517. debug("0x%08x Data 0x%08x\n",
  518. (unsigned)(&sdr_ctrl->cport_wmap),
  519. (unsigned)reg_value);
  520. reg_value = readl(&sdr_ctrl->cport_wmap);
  521. debug(" Read value without verify 0x%08x\n", (unsigned)reg_value);
  522. debug("Configuring CPORTRMAP\n");
  523. clrsetbits_le32(&sdr_ctrl->cport_rmap,
  524. SDR_CTRLGRP_CPORTRMAP_CPORTRFIFOMAP_MASK,
  525. CONFIG_HPS_SDR_CTRLCFG_CPORTRMAP_CPORTRMAP <<
  526. SDR_CTRLGRP_CPORTRMAP_CPORTRFIFOMAP_LSB);
  527. debug(" Write - Address ");
  528. debug("0x%08x Data 0x%08x\n",
  529. (unsigned)(&sdr_ctrl->cport_rmap),
  530. (unsigned)reg_value);
  531. reg_value = readl(&sdr_ctrl->cport_rmap);
  532. debug(" Read value without verify 0x%08x\n", (unsigned)reg_value);
  533. debug("Configuring RFIFOCMAP\n");
  534. clrsetbits_le32(&sdr_ctrl->rfifo_cmap,
  535. SDR_CTRLGRP_RFIFOCMAP_RFIFOCPORTMAP_MASK,
  536. CONFIG_HPS_SDR_CTRLCFG_RFIFOCMAP_RFIFOCMAP <<
  537. SDR_CTRLGRP_RFIFOCMAP_RFIFOCPORTMAP_LSB);
  538. debug(" Write - Address ");
  539. debug("0x%08x Data 0x%08x\n",
  540. (unsigned)(&sdr_ctrl->rfifo_cmap),
  541. (unsigned)reg_value);
  542. reg_value = readl(&sdr_ctrl->rfifo_cmap);
  543. debug(" Read value without verify 0x%08x\n", (unsigned)reg_value);
  544. debug("Configuring WFIFOCMAP\n");
  545. reg_value = readl(&sdr_ctrl->wfifo_cmap);
  546. clrsetbits_le32(&sdr_ctrl->wfifo_cmap,
  547. SDR_CTRLGRP_WFIFOCMAP_WFIFOCPORTMAP_MASK,
  548. CONFIG_HPS_SDR_CTRLCFG_WFIFOCMAP_WFIFOCMAP <<
  549. SDR_CTRLGRP_WFIFOCMAP_WFIFOCPORTMAP_LSB);
  550. debug(" Write - Address ");
  551. debug("0x%08x Data 0x%08x\n",
  552. (unsigned)(&sdr_ctrl->wfifo_cmap),
  553. (unsigned)reg_value);
  554. reg_value = readl(&sdr_ctrl->wfifo_cmap);
  555. debug(" Read value without verify 0x%08x\n", (unsigned)reg_value);
  556. debug("Configuring CPORTRDWR\n");
  557. clrsetbits_le32(&sdr_ctrl->cport_rdwr,
  558. SDR_CTRLGRP_CPORTRDWR_CPORTRDWR_MASK,
  559. CONFIG_HPS_SDR_CTRLCFG_CPORTRDWR_CPORTRDWR <<
  560. SDR_CTRLGRP_CPORTRDWR_CPORTRDWR_LSB);
  561. debug(" Write - Address ");
  562. debug("0x%08x Data 0x%08x\n",
  563. (unsigned)(&sdr_ctrl->cport_rdwr),
  564. (unsigned)reg_value);
  565. reg_value = readl(&sdr_ctrl->cport_rdwr);
  566. debug(" Read value without verify 0x%08x\n", (unsigned)reg_value);
  567. debug("Configuring DRAMODT\n");
  568. clrsetbits_le32(&sdr_ctrl->dram_odt,
  569. SDR_CTRLGRP_DRAMODT_READ_MASK,
  570. CONFIG_HPS_SDR_CTRLCFG_DRAMODT_READ <<
  571. SDR_CTRLGRP_DRAMODT_READ_LSB);
  572. clrsetbits_le32(&sdr_ctrl->dram_odt,
  573. SDR_CTRLGRP_DRAMODT_WRITE_MASK,
  574. CONFIG_HPS_SDR_CTRLCFG_DRAMODT_WRITE <<
  575. SDR_CTRLGRP_DRAMODT_WRITE_LSB);
  576. /* saving this value to SYSMGR.ISWGRP.HANDOFF.FPGA2SDR */
  577. writel(CONFIG_HPS_SDR_CTRLCFG_FPGAPORTRST,
  578. &sysmgr_regs->iswgrp_handoff[3]);
  579. /* only enable if the FPGA is programmed */
  580. if (fpgamgr_test_fpga_ready()) {
  581. if (sdram_write_verify(&sdr_ctrl->fpgaport_rst,
  582. CONFIG_HPS_SDR_CTRLCFG_FPGAPORTRST) == 1) {
  583. status = 1;
  584. return 1;
  585. }
  586. }
  587. /* Restore the SDR PHY Register if valid */
  588. if (sdr_phy_reg != 0xffffffff)
  589. writel(sdr_phy_reg, &sdr_ctrl->phy_ctrl0);
  590. /***** Final step - apply configuration changes *****/
  591. debug("Configuring STATICCFG_\n");
  592. clrsetbits_le32(&sdr_ctrl->static_cfg, SDR_CTRLGRP_STATICCFG_APPLYCFG_MASK,
  593. 1 << SDR_CTRLGRP_STATICCFG_APPLYCFG_LSB);
  594. debug(" Write - Address ");
  595. debug("0x%08x Data 0x%08x\n",
  596. (unsigned)(&sdr_ctrl->static_cfg),
  597. (unsigned)reg_value);
  598. reg_value = readl(&sdr_ctrl->static_cfg);
  599. debug(" Read value without verify 0x%08x\n", (unsigned)reg_value);
  600. sdram_set_protection_config(0, sdram_calculate_size());
  601. sdram_dump_protection_config();
  602. return status;
  603. }
  604. /*
  605. * To calculate SDRAM device size based on SDRAM controller parameters.
  606. * Size is specified in bytes.
  607. *
  608. * NOTE:
  609. * This function is compiled and linked into the preloader and
  610. * Uboot (there may be others). So if this function changes, the Preloader
  611. * and UBoot must be updated simultaneously.
  612. */
  613. unsigned long sdram_calculate_size(void)
  614. {
  615. unsigned long temp;
  616. unsigned long row, bank, col, cs, width;
  617. temp = readl(&sdr_ctrl->dram_addrw);
  618. col = (temp & SDR_CTRLGRP_DRAMADDRW_COLBITS_MASK) >>
  619. SDR_CTRLGRP_DRAMADDRW_COLBITS_LSB;
  620. /* SDRAM Failure When Accessing Non-Existent Memory
  621. * Use ROWBITS from Quartus/QSys to calculate SDRAM size
  622. * since the FB specifies we modify ROWBITs to work around SDRAM
  623. * controller issue.
  624. *
  625. * If the stored handoff value for rows is 0, it probably means
  626. * the preloader is older than UBoot. Use the
  627. * #define from the SOCEDS Tools per Crucible review
  628. * uboot-socfpga-204. Note that this is not a supported
  629. * configuration and is not tested. The customer
  630. * should be using preloader and uboot built from the
  631. * same tag.
  632. */
  633. row = readl(&sysmgr_regs->iswgrp_handoff[4]);
  634. if (row == 0)
  635. row = CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS;
  636. /* If the stored handoff value for rows is greater than
  637. * the field width in the sdr.dramaddrw register then
  638. * something is very wrong. Revert to using the the #define
  639. * value handed off by the SOCEDS tool chain instead of
  640. * using a broken value.
  641. */
  642. if (row > 31)
  643. row = CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS;
  644. bank = (temp & SDR_CTRLGRP_DRAMADDRW_BANKBITS_MASK) >>
  645. SDR_CTRLGRP_DRAMADDRW_BANKBITS_LSB;
  646. /* SDRAM Failure When Accessing Non-Existent Memory
  647. * Use CSBITs from Quartus/QSys to calculate SDRAM size
  648. * since the FB specifies we modify CSBITs to work around SDRAM
  649. * controller issue.
  650. */
  651. cs = (temp & SDR_CTRLGRP_DRAMADDRW_CSBITS_MASK) >>
  652. SDR_CTRLGRP_DRAMADDRW_CSBITS_LSB;
  653. cs += 1;
  654. cs = CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS;
  655. width = readl(&sdr_ctrl->dram_if_width);
  656. /* ECC would not be calculated as its not addressible */
  657. if (width == SDRAM_WIDTH_32BIT_WITH_ECC)
  658. width = 32;
  659. if (width == SDRAM_WIDTH_16BIT_WITH_ECC)
  660. width = 16;
  661. /* calculate the SDRAM size base on this info */
  662. temp = 1 << (row + bank + col);
  663. temp = temp * cs * (width / 8);
  664. debug("sdram_calculate_memory returns %ld\n", temp);
  665. return temp;
  666. }