net: macb: Extend MACB driver for SiFive Unleashed board
[oweals/u-boot.git] / drivers / net / macb.c
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 /*
49  * These buffer sizes must be power of 2 and divisible
50  * by RX_BUFFER_MULTIPLE
51  */
52 #define MACB_RX_BUFFER_SIZE             128
53 #define GEM_RX_BUFFER_SIZE              2048
54 #define RX_BUFFER_MULTIPLE              64
55
56 #define MACB_RX_RING_SIZE               32
57 #define MACB_TX_RING_SIZE               16
58
59 #define MACB_TX_TIMEOUT         1000
60 #define MACB_AUTONEG_TIMEOUT    5000000
61
62 #ifdef CONFIG_MACB_ZYNQ
63 /* INCR4 AHB bursts */
64 #define MACB_ZYNQ_GEM_DMACR_BLENGTH             0x00000004
65 /* Use full configured addressable space (8 Kb) */
66 #define MACB_ZYNQ_GEM_DMACR_RXSIZE              0x00000300
67 /* Use full configured addressable space (4 Kb) */
68 #define MACB_ZYNQ_GEM_DMACR_TXSIZE              0x00000400
69 /* Set RXBUF with use of 128 byte */
70 #define MACB_ZYNQ_GEM_DMACR_RXBUF               0x00020000
71 #define MACB_ZYNQ_GEM_DMACR_INIT \
72                                 (MACB_ZYNQ_GEM_DMACR_BLENGTH | \
73                                 MACB_ZYNQ_GEM_DMACR_RXSIZE | \
74                                 MACB_ZYNQ_GEM_DMACR_TXSIZE | \
75                                 MACB_ZYNQ_GEM_DMACR_RXBUF)
76 #endif
77
78 struct macb_dma_desc {
79         u32     addr;
80         u32     ctrl;
81 };
82
83 #define DMA_DESC_BYTES(n)       (n * sizeof(struct macb_dma_desc))
84 #define MACB_TX_DMA_DESC_SIZE   (DMA_DESC_BYTES(MACB_TX_RING_SIZE))
85 #define MACB_RX_DMA_DESC_SIZE   (DMA_DESC_BYTES(MACB_RX_RING_SIZE))
86 #define MACB_TX_DUMMY_DMA_DESC_SIZE     (DMA_DESC_BYTES(1))
87
88 #define RXBUF_FRMLEN_MASK       0x00000fff
89 #define TXBUF_FRMLEN_MASK       0x000007ff
90
91 struct macb_device {
92         void                    *regs;
93
94         const struct macb_config *config;
95
96         unsigned int            rx_tail;
97         unsigned int            tx_head;
98         unsigned int            tx_tail;
99         unsigned int            next_rx_tail;
100         bool                    wrapped;
101
102         void                    *rx_buffer;
103         void                    *tx_buffer;
104         struct macb_dma_desc    *rx_ring;
105         struct macb_dma_desc    *tx_ring;
106         size_t                  rx_buffer_size;
107
108         unsigned long           rx_buffer_dma;
109         unsigned long           rx_ring_dma;
110         unsigned long           tx_ring_dma;
111
112         struct macb_dma_desc    *dummy_desc;
113         unsigned long           dummy_desc_dma;
114
115         const struct device     *dev;
116 #ifndef CONFIG_DM_ETH
117         struct eth_device       netdev;
118 #endif
119         unsigned short          phy_addr;
120         struct mii_dev          *bus;
121 #ifdef CONFIG_PHYLIB
122         struct phy_device       *phydev;
123 #endif
124
125 #ifdef CONFIG_DM_ETH
126 #ifdef CONFIG_CLK
127         unsigned long           pclk_rate;
128 #endif
129         phy_interface_t         phy_interface;
130 #endif
131 };
132
133 struct macb_config {
134         unsigned int            dma_burst_length;
135
136         int                     (*clk_init)(struct udevice *dev, ulong rate);
137 };
138
139 #ifndef CONFIG_DM_ETH
140 #define to_macb(_nd) container_of(_nd, struct macb_device, netdev)
141 #endif
142
143 static int macb_is_gem(struct macb_device *macb)
144 {
145         return MACB_BFEXT(IDNUM, macb_readl(macb, MID)) >= 0x2;
146 }
147
148 #ifndef cpu_is_sama5d2
149 #define cpu_is_sama5d2() 0
150 #endif
151
152 #ifndef cpu_is_sama5d4
153 #define cpu_is_sama5d4() 0
154 #endif
155
156 static int gem_is_gigabit_capable(struct macb_device *macb)
157 {
158         /*
159          * The GEM controllers embedded in SAMA5D2 and SAMA5D4 are
160          * configured to support only 10/100.
161          */
162         return macb_is_gem(macb) && !cpu_is_sama5d2() && !cpu_is_sama5d4();
163 }
164
165 static void macb_mdio_write(struct macb_device *macb, u8 reg, u16 value)
166 {
167         unsigned long netctl;
168         unsigned long netstat;
169         unsigned long frame;
170
171         netctl = macb_readl(macb, NCR);
172         netctl |= MACB_BIT(MPE);
173         macb_writel(macb, NCR, netctl);
174
175         frame = (MACB_BF(SOF, 1)
176                  | MACB_BF(RW, 1)
177                  | MACB_BF(PHYA, macb->phy_addr)
178                  | MACB_BF(REGA, reg)
179                  | MACB_BF(CODE, 2)
180                  | MACB_BF(DATA, value));
181         macb_writel(macb, MAN, frame);
182
183         do {
184                 netstat = macb_readl(macb, NSR);
185         } while (!(netstat & MACB_BIT(IDLE)));
186
187         netctl = macb_readl(macb, NCR);
188         netctl &= ~MACB_BIT(MPE);
189         macb_writel(macb, NCR, netctl);
190 }
191
192 static u16 macb_mdio_read(struct macb_device *macb, u8 reg)
193 {
194         unsigned long netctl;
195         unsigned long netstat;
196         unsigned long frame;
197
198         netctl = macb_readl(macb, NCR);
199         netctl |= MACB_BIT(MPE);
200         macb_writel(macb, NCR, netctl);
201
202         frame = (MACB_BF(SOF, 1)
203                  | MACB_BF(RW, 2)
204                  | MACB_BF(PHYA, macb->phy_addr)
205                  | MACB_BF(REGA, reg)
206                  | MACB_BF(CODE, 2));
207         macb_writel(macb, MAN, frame);
208
209         do {
210                 netstat = macb_readl(macb, NSR);
211         } while (!(netstat & MACB_BIT(IDLE)));
212
213         frame = macb_readl(macb, MAN);
214
215         netctl = macb_readl(macb, NCR);
216         netctl &= ~MACB_BIT(MPE);
217         macb_writel(macb, NCR, netctl);
218
219         return MACB_BFEXT(DATA, frame);
220 }
221
222 void __weak arch_get_mdio_control(const char *name)
223 {
224         return;
225 }
226
227 #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB)
228
229 int macb_miiphy_read(struct mii_dev *bus, int phy_adr, int devad, int reg)
230 {
231         u16 value = 0;
232 #ifdef CONFIG_DM_ETH
233         struct udevice *dev = eth_get_dev_by_name(bus->name);
234         struct macb_device *macb = dev_get_priv(dev);
235 #else
236         struct eth_device *dev = eth_get_dev_by_name(bus->name);
237         struct macb_device *macb = to_macb(dev);
238 #endif
239
240         if (macb->phy_addr != phy_adr)
241                 return -1;
242
243         arch_get_mdio_control(bus->name);
244         value = macb_mdio_read(macb, reg);
245
246         return value;
247 }
248
249 int macb_miiphy_write(struct mii_dev *bus, int phy_adr, int devad, int reg,
250                       u16 value)
251 {
252 #ifdef CONFIG_DM_ETH
253         struct udevice *dev = eth_get_dev_by_name(bus->name);
254         struct macb_device *macb = dev_get_priv(dev);
255 #else
256         struct eth_device *dev = eth_get_dev_by_name(bus->name);
257         struct macb_device *macb = to_macb(dev);
258 #endif
259
260         if (macb->phy_addr != phy_adr)
261                 return -1;
262
263         arch_get_mdio_control(bus->name);
264         macb_mdio_write(macb, reg, value);
265
266         return 0;
267 }
268 #endif
269
270 #define RX      1
271 #define TX      0
272 static inline void macb_invalidate_ring_desc(struct macb_device *macb, bool rx)
273 {
274         if (rx)
275                 invalidate_dcache_range(macb->rx_ring_dma,
276                         ALIGN(macb->rx_ring_dma + MACB_RX_DMA_DESC_SIZE,
277                               PKTALIGN));
278         else
279                 invalidate_dcache_range(macb->tx_ring_dma,
280                         ALIGN(macb->tx_ring_dma + MACB_TX_DMA_DESC_SIZE,
281                               PKTALIGN));
282 }
283
284 static inline void macb_flush_ring_desc(struct macb_device *macb, bool rx)
285 {
286         if (rx)
287                 flush_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma +
288                                    ALIGN(MACB_RX_DMA_DESC_SIZE, PKTALIGN));
289         else
290                 flush_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma +
291                                    ALIGN(MACB_TX_DMA_DESC_SIZE, PKTALIGN));
292 }
293
294 static inline void macb_flush_rx_buffer(struct macb_device *macb)
295 {
296         flush_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma +
297                            ALIGN(MACB_RX_BUFFER_SIZE, PKTALIGN));
298 }
299
300 static inline void macb_invalidate_rx_buffer(struct macb_device *macb)
301 {
302         invalidate_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma +
303                                 ALIGN(MACB_RX_BUFFER_SIZE, PKTALIGN));
304 }
305
306 #if defined(CONFIG_CMD_NET)
307
308 static int _macb_send(struct macb_device *macb, const char *name, void *packet,
309                       int length)
310 {
311         unsigned long paddr, ctrl;
312         unsigned int tx_head = macb->tx_head;
313         int i;
314
315         paddr = dma_map_single(packet, length, DMA_TO_DEVICE);
316
317         ctrl = length & TXBUF_FRMLEN_MASK;
318         ctrl |= MACB_BIT(TX_LAST);
319         if (tx_head == (MACB_TX_RING_SIZE - 1)) {
320                 ctrl |= MACB_BIT(TX_WRAP);
321                 macb->tx_head = 0;
322         } else {
323                 macb->tx_head++;
324         }
325
326         macb->tx_ring[tx_head].ctrl = ctrl;
327         macb->tx_ring[tx_head].addr = paddr;
328         barrier();
329         macb_flush_ring_desc(macb, TX);
330         /* Do we need check paddr and length is dcache line aligned? */
331         flush_dcache_range(paddr, paddr + ALIGN(length, ARCH_DMA_MINALIGN));
332         macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE) | MACB_BIT(TSTART));
333
334         /*
335          * I guess this is necessary because the networking core may
336          * re-use the transmit buffer as soon as we return...
337          */
338         for (i = 0; i <= MACB_TX_TIMEOUT; i++) {
339                 barrier();
340                 macb_invalidate_ring_desc(macb, TX);
341                 ctrl = macb->tx_ring[tx_head].ctrl;
342                 if (ctrl & MACB_BIT(TX_USED))
343                         break;
344                 udelay(1);
345         }
346
347         dma_unmap_single(packet, length, paddr);
348
349         if (i <= MACB_TX_TIMEOUT) {
350                 if (ctrl & MACB_BIT(TX_UNDERRUN))
351                         printf("%s: TX underrun\n", name);
352                 if (ctrl & MACB_BIT(TX_BUF_EXHAUSTED))
353                         printf("%s: TX buffers exhausted in mid frame\n", name);
354         } else {
355                 printf("%s: TX timeout\n", name);
356         }
357
358         /* No one cares anyway */
359         return 0;
360 }
361
362 static void reclaim_rx_buffers(struct macb_device *macb,
363                                unsigned int new_tail)
364 {
365         unsigned int i;
366
367         i = macb->rx_tail;
368
369         macb_invalidate_ring_desc(macb, RX);
370         while (i > new_tail) {
371                 macb->rx_ring[i].addr &= ~MACB_BIT(RX_USED);
372                 i++;
373                 if (i > MACB_RX_RING_SIZE)
374                         i = 0;
375         }
376
377         while (i < new_tail) {
378                 macb->rx_ring[i].addr &= ~MACB_BIT(RX_USED);
379                 i++;
380         }
381
382         barrier();
383         macb_flush_ring_desc(macb, RX);
384         macb->rx_tail = new_tail;
385 }
386
387 static int _macb_recv(struct macb_device *macb, uchar **packetp)
388 {
389         unsigned int next_rx_tail = macb->next_rx_tail;
390         void *buffer;
391         int length;
392         u32 status;
393
394         macb->wrapped = false;
395         for (;;) {
396                 macb_invalidate_ring_desc(macb, RX);
397
398                 if (!(macb->rx_ring[next_rx_tail].addr & MACB_BIT(RX_USED)))
399                         return -EAGAIN;
400
401                 status = macb->rx_ring[next_rx_tail].ctrl;
402                 if (status & MACB_BIT(RX_SOF)) {
403                         if (next_rx_tail != macb->rx_tail)
404                                 reclaim_rx_buffers(macb, next_rx_tail);
405                         macb->wrapped = false;
406                 }
407
408                 if (status & MACB_BIT(RX_EOF)) {
409                         buffer = macb->rx_buffer +
410                                 macb->rx_buffer_size * 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 = macb->rx_buffer_size *
418                                         (MACB_RX_RING_SIZE - 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  * @dev/@regs:  MACB udevice (DM version) or
492  *              Base Register of MACB devices (non-DM version)
493  * @speed:      Linkspeed
494  * Returns 0 when operation success and negative errno number
495  * when operation failed.
496  */
497 #ifdef CONFIG_DM_ETH
498 static int macb_sifive_clk_init(struct udevice *dev, ulong rate)
499 {
500         fdt_addr_t addr;
501         void *gemgxl_regs;
502
503         addr = dev_read_addr_index(dev, 1);
504         if (addr == FDT_ADDR_T_NONE)
505                 return -ENODEV;
506
507         gemgxl_regs = (void __iomem *)addr;
508         if (!gemgxl_regs)
509                 return -ENODEV;
510
511         /*
512          * SiFive GEMGXL TX clock operation mode:
513          *
514          * 0 = GMII mode. Use 125 MHz gemgxlclk from PRCI in TX logic
515          *     and output clock on GMII output signal GTX_CLK
516          * 1 = MII mode. Use MII input signal TX_CLK in TX logic
517          */
518         writel(rate != 125000000, gemgxl_regs);
519         return 0;
520 }
521
522 int __weak macb_linkspd_cb(struct udevice *dev, unsigned int speed)
523 {
524 #ifdef CONFIG_CLK
525         struct macb_device *macb = dev_get_priv(dev);
526         struct clk tx_clk;
527         ulong rate;
528         int ret;
529
530         switch (speed) {
531         case _10BASET:
532                 rate = 2500000;         /* 2.5 MHz */
533                 break;
534         case _100BASET:
535                 rate = 25000000;        /* 25 MHz */
536                 break;
537         case _1000BASET:
538                 rate = 125000000;       /* 125 MHz */
539                 break;
540         default:
541                 /* does not change anything */
542                 return 0;
543         }
544
545         if (macb->config->clk_init)
546                 return macb->config->clk_init(dev, rate);
547
548         /*
549          * "tx_clk" is an optional clock source for MACB.
550          * Ignore if it does not exist in DT.
551          */
552         ret = clk_get_by_name(dev, "tx_clk", &tx_clk);
553         if (ret)
554                 return 0;
555
556         if (tx_clk.dev) {
557                 ret = clk_set_rate(&tx_clk, rate);
558                 if (ret)
559                         return ret;
560         }
561 #endif
562
563         return 0;
564 }
565 #else
566 int __weak macb_linkspd_cb(void *regs, unsigned int speed)
567 {
568         return 0;
569 }
570 #endif
571
572 #ifdef CONFIG_DM_ETH
573 static int macb_phy_init(struct udevice *dev, const char *name)
574 #else
575 static int macb_phy_init(struct macb_device *macb, const char *name)
576 #endif
577 {
578 #ifdef CONFIG_DM_ETH
579         struct macb_device *macb = dev_get_priv(dev);
580 #endif
581         u32 ncfgr;
582         u16 phy_id, status, adv, lpa;
583         int media, speed, duplex;
584         int ret;
585         int i;
586
587         arch_get_mdio_control(name);
588         /* Auto-detect phy_addr */
589         ret = macb_phy_find(macb, name);
590         if (ret)
591                 return ret;
592
593         /* Check if the PHY is up to snuff... */
594         phy_id = macb_mdio_read(macb, MII_PHYSID1);
595         if (phy_id == 0xffff) {
596                 printf("%s: No PHY present\n", name);
597                 return -ENODEV;
598         }
599
600 #ifdef CONFIG_PHYLIB
601 #ifdef CONFIG_DM_ETH
602         macb->phydev = phy_connect(macb->bus, macb->phy_addr, dev,
603                              macb->phy_interface);
604 #else
605         /* need to consider other phy interface mode */
606         macb->phydev = phy_connect(macb->bus, macb->phy_addr, &macb->netdev,
607                              PHY_INTERFACE_MODE_RGMII);
608 #endif
609         if (!macb->phydev) {
610                 printf("phy_connect failed\n");
611                 return -ENODEV;
612         }
613
614         phy_config(macb->phydev);
615 #endif
616
617         status = macb_mdio_read(macb, MII_BMSR);
618         if (!(status & BMSR_LSTATUS)) {
619                 /* Try to re-negotiate if we don't have link already. */
620                 macb_phy_reset(macb, name);
621
622                 for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) {
623                         status = macb_mdio_read(macb, MII_BMSR);
624                         if (status & BMSR_LSTATUS) {
625                                 /*
626                                  * Delay a bit after the link is established,
627                                  * so that the next xfer does not fail
628                                  */
629                                 mdelay(10);
630                                 break;
631                         }
632                         udelay(100);
633                 }
634         }
635
636         if (!(status & BMSR_LSTATUS)) {
637                 printf("%s: link down (status: 0x%04x)\n",
638                        name, status);
639                 return -ENETDOWN;
640         }
641
642         /* First check for GMAC and that it is GiB capable */
643         if (gem_is_gigabit_capable(macb)) {
644                 lpa = macb_mdio_read(macb, MII_LPA);
645
646                 if (lpa & (LPA_1000FULL | LPA_1000HALF | LPA_1000XFULL |
647                                         LPA_1000XHALF)) {
648                         duplex = ((lpa & (LPA_1000FULL | LPA_1000XFULL)) ?
649                                         1 : 0);
650
651                         printf("%s: link up, 1000Mbps %s-duplex (lpa: 0x%04x)\n",
652                                name,
653                                duplex ? "full" : "half",
654                                lpa);
655
656                         ncfgr = macb_readl(macb, NCFGR);
657                         ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD));
658                         ncfgr |= GEM_BIT(GBE);
659
660                         if (duplex)
661                                 ncfgr |= MACB_BIT(FD);
662
663                         macb_writel(macb, NCFGR, ncfgr);
664
665 #ifdef CONFIG_DM_ETH
666                         ret = macb_linkspd_cb(dev, _1000BASET);
667 #else
668                         ret = macb_linkspd_cb(macb->regs, _1000BASET);
669 #endif
670                         if (ret)
671                                 return ret;
672
673                         return 0;
674                 }
675         }
676
677         /* fall back for EMAC checking */
678         adv = macb_mdio_read(macb, MII_ADVERTISE);
679         lpa = macb_mdio_read(macb, MII_LPA);
680         media = mii_nway_result(lpa & adv);
681         speed = (media & (ADVERTISE_100FULL | ADVERTISE_100HALF)
682                  ? 1 : 0);
683         duplex = (media & ADVERTISE_FULL) ? 1 : 0;
684         printf("%s: link up, %sMbps %s-duplex (lpa: 0x%04x)\n",
685                name,
686                speed ? "100" : "10",
687                duplex ? "full" : "half",
688                lpa);
689
690         ncfgr = macb_readl(macb, NCFGR);
691         ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD) | GEM_BIT(GBE));
692         if (speed) {
693                 ncfgr |= MACB_BIT(SPD);
694 #ifdef CONFIG_DM_ETH
695                 ret = macb_linkspd_cb(dev, _100BASET);
696 #else
697                 ret = macb_linkspd_cb(macb->regs, _100BASET);
698 #endif
699         } else {
700 #ifdef CONFIG_DM_ETH
701                 ret = macb_linkspd_cb(dev, _10BASET);
702 #else
703                 ret = macb_linkspd_cb(macb->regs, _10BASET);
704 #endif
705         }
706
707         if (ret)
708                 return ret;
709
710         if (duplex)
711                 ncfgr |= MACB_BIT(FD);
712         macb_writel(macb, NCFGR, ncfgr);
713
714         return 0;
715 }
716
717 static int gmac_init_multi_queues(struct macb_device *macb)
718 {
719         int i, num_queues = 1;
720         u32 queue_mask;
721
722         /* bit 0 is never set but queue 0 always exists */
723         queue_mask = gem_readl(macb, DCFG6) & 0xff;
724         queue_mask |= 0x1;
725
726         for (i = 1; i < MACB_MAX_QUEUES; i++)
727                 if (queue_mask & (1 << i))
728                         num_queues++;
729
730         macb->dummy_desc->ctrl = MACB_BIT(TX_USED);
731         macb->dummy_desc->addr = 0;
732         flush_dcache_range(macb->dummy_desc_dma, macb->dummy_desc_dma +
733                         ALIGN(MACB_TX_DUMMY_DMA_DESC_SIZE, PKTALIGN));
734
735         for (i = 1; i < num_queues; i++)
736                 gem_writel_queue_TBQP(macb, macb->dummy_desc_dma, i - 1);
737
738         return 0;
739 }
740
741 static void gmac_configure_dma(struct macb_device *macb)
742 {
743         u32 buffer_size;
744         u32 dmacfg;
745
746         buffer_size = macb->rx_buffer_size / RX_BUFFER_MULTIPLE;
747         dmacfg = gem_readl(macb, DMACFG) & ~GEM_BF(RXBS, -1L);
748         dmacfg |= GEM_BF(RXBS, buffer_size);
749
750         if (macb->config->dma_burst_length)
751                 dmacfg = GEM_BFINS(FBLDO,
752                                    macb->config->dma_burst_length, dmacfg);
753
754         dmacfg |= GEM_BIT(TXPBMS) | GEM_BF(RXBMS, -1L);
755         dmacfg &= ~GEM_BIT(ENDIA_PKT);
756
757 #ifdef CONFIG_SYS_LITTLE_ENDIAN
758                 dmacfg &= ~GEM_BIT(ENDIA_DESC);
759 #else
760                 dmacfg |= GEM_BIT(ENDIA_DESC); /* CPU in big endian */
761 #endif
762
763         dmacfg &= ~GEM_BIT(ADDR64);
764         gem_writel(macb, DMACFG, dmacfg);
765 }
766
767 #ifdef CONFIG_DM_ETH
768 static int _macb_init(struct udevice *dev, const char *name)
769 #else
770 static int _macb_init(struct macb_device *macb, const char *name)
771 #endif
772 {
773 #ifdef CONFIG_DM_ETH
774         struct macb_device *macb = dev_get_priv(dev);
775 #endif
776         unsigned long paddr;
777         int ret;
778         int i;
779
780         /*
781          * macb_halt should have been called at some point before now,
782          * so we'll assume the controller is idle.
783          */
784
785         /* initialize DMA descriptors */
786         paddr = macb->rx_buffer_dma;
787         for (i = 0; i < MACB_RX_RING_SIZE; i++) {
788                 if (i == (MACB_RX_RING_SIZE - 1))
789                         paddr |= MACB_BIT(RX_WRAP);
790                 macb->rx_ring[i].addr = paddr;
791                 macb->rx_ring[i].ctrl = 0;
792                 paddr += macb->rx_buffer_size;
793         }
794         macb_flush_ring_desc(macb, RX);
795         macb_flush_rx_buffer(macb);
796
797         for (i = 0; i < MACB_TX_RING_SIZE; i++) {
798                 macb->tx_ring[i].addr = 0;
799                 if (i == (MACB_TX_RING_SIZE - 1))
800                         macb->tx_ring[i].ctrl = MACB_BIT(TX_USED) |
801                                 MACB_BIT(TX_WRAP);
802                 else
803                         macb->tx_ring[i].ctrl = MACB_BIT(TX_USED);
804         }
805         macb_flush_ring_desc(macb, TX);
806
807         macb->rx_tail = 0;
808         macb->tx_head = 0;
809         macb->tx_tail = 0;
810         macb->next_rx_tail = 0;
811
812 #ifdef CONFIG_MACB_ZYNQ
813         macb_writel(macb, DMACFG, MACB_ZYNQ_GEM_DMACR_INIT);
814 #endif
815
816         macb_writel(macb, RBQP, macb->rx_ring_dma);
817         macb_writel(macb, TBQP, macb->tx_ring_dma);
818
819         if (macb_is_gem(macb)) {
820                 /* Initialize DMA properties */
821                 gmac_configure_dma(macb);
822                 /* Check the multi queue and initialize the queue for tx */
823                 gmac_init_multi_queues(macb);
824
825                 /*
826                  * When the GMAC IP with GE feature, this bit is used to
827                  * select interface between RGMII and GMII.
828                  * When the GMAC IP without GE feature, this bit is used
829                  * to select interface between RMII and MII.
830                  */
831 #ifdef CONFIG_DM_ETH
832                 if ((macb->phy_interface == PHY_INTERFACE_MODE_RMII) ||
833                     (macb->phy_interface == PHY_INTERFACE_MODE_RGMII))
834                         gem_writel(macb, USRIO, GEM_BIT(RGMII));
835                 else
836                         gem_writel(macb, USRIO, 0);
837
838                 if (macb->phy_interface == PHY_INTERFACE_MODE_SGMII) {
839                         unsigned int ncfgr = macb_readl(macb, NCFGR);
840
841                         ncfgr |= GEM_BIT(SGMIIEN) | GEM_BIT(PCSSEL);
842                         macb_writel(macb, NCFGR, ncfgr);
843                 }
844 #else
845 #if defined(CONFIG_RGMII) || defined(CONFIG_RMII)
846                 gem_writel(macb, USRIO, GEM_BIT(RGMII));
847 #else
848                 gem_writel(macb, USRIO, 0);
849 #endif
850 #endif
851         } else {
852         /* choose RMII or MII mode. This depends on the board */
853 #ifdef CONFIG_DM_ETH
854 #ifdef CONFIG_AT91FAMILY
855                 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) {
856                         macb_writel(macb, USRIO,
857                                     MACB_BIT(RMII) | MACB_BIT(CLKEN));
858                 } else {
859                         macb_writel(macb, USRIO, MACB_BIT(CLKEN));
860                 }
861 #else
862                 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII)
863                         macb_writel(macb, USRIO, 0);
864                 else
865                         macb_writel(macb, USRIO, MACB_BIT(MII));
866 #endif
867 #else
868 #ifdef CONFIG_RMII
869 #ifdef CONFIG_AT91FAMILY
870         macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
871 #else
872         macb_writel(macb, USRIO, 0);
873 #endif
874 #else
875 #ifdef CONFIG_AT91FAMILY
876         macb_writel(macb, USRIO, MACB_BIT(CLKEN));
877 #else
878         macb_writel(macb, USRIO, MACB_BIT(MII));
879 #endif
880 #endif /* CONFIG_RMII */
881 #endif
882         }
883
884 #ifdef CONFIG_DM_ETH
885         ret = macb_phy_init(dev, name);
886 #else
887         ret = macb_phy_init(macb, name);
888 #endif
889         if (ret)
890                 return ret;
891
892         /* Enable TX and RX */
893         macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE));
894
895         return 0;
896 }
897
898 static void _macb_halt(struct macb_device *macb)
899 {
900         u32 ncr, tsr;
901
902         /* Halt the controller and wait for any ongoing transmission to end. */
903         ncr = macb_readl(macb, NCR);
904         ncr |= MACB_BIT(THALT);
905         macb_writel(macb, NCR, ncr);
906
907         do {
908                 tsr = macb_readl(macb, TSR);
909         } while (tsr & MACB_BIT(TGO));
910
911         /* Disable TX and RX, and clear statistics */
912         macb_writel(macb, NCR, MACB_BIT(CLRSTAT));
913 }
914
915 static int _macb_write_hwaddr(struct macb_device *macb, unsigned char *enetaddr)
916 {
917         u32 hwaddr_bottom;
918         u16 hwaddr_top;
919
920         /* set hardware address */
921         hwaddr_bottom = enetaddr[0] | enetaddr[1] << 8 |
922                         enetaddr[2] << 16 | enetaddr[3] << 24;
923         macb_writel(macb, SA1B, hwaddr_bottom);
924         hwaddr_top = enetaddr[4] | enetaddr[5] << 8;
925         macb_writel(macb, SA1T, hwaddr_top);
926         return 0;
927 }
928
929 static u32 macb_mdc_clk_div(int id, struct macb_device *macb)
930 {
931         u32 config;
932 #if defined(CONFIG_DM_ETH) && defined(CONFIG_CLK)
933         unsigned long macb_hz = macb->pclk_rate;
934 #else
935         unsigned long macb_hz = get_macb_pclk_rate(id);
936 #endif
937
938         if (macb_hz < 20000000)
939                 config = MACB_BF(CLK, MACB_CLK_DIV8);
940         else if (macb_hz < 40000000)
941                 config = MACB_BF(CLK, MACB_CLK_DIV16);
942         else if (macb_hz < 80000000)
943                 config = MACB_BF(CLK, MACB_CLK_DIV32);
944         else
945                 config = MACB_BF(CLK, MACB_CLK_DIV64);
946
947         return config;
948 }
949
950 static u32 gem_mdc_clk_div(int id, struct macb_device *macb)
951 {
952         u32 config;
953
954 #if defined(CONFIG_DM_ETH) && defined(CONFIG_CLK)
955         unsigned long macb_hz = macb->pclk_rate;
956 #else
957         unsigned long macb_hz = get_macb_pclk_rate(id);
958 #endif
959
960         if (macb_hz < 20000000)
961                 config = GEM_BF(CLK, GEM_CLK_DIV8);
962         else if (macb_hz < 40000000)
963                 config = GEM_BF(CLK, GEM_CLK_DIV16);
964         else if (macb_hz < 80000000)
965                 config = GEM_BF(CLK, GEM_CLK_DIV32);
966         else if (macb_hz < 120000000)
967                 config = GEM_BF(CLK, GEM_CLK_DIV48);
968         else if (macb_hz < 160000000)
969                 config = GEM_BF(CLK, GEM_CLK_DIV64);
970         else if (macb_hz < 240000000)
971                 config = GEM_BF(CLK, GEM_CLK_DIV96);
972         else if (macb_hz < 320000000)
973                 config = GEM_BF(CLK, GEM_CLK_DIV128);
974         else
975                 config = GEM_BF(CLK, GEM_CLK_DIV224);
976
977         return config;
978 }
979
980 /*
981  * Get the DMA bus width field of the network configuration register that we
982  * should program. We find the width from decoding the design configuration
983  * register to find the maximum supported data bus width.
984  */
985 static u32 macb_dbw(struct macb_device *macb)
986 {
987         switch (GEM_BFEXT(DBWDEF, gem_readl(macb, DCFG1))) {
988         case 4:
989                 return GEM_BF(DBW, GEM_DBW128);
990         case 2:
991                 return GEM_BF(DBW, GEM_DBW64);
992         case 1:
993         default:
994                 return GEM_BF(DBW, GEM_DBW32);
995         }
996 }
997
998 static void _macb_eth_initialize(struct macb_device *macb)
999 {
1000         int id = 0;     /* This is not used by functions we call */
1001         u32 ncfgr;
1002
1003         if (macb_is_gem(macb))
1004                 macb->rx_buffer_size = GEM_RX_BUFFER_SIZE;
1005         else
1006                 macb->rx_buffer_size = MACB_RX_BUFFER_SIZE;
1007
1008         /* TODO: we need check the rx/tx_ring_dma is dcache line aligned */
1009         macb->rx_buffer = dma_alloc_coherent(macb->rx_buffer_size *
1010                                              MACB_RX_RING_SIZE,
1011                                              &macb->rx_buffer_dma);
1012         macb->rx_ring = dma_alloc_coherent(MACB_RX_DMA_DESC_SIZE,
1013                                            &macb->rx_ring_dma);
1014         macb->tx_ring = dma_alloc_coherent(MACB_TX_DMA_DESC_SIZE,
1015                                            &macb->tx_ring_dma);
1016         macb->dummy_desc = dma_alloc_coherent(MACB_TX_DUMMY_DMA_DESC_SIZE,
1017                                            &macb->dummy_desc_dma);
1018
1019         /*
1020          * Do some basic initialization so that we at least can talk
1021          * to the PHY
1022          */
1023         if (macb_is_gem(macb)) {
1024                 ncfgr = gem_mdc_clk_div(id, macb);
1025                 ncfgr |= macb_dbw(macb);
1026         } else {
1027                 ncfgr = macb_mdc_clk_div(id, macb);
1028         }
1029
1030         macb_writel(macb, NCFGR, ncfgr);
1031 }
1032
1033 #ifndef CONFIG_DM_ETH
1034 static int macb_send(struct eth_device *netdev, void *packet, int length)
1035 {
1036         struct macb_device *macb = to_macb(netdev);
1037
1038         return _macb_send(macb, netdev->name, packet, length);
1039 }
1040
1041 static int macb_recv(struct eth_device *netdev)
1042 {
1043         struct macb_device *macb = to_macb(netdev);
1044         uchar *packet;
1045         int length;
1046
1047         macb->wrapped = false;
1048         for (;;) {
1049                 macb->next_rx_tail = macb->rx_tail;
1050                 length = _macb_recv(macb, &packet);
1051                 if (length >= 0) {
1052                         net_process_received_packet(packet, length);
1053                         reclaim_rx_buffers(macb, macb->next_rx_tail);
1054                 } else {
1055                         return length;
1056                 }
1057         }
1058 }
1059
1060 static int macb_init(struct eth_device *netdev, bd_t *bd)
1061 {
1062         struct macb_device *macb = to_macb(netdev);
1063
1064         return _macb_init(macb, netdev->name);
1065 }
1066
1067 static void macb_halt(struct eth_device *netdev)
1068 {
1069         struct macb_device *macb = to_macb(netdev);
1070
1071         return _macb_halt(macb);
1072 }
1073
1074 static int macb_write_hwaddr(struct eth_device *netdev)
1075 {
1076         struct macb_device *macb = to_macb(netdev);
1077
1078         return _macb_write_hwaddr(macb, netdev->enetaddr);
1079 }
1080
1081 int macb_eth_initialize(int id, void *regs, unsigned int phy_addr)
1082 {
1083         struct macb_device *macb;
1084         struct eth_device *netdev;
1085
1086         macb = malloc(sizeof(struct macb_device));
1087         if (!macb) {
1088                 printf("Error: Failed to allocate memory for MACB%d\n", id);
1089                 return -1;
1090         }
1091         memset(macb, 0, sizeof(struct macb_device));
1092
1093         netdev = &macb->netdev;
1094
1095         macb->regs = regs;
1096         macb->phy_addr = phy_addr;
1097
1098         if (macb_is_gem(macb))
1099                 sprintf(netdev->name, "gmac%d", id);
1100         else
1101                 sprintf(netdev->name, "macb%d", id);
1102
1103         netdev->init = macb_init;
1104         netdev->halt = macb_halt;
1105         netdev->send = macb_send;
1106         netdev->recv = macb_recv;
1107         netdev->write_hwaddr = macb_write_hwaddr;
1108
1109         _macb_eth_initialize(macb);
1110
1111         eth_register(netdev);
1112
1113 #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB)
1114         int retval;
1115         struct mii_dev *mdiodev = mdio_alloc();
1116         if (!mdiodev)
1117                 return -ENOMEM;
1118         strncpy(mdiodev->name, netdev->name, MDIO_NAME_LEN);
1119         mdiodev->read = macb_miiphy_read;
1120         mdiodev->write = macb_miiphy_write;
1121
1122         retval = mdio_register(mdiodev);
1123         if (retval < 0)
1124                 return retval;
1125         macb->bus = miiphy_get_dev_by_name(netdev->name);
1126 #endif
1127         return 0;
1128 }
1129 #endif /* !CONFIG_DM_ETH */
1130
1131 #ifdef CONFIG_DM_ETH
1132
1133 static int macb_start(struct udevice *dev)
1134 {
1135         return _macb_init(dev, dev->name);
1136 }
1137
1138 static int macb_send(struct udevice *dev, void *packet, int length)
1139 {
1140         struct macb_device *macb = dev_get_priv(dev);
1141
1142         return _macb_send(macb, dev->name, packet, length);
1143 }
1144
1145 static int macb_recv(struct udevice *dev, int flags, uchar **packetp)
1146 {
1147         struct macb_device *macb = dev_get_priv(dev);
1148
1149         macb->next_rx_tail = macb->rx_tail;
1150         macb->wrapped = false;
1151
1152         return _macb_recv(macb, packetp);
1153 }
1154
1155 static int macb_free_pkt(struct udevice *dev, uchar *packet, int length)
1156 {
1157         struct macb_device *macb = dev_get_priv(dev);
1158
1159         reclaim_rx_buffers(macb, macb->next_rx_tail);
1160
1161         return 0;
1162 }
1163
1164 static void macb_stop(struct udevice *dev)
1165 {
1166         struct macb_device *macb = dev_get_priv(dev);
1167
1168         _macb_halt(macb);
1169 }
1170
1171 static int macb_write_hwaddr(struct udevice *dev)
1172 {
1173         struct eth_pdata *plat = dev_get_platdata(dev);
1174         struct macb_device *macb = dev_get_priv(dev);
1175
1176         return _macb_write_hwaddr(macb, plat->enetaddr);
1177 }
1178
1179 static const struct eth_ops macb_eth_ops = {
1180         .start  = macb_start,
1181         .send   = macb_send,
1182         .recv   = macb_recv,
1183         .stop   = macb_stop,
1184         .free_pkt       = macb_free_pkt,
1185         .write_hwaddr   = macb_write_hwaddr,
1186 };
1187
1188 #ifdef CONFIG_CLK
1189 static int macb_enable_clk(struct udevice *dev)
1190 {
1191         struct macb_device *macb = dev_get_priv(dev);
1192         struct clk clk;
1193         ulong clk_rate;
1194         int ret;
1195
1196         ret = clk_get_by_index(dev, 0, &clk);
1197         if (ret)
1198                 return -EINVAL;
1199
1200         /*
1201          * If clock driver didn't support enable or disable then
1202          * we get -ENOSYS from clk_enable(). To handle this, we
1203          * don't fail for ret == -ENOSYS.
1204          */
1205         ret = clk_enable(&clk);
1206         if (ret && ret != -ENOSYS)
1207                 return ret;
1208
1209         clk_rate = clk_get_rate(&clk);
1210         if (!clk_rate)
1211                 return -EINVAL;
1212
1213         macb->pclk_rate = clk_rate;
1214
1215         return 0;
1216 }
1217 #endif
1218
1219 static const struct macb_config default_gem_config = {
1220         .dma_burst_length = 16,
1221         .clk_init = NULL,
1222 };
1223
1224 static int macb_eth_probe(struct udevice *dev)
1225 {
1226         struct eth_pdata *pdata = dev_get_platdata(dev);
1227         struct macb_device *macb = dev_get_priv(dev);
1228         const char *phy_mode;
1229         int ret;
1230
1231         phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
1232                                NULL);
1233         if (phy_mode)
1234                 macb->phy_interface = phy_get_interface_by_name(phy_mode);
1235         if (macb->phy_interface == -1) {
1236                 debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
1237                 return -EINVAL;
1238         }
1239
1240         macb->regs = (void *)pdata->iobase;
1241
1242         macb->config = (struct macb_config *)dev_get_driver_data(dev);
1243         if (!macb->config)
1244                 macb->config = &default_gem_config;
1245
1246 #ifdef CONFIG_CLK
1247         ret = macb_enable_clk(dev);
1248         if (ret)
1249                 return ret;
1250 #endif
1251
1252         _macb_eth_initialize(macb);
1253
1254 #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB)
1255         macb->bus = mdio_alloc();
1256         if (!macb->bus)
1257                 return -ENOMEM;
1258         strncpy(macb->bus->name, dev->name, MDIO_NAME_LEN);
1259         macb->bus->read = macb_miiphy_read;
1260         macb->bus->write = macb_miiphy_write;
1261
1262         ret = mdio_register(macb->bus);
1263         if (ret < 0)
1264                 return ret;
1265         macb->bus = miiphy_get_dev_by_name(dev->name);
1266 #endif
1267
1268         return 0;
1269 }
1270
1271 static int macb_eth_remove(struct udevice *dev)
1272 {
1273         struct macb_device *macb = dev_get_priv(dev);
1274
1275 #ifdef CONFIG_PHYLIB
1276         free(macb->phydev);
1277 #endif
1278         mdio_unregister(macb->bus);
1279         mdio_free(macb->bus);
1280
1281         return 0;
1282 }
1283
1284 /**
1285  * macb_late_eth_ofdata_to_platdata
1286  * @dev:        udevice struct
1287  * Returns 0 when operation success and negative errno number
1288  * when operation failed.
1289  */
1290 int __weak macb_late_eth_ofdata_to_platdata(struct udevice *dev)
1291 {
1292         return 0;
1293 }
1294
1295 static int macb_eth_ofdata_to_platdata(struct udevice *dev)
1296 {
1297         struct eth_pdata *pdata = dev_get_platdata(dev);
1298
1299         pdata->iobase = (phys_addr_t)dev_remap_addr(dev);
1300         if (!pdata->iobase)
1301                 return -EINVAL;
1302
1303         return macb_late_eth_ofdata_to_platdata(dev);
1304 }
1305
1306 static const struct macb_config sama5d4_config = {
1307         .dma_burst_length = 4,
1308         .clk_init = NULL,
1309 };
1310
1311 static const struct macb_config sifive_config = {
1312         .dma_burst_length = 16,
1313         .clk_init = macb_sifive_clk_init,
1314 };
1315
1316 static const struct udevice_id macb_eth_ids[] = {
1317         { .compatible = "cdns,macb" },
1318         { .compatible = "cdns,at91sam9260-macb" },
1319         { .compatible = "atmel,sama5d2-gem" },
1320         { .compatible = "atmel,sama5d3-gem" },
1321         { .compatible = "atmel,sama5d4-gem", .data = (ulong)&sama5d4_config },
1322         { .compatible = "cdns,zynq-gem" },
1323         { .compatible = "sifive,fu540-c000-gem",
1324           .data = (ulong)&sifive_config },
1325         { }
1326 };
1327
1328 U_BOOT_DRIVER(eth_macb) = {
1329         .name   = "eth_macb",
1330         .id     = UCLASS_ETH,
1331         .of_match = macb_eth_ids,
1332         .ofdata_to_platdata = macb_eth_ofdata_to_platdata,
1333         .probe  = macb_eth_probe,
1334         .remove = macb_eth_remove,
1335         .ops    = &macb_eth_ops,
1336         .priv_auto_alloc_size = sizeof(struct macb_device),
1337         .platdata_auto_alloc_size = sizeof(struct eth_pdata),
1338 };
1339 #endif
1340
1341 #endif