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