dfl-n3000-nios.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * DFL device driver for Nios private feature on Intel PAC (Programmable
  4. * Acceleration Card) N3000
  5. *
  6. * Copyright (C) 2019-2020 Intel Corporation, Inc.
  7. *
  8. * Authors:
  9. * Wu Hao <[email protected]>
  10. * Xu Yilun <[email protected]>
  11. */
  12. #include <linux/bitfield.h>
  13. #include <linux/dfl.h>
  14. #include <linux/errno.h>
  15. #include <linux/io.h>
  16. #include <linux/io-64-nonatomic-lo-hi.h>
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/regmap.h>
  21. #include <linux/stddef.h>
  22. #include <linux/spi/altera.h>
  23. #include <linux/spi/spi.h>
  24. #include <linux/types.h>
  25. /*
  26. * N3000 Nios private feature registers, named as NIOS_SPI_XX on spec.
  27. * NS is the abbreviation of NIOS_SPI.
  28. */
  29. #define N3000_NS_PARAM 0x8
  30. #define N3000_NS_PARAM_SHIFT_MODE_MSK BIT_ULL(1)
  31. #define N3000_NS_PARAM_SHIFT_MODE_MSB 0
  32. #define N3000_NS_PARAM_SHIFT_MODE_LSB 1
  33. #define N3000_NS_PARAM_DATA_WIDTH GENMASK_ULL(7, 2)
  34. #define N3000_NS_PARAM_NUM_CS GENMASK_ULL(13, 8)
  35. #define N3000_NS_PARAM_CLK_POL BIT_ULL(14)
  36. #define N3000_NS_PARAM_CLK_PHASE BIT_ULL(15)
  37. #define N3000_NS_PARAM_PERIPHERAL_ID GENMASK_ULL(47, 32)
  38. #define N3000_NS_CTRL 0x10
  39. #define N3000_NS_CTRL_WR_DATA GENMASK_ULL(31, 0)
  40. #define N3000_NS_CTRL_ADDR GENMASK_ULL(44, 32)
  41. #define N3000_NS_CTRL_CMD_MSK GENMASK_ULL(63, 62)
  42. #define N3000_NS_CTRL_CMD_NOP 0
  43. #define N3000_NS_CTRL_CMD_RD 1
  44. #define N3000_NS_CTRL_CMD_WR 2
  45. #define N3000_NS_STAT 0x18
  46. #define N3000_NS_STAT_RD_DATA GENMASK_ULL(31, 0)
  47. #define N3000_NS_STAT_RW_VAL BIT_ULL(32)
  48. /* Nios handshake registers, indirect access */
  49. #define N3000_NIOS_INIT 0x1000
  50. #define N3000_NIOS_INIT_DONE BIT(0)
  51. #define N3000_NIOS_INIT_START BIT(1)
  52. /* Mode for retimer A, link 0, the same below */
  53. #define N3000_NIOS_INIT_REQ_FEC_MODE_A0_MSK GENMASK(9, 8)
  54. #define N3000_NIOS_INIT_REQ_FEC_MODE_A1_MSK GENMASK(11, 10)
  55. #define N3000_NIOS_INIT_REQ_FEC_MODE_A2_MSK GENMASK(13, 12)
  56. #define N3000_NIOS_INIT_REQ_FEC_MODE_A3_MSK GENMASK(15, 14)
  57. #define N3000_NIOS_INIT_REQ_FEC_MODE_B0_MSK GENMASK(17, 16)
  58. #define N3000_NIOS_INIT_REQ_FEC_MODE_B1_MSK GENMASK(19, 18)
  59. #define N3000_NIOS_INIT_REQ_FEC_MODE_B2_MSK GENMASK(21, 20)
  60. #define N3000_NIOS_INIT_REQ_FEC_MODE_B3_MSK GENMASK(23, 22)
  61. #define N3000_NIOS_INIT_REQ_FEC_MODE_NO 0x0
  62. #define N3000_NIOS_INIT_REQ_FEC_MODE_KR 0x1
  63. #define N3000_NIOS_INIT_REQ_FEC_MODE_RS 0x2
  64. #define N3000_NIOS_FW_VERSION 0x1004
  65. #define N3000_NIOS_FW_VERSION_PATCH GENMASK(23, 20)
  66. #define N3000_NIOS_FW_VERSION_MINOR GENMASK(27, 24)
  67. #define N3000_NIOS_FW_VERSION_MAJOR GENMASK(31, 28)
  68. /* The retimers we use on Intel PAC N3000 is Parkvale, abbreviated to PKVL */
  69. #define N3000_NIOS_PKVL_A_MODE_STS 0x1020
  70. #define N3000_NIOS_PKVL_B_MODE_STS 0x1024
  71. #define N3000_NIOS_PKVL_MODE_STS_GROUP_MSK GENMASK(15, 8)
  72. #define N3000_NIOS_PKVL_MODE_STS_GROUP_OK 0x0
  73. #define N3000_NIOS_PKVL_MODE_STS_ID_MSK GENMASK(7, 0)
  74. /* When GROUP MASK field == GROUP_OK */
  75. #define N3000_NIOS_PKVL_MODE_ID_RESET 0x0
  76. #define N3000_NIOS_PKVL_MODE_ID_4X10G 0x1
  77. #define N3000_NIOS_PKVL_MODE_ID_4X25G 0x2
  78. #define N3000_NIOS_PKVL_MODE_ID_2X25G 0x3
  79. #define N3000_NIOS_PKVL_MODE_ID_2X25G_2X10G 0x4
  80. #define N3000_NIOS_PKVL_MODE_ID_1X25G 0x5
  81. #define N3000_NIOS_REGBUS_RETRY_COUNT 10000 /* loop count */
  82. #define N3000_NIOS_INIT_TIMEOUT 10000000 /* usec */
  83. #define N3000_NIOS_INIT_TIME_INTV 100000 /* usec */
  84. #define N3000_NIOS_INIT_REQ_FEC_MODE_MSK_ALL \
  85. (N3000_NIOS_INIT_REQ_FEC_MODE_A0_MSK | \
  86. N3000_NIOS_INIT_REQ_FEC_MODE_A1_MSK | \
  87. N3000_NIOS_INIT_REQ_FEC_MODE_A2_MSK | \
  88. N3000_NIOS_INIT_REQ_FEC_MODE_A3_MSK | \
  89. N3000_NIOS_INIT_REQ_FEC_MODE_B0_MSK | \
  90. N3000_NIOS_INIT_REQ_FEC_MODE_B1_MSK | \
  91. N3000_NIOS_INIT_REQ_FEC_MODE_B2_MSK | \
  92. N3000_NIOS_INIT_REQ_FEC_MODE_B3_MSK)
  93. #define N3000_NIOS_INIT_REQ_FEC_MODE_NO_ALL \
  94. (FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A0_MSK, \
  95. N3000_NIOS_INIT_REQ_FEC_MODE_NO) | \
  96. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A1_MSK, \
  97. N3000_NIOS_INIT_REQ_FEC_MODE_NO) | \
  98. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A2_MSK, \
  99. N3000_NIOS_INIT_REQ_FEC_MODE_NO) | \
  100. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A3_MSK, \
  101. N3000_NIOS_INIT_REQ_FEC_MODE_NO) | \
  102. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B0_MSK, \
  103. N3000_NIOS_INIT_REQ_FEC_MODE_NO) | \
  104. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B1_MSK, \
  105. N3000_NIOS_INIT_REQ_FEC_MODE_NO) | \
  106. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B2_MSK, \
  107. N3000_NIOS_INIT_REQ_FEC_MODE_NO) | \
  108. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B3_MSK, \
  109. N3000_NIOS_INIT_REQ_FEC_MODE_NO))
  110. #define N3000_NIOS_INIT_REQ_FEC_MODE_KR_ALL \
  111. (FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A0_MSK, \
  112. N3000_NIOS_INIT_REQ_FEC_MODE_KR) | \
  113. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A1_MSK, \
  114. N3000_NIOS_INIT_REQ_FEC_MODE_KR) | \
  115. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A2_MSK, \
  116. N3000_NIOS_INIT_REQ_FEC_MODE_KR) | \
  117. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A3_MSK, \
  118. N3000_NIOS_INIT_REQ_FEC_MODE_KR) | \
  119. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B0_MSK, \
  120. N3000_NIOS_INIT_REQ_FEC_MODE_KR) | \
  121. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B1_MSK, \
  122. N3000_NIOS_INIT_REQ_FEC_MODE_KR) | \
  123. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B2_MSK, \
  124. N3000_NIOS_INIT_REQ_FEC_MODE_KR) | \
  125. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B3_MSK, \
  126. N3000_NIOS_INIT_REQ_FEC_MODE_KR))
  127. #define N3000_NIOS_INIT_REQ_FEC_MODE_RS_ALL \
  128. (FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A0_MSK, \
  129. N3000_NIOS_INIT_REQ_FEC_MODE_RS) | \
  130. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A1_MSK, \
  131. N3000_NIOS_INIT_REQ_FEC_MODE_RS) | \
  132. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A2_MSK, \
  133. N3000_NIOS_INIT_REQ_FEC_MODE_RS) | \
  134. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_A3_MSK, \
  135. N3000_NIOS_INIT_REQ_FEC_MODE_RS) | \
  136. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B0_MSK, \
  137. N3000_NIOS_INIT_REQ_FEC_MODE_RS) | \
  138. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B1_MSK, \
  139. N3000_NIOS_INIT_REQ_FEC_MODE_RS) | \
  140. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B2_MSK, \
  141. N3000_NIOS_INIT_REQ_FEC_MODE_RS) | \
  142. FIELD_PREP(N3000_NIOS_INIT_REQ_FEC_MODE_B3_MSK, \
  143. N3000_NIOS_INIT_REQ_FEC_MODE_RS))
  144. struct n3000_nios {
  145. void __iomem *base;
  146. struct regmap *regmap;
  147. struct device *dev;
  148. struct platform_device *altera_spi;
  149. };
  150. static ssize_t nios_fw_version_show(struct device *dev,
  151. struct device_attribute *attr, char *buf)
  152. {
  153. struct n3000_nios *nn = dev_get_drvdata(dev);
  154. unsigned int val;
  155. int ret;
  156. ret = regmap_read(nn->regmap, N3000_NIOS_FW_VERSION, &val);
  157. if (ret)
  158. return ret;
  159. return sysfs_emit(buf, "%x.%x.%x\n",
  160. (u8)FIELD_GET(N3000_NIOS_FW_VERSION_MAJOR, val),
  161. (u8)FIELD_GET(N3000_NIOS_FW_VERSION_MINOR, val),
  162. (u8)FIELD_GET(N3000_NIOS_FW_VERSION_PATCH, val));
  163. }
  164. static DEVICE_ATTR_RO(nios_fw_version);
  165. #define IS_MODE_STATUS_OK(mode_stat) \
  166. (FIELD_GET(N3000_NIOS_PKVL_MODE_STS_GROUP_MSK, (mode_stat)) == \
  167. N3000_NIOS_PKVL_MODE_STS_GROUP_OK)
  168. #define IS_RETIMER_FEC_SUPPORTED(retimer_mode) \
  169. ((retimer_mode) != N3000_NIOS_PKVL_MODE_ID_RESET && \
  170. (retimer_mode) != N3000_NIOS_PKVL_MODE_ID_4X10G)
  171. static int get_retimer_mode(struct n3000_nios *nn, unsigned int mode_stat_reg,
  172. unsigned int *retimer_mode)
  173. {
  174. unsigned int val;
  175. int ret;
  176. ret = regmap_read(nn->regmap, mode_stat_reg, &val);
  177. if (ret)
  178. return ret;
  179. if (!IS_MODE_STATUS_OK(val))
  180. return -EFAULT;
  181. *retimer_mode = FIELD_GET(N3000_NIOS_PKVL_MODE_STS_ID_MSK, val);
  182. return 0;
  183. }
  184. static ssize_t retimer_A_mode_show(struct device *dev,
  185. struct device_attribute *attr, char *buf)
  186. {
  187. struct n3000_nios *nn = dev_get_drvdata(dev);
  188. unsigned int mode;
  189. int ret;
  190. ret = get_retimer_mode(nn, N3000_NIOS_PKVL_A_MODE_STS, &mode);
  191. if (ret)
  192. return ret;
  193. return sysfs_emit(buf, "0x%x\n", mode);
  194. }
  195. static DEVICE_ATTR_RO(retimer_A_mode);
  196. static ssize_t retimer_B_mode_show(struct device *dev,
  197. struct device_attribute *attr, char *buf)
  198. {
  199. struct n3000_nios *nn = dev_get_drvdata(dev);
  200. unsigned int mode;
  201. int ret;
  202. ret = get_retimer_mode(nn, N3000_NIOS_PKVL_B_MODE_STS, &mode);
  203. if (ret)
  204. return ret;
  205. return sysfs_emit(buf, "0x%x\n", mode);
  206. }
  207. static DEVICE_ATTR_RO(retimer_B_mode);
  208. static ssize_t fec_mode_show(struct device *dev,
  209. struct device_attribute *attr, char *buf)
  210. {
  211. unsigned int val, retimer_a_mode, retimer_b_mode, fec_modes;
  212. struct n3000_nios *nn = dev_get_drvdata(dev);
  213. int ret;
  214. /* FEC mode setting is not supported in early FW versions */
  215. ret = regmap_read(nn->regmap, N3000_NIOS_FW_VERSION, &val);
  216. if (ret)
  217. return ret;
  218. if (FIELD_GET(N3000_NIOS_FW_VERSION_MAJOR, val) < 3)
  219. return sysfs_emit(buf, "not supported\n");
  220. /* If no 25G links, FEC mode setting is not supported either */
  221. ret = get_retimer_mode(nn, N3000_NIOS_PKVL_A_MODE_STS, &retimer_a_mode);
  222. if (ret)
  223. return ret;
  224. ret = get_retimer_mode(nn, N3000_NIOS_PKVL_B_MODE_STS, &retimer_b_mode);
  225. if (ret)
  226. return ret;
  227. if (!IS_RETIMER_FEC_SUPPORTED(retimer_a_mode) &&
  228. !IS_RETIMER_FEC_SUPPORTED(retimer_b_mode))
  229. return sysfs_emit(buf, "not supported\n");
  230. /* get the valid FEC mode for 25G links */
  231. ret = regmap_read(nn->regmap, N3000_NIOS_INIT, &val);
  232. if (ret)
  233. return ret;
  234. /*
  235. * FEC mode should always be the same for all links, as we set them
  236. * in this way.
  237. */
  238. fec_modes = (val & N3000_NIOS_INIT_REQ_FEC_MODE_MSK_ALL);
  239. if (fec_modes == N3000_NIOS_INIT_REQ_FEC_MODE_NO_ALL)
  240. return sysfs_emit(buf, "no\n");
  241. else if (fec_modes == N3000_NIOS_INIT_REQ_FEC_MODE_KR_ALL)
  242. return sysfs_emit(buf, "kr\n");
  243. else if (fec_modes == N3000_NIOS_INIT_REQ_FEC_MODE_RS_ALL)
  244. return sysfs_emit(buf, "rs\n");
  245. return -EFAULT;
  246. }
  247. static DEVICE_ATTR_RO(fec_mode);
  248. static struct attribute *n3000_nios_attrs[] = {
  249. &dev_attr_nios_fw_version.attr,
  250. &dev_attr_retimer_A_mode.attr,
  251. &dev_attr_retimer_B_mode.attr,
  252. &dev_attr_fec_mode.attr,
  253. NULL,
  254. };
  255. ATTRIBUTE_GROUPS(n3000_nios);
  256. static int n3000_nios_init_done_check(struct n3000_nios *nn)
  257. {
  258. unsigned int val, state_a, state_b;
  259. struct device *dev = nn->dev;
  260. int ret, ret2;
  261. /*
  262. * The SPI is shared by the Nios core inside the FPGA, Nios will use
  263. * this SPI master to do some one time initialization after power up,
  264. * and then release the control to OS. The driver needs to poll on
  265. * INIT_DONE to see when driver could take the control.
  266. *
  267. * Please note that after Nios firmware version 3.0.0, INIT_START is
  268. * introduced, so driver needs to trigger START firstly and then check
  269. * INIT_DONE.
  270. */
  271. ret = regmap_read(nn->regmap, N3000_NIOS_FW_VERSION, &val);
  272. if (ret)
  273. return ret;
  274. /*
  275. * If Nios version register is totally uninitialized(== 0x0), then the
  276. * Nios firmware is missing. So host could take control of SPI master
  277. * safely, but initialization work for Nios is not done. To restore the
  278. * card, we need to reprogram a new Nios firmware via the BMC chip on
  279. * SPI bus. So the driver doesn't error out, it continues to create the
  280. * spi controller device and spi_board_info for BMC.
  281. */
  282. if (val == 0) {
  283. dev_err(dev, "Nios version reg = 0x%x, skip INIT_DONE check, but the retimer may be uninitialized\n",
  284. val);
  285. return 0;
  286. }
  287. if (FIELD_GET(N3000_NIOS_FW_VERSION_MAJOR, val) >= 3) {
  288. /* read NIOS_INIT to check if retimer initialization is done */
  289. ret = regmap_read(nn->regmap, N3000_NIOS_INIT, &val);
  290. if (ret)
  291. return ret;
  292. /* check if retimers are initialized already */
  293. if (val & (N3000_NIOS_INIT_DONE | N3000_NIOS_INIT_START))
  294. goto nios_init_done;
  295. /* configure FEC mode per module param */
  296. val = N3000_NIOS_INIT_START;
  297. /*
  298. * When the retimer is to be set to 10G mode, there is no FEC
  299. * mode setting, so the REQ_FEC_MODE field will be ignored by
  300. * Nios firmware in this case. But we should still fill the FEC
  301. * mode field cause host could not get the retimer working mode
  302. * until the Nios init is done.
  303. *
  304. * For now the driver doesn't support the retimer FEC mode
  305. * switching per user's request. It is always set to Reed
  306. * Solomon FEC.
  307. *
  308. * The driver will set the same FEC mode for all links.
  309. */
  310. val |= N3000_NIOS_INIT_REQ_FEC_MODE_RS_ALL;
  311. ret = regmap_write(nn->regmap, N3000_NIOS_INIT, val);
  312. if (ret)
  313. return ret;
  314. }
  315. nios_init_done:
  316. /* polls on NIOS_INIT_DONE */
  317. ret = regmap_read_poll_timeout(nn->regmap, N3000_NIOS_INIT, val,
  318. val & N3000_NIOS_INIT_DONE,
  319. N3000_NIOS_INIT_TIME_INTV,
  320. N3000_NIOS_INIT_TIMEOUT);
  321. if (ret)
  322. dev_err(dev, "NIOS_INIT_DONE %s\n",
  323. (ret == -ETIMEDOUT) ? "timed out" : "check error");
  324. ret2 = regmap_read(nn->regmap, N3000_NIOS_PKVL_A_MODE_STS, &state_a);
  325. if (ret2)
  326. return ret2;
  327. ret2 = regmap_read(nn->regmap, N3000_NIOS_PKVL_B_MODE_STS, &state_b);
  328. if (ret2)
  329. return ret2;
  330. if (!ret) {
  331. /*
  332. * After INIT_DONE is detected, it still needs to check if the
  333. * Nios firmware reports any error during the retimer
  334. * configuration.
  335. */
  336. if (IS_MODE_STATUS_OK(state_a) && IS_MODE_STATUS_OK(state_b))
  337. return 0;
  338. /*
  339. * If the retimer configuration is failed, the Nios firmware
  340. * will still release the spi controller for host to
  341. * communicate with the BMC. It makes possible for people to
  342. * reprogram a new Nios firmware and restore the card. So the
  343. * driver doesn't error out, it continues to create the spi
  344. * controller device and spi_board_info for BMC.
  345. */
  346. dev_err(dev, "NIOS_INIT_DONE OK, but err on retimer init\n");
  347. }
  348. dev_err(nn->dev, "PKVL_A_MODE_STS 0x%x\n", state_a);
  349. dev_err(nn->dev, "PKVL_B_MODE_STS 0x%x\n", state_b);
  350. return ret;
  351. }
  352. static struct spi_board_info m10_n3000_info = {
  353. .modalias = "m10-n3000",
  354. .max_speed_hz = 12500000,
  355. .bus_num = 0,
  356. .chip_select = 0,
  357. };
  358. static int create_altera_spi_controller(struct n3000_nios *nn)
  359. {
  360. struct altera_spi_platform_data pdata = { 0 };
  361. struct platform_device_info pdevinfo = { 0 };
  362. void __iomem *base = nn->base;
  363. u64 v;
  364. v = readq(base + N3000_NS_PARAM);
  365. pdata.mode_bits = SPI_CS_HIGH;
  366. if (FIELD_GET(N3000_NS_PARAM_CLK_POL, v))
  367. pdata.mode_bits |= SPI_CPOL;
  368. if (FIELD_GET(N3000_NS_PARAM_CLK_PHASE, v))
  369. pdata.mode_bits |= SPI_CPHA;
  370. pdata.num_chipselect = FIELD_GET(N3000_NS_PARAM_NUM_CS, v);
  371. pdata.bits_per_word_mask =
  372. SPI_BPW_RANGE_MASK(1, FIELD_GET(N3000_NS_PARAM_DATA_WIDTH, v));
  373. pdata.num_devices = 1;
  374. pdata.devices = &m10_n3000_info;
  375. dev_dbg(nn->dev, "%s cs %u bpm 0x%x mode 0x%x\n", __func__,
  376. pdata.num_chipselect, pdata.bits_per_word_mask,
  377. pdata.mode_bits);
  378. pdevinfo.name = "subdev_spi_altera";
  379. pdevinfo.id = PLATFORM_DEVID_AUTO;
  380. pdevinfo.parent = nn->dev;
  381. pdevinfo.data = &pdata;
  382. pdevinfo.size_data = sizeof(pdata);
  383. nn->altera_spi = platform_device_register_full(&pdevinfo);
  384. return PTR_ERR_OR_ZERO(nn->altera_spi);
  385. }
  386. static void destroy_altera_spi_controller(struct n3000_nios *nn)
  387. {
  388. platform_device_unregister(nn->altera_spi);
  389. }
  390. static int n3000_nios_poll_stat_timeout(void __iomem *base, u64 *v)
  391. {
  392. int loops;
  393. /*
  394. * We don't use the time based timeout here for performance.
  395. *
  396. * The regbus read/write is on the critical path of Intel PAC N3000
  397. * image programming. The time based timeout checking will add too much
  398. * overhead on it. Usually the state changes in 1 or 2 loops on the
  399. * test server, and we set 10000 times loop here for safety.
  400. */
  401. for (loops = N3000_NIOS_REGBUS_RETRY_COUNT; loops > 0 ; loops--) {
  402. *v = readq(base + N3000_NS_STAT);
  403. if (*v & N3000_NS_STAT_RW_VAL)
  404. break;
  405. cpu_relax();
  406. }
  407. return (loops > 0) ? 0 : -ETIMEDOUT;
  408. }
  409. static int n3000_nios_reg_write(void *context, unsigned int reg, unsigned int val)
  410. {
  411. struct n3000_nios *nn = context;
  412. u64 v;
  413. int ret;
  414. v = FIELD_PREP(N3000_NS_CTRL_CMD_MSK, N3000_NS_CTRL_CMD_WR) |
  415. FIELD_PREP(N3000_NS_CTRL_ADDR, reg) |
  416. FIELD_PREP(N3000_NS_CTRL_WR_DATA, val);
  417. writeq(v, nn->base + N3000_NS_CTRL);
  418. ret = n3000_nios_poll_stat_timeout(nn->base, &v);
  419. if (ret)
  420. dev_err(nn->dev, "fail to write reg 0x%x val 0x%x: %d\n",
  421. reg, val, ret);
  422. return ret;
  423. }
  424. static int n3000_nios_reg_read(void *context, unsigned int reg, unsigned int *val)
  425. {
  426. struct n3000_nios *nn = context;
  427. u64 v;
  428. int ret;
  429. v = FIELD_PREP(N3000_NS_CTRL_CMD_MSK, N3000_NS_CTRL_CMD_RD) |
  430. FIELD_PREP(N3000_NS_CTRL_ADDR, reg);
  431. writeq(v, nn->base + N3000_NS_CTRL);
  432. ret = n3000_nios_poll_stat_timeout(nn->base, &v);
  433. if (ret)
  434. dev_err(nn->dev, "fail to read reg 0x%x: %d\n", reg, ret);
  435. else
  436. *val = FIELD_GET(N3000_NS_STAT_RD_DATA, v);
  437. return ret;
  438. }
  439. static const struct regmap_config n3000_nios_regbus_cfg = {
  440. .reg_bits = 32,
  441. .reg_stride = 4,
  442. .val_bits = 32,
  443. .fast_io = true,
  444. .reg_write = n3000_nios_reg_write,
  445. .reg_read = n3000_nios_reg_read,
  446. };
  447. static int n3000_nios_probe(struct dfl_device *ddev)
  448. {
  449. struct device *dev = &ddev->dev;
  450. struct n3000_nios *nn;
  451. int ret;
  452. nn = devm_kzalloc(dev, sizeof(*nn), GFP_KERNEL);
  453. if (!nn)
  454. return -ENOMEM;
  455. dev_set_drvdata(&ddev->dev, nn);
  456. nn->dev = dev;
  457. nn->base = devm_ioremap_resource(&ddev->dev, &ddev->mmio_res);
  458. if (IS_ERR(nn->base))
  459. return PTR_ERR(nn->base);
  460. nn->regmap = devm_regmap_init(dev, NULL, nn, &n3000_nios_regbus_cfg);
  461. if (IS_ERR(nn->regmap))
  462. return PTR_ERR(nn->regmap);
  463. ret = n3000_nios_init_done_check(nn);
  464. if (ret)
  465. return ret;
  466. ret = create_altera_spi_controller(nn);
  467. if (ret)
  468. dev_err(dev, "altera spi controller create failed: %d\n", ret);
  469. return ret;
  470. }
  471. static void n3000_nios_remove(struct dfl_device *ddev)
  472. {
  473. struct n3000_nios *nn = dev_get_drvdata(&ddev->dev);
  474. destroy_altera_spi_controller(nn);
  475. }
  476. #define FME_FEATURE_ID_N3000_NIOS 0xd
  477. static const struct dfl_device_id n3000_nios_ids[] = {
  478. { FME_ID, FME_FEATURE_ID_N3000_NIOS },
  479. { }
  480. };
  481. MODULE_DEVICE_TABLE(dfl, n3000_nios_ids);
  482. static struct dfl_driver n3000_nios_driver = {
  483. .drv = {
  484. .name = "dfl-n3000-nios",
  485. .dev_groups = n3000_nios_groups,
  486. },
  487. .id_table = n3000_nios_ids,
  488. .probe = n3000_nios_probe,
  489. .remove = n3000_nios_remove,
  490. };
  491. module_dfl_driver(n3000_nios_driver);
  492. MODULE_DESCRIPTION("Driver for Nios private feature on Intel PAC N3000");
  493. MODULE_AUTHOR("Intel Corporation");
  494. MODULE_LICENSE("GPL v2");