xref: /rk3399_rockchip-uboot/drivers/net/pic32_eth.h (revision d2427caf54a08ec80e8bfa5ef2c0b4377da55bab)
1*23e7578cSPurna Chandra Mandal /*
2*23e7578cSPurna Chandra Mandal  * (c) 2015 Purna Chandra Mandal <purna.mandal@microchip.com>
3*23e7578cSPurna Chandra Mandal  *
4*23e7578cSPurna Chandra Mandal  * SPDX-License-Identifier:	GPL-2.0+
5*23e7578cSPurna Chandra Mandal  *
6*23e7578cSPurna Chandra Mandal  */
7*23e7578cSPurna Chandra Mandal 
8*23e7578cSPurna Chandra Mandal #ifndef __MICROCHIP_PIC32_ETH_H_
9*23e7578cSPurna Chandra Mandal #define __MICROCHIP_PIC32_ETH_H_
10*23e7578cSPurna Chandra Mandal 
11*23e7578cSPurna Chandra Mandal #include <mach/pic32.h>
12*23e7578cSPurna Chandra Mandal 
13*23e7578cSPurna Chandra Mandal /* Ethernet */
14*23e7578cSPurna Chandra Mandal struct pic32_ectl_regs {
15*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic con1; /* 0x00 */
16*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic con2; /* 0x10 */
17*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic txst; /* 0x20 */
18*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic rxst; /* 0x30 */
19*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ht0;  /* 0x40 */
20*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ht1;  /* 0x50 */
21*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic pmm0; /* 0x60 */
22*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic pmm1; /* 0x70 */
23*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic pmcs; /* 0x80 */
24*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic pmo;  /* 0x90 */
25*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic rxfc; /* 0xa0 */
26*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic rxwm; /* 0xb0 */
27*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ien;  /* 0xc0 */
28*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic irq;  /* 0xd0 */
29*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic stat; /* 0xe0 */
30*23e7578cSPurna Chandra Mandal };
31*23e7578cSPurna Chandra Mandal 
32*23e7578cSPurna Chandra Mandal struct pic32_mii_regs {
33*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mcfg; /* 0x280 */
34*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mcmd; /* 0x290 */
35*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic madr; /* 0x2a0 */
36*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mwtd; /* 0x2b0 */
37*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mrdd; /* 0x2c0 */
38*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mind; /* 0x2d0 */
39*23e7578cSPurna Chandra Mandal };
40*23e7578cSPurna Chandra Mandal 
41*23e7578cSPurna Chandra Mandal struct pic32_emac_regs {
42*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic cfg1; /* 0x200*/
43*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic cfg2; /* 0x210*/
44*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ipgt; /* 0x220*/
45*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ipgr; /* 0x230*/
46*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic clrt; /* 0x240*/
47*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic maxf; /* 0x250*/
48*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic supp; /* 0x260*/
49*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic test; /* 0x270*/
50*23e7578cSPurna Chandra Mandal 	struct pic32_mii_regs mii;    /* 0x280 - 0x2d0 */
51*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic res1; /* 0x2e0 */
52*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic res2; /* 0x2f0 */
53*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic sa0;  /* 0x300 */
54*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic sa1;  /* 0x310 */
55*23e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic sa2;  /* 0x320 */
56*23e7578cSPurna Chandra Mandal };
57*23e7578cSPurna Chandra Mandal 
58*23e7578cSPurna Chandra Mandal /* ETHCON1 Reg field */
59*23e7578cSPurna Chandra Mandal #define ETHCON_BUFCDEC		BIT(0)
60*23e7578cSPurna Chandra Mandal #define ETHCON_RXEN		BIT(8)
61*23e7578cSPurna Chandra Mandal #define ETHCON_TXRTS		BIT(9)
62*23e7578cSPurna Chandra Mandal #define ETHCON_ON		BIT(15)
63*23e7578cSPurna Chandra Mandal 
64*23e7578cSPurna Chandra Mandal /* ETHCON2 Reg field */
65*23e7578cSPurna Chandra Mandal #define ETHCON_RXBUFSZ		0x7f
66*23e7578cSPurna Chandra Mandal #define ETHCON_RXBUFSZ_SHFT	0x4
67*23e7578cSPurna Chandra Mandal 
68*23e7578cSPurna Chandra Mandal /* ETHSTAT Reg field */
69*23e7578cSPurna Chandra Mandal #define ETHSTAT_BUSY		BIT(7)
70*23e7578cSPurna Chandra Mandal #define ETHSTAT_BUFCNT		0x00ff0000
71*23e7578cSPurna Chandra Mandal 
72*23e7578cSPurna Chandra Mandal /* ETHRXFC Register fields */
73*23e7578cSPurna Chandra Mandal #define ETHRXFC_BCEN		BIT(0)
74*23e7578cSPurna Chandra Mandal #define ETHRXFC_MCEN		BIT(1)
75*23e7578cSPurna Chandra Mandal #define ETHRXFC_UCEN		BIT(3)
76*23e7578cSPurna Chandra Mandal #define ETHRXFC_RUNTEN		BIT(4)
77*23e7578cSPurna Chandra Mandal #define ETHRXFC_CRCOKEN		BIT(5)
78*23e7578cSPurna Chandra Mandal 
79*23e7578cSPurna Chandra Mandal /* EMAC1CFG1 register offset */
80*23e7578cSPurna Chandra Mandal #define PIC32_EMAC1CFG1		0x0200
81*23e7578cSPurna Chandra Mandal 
82*23e7578cSPurna Chandra Mandal /* EMAC1CFG1 register fields */
83*23e7578cSPurna Chandra Mandal #define EMAC_RXENABLE		BIT(0)
84*23e7578cSPurna Chandra Mandal #define EMAC_RXPAUSE		BIT(2)
85*23e7578cSPurna Chandra Mandal #define EMAC_TXPAUSE		BIT(3)
86*23e7578cSPurna Chandra Mandal #define EMAC_SOFTRESET		BIT(15)
87*23e7578cSPurna Chandra Mandal 
88*23e7578cSPurna Chandra Mandal /* EMAC1CFG2 register fields */
89*23e7578cSPurna Chandra Mandal #define EMAC_FULLDUP		BIT(0)
90*23e7578cSPurna Chandra Mandal #define EMAC_LENGTHCK		BIT(1)
91*23e7578cSPurna Chandra Mandal #define EMAC_CRCENABLE		BIT(4)
92*23e7578cSPurna Chandra Mandal #define EMAC_PADENABLE		BIT(5)
93*23e7578cSPurna Chandra Mandal #define EMAC_AUTOPAD		BIT(7)
94*23e7578cSPurna Chandra Mandal #define EMAC_EXCESS		BIT(14)
95*23e7578cSPurna Chandra Mandal 
96*23e7578cSPurna Chandra Mandal /* EMAC1IPGT register magic */
97*23e7578cSPurna Chandra Mandal #define FULLDUP_GAP_TIME	0x15
98*23e7578cSPurna Chandra Mandal #define HALFDUP_GAP_TIME	0x12
99*23e7578cSPurna Chandra Mandal 
100*23e7578cSPurna Chandra Mandal /* EMAC1SUPP register fields */
101*23e7578cSPurna Chandra Mandal #define EMAC_RMII_SPD100	BIT(8)
102*23e7578cSPurna Chandra Mandal #define EMAC_RMII_RESET		BIT(11)
103*23e7578cSPurna Chandra Mandal 
104*23e7578cSPurna Chandra Mandal /* MII Management Configuration Register */
105*23e7578cSPurna Chandra Mandal #define MIIMCFG_RSTMGMT		BIT(15)
106*23e7578cSPurna Chandra Mandal #define MIIMCFG_CLKSEL_DIV40	0x0020	/* 100Mhz / 40 */
107*23e7578cSPurna Chandra Mandal 
108*23e7578cSPurna Chandra Mandal /* MII Management Command Register */
109*23e7578cSPurna Chandra Mandal #define MIIMCMD_READ		BIT(0)
110*23e7578cSPurna Chandra Mandal #define MIIMCMD_SCAN		BIT(1)
111*23e7578cSPurna Chandra Mandal 
112*23e7578cSPurna Chandra Mandal /* MII Management Address Register */
113*23e7578cSPurna Chandra Mandal #define MIIMADD_REGADDR		0x1f
114*23e7578cSPurna Chandra Mandal #define MIIMADD_REGADDR_SHIFT	0
115*23e7578cSPurna Chandra Mandal #define MIIMADD_PHYADDR_SHIFT	8
116*23e7578cSPurna Chandra Mandal 
117*23e7578cSPurna Chandra Mandal /* MII Management Indicator Register */
118*23e7578cSPurna Chandra Mandal #define MIIMIND_BUSY		BIT(0)
119*23e7578cSPurna Chandra Mandal #define MIIMIND_NOTVALID	BIT(2)
120*23e7578cSPurna Chandra Mandal #define MIIMIND_LINKFAIL	BIT(3)
121*23e7578cSPurna Chandra Mandal 
122*23e7578cSPurna Chandra Mandal /* Packet Descriptor */
123*23e7578cSPurna Chandra Mandal /* Received Packet Status */
124*23e7578cSPurna Chandra Mandal #define _RSV1_PKT_CSUM		0xffff
125*23e7578cSPurna Chandra Mandal #define _RSV2_CRC_ERR		BIT(20)
126*23e7578cSPurna Chandra Mandal #define _RSV2_LEN_ERR		BIT(21)
127*23e7578cSPurna Chandra Mandal #define _RSV2_RX_OK		BIT(23)
128*23e7578cSPurna Chandra Mandal #define _RSV2_RX_COUNT		0xffff
129*23e7578cSPurna Chandra Mandal 
130*23e7578cSPurna Chandra Mandal #define RSV_RX_CSUM(__rsv1)	((__rsv1) & _RSV1_PKT_CSUM)
131*23e7578cSPurna Chandra Mandal #define RSV_RX_COUNT(__rsv2)	((__rsv2) & _RSV2_RX_COUNT)
132*23e7578cSPurna Chandra Mandal #define RSV_RX_OK(__rsv2)	((__rsv2) & _RSV2_RX_OK)
133*23e7578cSPurna Chandra Mandal #define RSV_CRC_ERR(__rsv2)	((__rsv2) & _RSV2_CRC_ERR)
134*23e7578cSPurna Chandra Mandal 
135*23e7578cSPurna Chandra Mandal /* Ethernet Hardware Descriptor Header bits */
136*23e7578cSPurna Chandra Mandal #define EDH_EOWN		BIT(7)
137*23e7578cSPurna Chandra Mandal #define EDH_NPV			BIT(8)
138*23e7578cSPurna Chandra Mandal #define EDH_STICKY		BIT(9)
139*23e7578cSPurna Chandra Mandal #define _EDH_BCOUNT		0x07ff0000
140*23e7578cSPurna Chandra Mandal #define EDH_EOP			BIT(30)
141*23e7578cSPurna Chandra Mandal #define EDH_SOP			BIT(31)
142*23e7578cSPurna Chandra Mandal #define EDH_BCOUNT_SHIFT	16
143*23e7578cSPurna Chandra Mandal #define EDH_BCOUNT(len)		((len) << EDH_BCOUNT_SHIFT)
144*23e7578cSPurna Chandra Mandal 
145*23e7578cSPurna Chandra Mandal /* Ethernet Hardware Descriptors
146*23e7578cSPurna Chandra Mandal  * ref: PIC32 Family Reference Manual Table 35-7
147*23e7578cSPurna Chandra Mandal  * This structure represents the layout of the DMA
148*23e7578cSPurna Chandra Mandal  * memory shared between the CPU and the Ethernet
149*23e7578cSPurna Chandra Mandal  * controller.
150*23e7578cSPurna Chandra Mandal  */
151*23e7578cSPurna Chandra Mandal /* TX/RX DMA descriptor */
152*23e7578cSPurna Chandra Mandal struct eth_dma_desc {
153*23e7578cSPurna Chandra Mandal 	u32 hdr;	/* header */
154*23e7578cSPurna Chandra Mandal 	u32 data_buff;	/* data buffer address */
155*23e7578cSPurna Chandra Mandal 	u32 stat1;	/* transmit/receive packet status */
156*23e7578cSPurna Chandra Mandal 	u32 stat2;	/* transmit/receive packet status */
157*23e7578cSPurna Chandra Mandal 	u32 next_ed;	/* next descriptor */
158*23e7578cSPurna Chandra Mandal };
159*23e7578cSPurna Chandra Mandal 
160*23e7578cSPurna Chandra Mandal #define PIC32_MDIO_NAME "PIC32_EMAC"
161*23e7578cSPurna Chandra Mandal 
162*23e7578cSPurna Chandra Mandal int pic32_mdio_init(const char *name, ulong ioaddr);
163*23e7578cSPurna Chandra Mandal 
164*23e7578cSPurna Chandra Mandal #endif /* __MICROCHIP_PIC32_ETH_H_*/
165