1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2005-2006 Atmel Corporation 4 */ 5 #include <common.h> 6 #include <clk.h> 7 #include <dm.h> 8 9 /* 10 * The u-boot networking stack is a little weird. It seems like the 11 * networking core allocates receive buffers up front without any 12 * regard to the hardware that's supposed to actually receive those 13 * packets. 14 * 15 * The MACB receives packets into 128-byte receive buffers, so the 16 * buffers allocated by the core isn't very practical to use. We'll 17 * allocate our own, but we need one such buffer in case a packet 18 * wraps around the DMA ring so that we have to copy it. 19 * 20 * Therefore, define CONFIG_SYS_RX_ETH_BUFFER to 1 in the board-specific 21 * configuration header. This way, the core allocates one RX buffer 22 * and one TX buffer, each of which can hold a ethernet packet of 23 * maximum size. 24 * 25 * For some reason, the networking core unconditionally specifies a 26 * 32-byte packet "alignment" (which really should be called 27 * "padding"). MACB shouldn't need that, but we'll refrain from any 28 * core modifications here... 29 */ 30 31 #include <net.h> 32 #ifndef CONFIG_DM_ETH 33 #include <netdev.h> 34 #endif 35 #include <malloc.h> 36 #include <miiphy.h> 37 38 #include <linux/mii.h> 39 #include <asm/io.h> 40 #include <asm/dma-mapping.h> 41 #include <asm/arch/clk.h> 42 #include <linux/errno.h> 43 44 #include "macb.h" 45 46 DECLARE_GLOBAL_DATA_PTR; 47 48 #define MACB_RX_BUFFER_SIZE 4096 49 #define MACB_RX_RING_SIZE (MACB_RX_BUFFER_SIZE / 128) 50 #define MACB_TX_RING_SIZE 16 51 #define MACB_TX_TIMEOUT 1000 52 #define MACB_AUTONEG_TIMEOUT 5000000 53 54 #ifdef CONFIG_MACB_ZYNQ 55 /* INCR4 AHB bursts */ 56 #define MACB_ZYNQ_GEM_DMACR_BLENGTH 0x00000004 57 /* Use full configured addressable space (8 Kb) */ 58 #define MACB_ZYNQ_GEM_DMACR_RXSIZE 0x00000300 59 /* Use full configured addressable space (4 Kb) */ 60 #define MACB_ZYNQ_GEM_DMACR_TXSIZE 0x00000400 61 /* Set RXBUF with use of 128 byte */ 62 #define MACB_ZYNQ_GEM_DMACR_RXBUF 0x00020000 63 #define MACB_ZYNQ_GEM_DMACR_INIT \ 64 (MACB_ZYNQ_GEM_DMACR_BLENGTH | \ 65 MACB_ZYNQ_GEM_DMACR_RXSIZE | \ 66 MACB_ZYNQ_GEM_DMACR_TXSIZE | \ 67 MACB_ZYNQ_GEM_DMACR_RXBUF) 68 #endif 69 70 struct macb_dma_desc { 71 u32 addr; 72 u32 ctrl; 73 }; 74 75 #define DMA_DESC_BYTES(n) (n * sizeof(struct macb_dma_desc)) 76 #define MACB_TX_DMA_DESC_SIZE (DMA_DESC_BYTES(MACB_TX_RING_SIZE)) 77 #define MACB_RX_DMA_DESC_SIZE (DMA_DESC_BYTES(MACB_RX_RING_SIZE)) 78 #define MACB_TX_DUMMY_DMA_DESC_SIZE (DMA_DESC_BYTES(1)) 79 80 #define RXADDR_USED 0x00000001 81 #define RXADDR_WRAP 0x00000002 82 83 #define RXBUF_FRMLEN_MASK 0x00000fff 84 #define RXBUF_FRAME_START 0x00004000 85 #define RXBUF_FRAME_END 0x00008000 86 #define RXBUF_TYPEID_MATCH 0x00400000 87 #define RXBUF_ADDR4_MATCH 0x00800000 88 #define RXBUF_ADDR3_MATCH 0x01000000 89 #define RXBUF_ADDR2_MATCH 0x02000000 90 #define RXBUF_ADDR1_MATCH 0x04000000 91 #define RXBUF_BROADCAST 0x80000000 92 93 #define TXBUF_FRMLEN_MASK 0x000007ff 94 #define TXBUF_FRAME_END 0x00008000 95 #define TXBUF_NOCRC 0x00010000 96 #define TXBUF_EXHAUSTED 0x08000000 97 #define TXBUF_UNDERRUN 0x10000000 98 #define TXBUF_MAXRETRY 0x20000000 99 #define TXBUF_WRAP 0x40000000 100 #define TXBUF_USED 0x80000000 101 102 struct macb_device { 103 void *regs; 104 105 unsigned int rx_tail; 106 unsigned int tx_head; 107 unsigned int tx_tail; 108 unsigned int next_rx_tail; 109 bool wrapped; 110 111 void *rx_buffer; 112 void *tx_buffer; 113 struct macb_dma_desc *rx_ring; 114 struct macb_dma_desc *tx_ring; 115 116 unsigned long rx_buffer_dma; 117 unsigned long rx_ring_dma; 118 unsigned long tx_ring_dma; 119 120 struct macb_dma_desc *dummy_desc; 121 unsigned long dummy_desc_dma; 122 123 const struct device *dev; 124 #ifndef CONFIG_DM_ETH 125 struct eth_device netdev; 126 #endif 127 unsigned short phy_addr; 128 struct mii_dev *bus; 129 #ifdef CONFIG_PHYLIB 130 struct phy_device *phydev; 131 #endif 132 133 #ifdef CONFIG_DM_ETH 134 #ifdef CONFIG_CLK 135 unsigned long pclk_rate; 136 #endif 137 phy_interface_t phy_interface; 138 #endif 139 }; 140 #ifndef CONFIG_DM_ETH 141 #define to_macb(_nd) container_of(_nd, struct macb_device, netdev) 142 #endif 143 144 static int macb_is_gem(struct macb_device *macb) 145 { 146 return MACB_BFEXT(IDNUM, macb_readl(macb, MID)) == 0x2; 147 } 148 149 #ifndef cpu_is_sama5d2 150 #define cpu_is_sama5d2() 0 151 #endif 152 153 #ifndef cpu_is_sama5d4 154 #define cpu_is_sama5d4() 0 155 #endif 156 157 static int gem_is_gigabit_capable(struct macb_device *macb) 158 { 159 /* 160 * The GEM controllers embedded in SAMA5D2 and SAMA5D4 are 161 * configured to support only 10/100. 162 */ 163 return macb_is_gem(macb) && !cpu_is_sama5d2() && !cpu_is_sama5d4(); 164 } 165 166 static void macb_mdio_write(struct macb_device *macb, u8 reg, u16 value) 167 { 168 unsigned long netctl; 169 unsigned long netstat; 170 unsigned long frame; 171 172 netctl = macb_readl(macb, NCR); 173 netctl |= MACB_BIT(MPE); 174 macb_writel(macb, NCR, netctl); 175 176 frame = (MACB_BF(SOF, 1) 177 | MACB_BF(RW, 1) 178 | MACB_BF(PHYA, macb->phy_addr) 179 | MACB_BF(REGA, reg) 180 | MACB_BF(CODE, 2) 181 | MACB_BF(DATA, value)); 182 macb_writel(macb, MAN, frame); 183 184 do { 185 netstat = macb_readl(macb, NSR); 186 } while (!(netstat & MACB_BIT(IDLE))); 187 188 netctl = macb_readl(macb, NCR); 189 netctl &= ~MACB_BIT(MPE); 190 macb_writel(macb, NCR, netctl); 191 } 192 193 static u16 macb_mdio_read(struct macb_device *macb, u8 reg) 194 { 195 unsigned long netctl; 196 unsigned long netstat; 197 unsigned long frame; 198 199 netctl = macb_readl(macb, NCR); 200 netctl |= MACB_BIT(MPE); 201 macb_writel(macb, NCR, netctl); 202 203 frame = (MACB_BF(SOF, 1) 204 | MACB_BF(RW, 2) 205 | MACB_BF(PHYA, macb->phy_addr) 206 | MACB_BF(REGA, reg) 207 | MACB_BF(CODE, 2)); 208 macb_writel(macb, MAN, frame); 209 210 do { 211 netstat = macb_readl(macb, NSR); 212 } while (!(netstat & MACB_BIT(IDLE))); 213 214 frame = macb_readl(macb, MAN); 215 216 netctl = macb_readl(macb, NCR); 217 netctl &= ~MACB_BIT(MPE); 218 macb_writel(macb, NCR, netctl); 219 220 return MACB_BFEXT(DATA, frame); 221 } 222 223 void __weak arch_get_mdio_control(const char *name) 224 { 225 return; 226 } 227 228 #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB) 229 230 int macb_miiphy_read(struct mii_dev *bus, int phy_adr, int devad, int reg) 231 { 232 u16 value = 0; 233 #ifdef CONFIG_DM_ETH 234 struct udevice *dev = eth_get_dev_by_name(bus->name); 235 struct macb_device *macb = dev_get_priv(dev); 236 #else 237 struct eth_device *dev = eth_get_dev_by_name(bus->name); 238 struct macb_device *macb = to_macb(dev); 239 #endif 240 241 if (macb->phy_addr != phy_adr) 242 return -1; 243 244 arch_get_mdio_control(bus->name); 245 value = macb_mdio_read(macb, reg); 246 247 return value; 248 } 249 250 int macb_miiphy_write(struct mii_dev *bus, int phy_adr, int devad, int reg, 251 u16 value) 252 { 253 #ifdef CONFIG_DM_ETH 254 struct udevice *dev = eth_get_dev_by_name(bus->name); 255 struct macb_device *macb = dev_get_priv(dev); 256 #else 257 struct eth_device *dev = eth_get_dev_by_name(bus->name); 258 struct macb_device *macb = to_macb(dev); 259 #endif 260 261 if (macb->phy_addr != phy_adr) 262 return -1; 263 264 arch_get_mdio_control(bus->name); 265 macb_mdio_write(macb, reg, value); 266 267 return 0; 268 } 269 #endif 270 271 #define RX 1 272 #define TX 0 273 static inline void macb_invalidate_ring_desc(struct macb_device *macb, bool rx) 274 { 275 if (rx) 276 invalidate_dcache_range(macb->rx_ring_dma, 277 ALIGN(macb->rx_ring_dma + MACB_RX_DMA_DESC_SIZE, 278 PKTALIGN)); 279 else 280 invalidate_dcache_range(macb->tx_ring_dma, 281 ALIGN(macb->tx_ring_dma + MACB_TX_DMA_DESC_SIZE, 282 PKTALIGN)); 283 } 284 285 static inline void macb_flush_ring_desc(struct macb_device *macb, bool rx) 286 { 287 if (rx) 288 flush_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma + 289 ALIGN(MACB_RX_DMA_DESC_SIZE, PKTALIGN)); 290 else 291 flush_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma + 292 ALIGN(MACB_TX_DMA_DESC_SIZE, PKTALIGN)); 293 } 294 295 static inline void macb_flush_rx_buffer(struct macb_device *macb) 296 { 297 flush_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma + 298 ALIGN(MACB_RX_BUFFER_SIZE, PKTALIGN)); 299 } 300 301 static inline void macb_invalidate_rx_buffer(struct macb_device *macb) 302 { 303 invalidate_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma + 304 ALIGN(MACB_RX_BUFFER_SIZE, PKTALIGN)); 305 } 306 307 #if defined(CONFIG_CMD_NET) 308 309 static int _macb_send(struct macb_device *macb, const char *name, void *packet, 310 int length) 311 { 312 unsigned long paddr, ctrl; 313 unsigned int tx_head = macb->tx_head; 314 int i; 315 316 paddr = dma_map_single(packet, length, DMA_TO_DEVICE); 317 318 ctrl = length & TXBUF_FRMLEN_MASK; 319 ctrl |= TXBUF_FRAME_END; 320 if (tx_head == (MACB_TX_RING_SIZE - 1)) { 321 ctrl |= TXBUF_WRAP; 322 macb->tx_head = 0; 323 } else { 324 macb->tx_head++; 325 } 326 327 macb->tx_ring[tx_head].ctrl = ctrl; 328 macb->tx_ring[tx_head].addr = paddr; 329 barrier(); 330 macb_flush_ring_desc(macb, TX); 331 /* Do we need check paddr and length is dcache line aligned? */ 332 flush_dcache_range(paddr, paddr + ALIGN(length, ARCH_DMA_MINALIGN)); 333 macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE) | MACB_BIT(TSTART)); 334 335 /* 336 * I guess this is necessary because the networking core may 337 * re-use the transmit buffer as soon as we return... 338 */ 339 for (i = 0; i <= MACB_TX_TIMEOUT; i++) { 340 barrier(); 341 macb_invalidate_ring_desc(macb, TX); 342 ctrl = macb->tx_ring[tx_head].ctrl; 343 if (ctrl & TXBUF_USED) 344 break; 345 udelay(1); 346 } 347 348 dma_unmap_single(packet, length, paddr); 349 350 if (i <= MACB_TX_TIMEOUT) { 351 if (ctrl & TXBUF_UNDERRUN) 352 printf("%s: TX underrun\n", name); 353 if (ctrl & TXBUF_EXHAUSTED) 354 printf("%s: TX buffers exhausted in mid frame\n", name); 355 } else { 356 printf("%s: TX timeout\n", name); 357 } 358 359 /* No one cares anyway */ 360 return 0; 361 } 362 363 static void reclaim_rx_buffers(struct macb_device *macb, 364 unsigned int new_tail) 365 { 366 unsigned int i; 367 368 i = macb->rx_tail; 369 370 macb_invalidate_ring_desc(macb, RX); 371 while (i > new_tail) { 372 macb->rx_ring[i].addr &= ~RXADDR_USED; 373 i++; 374 if (i > MACB_RX_RING_SIZE) 375 i = 0; 376 } 377 378 while (i < new_tail) { 379 macb->rx_ring[i].addr &= ~RXADDR_USED; 380 i++; 381 } 382 383 barrier(); 384 macb_flush_ring_desc(macb, RX); 385 macb->rx_tail = new_tail; 386 } 387 388 static int _macb_recv(struct macb_device *macb, uchar **packetp) 389 { 390 unsigned int next_rx_tail = macb->next_rx_tail; 391 void *buffer; 392 int length; 393 u32 status; 394 395 macb->wrapped = false; 396 for (;;) { 397 macb_invalidate_ring_desc(macb, RX); 398 399 if (!(macb->rx_ring[next_rx_tail].addr & RXADDR_USED)) 400 return -EAGAIN; 401 402 status = macb->rx_ring[next_rx_tail].ctrl; 403 if (status & RXBUF_FRAME_START) { 404 if (next_rx_tail != macb->rx_tail) 405 reclaim_rx_buffers(macb, next_rx_tail); 406 macb->wrapped = false; 407 } 408 409 if (status & RXBUF_FRAME_END) { 410 buffer = macb->rx_buffer + 128 * macb->rx_tail; 411 length = status & RXBUF_FRMLEN_MASK; 412 413 macb_invalidate_rx_buffer(macb); 414 if (macb->wrapped) { 415 unsigned int headlen, taillen; 416 417 headlen = 128 * (MACB_RX_RING_SIZE 418 - macb->rx_tail); 419 taillen = length - headlen; 420 memcpy((void *)net_rx_packets[0], 421 buffer, headlen); 422 memcpy((void *)net_rx_packets[0] + headlen, 423 macb->rx_buffer, taillen); 424 *packetp = (void *)net_rx_packets[0]; 425 } else { 426 *packetp = buffer; 427 } 428 429 if (++next_rx_tail >= MACB_RX_RING_SIZE) 430 next_rx_tail = 0; 431 macb->next_rx_tail = next_rx_tail; 432 return length; 433 } else { 434 if (++next_rx_tail >= MACB_RX_RING_SIZE) { 435 macb->wrapped = true; 436 next_rx_tail = 0; 437 } 438 } 439 barrier(); 440 } 441 } 442 443 static void macb_phy_reset(struct macb_device *macb, const char *name) 444 { 445 int i; 446 u16 status, adv; 447 448 adv = ADVERTISE_CSMA | ADVERTISE_ALL; 449 macb_mdio_write(macb, MII_ADVERTISE, adv); 450 printf("%s: Starting autonegotiation...\n", name); 451 macb_mdio_write(macb, MII_BMCR, (BMCR_ANENABLE 452 | BMCR_ANRESTART)); 453 454 for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) { 455 status = macb_mdio_read(macb, MII_BMSR); 456 if (status & BMSR_ANEGCOMPLETE) 457 break; 458 udelay(100); 459 } 460 461 if (status & BMSR_ANEGCOMPLETE) 462 printf("%s: Autonegotiation complete\n", name); 463 else 464 printf("%s: Autonegotiation timed out (status=0x%04x)\n", 465 name, status); 466 } 467 468 static int macb_phy_find(struct macb_device *macb, const char *name) 469 { 470 int i; 471 u16 phy_id; 472 473 /* Search for PHY... */ 474 for (i = 0; i < 32; i++) { 475 macb->phy_addr = i; 476 phy_id = macb_mdio_read(macb, MII_PHYSID1); 477 if (phy_id != 0xffff) { 478 printf("%s: PHY present at %d\n", name, i); 479 return 0; 480 } 481 } 482 483 /* PHY isn't up to snuff */ 484 printf("%s: PHY not found\n", name); 485 486 return -ENODEV; 487 } 488 489 /** 490 * macb_linkspd_cb - Linkspeed change callback function 491 * @regs: Base Register of MACB devices 492 * @speed: Linkspeed 493 * Returns 0 when operation success and negative errno number 494 * when operation failed. 495 */ 496 int __weak macb_linkspd_cb(void *regs, unsigned int speed) 497 { 498 return 0; 499 } 500 501 #ifdef CONFIG_DM_ETH 502 static int macb_phy_init(struct udevice *dev, const char *name) 503 #else 504 static int macb_phy_init(struct macb_device *macb, const char *name) 505 #endif 506 { 507 #ifdef CONFIG_DM_ETH 508 struct macb_device *macb = dev_get_priv(dev); 509 #endif 510 u32 ncfgr; 511 u16 phy_id, status, adv, lpa; 512 int media, speed, duplex; 513 int ret; 514 int i; 515 516 arch_get_mdio_control(name); 517 /* Auto-detect phy_addr */ 518 ret = macb_phy_find(macb, name); 519 if (ret) 520 return ret; 521 522 /* Check if the PHY is up to snuff... */ 523 phy_id = macb_mdio_read(macb, MII_PHYSID1); 524 if (phy_id == 0xffff) { 525 printf("%s: No PHY present\n", name); 526 return -ENODEV; 527 } 528 529 #ifdef CONFIG_PHYLIB 530 #ifdef CONFIG_DM_ETH 531 macb->phydev = phy_connect(macb->bus, macb->phy_addr, dev, 532 macb->phy_interface); 533 #else 534 /* need to consider other phy interface mode */ 535 macb->phydev = phy_connect(macb->bus, macb->phy_addr, &macb->netdev, 536 PHY_INTERFACE_MODE_RGMII); 537 #endif 538 if (!macb->phydev) { 539 printf("phy_connect failed\n"); 540 return -ENODEV; 541 } 542 543 phy_config(macb->phydev); 544 #endif 545 546 status = macb_mdio_read(macb, MII_BMSR); 547 if (!(status & BMSR_LSTATUS)) { 548 /* Try to re-negotiate if we don't have link already. */ 549 macb_phy_reset(macb, name); 550 551 for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) { 552 status = macb_mdio_read(macb, MII_BMSR); 553 if (status & BMSR_LSTATUS) 554 break; 555 udelay(100); 556 } 557 } 558 559 if (!(status & BMSR_LSTATUS)) { 560 printf("%s: link down (status: 0x%04x)\n", 561 name, status); 562 return -ENETDOWN; 563 } 564 565 /* First check for GMAC and that it is GiB capable */ 566 if (gem_is_gigabit_capable(macb)) { 567 lpa = macb_mdio_read(macb, MII_STAT1000); 568 569 if (lpa & (LPA_1000FULL | LPA_1000HALF)) { 570 duplex = ((lpa & LPA_1000FULL) ? 1 : 0); 571 572 printf("%s: link up, 1000Mbps %s-duplex (lpa: 0x%04x)\n", 573 name, 574 duplex ? "full" : "half", 575 lpa); 576 577 ncfgr = macb_readl(macb, NCFGR); 578 ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD)); 579 ncfgr |= GEM_BIT(GBE); 580 581 if (duplex) 582 ncfgr |= MACB_BIT(FD); 583 584 macb_writel(macb, NCFGR, ncfgr); 585 586 ret = macb_linkspd_cb(macb->regs, _1000BASET); 587 if (ret) 588 return ret; 589 590 return 0; 591 } 592 } 593 594 /* fall back for EMAC checking */ 595 adv = macb_mdio_read(macb, MII_ADVERTISE); 596 lpa = macb_mdio_read(macb, MII_LPA); 597 media = mii_nway_result(lpa & adv); 598 speed = (media & (ADVERTISE_100FULL | ADVERTISE_100HALF) 599 ? 1 : 0); 600 duplex = (media & ADVERTISE_FULL) ? 1 : 0; 601 printf("%s: link up, %sMbps %s-duplex (lpa: 0x%04x)\n", 602 name, 603 speed ? "100" : "10", 604 duplex ? "full" : "half", 605 lpa); 606 607 ncfgr = macb_readl(macb, NCFGR); 608 ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD) | GEM_BIT(GBE)); 609 if (speed) { 610 ncfgr |= MACB_BIT(SPD); 611 ret = macb_linkspd_cb(macb->regs, _100BASET); 612 } else { 613 ret = macb_linkspd_cb(macb->regs, _10BASET); 614 } 615 616 if (ret) 617 return ret; 618 619 if (duplex) 620 ncfgr |= MACB_BIT(FD); 621 macb_writel(macb, NCFGR, ncfgr); 622 623 return 0; 624 } 625 626 static int gmac_init_multi_queues(struct macb_device *macb) 627 { 628 int i, num_queues = 1; 629 u32 queue_mask; 630 631 /* bit 0 is never set but queue 0 always exists */ 632 queue_mask = gem_readl(macb, DCFG6) & 0xff; 633 queue_mask |= 0x1; 634 635 for (i = 1; i < MACB_MAX_QUEUES; i++) 636 if (queue_mask & (1 << i)) 637 num_queues++; 638 639 macb->dummy_desc->ctrl = TXBUF_USED; 640 macb->dummy_desc->addr = 0; 641 flush_dcache_range(macb->dummy_desc_dma, macb->dummy_desc_dma + 642 ALIGN(MACB_TX_DUMMY_DMA_DESC_SIZE, PKTALIGN)); 643 644 for (i = 1; i < num_queues; i++) 645 gem_writel_queue_TBQP(macb, macb->dummy_desc_dma, i - 1); 646 647 return 0; 648 } 649 650 #ifdef CONFIG_DM_ETH 651 static int _macb_init(struct udevice *dev, const char *name) 652 #else 653 static int _macb_init(struct macb_device *macb, const char *name) 654 #endif 655 { 656 #ifdef CONFIG_DM_ETH 657 struct macb_device *macb = dev_get_priv(dev); 658 #endif 659 unsigned long paddr; 660 int ret; 661 int i; 662 663 /* 664 * macb_halt should have been called at some point before now, 665 * so we'll assume the controller is idle. 666 */ 667 668 /* initialize DMA descriptors */ 669 paddr = macb->rx_buffer_dma; 670 for (i = 0; i < MACB_RX_RING_SIZE; i++) { 671 if (i == (MACB_RX_RING_SIZE - 1)) 672 paddr |= RXADDR_WRAP; 673 macb->rx_ring[i].addr = paddr; 674 macb->rx_ring[i].ctrl = 0; 675 paddr += 128; 676 } 677 macb_flush_ring_desc(macb, RX); 678 macb_flush_rx_buffer(macb); 679 680 for (i = 0; i < MACB_TX_RING_SIZE; i++) { 681 macb->tx_ring[i].addr = 0; 682 if (i == (MACB_TX_RING_SIZE - 1)) 683 macb->tx_ring[i].ctrl = TXBUF_USED | TXBUF_WRAP; 684 else 685 macb->tx_ring[i].ctrl = TXBUF_USED; 686 } 687 macb_flush_ring_desc(macb, TX); 688 689 macb->rx_tail = 0; 690 macb->tx_head = 0; 691 macb->tx_tail = 0; 692 macb->next_rx_tail = 0; 693 694 #ifdef CONFIG_MACB_ZYNQ 695 macb_writel(macb, DMACFG, MACB_ZYNQ_GEM_DMACR_INIT); 696 #endif 697 698 macb_writel(macb, RBQP, macb->rx_ring_dma); 699 macb_writel(macb, TBQP, macb->tx_ring_dma); 700 701 if (macb_is_gem(macb)) { 702 /* Check the multi queue and initialize the queue for tx */ 703 gmac_init_multi_queues(macb); 704 705 /* 706 * When the GMAC IP with GE feature, this bit is used to 707 * select interface between RGMII and GMII. 708 * When the GMAC IP without GE feature, this bit is used 709 * to select interface between RMII and MII. 710 */ 711 #ifdef CONFIG_DM_ETH 712 if ((macb->phy_interface == PHY_INTERFACE_MODE_RMII) || 713 (macb->phy_interface == PHY_INTERFACE_MODE_RGMII)) 714 gem_writel(macb, UR, GEM_BIT(RGMII)); 715 else 716 gem_writel(macb, UR, 0); 717 #else 718 #if defined(CONFIG_RGMII) || defined(CONFIG_RMII) 719 gem_writel(macb, UR, GEM_BIT(RGMII)); 720 #else 721 gem_writel(macb, UR, 0); 722 #endif 723 #endif 724 } else { 725 /* choose RMII or MII mode. This depends on the board */ 726 #ifdef CONFIG_DM_ETH 727 #ifdef CONFIG_AT91FAMILY 728 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) { 729 macb_writel(macb, USRIO, 730 MACB_BIT(RMII) | MACB_BIT(CLKEN)); 731 } else { 732 macb_writel(macb, USRIO, MACB_BIT(CLKEN)); 733 } 734 #else 735 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) 736 macb_writel(macb, USRIO, 0); 737 else 738 macb_writel(macb, USRIO, MACB_BIT(MII)); 739 #endif 740 #else 741 #ifdef CONFIG_RMII 742 #ifdef CONFIG_AT91FAMILY 743 macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN)); 744 #else 745 macb_writel(macb, USRIO, 0); 746 #endif 747 #else 748 #ifdef CONFIG_AT91FAMILY 749 macb_writel(macb, USRIO, MACB_BIT(CLKEN)); 750 #else 751 macb_writel(macb, USRIO, MACB_BIT(MII)); 752 #endif 753 #endif /* CONFIG_RMII */ 754 #endif 755 } 756 757 #ifdef CONFIG_DM_ETH 758 ret = macb_phy_init(dev, name); 759 #else 760 ret = macb_phy_init(macb, name); 761 #endif 762 if (ret) 763 return ret; 764 765 /* Enable TX and RX */ 766 macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE)); 767 768 return 0; 769 } 770 771 static void _macb_halt(struct macb_device *macb) 772 { 773 u32 ncr, tsr; 774 775 /* Halt the controller and wait for any ongoing transmission to end. */ 776 ncr = macb_readl(macb, NCR); 777 ncr |= MACB_BIT(THALT); 778 macb_writel(macb, NCR, ncr); 779 780 do { 781 tsr = macb_readl(macb, TSR); 782 } while (tsr & MACB_BIT(TGO)); 783 784 /* Disable TX and RX, and clear statistics */ 785 macb_writel(macb, NCR, MACB_BIT(CLRSTAT)); 786 } 787 788 static int _macb_write_hwaddr(struct macb_device *macb, unsigned char *enetaddr) 789 { 790 u32 hwaddr_bottom; 791 u16 hwaddr_top; 792 793 /* set hardware address */ 794 hwaddr_bottom = enetaddr[0] | enetaddr[1] << 8 | 795 enetaddr[2] << 16 | enetaddr[3] << 24; 796 macb_writel(macb, SA1B, hwaddr_bottom); 797 hwaddr_top = enetaddr[4] | enetaddr[5] << 8; 798 macb_writel(macb, SA1T, hwaddr_top); 799 return 0; 800 } 801 802 static u32 macb_mdc_clk_div(int id, struct macb_device *macb) 803 { 804 u32 config; 805 #if defined(CONFIG_DM_ETH) && defined(CONFIG_CLK) 806 unsigned long macb_hz = macb->pclk_rate; 807 #else 808 unsigned long macb_hz = get_macb_pclk_rate(id); 809 #endif 810 811 if (macb_hz < 20000000) 812 config = MACB_BF(CLK, MACB_CLK_DIV8); 813 else if (macb_hz < 40000000) 814 config = MACB_BF(CLK, MACB_CLK_DIV16); 815 else if (macb_hz < 80000000) 816 config = MACB_BF(CLK, MACB_CLK_DIV32); 817 else 818 config = MACB_BF(CLK, MACB_CLK_DIV64); 819 820 return config; 821 } 822 823 static u32 gem_mdc_clk_div(int id, struct macb_device *macb) 824 { 825 u32 config; 826 827 #if defined(CONFIG_DM_ETH) && defined(CONFIG_CLK) 828 unsigned long macb_hz = macb->pclk_rate; 829 #else 830 unsigned long macb_hz = get_macb_pclk_rate(id); 831 #endif 832 833 if (macb_hz < 20000000) 834 config = GEM_BF(CLK, GEM_CLK_DIV8); 835 else if (macb_hz < 40000000) 836 config = GEM_BF(CLK, GEM_CLK_DIV16); 837 else if (macb_hz < 80000000) 838 config = GEM_BF(CLK, GEM_CLK_DIV32); 839 else if (macb_hz < 120000000) 840 config = GEM_BF(CLK, GEM_CLK_DIV48); 841 else if (macb_hz < 160000000) 842 config = GEM_BF(CLK, GEM_CLK_DIV64); 843 else 844 config = GEM_BF(CLK, GEM_CLK_DIV96); 845 846 return config; 847 } 848 849 /* 850 * Get the DMA bus width field of the network configuration register that we 851 * should program. We find the width from decoding the design configuration 852 * register to find the maximum supported data bus width. 853 */ 854 static u32 macb_dbw(struct macb_device *macb) 855 { 856 switch (GEM_BFEXT(DBWDEF, gem_readl(macb, DCFG1))) { 857 case 4: 858 return GEM_BF(DBW, GEM_DBW128); 859 case 2: 860 return GEM_BF(DBW, GEM_DBW64); 861 case 1: 862 default: 863 return GEM_BF(DBW, GEM_DBW32); 864 } 865 } 866 867 static void _macb_eth_initialize(struct macb_device *macb) 868 { 869 int id = 0; /* This is not used by functions we call */ 870 u32 ncfgr; 871 872 /* TODO: we need check the rx/tx_ring_dma is dcache line aligned */ 873 macb->rx_buffer = dma_alloc_coherent(MACB_RX_BUFFER_SIZE, 874 &macb->rx_buffer_dma); 875 macb->rx_ring = dma_alloc_coherent(MACB_RX_DMA_DESC_SIZE, 876 &macb->rx_ring_dma); 877 macb->tx_ring = dma_alloc_coherent(MACB_TX_DMA_DESC_SIZE, 878 &macb->tx_ring_dma); 879 macb->dummy_desc = dma_alloc_coherent(MACB_TX_DUMMY_DMA_DESC_SIZE, 880 &macb->dummy_desc_dma); 881 882 /* 883 * Do some basic initialization so that we at least can talk 884 * to the PHY 885 */ 886 if (macb_is_gem(macb)) { 887 ncfgr = gem_mdc_clk_div(id, macb); 888 ncfgr |= macb_dbw(macb); 889 } else { 890 ncfgr = macb_mdc_clk_div(id, macb); 891 } 892 893 macb_writel(macb, NCFGR, ncfgr); 894 } 895 896 #ifndef CONFIG_DM_ETH 897 static int macb_send(struct eth_device *netdev, void *packet, int length) 898 { 899 struct macb_device *macb = to_macb(netdev); 900 901 return _macb_send(macb, netdev->name, packet, length); 902 } 903 904 static int macb_recv(struct eth_device *netdev) 905 { 906 struct macb_device *macb = to_macb(netdev); 907 uchar *packet; 908 int length; 909 910 macb->wrapped = false; 911 for (;;) { 912 macb->next_rx_tail = macb->rx_tail; 913 length = _macb_recv(macb, &packet); 914 if (length >= 0) { 915 net_process_received_packet(packet, length); 916 reclaim_rx_buffers(macb, macb->next_rx_tail); 917 } else { 918 return length; 919 } 920 } 921 } 922 923 static int macb_init(struct eth_device *netdev, bd_t *bd) 924 { 925 struct macb_device *macb = to_macb(netdev); 926 927 return _macb_init(macb, netdev->name); 928 } 929 930 static void macb_halt(struct eth_device *netdev) 931 { 932 struct macb_device *macb = to_macb(netdev); 933 934 return _macb_halt(macb); 935 } 936 937 static int macb_write_hwaddr(struct eth_device *netdev) 938 { 939 struct macb_device *macb = to_macb(netdev); 940 941 return _macb_write_hwaddr(macb, netdev->enetaddr); 942 } 943 944 int macb_eth_initialize(int id, void *regs, unsigned int phy_addr) 945 { 946 struct macb_device *macb; 947 struct eth_device *netdev; 948 949 macb = malloc(sizeof(struct macb_device)); 950 if (!macb) { 951 printf("Error: Failed to allocate memory for MACB%d\n", id); 952 return -1; 953 } 954 memset(macb, 0, sizeof(struct macb_device)); 955 956 netdev = &macb->netdev; 957 958 macb->regs = regs; 959 macb->phy_addr = phy_addr; 960 961 if (macb_is_gem(macb)) 962 sprintf(netdev->name, "gmac%d", id); 963 else 964 sprintf(netdev->name, "macb%d", id); 965 966 netdev->init = macb_init; 967 netdev->halt = macb_halt; 968 netdev->send = macb_send; 969 netdev->recv = macb_recv; 970 netdev->write_hwaddr = macb_write_hwaddr; 971 972 _macb_eth_initialize(macb); 973 974 eth_register(netdev); 975 976 #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB) 977 int retval; 978 struct mii_dev *mdiodev = mdio_alloc(); 979 if (!mdiodev) 980 return -ENOMEM; 981 strncpy(mdiodev->name, netdev->name, MDIO_NAME_LEN); 982 mdiodev->read = macb_miiphy_read; 983 mdiodev->write = macb_miiphy_write; 984 985 retval = mdio_register(mdiodev); 986 if (retval < 0) 987 return retval; 988 macb->bus = miiphy_get_dev_by_name(netdev->name); 989 #endif 990 return 0; 991 } 992 #endif /* !CONFIG_DM_ETH */ 993 994 #ifdef CONFIG_DM_ETH 995 996 static int macb_start(struct udevice *dev) 997 { 998 return _macb_init(dev, dev->name); 999 } 1000 1001 static int macb_send(struct udevice *dev, void *packet, int length) 1002 { 1003 struct macb_device *macb = dev_get_priv(dev); 1004 1005 return _macb_send(macb, dev->name, packet, length); 1006 } 1007 1008 static int macb_recv(struct udevice *dev, int flags, uchar **packetp) 1009 { 1010 struct macb_device *macb = dev_get_priv(dev); 1011 1012 macb->next_rx_tail = macb->rx_tail; 1013 macb->wrapped = false; 1014 1015 return _macb_recv(macb, packetp); 1016 } 1017 1018 static int macb_free_pkt(struct udevice *dev, uchar *packet, int length) 1019 { 1020 struct macb_device *macb = dev_get_priv(dev); 1021 1022 reclaim_rx_buffers(macb, macb->next_rx_tail); 1023 1024 return 0; 1025 } 1026 1027 static void macb_stop(struct udevice *dev) 1028 { 1029 struct macb_device *macb = dev_get_priv(dev); 1030 1031 _macb_halt(macb); 1032 } 1033 1034 static int macb_write_hwaddr(struct udevice *dev) 1035 { 1036 struct eth_pdata *plat = dev_get_platdata(dev); 1037 struct macb_device *macb = dev_get_priv(dev); 1038 1039 return _macb_write_hwaddr(macb, plat->enetaddr); 1040 } 1041 1042 static const struct eth_ops macb_eth_ops = { 1043 .start = macb_start, 1044 .send = macb_send, 1045 .recv = macb_recv, 1046 .stop = macb_stop, 1047 .free_pkt = macb_free_pkt, 1048 .write_hwaddr = macb_write_hwaddr, 1049 }; 1050 1051 #ifdef CONFIG_CLK 1052 static int macb_enable_clk(struct udevice *dev) 1053 { 1054 struct macb_device *macb = dev_get_priv(dev); 1055 struct clk clk; 1056 ulong clk_rate; 1057 int ret; 1058 1059 ret = clk_get_by_index(dev, 0, &clk); 1060 if (ret) 1061 return -EINVAL; 1062 1063 /* 1064 * Zynq clock driver didn't support for enable or disable 1065 * clock. Hence, clk_enable() didn't apply for Zynq 1066 */ 1067 #ifndef CONFIG_MACB_ZYNQ 1068 ret = clk_enable(&clk); 1069 if (ret) 1070 return ret; 1071 #endif 1072 1073 clk_rate = clk_get_rate(&clk); 1074 if (!clk_rate) 1075 return -EINVAL; 1076 1077 macb->pclk_rate = clk_rate; 1078 1079 return 0; 1080 } 1081 #endif 1082 1083 static int macb_eth_probe(struct udevice *dev) 1084 { 1085 struct eth_pdata *pdata = dev_get_platdata(dev); 1086 struct macb_device *macb = dev_get_priv(dev); 1087 const char *phy_mode; 1088 __maybe_unused int ret; 1089 1090 phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode", 1091 NULL); 1092 if (phy_mode) 1093 macb->phy_interface = phy_get_interface_by_name(phy_mode); 1094 if (macb->phy_interface == -1) { 1095 debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode); 1096 return -EINVAL; 1097 } 1098 1099 macb->regs = (void *)pdata->iobase; 1100 1101 #ifdef CONFIG_CLK 1102 ret = macb_enable_clk(dev); 1103 if (ret) 1104 return ret; 1105 #endif 1106 1107 _macb_eth_initialize(macb); 1108 1109 #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB) 1110 macb->bus = mdio_alloc(); 1111 if (!macb->bus) 1112 return -ENOMEM; 1113 strncpy(macb->bus->name, dev->name, MDIO_NAME_LEN); 1114 macb->bus->read = macb_miiphy_read; 1115 macb->bus->write = macb_miiphy_write; 1116 1117 ret = mdio_register(macb->bus); 1118 if (ret < 0) 1119 return ret; 1120 macb->bus = miiphy_get_dev_by_name(dev->name); 1121 #endif 1122 1123 return 0; 1124 } 1125 1126 static int macb_eth_remove(struct udevice *dev) 1127 { 1128 struct macb_device *macb = dev_get_priv(dev); 1129 1130 #ifdef CONFIG_PHYLIB 1131 free(macb->phydev); 1132 #endif 1133 mdio_unregister(macb->bus); 1134 mdio_free(macb->bus); 1135 1136 return 0; 1137 } 1138 1139 /** 1140 * macb_late_eth_ofdata_to_platdata 1141 * @dev: udevice struct 1142 * Returns 0 when operation success and negative errno number 1143 * when operation failed. 1144 */ 1145 int __weak macb_late_eth_ofdata_to_platdata(struct udevice *dev) 1146 { 1147 return 0; 1148 } 1149 1150 static int macb_eth_ofdata_to_platdata(struct udevice *dev) 1151 { 1152 struct eth_pdata *pdata = dev_get_platdata(dev); 1153 1154 pdata->iobase = devfdt_get_addr(dev); 1155 1156 return macb_late_eth_ofdata_to_platdata(dev); 1157 } 1158 1159 static const struct udevice_id macb_eth_ids[] = { 1160 { .compatible = "cdns,macb" }, 1161 { .compatible = "cdns,at91sam9260-macb" }, 1162 { .compatible = "atmel,sama5d2-gem" }, 1163 { .compatible = "atmel,sama5d3-gem" }, 1164 { .compatible = "atmel,sama5d4-gem" }, 1165 { .compatible = "cdns,zynq-gem" }, 1166 { } 1167 }; 1168 1169 U_BOOT_DRIVER(eth_macb) = { 1170 .name = "eth_macb", 1171 .id = UCLASS_ETH, 1172 .of_match = macb_eth_ids, 1173 .ofdata_to_platdata = macb_eth_ofdata_to_platdata, 1174 .probe = macb_eth_probe, 1175 .remove = macb_eth_remove, 1176 .ops = &macb_eth_ops, 1177 .priv_auto_alloc_size = sizeof(struct macb_device), 1178 .platdata_auto_alloc_size = sizeof(struct eth_pdata), 1179 }; 1180 #endif 1181 1182 #endif 1183