xref: /openbmc/u-boot/drivers/net/pic32_eth.h (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
223e7578cSPurna Chandra Mandal /*
323e7578cSPurna Chandra Mandal  * (c) 2015 Purna Chandra Mandal <purna.mandal@microchip.com>
423e7578cSPurna Chandra Mandal  *
523e7578cSPurna Chandra Mandal  */
623e7578cSPurna Chandra Mandal 
723e7578cSPurna Chandra Mandal #ifndef __MICROCHIP_PIC32_ETH_H_
823e7578cSPurna Chandra Mandal #define __MICROCHIP_PIC32_ETH_H_
923e7578cSPurna Chandra Mandal 
1023e7578cSPurna Chandra Mandal #include <mach/pic32.h>
1123e7578cSPurna Chandra Mandal 
1223e7578cSPurna Chandra Mandal /* Ethernet */
1323e7578cSPurna Chandra Mandal struct pic32_ectl_regs {
1423e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic con1; /* 0x00 */
1523e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic con2; /* 0x10 */
1623e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic txst; /* 0x20 */
1723e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic rxst; /* 0x30 */
1823e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ht0;  /* 0x40 */
1923e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ht1;  /* 0x50 */
2023e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic pmm0; /* 0x60 */
2123e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic pmm1; /* 0x70 */
2223e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic pmcs; /* 0x80 */
2323e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic pmo;  /* 0x90 */
2423e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic rxfc; /* 0xa0 */
2523e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic rxwm; /* 0xb0 */
2623e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ien;  /* 0xc0 */
2723e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic irq;  /* 0xd0 */
2823e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic stat; /* 0xe0 */
2923e7578cSPurna Chandra Mandal };
3023e7578cSPurna Chandra Mandal 
3123e7578cSPurna Chandra Mandal struct pic32_mii_regs {
3223e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mcfg; /* 0x280 */
3323e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mcmd; /* 0x290 */
3423e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic madr; /* 0x2a0 */
3523e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mwtd; /* 0x2b0 */
3623e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mrdd; /* 0x2c0 */
3723e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic mind; /* 0x2d0 */
3823e7578cSPurna Chandra Mandal };
3923e7578cSPurna Chandra Mandal 
4023e7578cSPurna Chandra Mandal struct pic32_emac_regs {
4123e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic cfg1; /* 0x200*/
4223e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic cfg2; /* 0x210*/
4323e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ipgt; /* 0x220*/
4423e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic ipgr; /* 0x230*/
4523e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic clrt; /* 0x240*/
4623e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic maxf; /* 0x250*/
4723e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic supp; /* 0x260*/
4823e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic test; /* 0x270*/
4923e7578cSPurna Chandra Mandal 	struct pic32_mii_regs mii;    /* 0x280 - 0x2d0 */
5023e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic res1; /* 0x2e0 */
5123e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic res2; /* 0x2f0 */
5223e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic sa0;  /* 0x300 */
5323e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic sa1;  /* 0x310 */
5423e7578cSPurna Chandra Mandal 	struct pic32_reg_atomic sa2;  /* 0x320 */
5523e7578cSPurna Chandra Mandal };
5623e7578cSPurna Chandra Mandal 
5723e7578cSPurna Chandra Mandal /* ETHCON1 Reg field */
5823e7578cSPurna Chandra Mandal #define ETHCON_BUFCDEC		BIT(0)
5923e7578cSPurna Chandra Mandal #define ETHCON_RXEN		BIT(8)
6023e7578cSPurna Chandra Mandal #define ETHCON_TXRTS		BIT(9)
6123e7578cSPurna Chandra Mandal #define ETHCON_ON		BIT(15)
6223e7578cSPurna Chandra Mandal 
6323e7578cSPurna Chandra Mandal /* ETHCON2 Reg field */
6423e7578cSPurna Chandra Mandal #define ETHCON_RXBUFSZ		0x7f
6523e7578cSPurna Chandra Mandal #define ETHCON_RXBUFSZ_SHFT	0x4
6623e7578cSPurna Chandra Mandal 
6723e7578cSPurna Chandra Mandal /* ETHSTAT Reg field */
6823e7578cSPurna Chandra Mandal #define ETHSTAT_BUSY		BIT(7)
6923e7578cSPurna Chandra Mandal #define ETHSTAT_BUFCNT		0x00ff0000
7023e7578cSPurna Chandra Mandal 
7123e7578cSPurna Chandra Mandal /* ETHRXFC Register fields */
7223e7578cSPurna Chandra Mandal #define ETHRXFC_BCEN		BIT(0)
7323e7578cSPurna Chandra Mandal #define ETHRXFC_MCEN		BIT(1)
7423e7578cSPurna Chandra Mandal #define ETHRXFC_UCEN		BIT(3)
7523e7578cSPurna Chandra Mandal #define ETHRXFC_RUNTEN		BIT(4)
7623e7578cSPurna Chandra Mandal #define ETHRXFC_CRCOKEN		BIT(5)
7723e7578cSPurna Chandra Mandal 
7823e7578cSPurna Chandra Mandal /* EMAC1CFG1 register offset */
7923e7578cSPurna Chandra Mandal #define PIC32_EMAC1CFG1		0x0200
8023e7578cSPurna Chandra Mandal 
8123e7578cSPurna Chandra Mandal /* EMAC1CFG1 register fields */
8223e7578cSPurna Chandra Mandal #define EMAC_RXENABLE		BIT(0)
8323e7578cSPurna Chandra Mandal #define EMAC_RXPAUSE		BIT(2)
8423e7578cSPurna Chandra Mandal #define EMAC_TXPAUSE		BIT(3)
8523e7578cSPurna Chandra Mandal #define EMAC_SOFTRESET		BIT(15)
8623e7578cSPurna Chandra Mandal 
8723e7578cSPurna Chandra Mandal /* EMAC1CFG2 register fields */
8823e7578cSPurna Chandra Mandal #define EMAC_FULLDUP		BIT(0)
8923e7578cSPurna Chandra Mandal #define EMAC_LENGTHCK		BIT(1)
9023e7578cSPurna Chandra Mandal #define EMAC_CRCENABLE		BIT(4)
9123e7578cSPurna Chandra Mandal #define EMAC_PADENABLE		BIT(5)
9223e7578cSPurna Chandra Mandal #define EMAC_AUTOPAD		BIT(7)
9323e7578cSPurna Chandra Mandal #define EMAC_EXCESS		BIT(14)
9423e7578cSPurna Chandra Mandal 
9523e7578cSPurna Chandra Mandal /* EMAC1IPGT register magic */
9623e7578cSPurna Chandra Mandal #define FULLDUP_GAP_TIME	0x15
9723e7578cSPurna Chandra Mandal #define HALFDUP_GAP_TIME	0x12
9823e7578cSPurna Chandra Mandal 
9923e7578cSPurna Chandra Mandal /* EMAC1SUPP register fields */
10023e7578cSPurna Chandra Mandal #define EMAC_RMII_SPD100	BIT(8)
10123e7578cSPurna Chandra Mandal #define EMAC_RMII_RESET		BIT(11)
10223e7578cSPurna Chandra Mandal 
10323e7578cSPurna Chandra Mandal /* MII Management Configuration Register */
10423e7578cSPurna Chandra Mandal #define MIIMCFG_RSTMGMT		BIT(15)
10523e7578cSPurna Chandra Mandal #define MIIMCFG_CLKSEL_DIV40	0x0020	/* 100Mhz / 40 */
10623e7578cSPurna Chandra Mandal 
10723e7578cSPurna Chandra Mandal /* MII Management Command Register */
10823e7578cSPurna Chandra Mandal #define MIIMCMD_READ		BIT(0)
10923e7578cSPurna Chandra Mandal #define MIIMCMD_SCAN		BIT(1)
11023e7578cSPurna Chandra Mandal 
11123e7578cSPurna Chandra Mandal /* MII Management Address Register */
11223e7578cSPurna Chandra Mandal #define MIIMADD_REGADDR		0x1f
11323e7578cSPurna Chandra Mandal #define MIIMADD_REGADDR_SHIFT	0
11423e7578cSPurna Chandra Mandal #define MIIMADD_PHYADDR_SHIFT	8
11523e7578cSPurna Chandra Mandal 
11623e7578cSPurna Chandra Mandal /* MII Management Indicator Register */
11723e7578cSPurna Chandra Mandal #define MIIMIND_BUSY		BIT(0)
11823e7578cSPurna Chandra Mandal #define MIIMIND_NOTVALID	BIT(2)
11923e7578cSPurna Chandra Mandal #define MIIMIND_LINKFAIL	BIT(3)
12023e7578cSPurna Chandra Mandal 
12123e7578cSPurna Chandra Mandal /* Packet Descriptor */
12223e7578cSPurna Chandra Mandal /* Received Packet Status */
12323e7578cSPurna Chandra Mandal #define _RSV1_PKT_CSUM		0xffff
12423e7578cSPurna Chandra Mandal #define _RSV2_CRC_ERR		BIT(20)
12523e7578cSPurna Chandra Mandal #define _RSV2_LEN_ERR		BIT(21)
12623e7578cSPurna Chandra Mandal #define _RSV2_RX_OK		BIT(23)
12723e7578cSPurna Chandra Mandal #define _RSV2_RX_COUNT		0xffff
12823e7578cSPurna Chandra Mandal 
12923e7578cSPurna Chandra Mandal #define RSV_RX_CSUM(__rsv1)	((__rsv1) & _RSV1_PKT_CSUM)
13023e7578cSPurna Chandra Mandal #define RSV_RX_COUNT(__rsv2)	((__rsv2) & _RSV2_RX_COUNT)
13123e7578cSPurna Chandra Mandal #define RSV_RX_OK(__rsv2)	((__rsv2) & _RSV2_RX_OK)
13223e7578cSPurna Chandra Mandal #define RSV_CRC_ERR(__rsv2)	((__rsv2) & _RSV2_CRC_ERR)
13323e7578cSPurna Chandra Mandal 
13423e7578cSPurna Chandra Mandal /* Ethernet Hardware Descriptor Header bits */
13523e7578cSPurna Chandra Mandal #define EDH_EOWN		BIT(7)
13623e7578cSPurna Chandra Mandal #define EDH_NPV			BIT(8)
13723e7578cSPurna Chandra Mandal #define EDH_STICKY		BIT(9)
13823e7578cSPurna Chandra Mandal #define _EDH_BCOUNT		0x07ff0000
13923e7578cSPurna Chandra Mandal #define EDH_EOP			BIT(30)
14023e7578cSPurna Chandra Mandal #define EDH_SOP			BIT(31)
14123e7578cSPurna Chandra Mandal #define EDH_BCOUNT_SHIFT	16
14223e7578cSPurna Chandra Mandal #define EDH_BCOUNT(len)		((len) << EDH_BCOUNT_SHIFT)
14323e7578cSPurna Chandra Mandal 
14423e7578cSPurna Chandra Mandal /* Ethernet Hardware Descriptors
14523e7578cSPurna Chandra Mandal  * ref: PIC32 Family Reference Manual Table 35-7
14623e7578cSPurna Chandra Mandal  * This structure represents the layout of the DMA
14723e7578cSPurna Chandra Mandal  * memory shared between the CPU and the Ethernet
14823e7578cSPurna Chandra Mandal  * controller.
14923e7578cSPurna Chandra Mandal  */
15023e7578cSPurna Chandra Mandal /* TX/RX DMA descriptor */
15123e7578cSPurna Chandra Mandal struct eth_dma_desc {
15223e7578cSPurna Chandra Mandal 	u32 hdr;	/* header */
15323e7578cSPurna Chandra Mandal 	u32 data_buff;	/* data buffer address */
15423e7578cSPurna Chandra Mandal 	u32 stat1;	/* transmit/receive packet status */
15523e7578cSPurna Chandra Mandal 	u32 stat2;	/* transmit/receive packet status */
15623e7578cSPurna Chandra Mandal 	u32 next_ed;	/* next descriptor */
15723e7578cSPurna Chandra Mandal };
15823e7578cSPurna Chandra Mandal 
15923e7578cSPurna Chandra Mandal #define PIC32_MDIO_NAME "PIC32_EMAC"
16023e7578cSPurna Chandra Mandal 
16123e7578cSPurna Chandra Mandal int pic32_mdio_init(const char *name, ulong ioaddr);
16223e7578cSPurna Chandra Mandal 
16323e7578cSPurna Chandra Mandal #endif /* __MICROCHIP_PIC32_ETH_H_*/
164