wrap_sdram_config.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. /*
  2. * Copyright (C) 2015 Marek Vasut <marex@denx.de>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <errno.h>
  8. #include <asm/arch/sdram.h>
  9. /* QTS output file. */
  10. #include "qts/sdram_config.h"
  11. #include "qts/sequencer_auto_ac_init.h"
  12. #include "qts/sequencer_auto_inst_init.h"
  13. #include "qts/sequencer_auto.h"
  14. #include "qts/sequencer_defines.h"
  15. static const struct socfpga_sdram_config sdram_config = {
  16. .ctrl_cfg =
  17. (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMTYPE <<
  18. SDR_CTRLGRP_CTRLCFG_MEMTYPE_LSB) |
  19. (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMBL <<
  20. SDR_CTRLGRP_CTRLCFG_MEMBL_LSB) |
  21. (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ADDRORDER <<
  22. SDR_CTRLGRP_CTRLCFG_ADDRORDER_LSB) |
  23. (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCEN <<
  24. SDR_CTRLGRP_CTRLCFG_ECCEN_LSB) |
  25. (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCCORREN <<
  26. SDR_CTRLGRP_CTRLCFG_ECCCORREN_LSB) |
  27. (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_REORDEREN <<
  28. SDR_CTRLGRP_CTRLCFG_REORDEREN_LSB) |
  29. (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_STARVELIMIT <<
  30. SDR_CTRLGRP_CTRLCFG_STARVELIMIT_LSB) |
  31. (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_DQSTRKEN <<
  32. SDR_CTRLGRP_CTRLCFG_DQSTRKEN_LSB) |
  33. (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_NODMPINS <<
  34. SDR_CTRLGRP_CTRLCFG_NODMPINS_LSB),
  35. .dram_timing1 =
  36. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCWL <<
  37. SDR_CTRLGRP_DRAMTIMING1_TCWL_LSB) |
  38. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_AL <<
  39. SDR_CTRLGRP_DRAMTIMING1_TAL_LSB) |
  40. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCL <<
  41. SDR_CTRLGRP_DRAMTIMING1_TCL_LSB) |
  42. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRRD <<
  43. SDR_CTRLGRP_DRAMTIMING1_TRRD_LSB) |
  44. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TFAW <<
  45. SDR_CTRLGRP_DRAMTIMING1_TFAW_LSB) |
  46. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRFC <<
  47. SDR_CTRLGRP_DRAMTIMING1_TRFC_LSB),
  48. .dram_timing2 =
  49. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TREFI <<
  50. SDR_CTRLGRP_DRAMTIMING2_TREFI_LSB) |
  51. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRCD <<
  52. SDR_CTRLGRP_DRAMTIMING2_TRCD_LSB) |
  53. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRP <<
  54. SDR_CTRLGRP_DRAMTIMING2_TRP_LSB) |
  55. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWR <<
  56. SDR_CTRLGRP_DRAMTIMING2_TWR_LSB) |
  57. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWTR <<
  58. SDR_CTRLGRP_DRAMTIMING2_TWTR_LSB),
  59. .dram_timing3 =
  60. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRTP <<
  61. SDR_CTRLGRP_DRAMTIMING3_TRTP_LSB) |
  62. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRAS <<
  63. SDR_CTRLGRP_DRAMTIMING3_TRAS_LSB) |
  64. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRC <<
  65. SDR_CTRLGRP_DRAMTIMING3_TRC_LSB) |
  66. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TMRD <<
  67. SDR_CTRLGRP_DRAMTIMING3_TMRD_LSB) |
  68. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TCCD <<
  69. SDR_CTRLGRP_DRAMTIMING3_TCCD_LSB),
  70. .dram_timing4 =
  71. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_SELFRFSHEXIT <<
  72. SDR_CTRLGRP_DRAMTIMING4_SELFRFSHEXIT_LSB) |
  73. (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_PWRDOWNEXIT <<
  74. SDR_CTRLGRP_DRAMTIMING4_PWRDOWNEXIT_LSB),
  75. .lowpwr_timing =
  76. (CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_AUTOPDCYCLES <<
  77. SDR_CTRLGRP_LOWPWRTIMING_AUTOPDCYCLES_LSB) |
  78. (CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_CLKDISABLECYCLES <<
  79. SDR_CTRLGRP_LOWPWRTIMING_CLKDISABLECYCLES_LSB),
  80. .dram_odt =
  81. (CONFIG_HPS_SDR_CTRLCFG_DRAMODT_READ <<
  82. SDR_CTRLGRP_DRAMODT_READ_LSB) |
  83. (CONFIG_HPS_SDR_CTRLCFG_DRAMODT_WRITE <<
  84. SDR_CTRLGRP_DRAMODT_WRITE_LSB),
  85. .dram_addrw =
  86. (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_COLBITS <<
  87. SDR_CTRLGRP_DRAMADDRW_COLBITS_LSB) |
  88. (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS <<
  89. SDR_CTRLGRP_DRAMADDRW_ROWBITS_LSB) |
  90. (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_BANKBITS <<
  91. SDR_CTRLGRP_DRAMADDRW_BANKBITS_LSB) |
  92. ((CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS - 1) <<
  93. SDR_CTRLGRP_DRAMADDRW_CSBITS_LSB),
  94. .dram_if_width =
  95. (CONFIG_HPS_SDR_CTRLCFG_DRAMIFWIDTH_IFWIDTH <<
  96. SDR_CTRLGRP_DRAMIFWIDTH_IFWIDTH_LSB),
  97. .dram_dev_width =
  98. (CONFIG_HPS_SDR_CTRLCFG_DRAMDEVWIDTH_DEVWIDTH <<
  99. SDR_CTRLGRP_DRAMDEVWIDTH_DEVWIDTH_LSB),
  100. .dram_intr =
  101. (CONFIG_HPS_SDR_CTRLCFG_DRAMINTR_INTREN <<
  102. SDR_CTRLGRP_DRAMINTR_INTREN_LSB),
  103. .lowpwr_eq =
  104. (CONFIG_HPS_SDR_CTRLCFG_LOWPWREQ_SELFRFSHMASK <<
  105. SDR_CTRLGRP_LOWPWREQ_SELFRFSHMASK_LSB),
  106. .static_cfg =
  107. (CONFIG_HPS_SDR_CTRLCFG_STATICCFG_MEMBL <<
  108. SDR_CTRLGRP_STATICCFG_MEMBL_LSB) |
  109. (CONFIG_HPS_SDR_CTRLCFG_STATICCFG_USEECCASDATA <<
  110. SDR_CTRLGRP_STATICCFG_USEECCASDATA_LSB),
  111. .ctrl_width =
  112. (CONFIG_HPS_SDR_CTRLCFG_CTRLWIDTH_CTRLWIDTH <<
  113. SDR_CTRLGRP_CTRLWIDTH_CTRLWIDTH_LSB),
  114. .cport_width =
  115. (CONFIG_HPS_SDR_CTRLCFG_CPORTWIDTH_CPORTWIDTH <<
  116. SDR_CTRLGRP_CPORTWIDTH_CMDPORTWIDTH_LSB),
  117. .cport_wmap =
  118. (CONFIG_HPS_SDR_CTRLCFG_CPORTWMAP_CPORTWMAP <<
  119. SDR_CTRLGRP_CPORTWMAP_CPORTWFIFOMAP_LSB),
  120. .cport_rmap =
  121. (CONFIG_HPS_SDR_CTRLCFG_CPORTRMAP_CPORTRMAP <<
  122. SDR_CTRLGRP_CPORTRMAP_CPORTRFIFOMAP_LSB),
  123. .rfifo_cmap =
  124. (CONFIG_HPS_SDR_CTRLCFG_RFIFOCMAP_RFIFOCMAP <<
  125. SDR_CTRLGRP_RFIFOCMAP_RFIFOCPORTMAP_LSB),
  126. .wfifo_cmap =
  127. (CONFIG_HPS_SDR_CTRLCFG_WFIFOCMAP_WFIFOCMAP <<
  128. SDR_CTRLGRP_WFIFOCMAP_WFIFOCPORTMAP_LSB),
  129. .cport_rdwr =
  130. (CONFIG_HPS_SDR_CTRLCFG_CPORTRDWR_CPORTRDWR <<
  131. SDR_CTRLGRP_CPORTRDWR_CPORTRDWR_LSB),
  132. .port_cfg =
  133. (CONFIG_HPS_SDR_CTRLCFG_PORTCFG_AUTOPCHEN <<
  134. SDR_CTRLGRP_PORTCFG_AUTOPCHEN_LSB),
  135. .fpgaport_rst = CONFIG_HPS_SDR_CTRLCFG_FPGAPORTRST,
  136. .fifo_cfg =
  137. (CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_SYNCMODE <<
  138. SDR_CTRLGRP_FIFOCFG_SYNCMODE_LSB) |
  139. (CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_INCSYNC <<
  140. SDR_CTRLGRP_FIFOCFG_INCSYNC_LSB),
  141. .mp_priority =
  142. (CONFIG_HPS_SDR_CTRLCFG_MPPRIORITY_USERPRIORITY <<
  143. SDR_CTRLGRP_MPPRIORITY_USERPRIORITY_LSB),
  144. .mp_weight0 =
  145. (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_0_STATICWEIGHT_31_0 <<
  146. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_0_STATICWEIGHT_31_0_LSB),
  147. .mp_weight1 =
  148. (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_STATICWEIGHT_49_32 <<
  149. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_STATICWEIGHT_49_32_LSB) |
  150. (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_SUMOFWEIGHT_13_0 <<
  151. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_SUMOFWEIGHTS_13_0_LSB),
  152. .mp_weight2 =
  153. (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_2_SUMOFWEIGHT_45_14 <<
  154. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_2_SUMOFWEIGHTS_45_14_LSB),
  155. .mp_weight3 =
  156. (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_3_SUMOFWEIGHT_63_46 <<
  157. SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_3_SUMOFWEIGHTS_63_46_LSB),
  158. .mp_pacing0 =
  159. (CONFIG_HPS_SDR_CTRLCFG_MPPACING_0_THRESHOLD1_31_0 <<
  160. SDR_CTRLGRP_MPPACING_MPPACING_0_THRESHOLD1_31_0_LSB),
  161. .mp_pacing1 =
  162. (CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD1_59_32 <<
  163. SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD1_59_32_LSB) |
  164. (CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD2_3_0 <<
  165. SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD2_3_0_LSB),
  166. .mp_pacing2 =
  167. (CONFIG_HPS_SDR_CTRLCFG_MPPACING_2_THRESHOLD2_35_4 <<
  168. SDR_CTRLGRP_MPPACING_MPPACING_2_THRESHOLD2_35_4_LSB),
  169. .mp_pacing3 =
  170. (CONFIG_HPS_SDR_CTRLCFG_MPPACING_3_THRESHOLD2_59_36 <<
  171. SDR_CTRLGRP_MPPACING_MPPACING_3_THRESHOLD2_59_36_LSB),
  172. .mp_threshold0 =
  173. (CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0 <<
  174. SDR_CTRLGRP_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0_LSB),
  175. .mp_threshold1 =
  176. (CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32 <<
  177. SDR_CTRLGRP_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32_LSB),
  178. .mp_threshold2 =
  179. (CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64 <<
  180. SDR_CTRLGRP_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64_LSB),
  181. .phy_ctrl0 = CONFIG_HPS_SDR_CTRLCFG_PHYCTRL_PHYCTRL_0,
  182. };
  183. static const struct socfpga_sdram_rw_mgr_config rw_mgr_config = {
  184. .activate_0_and_1 = RW_MGR_ACTIVATE_0_AND_1,
  185. .activate_0_and_1_wait1 = RW_MGR_ACTIVATE_0_AND_1_WAIT1,
  186. .activate_0_and_1_wait2 = RW_MGR_ACTIVATE_0_AND_1_WAIT2,
  187. .activate_1 = RW_MGR_ACTIVATE_1,
  188. .clear_dqs_enable = RW_MGR_CLEAR_DQS_ENABLE,
  189. .guaranteed_read = RW_MGR_GUARANTEED_READ,
  190. .guaranteed_read_cont = RW_MGR_GUARANTEED_READ_CONT,
  191. .guaranteed_write = RW_MGR_GUARANTEED_WRITE,
  192. .guaranteed_write_wait0 = RW_MGR_GUARANTEED_WRITE_WAIT0,
  193. .guaranteed_write_wait1 = RW_MGR_GUARANTEED_WRITE_WAIT1,
  194. .guaranteed_write_wait2 = RW_MGR_GUARANTEED_WRITE_WAIT2,
  195. .guaranteed_write_wait3 = RW_MGR_GUARANTEED_WRITE_WAIT3,
  196. .idle = RW_MGR_IDLE,
  197. .idle_loop1 = RW_MGR_IDLE_LOOP1,
  198. .idle_loop2 = RW_MGR_IDLE_LOOP2,
  199. .init_reset_0_cke_0 = RW_MGR_INIT_RESET_0_CKE_0,
  200. .init_reset_1_cke_0 = RW_MGR_INIT_RESET_1_CKE_0,
  201. .lfsr_wr_rd_bank_0 = RW_MGR_LFSR_WR_RD_BANK_0,
  202. .lfsr_wr_rd_bank_0_data = RW_MGR_LFSR_WR_RD_BANK_0_DATA,
  203. .lfsr_wr_rd_bank_0_dqs = RW_MGR_LFSR_WR_RD_BANK_0_DQS,
  204. .lfsr_wr_rd_bank_0_nop = RW_MGR_LFSR_WR_RD_BANK_0_NOP,
  205. .lfsr_wr_rd_bank_0_wait = RW_MGR_LFSR_WR_RD_BANK_0_WAIT,
  206. .lfsr_wr_rd_bank_0_wl_1 = RW_MGR_LFSR_WR_RD_BANK_0_WL_1,
  207. .lfsr_wr_rd_dm_bank_0 = RW_MGR_LFSR_WR_RD_DM_BANK_0,
  208. .lfsr_wr_rd_dm_bank_0_data = RW_MGR_LFSR_WR_RD_DM_BANK_0_DATA,
  209. .lfsr_wr_rd_dm_bank_0_dqs = RW_MGR_LFSR_WR_RD_DM_BANK_0_DQS,
  210. .lfsr_wr_rd_dm_bank_0_nop = RW_MGR_LFSR_WR_RD_DM_BANK_0_NOP,
  211. .lfsr_wr_rd_dm_bank_0_wait = RW_MGR_LFSR_WR_RD_DM_BANK_0_WAIT,
  212. .lfsr_wr_rd_dm_bank_0_wl_1 = RW_MGR_LFSR_WR_RD_DM_BANK_0_WL_1,
  213. .mrs0_dll_reset = RW_MGR_MRS0_DLL_RESET,
  214. .mrs0_dll_reset_mirr = RW_MGR_MRS0_DLL_RESET_MIRR,
  215. .mrs0_user = RW_MGR_MRS0_USER,
  216. .mrs0_user_mirr = RW_MGR_MRS0_USER_MIRR,
  217. .mrs1 = RW_MGR_MRS1,
  218. .mrs1_mirr = RW_MGR_MRS1_MIRR,
  219. .mrs2 = RW_MGR_MRS2,
  220. .mrs2_mirr = RW_MGR_MRS2_MIRR,
  221. .mrs3 = RW_MGR_MRS3,
  222. .mrs3_mirr = RW_MGR_MRS3_MIRR,
  223. .precharge_all = RW_MGR_PRECHARGE_ALL,
  224. .read_b2b = RW_MGR_READ_B2B,
  225. .read_b2b_wait1 = RW_MGR_READ_B2B_WAIT1,
  226. .read_b2b_wait2 = RW_MGR_READ_B2B_WAIT2,
  227. .refresh_all = RW_MGR_REFRESH_ALL,
  228. .rreturn = RW_MGR_RETURN,
  229. .sgle_read = RW_MGR_SGLE_READ,
  230. .zqcl = RW_MGR_ZQCL,
  231. .true_mem_data_mask_width = RW_MGR_TRUE_MEM_DATA_MASK_WIDTH,
  232. .mem_address_mirroring = RW_MGR_MEM_ADDRESS_MIRRORING,
  233. .mem_data_mask_width = RW_MGR_MEM_DATA_MASK_WIDTH,
  234. .mem_data_width = RW_MGR_MEM_DATA_WIDTH,
  235. .mem_dq_per_read_dqs = RW_MGR_MEM_DQ_PER_READ_DQS,
  236. .mem_dq_per_write_dqs = RW_MGR_MEM_DQ_PER_WRITE_DQS,
  237. .mem_if_read_dqs_width = RW_MGR_MEM_IF_READ_DQS_WIDTH,
  238. .mem_if_write_dqs_width = RW_MGR_MEM_IF_WRITE_DQS_WIDTH,
  239. .mem_number_of_cs_per_dimm = RW_MGR_MEM_NUMBER_OF_CS_PER_DIMM,
  240. .mem_number_of_ranks = RW_MGR_MEM_NUMBER_OF_RANKS,
  241. .mem_virtual_groups_per_read_dqs =
  242. RW_MGR_MEM_VIRTUAL_GROUPS_PER_READ_DQS,
  243. .mem_virtual_groups_per_write_dqs =
  244. RW_MGR_MEM_VIRTUAL_GROUPS_PER_WRITE_DQS,
  245. };
  246. struct socfpga_sdram_io_config io_config = {
  247. .delay_per_dchain_tap = IO_DELAY_PER_DCHAIN_TAP,
  248. .delay_per_dqs_en_dchain_tap = IO_DELAY_PER_DQS_EN_DCHAIN_TAP,
  249. .delay_per_opa_tap = IO_DELAY_PER_OPA_TAP,
  250. .dll_chain_length = IO_DLL_CHAIN_LENGTH,
  251. .dqdqs_out_phase_max = IO_DQDQS_OUT_PHASE_MAX,
  252. .dqs_en_delay_max = IO_DQS_EN_DELAY_MAX,
  253. .dqs_en_delay_offset = IO_DQS_EN_DELAY_OFFSET,
  254. .dqs_en_phase_max = IO_DQS_EN_PHASE_MAX,
  255. .dqs_in_delay_max = IO_DQS_IN_DELAY_MAX,
  256. .dqs_in_reserve = IO_DQS_IN_RESERVE,
  257. .dqs_out_reserve = IO_DQS_OUT_RESERVE,
  258. .io_in_delay_max = IO_IO_IN_DELAY_MAX,
  259. .io_out1_delay_max = IO_IO_OUT1_DELAY_MAX,
  260. .io_out2_delay_max = IO_IO_OUT2_DELAY_MAX,
  261. .shift_dqs_en_when_shift_dqs = IO_SHIFT_DQS_EN_WHEN_SHIFT_DQS,
  262. };
  263. const struct socfpga_sdram_config *socfpga_get_sdram_config(void)
  264. {
  265. return &sdram_config;
  266. }
  267. void socfpga_get_seq_ac_init(const u32 **init, unsigned int *nelem)
  268. {
  269. *init = ac_rom_init;
  270. *nelem = ARRAY_SIZE(ac_rom_init);
  271. }
  272. void socfpga_get_seq_inst_init(const u32 **init, unsigned int *nelem)
  273. {
  274. *init = inst_rom_init;
  275. *nelem = ARRAY_SIZE(inst_rom_init);
  276. }
  277. const struct socfpga_sdram_rw_mgr_config *socfpga_get_sdram_rwmgr_config(void)
  278. {
  279. return &rw_mgr_config;
  280. }
  281. const struct socfpga_sdram_io_config *socfpga_get_sdram_io_config(void)
  282. {
  283. return &io_config;
  284. }