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