"Das U-Boot" Source Tree
at master 1180 lines 30 kB view raw
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Driver for Renesas Ethernet RSwitch2 (Ethernet-TSN). 4 * 5 * Copyright (C) 2021 Renesas Electronics Corporation 6 * 7 * Based on the Renesas Ethernet AVB driver. 8 */ 9 10#include <asm/io.h> 11#include <clk.h> 12#include <dm.h> 13#include <dm/device-internal.h> 14#include <dm/device_compat.h> 15#include <dm/lists.h> 16#include <errno.h> 17#include <generic-phy.h> 18#include <linux/bitops.h> 19#include <linux/delay.h> 20#include <linux/iopoll.h> 21#include <linux/mii.h> 22#include <eth_phy.h> 23#include <log.h> 24#include <malloc.h> 25#include <miiphy.h> 26 27#define RSWITCH_SLEEP_US 1000 28#define RSWITCH_TIMEOUT_US 1000000 29 30#define RSWITCH_NUM_HW 5 31 32#define ETHA_TO_GWCA(i) ((i) % 2) 33#define GWCA_TO_HW_INDEX(i) ((i) + 3) 34#define HW_INDEX_TO_GWCA(i) ((i) - 3) 35 36#define RSWITCH_MAX_CTAG_PCP 7 37 38/* Registers */ 39#define RSWITCH_COMA_OFFSET 0x00009000 40#define RSWITCH_ETHA_OFFSET 0x0000a000 /* with RMAC */ 41#define RSWITCH_ETHA_SIZE 0x00002000 /* with RMAC */ 42#define RSWITCH_GWCA_OFFSET 0x00010000 43#define RSWITCH_GWCA_SIZE 0x00002000 44 45#define FWRO 0 46#define CARO RSWITCH_COMA_OFFSET 47#define GWRO 0 48#define TARO 0 49#define RMRO 0x1000 50 51/* List of TSNA registers (ETHA) */ 52#define EAMC (TARO + 0x0000) 53#define EAMS (TARO + 0x0004) 54#define EATDQDCR (TARO + 0x0060) 55#define EATTFC (TARO + 0x0138) 56#define EATASRIRM (TARO + 0x03e4) 57/* Gateway CPU agent block (GWCA) */ 58#define GWMC (GWRO + 0x0000) 59#define GWMS (GWRO + 0x0004) 60#define GWMTIRM (GWRO + 0x0100) 61#define GWVCC (GWRO + 0x0130) 62#define GWTTFC (GWRO + 0x0138) 63#define GWDCBAC0 (GWRO + 0x0194) 64#define GWDCBAC1 (GWRO + 0x0198) 65#define GWTRCR (GWRO + 0x0200) 66#define GWARIRM (GWRO + 0x0380) 67#define GWDCCR (GWRO + 0x0400) 68/* List of Common Agent registers (COMA) */ 69#define RRC (CARO + 0x0004) 70#define RCEC (CARO + 0x0008) 71#define RCDC (CARO + 0x000c) 72#define CABPIRM (CARO + 0x0140) 73/* List of MFWD registers */ 74#define FWPC (FWRO + 0x0100) 75#define FWPBFCR (FWRO + 0x4a00) 76#define FWPBFCSDCR (FWRO + 0x4a04) 77/* List of RMAC registers (RMAC) */ 78#define MPSM (RMRO + 0x0000) 79#define MPIC (RMRO + 0x0004) 80#define MRMAC0 (RMRO + 0x0084) 81#define MRMAC1 (RMRO + 0x0088) 82#define MRAFC (RMRO + 0x008c) 83#define MRSCE (RMRO + 0x0090) 84#define MRSCP (RMRO + 0x0094) 85#define MLVC (RMRO + 0x0180) 86#define MLBC (RMRO + 0x0188) 87#define MXGMIIC (RMRO + 0x0190) 88#define MPCH (RMRO + 0x0194) 89#define MANM (RMRO + 0x019c) 90#define MMIS0 (RMRO + 0x0210) 91#define MMIS1 (RMRO + 0x0220) 92 93/* COMA */ 94#define RRC_RR BIT(0) 95#define RCEC_RCE BIT(16) 96 97#define CABPIRM_BPIOG BIT(0) 98#define CABPIRM_BPR BIT(1) 99 100/* MFWD */ 101#define FWPC0(i) (FWPC + (i) * 0x10) 102#define FWPC0_LTHTA BIT(0) 103#define FWPC0_IP4UE BIT(3) 104#define FWPC0_IP4TE BIT(4) 105#define FWPC0_IP4OE BIT(5) 106#define FWPC0_L2SE BIT(9) 107#define FWPC0_IP4EA BIT(10) 108#define FWPC0_IPDSA BIT(12) 109#define FWPC0_IPHLA BIT(18) 110#define FWPC0_MACSDA BIT(20) 111#define FWPC0_MACHLA BIT(26) 112#define FWPC0_MACHMA BIT(27) 113#define FWPC0_VLANSA BIT(28) 114 115#define FWPC0_DEFAULT (FWPC0_LTHTA | FWPC0_IP4UE | FWPC0_IP4TE | \ 116 FWPC0_IP4OE | FWPC0_L2SE | FWPC0_IP4EA | \ 117 FWPC0_IPDSA | FWPC0_IPHLA | FWPC0_MACSDA | \ 118 FWPC0_MACHLA | FWPC0_MACHMA | FWPC0_VLANSA) 119 120#define FWPBFC(i) (FWPBFCR + (i) * 0x10) 121#define FWPBFCSDC(j, i) (FWPBFCSDCR + (i) * 0x10 + (j) * 0x04) 122 123/* ETHA */ 124#define EATASRIRM_TASRIOG BIT(0) 125#define EATASRIRM_TASRR BIT(1) 126#define EATDQDC(q) (EATDQDCR + (q) * 0x04) 127#define EATDQDC_DQD (0xff) 128 129/* RMAC */ 130#define MPIC_PIS_GMII 0x02 131#define MPIC_LSC_MASK (0x07 << 3) 132#define MPIC_LSC_100 (0x01 << 3) 133#define MPIC_LSC_1000 (0x02 << 3) 134#define MPIC_LSC_2500 (0x03 << 3) 135#define MLVC_PLV BIT(16) 136#define MLVC_LVT 0x09 137#define MMIS0_LVSS 0x02 138 139#define MPIC_PSMCS_MASK (0x7f << 16) 140#define MPIC_PSMHT_MASK (0x06 << 24) 141#define MPIC_MDC_CLK_SET (0x06050000) 142 143#define MPSM_MFF_C45 BIT(2) 144#define MPSM_MFF_C22 0x0 145#define MPSM_PSME BIT(0) 146 147#define MDIO_READ_C45 0x03 148#define MDIO_WRITE_C45 0x01 149#define MDIO_ADDR_C45 0x00 150 151#define MDIO_READ_C22 0x02 152#define MDIO_WRITE_C22 0x01 153 154#define MPSM_POP_MASK (0x03 << 13) 155#define MPSM_PRA_MASK (0x1f << 8) 156#define MPSM_PDA_MASK (0x1f << 3) 157#define MPSM_PRD_MASK (0xffff << 16) 158 159/* Completion flags */ 160#define MMIS1_PAACS BIT(2) /* Address */ 161#define MMIS1_PWACS BIT(1) /* Write */ 162#define MMIS1_PRACS BIT(0) /* Read */ 163#define MMIS1_CLEAR_FLAGS 0xf 164 165/* ETHA */ 166enum rswitch_etha_mode { 167 EAMC_OPC_RESET, 168 EAMC_OPC_DISABLE, 169 EAMC_OPC_CONFIG, 170 EAMC_OPC_OPERATION, 171}; 172 173#define EAMS_OPS_MASK EAMC_OPC_OPERATION 174 175/* GWCA */ 176enum rswitch_gwca_mode { 177 GWMC_OPC_RESET, 178 GWMC_OPC_DISABLE, 179 GWMC_OPC_CONFIG, 180 GWMC_OPC_OPERATION, 181}; 182 183#define GWMS_OPS_MASK GWMC_OPC_OPERATION 184 185#define GWMTIRM_MTIOG BIT(0) 186#define GWMTIRM_MTR BIT(1) 187#define GWARIRM_ARIOG BIT(0) 188#define GWARIRM_ARR BIT(1) 189#define GWVCC_VEM_SC_TAG (0x3 << 16) 190#define GWDCBAC0_DCBAUP (0xff) 191#define GWTRC(i) (GWTRCR + (i) * 0x04) 192#define GWDCC(i) (GWDCCR + (i) * 0x04) 193#define GWDCC_DQT BIT(11) 194#define GWDCC_BALR BIT(24) 195 196struct rswitch_etha { 197 int index; 198 void __iomem *addr; 199 struct phy_device *phydev; 200 struct mii_dev *bus; 201 unsigned char *enetaddr; 202}; 203 204struct rswitch_gwca { 205 int index; 206 void __iomem *addr; 207 int num_chain; 208}; 209 210/* Setting value */ 211#define LINK_SPEED_100 100 212#define LINK_SPEED_1000 1000 213#define LINK_SPEED_2500 2500 214 215/* Decriptor */ 216#define RSWITCH_NUM_BASE_DESC 2 217#define RSWITCH_TX_CHAIN_INDEX 0 218#define RSWITCH_RX_CHAIN_INDEX 1 219#define RSWITCH_NUM_TX_DESC 8 220#define RSWITCH_NUM_RX_DESC 8 221 222enum RX_DS_CC_BIT { 223 RX_DS = 0x0fff, /* Data size */ 224 RX_TR = 0x1000, /* Truncation indication */ 225 RX_EI = 0x2000, /* Error indication */ 226 RX_PS = 0xc000, /* Padding selection */ 227}; 228 229enum DIE_DT { 230 /* Frame data */ 231 DT_FSINGLE = 0x80, 232 DT_FSTART = 0x90, 233 DT_FMID = 0xa0, 234 DT_FEND = 0xb8, 235 236 /* Chain control */ 237 DT_LEMPTY = 0xc0, 238 DT_EEMPTY = 0xd0, 239 DT_LINKFIX = 0x00, 240 DT_LINK = 0xe0, 241 DT_EOS = 0xf0, 242 /* HW/SW arbitration */ 243 DT_FEMPTY = 0x40, 244 DT_FEMPTY_IS = 0x10, 245 DT_FEMPTY_IC = 0x20, 246 DT_FEMPTY_ND = 0x38, 247 DT_FEMPTY_START = 0x50, 248 DT_FEMPTY_MID = 0x60, 249 DT_FEMPTY_END = 0x70, 250 251 DT_MASK = 0xf0, 252 DIE = 0x08, /* Descriptor Interrupt Enable */ 253}; 254 255struct rswitch_desc { 256 __le16 info_ds; /* Descriptor size */ 257 u8 die_dt; /* Descriptor interrupt enable and type */ 258 __u8 dptrh; /* Descriptor pointer MSB */ 259 __le32 dptrl; /* Descriptor pointer LSW */ 260} __packed; 261 262struct rswitch_rxdesc { 263 struct rswitch_desc data; 264 struct rswitch_desc link; 265 u8 __pad[48]; 266 u8 packet[PKTSIZE_ALIGN]; 267} __packed; 268 269struct rswitch_port_priv { 270 void __iomem *addr; 271 struct phy serdes; 272 struct rswitch_etha etha; 273 struct rswitch_gwca gwca; 274 struct rswitch_desc bat_desc[RSWITCH_NUM_BASE_DESC]; 275 struct rswitch_desc tx_desc[RSWITCH_NUM_TX_DESC]; 276 struct rswitch_rxdesc rx_desc[RSWITCH_NUM_RX_DESC]; 277 u32 rx_desc_index; 278 u32 tx_desc_index; 279}; 280 281struct rswitch_priv { 282 void __iomem *addr; 283 struct clk *rsw_clk; 284}; 285 286static inline void rswitch_flush_dcache(u32 addr, u32 len) 287{ 288 flush_dcache_range(addr, addr + len); 289} 290 291static inline void rswitch_invalidate_dcache(u32 addr, u32 len) 292{ 293 u32 start = addr & ~((uintptr_t)ARCH_DMA_MINALIGN - 1); 294 u32 end = roundup(addr + len, ARCH_DMA_MINALIGN); 295 296 invalidate_dcache_range(start, end); 297} 298 299static void rswitch_agent_clock_ctrl(struct rswitch_port_priv *priv, int port, int enable) 300{ 301 u32 val; 302 303 if (enable) { 304 val = readl(priv->addr + RCEC); 305 if ((val & (RCEC_RCE | BIT(port))) != (RCEC_RCE | BIT(port))) 306 writel(val | RCEC_RCE | BIT(port), priv->addr + RCEC); 307 } else { 308 setbits_le32(priv->addr + RCDC, BIT(port)); 309 } 310} 311 312static int rswitch_etha_change_mode(struct rswitch_port_priv *priv, 313 enum rswitch_etha_mode mode) 314{ 315 struct rswitch_etha *etha = &priv->etha; 316 u32 pval; 317 int ret; 318 319 /* Enable clock */ 320 rswitch_agent_clock_ctrl(priv, etha->index, 1); 321 322 writel(mode, etha->addr + EAMC); 323 324 ret = readl_poll_sleep_timeout(etha->addr + EAMS, pval, 325 (pval & EAMS_OPS_MASK) == mode, 326 RSWITCH_SLEEP_US, RSWITCH_TIMEOUT_US); 327 328 /* Disable clock */ 329 if (mode == EAMC_OPC_DISABLE) 330 rswitch_agent_clock_ctrl(priv, etha->index, 0); 331 332 return ret; 333} 334 335static int rswitch_gwca_change_mode(struct rswitch_port_priv *priv, 336 enum rswitch_gwca_mode mode) 337{ 338 struct rswitch_gwca *gwca = &priv->gwca; 339 u32 pval; 340 int ret; 341 342 /* Enable clock */ 343 rswitch_agent_clock_ctrl(priv, gwca->index, 1); 344 345 writel(mode, gwca->addr + GWMC); 346 347 ret = readl_poll_sleep_timeout(gwca->addr + GWMS, pval, 348 (pval & GWMS_OPS_MASK) == mode, 349 RSWITCH_SLEEP_US, RSWITCH_TIMEOUT_US); 350 351 /* Disable clock */ 352 if (mode == GWMC_OPC_DISABLE) 353 rswitch_agent_clock_ctrl(priv, gwca->index, 0); 354 355 return ret; 356} 357 358static int rswitch_mii_access_c22(struct rswitch_etha *etha, bool read, 359 int phyad, int regad, int data) 360{ 361 const u32 pop = read ? MDIO_READ_C22 : MDIO_WRITE_C22; 362 u32 val, pval; 363 int ret; 364 365 /* Clear Station Management Mode : Clause 22 */ 366 clrbits_le32(etha->addr + MPSM, MPSM_MFF_C45); 367 368 /* Clear completion flags */ 369 writel(MMIS1_CLEAR_FLAGS, etha->addr + MMIS1); 370 371 /* Submit C22 access to PHY */ 372 val = MPSM_PSME | (pop << 13) | (regad << 8) | (phyad << 3); 373 if (!read) 374 val |= data << 16; 375 writel(val, etha->addr + MPSM); 376 377 ret = readl_poll_sleep_timeout(etha->addr + MPSM, pval, 378 !(pval & MPSM_PSME), 379 RSWITCH_SLEEP_US, 380 RSWITCH_TIMEOUT_US); 381 if (ret) 382 return ret; 383 384 if (!read) 385 return 0; 386 387 /* Read data */ 388 ret = (readl(etha->addr + MPSM) & MPSM_PRD_MASK) >> 16; 389 390 /* Clear read completion flag */ 391 setbits_le32(etha->addr + MMIS1, MMIS1_PRACS); 392 393 return ret; 394} 395 396static int rswitch_mii_access_c45(struct rswitch_etha *etha, bool read, 397 int phyad, int devad, int regad, int data) 398{ 399 u32 pval, val; 400 int ret; 401 402 /* Set Station Management Mode : Clause 45 */ 403 setbits_le32(etha->addr + MPSM, MPSM_MFF_C45); 404 405 /* Clear completion flags */ 406 writel(MMIS1_CLEAR_FLAGS, etha->addr + MMIS1); 407 408 /* Submit address to PHY (MDIO_ADDR_C45 << 13) */ 409 val = MPSM_PSME | MPSM_MFF_C45 | (devad << 8) | (phyad << 3); 410 writel((regad << 16) | val, etha->addr + MPSM); 411 412 ret = readl_poll_sleep_timeout(etha->addr + MMIS1, pval, 413 pval & MMIS1_PAACS, 414 RSWITCH_SLEEP_US, RSWITCH_TIMEOUT_US); 415 if (ret) 416 return ret; 417 418 /* Clear address completion flag */ 419 setbits_le32(etha->addr + MMIS1, MMIS1_PAACS); 420 421 /* Read/Write PHY register */ 422 if (read) { 423 val |= MDIO_READ_C45 << 13; 424 writel(val, etha->addr + MPSM); 425 426 ret = readl_poll_sleep_timeout(etha->addr + MMIS1, pval, 427 pval & MMIS1_PRACS, 428 RSWITCH_SLEEP_US, 429 RSWITCH_TIMEOUT_US); 430 if (ret) 431 return ret; 432 433 /* Read data */ 434 ret = (readl(etha->addr + MPSM) & MPSM_PRD_MASK) >> 16; 435 436 /* Clear read completion flag */ 437 setbits_le32(etha->addr + MMIS1, MMIS1_PRACS); 438 } else { 439 val |= MDIO_WRITE_C45 << 13; 440 val |= data << 16; 441 writel(val, etha->addr + MPSM); 442 443 ret = readl_poll_sleep_timeout(etha->addr + MMIS1, pval, 444 pval & MMIS1_PWACS, 445 RSWITCH_SLEEP_US, 446 RSWITCH_TIMEOUT_US); 447 } 448 449 return ret; 450} 451 452static int rswitch_mii_read_c45(struct mii_dev *miidev, int phyad, int devad, int regad) 453{ 454 struct rswitch_port_priv *priv = miidev->priv; 455 struct rswitch_etha *etha = &priv->etha; 456 int val; 457 458 /* Change to disable mode */ 459 rswitch_etha_change_mode(priv, EAMC_OPC_DISABLE); 460 461 /* Change to config mode */ 462 rswitch_etha_change_mode(priv, EAMC_OPC_CONFIG); 463 464 /* Enable Station Management clock */ 465 clrsetbits_le32(etha->addr + MPIC, 466 MPIC_PSMCS_MASK | MPIC_PSMHT_MASK, 467 MPIC_MDC_CLK_SET); 468 469 /* Access PHY register */ 470 if (devad != MDIO_DEVAD_NONE) /* Definitelly C45 */ 471 val = rswitch_mii_access_c45(etha, true, phyad, devad, regad, 0); 472 else if (etha->phydev->is_c45) /* C22 access to C45 PHY */ 473 val = rswitch_mii_access_c45(etha, true, phyad, 1, regad, 0); 474 else 475 val = rswitch_mii_access_c22(etha, true, phyad, regad, 0); 476 477 /* Disable Station Management Clock */ 478 clrbits_le32(etha->addr + MPIC, MPIC_PSMCS_MASK); 479 480 /* Change to disable mode */ 481 rswitch_etha_change_mode(priv, EAMC_OPC_DISABLE); 482 483 return val; 484} 485 486int rswitch_mii_write_c45(struct mii_dev *miidev, int phyad, int devad, int regad, u16 data) 487{ 488 struct rswitch_port_priv *priv = miidev->priv; 489 struct rswitch_etha *etha = &priv->etha; 490 491 /* Change to disable mode */ 492 rswitch_etha_change_mode(priv, EAMC_OPC_DISABLE); 493 494 /* Change to config mode */ 495 rswitch_etha_change_mode(priv, EAMC_OPC_CONFIG); 496 497 /* Enable Station Management clock */ 498 clrsetbits_le32(etha->addr + MPIC, 499 MPIC_PSMCS_MASK | MPIC_PSMHT_MASK, 500 MPIC_MDC_CLK_SET); 501 502 /* Access PHY register */ 503 if (devad != MDIO_DEVAD_NONE) /* Definitelly C45 */ 504 rswitch_mii_access_c45(etha, false, phyad, devad, regad, data); 505 else if (etha->phydev->is_c45) /* C22 access to C45 PHY */ 506 rswitch_mii_access_c45(etha, false, phyad, 1, regad, data); 507 else 508 rswitch_mii_access_c22(etha, false, phyad, regad, data); 509 510 /* Disable Station Management Clock */ 511 clrbits_le32(etha->addr + MPIC, MPIC_PSMCS_MASK); 512 513 /* Change to disable mode */ 514 rswitch_etha_change_mode(priv, EAMC_OPC_DISABLE); 515 516 return 0; 517} 518 519static int rswitch_check_link(struct rswitch_etha *etha) 520{ 521 u32 pval; 522 int ret; 523 524 /* Request Link Verification */ 525 writel(MLVC_PLV, etha->addr + MLVC); 526 527 /* Complete Link Verification */ 528 ret = readl_poll_sleep_timeout(etha->addr + MLVC, pval, 529 !(pval & MLVC_PLV), 530 RSWITCH_SLEEP_US, RSWITCH_TIMEOUT_US); 531 if (ret) { 532 debug("\n%s: Link verification timeout!", __func__); 533 return ret; 534 } 535 536 return 0; 537} 538 539static int rswitch_reset(struct rswitch_port_priv *priv) 540{ 541 int ret; 542 543 setbits_le32(priv->addr + RRC, RRC_RR); 544 clrbits_le32(priv->addr + RRC, RRC_RR); 545 546 ret = rswitch_gwca_change_mode(priv, GWMC_OPC_DISABLE); 547 if (ret) 548 return ret; 549 550 ret = rswitch_etha_change_mode(priv, EAMC_OPC_DISABLE); 551 if (ret) 552 return ret; 553 554 return 0; 555} 556 557static void rswitch_bat_desc_init(struct rswitch_port_priv *priv) 558{ 559 const u32 desc_size = RSWITCH_NUM_BASE_DESC * sizeof(struct rswitch_desc); 560 int i; 561 562 /* Initialize all descriptors */ 563 memset(priv->bat_desc, 0x0, desc_size); 564 565 for (i = 0; i < RSWITCH_NUM_BASE_DESC; i++) 566 priv->bat_desc[i].die_dt = DT_EOS; 567 568 rswitch_flush_dcache((uintptr_t)priv->bat_desc, desc_size); 569} 570 571static void rswitch_tx_desc_init(struct rswitch_port_priv *priv) 572{ 573 const u32 desc_size = RSWITCH_NUM_TX_DESC * sizeof(struct rswitch_desc); 574 u64 tx_desc_addr; 575 int i; 576 577 /* Initialize all descriptor */ 578 memset(priv->tx_desc, 0x0, desc_size); 579 priv->tx_desc_index = 0; 580 581 for (i = 0; i < RSWITCH_NUM_TX_DESC; i++) 582 priv->tx_desc[i].die_dt = DT_EEMPTY; 583 584 /* Mark the end of the descriptors */ 585 priv->tx_desc[RSWITCH_NUM_TX_DESC - 1].die_dt = DT_LINKFIX; 586 tx_desc_addr = (uintptr_t)priv->tx_desc; 587 priv->tx_desc[RSWITCH_NUM_TX_DESC - 1].dptrl = lower_32_bits(tx_desc_addr); 588 priv->tx_desc[RSWITCH_NUM_TX_DESC - 1].dptrh = upper_32_bits(tx_desc_addr); 589 rswitch_flush_dcache(tx_desc_addr, desc_size); 590 591 /* Point the controller to the TX descriptor list */ 592 priv->bat_desc[RSWITCH_TX_CHAIN_INDEX].die_dt = DT_LINKFIX; 593 priv->bat_desc[RSWITCH_TX_CHAIN_INDEX].dptrl = lower_32_bits(tx_desc_addr); 594 priv->bat_desc[RSWITCH_TX_CHAIN_INDEX].dptrh = upper_32_bits(tx_desc_addr); 595 rswitch_flush_dcache((uintptr_t)&priv->bat_desc[RSWITCH_TX_CHAIN_INDEX], 596 sizeof(struct rswitch_desc)); 597} 598 599static void rswitch_rx_desc_init(struct rswitch_port_priv *priv) 600{ 601 const u32 desc_size = RSWITCH_NUM_RX_DESC * sizeof(struct rswitch_rxdesc); 602 int i; 603 u64 packet_addr; 604 u64 next_rx_desc_addr; 605 u64 rx_desc_addr; 606 607 /* Initialize all descriptor */ 608 memset(priv->rx_desc, 0x0, desc_size); 609 priv->rx_desc_index = 0; 610 611 for (i = 0; i < RSWITCH_NUM_RX_DESC; i++) { 612 priv->rx_desc[i].data.die_dt = DT_EEMPTY; 613 priv->rx_desc[i].data.info_ds = PKTSIZE_ALIGN; 614 packet_addr = (uintptr_t)priv->rx_desc[i].packet; 615 priv->rx_desc[i].data.dptrl = lower_32_bits(packet_addr); 616 priv->rx_desc[i].data.dptrh = upper_32_bits(packet_addr); 617 618 priv->rx_desc[i].link.die_dt = DT_LINKFIX; 619 next_rx_desc_addr = (uintptr_t)&priv->rx_desc[i + 1]; 620 priv->rx_desc[i].link.dptrl = lower_32_bits(next_rx_desc_addr); 621 priv->rx_desc[i].link.dptrh = upper_32_bits(next_rx_desc_addr); 622 } 623 624 /* Mark the end of the descriptors */ 625 priv->rx_desc[RSWITCH_NUM_RX_DESC - 1].link.die_dt = DT_LINKFIX; 626 rx_desc_addr = (uintptr_t)priv->rx_desc; 627 priv->rx_desc[RSWITCH_NUM_RX_DESC - 1].link.dptrl = lower_32_bits(rx_desc_addr); 628 priv->rx_desc[RSWITCH_NUM_RX_DESC - 1].link.dptrh = upper_32_bits(rx_desc_addr); 629 rswitch_flush_dcache(rx_desc_addr, desc_size); 630 631 /* Point the controller to the rx descriptor list */ 632 priv->bat_desc[RSWITCH_RX_CHAIN_INDEX].die_dt = DT_LINKFIX; 633 priv->bat_desc[RSWITCH_RX_CHAIN_INDEX].dptrl = lower_32_bits(rx_desc_addr); 634 priv->bat_desc[RSWITCH_RX_CHAIN_INDEX].dptrh = upper_32_bits(rx_desc_addr); 635 rswitch_flush_dcache((uintptr_t)&priv->bat_desc[RSWITCH_RX_CHAIN_INDEX], 636 sizeof(struct rswitch_desc)); 637} 638 639static void rswitch_clock_enable(struct rswitch_port_priv *priv) 640{ 641 struct rswitch_etha *etha = &priv->etha; 642 struct rswitch_gwca *gwca = &priv->gwca; 643 644 setbits_le32(priv->addr + RCEC, BIT(etha->index) | BIT(gwca->index) | RCEC_RCE); 645} 646 647static int rswitch_bpool_init(struct rswitch_port_priv *priv) 648{ 649 u32 pval; 650 651 writel(CABPIRM_BPIOG, priv->addr + CABPIRM); 652 653 return readl_poll_sleep_timeout(priv->addr + CABPIRM, pval, 654 pval & CABPIRM_BPR, 655 RSWITCH_SLEEP_US, RSWITCH_TIMEOUT_US); 656} 657 658static void rswitch_mfwd_init(struct rswitch_port_priv *priv) 659{ 660 struct rswitch_etha *etha = &priv->etha; 661 struct rswitch_gwca *gwca = &priv->gwca; 662 663 writel(FWPC0_DEFAULT, priv->addr + FWPC0(etha->index)); 664 writel(FWPC0_DEFAULT, priv->addr + FWPC0(gwca->index)); 665 666 writel(RSWITCH_RX_CHAIN_INDEX, 667 priv->addr + FWPBFCSDC(HW_INDEX_TO_GWCA(gwca->index), etha->index)); 668 669 writel(BIT(gwca->index), 670 priv->addr + FWPBFC(etha->index)); 671 672 writel(BIT(etha->index), 673 priv->addr + FWPBFC(gwca->index)); 674} 675 676static void rswitch_rmac_init(struct rswitch_etha *etha) 677{ 678 unsigned char *mac = etha->enetaddr; 679 680 /* Set MAC address */ 681 writel((mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5], 682 etha->addr + MRMAC1); 683 684 writel((mac[0] << 8) | mac[1], etha->addr + MRMAC0); 685 686 /* Set MIIx */ 687 writel(MPIC_PIS_GMII | MPIC_LSC_1000, etha->addr + MPIC); 688 689 writel(0x07E707E7, etha->addr + MRAFC); 690} 691 692static int rswitch_gwca_mcast_table_reset(struct rswitch_gwca *gwca) 693{ 694 u32 pval; 695 696 writel(GWMTIRM_MTIOG, gwca->addr + GWMTIRM); 697 698 return readl_poll_sleep_timeout(gwca->addr + GWMTIRM, pval, 699 pval & GWMTIRM_MTR, 700 RSWITCH_SLEEP_US, RSWITCH_TIMEOUT_US); 701} 702 703static int rswitch_gwca_axi_ram_reset(struct rswitch_gwca *gwca) 704{ 705 u32 pval; 706 707 writel(GWARIRM_ARIOG, gwca->addr + GWARIRM); 708 709 return readl_poll_sleep_timeout(gwca->addr + GWARIRM, pval, 710 pval & GWARIRM_ARR, 711 RSWITCH_SLEEP_US, RSWITCH_TIMEOUT_US); 712} 713 714static int rswitch_gwca_init(struct rswitch_port_priv *priv) 715{ 716 struct rswitch_gwca *gwca = &priv->gwca; 717 int ret; 718 719 ret = rswitch_gwca_change_mode(priv, GWMC_OPC_DISABLE); 720 if (ret) 721 return ret; 722 723 ret = rswitch_gwca_change_mode(priv, GWMC_OPC_CONFIG); 724 if (ret) 725 return ret; 726 727 ret = rswitch_gwca_mcast_table_reset(gwca); 728 if (ret) 729 return ret; 730 731 ret = rswitch_gwca_axi_ram_reset(gwca); 732 if (ret) 733 return ret; 734 735 /* Setting flow */ 736 writel(GWVCC_VEM_SC_TAG, gwca->addr + GWVCC); 737 writel(0, gwca->addr + GWTTFC); 738 writel(upper_32_bits((uintptr_t)priv->bat_desc) & GWDCBAC0_DCBAUP, gwca->addr + GWDCBAC0); 739 writel(lower_32_bits((uintptr_t)priv->bat_desc), gwca->addr + GWDCBAC1); 740 writel(GWDCC_DQT | GWDCC_BALR, gwca->addr + GWDCC(RSWITCH_TX_CHAIN_INDEX)); 741 writel(GWDCC_BALR, gwca->addr + GWDCC(RSWITCH_RX_CHAIN_INDEX)); 742 743 ret = rswitch_gwca_change_mode(priv, GWMC_OPC_DISABLE); 744 if (ret) 745 return ret; 746 747 ret = rswitch_gwca_change_mode(priv, GWMC_OPC_OPERATION); 748 if (ret) 749 return ret; 750 751 return 0; 752} 753 754static int rswitch_etha_tas_ram_reset(struct rswitch_etha *etha) 755{ 756 u32 pval; 757 758 writel(EATASRIRM_TASRIOG, etha->addr + EATASRIRM); 759 760 return readl_poll_sleep_timeout(etha->addr + EATASRIRM, pval, 761 pval & EATASRIRM_TASRR, 762 RSWITCH_SLEEP_US, RSWITCH_TIMEOUT_US); 763} 764 765static int rswitch_etha_init(struct rswitch_port_priv *priv) 766{ 767 struct rswitch_etha *etha = &priv->etha; 768 int ret; 769 u32 prio; 770 771 ret = rswitch_etha_change_mode(priv, EAMC_OPC_DISABLE); 772 if (ret) 773 return ret; 774 775 ret = rswitch_etha_change_mode(priv, EAMC_OPC_CONFIG); 776 if (ret) 777 return ret; 778 779 ret = rswitch_etha_tas_ram_reset(etha); 780 if (ret) 781 return ret; 782 783 /* Setting flow */ 784 writel(0, etha->addr + EATTFC); 785 786 for (prio = 0; prio < RSWITCH_MAX_CTAG_PCP; prio++) 787 writel(EATDQDC_DQD, etha->addr + EATDQDC(prio)); 788 789 rswitch_rmac_init(etha); 790 791 ret = rswitch_etha_change_mode(priv, EAMC_OPC_OPERATION); 792 if (ret) 793 return ret; 794 795 /* Link Verification */ 796 ret = rswitch_check_link(etha); 797 if (ret) 798 return ret; 799 800 return 0; 801} 802 803static int rswitch_init(struct rswitch_port_priv *priv) 804{ 805 struct rswitch_etha *etha = &priv->etha; 806 int ret; 807 808 ret = rswitch_reset(priv); 809 if (ret) 810 return ret; 811 812 ret = generic_phy_set_mode(&priv->serdes, PHY_MODE_ETHERNET, 813 etha->phydev->interface); 814 if (ret) 815 return ret; 816 817 ret = generic_phy_set_speed(&priv->serdes, etha->phydev->speed); 818 if (ret) 819 return ret; 820 821 ret = generic_phy_init(&priv->serdes); 822 if (ret) 823 return ret; 824 825 ret = generic_phy_power_on(&priv->serdes); 826 if (ret) 827 return ret; 828 829 ret = phy_startup(etha->phydev); 830 if (ret) 831 return ret; 832 833 rswitch_bat_desc_init(priv); 834 rswitch_tx_desc_init(priv); 835 rswitch_rx_desc_init(priv); 836 837 rswitch_clock_enable(priv); 838 839 ret = rswitch_bpool_init(priv); 840 if (ret) 841 return ret; 842 843 rswitch_mfwd_init(priv); 844 845 ret = rswitch_gwca_init(priv); 846 if (ret) 847 return ret; 848 849 ret = rswitch_etha_init(priv); 850 if (ret) 851 return ret; 852 853 return 0; 854} 855 856static int rswitch_start(struct udevice *dev) 857{ 858 struct rswitch_port_priv *priv = dev_get_priv(dev); 859 int ret; 860 861 ret = rswitch_init(priv); 862 if (ret) 863 return ret; 864 865 return 0; 866} 867 868#define RSWITCH_TX_TIMEOUT_MS 1000 869static int rswitch_send(struct udevice *dev, void *packet, int len) 870{ 871 struct rswitch_port_priv *priv = dev_get_priv(dev); 872 struct rswitch_desc *desc = &priv->tx_desc[priv->tx_desc_index]; 873 struct rswitch_gwca *gwca = &priv->gwca; 874 u32 gwtrc_index, start; 875 876 /* Update TX descriptor */ 877 rswitch_flush_dcache((uintptr_t)packet, len); 878 rswitch_invalidate_dcache((uintptr_t)desc, sizeof(*desc)); 879 memset(desc, 0x0, sizeof(*desc)); 880 desc->die_dt = DT_FSINGLE; 881 desc->info_ds = len; 882 desc->dptrl = lower_32_bits((uintptr_t)packet); 883 desc->dptrh = upper_32_bits((uintptr_t)packet); 884 rswitch_flush_dcache((uintptr_t)desc, sizeof(*desc)); 885 886 /* Start transmission */ 887 gwtrc_index = RSWITCH_TX_CHAIN_INDEX / 32; 888 setbits_le32(gwca->addr + GWTRC(gwtrc_index), BIT(RSWITCH_TX_CHAIN_INDEX)); 889 890 /* Wait until packet is transmitted */ 891 start = get_timer(0); 892 while (get_timer(start) < RSWITCH_TX_TIMEOUT_MS) { 893 rswitch_invalidate_dcache((uintptr_t)desc, sizeof(*desc)); 894 if ((desc->die_dt & DT_MASK) != DT_FSINGLE) 895 break; 896 udelay(10); 897 } 898 899 if (get_timer(start) >= RSWITCH_TX_TIMEOUT_MS) { 900 dev_dbg(dev, "\n%s: Timeout", __func__); 901 return -ETIMEDOUT; 902 } 903 904 priv->tx_desc_index = (priv->tx_desc_index + 1) % (RSWITCH_NUM_TX_DESC - 1); 905 906 return 0; 907} 908 909static int rswitch_recv(struct udevice *dev, int flags, uchar **packetp) 910{ 911 struct rswitch_port_priv *priv = dev_get_priv(dev); 912 struct rswitch_rxdesc *desc = &priv->rx_desc[priv->rx_desc_index]; 913 u8 *packet; 914 int len; 915 916 /* Check if the rx descriptor is ready */ 917 rswitch_invalidate_dcache((uintptr_t)desc, sizeof(*desc)); 918 if ((desc->data.die_dt & DT_MASK) == DT_FEMPTY) 919 return -EAGAIN; 920 921 len = desc->data.info_ds & RX_DS; 922 packet = (u8 *)(((uintptr_t)(desc->data.dptrh) << 32) | (uintptr_t)desc->data.dptrl); 923 rswitch_invalidate_dcache((uintptr_t)packet, len); 924 925 *packetp = packet; 926 927 return len; 928} 929 930static int rswitch_free_pkt(struct udevice *dev, uchar *packet, int length) 931{ 932 struct rswitch_port_priv *priv = dev_get_priv(dev); 933 struct rswitch_rxdesc *desc = &priv->rx_desc[priv->rx_desc_index]; 934 935 /* Make current descritor available again */ 936 desc->data.die_dt = DT_FEMPTY; 937 desc->data.info_ds = PKTSIZE_ALIGN; 938 rswitch_flush_dcache((uintptr_t)desc, sizeof(*desc)); 939 940 /* Point to the next descriptor */ 941 priv->rx_desc_index = (priv->rx_desc_index + 1) % RSWITCH_NUM_RX_DESC; 942 desc = &priv->rx_desc[priv->rx_desc_index]; 943 rswitch_invalidate_dcache((uintptr_t)desc, sizeof(*desc)); 944 945 return 0; 946} 947 948static void rswitch_stop(struct udevice *dev) 949{ 950 struct rswitch_port_priv *priv = dev_get_priv(dev); 951 952 phy_shutdown(priv->etha.phydev); 953 954 generic_phy_power_off(&priv->serdes); 955} 956 957static int rswitch_write_hwaddr(struct udevice *dev) 958{ 959 struct rswitch_port_priv *priv = dev_get_priv(dev); 960 struct rswitch_etha *etha = &priv->etha; 961 struct eth_pdata *pdata = dev_get_plat(dev); 962 unsigned char *mac = pdata->enetaddr; 963 964 writel((mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5], 965 etha->addr + MRMAC1); 966 967 writel((mac[0] << 8) | mac[1], etha->addr + MRMAC0); 968 969 return 0; 970} 971 972static int rswitch_phy_config(struct udevice *dev) 973{ 974 struct rswitch_port_priv *priv = dev_get_priv(dev); 975 struct rswitch_etha *etha = &priv->etha; 976 struct eth_pdata *pdata = dev_get_plat(dev); 977 struct phy_device *phydev; 978 int phy_addr; 979 980 phy_addr = eth_phy_get_addr(dev); 981 if (phy_addr < 0) 982 return phy_addr; 983 984 phydev = phy_connect(etha->bus, phy_addr, dev, pdata->phy_interface); 985 if (!phydev) 986 return -ENODEV; 987 988 etha->phydev = phydev; 989 phydev->speed = SPEED_1000; 990 991 phy_config(phydev); 992 993 return 0; 994} 995 996static int rswitch_port_probe(struct udevice *dev) 997{ 998 struct rswitch_priv *rpriv = 999 (struct rswitch_priv *)dev_get_driver_data(dev); 1000 struct eth_pdata *pdata = dev_get_plat(dev); 1001 struct rswitch_port_priv *priv = dev_get_priv(dev); 1002 struct rswitch_etha *etha = &priv->etha; 1003 struct rswitch_gwca *gwca = &priv->gwca; 1004 struct mii_dev *mdiodev; 1005 int ret; 1006 1007 priv->addr = rpriv->addr; 1008 1009 etha->enetaddr = pdata->enetaddr; 1010 1011 etha->index = dev_read_u32_default(dev, "reg", 0); 1012 etha->addr = priv->addr + RSWITCH_ETHA_OFFSET + etha->index * RSWITCH_ETHA_SIZE; 1013 1014 gwca->index = 1; 1015 gwca->addr = priv->addr + RSWITCH_GWCA_OFFSET + gwca->index * RSWITCH_GWCA_SIZE; 1016 gwca->index = GWCA_TO_HW_INDEX(gwca->index); 1017 1018 ret = generic_phy_get_by_index(dev, 0, &priv->serdes); 1019 if (ret) 1020 return ret; 1021 1022 /* Toggle the reset so we can access the PHYs */ 1023 ret = rswitch_reset(priv); 1024 if (ret) 1025 return ret; 1026 1027 mdiodev = mdio_alloc(); 1028 if (!mdiodev) 1029 return -ENOMEM; 1030 1031 mdiodev->priv = priv; 1032 mdiodev->read = rswitch_mii_read_c45; 1033 mdiodev->write = rswitch_mii_write_c45; 1034 snprintf(mdiodev->name, sizeof(mdiodev->name), dev->name); 1035 1036 ret = mdio_register(mdiodev); 1037 if (ret) 1038 goto err_mdio_register; 1039 1040 priv->etha.bus = miiphy_get_dev_by_name(dev->name); 1041 1042 ret = rswitch_phy_config(dev); 1043 if (ret) 1044 goto err_mdio_register; 1045 1046 return 0; 1047 1048err_mdio_register: 1049 mdio_free(mdiodev); 1050 return ret; 1051} 1052 1053static int rswitch_port_remove(struct udevice *dev) 1054{ 1055 struct rswitch_port_priv *priv = dev_get_priv(dev); 1056 1057 mdio_unregister(priv->etha.bus); 1058 free(priv->etha.phydev); 1059 1060 return 0; 1061} 1062 1063int rswitch_ofdata_to_platdata(struct udevice *dev) 1064{ 1065 struct eth_pdata *pdata = dev_get_plat(dev); 1066 1067 pdata->phy_interface = dev_read_phy_mode(dev); 1068 if (pdata->phy_interface == PHY_INTERFACE_MODE_NA) 1069 return -EINVAL; 1070 1071 pdata->max_speed = dev_read_u32_default(dev, "max-speed", 1000); 1072 1073 return 0; 1074} 1075 1076static const struct eth_ops rswitch_port_ops = { 1077 .start = rswitch_start, 1078 .send = rswitch_send, 1079 .recv = rswitch_recv, 1080 .free_pkt = rswitch_free_pkt, 1081 .stop = rswitch_stop, 1082 .write_hwaddr = rswitch_write_hwaddr, 1083}; 1084 1085U_BOOT_DRIVER(rswitch_port) = { 1086 .name = "rswitch-port", 1087 .id = UCLASS_ETH, 1088 .of_to_plat = rswitch_ofdata_to_platdata, 1089 .probe = rswitch_port_probe, 1090 .remove = rswitch_port_remove, 1091 .ops = &rswitch_port_ops, 1092 .priv_auto = sizeof(struct rswitch_port_priv), 1093 .plat_auto = sizeof(struct eth_pdata), 1094 .flags = DM_FLAG_ALLOC_PRIV_DMA | DM_FLAG_OS_PREPARE, 1095}; 1096 1097static int rswitch_probe(struct udevice *dev) 1098{ 1099 struct rswitch_priv *priv = dev_get_plat(dev); 1100 fdt_addr_t secure_base; 1101 fdt_size_t size; 1102 int ret; 1103 1104 secure_base = dev_read_addr_size_name(dev, "secure_base", &size); 1105 if (!secure_base) 1106 return -EINVAL; 1107 1108 priv->addr = map_physmem(secure_base, size, MAP_NOCACHE); 1109 if (!priv->addr) 1110 return -EINVAL; 1111 1112 priv->rsw_clk = devm_clk_get(dev, NULL); 1113 if (ret) 1114 goto err_map; 1115 1116 ret = clk_prepare_enable(priv->rsw_clk); 1117 if (ret) 1118 goto err_map; 1119 1120 return 0; 1121 1122err_map: 1123 unmap_physmem(priv->addr, MAP_NOCACHE); 1124 return ret; 1125} 1126 1127static int rswitch_remove(struct udevice *dev) 1128{ 1129 struct rswitch_priv *priv = dev_get_plat(dev); 1130 1131 clk_disable_unprepare(priv->rsw_clk); 1132 unmap_physmem(priv->addr, MAP_NOCACHE); 1133 1134 return 0; 1135} 1136 1137static int rswitch_bind(struct udevice *parent) 1138{ 1139 struct rswitch_port_priv *priv = dev_get_plat(parent); 1140 ofnode ports_np, node; 1141 struct udevice *dev; 1142 struct driver *drv; 1143 int ret; 1144 1145 drv = lists_driver_lookup_name("rswitch-port"); 1146 if (!drv) 1147 return -ENOENT; 1148 1149 ports_np = dev_read_subnode(parent, "ethernet-ports"); 1150 if (!ofnode_valid(ports_np)) 1151 return -ENOENT; 1152 1153 ofnode_for_each_subnode(node, ports_np) { 1154 if (!ofnode_is_enabled(node)) 1155 continue; 1156 1157 ret = device_bind_with_driver_data(parent, drv, 1158 ofnode_get_name(node), 1159 (ulong)priv, node, &dev); 1160 if (ret) 1161 return ret; 1162 } 1163 1164 return 0; 1165} 1166 1167static const struct udevice_id rswitch_ids[] = { 1168 { .compatible = "renesas,r8a779f0-ether-switch" }, 1169 { } 1170}; 1171 1172U_BOOT_DRIVER(rswitch) = { 1173 .name = "rswitch", 1174 .id = UCLASS_NOP, 1175 .of_match = rswitch_ids, 1176 .bind = rswitch_bind, 1177 .probe = rswitch_probe, 1178 .remove = rswitch_remove, 1179 .plat_auto = sizeof(struct rswitch_priv), 1180};