netc_blk_ctrl.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
  2. /*
  3. * NXP NETC Blocks Control Driver
  4. *
  5. * Copyright 2024 NXP
  6. *
  7. * This driver is used for pre-initialization of NETC, such as PCS and MII
  8. * protocols, LDID, warm reset, etc. Therefore, all NETC device drivers can
  9. * only be probed after the netc-blk-crtl driver has completed initialization.
  10. * In addition, when the system enters suspend mode, IERB, PRB, and NETCMIX
  11. * will be powered off, except for WOL. Therefore, when the system resumes,
  12. * these blocks need to be reinitialized.
  13. */
  14. #include <linux/bits.h>
  15. #include <linux/clk.h>
  16. #include <linux/debugfs.h>
  17. #include <linux/delay.h>
  18. #include <linux/fsl/netc_global.h>
  19. #include <linux/module.h>
  20. #include <linux/of.h>
  21. #include <linux/of_device.h>
  22. #include <linux/of_net.h>
  23. #include <linux/of_platform.h>
  24. #include <linux/phy.h>
  25. #include <linux/platform_device.h>
  26. #include <linux/seq_file.h>
  27. /* NETCMIX registers */
  28. #define IMX95_CFG_LINK_IO_VAR 0x0
  29. #define IO_VAR_16FF_16G_SERDES 0x1
  30. #define IO_VAR(port, var) (((var) & 0xf) << ((port) << 2))
  31. #define IMX95_CFG_LINK_MII_PROT 0x4
  32. #define CFG_LINK_MII_PORT_0 GENMASK(3, 0)
  33. #define CFG_LINK_MII_PORT_1 GENMASK(7, 4)
  34. #define MII_PROT_MII 0x0
  35. #define MII_PROT_RMII 0x1
  36. #define MII_PROT_RGMII 0x2
  37. #define MII_PROT_SERIAL 0x3
  38. #define MII_PROT(port, prot) (((prot) & 0xf) << ((port) << 2))
  39. #define IMX95_CFG_LINK_PCS_PROT(a) (0x8 + (a) * 4)
  40. #define PCS_PROT_1G_SGMII BIT(0)
  41. #define PCS_PROT_2500M_SGMII BIT(1)
  42. #define PCS_PROT_XFI BIT(3)
  43. #define PCS_PROT_SFI BIT(4)
  44. #define PCS_PROT_10G_SXGMII BIT(6)
  45. #define IMX94_EXT_PIN_CONTROL 0x10
  46. #define MAC2_MAC3_SEL BIT(1)
  47. #define IMX94_NETC_LINK_CFG(a) (0x4c + (a) * 4)
  48. #define NETC_LINK_CFG_MII_PROT GENMASK(3, 0)
  49. #define NETC_LINK_CFG_IO_VAR GENMASK(19, 16)
  50. /* NETC privileged register block register */
  51. #define PRB_NETCRR 0x100
  52. #define NETCRR_SR BIT(0)
  53. #define NETCRR_LOCK BIT(1)
  54. #define PRB_NETCSR 0x104
  55. #define NETCSR_ERROR BIT(0)
  56. #define NETCSR_STATE BIT(1)
  57. /* NETC integrated endpoint register block register */
  58. #define IERB_EMDIOFAUXR 0x344
  59. #define IERB_T0FAUXR 0x444
  60. #define IERB_ETBCR(a) (0x300c + 0x100 * (a))
  61. #define IERB_LBCR(a) (0x1010 + 0x40 * (a))
  62. #define LBCR_MDIO_PHYAD_PRTAD(addr) (((addr) & 0x1f) << 8)
  63. #define IERB_EFAUXR(a) (0x3044 + 0x100 * (a))
  64. #define IERB_VFAUXR(a) (0x4004 + 0x40 * (a))
  65. #define FAUXR_LDID GENMASK(3, 0)
  66. /* Platform information */
  67. #define IMX95_ENETC0_BUS_DEVFN 0x0
  68. #define IMX95_ENETC1_BUS_DEVFN 0x40
  69. #define IMX95_ENETC2_BUS_DEVFN 0x80
  70. #define IMX94_ENETC0_BUS_DEVFN 0x100
  71. #define IMX94_ENETC1_BUS_DEVFN 0x140
  72. #define IMX94_ENETC2_BUS_DEVFN 0x180
  73. #define IMX94_TIMER0_BUS_DEVFN 0x1
  74. #define IMX94_TIMER1_BUS_DEVFN 0x101
  75. #define IMX94_TIMER2_BUS_DEVFN 0x181
  76. #define IMX94_ENETC0_LINK 3
  77. #define IMX94_ENETC1_LINK 4
  78. #define IMX94_ENETC2_LINK 5
  79. #define NETC_ENETC_ID(a) (a)
  80. #define NETC_TIMER_ID(a) (a)
  81. /* Flags for different platforms */
  82. #define NETC_HAS_NETCMIX BIT(0)
  83. struct netc_devinfo {
  84. u32 flags;
  85. int (*netcmix_init)(struct platform_device *pdev);
  86. int (*ierb_init)(struct platform_device *pdev);
  87. };
  88. struct netc_blk_ctrl {
  89. void __iomem *prb;
  90. void __iomem *ierb;
  91. void __iomem *netcmix;
  92. const struct netc_devinfo *devinfo;
  93. struct platform_device *pdev;
  94. struct dentry *debugfs_root;
  95. };
  96. static void netc_reg_write(void __iomem *base, u32 offset, u32 val)
  97. {
  98. netc_write(base + offset, val);
  99. }
  100. static u32 netc_reg_read(void __iomem *base, u32 offset)
  101. {
  102. return netc_read(base + offset);
  103. }
  104. static int netc_of_pci_get_bus_devfn(struct device_node *np)
  105. {
  106. u32 reg[5];
  107. int error;
  108. error = of_property_read_u32_array(np, "reg", reg, ARRAY_SIZE(reg));
  109. if (error)
  110. return error;
  111. return (reg[0] >> 8) & 0xffff;
  112. }
  113. static int netc_get_link_mii_protocol(phy_interface_t interface)
  114. {
  115. switch (interface) {
  116. case PHY_INTERFACE_MODE_MII:
  117. return MII_PROT_MII;
  118. case PHY_INTERFACE_MODE_RMII:
  119. return MII_PROT_RMII;
  120. case PHY_INTERFACE_MODE_RGMII:
  121. case PHY_INTERFACE_MODE_RGMII_ID:
  122. case PHY_INTERFACE_MODE_RGMII_RXID:
  123. case PHY_INTERFACE_MODE_RGMII_TXID:
  124. return MII_PROT_RGMII;
  125. case PHY_INTERFACE_MODE_SGMII:
  126. case PHY_INTERFACE_MODE_2500BASEX:
  127. case PHY_INTERFACE_MODE_10GBASER:
  128. case PHY_INTERFACE_MODE_XGMII:
  129. case PHY_INTERFACE_MODE_USXGMII:
  130. return MII_PROT_SERIAL;
  131. default:
  132. return -EINVAL;
  133. }
  134. }
  135. static int imx95_netcmix_init(struct platform_device *pdev)
  136. {
  137. struct netc_blk_ctrl *priv = platform_get_drvdata(pdev);
  138. struct device_node *np = pdev->dev.of_node;
  139. phy_interface_t interface;
  140. int bus_devfn, mii_proto;
  141. u32 val;
  142. int err;
  143. /* Default setting of MII protocol */
  144. val = MII_PROT(0, MII_PROT_RGMII) | MII_PROT(1, MII_PROT_RGMII) |
  145. MII_PROT(2, MII_PROT_SERIAL);
  146. /* Update the link MII protocol through parsing phy-mode */
  147. for_each_available_child_of_node_scoped(np, child) {
  148. for_each_available_child_of_node_scoped(child, gchild) {
  149. if (!of_device_is_compatible(gchild, "pci1131,e101"))
  150. continue;
  151. bus_devfn = netc_of_pci_get_bus_devfn(gchild);
  152. if (bus_devfn < 0)
  153. return -EINVAL;
  154. if (bus_devfn == IMX95_ENETC2_BUS_DEVFN)
  155. continue;
  156. err = of_get_phy_mode(gchild, &interface);
  157. if (err)
  158. continue;
  159. mii_proto = netc_get_link_mii_protocol(interface);
  160. if (mii_proto < 0)
  161. return -EINVAL;
  162. switch (bus_devfn) {
  163. case IMX95_ENETC0_BUS_DEVFN:
  164. val = u32_replace_bits(val, mii_proto,
  165. CFG_LINK_MII_PORT_0);
  166. break;
  167. case IMX95_ENETC1_BUS_DEVFN:
  168. val = u32_replace_bits(val, mii_proto,
  169. CFG_LINK_MII_PORT_1);
  170. break;
  171. default:
  172. return -EINVAL;
  173. }
  174. }
  175. }
  176. /* Configure Link I/O variant */
  177. netc_reg_write(priv->netcmix, IMX95_CFG_LINK_IO_VAR,
  178. IO_VAR(2, IO_VAR_16FF_16G_SERDES));
  179. /* Configure Link 2 PCS protocol */
  180. netc_reg_write(priv->netcmix, IMX95_CFG_LINK_PCS_PROT(2),
  181. PCS_PROT_10G_SXGMII);
  182. netc_reg_write(priv->netcmix, IMX95_CFG_LINK_MII_PROT, val);
  183. return 0;
  184. }
  185. static int imx94_enetc_get_link_id(struct device_node *np)
  186. {
  187. int bus_devfn = netc_of_pci_get_bus_devfn(np);
  188. /* Parse ENETC link number */
  189. switch (bus_devfn) {
  190. case IMX94_ENETC0_BUS_DEVFN:
  191. return IMX94_ENETC0_LINK;
  192. case IMX94_ENETC1_BUS_DEVFN:
  193. return IMX94_ENETC1_LINK;
  194. case IMX94_ENETC2_BUS_DEVFN:
  195. return IMX94_ENETC2_LINK;
  196. default:
  197. return -EINVAL;
  198. }
  199. }
  200. static int imx94_link_config(struct netc_blk_ctrl *priv,
  201. struct device_node *np, int link_id)
  202. {
  203. phy_interface_t interface;
  204. int mii_proto;
  205. u32 val;
  206. /* The node may be disabled and does not have a 'phy-mode'
  207. * or 'phy-connection-type' property.
  208. */
  209. if (of_get_phy_mode(np, &interface))
  210. return 0;
  211. mii_proto = netc_get_link_mii_protocol(interface);
  212. if (mii_proto < 0)
  213. return mii_proto;
  214. val = mii_proto & NETC_LINK_CFG_MII_PROT;
  215. if (val == MII_PROT_SERIAL)
  216. val = u32_replace_bits(val, IO_VAR_16FF_16G_SERDES,
  217. NETC_LINK_CFG_IO_VAR);
  218. netc_reg_write(priv->netcmix, IMX94_NETC_LINK_CFG(link_id), val);
  219. return 0;
  220. }
  221. static int imx94_enetc_link_config(struct netc_blk_ctrl *priv,
  222. struct device_node *np)
  223. {
  224. int link_id = imx94_enetc_get_link_id(np);
  225. if (link_id < 0)
  226. return link_id;
  227. return imx94_link_config(priv, np, link_id);
  228. }
  229. static int imx94_netcmix_init(struct platform_device *pdev)
  230. {
  231. struct netc_blk_ctrl *priv = platform_get_drvdata(pdev);
  232. struct device_node *np = pdev->dev.of_node;
  233. u32 val;
  234. int err;
  235. for_each_child_of_node_scoped(np, child) {
  236. for_each_child_of_node_scoped(child, gchild) {
  237. if (!of_device_is_compatible(gchild, "pci1131,e101"))
  238. continue;
  239. err = imx94_enetc_link_config(priv, gchild);
  240. if (err)
  241. return err;
  242. }
  243. }
  244. /* ENETC 0 and switch port 2 share the same parallel interface.
  245. * Currently, the switch is not supported, so this interface is
  246. * used by ENETC 0 by default.
  247. */
  248. val = netc_reg_read(priv->netcmix, IMX94_EXT_PIN_CONTROL);
  249. val |= MAC2_MAC3_SEL;
  250. netc_reg_write(priv->netcmix, IMX94_EXT_PIN_CONTROL, val);
  251. return 0;
  252. }
  253. static bool netc_ierb_is_locked(struct netc_blk_ctrl *priv)
  254. {
  255. return !!(netc_reg_read(priv->prb, PRB_NETCRR) & NETCRR_LOCK);
  256. }
  257. static int netc_lock_ierb(struct netc_blk_ctrl *priv)
  258. {
  259. u32 val;
  260. netc_reg_write(priv->prb, PRB_NETCRR, NETCRR_LOCK);
  261. return read_poll_timeout(netc_reg_read, val, !(val & NETCSR_STATE),
  262. 100, 2000, false, priv->prb, PRB_NETCSR);
  263. }
  264. static int netc_unlock_ierb_with_warm_reset(struct netc_blk_ctrl *priv)
  265. {
  266. u32 val;
  267. netc_reg_write(priv->prb, PRB_NETCRR, 0);
  268. return read_poll_timeout(netc_reg_read, val, !(val & NETCRR_LOCK),
  269. 1000, 100000, true, priv->prb, PRB_NETCRR);
  270. }
  271. static int netc_get_phy_addr(struct device_node *np)
  272. {
  273. struct device_node *mdio_node, *phy_node;
  274. u32 addr = 0;
  275. int err = 0;
  276. mdio_node = of_get_child_by_name(np, "mdio");
  277. if (!mdio_node)
  278. return -ENODEV;
  279. phy_node = of_get_next_child(mdio_node, NULL);
  280. if (!phy_node) {
  281. err = -ENODEV;
  282. goto of_put_mdio_node;
  283. }
  284. err = of_property_read_u32(phy_node, "reg", &addr);
  285. if (err)
  286. goto of_put_phy_node;
  287. if (addr >= PHY_MAX_ADDR)
  288. err = -EINVAL;
  289. of_put_phy_node:
  290. of_node_put(phy_node);
  291. of_put_mdio_node:
  292. of_node_put(mdio_node);
  293. return err ? err : addr;
  294. }
  295. static int netc_parse_emdio_phy_mask(struct device_node *np, u32 *phy_mask)
  296. {
  297. u32 mask = 0;
  298. for_each_child_of_node_scoped(np, child) {
  299. u32 addr;
  300. int err;
  301. err = of_property_read_u32(child, "reg", &addr);
  302. if (err)
  303. return err;
  304. if (addr >= PHY_MAX_ADDR)
  305. return -EINVAL;
  306. mask |= BIT(addr);
  307. }
  308. *phy_mask = mask;
  309. return 0;
  310. }
  311. static int netc_get_emdio_phy_mask(struct device_node *np, u32 *phy_mask)
  312. {
  313. for_each_child_of_node_scoped(np, child) {
  314. for_each_child_of_node_scoped(child, gchild) {
  315. if (!of_device_is_compatible(gchild, "pci1131,ee00"))
  316. continue;
  317. return netc_parse_emdio_phy_mask(gchild, phy_mask);
  318. }
  319. }
  320. return 0;
  321. }
  322. static int imx95_enetc_mdio_phyaddr_config(struct platform_device *pdev)
  323. {
  324. struct netc_blk_ctrl *priv = platform_get_drvdata(pdev);
  325. struct device_node *np = pdev->dev.of_node;
  326. struct device *dev = &pdev->dev;
  327. int bus_devfn, addr, err;
  328. u32 phy_mask = 0;
  329. err = netc_get_emdio_phy_mask(np, &phy_mask);
  330. if (err) {
  331. dev_err(dev, "Failed to get PHY address mask\n");
  332. return err;
  333. }
  334. /* Update the port EMDIO PHY address through parsing phy properties.
  335. * This is needed when using the port EMDIO but it's harmless when
  336. * using the central EMDIO. So apply it on all cases.
  337. */
  338. for_each_child_of_node_scoped(np, child) {
  339. for_each_child_of_node_scoped(child, gchild) {
  340. if (!of_device_is_compatible(gchild, "pci1131,e101"))
  341. continue;
  342. bus_devfn = netc_of_pci_get_bus_devfn(gchild);
  343. if (bus_devfn < 0) {
  344. dev_err(dev, "Failed to get BDF number\n");
  345. return bus_devfn;
  346. }
  347. addr = netc_get_phy_addr(gchild);
  348. if (addr < 0) {
  349. if (addr == -ENODEV)
  350. continue;
  351. dev_err(dev, "Failed to get PHY address\n");
  352. return addr;
  353. }
  354. if (phy_mask & BIT(addr)) {
  355. dev_err(dev,
  356. "Find same PHY address in EMDIO and ENETC node\n");
  357. return -EINVAL;
  358. }
  359. switch (bus_devfn) {
  360. case IMX95_ENETC0_BUS_DEVFN:
  361. netc_reg_write(priv->ierb, IERB_LBCR(0),
  362. LBCR_MDIO_PHYAD_PRTAD(addr));
  363. break;
  364. case IMX95_ENETC1_BUS_DEVFN:
  365. netc_reg_write(priv->ierb, IERB_LBCR(1),
  366. LBCR_MDIO_PHYAD_PRTAD(addr));
  367. break;
  368. case IMX95_ENETC2_BUS_DEVFN:
  369. netc_reg_write(priv->ierb, IERB_LBCR(2),
  370. LBCR_MDIO_PHYAD_PRTAD(addr));
  371. break;
  372. default:
  373. break;
  374. }
  375. }
  376. }
  377. return 0;
  378. }
  379. static int imx95_ierb_init(struct platform_device *pdev)
  380. {
  381. struct netc_blk_ctrl *priv = platform_get_drvdata(pdev);
  382. /* EMDIO : No MSI-X intterupt */
  383. netc_reg_write(priv->ierb, IERB_EMDIOFAUXR, 0);
  384. /* ENETC0 PF */
  385. netc_reg_write(priv->ierb, IERB_EFAUXR(0), 0);
  386. /* ENETC0 VF0 */
  387. netc_reg_write(priv->ierb, IERB_VFAUXR(0), 1);
  388. /* ENETC0 VF1 */
  389. netc_reg_write(priv->ierb, IERB_VFAUXR(1), 2);
  390. /* ENETC1 PF */
  391. netc_reg_write(priv->ierb, IERB_EFAUXR(1), 3);
  392. /* ENETC1 VF0 */
  393. netc_reg_write(priv->ierb, IERB_VFAUXR(2), 5);
  394. /* ENETC1 VF1 */
  395. netc_reg_write(priv->ierb, IERB_VFAUXR(3), 6);
  396. /* ENETC2 PF */
  397. netc_reg_write(priv->ierb, IERB_EFAUXR(2), 4);
  398. /* ENETC2 VF0 */
  399. netc_reg_write(priv->ierb, IERB_VFAUXR(4), 5);
  400. /* ENETC2 VF1 */
  401. netc_reg_write(priv->ierb, IERB_VFAUXR(5), 6);
  402. /* NETC TIMER */
  403. netc_reg_write(priv->ierb, IERB_T0FAUXR, 7);
  404. return imx95_enetc_mdio_phyaddr_config(pdev);
  405. }
  406. static int imx94_get_enetc_id(struct device_node *np)
  407. {
  408. int bus_devfn = netc_of_pci_get_bus_devfn(np);
  409. /* Parse ENETC offset */
  410. switch (bus_devfn) {
  411. case IMX94_ENETC0_BUS_DEVFN:
  412. return NETC_ENETC_ID(0);
  413. case IMX94_ENETC1_BUS_DEVFN:
  414. return NETC_ENETC_ID(1);
  415. case IMX94_ENETC2_BUS_DEVFN:
  416. return NETC_ENETC_ID(2);
  417. default:
  418. return -EINVAL;
  419. }
  420. }
  421. static int imx94_get_timer_id(struct device_node *np)
  422. {
  423. int bus_devfn = netc_of_pci_get_bus_devfn(np);
  424. /* Parse NETC PTP timer ID, the timer0 is on bus 0,
  425. * the timer 1 and timer2 is on bus 1.
  426. */
  427. switch (bus_devfn) {
  428. case IMX94_TIMER0_BUS_DEVFN:
  429. return NETC_TIMER_ID(0);
  430. case IMX94_TIMER1_BUS_DEVFN:
  431. return NETC_TIMER_ID(1);
  432. case IMX94_TIMER2_BUS_DEVFN:
  433. return NETC_TIMER_ID(2);
  434. default:
  435. return -EINVAL;
  436. }
  437. }
  438. static int imx94_enetc_update_tid(struct netc_blk_ctrl *priv,
  439. struct device_node *np)
  440. {
  441. struct device *dev = &priv->pdev->dev;
  442. struct device_node *timer_np;
  443. int eid, tid;
  444. eid = imx94_get_enetc_id(np);
  445. if (eid < 0) {
  446. dev_err(dev, "Failed to get ENETC ID\n");
  447. return eid;
  448. }
  449. timer_np = of_parse_phandle(np, "ptp-timer", 0);
  450. if (!timer_np) {
  451. /* If 'ptp-timer' is not present, the timer1 is the default
  452. * timer of all standalone ENETCs, which is on the same PCIe
  453. * bus as these ENETCs.
  454. */
  455. tid = NETC_TIMER_ID(1);
  456. goto end;
  457. }
  458. tid = imx94_get_timer_id(timer_np);
  459. of_node_put(timer_np);
  460. if (tid < 0) {
  461. dev_err(dev, "Failed to get NETC Timer ID\n");
  462. return tid;
  463. }
  464. end:
  465. netc_reg_write(priv->ierb, IERB_ETBCR(eid), tid);
  466. return 0;
  467. }
  468. static int imx94_enetc_mdio_phyaddr_config(struct netc_blk_ctrl *priv,
  469. struct device_node *np,
  470. u32 phy_mask)
  471. {
  472. struct device *dev = &priv->pdev->dev;
  473. int bus_devfn, addr;
  474. bus_devfn = netc_of_pci_get_bus_devfn(np);
  475. if (bus_devfn < 0) {
  476. dev_err(dev, "Failed to get BDF number\n");
  477. return bus_devfn;
  478. }
  479. addr = netc_get_phy_addr(np);
  480. if (addr < 0) {
  481. if (addr == -ENODEV)
  482. return 0;
  483. dev_err(dev, "Failed to get PHY address\n");
  484. return addr;
  485. }
  486. if (phy_mask & BIT(addr)) {
  487. dev_err(dev,
  488. "Find same PHY address in EMDIO and ENETC node\n");
  489. return -EINVAL;
  490. }
  491. switch (bus_devfn) {
  492. case IMX94_ENETC0_BUS_DEVFN:
  493. netc_reg_write(priv->ierb, IERB_LBCR(IMX94_ENETC0_LINK),
  494. LBCR_MDIO_PHYAD_PRTAD(addr));
  495. break;
  496. case IMX94_ENETC1_BUS_DEVFN:
  497. netc_reg_write(priv->ierb, IERB_LBCR(IMX94_ENETC1_LINK),
  498. LBCR_MDIO_PHYAD_PRTAD(addr));
  499. break;
  500. case IMX94_ENETC2_BUS_DEVFN:
  501. netc_reg_write(priv->ierb, IERB_LBCR(IMX94_ENETC2_LINK),
  502. LBCR_MDIO_PHYAD_PRTAD(addr));
  503. break;
  504. default:
  505. break;
  506. }
  507. return 0;
  508. }
  509. static int imx94_ierb_init(struct platform_device *pdev)
  510. {
  511. struct netc_blk_ctrl *priv = platform_get_drvdata(pdev);
  512. struct device_node *np = pdev->dev.of_node;
  513. u32 phy_mask = 0;
  514. int err;
  515. err = netc_get_emdio_phy_mask(np, &phy_mask);
  516. if (err) {
  517. dev_err(&pdev->dev, "Failed to get PHY address mask\n");
  518. return err;
  519. }
  520. for_each_child_of_node_scoped(np, child) {
  521. for_each_child_of_node_scoped(child, gchild) {
  522. if (!of_device_is_compatible(gchild, "pci1131,e101"))
  523. continue;
  524. err = imx94_enetc_update_tid(priv, gchild);
  525. if (err)
  526. return err;
  527. err = imx94_enetc_mdio_phyaddr_config(priv, gchild,
  528. phy_mask);
  529. if (err)
  530. return err;
  531. }
  532. }
  533. return 0;
  534. }
  535. static int netc_ierb_init(struct platform_device *pdev)
  536. {
  537. struct netc_blk_ctrl *priv = platform_get_drvdata(pdev);
  538. const struct netc_devinfo *devinfo = priv->devinfo;
  539. int err;
  540. if (netc_ierb_is_locked(priv)) {
  541. err = netc_unlock_ierb_with_warm_reset(priv);
  542. if (err) {
  543. dev_err(&pdev->dev, "Unlock IERB failed.\n");
  544. return err;
  545. }
  546. }
  547. if (devinfo->ierb_init) {
  548. err = devinfo->ierb_init(pdev);
  549. if (err)
  550. return err;
  551. }
  552. err = netc_lock_ierb(priv);
  553. if (err) {
  554. dev_err(&pdev->dev, "Lock IERB failed.\n");
  555. return err;
  556. }
  557. return 0;
  558. }
  559. #if IS_ENABLED(CONFIG_DEBUG_FS)
  560. static int netc_prb_show(struct seq_file *s, void *data)
  561. {
  562. struct netc_blk_ctrl *priv = s->private;
  563. u32 val;
  564. val = netc_reg_read(priv->prb, PRB_NETCRR);
  565. seq_printf(s, "[PRB NETCRR] Lock:%d SR:%d\n",
  566. (val & NETCRR_LOCK) ? 1 : 0,
  567. (val & NETCRR_SR) ? 1 : 0);
  568. val = netc_reg_read(priv->prb, PRB_NETCSR);
  569. seq_printf(s, "[PRB NETCSR] State:%d Error:%d\n",
  570. (val & NETCSR_STATE) ? 1 : 0,
  571. (val & NETCSR_ERROR) ? 1 : 0);
  572. return 0;
  573. }
  574. DEFINE_SHOW_ATTRIBUTE(netc_prb);
  575. static void netc_blk_ctrl_create_debugfs(struct netc_blk_ctrl *priv)
  576. {
  577. struct dentry *root;
  578. root = debugfs_create_dir("netc_blk_ctrl", NULL);
  579. if (IS_ERR(root))
  580. return;
  581. priv->debugfs_root = root;
  582. debugfs_create_file("prb", 0444, root, priv, &netc_prb_fops);
  583. }
  584. static void netc_blk_ctrl_remove_debugfs(struct netc_blk_ctrl *priv)
  585. {
  586. debugfs_remove_recursive(priv->debugfs_root);
  587. priv->debugfs_root = NULL;
  588. }
  589. #else
  590. static void netc_blk_ctrl_create_debugfs(struct netc_blk_ctrl *priv)
  591. {
  592. }
  593. static void netc_blk_ctrl_remove_debugfs(struct netc_blk_ctrl *priv)
  594. {
  595. }
  596. #endif
  597. static int netc_prb_check_error(struct netc_blk_ctrl *priv)
  598. {
  599. if (netc_reg_read(priv->prb, PRB_NETCSR) & NETCSR_ERROR)
  600. return -1;
  601. return 0;
  602. }
  603. static const struct netc_devinfo imx95_devinfo = {
  604. .flags = NETC_HAS_NETCMIX,
  605. .netcmix_init = imx95_netcmix_init,
  606. .ierb_init = imx95_ierb_init,
  607. };
  608. static const struct netc_devinfo imx94_devinfo = {
  609. .flags = NETC_HAS_NETCMIX,
  610. .netcmix_init = imx94_netcmix_init,
  611. .ierb_init = imx94_ierb_init,
  612. };
  613. static const struct of_device_id netc_blk_ctrl_match[] = {
  614. { .compatible = "nxp,imx95-netc-blk-ctrl", .data = &imx95_devinfo },
  615. { .compatible = "nxp,imx94-netc-blk-ctrl", .data = &imx94_devinfo },
  616. {},
  617. };
  618. MODULE_DEVICE_TABLE(of, netc_blk_ctrl_match);
  619. static int netc_blk_ctrl_probe(struct platform_device *pdev)
  620. {
  621. struct device_node *node = pdev->dev.of_node;
  622. const struct netc_devinfo *devinfo;
  623. struct device *dev = &pdev->dev;
  624. const struct of_device_id *id;
  625. struct netc_blk_ctrl *priv;
  626. struct clk *ipg_clk;
  627. void __iomem *regs;
  628. int err;
  629. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  630. if (!priv)
  631. return -ENOMEM;
  632. priv->pdev = pdev;
  633. ipg_clk = devm_clk_get_optional_enabled(dev, "ipg");
  634. if (IS_ERR(ipg_clk))
  635. return dev_err_probe(dev, PTR_ERR(ipg_clk),
  636. "Set ipg clock failed\n");
  637. id = of_match_device(netc_blk_ctrl_match, dev);
  638. if (!id)
  639. return dev_err_probe(dev, -EINVAL, "Cannot match device\n");
  640. devinfo = (struct netc_devinfo *)id->data;
  641. if (!devinfo)
  642. return dev_err_probe(dev, -EINVAL, "No device information\n");
  643. priv->devinfo = devinfo;
  644. regs = devm_platform_ioremap_resource_byname(pdev, "ierb");
  645. if (IS_ERR(regs))
  646. return dev_err_probe(dev, PTR_ERR(regs),
  647. "Missing IERB resource\n");
  648. priv->ierb = regs;
  649. regs = devm_platform_ioremap_resource_byname(pdev, "prb");
  650. if (IS_ERR(regs))
  651. return dev_err_probe(dev, PTR_ERR(regs),
  652. "Missing PRB resource\n");
  653. priv->prb = regs;
  654. if (devinfo->flags & NETC_HAS_NETCMIX) {
  655. regs = devm_platform_ioremap_resource_byname(pdev, "netcmix");
  656. if (IS_ERR(regs))
  657. return dev_err_probe(dev, PTR_ERR(regs),
  658. "Missing NETCMIX resource\n");
  659. priv->netcmix = regs;
  660. }
  661. platform_set_drvdata(pdev, priv);
  662. if (devinfo->netcmix_init) {
  663. err = devinfo->netcmix_init(pdev);
  664. if (err)
  665. return dev_err_probe(dev, err,
  666. "Initializing NETCMIX failed\n");
  667. }
  668. err = netc_ierb_init(pdev);
  669. if (err)
  670. return dev_err_probe(dev, err, "Initializing IERB failed\n");
  671. if (netc_prb_check_error(priv) < 0)
  672. dev_warn(dev, "The current IERB configuration is invalid\n");
  673. netc_blk_ctrl_create_debugfs(priv);
  674. err = of_platform_populate(node, NULL, NULL, dev);
  675. if (err) {
  676. netc_blk_ctrl_remove_debugfs(priv);
  677. return dev_err_probe(dev, err, "of_platform_populate failed\n");
  678. }
  679. return 0;
  680. }
  681. static void netc_blk_ctrl_remove(struct platform_device *pdev)
  682. {
  683. struct netc_blk_ctrl *priv = platform_get_drvdata(pdev);
  684. of_platform_depopulate(&pdev->dev);
  685. netc_blk_ctrl_remove_debugfs(priv);
  686. }
  687. static struct platform_driver netc_blk_ctrl_driver = {
  688. .driver = {
  689. .name = "nxp-netc-blk-ctrl",
  690. .of_match_table = netc_blk_ctrl_match,
  691. },
  692. .probe = netc_blk_ctrl_probe,
  693. .remove = netc_blk_ctrl_remove,
  694. };
  695. module_platform_driver(netc_blk_ctrl_driver);
  696. MODULE_DESCRIPTION("NXP NETC Blocks Control Driver");
  697. MODULE_LICENSE("Dual BSD/GPL");