985ac961f1c413cc7600d044b8aaac66b1a4e50d
[platform/kernel/u-boot.git] / drivers / net / sun8i_emac.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2016
4  * Author: Amit Singh Tomar, amittomer25@gmail.com
5  *
6  * Ethernet driver for H3/A64/A83T based SoC's
7  *
8  * It is derived from the work done by
9  * LABBE Corentin & Chen-Yu Tsai for Linux, THANKS!
10  *
11 */
12
13 #include <cpu_func.h>
14 #include <log.h>
15 #include <asm/cache.h>
16 #include <asm/io.h>
17 #include <asm/arch/clock.h>
18 #include <asm/arch/gpio.h>
19 #include <common.h>
20 #include <clk.h>
21 #include <dm.h>
22 #include <fdt_support.h>
23 #include <dm/device_compat.h>
24 #include <linux/bitops.h>
25 #include <linux/delay.h>
26 #include <linux/err.h>
27 #include <malloc.h>
28 #include <miiphy.h>
29 #include <net.h>
30 #include <reset.h>
31 #include <dt-bindings/pinctrl/sun4i-a10.h>
32 #include <wait_bit.h>
33 #if CONFIG_IS_ENABLED(DM_GPIO)
34 #include <asm-generic/gpio.h>
35 #endif
36
37 #define MDIO_CMD_MII_BUSY               BIT(0)
38 #define MDIO_CMD_MII_WRITE              BIT(1)
39
40 #define MDIO_CMD_MII_PHY_REG_ADDR_MASK  0x000001f0
41 #define MDIO_CMD_MII_PHY_REG_ADDR_SHIFT 4
42 #define MDIO_CMD_MII_PHY_ADDR_MASK      0x0001f000
43 #define MDIO_CMD_MII_PHY_ADDR_SHIFT     12
44
45 #define CONFIG_TX_DESCR_NUM     32
46 #define CONFIG_RX_DESCR_NUM     32
47 #define CONFIG_ETH_BUFSIZE      2048 /* Note must be dma aligned */
48
49 /*
50  * The datasheet says that each descriptor can transfers up to 4096 bytes
51  * But later, the register documentation reduces that value to 2048,
52  * using 2048 cause strange behaviours and even BSP driver use 2047
53  */
54 #define CONFIG_ETH_RXSIZE       2044 /* Note must fit in ETH_BUFSIZE */
55
56 #define TX_TOTAL_BUFSIZE        (CONFIG_ETH_BUFSIZE * CONFIG_TX_DESCR_NUM)
57 #define RX_TOTAL_BUFSIZE        (CONFIG_ETH_BUFSIZE * CONFIG_RX_DESCR_NUM)
58
59 #define H3_EPHY_DEFAULT_VALUE   0x58000
60 #define H3_EPHY_DEFAULT_MASK    GENMASK(31, 15)
61 #define H3_EPHY_ADDR_SHIFT      20
62 #define REG_PHY_ADDR_MASK       GENMASK(4, 0)
63 #define H3_EPHY_LED_POL         BIT(17) /* 1: active low, 0: active high */
64 #define H3_EPHY_SHUTDOWN        BIT(16) /* 1: shutdown, 0: power up */
65 #define H3_EPHY_SELECT          BIT(15) /* 1: internal PHY, 0: external PHY */
66
67 #define SC_RMII_EN              BIT(13)
68 #define SC_EPIT                 BIT(2) /* 1: RGMII, 0: MII */
69 #define SC_ETCS_MASK            GENMASK(1, 0)
70 #define SC_ETCS_EXT_GMII        0x1
71 #define SC_ETCS_INT_GMII        0x2
72 #define SC_ETXDC_MASK           GENMASK(12, 10)
73 #define SC_ETXDC_OFFSET         10
74 #define SC_ERXDC_MASK           GENMASK(9, 5)
75 #define SC_ERXDC_OFFSET         5
76
77 #define CONFIG_MDIO_TIMEOUT     (3 * CONFIG_SYS_HZ)
78
79 #define AHB_GATE_OFFSET_EPHY    0
80
81 /* IO mux settings */
82 #define SUN8I_IOMUX_H3          2
83 #define SUN8I_IOMUX_R40 5
84 #define SUN8I_IOMUX             4
85
86 /* H3/A64 EMAC Register's offset */
87 #define EMAC_CTL0               0x00
88 #define EMAC_CTL0_FULL_DUPLEX           BIT(0)
89 #define EMAC_CTL0_SPEED_MASK            GENMASK(3, 2)
90 #define EMAC_CTL0_SPEED_10              (0x2 << 2)
91 #define EMAC_CTL0_SPEED_100             (0x3 << 2)
92 #define EMAC_CTL0_SPEED_1000            (0x0 << 2)
93 #define EMAC_CTL1               0x04
94 #define EMAC_CTL1_SOFT_RST              BIT(0)
95 #define EMAC_CTL1_BURST_LEN_SHIFT       24
96 #define EMAC_INT_STA            0x08
97 #define EMAC_INT_EN             0x0c
98 #define EMAC_TX_CTL0            0x10
99 #define EMAC_TX_CTL0_TX_EN              BIT(31)
100 #define EMAC_TX_CTL1            0x14
101 #define EMAC_TX_CTL1_TX_MD              BIT(1)
102 #define EMAC_TX_CTL1_TX_DMA_EN          BIT(30)
103 #define EMAC_TX_CTL1_TX_DMA_START       BIT(31)
104 #define EMAC_TX_FLOW_CTL        0x1c
105 #define EMAC_TX_DMA_DESC        0x20
106 #define EMAC_RX_CTL0            0x24
107 #define EMAC_RX_CTL0_RX_EN              BIT(31)
108 #define EMAC_RX_CTL1            0x28
109 #define EMAC_RX_CTL1_RX_MD              BIT(1)
110 #define EMAC_RX_CTL1_RX_RUNT_FRM        BIT(2)
111 #define EMAC_RX_CTL1_RX_ERR_FRM         BIT(3)
112 #define EMAC_RX_CTL1_RX_DMA_EN          BIT(30)
113 #define EMAC_RX_CTL1_RX_DMA_START       BIT(31)
114 #define EMAC_RX_DMA_DESC        0x34
115 #define EMAC_MII_CMD            0x48
116 #define EMAC_MII_DATA           0x4c
117 #define EMAC_ADDR0_HIGH         0x50
118 #define EMAC_ADDR0_LOW          0x54
119 #define EMAC_TX_DMA_STA         0xb0
120 #define EMAC_TX_CUR_DESC        0xb4
121 #define EMAC_TX_CUR_BUF         0xb8
122 #define EMAC_RX_DMA_STA         0xc0
123 #define EMAC_RX_CUR_DESC        0xc4
124
125 #define EMAC_DESC_OWN_DMA       BIT(31)
126 #define EMAC_DESC_LAST_DESC     BIT(30)
127 #define EMAC_DESC_FIRST_DESC    BIT(29)
128 #define EMAC_DESC_CHAIN_SECOND  BIT(24)
129
130 #define EMAC_DESC_RX_ERROR_MASK 0x400068db
131
132 DECLARE_GLOBAL_DATA_PTR;
133
134 enum emac_variant {
135         A83T_EMAC = 1,
136         H3_EMAC,
137         A64_EMAC,
138         R40_GMAC,
139         H6_EMAC,
140 };
141
142 struct emac_dma_desc {
143         u32 status;
144         u32 ctl_size;
145         u32 buf_addr;
146         u32 next;
147 } __aligned(ARCH_DMA_MINALIGN);
148
149 struct emac_eth_dev {
150         struct emac_dma_desc rx_chain[CONFIG_TX_DESCR_NUM];
151         struct emac_dma_desc tx_chain[CONFIG_RX_DESCR_NUM];
152         char rxbuffer[RX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
153         char txbuffer[TX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
154
155         u32 interface;
156         u32 phyaddr;
157         u32 link;
158         u32 speed;
159         u32 duplex;
160         u32 phy_configured;
161         u32 tx_currdescnum;
162         u32 rx_currdescnum;
163         u32 addr;
164         u32 tx_slot;
165         bool use_internal_phy;
166
167         enum emac_variant variant;
168         void *mac_reg;
169         phys_addr_t sysctl_reg;
170         struct phy_device *phydev;
171         struct mii_dev *bus;
172         struct clk tx_clk;
173         struct clk ephy_clk;
174         struct reset_ctl tx_rst;
175         struct reset_ctl ephy_rst;
176 #if CONFIG_IS_ENABLED(DM_GPIO)
177         struct gpio_desc reset_gpio;
178 #endif
179 };
180
181
182 struct sun8i_eth_pdata {
183         struct eth_pdata eth_pdata;
184         u32 reset_delays[3];
185         int tx_delay_ps;
186         int rx_delay_ps;
187 };
188
189
190 static int sun8i_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
191 {
192         struct udevice *dev = bus->priv;
193         struct emac_eth_dev *priv = dev_get_priv(dev);
194         u32 mii_cmd;
195         int ret;
196
197         mii_cmd = (reg << MDIO_CMD_MII_PHY_REG_ADDR_SHIFT) &
198                 MDIO_CMD_MII_PHY_REG_ADDR_MASK;
199         mii_cmd |= (addr << MDIO_CMD_MII_PHY_ADDR_SHIFT) &
200                 MDIO_CMD_MII_PHY_ADDR_MASK;
201
202         mii_cmd |= MDIO_CMD_MII_BUSY;
203
204         writel(mii_cmd, priv->mac_reg + EMAC_MII_CMD);
205
206         ret = wait_for_bit_le32(priv->mac_reg + EMAC_MII_CMD,
207                                 MDIO_CMD_MII_BUSY, false,
208                                 CONFIG_MDIO_TIMEOUT, true);
209         if (ret < 0)
210                 return ret;
211
212         return readl(priv->mac_reg + EMAC_MII_DATA);
213 }
214
215 static int sun8i_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
216                             u16 val)
217 {
218         struct udevice *dev = bus->priv;
219         struct emac_eth_dev *priv = dev_get_priv(dev);
220         u32 mii_cmd;
221
222         mii_cmd = (reg << MDIO_CMD_MII_PHY_REG_ADDR_SHIFT) &
223                 MDIO_CMD_MII_PHY_REG_ADDR_MASK;
224         mii_cmd |= (addr << MDIO_CMD_MII_PHY_ADDR_SHIFT) &
225                 MDIO_CMD_MII_PHY_ADDR_MASK;
226
227         mii_cmd |= MDIO_CMD_MII_WRITE;
228         mii_cmd |= MDIO_CMD_MII_BUSY;
229
230         writel(val, priv->mac_reg + EMAC_MII_DATA);
231         writel(mii_cmd, priv->mac_reg + EMAC_MII_CMD);
232
233         return wait_for_bit_le32(priv->mac_reg + EMAC_MII_CMD,
234                                  MDIO_CMD_MII_BUSY, false,
235                                  CONFIG_MDIO_TIMEOUT, true);
236 }
237
238 static int sun8i_eth_write_hwaddr(struct udevice *dev)
239 {
240         struct emac_eth_dev *priv = dev_get_priv(dev);
241         struct eth_pdata *pdata = dev_get_platdata(dev);
242         uchar *mac_id = pdata->enetaddr;
243         u32 macid_lo, macid_hi;
244
245         macid_lo = mac_id[0] + (mac_id[1] << 8) + (mac_id[2] << 16) +
246                 (mac_id[3] << 24);
247         macid_hi = mac_id[4] + (mac_id[5] << 8);
248
249         writel(macid_hi, priv->mac_reg + EMAC_ADDR0_HIGH);
250         writel(macid_lo, priv->mac_reg + EMAC_ADDR0_LOW);
251
252         return 0;
253 }
254
255 static void sun8i_adjust_link(struct emac_eth_dev *priv,
256                               struct phy_device *phydev)
257 {
258         u32 v;
259
260         v = readl(priv->mac_reg + EMAC_CTL0);
261
262         if (phydev->duplex)
263                 v |= EMAC_CTL0_FULL_DUPLEX;
264         else
265                 v &= ~EMAC_CTL0_FULL_DUPLEX;
266
267         v &= ~EMAC_CTL0_SPEED_MASK;
268
269         switch (phydev->speed) {
270         case 1000:
271                 v |= EMAC_CTL0_SPEED_1000;
272                 break;
273         case 100:
274                 v |= EMAC_CTL0_SPEED_100;
275                 break;
276         case 10:
277                 v |= EMAC_CTL0_SPEED_10;
278                 break;
279         }
280         writel(v, priv->mac_reg + EMAC_CTL0);
281 }
282
283 static int sun8i_emac_set_syscon_ephy(struct emac_eth_dev *priv, u32 *reg)
284 {
285         if (priv->use_internal_phy) {
286                 /* H3 based SoC's that has an Internal 100MBit PHY
287                  * needs to be configured and powered up before use
288                 */
289                 *reg &= ~H3_EPHY_DEFAULT_MASK;
290                 *reg |=  H3_EPHY_DEFAULT_VALUE;
291                 *reg |= priv->phyaddr << H3_EPHY_ADDR_SHIFT;
292                 *reg &= ~H3_EPHY_SHUTDOWN;
293                 *reg |= H3_EPHY_SELECT;
294         } else
295                 /* This is to select External Gigabit PHY on
296                  * the boards with H3 SoC.
297                 */
298                 *reg &= ~H3_EPHY_SELECT;
299
300         return 0;
301 }
302
303 static int sun8i_emac_set_syscon(struct sun8i_eth_pdata *pdata,
304                                  struct emac_eth_dev *priv)
305 {
306         int ret;
307         u32 reg;
308
309         if (priv->variant == R40_GMAC) {
310                 /* Select RGMII for R40 */
311                 reg = readl(priv->sysctl_reg + 0x164);
312                 reg |= SC_ETCS_INT_GMII |
313                        SC_EPIT |
314                        (CONFIG_GMAC_TX_DELAY << SC_ETXDC_OFFSET);
315
316                 writel(reg, priv->sysctl_reg + 0x164);
317                 return 0;
318         }
319
320         reg = readl(priv->sysctl_reg + 0x30);
321
322         if (priv->variant == H3_EMAC || priv->variant == H6_EMAC) {
323                 ret = sun8i_emac_set_syscon_ephy(priv, &reg);
324                 if (ret)
325                         return ret;
326         }
327
328         reg &= ~(SC_ETCS_MASK | SC_EPIT);
329         if (priv->variant == H3_EMAC ||
330             priv->variant == A64_EMAC ||
331             priv->variant == H6_EMAC)
332                 reg &= ~SC_RMII_EN;
333
334         switch (priv->interface) {
335         case PHY_INTERFACE_MODE_MII:
336                 /* default */
337                 break;
338         case PHY_INTERFACE_MODE_RGMII:
339                 reg |= SC_EPIT | SC_ETCS_INT_GMII;
340                 break;
341         case PHY_INTERFACE_MODE_RMII:
342                 if (priv->variant == H3_EMAC ||
343                     priv->variant == A64_EMAC ||
344                     priv->variant == H6_EMAC) {
345                         reg |= SC_RMII_EN | SC_ETCS_EXT_GMII;
346                 break;
347                 }
348                 /* RMII not supported on A83T */
349         default:
350                 debug("%s: Invalid PHY interface\n", __func__);
351                 return -EINVAL;
352         }
353
354         if (pdata->tx_delay_ps)
355                 reg |= ((pdata->tx_delay_ps / 100) << SC_ETXDC_OFFSET)
356                          & SC_ETXDC_MASK;
357
358         if (pdata->rx_delay_ps)
359                 reg |= ((pdata->rx_delay_ps / 100) << SC_ERXDC_OFFSET)
360                          & SC_ERXDC_MASK;
361
362         writel(reg, priv->sysctl_reg + 0x30);
363
364         return 0;
365 }
366
367 static int sun8i_phy_init(struct emac_eth_dev *priv, void *dev)
368 {
369         struct phy_device *phydev;
370
371         phydev = phy_connect(priv->bus, priv->phyaddr, dev, priv->interface);
372         if (!phydev)
373                 return -ENODEV;
374
375         phy_connect_dev(phydev, dev);
376
377         priv->phydev = phydev;
378         phy_config(priv->phydev);
379
380         return 0;
381 }
382
383 #define cache_clean_descriptor(desc)                                    \
384         flush_dcache_range((uintptr_t)(desc),                           \
385                            (uintptr_t)(desc) + sizeof(struct emac_dma_desc))
386
387 #define cache_inv_descriptor(desc)                                      \
388         invalidate_dcache_range((uintptr_t)(desc),                      \
389                                (uintptr_t)(desc) + sizeof(struct emac_dma_desc))
390
391 static void rx_descs_init(struct emac_eth_dev *priv)
392 {
393         struct emac_dma_desc *desc_table_p = &priv->rx_chain[0];
394         char *rxbuffs = &priv->rxbuffer[0];
395         struct emac_dma_desc *desc_p;
396         int i;
397
398         /*
399          * Make sure we don't have dirty cache lines around, which could
400          * be cleaned to DRAM *after* the MAC has already written data to it.
401          */
402         invalidate_dcache_range((uintptr_t)desc_table_p,
403                               (uintptr_t)desc_table_p + sizeof(priv->rx_chain));
404         invalidate_dcache_range((uintptr_t)rxbuffs,
405                                 (uintptr_t)rxbuffs + sizeof(priv->rxbuffer));
406
407         for (i = 0; i < CONFIG_RX_DESCR_NUM; i++) {
408                 desc_p = &desc_table_p[i];
409                 desc_p->buf_addr = (uintptr_t)&rxbuffs[i * CONFIG_ETH_BUFSIZE];
410                 desc_p->next = (uintptr_t)&desc_table_p[i + 1];
411                 desc_p->ctl_size = CONFIG_ETH_RXSIZE;
412                 desc_p->status = EMAC_DESC_OWN_DMA;
413         }
414
415         /* Correcting the last pointer of the chain */
416         desc_p->next = (uintptr_t)&desc_table_p[0];
417
418         flush_dcache_range((uintptr_t)priv->rx_chain,
419                            (uintptr_t)priv->rx_chain +
420                         sizeof(priv->rx_chain));
421
422         writel((uintptr_t)&desc_table_p[0], (priv->mac_reg + EMAC_RX_DMA_DESC));
423         priv->rx_currdescnum = 0;
424 }
425
426 static void tx_descs_init(struct emac_eth_dev *priv)
427 {
428         struct emac_dma_desc *desc_table_p = &priv->tx_chain[0];
429         char *txbuffs = &priv->txbuffer[0];
430         struct emac_dma_desc *desc_p;
431         int i;
432
433         for (i = 0; i < CONFIG_TX_DESCR_NUM; i++) {
434                 desc_p = &desc_table_p[i];
435                 desc_p->buf_addr = (uintptr_t)&txbuffs[i * CONFIG_ETH_BUFSIZE];
436                 desc_p->next = (uintptr_t)&desc_table_p[i + 1];
437                 desc_p->ctl_size = 0;
438                 desc_p->status = 0;
439         }
440
441         /* Correcting the last pointer of the chain */
442         desc_p->next =  (uintptr_t)&desc_table_p[0];
443
444         /* Flush the first TX buffer descriptor we will tell the MAC about. */
445         cache_clean_descriptor(desc_table_p);
446
447         writel((uintptr_t)&desc_table_p[0], priv->mac_reg + EMAC_TX_DMA_DESC);
448         priv->tx_currdescnum = 0;
449 }
450
451 static int sun8i_emac_eth_start(struct udevice *dev)
452 {
453         struct emac_eth_dev *priv = dev_get_priv(dev);
454         int ret;
455
456         /* Soft reset MAC */
457         writel(EMAC_CTL1_SOFT_RST, priv->mac_reg + EMAC_CTL1);
458         ret = wait_for_bit_le32(priv->mac_reg + EMAC_CTL1,
459                                 EMAC_CTL1_SOFT_RST, false, 10, true);
460         if (ret) {
461                 printf("%s: Timeout\n", __func__);
462                 return ret;
463         }
464
465         /* Rewrite mac address after reset */
466         sun8i_eth_write_hwaddr(dev);
467
468         /* transmission starts after the full frame arrived in TX DMA FIFO */
469         setbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_MD);
470
471         /*
472          * RX DMA reads data from RX DMA FIFO to host memory after a
473          * complete frame has been written to RX DMA FIFO
474          */
475         setbits_le32(priv->mac_reg + EMAC_RX_CTL1, EMAC_RX_CTL1_RX_MD);
476
477         /* DMA burst length */
478         writel(8 << EMAC_CTL1_BURST_LEN_SHIFT, priv->mac_reg + EMAC_CTL1);
479
480         /* Initialize rx/tx descriptors */
481         rx_descs_init(priv);
482         tx_descs_init(priv);
483
484         /* PHY Start Up */
485         ret = phy_startup(priv->phydev);
486         if (ret)
487                 return ret;
488
489         sun8i_adjust_link(priv, priv->phydev);
490
491         /* Start RX/TX DMA */
492         setbits_le32(priv->mac_reg + EMAC_RX_CTL1, EMAC_RX_CTL1_RX_DMA_EN |
493                      EMAC_RX_CTL1_RX_ERR_FRM | EMAC_RX_CTL1_RX_RUNT_FRM);
494         setbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_DMA_EN);
495
496         /* Enable RX/TX */
497         setbits_le32(priv->mac_reg + EMAC_RX_CTL0, EMAC_RX_CTL0_RX_EN);
498         setbits_le32(priv->mac_reg + EMAC_TX_CTL0, EMAC_TX_CTL0_TX_EN);
499
500         return 0;
501 }
502
503 static int parse_phy_pins(struct udevice *dev)
504 {
505         struct emac_eth_dev *priv = dev_get_priv(dev);
506         int offset;
507         const char *pin_name;
508         int drive, pull = SUN4I_PINCTRL_NO_PULL, i;
509
510         offset = fdtdec_lookup_phandle(gd->fdt_blob, dev_of_offset(dev),
511                                        "pinctrl-0");
512         if (offset < 0) {
513                 printf("WARNING: emac: cannot find pinctrl-0 node\n");
514                 return offset;
515         }
516
517         drive = fdt_getprop_u32_default_node(gd->fdt_blob, offset, 0,
518                                              "drive-strength", ~0);
519         if (drive != ~0) {
520                 if (drive <= 10)
521                         drive = SUN4I_PINCTRL_10_MA;
522                 else if (drive <= 20)
523                         drive = SUN4I_PINCTRL_20_MA;
524                 else if (drive <= 30)
525                         drive = SUN4I_PINCTRL_30_MA;
526                 else
527                         drive = SUN4I_PINCTRL_40_MA;
528         }
529
530         if (fdt_get_property(gd->fdt_blob, offset, "bias-pull-up", NULL))
531                 pull = SUN4I_PINCTRL_PULL_UP;
532         else if (fdt_get_property(gd->fdt_blob, offset, "bias-pull-down", NULL))
533                 pull = SUN4I_PINCTRL_PULL_DOWN;
534
535         for (i = 0; ; i++) {
536                 int pin;
537
538                 pin_name = fdt_stringlist_get(gd->fdt_blob, offset,
539                                               "pins", i, NULL);
540                 if (!pin_name)
541                         break;
542
543                 pin = sunxi_name_to_gpio(pin_name);
544                 if (pin < 0)
545                         continue;
546
547                 if (priv->variant == H3_EMAC)
548                         sunxi_gpio_set_cfgpin(pin, SUN8I_IOMUX_H3);
549                 else if (priv->variant == R40_GMAC || priv->variant == H6_EMAC)
550                         sunxi_gpio_set_cfgpin(pin, SUN8I_IOMUX_R40);
551                 else
552                         sunxi_gpio_set_cfgpin(pin, SUN8I_IOMUX);
553
554                 if (drive != ~0)
555                         sunxi_gpio_set_drv(pin, drive);
556                 if (pull != ~0)
557                         sunxi_gpio_set_pull(pin, pull);
558         }
559
560         if (!i) {
561                 printf("WARNING: emac: cannot find pins property\n");
562                 return -2;
563         }
564
565         return 0;
566 }
567
568 static int sun8i_emac_eth_recv(struct udevice *dev, int flags, uchar **packetp)
569 {
570         struct emac_eth_dev *priv = dev_get_priv(dev);
571         u32 status, desc_num = priv->rx_currdescnum;
572         struct emac_dma_desc *desc_p = &priv->rx_chain[desc_num];
573         uintptr_t data_start = (uintptr_t)desc_p->buf_addr;
574         int length;
575
576         /* Invalidate entire buffer descriptor */
577         cache_inv_descriptor(desc_p);
578
579         status = desc_p->status;
580
581         /* Check for DMA own bit */
582         if (status & EMAC_DESC_OWN_DMA)
583                 return -EAGAIN;
584
585         length = (status >> 16) & 0x3fff;
586
587         /* make sure we read from DRAM, not our cache */
588         invalidate_dcache_range(data_start,
589                                 data_start + roundup(length, ARCH_DMA_MINALIGN));
590
591         if (status & EMAC_DESC_RX_ERROR_MASK) {
592                 debug("RX: packet error: 0x%x\n",
593                       status & EMAC_DESC_RX_ERROR_MASK);
594                 return 0;
595         }
596         if (length < 0x40) {
597                 debug("RX: Bad Packet (runt)\n");
598                 return 0;
599         }
600
601         if (length > CONFIG_ETH_RXSIZE) {
602                 debug("RX: Too large packet (%d bytes)\n", length);
603                 return 0;
604         }
605
606         *packetp = (uchar *)(ulong)desc_p->buf_addr;
607
608         return length;
609 }
610
611 static int sun8i_emac_eth_send(struct udevice *dev, void *packet, int length)
612 {
613         struct emac_eth_dev *priv = dev_get_priv(dev);
614         u32 desc_num = priv->tx_currdescnum;
615         struct emac_dma_desc *desc_p = &priv->tx_chain[desc_num];
616         uintptr_t data_start = (uintptr_t)desc_p->buf_addr;
617         uintptr_t data_end = data_start +
618                 roundup(length, ARCH_DMA_MINALIGN);
619
620         desc_p->ctl_size = length | EMAC_DESC_CHAIN_SECOND;
621
622         memcpy((void *)data_start, packet, length);
623
624         /* Flush data to be sent */
625         flush_dcache_range(data_start, data_end);
626
627         /* frame begin and end */
628         desc_p->ctl_size |= EMAC_DESC_LAST_DESC | EMAC_DESC_FIRST_DESC;
629         desc_p->status = EMAC_DESC_OWN_DMA;
630
631         /* make sure the MAC reads the actual data from DRAM */
632         cache_clean_descriptor(desc_p);
633
634         /* Move to next Descriptor and wrap around */
635         if (++desc_num >= CONFIG_TX_DESCR_NUM)
636                 desc_num = 0;
637         priv->tx_currdescnum = desc_num;
638
639         /* Start the DMA */
640         setbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_DMA_START);
641
642         /*
643          * Since we copied the data above, we return here without waiting
644          * for the packet to be actually send out.
645          */
646
647         return 0;
648 }
649
650 static int sun8i_emac_board_setup(struct udevice *dev,
651                                   struct emac_eth_dev *priv)
652 {
653         int ret;
654
655         ret = clk_enable(&priv->tx_clk);
656         if (ret) {
657                 dev_err(dev, "failed to enable TX clock\n");
658                 return ret;
659         }
660
661         if (reset_valid(&priv->tx_rst)) {
662                 ret = reset_deassert(&priv->tx_rst);
663                 if (ret) {
664                         dev_err(dev, "failed to deassert TX reset\n");
665                         goto err_tx_clk;
666                 }
667         }
668
669         /* Only H3/H5 have clock controls for internal EPHY */
670         if (clk_valid(&priv->ephy_clk)) {
671                 ret = clk_enable(&priv->ephy_clk);
672                 if (ret) {
673                         dev_err(dev, "failed to enable EPHY TX clock\n");
674                         return ret;
675                 }
676         }
677
678         if (reset_valid(&priv->ephy_rst)) {
679                 ret = reset_deassert(&priv->ephy_rst);
680                 if (ret) {
681                         dev_err(dev, "failed to deassert EPHY TX clock\n");
682                         return ret;
683                 }
684         }
685
686         return 0;
687
688 err_tx_clk:
689         clk_disable(&priv->tx_clk);
690         return ret;
691 }
692
693 #if CONFIG_IS_ENABLED(DM_GPIO)
694 static int sun8i_mdio_reset(struct mii_dev *bus)
695 {
696         struct udevice *dev = bus->priv;
697         struct emac_eth_dev *priv = dev_get_priv(dev);
698         struct sun8i_eth_pdata *pdata = dev_get_platdata(dev);
699         int ret;
700
701         if (!dm_gpio_is_valid(&priv->reset_gpio))
702                 return 0;
703
704         /* reset the phy */
705         ret = dm_gpio_set_value(&priv->reset_gpio, 0);
706         if (ret)
707                 return ret;
708
709         udelay(pdata->reset_delays[0]);
710
711         ret = dm_gpio_set_value(&priv->reset_gpio, 1);
712         if (ret)
713                 return ret;
714
715         udelay(pdata->reset_delays[1]);
716
717         ret = dm_gpio_set_value(&priv->reset_gpio, 0);
718         if (ret)
719                 return ret;
720
721         udelay(pdata->reset_delays[2]);
722
723         return 0;
724 }
725 #endif
726
727 static int sun8i_mdio_init(const char *name, struct udevice *priv)
728 {
729         struct mii_dev *bus = mdio_alloc();
730
731         if (!bus) {
732                 debug("Failed to allocate MDIO bus\n");
733                 return -ENOMEM;
734         }
735
736         bus->read = sun8i_mdio_read;
737         bus->write = sun8i_mdio_write;
738         snprintf(bus->name, sizeof(bus->name), name);
739         bus->priv = (void *)priv;
740 #if CONFIG_IS_ENABLED(DM_GPIO)
741         bus->reset = sun8i_mdio_reset;
742 #endif
743
744         return  mdio_register(bus);
745 }
746
747 static int sun8i_eth_free_pkt(struct udevice *dev, uchar *packet,
748                               int length)
749 {
750         struct emac_eth_dev *priv = dev_get_priv(dev);
751         u32 desc_num = priv->rx_currdescnum;
752         struct emac_dma_desc *desc_p = &priv->rx_chain[desc_num];
753
754         /* give the current descriptor back to the MAC */
755         desc_p->status |= EMAC_DESC_OWN_DMA;
756
757         /* Flush Status field of descriptor */
758         cache_clean_descriptor(desc_p);
759
760         /* Move to next desc and wrap-around condition. */
761         if (++desc_num >= CONFIG_RX_DESCR_NUM)
762                 desc_num = 0;
763         priv->rx_currdescnum = desc_num;
764
765         return 0;
766 }
767
768 static void sun8i_emac_eth_stop(struct udevice *dev)
769 {
770         struct emac_eth_dev *priv = dev_get_priv(dev);
771
772         /* Stop Rx/Tx transmitter */
773         clrbits_le32(priv->mac_reg + EMAC_RX_CTL0, EMAC_RX_CTL0_RX_EN);
774         clrbits_le32(priv->mac_reg + EMAC_TX_CTL0, EMAC_TX_CTL0_TX_EN);
775
776         /* Stop RX/TX DMA */
777         clrbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_DMA_EN);
778         clrbits_le32(priv->mac_reg + EMAC_RX_CTL1, EMAC_RX_CTL1_RX_DMA_EN);
779
780         phy_shutdown(priv->phydev);
781 }
782
783 static int sun8i_emac_eth_probe(struct udevice *dev)
784 {
785         struct sun8i_eth_pdata *sun8i_pdata = dev_get_platdata(dev);
786         struct eth_pdata *pdata = &sun8i_pdata->eth_pdata;
787         struct emac_eth_dev *priv = dev_get_priv(dev);
788         int ret;
789
790         priv->mac_reg = (void *)pdata->iobase;
791
792         ret = sun8i_emac_board_setup(dev, priv);
793         if (ret)
794                 return ret;
795
796         sun8i_emac_set_syscon(sun8i_pdata, priv);
797
798         sun8i_mdio_init(dev->name, dev);
799         priv->bus = miiphy_get_dev_by_name(dev->name);
800
801         return sun8i_phy_init(priv, dev);
802 }
803
804 static const struct eth_ops sun8i_emac_eth_ops = {
805         .start                  = sun8i_emac_eth_start,
806         .write_hwaddr           = sun8i_eth_write_hwaddr,
807         .send                   = sun8i_emac_eth_send,
808         .recv                   = sun8i_emac_eth_recv,
809         .free_pkt               = sun8i_eth_free_pkt,
810         .stop                   = sun8i_emac_eth_stop,
811 };
812
813 static int sun8i_handle_internal_phy(struct udevice *dev, struct emac_eth_dev *priv)
814 {
815         struct ofnode_phandle_args phandle;
816         int ret;
817
818         ret = ofnode_parse_phandle_with_args(dev_ofnode(dev), "phy-handle",
819                                              NULL, 0, 0, &phandle);
820         if (ret)
821                 return ret;
822
823         /* If the PHY node is not a child of the internal MDIO bus, we are
824          * using some external PHY.
825          */
826         if (!ofnode_device_is_compatible(ofnode_get_parent(phandle.node),
827                                          "allwinner,sun8i-h3-mdio-internal"))
828                 return 0;
829
830         ret = clk_get_by_index_nodev(phandle.node, 0, &priv->ephy_clk);
831         if (ret) {
832                 dev_err(dev, "failed to get EPHY TX clock\n");
833                 return ret;
834         }
835
836         ret = reset_get_by_index_nodev(phandle.node, 0, &priv->ephy_rst);
837         if (ret) {
838                 dev_err(dev, "failed to get EPHY TX reset\n");
839                 return ret;
840         }
841
842         priv->use_internal_phy = true;
843
844         return 0;
845 }
846
847 static int sun8i_emac_eth_ofdata_to_platdata(struct udevice *dev)
848 {
849         struct sun8i_eth_pdata *sun8i_pdata = dev_get_platdata(dev);
850         struct eth_pdata *pdata = &sun8i_pdata->eth_pdata;
851         struct emac_eth_dev *priv = dev_get_priv(dev);
852         const char *phy_mode;
853         const fdt32_t *reg;
854         int node = dev_of_offset(dev);
855         int offset = 0;
856 #if CONFIG_IS_ENABLED(DM_GPIO)
857         int reset_flags = GPIOD_IS_OUT;
858 #endif
859         int ret;
860
861         pdata->iobase = dev_read_addr(dev);
862         if (pdata->iobase == FDT_ADDR_T_NONE) {
863                 debug("%s: Cannot find MAC base address\n", __func__);
864                 return -EINVAL;
865         }
866
867         priv->variant = dev_get_driver_data(dev);
868
869         if (!priv->variant) {
870                 printf("%s: Missing variant\n", __func__);
871                 return -EINVAL;
872         }
873
874         ret = clk_get_by_name(dev, "stmmaceth", &priv->tx_clk);
875         if (ret) {
876                 dev_err(dev, "failed to get TX clock\n");
877                 return ret;
878         }
879
880         ret = reset_get_by_name(dev, "stmmaceth", &priv->tx_rst);
881         if (ret && ret != -ENOENT) {
882                 dev_err(dev, "failed to get TX reset\n");
883                 return ret;
884         }
885
886         offset = fdtdec_lookup_phandle(gd->fdt_blob, node, "syscon");
887         if (offset < 0) {
888                 debug("%s: cannot find syscon node\n", __func__);
889                 return -EINVAL;
890         }
891
892         reg = fdt_getprop(gd->fdt_blob, offset, "reg", NULL);
893         if (!reg) {
894                 debug("%s: cannot find reg property in syscon node\n",
895                       __func__);
896                 return -EINVAL;
897         }
898         priv->sysctl_reg = fdt_translate_address((void *)gd->fdt_blob,
899                                                  offset, reg);
900         if (priv->sysctl_reg == FDT_ADDR_T_NONE) {
901                 debug("%s: Cannot find syscon base address\n", __func__);
902                 return -EINVAL;
903         }
904
905         pdata->phy_interface = -1;
906         priv->phyaddr = -1;
907         priv->use_internal_phy = false;
908
909         offset = fdtdec_lookup_phandle(gd->fdt_blob, node, "phy-handle");
910         if (offset < 0) {
911                 debug("%s: Cannot find PHY address\n", __func__);
912                 return -EINVAL;
913         }
914         priv->phyaddr = fdtdec_get_int(gd->fdt_blob, offset, "reg", -1);
915
916         phy_mode = fdt_getprop(gd->fdt_blob, node, "phy-mode", NULL);
917
918         if (phy_mode)
919                 pdata->phy_interface = phy_get_interface_by_name(phy_mode);
920         printf("phy interface%d\n", pdata->phy_interface);
921
922         if (pdata->phy_interface == -1) {
923                 debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
924                 return -EINVAL;
925         }
926
927         if (priv->variant == H3_EMAC) {
928                 ret = sun8i_handle_internal_phy(dev, priv);
929                 if (ret)
930                         return ret;
931         }
932
933         priv->interface = pdata->phy_interface;
934
935         if (!priv->use_internal_phy)
936                 parse_phy_pins(dev);
937
938         sun8i_pdata->tx_delay_ps = fdtdec_get_int(gd->fdt_blob, node,
939                                                   "allwinner,tx-delay-ps", 0);
940         if (sun8i_pdata->tx_delay_ps < 0 || sun8i_pdata->tx_delay_ps > 700)
941                 printf("%s: Invalid TX delay value %d\n", __func__,
942                        sun8i_pdata->tx_delay_ps);
943
944         sun8i_pdata->rx_delay_ps = fdtdec_get_int(gd->fdt_blob, node,
945                                                   "allwinner,rx-delay-ps", 0);
946         if (sun8i_pdata->rx_delay_ps < 0 || sun8i_pdata->rx_delay_ps > 3100)
947                 printf("%s: Invalid RX delay value %d\n", __func__,
948                        sun8i_pdata->rx_delay_ps);
949
950 #if CONFIG_IS_ENABLED(DM_GPIO)
951         if (fdtdec_get_bool(gd->fdt_blob, dev_of_offset(dev),
952                             "snps,reset-active-low"))
953                 reset_flags |= GPIOD_ACTIVE_LOW;
954
955         ret = gpio_request_by_name(dev, "snps,reset-gpio", 0,
956                                    &priv->reset_gpio, reset_flags);
957
958         if (ret == 0) {
959                 ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(dev),
960                                            "snps,reset-delays-us",
961                                            sun8i_pdata->reset_delays, 3);
962         } else if (ret == -ENOENT) {
963                 ret = 0;
964         }
965 #endif
966
967         return 0;
968 }
969
970 static const struct udevice_id sun8i_emac_eth_ids[] = {
971         {.compatible = "allwinner,sun8i-h3-emac", .data = (uintptr_t)H3_EMAC },
972         {.compatible = "allwinner,sun50i-a64-emac",
973                 .data = (uintptr_t)A64_EMAC },
974         {.compatible = "allwinner,sun8i-a83t-emac",
975                 .data = (uintptr_t)A83T_EMAC },
976         {.compatible = "allwinner,sun8i-r40-gmac",
977                 .data = (uintptr_t)R40_GMAC },
978         {.compatible = "allwinner,sun50i-h6-emac",
979                 .data = (uintptr_t)H6_EMAC },
980         { }
981 };
982
983 U_BOOT_DRIVER(eth_sun8i_emac) = {
984         .name   = "eth_sun8i_emac",
985         .id     = UCLASS_ETH,
986         .of_match = sun8i_emac_eth_ids,
987         .ofdata_to_platdata = sun8i_emac_eth_ofdata_to_platdata,
988         .probe  = sun8i_emac_eth_probe,
989         .ops    = &sun8i_emac_eth_ops,
990         .priv_auto_alloc_size = sizeof(struct emac_eth_dev),
991         .platdata_auto_alloc_size = sizeof(struct sun8i_eth_pdata),
992         .flags = DM_FLAG_ALLOC_PRIV_DMA,
993 };