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