lattice-sysconfig.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Lattice FPGA sysCONFIG interface functions independent of port type.
  4. */
  5. #include <linux/delay.h>
  6. #include <linux/fpga/fpga-mgr.h>
  7. #include <linux/gpio/consumer.h>
  8. #include <linux/iopoll.h>
  9. #include "lattice-sysconfig.h"
  10. static int sysconfig_cmd_write(struct sysconfig_priv *priv, const void *buf,
  11. size_t buf_len)
  12. {
  13. return priv->command_transfer(priv, buf, buf_len, NULL, 0);
  14. }
  15. static int sysconfig_cmd_read(struct sysconfig_priv *priv, const void *tx_buf,
  16. size_t tx_len, void *rx_buf, size_t rx_len)
  17. {
  18. return priv->command_transfer(priv, tx_buf, tx_len, rx_buf, rx_len);
  19. }
  20. static int sysconfig_read_busy(struct sysconfig_priv *priv)
  21. {
  22. const u8 lsc_check_busy[] = SYSCONFIG_LSC_CHECK_BUSY;
  23. u8 busy;
  24. int ret;
  25. ret = sysconfig_cmd_read(priv, lsc_check_busy, sizeof(lsc_check_busy),
  26. &busy, sizeof(busy));
  27. return ret ? : busy;
  28. }
  29. static int sysconfig_poll_busy(struct sysconfig_priv *priv)
  30. {
  31. int ret, busy;
  32. ret = read_poll_timeout(sysconfig_read_busy, busy, busy <= 0,
  33. SYSCONFIG_POLL_INTERVAL_US,
  34. SYSCONFIG_POLL_BUSY_TIMEOUT_US, false, priv);
  35. return ret ? : busy;
  36. }
  37. static int sysconfig_read_status(struct sysconfig_priv *priv, u32 *status)
  38. {
  39. const u8 lsc_read_status[] = SYSCONFIG_LSC_READ_STATUS;
  40. __be32 device_status;
  41. int ret;
  42. ret = sysconfig_cmd_read(priv, lsc_read_status, sizeof(lsc_read_status),
  43. &device_status, sizeof(device_status));
  44. if (ret)
  45. return ret;
  46. *status = be32_to_cpu(device_status);
  47. return 0;
  48. }
  49. static int sysconfig_poll_status(struct sysconfig_priv *priv, u32 *status)
  50. {
  51. int ret = sysconfig_poll_busy(priv);
  52. if (ret)
  53. return ret;
  54. return sysconfig_read_status(priv, status);
  55. }
  56. static int sysconfig_poll_gpio(struct gpio_desc *gpio, bool is_active)
  57. {
  58. int ret, val;
  59. ret = read_poll_timeout(gpiod_get_value, val,
  60. val < 0 || !!val == is_active,
  61. SYSCONFIG_POLL_INTERVAL_US,
  62. SYSCONFIG_POLL_GPIO_TIMEOUT_US, false, gpio);
  63. if (val < 0)
  64. return val;
  65. return ret;
  66. }
  67. static int sysconfig_gpio_refresh(struct sysconfig_priv *priv)
  68. {
  69. struct gpio_desc *program = priv->program;
  70. struct gpio_desc *init = priv->init;
  71. struct gpio_desc *done = priv->done;
  72. int ret;
  73. /* Enter init mode */
  74. gpiod_set_value(program, 1);
  75. ret = sysconfig_poll_gpio(init, true);
  76. if (!ret)
  77. ret = sysconfig_poll_gpio(done, false);
  78. if (ret)
  79. return ret;
  80. /* Enter program mode */
  81. gpiod_set_value(program, 0);
  82. return sysconfig_poll_gpio(init, false);
  83. }
  84. static int sysconfig_lsc_refresh(struct sysconfig_priv *priv)
  85. {
  86. static const u8 lsc_refresh[] = SYSCONFIG_LSC_REFRESH;
  87. int ret;
  88. ret = sysconfig_cmd_write(priv, lsc_refresh, sizeof(lsc_refresh));
  89. if (ret)
  90. return ret;
  91. usleep_range(4000, 8000);
  92. return 0;
  93. }
  94. static int sysconfig_refresh(struct sysconfig_priv *priv)
  95. {
  96. struct gpio_desc *program = priv->program;
  97. struct gpio_desc *init = priv->init;
  98. struct gpio_desc *done = priv->done;
  99. if (program && init && done)
  100. return sysconfig_gpio_refresh(priv);
  101. return sysconfig_lsc_refresh(priv);
  102. }
  103. static int sysconfig_isc_enable(struct sysconfig_priv *priv)
  104. {
  105. u8 isc_enable[] = SYSCONFIG_ISC_ENABLE;
  106. u32 status;
  107. int ret;
  108. ret = sysconfig_cmd_write(priv, isc_enable, sizeof(isc_enable));
  109. if (ret)
  110. return ret;
  111. ret = sysconfig_poll_status(priv, &status);
  112. if (ret)
  113. return ret;
  114. if (status & SYSCONFIG_STATUS_FAIL)
  115. return -EFAULT;
  116. return 0;
  117. }
  118. static int sysconfig_isc_erase(struct sysconfig_priv *priv)
  119. {
  120. u8 isc_erase[] = SYSCONFIG_ISC_ERASE;
  121. u32 status;
  122. int ret;
  123. ret = sysconfig_cmd_write(priv, isc_erase, sizeof(isc_erase));
  124. if (ret)
  125. return ret;
  126. ret = sysconfig_poll_status(priv, &status);
  127. if (ret)
  128. return ret;
  129. if (status & SYSCONFIG_STATUS_FAIL)
  130. return -EFAULT;
  131. return 0;
  132. }
  133. static int sysconfig_isc_init(struct sysconfig_priv *priv)
  134. {
  135. int ret = sysconfig_isc_enable(priv);
  136. if (ret)
  137. return ret;
  138. return sysconfig_isc_erase(priv);
  139. }
  140. static int sysconfig_lsc_init_addr(struct sysconfig_priv *priv)
  141. {
  142. const u8 lsc_init_addr[] = SYSCONFIG_LSC_INIT_ADDR;
  143. return sysconfig_cmd_write(priv, lsc_init_addr, sizeof(lsc_init_addr));
  144. }
  145. static int sysconfig_burst_write_init(struct sysconfig_priv *priv)
  146. {
  147. return priv->bitstream_burst_write_init(priv);
  148. }
  149. static int sysconfig_burst_write_complete(struct sysconfig_priv *priv)
  150. {
  151. return priv->bitstream_burst_write_complete(priv);
  152. }
  153. static int sysconfig_bitstream_burst_write(struct sysconfig_priv *priv,
  154. const char *buf, size_t count)
  155. {
  156. int ret = priv->bitstream_burst_write(priv, buf, count);
  157. if (ret)
  158. sysconfig_burst_write_complete(priv);
  159. return ret;
  160. }
  161. static int sysconfig_isc_disable(struct sysconfig_priv *priv)
  162. {
  163. const u8 isc_disable[] = SYSCONFIG_ISC_DISABLE;
  164. return sysconfig_cmd_write(priv, isc_disable, sizeof(isc_disable));
  165. }
  166. static void sysconfig_cleanup(struct sysconfig_priv *priv)
  167. {
  168. sysconfig_isc_erase(priv);
  169. sysconfig_refresh(priv);
  170. }
  171. static int sysconfig_isc_finish(struct sysconfig_priv *priv)
  172. {
  173. struct gpio_desc *done_gpio = priv->done;
  174. u32 status;
  175. int ret;
  176. if (done_gpio) {
  177. ret = sysconfig_isc_disable(priv);
  178. if (ret)
  179. return ret;
  180. return sysconfig_poll_gpio(done_gpio, true);
  181. }
  182. ret = sysconfig_poll_status(priv, &status);
  183. if (ret)
  184. return ret;
  185. if ((status & SYSCONFIG_STATUS_DONE) &&
  186. !(status & SYSCONFIG_STATUS_BUSY) &&
  187. !(status & SYSCONFIG_STATUS_ERR))
  188. return sysconfig_isc_disable(priv);
  189. return -EFAULT;
  190. }
  191. static enum fpga_mgr_states sysconfig_ops_state(struct fpga_manager *mgr)
  192. {
  193. struct sysconfig_priv *priv = mgr->priv;
  194. struct gpio_desc *done = priv->done;
  195. u32 status;
  196. int ret;
  197. if (done && (gpiod_get_value(done) > 0))
  198. return FPGA_MGR_STATE_OPERATING;
  199. ret = sysconfig_read_status(priv, &status);
  200. if (!ret && (status & SYSCONFIG_STATUS_DONE))
  201. return FPGA_MGR_STATE_OPERATING;
  202. return FPGA_MGR_STATE_UNKNOWN;
  203. }
  204. static int sysconfig_ops_write_init(struct fpga_manager *mgr,
  205. struct fpga_image_info *info,
  206. const char *buf, size_t count)
  207. {
  208. struct sysconfig_priv *priv = mgr->priv;
  209. struct device *dev = &mgr->dev;
  210. int ret;
  211. if (info->flags & FPGA_MGR_PARTIAL_RECONFIG) {
  212. dev_err(dev, "Partial reconfiguration is not supported\n");
  213. return -EOPNOTSUPP;
  214. }
  215. /* Enter program mode */
  216. ret = sysconfig_refresh(priv);
  217. if (ret) {
  218. dev_err(dev, "Failed to go to program mode\n");
  219. return ret;
  220. }
  221. /* Enter ISC mode */
  222. ret = sysconfig_isc_init(priv);
  223. if (ret) {
  224. dev_err(dev, "Failed to go to ISC mode\n");
  225. return ret;
  226. }
  227. /* Initialize the Address Shift Register */
  228. ret = sysconfig_lsc_init_addr(priv);
  229. if (ret) {
  230. dev_err(dev,
  231. "Failed to initialize the Address Shift Register\n");
  232. return ret;
  233. }
  234. /* Prepare for bitstream burst write */
  235. ret = sysconfig_burst_write_init(priv);
  236. if (ret)
  237. dev_err(dev, "Failed to prepare for bitstream burst write\n");
  238. return ret;
  239. }
  240. static int sysconfig_ops_write(struct fpga_manager *mgr, const char *buf,
  241. size_t count)
  242. {
  243. return sysconfig_bitstream_burst_write(mgr->priv, buf, count);
  244. }
  245. static int sysconfig_ops_write_complete(struct fpga_manager *mgr,
  246. struct fpga_image_info *info)
  247. {
  248. struct sysconfig_priv *priv = mgr->priv;
  249. struct device *dev = &mgr->dev;
  250. int ret;
  251. ret = sysconfig_burst_write_complete(priv);
  252. if (!ret)
  253. ret = sysconfig_poll_busy(priv);
  254. if (ret) {
  255. dev_err(dev, "Error while waiting bitstream write to finish\n");
  256. goto fail;
  257. }
  258. ret = sysconfig_isc_finish(priv);
  259. fail:
  260. if (ret)
  261. sysconfig_cleanup(priv);
  262. return ret;
  263. }
  264. static const struct fpga_manager_ops sysconfig_fpga_mgr_ops = {
  265. .state = sysconfig_ops_state,
  266. .write_init = sysconfig_ops_write_init,
  267. .write = sysconfig_ops_write,
  268. .write_complete = sysconfig_ops_write_complete,
  269. };
  270. int sysconfig_probe(struct sysconfig_priv *priv)
  271. {
  272. struct gpio_desc *program, *init, *done;
  273. struct device *dev = priv->dev;
  274. struct fpga_manager *mgr;
  275. if (!dev)
  276. return -ENODEV;
  277. if (!priv->command_transfer ||
  278. !priv->bitstream_burst_write_init ||
  279. !priv->bitstream_burst_write ||
  280. !priv->bitstream_burst_write_complete) {
  281. dev_err(dev, "Essential callback is missing\n");
  282. return -EINVAL;
  283. }
  284. program = devm_gpiod_get_optional(dev, "program", GPIOD_OUT_LOW);
  285. if (IS_ERR(program))
  286. return dev_err_probe(dev, PTR_ERR(program),
  287. "Failed to get PROGRAM GPIO\n");
  288. init = devm_gpiod_get_optional(dev, "init", GPIOD_IN);
  289. if (IS_ERR(init))
  290. return dev_err_probe(dev, PTR_ERR(init),
  291. "Failed to get INIT GPIO\n");
  292. done = devm_gpiod_get_optional(dev, "done", GPIOD_IN);
  293. if (IS_ERR(done))
  294. return dev_err_probe(dev, PTR_ERR(done),
  295. "Failed to get DONE GPIO\n");
  296. priv->program = program;
  297. priv->init = init;
  298. priv->done = done;
  299. mgr = devm_fpga_mgr_register(dev, "Lattice sysCONFIG FPGA Manager",
  300. &sysconfig_fpga_mgr_ops, priv);
  301. return PTR_ERR_OR_ZERO(mgr);
  302. }
  303. EXPORT_SYMBOL(sysconfig_probe);
  304. MODULE_DESCRIPTION("Lattice sysCONFIG FPGA Manager Core");
  305. MODULE_LICENSE("GPL");