xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/ti/cpsw_priv.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Texas Instruments Ethernet Switch Driver
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef DRIVERS_NET_ETHERNET_TI_CPSW_PRIV_H_
7*4882a593Smuzhiyun #define DRIVERS_NET_ETHERNET_TI_CPSW_PRIV_H_
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include "davinci_cpdma.h"
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define CPSW_DEBUG	(NETIF_MSG_HW		| NETIF_MSG_WOL		| \
12*4882a593Smuzhiyun 			 NETIF_MSG_DRV		| NETIF_MSG_LINK	| \
13*4882a593Smuzhiyun 			 NETIF_MSG_IFUP		| NETIF_MSG_INTR	| \
14*4882a593Smuzhiyun 			 NETIF_MSG_PROBE	| NETIF_MSG_TIMER	| \
15*4882a593Smuzhiyun 			 NETIF_MSG_IFDOWN	| NETIF_MSG_RX_ERR	| \
16*4882a593Smuzhiyun 			 NETIF_MSG_TX_ERR	| NETIF_MSG_TX_DONE	| \
17*4882a593Smuzhiyun 			 NETIF_MSG_PKTDATA	| NETIF_MSG_TX_QUEUED	| \
18*4882a593Smuzhiyun 			 NETIF_MSG_RX_STATUS)
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define cpsw_info(priv, type, format, ...)		\
21*4882a593Smuzhiyun do {								\
22*4882a593Smuzhiyun 	if (netif_msg_##type(priv) && net_ratelimit())		\
23*4882a593Smuzhiyun 		dev_info(priv->dev, format, ## __VA_ARGS__);	\
24*4882a593Smuzhiyun } while (0)
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define cpsw_err(priv, type, format, ...)		\
27*4882a593Smuzhiyun do {								\
28*4882a593Smuzhiyun 	if (netif_msg_##type(priv) && net_ratelimit())		\
29*4882a593Smuzhiyun 		dev_err(priv->dev, format, ## __VA_ARGS__);	\
30*4882a593Smuzhiyun } while (0)
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define cpsw_dbg(priv, type, format, ...)		\
33*4882a593Smuzhiyun do {								\
34*4882a593Smuzhiyun 	if (netif_msg_##type(priv) && net_ratelimit())		\
35*4882a593Smuzhiyun 		dev_dbg(priv->dev, format, ## __VA_ARGS__);	\
36*4882a593Smuzhiyun } while (0)
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define cpsw_notice(priv, type, format, ...)		\
39*4882a593Smuzhiyun do {								\
40*4882a593Smuzhiyun 	if (netif_msg_##type(priv) && net_ratelimit())		\
41*4882a593Smuzhiyun 		dev_notice(priv->dev, format, ## __VA_ARGS__);	\
42*4882a593Smuzhiyun } while (0)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define ALE_ALL_PORTS		0x7
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define CPSW_MAJOR_VERSION(reg)		(reg >> 8 & 0x7)
47*4882a593Smuzhiyun #define CPSW_MINOR_VERSION(reg)		(reg & 0xff)
48*4882a593Smuzhiyun #define CPSW_RTL_VERSION(reg)		((reg >> 11) & 0x1f)
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define CPSW_VERSION_1		0x19010a
51*4882a593Smuzhiyun #define CPSW_VERSION_2		0x19010c
52*4882a593Smuzhiyun #define CPSW_VERSION_3		0x19010f
53*4882a593Smuzhiyun #define CPSW_VERSION_4		0x190112
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define HOST_PORT_NUM		0
56*4882a593Smuzhiyun #define CPSW_ALE_PORTS_NUM	3
57*4882a593Smuzhiyun #define CPSW_SLAVE_PORTS_NUM	2
58*4882a593Smuzhiyun #define SLIVER_SIZE		0x40
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define CPSW1_HOST_PORT_OFFSET	0x028
61*4882a593Smuzhiyun #define CPSW1_SLAVE_OFFSET	0x050
62*4882a593Smuzhiyun #define CPSW1_SLAVE_SIZE	0x040
63*4882a593Smuzhiyun #define CPSW1_CPDMA_OFFSET	0x100
64*4882a593Smuzhiyun #define CPSW1_STATERAM_OFFSET	0x200
65*4882a593Smuzhiyun #define CPSW1_HW_STATS		0x400
66*4882a593Smuzhiyun #define CPSW1_CPTS_OFFSET	0x500
67*4882a593Smuzhiyun #define CPSW1_ALE_OFFSET	0x600
68*4882a593Smuzhiyun #define CPSW1_SLIVER_OFFSET	0x700
69*4882a593Smuzhiyun #define CPSW1_WR_OFFSET		0x900
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define CPSW2_HOST_PORT_OFFSET	0x108
72*4882a593Smuzhiyun #define CPSW2_SLAVE_OFFSET	0x200
73*4882a593Smuzhiyun #define CPSW2_SLAVE_SIZE	0x100
74*4882a593Smuzhiyun #define CPSW2_CPDMA_OFFSET	0x800
75*4882a593Smuzhiyun #define CPSW2_HW_STATS		0x900
76*4882a593Smuzhiyun #define CPSW2_STATERAM_OFFSET	0xa00
77*4882a593Smuzhiyun #define CPSW2_CPTS_OFFSET	0xc00
78*4882a593Smuzhiyun #define CPSW2_ALE_OFFSET	0xd00
79*4882a593Smuzhiyun #define CPSW2_SLIVER_OFFSET	0xd80
80*4882a593Smuzhiyun #define CPSW2_BD_OFFSET		0x2000
81*4882a593Smuzhiyun #define CPSW2_WR_OFFSET		0x1200
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define CPDMA_RXTHRESH		0x0c0
84*4882a593Smuzhiyun #define CPDMA_RXFREE		0x0e0
85*4882a593Smuzhiyun #define CPDMA_TXHDP		0x00
86*4882a593Smuzhiyun #define CPDMA_RXHDP		0x20
87*4882a593Smuzhiyun #define CPDMA_TXCP		0x40
88*4882a593Smuzhiyun #define CPDMA_RXCP		0x60
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun #define CPSW_POLL_WEIGHT	64
91*4882a593Smuzhiyun #define CPSW_RX_VLAN_ENCAP_HDR_SIZE		4
92*4882a593Smuzhiyun #define CPSW_MIN_PACKET_SIZE_VLAN	(VLAN_ETH_ZLEN)
93*4882a593Smuzhiyun #define CPSW_MIN_PACKET_SIZE	(ETH_ZLEN)
94*4882a593Smuzhiyun #define CPSW_MAX_PACKET_SIZE	(VLAN_ETH_FRAME_LEN +\
95*4882a593Smuzhiyun 				 ETH_FCS_LEN +\
96*4882a593Smuzhiyun 				 CPSW_RX_VLAN_ENCAP_HDR_SIZE)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun #define RX_PRIORITY_MAPPING	0x76543210
99*4882a593Smuzhiyun #define TX_PRIORITY_MAPPING	0x33221100
100*4882a593Smuzhiyun #define CPDMA_TX_PRIORITY_MAP	0x76543210
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #define CPSW_VLAN_AWARE		BIT(1)
103*4882a593Smuzhiyun #define CPSW_RX_VLAN_ENCAP	BIT(2)
104*4882a593Smuzhiyun #define CPSW_ALE_VLAN_AWARE	1
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun #define CPSW_FIFO_NORMAL_MODE		(0 << 16)
107*4882a593Smuzhiyun #define CPSW_FIFO_DUAL_MAC_MODE		(1 << 16)
108*4882a593Smuzhiyun #define CPSW_FIFO_RATE_LIMIT_MODE	(2 << 16)
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #define CPSW_INTPACEEN		(0x3f << 16)
111*4882a593Smuzhiyun #define CPSW_INTPRESCALE_MASK	(0x7FF << 0)
112*4882a593Smuzhiyun #define CPSW_CMINTMAX_CNT	63
113*4882a593Smuzhiyun #define CPSW_CMINTMIN_CNT	2
114*4882a593Smuzhiyun #define CPSW_CMINTMAX_INTVL	(1000 / CPSW_CMINTMIN_CNT)
115*4882a593Smuzhiyun #define CPSW_CMINTMIN_INTVL	((1000 / CPSW_CMINTMAX_CNT) + 1)
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define IRQ_NUM			2
118*4882a593Smuzhiyun #define CPSW_MAX_QUEUES		8
119*4882a593Smuzhiyun #define CPSW_CPDMA_DESCS_POOL_SIZE_DEFAULT 256
120*4882a593Smuzhiyun #define CPSW_ALE_AGEOUT_DEFAULT		10 /* sec */
121*4882a593Smuzhiyun #define CPSW_FIFO_QUEUE_TYPE_SHIFT	16
122*4882a593Smuzhiyun #define CPSW_FIFO_SHAPE_EN_SHIFT	16
123*4882a593Smuzhiyun #define CPSW_FIFO_RATE_EN_SHIFT		20
124*4882a593Smuzhiyun #define CPSW_TC_NUM			4
125*4882a593Smuzhiyun #define CPSW_FIFO_SHAPERS_NUM		(CPSW_TC_NUM - 1)
126*4882a593Smuzhiyun #define CPSW_PCT_MASK			0x7f
127*4882a593Smuzhiyun #define CPSW_BD_RAM_SIZE		0x2000
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #define CPSW_RX_VLAN_ENCAP_HDR_PRIO_SHIFT	29
130*4882a593Smuzhiyun #define CPSW_RX_VLAN_ENCAP_HDR_PRIO_MSK		GENMASK(2, 0)
131*4882a593Smuzhiyun #define CPSW_RX_VLAN_ENCAP_HDR_VID_SHIFT	16
132*4882a593Smuzhiyun #define CPSW_RX_VLAN_ENCAP_HDR_PKT_TYPE_SHIFT	8
133*4882a593Smuzhiyun #define CPSW_RX_VLAN_ENCAP_HDR_PKT_TYPE_MSK	GENMASK(1, 0)
134*4882a593Smuzhiyun enum {
135*4882a593Smuzhiyun 	CPSW_RX_VLAN_ENCAP_HDR_PKT_VLAN_TAG = 0,
136*4882a593Smuzhiyun 	CPSW_RX_VLAN_ENCAP_HDR_PKT_RESERV,
137*4882a593Smuzhiyun 	CPSW_RX_VLAN_ENCAP_HDR_PKT_PRIO_TAG,
138*4882a593Smuzhiyun 	CPSW_RX_VLAN_ENCAP_HDR_PKT_UNTAG,
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun struct cpsw_wr_regs {
142*4882a593Smuzhiyun 	u32	id_ver;
143*4882a593Smuzhiyun 	u32	soft_reset;
144*4882a593Smuzhiyun 	u32	control;
145*4882a593Smuzhiyun 	u32	int_control;
146*4882a593Smuzhiyun 	u32	rx_thresh_en;
147*4882a593Smuzhiyun 	u32	rx_en;
148*4882a593Smuzhiyun 	u32	tx_en;
149*4882a593Smuzhiyun 	u32	misc_en;
150*4882a593Smuzhiyun 	u32	mem_allign1[8];
151*4882a593Smuzhiyun 	u32	rx_thresh_stat;
152*4882a593Smuzhiyun 	u32	rx_stat;
153*4882a593Smuzhiyun 	u32	tx_stat;
154*4882a593Smuzhiyun 	u32	misc_stat;
155*4882a593Smuzhiyun 	u32	mem_allign2[8];
156*4882a593Smuzhiyun 	u32	rx_imax;
157*4882a593Smuzhiyun 	u32	tx_imax;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun };
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun struct cpsw_ss_regs {
162*4882a593Smuzhiyun 	u32	id_ver;
163*4882a593Smuzhiyun 	u32	control;
164*4882a593Smuzhiyun 	u32	soft_reset;
165*4882a593Smuzhiyun 	u32	stat_port_en;
166*4882a593Smuzhiyun 	u32	ptype;
167*4882a593Smuzhiyun 	u32	soft_idle;
168*4882a593Smuzhiyun 	u32	thru_rate;
169*4882a593Smuzhiyun 	u32	gap_thresh;
170*4882a593Smuzhiyun 	u32	tx_start_wds;
171*4882a593Smuzhiyun 	u32	flow_control;
172*4882a593Smuzhiyun 	u32	vlan_ltype;
173*4882a593Smuzhiyun 	u32	ts_ltype;
174*4882a593Smuzhiyun 	u32	dlr_ltype;
175*4882a593Smuzhiyun };
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /* CPSW_PORT_V1 */
178*4882a593Smuzhiyun #define CPSW1_MAX_BLKS      0x00 /* Maximum FIFO Blocks */
179*4882a593Smuzhiyun #define CPSW1_BLK_CNT       0x04 /* FIFO Block Usage Count (Read Only) */
180*4882a593Smuzhiyun #define CPSW1_TX_IN_CTL     0x08 /* Transmit FIFO Control */
181*4882a593Smuzhiyun #define CPSW1_PORT_VLAN     0x0c /* VLAN Register */
182*4882a593Smuzhiyun #define CPSW1_TX_PRI_MAP    0x10 /* Tx Header Priority to Switch Pri Mapping */
183*4882a593Smuzhiyun #define CPSW1_TS_CTL        0x14 /* Time Sync Control */
184*4882a593Smuzhiyun #define CPSW1_TS_SEQ_LTYPE  0x18 /* Time Sync Sequence ID Offset and Msg Type */
185*4882a593Smuzhiyun #define CPSW1_TS_VLAN       0x1c /* Time Sync VLAN1 and VLAN2 */
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun /* CPSW_PORT_V2 */
188*4882a593Smuzhiyun #define CPSW2_CONTROL       0x00 /* Control Register */
189*4882a593Smuzhiyun #define CPSW2_MAX_BLKS      0x08 /* Maximum FIFO Blocks */
190*4882a593Smuzhiyun #define CPSW2_BLK_CNT       0x0c /* FIFO Block Usage Count (Read Only) */
191*4882a593Smuzhiyun #define CPSW2_TX_IN_CTL     0x10 /* Transmit FIFO Control */
192*4882a593Smuzhiyun #define CPSW2_PORT_VLAN     0x14 /* VLAN Register */
193*4882a593Smuzhiyun #define CPSW2_TX_PRI_MAP    0x18 /* Tx Header Priority to Switch Pri Mapping */
194*4882a593Smuzhiyun #define CPSW2_TS_SEQ_MTYPE  0x1c /* Time Sync Sequence ID Offset and Msg Type */
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /* CPSW_PORT_V1 and V2 */
197*4882a593Smuzhiyun #define SA_LO               0x20 /* CPGMAC_SL Source Address Low */
198*4882a593Smuzhiyun #define SA_HI               0x24 /* CPGMAC_SL Source Address High */
199*4882a593Smuzhiyun #define SEND_PERCENT        0x28 /* Transmit Queue Send Percentages */
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun /* CPSW_PORT_V2 only */
202*4882a593Smuzhiyun #define RX_DSCP_PRI_MAP0    0x30 /* Rx DSCP Priority to Rx Packet Mapping */
203*4882a593Smuzhiyun #define RX_DSCP_PRI_MAP1    0x34 /* Rx DSCP Priority to Rx Packet Mapping */
204*4882a593Smuzhiyun #define RX_DSCP_PRI_MAP2    0x38 /* Rx DSCP Priority to Rx Packet Mapping */
205*4882a593Smuzhiyun #define RX_DSCP_PRI_MAP3    0x3c /* Rx DSCP Priority to Rx Packet Mapping */
206*4882a593Smuzhiyun #define RX_DSCP_PRI_MAP4    0x40 /* Rx DSCP Priority to Rx Packet Mapping */
207*4882a593Smuzhiyun #define RX_DSCP_PRI_MAP5    0x44 /* Rx DSCP Priority to Rx Packet Mapping */
208*4882a593Smuzhiyun #define RX_DSCP_PRI_MAP6    0x48 /* Rx DSCP Priority to Rx Packet Mapping */
209*4882a593Smuzhiyun #define RX_DSCP_PRI_MAP7    0x4c /* Rx DSCP Priority to Rx Packet Mapping */
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun /* Bit definitions for the CPSW2_CONTROL register */
212*4882a593Smuzhiyun #define PASS_PRI_TAGGED     BIT(24) /* Pass Priority Tagged */
213*4882a593Smuzhiyun #define VLAN_LTYPE2_EN      BIT(21) /* VLAN LTYPE 2 enable */
214*4882a593Smuzhiyun #define VLAN_LTYPE1_EN      BIT(20) /* VLAN LTYPE 1 enable */
215*4882a593Smuzhiyun #define DSCP_PRI_EN         BIT(16) /* DSCP Priority Enable */
216*4882a593Smuzhiyun #define TS_107              BIT(15) /* Tyme Sync Dest IP Address 107 */
217*4882a593Smuzhiyun #define TS_320              BIT(14) /* Time Sync Dest Port 320 enable */
218*4882a593Smuzhiyun #define TS_319              BIT(13) /* Time Sync Dest Port 319 enable */
219*4882a593Smuzhiyun #define TS_132              BIT(12) /* Time Sync Dest IP Addr 132 enable */
220*4882a593Smuzhiyun #define TS_131              BIT(11) /* Time Sync Dest IP Addr 131 enable */
221*4882a593Smuzhiyun #define TS_130              BIT(10) /* Time Sync Dest IP Addr 130 enable */
222*4882a593Smuzhiyun #define TS_129              BIT(9)  /* Time Sync Dest IP Addr 129 enable */
223*4882a593Smuzhiyun #define TS_TTL_NONZERO      BIT(8)  /* Time Sync Time To Live Non-zero enable */
224*4882a593Smuzhiyun #define TS_ANNEX_F_EN       BIT(6)  /* Time Sync Annex F enable */
225*4882a593Smuzhiyun #define TS_ANNEX_D_EN       BIT(4)  /* Time Sync Annex D enable */
226*4882a593Smuzhiyun #define TS_LTYPE2_EN        BIT(3)  /* Time Sync LTYPE 2 enable */
227*4882a593Smuzhiyun #define TS_LTYPE1_EN        BIT(2)  /* Time Sync LTYPE 1 enable */
228*4882a593Smuzhiyun #define TS_TX_EN            BIT(1)  /* Time Sync Transmit Enable */
229*4882a593Smuzhiyun #define TS_RX_EN            BIT(0)  /* Time Sync Receive Enable */
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun #define CTRL_V2_TS_BITS \
232*4882a593Smuzhiyun 	(TS_320 | TS_319 | TS_132 | TS_131 | TS_130 | TS_129 |\
233*4882a593Smuzhiyun 	 TS_TTL_NONZERO  | TS_ANNEX_D_EN | TS_LTYPE1_EN | VLAN_LTYPE1_EN)
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun #define CTRL_V2_ALL_TS_MASK (CTRL_V2_TS_BITS | TS_TX_EN | TS_RX_EN)
236*4882a593Smuzhiyun #define CTRL_V2_TX_TS_BITS  (CTRL_V2_TS_BITS | TS_TX_EN)
237*4882a593Smuzhiyun #define CTRL_V2_RX_TS_BITS  (CTRL_V2_TS_BITS | TS_RX_EN)
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun #define CTRL_V3_TS_BITS \
241*4882a593Smuzhiyun 	(TS_107 | TS_320 | TS_319 | TS_132 | TS_131 | TS_130 | TS_129 |\
242*4882a593Smuzhiyun 	 TS_TTL_NONZERO | TS_ANNEX_F_EN | TS_ANNEX_D_EN |\
243*4882a593Smuzhiyun 	 TS_LTYPE1_EN | VLAN_LTYPE1_EN)
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun #define CTRL_V3_ALL_TS_MASK (CTRL_V3_TS_BITS | TS_TX_EN | TS_RX_EN)
246*4882a593Smuzhiyun #define CTRL_V3_TX_TS_BITS  (CTRL_V3_TS_BITS | TS_TX_EN)
247*4882a593Smuzhiyun #define CTRL_V3_RX_TS_BITS  (CTRL_V3_TS_BITS | TS_RX_EN)
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun /* Bit definitions for the CPSW2_TS_SEQ_MTYPE register */
250*4882a593Smuzhiyun #define TS_SEQ_ID_OFFSET_SHIFT   (16)    /* Time Sync Sequence ID Offset */
251*4882a593Smuzhiyun #define TS_SEQ_ID_OFFSET_MASK    (0x3f)
252*4882a593Smuzhiyun #define TS_MSG_TYPE_EN_SHIFT     (0)     /* Time Sync Message Type Enable */
253*4882a593Smuzhiyun #define TS_MSG_TYPE_EN_MASK      (0xffff)
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun /* The PTP event messages - Sync, Delay_Req, Pdelay_Req, and Pdelay_Resp. */
256*4882a593Smuzhiyun #define EVENT_MSG_BITS ((1<<0) | (1<<1) | (1<<2) | (1<<3))
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun /* Bit definitions for the CPSW1_TS_CTL register */
259*4882a593Smuzhiyun #define CPSW_V1_TS_RX_EN		BIT(0)
260*4882a593Smuzhiyun #define CPSW_V1_TS_TX_EN		BIT(4)
261*4882a593Smuzhiyun #define CPSW_V1_MSG_TYPE_OFS		16
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun /* Bit definitions for the CPSW1_TS_SEQ_LTYPE register */
264*4882a593Smuzhiyun #define CPSW_V1_SEQ_ID_OFS_SHIFT	16
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun #define CPSW_MAX_BLKS_TX		15
267*4882a593Smuzhiyun #define CPSW_MAX_BLKS_TX_SHIFT		4
268*4882a593Smuzhiyun #define CPSW_MAX_BLKS_RX		5
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun struct cpsw_host_regs {
271*4882a593Smuzhiyun 	u32	max_blks;
272*4882a593Smuzhiyun 	u32	blk_cnt;
273*4882a593Smuzhiyun 	u32	tx_in_ctl;
274*4882a593Smuzhiyun 	u32	port_vlan;
275*4882a593Smuzhiyun 	u32	tx_pri_map;
276*4882a593Smuzhiyun 	u32	cpdma_tx_pri_map;
277*4882a593Smuzhiyun 	u32	cpdma_rx_chan_map;
278*4882a593Smuzhiyun };
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun struct cpsw_slave_data {
281*4882a593Smuzhiyun 	struct device_node *slave_node;
282*4882a593Smuzhiyun 	struct device_node *phy_node;
283*4882a593Smuzhiyun 	char		phy_id[MII_BUS_ID_SIZE];
284*4882a593Smuzhiyun 	phy_interface_t	phy_if;
285*4882a593Smuzhiyun 	u8		mac_addr[ETH_ALEN];
286*4882a593Smuzhiyun 	u16		dual_emac_res_vlan;	/* Reserved VLAN for DualEMAC */
287*4882a593Smuzhiyun 	struct phy	*ifphy;
288*4882a593Smuzhiyun 	bool		disabled;
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun struct cpsw_platform_data {
292*4882a593Smuzhiyun 	struct cpsw_slave_data	*slave_data;
293*4882a593Smuzhiyun 	u32	ss_reg_ofs;	/* Subsystem control register offset */
294*4882a593Smuzhiyun 	u32	channels;	/* number of cpdma channels (symmetric) */
295*4882a593Smuzhiyun 	u32	slaves;		/* number of slave cpgmac ports */
296*4882a593Smuzhiyun 	u32	active_slave;/* time stamping, ethtool and SIOCGMIIPHY slave */
297*4882a593Smuzhiyun 	u32	bd_ram_size;	/*buffer descriptor ram size */
298*4882a593Smuzhiyun 	u32	mac_control;	/* Mac control register */
299*4882a593Smuzhiyun 	u16	default_vlan;	/* Def VLAN for ALE lookup in VLAN aware mode*/
300*4882a593Smuzhiyun 	bool	dual_emac;	/* Enable Dual EMAC mode */
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun struct cpsw_slave {
304*4882a593Smuzhiyun 	void __iomem			*regs;
305*4882a593Smuzhiyun 	int				slave_num;
306*4882a593Smuzhiyun 	u32				mac_control;
307*4882a593Smuzhiyun 	struct cpsw_slave_data		*data;
308*4882a593Smuzhiyun 	struct phy_device		*phy;
309*4882a593Smuzhiyun 	struct net_device		*ndev;
310*4882a593Smuzhiyun 	u32				port_vlan;
311*4882a593Smuzhiyun 	struct cpsw_sl			*mac_sl;
312*4882a593Smuzhiyun };
313*4882a593Smuzhiyun 
slave_read(struct cpsw_slave * slave,u32 offset)314*4882a593Smuzhiyun static inline u32 slave_read(struct cpsw_slave *slave, u32 offset)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun 	return readl_relaxed(slave->regs + offset);
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun 
slave_write(struct cpsw_slave * slave,u32 val,u32 offset)319*4882a593Smuzhiyun static inline void slave_write(struct cpsw_slave *slave, u32 val, u32 offset)
320*4882a593Smuzhiyun {
321*4882a593Smuzhiyun 	writel_relaxed(val, slave->regs + offset);
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun struct cpsw_vector {
325*4882a593Smuzhiyun 	struct cpdma_chan *ch;
326*4882a593Smuzhiyun 	int budget;
327*4882a593Smuzhiyun };
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun struct cpsw_common {
330*4882a593Smuzhiyun 	struct device			*dev;
331*4882a593Smuzhiyun 	struct cpsw_platform_data	data;
332*4882a593Smuzhiyun 	struct napi_struct		napi_rx;
333*4882a593Smuzhiyun 	struct napi_struct		napi_tx;
334*4882a593Smuzhiyun 	struct cpsw_ss_regs __iomem	*regs;
335*4882a593Smuzhiyun 	struct cpsw_wr_regs __iomem	*wr_regs;
336*4882a593Smuzhiyun 	u8 __iomem			*hw_stats;
337*4882a593Smuzhiyun 	struct cpsw_host_regs __iomem	*host_port_regs;
338*4882a593Smuzhiyun 	u32				version;
339*4882a593Smuzhiyun 	u32				coal_intvl;
340*4882a593Smuzhiyun 	u32				bus_freq_mhz;
341*4882a593Smuzhiyun 	int				rx_packet_max;
342*4882a593Smuzhiyun 	int				descs_pool_size;
343*4882a593Smuzhiyun 	struct cpsw_slave		*slaves;
344*4882a593Smuzhiyun 	struct cpdma_ctlr		*dma;
345*4882a593Smuzhiyun 	struct cpsw_vector		txv[CPSW_MAX_QUEUES];
346*4882a593Smuzhiyun 	struct cpsw_vector		rxv[CPSW_MAX_QUEUES];
347*4882a593Smuzhiyun 	struct cpsw_ale			*ale;
348*4882a593Smuzhiyun 	bool				quirk_irq;
349*4882a593Smuzhiyun 	bool				rx_irq_disabled;
350*4882a593Smuzhiyun 	bool				tx_irq_disabled;
351*4882a593Smuzhiyun 	u32 irqs_table[IRQ_NUM];
352*4882a593Smuzhiyun 	int misc_irq;
353*4882a593Smuzhiyun 	struct cpts			*cpts;
354*4882a593Smuzhiyun 	struct devlink *devlink;
355*4882a593Smuzhiyun 	int				rx_ch_num, tx_ch_num;
356*4882a593Smuzhiyun 	int				speed;
357*4882a593Smuzhiyun 	int				usage_count;
358*4882a593Smuzhiyun 	struct page_pool		*page_pool[CPSW_MAX_QUEUES];
359*4882a593Smuzhiyun 	u8 br_members;
360*4882a593Smuzhiyun 	struct net_device *hw_bridge_dev;
361*4882a593Smuzhiyun 	bool ale_bypass;
362*4882a593Smuzhiyun 	u8 base_mac[ETH_ALEN];
363*4882a593Smuzhiyun };
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun struct cpsw_priv {
366*4882a593Smuzhiyun 	struct net_device		*ndev;
367*4882a593Smuzhiyun 	struct device			*dev;
368*4882a593Smuzhiyun 	u32				msg_enable;
369*4882a593Smuzhiyun 	u8				mac_addr[ETH_ALEN];
370*4882a593Smuzhiyun 	bool				rx_pause;
371*4882a593Smuzhiyun 	bool				tx_pause;
372*4882a593Smuzhiyun 	bool				mqprio_hw;
373*4882a593Smuzhiyun 	int				fifo_bw[CPSW_TC_NUM];
374*4882a593Smuzhiyun 	int				shp_cfg_speed;
375*4882a593Smuzhiyun 	int				tx_ts_enabled;
376*4882a593Smuzhiyun 	int				rx_ts_enabled;
377*4882a593Smuzhiyun 	struct bpf_prog			*xdp_prog;
378*4882a593Smuzhiyun 	struct xdp_rxq_info		xdp_rxq[CPSW_MAX_QUEUES];
379*4882a593Smuzhiyun 	struct xdp_attachment_info	xdpi;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	u32 emac_port;
382*4882a593Smuzhiyun 	struct cpsw_common *cpsw;
383*4882a593Smuzhiyun 	int offload_fwd_mark;
384*4882a593Smuzhiyun 	u32 tx_packet_min;
385*4882a593Smuzhiyun };
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun #define ndev_to_cpsw(ndev) (((struct cpsw_priv *)netdev_priv(ndev))->cpsw)
388*4882a593Smuzhiyun #define napi_to_cpsw(napi)	container_of(napi, struct cpsw_common, napi)
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun extern int (*cpsw_slave_index)(struct cpsw_common *cpsw,
391*4882a593Smuzhiyun 			       struct cpsw_priv *priv);
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun struct addr_sync_ctx {
394*4882a593Smuzhiyun 	struct net_device *ndev;
395*4882a593Smuzhiyun 	const u8 *addr;		/* address to be synched */
396*4882a593Smuzhiyun 	int consumed;		/* number of address instances */
397*4882a593Smuzhiyun 	int flush;		/* flush flag */
398*4882a593Smuzhiyun };
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun #define CPSW_XMETA_OFFSET	ALIGN(sizeof(struct xdp_frame), sizeof(long))
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun #define CPSW_XDP_CONSUMED		1
403*4882a593Smuzhiyun #define CPSW_XDP_PASS			0
404*4882a593Smuzhiyun 
__aligned(sizeof (long))405*4882a593Smuzhiyun struct __aligned(sizeof(long)) cpsw_meta_xdp {
406*4882a593Smuzhiyun 	struct net_device *ndev;
407*4882a593Smuzhiyun 	int ch;
408*4882a593Smuzhiyun };
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun /* The buf includes headroom compatible with both skb and xdpf */
411*4882a593Smuzhiyun #define CPSW_HEADROOM_NA (max(XDP_PACKET_HEADROOM, NET_SKB_PAD) + NET_IP_ALIGN)
412*4882a593Smuzhiyun #define CPSW_HEADROOM  ALIGN(CPSW_HEADROOM_NA, sizeof(long))
413*4882a593Smuzhiyun 
cpsw_is_xdpf_handle(void * handle)414*4882a593Smuzhiyun static inline int cpsw_is_xdpf_handle(void *handle)
415*4882a593Smuzhiyun {
416*4882a593Smuzhiyun 	return (unsigned long)handle & BIT(0);
417*4882a593Smuzhiyun }
418*4882a593Smuzhiyun 
cpsw_xdpf_to_handle(struct xdp_frame * xdpf)419*4882a593Smuzhiyun static inline void *cpsw_xdpf_to_handle(struct xdp_frame *xdpf)
420*4882a593Smuzhiyun {
421*4882a593Smuzhiyun 	return (void *)((unsigned long)xdpf | BIT(0));
422*4882a593Smuzhiyun }
423*4882a593Smuzhiyun 
cpsw_handle_to_xdpf(void * handle)424*4882a593Smuzhiyun static inline struct xdp_frame *cpsw_handle_to_xdpf(void *handle)
425*4882a593Smuzhiyun {
426*4882a593Smuzhiyun 	return (struct xdp_frame *)((unsigned long)handle & ~BIT(0));
427*4882a593Smuzhiyun }
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun int cpsw_init_common(struct cpsw_common *cpsw, void __iomem *ss_regs,
430*4882a593Smuzhiyun 		     int ale_ageout, phys_addr_t desc_mem_phys,
431*4882a593Smuzhiyun 		     int descs_pool_size);
432*4882a593Smuzhiyun void cpsw_split_res(struct cpsw_common *cpsw);
433*4882a593Smuzhiyun int cpsw_fill_rx_channels(struct cpsw_priv *priv);
434*4882a593Smuzhiyun void cpsw_intr_enable(struct cpsw_common *cpsw);
435*4882a593Smuzhiyun void cpsw_intr_disable(struct cpsw_common *cpsw);
436*4882a593Smuzhiyun void cpsw_tx_handler(void *token, int len, int status);
437*4882a593Smuzhiyun int cpsw_create_xdp_rxqs(struct cpsw_common *cpsw);
438*4882a593Smuzhiyun void cpsw_destroy_xdp_rxqs(struct cpsw_common *cpsw);
439*4882a593Smuzhiyun int cpsw_ndo_bpf(struct net_device *ndev, struct netdev_bpf *bpf);
440*4882a593Smuzhiyun int cpsw_xdp_tx_frame(struct cpsw_priv *priv, struct xdp_frame *xdpf,
441*4882a593Smuzhiyun 		      struct page *page, int port);
442*4882a593Smuzhiyun int cpsw_run_xdp(struct cpsw_priv *priv, int ch, struct xdp_buff *xdp,
443*4882a593Smuzhiyun 		 struct page *page, int port);
444*4882a593Smuzhiyun irqreturn_t cpsw_tx_interrupt(int irq, void *dev_id);
445*4882a593Smuzhiyun irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id);
446*4882a593Smuzhiyun irqreturn_t cpsw_misc_interrupt(int irq, void *dev_id);
447*4882a593Smuzhiyun int cpsw_tx_mq_poll(struct napi_struct *napi_tx, int budget);
448*4882a593Smuzhiyun int cpsw_tx_poll(struct napi_struct *napi_tx, int budget);
449*4882a593Smuzhiyun int cpsw_rx_mq_poll(struct napi_struct *napi_rx, int budget);
450*4882a593Smuzhiyun int cpsw_rx_poll(struct napi_struct *napi_rx, int budget);
451*4882a593Smuzhiyun void cpsw_rx_vlan_encap(struct sk_buff *skb);
452*4882a593Smuzhiyun void soft_reset(const char *module, void __iomem *reg);
453*4882a593Smuzhiyun void cpsw_set_slave_mac(struct cpsw_slave *slave, struct cpsw_priv *priv);
454*4882a593Smuzhiyun void cpsw_ndo_tx_timeout(struct net_device *ndev, unsigned int txqueue);
455*4882a593Smuzhiyun int cpsw_need_resplit(struct cpsw_common *cpsw);
456*4882a593Smuzhiyun int cpsw_ndo_ioctl(struct net_device *dev, struct ifreq *req, int cmd);
457*4882a593Smuzhiyun int cpsw_ndo_set_tx_maxrate(struct net_device *ndev, int queue, u32 rate);
458*4882a593Smuzhiyun int cpsw_ndo_setup_tc(struct net_device *ndev, enum tc_setup_type type,
459*4882a593Smuzhiyun 		      void *type_data);
460*4882a593Smuzhiyun bool cpsw_shp_is_off(struct cpsw_priv *priv);
461*4882a593Smuzhiyun void cpsw_cbs_resume(struct cpsw_slave *slave, struct cpsw_priv *priv);
462*4882a593Smuzhiyun void cpsw_mqprio_resume(struct cpsw_slave *slave, struct cpsw_priv *priv);
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun /* ethtool */
465*4882a593Smuzhiyun u32 cpsw_get_msglevel(struct net_device *ndev);
466*4882a593Smuzhiyun void cpsw_set_msglevel(struct net_device *ndev, u32 value);
467*4882a593Smuzhiyun int cpsw_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal);
468*4882a593Smuzhiyun int cpsw_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal);
469*4882a593Smuzhiyun int cpsw_get_sset_count(struct net_device *ndev, int sset);
470*4882a593Smuzhiyun void cpsw_get_strings(struct net_device *ndev, u32 stringset, u8 *data);
471*4882a593Smuzhiyun void cpsw_get_ethtool_stats(struct net_device *ndev,
472*4882a593Smuzhiyun 			    struct ethtool_stats *stats, u64 *data);
473*4882a593Smuzhiyun void cpsw_get_pauseparam(struct net_device *ndev,
474*4882a593Smuzhiyun 			 struct ethtool_pauseparam *pause);
475*4882a593Smuzhiyun void cpsw_get_wol(struct net_device *ndev, struct ethtool_wolinfo *wol);
476*4882a593Smuzhiyun int cpsw_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol);
477*4882a593Smuzhiyun int cpsw_get_regs_len(struct net_device *ndev);
478*4882a593Smuzhiyun void cpsw_get_regs(struct net_device *ndev, struct ethtool_regs *regs, void *p);
479*4882a593Smuzhiyun int cpsw_ethtool_op_begin(struct net_device *ndev);
480*4882a593Smuzhiyun void cpsw_ethtool_op_complete(struct net_device *ndev);
481*4882a593Smuzhiyun void cpsw_get_channels(struct net_device *ndev, struct ethtool_channels *ch);
482*4882a593Smuzhiyun int cpsw_get_link_ksettings(struct net_device *ndev,
483*4882a593Smuzhiyun 			    struct ethtool_link_ksettings *ecmd);
484*4882a593Smuzhiyun int cpsw_set_link_ksettings(struct net_device *ndev,
485*4882a593Smuzhiyun 			    const struct ethtool_link_ksettings *ecmd);
486*4882a593Smuzhiyun int cpsw_get_eee(struct net_device *ndev, struct ethtool_eee *edata);
487*4882a593Smuzhiyun int cpsw_set_eee(struct net_device *ndev, struct ethtool_eee *edata);
488*4882a593Smuzhiyun int cpsw_nway_reset(struct net_device *ndev);
489*4882a593Smuzhiyun void cpsw_get_ringparam(struct net_device *ndev,
490*4882a593Smuzhiyun 			struct ethtool_ringparam *ering);
491*4882a593Smuzhiyun int cpsw_set_ringparam(struct net_device *ndev,
492*4882a593Smuzhiyun 		       struct ethtool_ringparam *ering);
493*4882a593Smuzhiyun int cpsw_set_channels_common(struct net_device *ndev,
494*4882a593Smuzhiyun 			     struct ethtool_channels *chs,
495*4882a593Smuzhiyun 			     cpdma_handler_fn rx_handler);
496*4882a593Smuzhiyun int cpsw_get_ts_info(struct net_device *ndev, struct ethtool_ts_info *info);
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun #endif /* DRIVERS_NET_ETHERNET_TI_CPSW_PRIV_H_ */
499