socfpga_arria10.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2017 Intel Corporation <www.intel.com>
  4. */
  5. #include <asm/io.h>
  6. #include <asm/arch/fpga_manager.h>
  7. #include <asm/arch/reset_manager.h>
  8. #include <asm/arch/system_manager.h>
  9. #include <asm/arch/sdram.h>
  10. #include <asm/arch/misc.h>
  11. #include <altera.h>
  12. #include <common.h>
  13. #include <errno.h>
  14. #include <wait_bit.h>
  15. #include <watchdog.h>
  16. #define CFGWDTH_32 1
  17. #define MIN_BITSTREAM_SIZECHECK 230
  18. #define ENCRYPTION_OFFSET 69
  19. #define COMPRESSION_OFFSET 229
  20. #define FPGA_TIMEOUT_MSEC 1000 /* timeout in ms */
  21. #define FPGA_TIMEOUT_CNT 0x1000000
  22. static const struct socfpga_fpga_manager *fpga_manager_base =
  23. (void *)SOCFPGA_FPGAMGRREGS_ADDRESS;
  24. static const struct socfpga_system_manager *system_manager_base =
  25. (void *)SOCFPGA_SYSMGR_ADDRESS;
  26. static void fpgamgr_set_cd_ratio(unsigned long ratio);
  27. static uint32_t fpgamgr_get_msel(void)
  28. {
  29. u32 reg;
  30. reg = readl(&fpga_manager_base->imgcfg_stat);
  31. reg = (reg & ALT_FPGAMGR_IMGCFG_STAT_F2S_MSEL_SET_MSD) >>
  32. ALT_FPGAMGR_IMGCFG_STAT_F2S_MSEL0_LSB;
  33. return reg;
  34. }
  35. static void fpgamgr_set_cfgwdth(int width)
  36. {
  37. if (width)
  38. setbits_le32(&fpga_manager_base->imgcfg_ctrl_02,
  39. ALT_FPGAMGR_IMGCFG_CTL_02_CFGWIDTH_SET_MSK);
  40. else
  41. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_02,
  42. ALT_FPGAMGR_IMGCFG_CTL_02_CFGWIDTH_SET_MSK);
  43. }
  44. int is_fpgamgr_user_mode(void)
  45. {
  46. return (readl(&fpga_manager_base->imgcfg_stat) &
  47. ALT_FPGAMGR_IMGCFG_STAT_F2S_USERMODE_SET_MSK) != 0;
  48. }
  49. static int wait_for_user_mode(void)
  50. {
  51. return wait_for_bit_le32(&fpga_manager_base->imgcfg_stat,
  52. ALT_FPGAMGR_IMGCFG_STAT_F2S_USERMODE_SET_MSK,
  53. 1, FPGA_TIMEOUT_MSEC, false);
  54. }
  55. static int is_fpgamgr_early_user_mode(void)
  56. {
  57. return (readl(&fpga_manager_base->imgcfg_stat) &
  58. ALT_FPGAMGR_IMGCFG_STAT_F2S_EARLY_USERMODE_SET_MSK) != 0;
  59. }
  60. int fpgamgr_wait_early_user_mode(void)
  61. {
  62. u32 sync_data = 0xffffffff;
  63. u32 i = 0;
  64. unsigned start = get_timer(0);
  65. unsigned long cd_ratio;
  66. /* Getting existing CDRATIO */
  67. cd_ratio = (readl(&fpga_manager_base->imgcfg_ctrl_02) &
  68. ALT_FPGAMGR_IMGCFG_CTL_02_CDRATIO_SET_MSK) >>
  69. ALT_FPGAMGR_IMGCFG_CTL_02_CDRATIO_LSB;
  70. /* Using CDRATIO_X1 for better compatibility */
  71. fpgamgr_set_cd_ratio(CDRATIO_x1);
  72. while (!is_fpgamgr_early_user_mode()) {
  73. if (get_timer(start) > FPGA_TIMEOUT_MSEC)
  74. return -ETIMEDOUT;
  75. fpgamgr_program_write((const long unsigned int *)&sync_data,
  76. sizeof(sync_data));
  77. udelay(FPGA_TIMEOUT_MSEC);
  78. i++;
  79. }
  80. debug("Additional %i sync word needed\n", i);
  81. /* restoring original CDRATIO */
  82. fpgamgr_set_cd_ratio(cd_ratio);
  83. return 0;
  84. }
  85. /* Read f2s_nconfig_pin and f2s_nstatus_pin; loop until de-asserted */
  86. static int wait_for_nconfig_pin_and_nstatus_pin(void)
  87. {
  88. unsigned long mask = ALT_FPGAMGR_IMGCFG_STAT_F2S_NCONFIG_PIN_SET_MSK |
  89. ALT_FPGAMGR_IMGCFG_STAT_F2S_NSTATUS_PIN_SET_MSK;
  90. /*
  91. * Poll until f2s_nconfig_pin and f2s_nstatus_pin; loop until
  92. * de-asserted, timeout at 1000ms
  93. */
  94. return wait_for_bit_le32(&fpga_manager_base->imgcfg_stat, mask,
  95. true, FPGA_TIMEOUT_MSEC, false);
  96. }
  97. static int wait_for_f2s_nstatus_pin(unsigned long value)
  98. {
  99. /* Poll until f2s to specific value, timeout at 1000ms */
  100. return wait_for_bit_le32(&fpga_manager_base->imgcfg_stat,
  101. ALT_FPGAMGR_IMGCFG_STAT_F2S_NSTATUS_PIN_SET_MSK,
  102. value, FPGA_TIMEOUT_MSEC, false);
  103. }
  104. /* set CD ratio */
  105. static void fpgamgr_set_cd_ratio(unsigned long ratio)
  106. {
  107. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_02,
  108. ALT_FPGAMGR_IMGCFG_CTL_02_CDRATIO_SET_MSK);
  109. setbits_le32(&fpga_manager_base->imgcfg_ctrl_02,
  110. (ratio << ALT_FPGAMGR_IMGCFG_CTL_02_CDRATIO_LSB) &
  111. ALT_FPGAMGR_IMGCFG_CTL_02_CDRATIO_SET_MSK);
  112. }
  113. /* get the MSEL value, verify we are set for FPP configuration mode */
  114. static int fpgamgr_verify_msel(void)
  115. {
  116. u32 msel = fpgamgr_get_msel();
  117. if (msel & ~BIT(0)) {
  118. printf("Fail: read msel=%d\n", msel);
  119. return -EPERM;
  120. }
  121. return 0;
  122. }
  123. /*
  124. * Write cdratio and cdwidth based on whether the bitstream is compressed
  125. * and/or encoded
  126. */
  127. static int fpgamgr_set_cdratio_cdwidth(unsigned int cfg_width, u32 *rbf_data,
  128. size_t rbf_size)
  129. {
  130. unsigned int cd_ratio;
  131. bool encrypt, compress;
  132. /*
  133. * According to the bitstream specification,
  134. * both encryption and compression status are
  135. * in location before offset 230 of the buffer.
  136. */
  137. if (rbf_size < MIN_BITSTREAM_SIZECHECK)
  138. return -EINVAL;
  139. encrypt = (rbf_data[ENCRYPTION_OFFSET] >> 2) & 3;
  140. encrypt = encrypt != 0;
  141. compress = (rbf_data[COMPRESSION_OFFSET] >> 1) & 1;
  142. compress = !compress;
  143. debug("header word %d = %08x\n", 69, rbf_data[69]);
  144. debug("header word %d = %08x\n", 229, rbf_data[229]);
  145. debug("read from rbf header: encrypt=%d compress=%d\n", encrypt, compress);
  146. /*
  147. * from the register map description of cdratio in imgcfg_ctrl_02:
  148. * Normal Configuration : 32bit Passive Parallel
  149. * Partial Reconfiguration : 16bit Passive Parallel
  150. */
  151. /*
  152. * cd ratio is dependent on cfg width and whether the bitstream
  153. * is encrypted and/or compressed.
  154. *
  155. * | width | encr. | compr. | cd ratio |
  156. * | 16 | 0 | 0 | 1 |
  157. * | 16 | 0 | 1 | 4 |
  158. * | 16 | 1 | 0 | 2 |
  159. * | 16 | 1 | 1 | 4 |
  160. * | 32 | 0 | 0 | 1 |
  161. * | 32 | 0 | 1 | 8 |
  162. * | 32 | 1 | 0 | 4 |
  163. * | 32 | 1 | 1 | 8 |
  164. */
  165. if (!compress && !encrypt) {
  166. cd_ratio = CDRATIO_x1;
  167. } else {
  168. if (compress)
  169. cd_ratio = CDRATIO_x4;
  170. else
  171. cd_ratio = CDRATIO_x2;
  172. /* if 32 bit, double the cd ratio (so register
  173. field setting is incremented) */
  174. if (cfg_width == CFGWDTH_32)
  175. cd_ratio += 1;
  176. }
  177. fpgamgr_set_cfgwdth(cfg_width);
  178. fpgamgr_set_cd_ratio(cd_ratio);
  179. return 0;
  180. }
  181. static int fpgamgr_reset(void)
  182. {
  183. unsigned long reg;
  184. /* S2F_NCONFIG = 0 */
  185. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_00,
  186. ALT_FPGAMGR_IMGCFG_CTL_00_S2F_NCONFIG_SET_MSK);
  187. /* Wait for f2s_nstatus == 0 */
  188. if (wait_for_f2s_nstatus_pin(0))
  189. return -ETIME;
  190. /* S2F_NCONFIG = 1 */
  191. setbits_le32(&fpga_manager_base->imgcfg_ctrl_00,
  192. ALT_FPGAMGR_IMGCFG_CTL_00_S2F_NCONFIG_SET_MSK);
  193. /* Wait for f2s_nstatus == 1 */
  194. if (wait_for_f2s_nstatus_pin(1))
  195. return -ETIME;
  196. /* read and confirm f2s_condone_pin = 0 and f2s_condone_oe = 1 */
  197. reg = readl(&fpga_manager_base->imgcfg_stat);
  198. if ((reg & ALT_FPGAMGR_IMGCFG_STAT_F2S_CONDONE_PIN_SET_MSK) != 0)
  199. return -EPERM;
  200. if ((reg & ALT_FPGAMGR_IMGCFG_STAT_F2S_CONDONE_OE_SET_MSK) == 0)
  201. return -EPERM;
  202. return 0;
  203. }
  204. /* Start the FPGA programming by initialize the FPGA Manager */
  205. int fpgamgr_program_init(u32 * rbf_data, size_t rbf_size)
  206. {
  207. int ret;
  208. /* Step 1 */
  209. if (fpgamgr_verify_msel())
  210. return -EPERM;
  211. /* Step 2 */
  212. if (fpgamgr_set_cdratio_cdwidth(CFGWDTH_32, rbf_data, rbf_size))
  213. return -EPERM;
  214. /*
  215. * Step 3:
  216. * Make sure no other external devices are trying to interfere with
  217. * programming:
  218. */
  219. if (wait_for_nconfig_pin_and_nstatus_pin())
  220. return -ETIME;
  221. /*
  222. * Step 4:
  223. * Deassert the signal drives from HPS
  224. *
  225. * S2F_NCE = 1
  226. * S2F_PR_REQUEST = 0
  227. * EN_CFG_CTRL = 0
  228. * EN_CFG_DATA = 0
  229. * S2F_NCONFIG = 1
  230. * S2F_NSTATUS_OE = 0
  231. * S2F_CONDONE_OE = 0
  232. */
  233. setbits_le32(&fpga_manager_base->imgcfg_ctrl_01,
  234. ALT_FPGAMGR_IMGCFG_CTL_01_S2F_NCE_SET_MSK);
  235. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_01,
  236. ALT_FPGAMGR_IMGCFG_CTL_01_S2F_PR_REQUEST_SET_MSK);
  237. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_02,
  238. ALT_FPGAMGR_IMGCFG_CTL_02_EN_CFG_DATA_SET_MSK |
  239. ALT_FPGAMGR_IMGCFG_CTL_02_EN_CFG_CTRL_SET_MSK);
  240. setbits_le32(&fpga_manager_base->imgcfg_ctrl_00,
  241. ALT_FPGAMGR_IMGCFG_CTL_00_S2F_NCONFIG_SET_MSK);
  242. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_00,
  243. ALT_FPGAMGR_IMGCFG_CTL_00_S2F_NSTATUS_OE_SET_MSK |
  244. ALT_FPGAMGR_IMGCFG_CTL_00_S2F_CONDONE_OE_SET_MSK);
  245. /*
  246. * Step 5:
  247. * Enable overrides
  248. * S2F_NENABLE_CONFIG = 0
  249. * S2F_NENABLE_NCONFIG = 0
  250. */
  251. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_01,
  252. ALT_FPGAMGR_IMGCFG_CTL_01_S2F_NENABLE_CONFIG_SET_MSK);
  253. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_00,
  254. ALT_FPGAMGR_IMGCFG_CTL_00_S2F_NENABLE_NCONFIG_SET_MSK);
  255. /*
  256. * Disable driving signals that HPS doesn't need to drive.
  257. * S2F_NENABLE_NSTATUS = 1
  258. * S2F_NENABLE_CONDONE = 1
  259. */
  260. setbits_le32(&fpga_manager_base->imgcfg_ctrl_00,
  261. ALT_FPGAMGR_IMGCFG_CTL_00_S2F_NENABLE_NSTATUS_SET_MSK |
  262. ALT_FPGAMGR_IMGCFG_CTL_00_S2F_NENABLE_CONDONE_SET_MSK);
  263. /*
  264. * Step 6:
  265. * Drive chip select S2F_NCE = 0
  266. */
  267. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_01,
  268. ALT_FPGAMGR_IMGCFG_CTL_01_S2F_NCE_SET_MSK);
  269. /* Step 7 */
  270. if (wait_for_nconfig_pin_and_nstatus_pin())
  271. return -ETIME;
  272. /* Step 8 */
  273. ret = fpgamgr_reset();
  274. if (ret)
  275. return ret;
  276. /*
  277. * Step 9:
  278. * EN_CFG_CTRL and EN_CFG_DATA = 1
  279. */
  280. setbits_le32(&fpga_manager_base->imgcfg_ctrl_02,
  281. ALT_FPGAMGR_IMGCFG_CTL_02_EN_CFG_DATA_SET_MSK |
  282. ALT_FPGAMGR_IMGCFG_CTL_02_EN_CFG_CTRL_SET_MSK);
  283. return 0;
  284. }
  285. /* Ensure the FPGA entering config done */
  286. static int fpgamgr_program_poll_cd(void)
  287. {
  288. unsigned long reg, i;
  289. for (i = 0; i < FPGA_TIMEOUT_CNT; i++) {
  290. reg = readl(&fpga_manager_base->imgcfg_stat);
  291. if (reg & ALT_FPGAMGR_IMGCFG_STAT_F2S_CONDONE_PIN_SET_MSK)
  292. return 0;
  293. if ((reg & ALT_FPGAMGR_IMGCFG_STAT_F2S_NSTATUS_PIN_SET_MSK) == 0) {
  294. printf("nstatus == 0 while waiting for condone\n");
  295. return -EPERM;
  296. }
  297. }
  298. if (i == FPGA_TIMEOUT_CNT)
  299. return -ETIME;
  300. return 0;
  301. }
  302. /* Ensure the FPGA entering user mode */
  303. static int fpgamgr_program_poll_usermode(void)
  304. {
  305. unsigned long reg;
  306. int ret = 0;
  307. if (fpgamgr_dclkcnt_set(0xf))
  308. return -ETIME;
  309. ret = wait_for_user_mode();
  310. if (ret < 0) {
  311. printf("%s: Failed to enter user mode with ", __func__);
  312. printf("error code %d\n", ret);
  313. return ret;
  314. }
  315. /*
  316. * Step 14:
  317. * Stop DATA path and Dclk
  318. * EN_CFG_CTRL and EN_CFG_DATA = 0
  319. */
  320. clrbits_le32(&fpga_manager_base->imgcfg_ctrl_02,
  321. ALT_FPGAMGR_IMGCFG_CTL_02_EN_CFG_DATA_SET_MSK |
  322. ALT_FPGAMGR_IMGCFG_CTL_02_EN_CFG_CTRL_SET_MSK);
  323. /*
  324. * Step 15:
  325. * Disable overrides
  326. * S2F_NENABLE_CONFIG = 1
  327. * S2F_NENABLE_NCONFIG = 1
  328. */
  329. setbits_le32(&fpga_manager_base->imgcfg_ctrl_01,
  330. ALT_FPGAMGR_IMGCFG_CTL_01_S2F_NENABLE_CONFIG_SET_MSK);
  331. setbits_le32(&fpga_manager_base->imgcfg_ctrl_00,
  332. ALT_FPGAMGR_IMGCFG_CTL_00_S2F_NENABLE_NCONFIG_SET_MSK);
  333. /* Disable chip select S2F_NCE = 1 */
  334. setbits_le32(&fpga_manager_base->imgcfg_ctrl_01,
  335. ALT_FPGAMGR_IMGCFG_CTL_01_S2F_NCE_SET_MSK);
  336. /*
  337. * Step 16:
  338. * Final check
  339. */
  340. reg = readl(&fpga_manager_base->imgcfg_stat);
  341. if (((reg & ALT_FPGAMGR_IMGCFG_STAT_F2S_USERMODE_SET_MSK) !=
  342. ALT_FPGAMGR_IMGCFG_STAT_F2S_USERMODE_SET_MSK) ||
  343. ((reg & ALT_FPGAMGR_IMGCFG_STAT_F2S_CONDONE_PIN_SET_MSK) !=
  344. ALT_FPGAMGR_IMGCFG_STAT_F2S_CONDONE_PIN_SET_MSK) ||
  345. ((reg & ALT_FPGAMGR_IMGCFG_STAT_F2S_NSTATUS_PIN_SET_MSK) !=
  346. ALT_FPGAMGR_IMGCFG_STAT_F2S_NSTATUS_PIN_SET_MSK))
  347. return -EPERM;
  348. return 0;
  349. }
  350. int fpgamgr_program_finish(void)
  351. {
  352. /* Ensure the FPGA entering config done */
  353. int status = fpgamgr_program_poll_cd();
  354. if (status) {
  355. printf("FPGA: Poll CD failed with error code %d\n", status);
  356. return -EPERM;
  357. }
  358. WATCHDOG_RESET();
  359. /* Ensure the FPGA entering user mode */
  360. status = fpgamgr_program_poll_usermode();
  361. if (status) {
  362. printf("FPGA: Poll usermode failed with error code %d\n",
  363. status);
  364. return -EPERM;
  365. }
  366. printf("Full Configuration Succeeded.\n");
  367. return 0;
  368. }
  369. /*
  370. * FPGA Manager to program the FPGA. This is the interface used by FPGA driver.
  371. * Return 0 for sucess, non-zero for error.
  372. */
  373. int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size)
  374. {
  375. int status;
  376. /* disable all signals from hps peripheral controller to fpga */
  377. writel(0, &system_manager_base->fpgaintf_en_global);
  378. /* disable all axi bridge (hps2fpga, lwhps2fpga & fpga2hps) */
  379. socfpga_bridges_reset();
  380. /* Initialize the FPGA Manager */
  381. status = fpgamgr_program_init((u32 *)rbf_data, rbf_size);
  382. if (status)
  383. return status;
  384. /* Write the RBF data to FPGA Manager */
  385. fpgamgr_program_write(rbf_data, rbf_size);
  386. return fpgamgr_program_finish();
  387. }