1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2010 3*4882a593Smuzhiyun * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _DW_ETH_H 9*4882a593Smuzhiyun #define _DW_ETH_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifdef CONFIG_DM_GPIO 12*4882a593Smuzhiyun #include <asm-generic/gpio.h> 13*4882a593Smuzhiyun #endif 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define CONFIG_TX_DESCR_NUM 16 16*4882a593Smuzhiyun #define CONFIG_RX_DESCR_NUM 16 17*4882a593Smuzhiyun #define CONFIG_ETH_BUFSIZE 2048 18*4882a593Smuzhiyun #define TX_TOTAL_BUFSIZE (CONFIG_ETH_BUFSIZE * CONFIG_TX_DESCR_NUM) 19*4882a593Smuzhiyun #define RX_TOTAL_BUFSIZE (CONFIG_ETH_BUFSIZE * CONFIG_RX_DESCR_NUM) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define CONFIG_MACRESET_TIMEOUT (3 * CONFIG_SYS_HZ) 22*4882a593Smuzhiyun #define CONFIG_MDIO_TIMEOUT (3 * CONFIG_SYS_HZ) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun struct eth_mac_regs { 25*4882a593Smuzhiyun u32 conf; /* 0x00 */ 26*4882a593Smuzhiyun u32 framefilt; /* 0x04 */ 27*4882a593Smuzhiyun u32 hashtablehigh; /* 0x08 */ 28*4882a593Smuzhiyun u32 hashtablelow; /* 0x0c */ 29*4882a593Smuzhiyun u32 miiaddr; /* 0x10 */ 30*4882a593Smuzhiyun u32 miidata; /* 0x14 */ 31*4882a593Smuzhiyun u32 flowcontrol; /* 0x18 */ 32*4882a593Smuzhiyun u32 vlantag; /* 0x1c */ 33*4882a593Smuzhiyun u32 version; /* 0x20 */ 34*4882a593Smuzhiyun u8 reserved_1[20]; 35*4882a593Smuzhiyun u32 intreg; /* 0x38 */ 36*4882a593Smuzhiyun u32 intmask; /* 0x3c */ 37*4882a593Smuzhiyun u32 macaddr0hi; /* 0x40 */ 38*4882a593Smuzhiyun u32 macaddr0lo; /* 0x44 */ 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* MAC configuration register definitions */ 42*4882a593Smuzhiyun #define FRAMEBURSTENABLE (1 << 21) 43*4882a593Smuzhiyun #define MII_PORTSELECT (1 << 15) 44*4882a593Smuzhiyun #define FES_100 (1 << 14) 45*4882a593Smuzhiyun #define DISABLERXOWN (1 << 13) 46*4882a593Smuzhiyun #define FULLDPLXMODE (1 << 11) 47*4882a593Smuzhiyun #define RXENABLE (1 << 2) 48*4882a593Smuzhiyun #define TXENABLE (1 << 3) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* MII address register definitions */ 51*4882a593Smuzhiyun #define MII_BUSY (1 << 0) 52*4882a593Smuzhiyun #define MII_WRITE (1 << 1) 53*4882a593Smuzhiyun #define MII_CLKRANGE_60_100M (0) 54*4882a593Smuzhiyun #define MII_CLKRANGE_100_150M (0x4) 55*4882a593Smuzhiyun #define MII_CLKRANGE_20_35M (0x8) 56*4882a593Smuzhiyun #define MII_CLKRANGE_35_60M (0xC) 57*4882a593Smuzhiyun #define MII_CLKRANGE_150_250M (0x10) 58*4882a593Smuzhiyun #define MII_CLKRANGE_250_300M (0x14) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define MIIADDRSHIFT (11) 61*4882a593Smuzhiyun #define MIIREGSHIFT (6) 62*4882a593Smuzhiyun #define MII_REGMSK (0x1F << 6) 63*4882a593Smuzhiyun #define MII_ADDRMSK (0x1F << 11) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct eth_dma_regs { 67*4882a593Smuzhiyun u32 busmode; /* 0x00 */ 68*4882a593Smuzhiyun u32 txpolldemand; /* 0x04 */ 69*4882a593Smuzhiyun u32 rxpolldemand; /* 0x08 */ 70*4882a593Smuzhiyun u32 rxdesclistaddr; /* 0x0c */ 71*4882a593Smuzhiyun u32 txdesclistaddr; /* 0x10 */ 72*4882a593Smuzhiyun u32 status; /* 0x14 */ 73*4882a593Smuzhiyun u32 opmode; /* 0x18 */ 74*4882a593Smuzhiyun u32 intenable; /* 0x1c */ 75*4882a593Smuzhiyun u32 reserved1[2]; 76*4882a593Smuzhiyun u32 axibus; /* 0x28 */ 77*4882a593Smuzhiyun u32 reserved2[7]; 78*4882a593Smuzhiyun u32 currhosttxdesc; /* 0x48 */ 79*4882a593Smuzhiyun u32 currhostrxdesc; /* 0x4c */ 80*4882a593Smuzhiyun u32 currhosttxbuffaddr; /* 0x50 */ 81*4882a593Smuzhiyun u32 currhostrxbuffaddr; /* 0x54 */ 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define DW_DMA_BASE_OFFSET (0x1000) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* Default DMA Burst length */ 87*4882a593Smuzhiyun #ifndef CONFIG_DW_GMAC_DEFAULT_DMA_PBL 88*4882a593Smuzhiyun #define CONFIG_DW_GMAC_DEFAULT_DMA_PBL 8 89*4882a593Smuzhiyun #endif 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* Bus mode register definitions */ 92*4882a593Smuzhiyun #define FIXEDBURST (1 << 16) 93*4882a593Smuzhiyun #define PRIORXTX_41 (3 << 14) 94*4882a593Smuzhiyun #define PRIORXTX_31 (2 << 14) 95*4882a593Smuzhiyun #define PRIORXTX_21 (1 << 14) 96*4882a593Smuzhiyun #define PRIORXTX_11 (0 << 14) 97*4882a593Smuzhiyun #define DMA_PBL (CONFIG_DW_GMAC_DEFAULT_DMA_PBL<<8) 98*4882a593Smuzhiyun #define RXHIGHPRIO (1 << 1) 99*4882a593Smuzhiyun #define DMAMAC_SRST (1 << 0) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* Poll demand definitions */ 102*4882a593Smuzhiyun #define POLL_DATA (0xFFFFFFFF) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* Operation mode definitions */ 105*4882a593Smuzhiyun #define STOREFORWARD (1 << 21) 106*4882a593Smuzhiyun #define FLUSHTXFIFO (1 << 20) 107*4882a593Smuzhiyun #define TXSTART (1 << 13) 108*4882a593Smuzhiyun #define TXSECONDFRAME (1 << 2) 109*4882a593Smuzhiyun #define RXSTART (1 << 1) 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /* Descriptior related definitions */ 112*4882a593Smuzhiyun #define MAC_MAX_FRAME_SZ (1600) 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun struct dmamacdescr { 115*4882a593Smuzhiyun u32 txrx_status; 116*4882a593Smuzhiyun u32 dmamac_cntl; 117*4882a593Smuzhiyun u32 dmamac_addr; 118*4882a593Smuzhiyun u32 dmamac_next; 119*4882a593Smuzhiyun } __aligned(ARCH_DMA_MINALIGN); 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* 122*4882a593Smuzhiyun * txrx_status definitions 123*4882a593Smuzhiyun */ 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* tx status bits definitions */ 126*4882a593Smuzhiyun #if defined(CONFIG_DW_ALTDESCRIPTOR) 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define DESC_TXSTS_OWNBYDMA (1 << 31) 129*4882a593Smuzhiyun #define DESC_TXSTS_TXINT (1 << 30) 130*4882a593Smuzhiyun #define DESC_TXSTS_TXLAST (1 << 29) 131*4882a593Smuzhiyun #define DESC_TXSTS_TXFIRST (1 << 28) 132*4882a593Smuzhiyun #define DESC_TXSTS_TXCRCDIS (1 << 27) 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #define DESC_TXSTS_TXPADDIS (1 << 26) 135*4882a593Smuzhiyun #define DESC_TXSTS_TXCHECKINSCTRL (3 << 22) 136*4882a593Smuzhiyun #define DESC_TXSTS_TXRINGEND (1 << 21) 137*4882a593Smuzhiyun #define DESC_TXSTS_TXCHAIN (1 << 20) 138*4882a593Smuzhiyun #define DESC_TXSTS_MSK (0x1FFFF << 0) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #else 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #define DESC_TXSTS_OWNBYDMA (1 << 31) 143*4882a593Smuzhiyun #define DESC_TXSTS_MSK (0x1FFFF << 0) 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #endif 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun /* rx status bits definitions */ 148*4882a593Smuzhiyun #define DESC_RXSTS_OWNBYDMA (1 << 31) 149*4882a593Smuzhiyun #define DESC_RXSTS_DAFILTERFAIL (1 << 30) 150*4882a593Smuzhiyun #define DESC_RXSTS_FRMLENMSK (0x3FFF << 16) 151*4882a593Smuzhiyun #define DESC_RXSTS_FRMLENSHFT (16) 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun #define DESC_RXSTS_ERROR (1 << 15) 154*4882a593Smuzhiyun #define DESC_RXSTS_RXTRUNCATED (1 << 14) 155*4882a593Smuzhiyun #define DESC_RXSTS_SAFILTERFAIL (1 << 13) 156*4882a593Smuzhiyun #define DESC_RXSTS_RXIPC_GIANTFRAME (1 << 12) 157*4882a593Smuzhiyun #define DESC_RXSTS_RXDAMAGED (1 << 11) 158*4882a593Smuzhiyun #define DESC_RXSTS_RXVLANTAG (1 << 10) 159*4882a593Smuzhiyun #define DESC_RXSTS_RXFIRST (1 << 9) 160*4882a593Smuzhiyun #define DESC_RXSTS_RXLAST (1 << 8) 161*4882a593Smuzhiyun #define DESC_RXSTS_RXIPC_GIANT (1 << 7) 162*4882a593Smuzhiyun #define DESC_RXSTS_RXCOLLISION (1 << 6) 163*4882a593Smuzhiyun #define DESC_RXSTS_RXFRAMEETHER (1 << 5) 164*4882a593Smuzhiyun #define DESC_RXSTS_RXWATCHDOG (1 << 4) 165*4882a593Smuzhiyun #define DESC_RXSTS_RXMIIERROR (1 << 3) 166*4882a593Smuzhiyun #define DESC_RXSTS_RXDRIBBLING (1 << 2) 167*4882a593Smuzhiyun #define DESC_RXSTS_RXCRC (1 << 1) 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /* 170*4882a593Smuzhiyun * dmamac_cntl definitions 171*4882a593Smuzhiyun */ 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* tx control bits definitions */ 174*4882a593Smuzhiyun #if defined(CONFIG_DW_ALTDESCRIPTOR) 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define DESC_TXCTRL_SIZE1MASK (0x1FFF << 0) 177*4882a593Smuzhiyun #define DESC_TXCTRL_SIZE1SHFT (0) 178*4882a593Smuzhiyun #define DESC_TXCTRL_SIZE2MASK (0x1FFF << 16) 179*4882a593Smuzhiyun #define DESC_TXCTRL_SIZE2SHFT (16) 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun #else 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun #define DESC_TXCTRL_TXINT (1 << 31) 184*4882a593Smuzhiyun #define DESC_TXCTRL_TXLAST (1 << 30) 185*4882a593Smuzhiyun #define DESC_TXCTRL_TXFIRST (1 << 29) 186*4882a593Smuzhiyun #define DESC_TXCTRL_TXCHECKINSCTRL (3 << 27) 187*4882a593Smuzhiyun #define DESC_TXCTRL_TXCRCDIS (1 << 26) 188*4882a593Smuzhiyun #define DESC_TXCTRL_TXRINGEND (1 << 25) 189*4882a593Smuzhiyun #define DESC_TXCTRL_TXCHAIN (1 << 24) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun #define DESC_TXCTRL_SIZE1MASK (0x7FF << 0) 192*4882a593Smuzhiyun #define DESC_TXCTRL_SIZE1SHFT (0) 193*4882a593Smuzhiyun #define DESC_TXCTRL_SIZE2MASK (0x7FF << 11) 194*4882a593Smuzhiyun #define DESC_TXCTRL_SIZE2SHFT (11) 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun #endif 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /* rx control bits definitions */ 199*4882a593Smuzhiyun #if defined(CONFIG_DW_ALTDESCRIPTOR) 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun #define DESC_RXCTRL_RXINTDIS (1 << 31) 202*4882a593Smuzhiyun #define DESC_RXCTRL_RXRINGEND (1 << 15) 203*4882a593Smuzhiyun #define DESC_RXCTRL_RXCHAIN (1 << 14) 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun #define DESC_RXCTRL_SIZE1MASK (0x1FFF << 0) 206*4882a593Smuzhiyun #define DESC_RXCTRL_SIZE1SHFT (0) 207*4882a593Smuzhiyun #define DESC_RXCTRL_SIZE2MASK (0x1FFF << 16) 208*4882a593Smuzhiyun #define DESC_RXCTRL_SIZE2SHFT (16) 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun #else 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define DESC_RXCTRL_RXINTDIS (1 << 31) 213*4882a593Smuzhiyun #define DESC_RXCTRL_RXRINGEND (1 << 25) 214*4882a593Smuzhiyun #define DESC_RXCTRL_RXCHAIN (1 << 24) 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun #define DESC_RXCTRL_SIZE1MASK (0x7FF << 0) 217*4882a593Smuzhiyun #define DESC_RXCTRL_SIZE1SHFT (0) 218*4882a593Smuzhiyun #define DESC_RXCTRL_SIZE2MASK (0x7FF << 11) 219*4882a593Smuzhiyun #define DESC_RXCTRL_SIZE2SHFT (11) 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun #endif 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun struct dw_eth_dev { 224*4882a593Smuzhiyun struct dmamacdescr tx_mac_descrtable[CONFIG_TX_DESCR_NUM]; 225*4882a593Smuzhiyun struct dmamacdescr rx_mac_descrtable[CONFIG_RX_DESCR_NUM]; 226*4882a593Smuzhiyun char txbuffs[TX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN); 227*4882a593Smuzhiyun char rxbuffs[RX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN); 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun u32 interface; 230*4882a593Smuzhiyun u32 max_speed; 231*4882a593Smuzhiyun u32 tx_currdescnum; 232*4882a593Smuzhiyun u32 rx_currdescnum; 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun struct eth_mac_regs *mac_regs_p; 235*4882a593Smuzhiyun struct eth_dma_regs *dma_regs_p; 236*4882a593Smuzhiyun #ifndef CONFIG_DM_ETH 237*4882a593Smuzhiyun struct eth_device *dev; 238*4882a593Smuzhiyun #endif 239*4882a593Smuzhiyun #ifdef CONFIG_DM_GPIO 240*4882a593Smuzhiyun struct gpio_desc reset_gpio; 241*4882a593Smuzhiyun #endif 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun struct phy_device *phydev; 244*4882a593Smuzhiyun struct mii_dev *bus; 245*4882a593Smuzhiyun }; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun #ifdef CONFIG_DM_ETH 248*4882a593Smuzhiyun int designware_eth_ofdata_to_platdata(struct udevice *dev); 249*4882a593Smuzhiyun int designware_eth_probe(struct udevice *dev); 250*4882a593Smuzhiyun extern const struct eth_ops designware_eth_ops; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun struct dw_eth_pdata { 253*4882a593Smuzhiyun struct eth_pdata eth_pdata; 254*4882a593Smuzhiyun u32 reset_delays[3]; 255*4882a593Smuzhiyun }; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun int designware_eth_init(struct dw_eth_dev *priv, u8 *enetaddr); 258*4882a593Smuzhiyun int designware_eth_enable(struct dw_eth_dev *priv); 259*4882a593Smuzhiyun int designware_eth_send(struct udevice *dev, void *packet, int length); 260*4882a593Smuzhiyun int designware_eth_recv(struct udevice *dev, int flags, uchar **packetp); 261*4882a593Smuzhiyun int designware_eth_free_pkt(struct udevice *dev, uchar *packet, 262*4882a593Smuzhiyun int length); 263*4882a593Smuzhiyun void designware_eth_stop(struct udevice *dev); 264*4882a593Smuzhiyun int designware_eth_write_hwaddr(struct udevice *dev); 265*4882a593Smuzhiyun #endif 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #endif 268