1*fd3040b9SWells Lu /* SPDX-License-Identifier: GPL-2.0 */
2*fd3040b9SWells Lu /* Copyright Sunplus Technology Co., Ltd.
3*fd3040b9SWells Lu  *       All rights reserved.
4*fd3040b9SWells Lu  */
5*fd3040b9SWells Lu 
6*fd3040b9SWells Lu #ifndef __SPL2SW_DEFINE_H__
7*fd3040b9SWells Lu #define __SPL2SW_DEFINE_H__
8*fd3040b9SWells Lu 
9*fd3040b9SWells Lu #define MAX_NETDEV_NUM			2	/* Maximum # of net-device */
10*fd3040b9SWells Lu 
11*fd3040b9SWells Lu /* Interrupt status */
12*fd3040b9SWells Lu #define MAC_INT_DAISY_MODE_CHG		BIT(31) /* Daisy Mode Change             */
13*fd3040b9SWells Lu #define MAC_INT_IP_CHKSUM_ERR		BIT(23) /* IP Checksum Append Error      */
14*fd3040b9SWells Lu #define MAC_INT_WDOG_TIMER1_EXP		BIT(22) /* Watchdog Timer1 Expired       */
15*fd3040b9SWells Lu #define MAC_INT_WDOG_TIMER0_EXP		BIT(21) /* Watchdog Timer0 Expired       */
16*fd3040b9SWells Lu #define MAC_INT_INTRUDER_ALERT		BIT(20) /* Atruder Alert                 */
17*fd3040b9SWells Lu #define MAC_INT_PORT_ST_CHG		BIT(19) /* Port Status Change            */
18*fd3040b9SWells Lu #define MAC_INT_BC_STORM		BIT(18) /* Broad Cast Storm              */
19*fd3040b9SWells Lu #define MAC_INT_MUST_DROP_LAN		BIT(17) /* Global Queue Exhausted        */
20*fd3040b9SWells Lu #define MAC_INT_GLOBAL_QUE_FULL		BIT(16) /* Global Queue Full             */
21*fd3040b9SWells Lu #define MAC_INT_TX_SOC_PAUSE_ON		BIT(15) /* Soc Port TX Pause On          */
22*fd3040b9SWells Lu #define MAC_INT_RX_SOC_QUE_FULL		BIT(14) /* Soc Port Out Queue Full       */
23*fd3040b9SWells Lu #define MAC_INT_TX_LAN1_QUE_FULL	BIT(9)  /* Port 1 Out Queue Full         */
24*fd3040b9SWells Lu #define MAC_INT_TX_LAN0_QUE_FULL	BIT(8)  /* Port 0 Out Queue Full         */
25*fd3040b9SWells Lu #define MAC_INT_RX_L_DESCF		BIT(7)  /* Low Priority Descriptor Full  */
26*fd3040b9SWells Lu #define MAC_INT_RX_H_DESCF		BIT(6)  /* High Priority Descriptor Full */
27*fd3040b9SWells Lu #define MAC_INT_RX_DONE_L		BIT(5)  /* RX Low Priority Done          */
28*fd3040b9SWells Lu #define MAC_INT_RX_DONE_H		BIT(4)  /* RX High Priority Done         */
29*fd3040b9SWells Lu #define MAC_INT_TX_DONE_L		BIT(3)  /* TX Low Priority Done          */
30*fd3040b9SWells Lu #define MAC_INT_TX_DONE_H		BIT(2)  /* TX High Priority Done         */
31*fd3040b9SWells Lu #define MAC_INT_TX_DES_ERR		BIT(1)  /* TX Descriptor Error           */
32*fd3040b9SWells Lu #define MAC_INT_RX_DES_ERR		BIT(0)  /* Rx Descriptor Error           */
33*fd3040b9SWells Lu 
34*fd3040b9SWells Lu #define MAC_INT_RX			(MAC_INT_RX_DONE_H | MAC_INT_RX_DONE_L | \
35*fd3040b9SWells Lu 					MAC_INT_RX_DES_ERR)
36*fd3040b9SWells Lu #define MAC_INT_TX			(MAC_INT_TX_DONE_L | MAC_INT_TX_DONE_H | \
37*fd3040b9SWells Lu 					MAC_INT_TX_DES_ERR)
38*fd3040b9SWells Lu #define MAC_INT_MASK_DEF		(MAC_INT_DAISY_MODE_CHG | MAC_INT_IP_CHKSUM_ERR | \
39*fd3040b9SWells Lu 					MAC_INT_WDOG_TIMER1_EXP | MAC_INT_WDOG_TIMER0_EXP | \
40*fd3040b9SWells Lu 					MAC_INT_INTRUDER_ALERT | MAC_INT_PORT_ST_CHG | \
41*fd3040b9SWells Lu 					MAC_INT_BC_STORM | MAC_INT_MUST_DROP_LAN | \
42*fd3040b9SWells Lu 					MAC_INT_GLOBAL_QUE_FULL | MAC_INT_TX_SOC_PAUSE_ON | \
43*fd3040b9SWells Lu 					MAC_INT_RX_SOC_QUE_FULL | MAC_INT_TX_LAN1_QUE_FULL | \
44*fd3040b9SWells Lu 					MAC_INT_TX_LAN0_QUE_FULL | MAC_INT_RX_L_DESCF | \
45*fd3040b9SWells Lu 					MAC_INT_RX_H_DESCF)
46*fd3040b9SWells Lu 
47*fd3040b9SWells Lu /* Address table search */
48*fd3040b9SWells Lu #define MAC_ADDR_LOOKUP_IDLE		BIT(2)
49*fd3040b9SWells Lu #define MAC_SEARCH_NEXT_ADDR		BIT(1)
50*fd3040b9SWells Lu #define MAC_BEGIN_SEARCH_ADDR		BIT(0)
51*fd3040b9SWells Lu 
52*fd3040b9SWells Lu /* Address table status */
53*fd3040b9SWells Lu #define MAC_HASH_LOOKUP_ADDR		GENMASK(31, 22)
54*fd3040b9SWells Lu #define MAC_R_PORT_MAP			GENMASK(13, 12)
55*fd3040b9SWells Lu #define MAC_R_CPU_PORT			GENMASK(11, 10)
56*fd3040b9SWells Lu #define MAC_R_VID			GENMASK(9, 7)
57*fd3040b9SWells Lu #define MAC_R_AGE			GENMASK(6, 4)
58*fd3040b9SWells Lu #define MAC_R_PROXY			BIT(3)
59*fd3040b9SWells Lu #define MAC_R_MC_INGRESS		BIT(2)
60*fd3040b9SWells Lu #define MAC_AT_TABLE_END		BIT(1)
61*fd3040b9SWells Lu #define MAC_AT_DATA_READY		BIT(0)
62*fd3040b9SWells Lu 
63*fd3040b9SWells Lu /* Wt mac ad0 */
64*fd3040b9SWells Lu #define MAC_W_PORT_MAP			GENMASK(13, 12)
65*fd3040b9SWells Lu #define MAC_W_LAN_PORT_1		BIT(13)
66*fd3040b9SWells Lu #define MAC_W_LAN_PORT_0		BIT(12)
67*fd3040b9SWells Lu #define MAC_W_CPU_PORT			GENMASK(11, 10)
68*fd3040b9SWells Lu #define MAC_W_CPU_PORT_1		BIT(11)
69*fd3040b9SWells Lu #define MAC_W_CPU_PORT_0		BIT(10)
70*fd3040b9SWells Lu #define MAC_W_VID			GENMASK(9, 7)
71*fd3040b9SWells Lu #define MAC_W_AGE			GENMASK(6, 4)
72*fd3040b9SWells Lu #define MAC_W_PROXY			BIT(3)
73*fd3040b9SWells Lu #define MAC_W_MC_INGRESS		BIT(2)
74*fd3040b9SWells Lu #define MAC_W_MAC_DONE			BIT(1)
75*fd3040b9SWells Lu #define MAC_W_MAC_CMD			BIT(0)
76*fd3040b9SWells Lu 
77*fd3040b9SWells Lu /* W mac 15_0 bus */
78*fd3040b9SWells Lu #define MAC_W_MAC_15_0			GENMASK(15, 0)
79*fd3040b9SWells Lu 
80*fd3040b9SWells Lu /* W mac 47_16 bus */
81*fd3040b9SWells Lu #define MAC_W_MAC_47_16			GENMASK(31, 0)
82*fd3040b9SWells Lu 
83*fd3040b9SWells Lu /* PVID config 0 */
84*fd3040b9SWells Lu #define MAC_P1_PVID			GENMASK(6, 4)
85*fd3040b9SWells Lu #define MAC_P0_PVID			GENMASK(2, 0)
86*fd3040b9SWells Lu 
87*fd3040b9SWells Lu /* VLAN member config 0 */
88*fd3040b9SWells Lu #define MAC_VLAN_MEMSET_3		GENMASK(27, 24)
89*fd3040b9SWells Lu #define MAC_VLAN_MEMSET_2		GENMASK(19, 16)
90*fd3040b9SWells Lu #define MAC_VLAN_MEMSET_1		GENMASK(11, 8)
91*fd3040b9SWells Lu #define MAC_VLAN_MEMSET_0		GENMASK(3, 0)
92*fd3040b9SWells Lu 
93*fd3040b9SWells Lu /* VLAN member config 1 */
94*fd3040b9SWells Lu #define MAC_VLAN_MEMSET_5		GENMASK(11, 8)
95*fd3040b9SWells Lu #define MAC_VLAN_MEMSET_4		GENMASK(3, 0)
96*fd3040b9SWells Lu 
97*fd3040b9SWells Lu /* Port ability */
98*fd3040b9SWells Lu #define MAC_PORT_ABILITY_LINK_ST	GENMASK(25, 24)
99*fd3040b9SWells Lu 
100*fd3040b9SWells Lu /* CPU control */
101*fd3040b9SWells Lu #define MAC_EN_SOC1_AGING		BIT(15)
102*fd3040b9SWells Lu #define MAC_EN_SOC0_AGING		BIT(14)
103*fd3040b9SWells Lu #define MAC_DIS_LRN_SOC1		BIT(13)
104*fd3040b9SWells Lu #define MAC_DIS_LRN_SOC0		BIT(12)
105*fd3040b9SWells Lu #define MAC_EN_CRC_SOC1			BIT(9)
106*fd3040b9SWells Lu #define MAC_EN_CRC_SOC0			BIT(8)
107*fd3040b9SWells Lu #define MAC_DIS_SOC1_CPU		BIT(7)
108*fd3040b9SWells Lu #define MAC_DIS_SOC0_CPU		BIT(6)
109*fd3040b9SWells Lu #define MAC_DIS_BC2CPU_P1		BIT(5)
110*fd3040b9SWells Lu #define MAC_DIS_BC2CPU_P0		BIT(4)
111*fd3040b9SWells Lu #define MAC_DIS_MC2CPU			GENMASK(3, 2)
112*fd3040b9SWells Lu #define MAC_DIS_MC2CPU_P1		BIT(3)
113*fd3040b9SWells Lu #define MAC_DIS_MC2CPU_P0		BIT(2)
114*fd3040b9SWells Lu #define MAC_DIS_UN2CPU			GENMASK(1, 0)
115*fd3040b9SWells Lu 
116*fd3040b9SWells Lu /* Port control 0 */
117*fd3040b9SWells Lu #define MAC_DIS_PORT			GENMASK(25, 24)
118*fd3040b9SWells Lu #define MAC_DIS_PORT1			BIT(25)
119*fd3040b9SWells Lu #define MAC_DIS_PORT0			BIT(24)
120*fd3040b9SWells Lu #define MAC_DIS_RMC2CPU_P1		BIT(17)
121*fd3040b9SWells Lu #define MAC_DIS_RMC2CPU_P0		BIT(16)
122*fd3040b9SWells Lu #define MAC_EN_FLOW_CTL_P1		BIT(9)
123*fd3040b9SWells Lu #define MAC_EN_FLOW_CTL_P0		BIT(8)
124*fd3040b9SWells Lu #define MAC_EN_BACK_PRESS_P1		BIT(1)
125*fd3040b9SWells Lu #define MAC_EN_BACK_PRESS_P0		BIT(0)
126*fd3040b9SWells Lu 
127*fd3040b9SWells Lu /* Port control 1 */
128*fd3040b9SWells Lu #define MAC_DIS_SA_LRN_P1		BIT(9)
129*fd3040b9SWells Lu #define MAC_DIS_SA_LRN_P0		BIT(8)
130*fd3040b9SWells Lu 
131*fd3040b9SWells Lu /* Port control 2 */
132*fd3040b9SWells Lu #define MAC_EN_AGING_P1			BIT(9)
133*fd3040b9SWells Lu #define MAC_EN_AGING_P0			BIT(8)
134*fd3040b9SWells Lu 
135*fd3040b9SWells Lu /* Switch Global control */
136*fd3040b9SWells Lu #define MAC_RMC_TB_FAULT_RULE		GENMASK(26, 25)
137*fd3040b9SWells Lu #define MAC_LED_FLASH_TIME		GENMASK(24, 23)
138*fd3040b9SWells Lu #define MAC_BC_STORM_PREV		GENMASK(5, 4)
139*fd3040b9SWells Lu 
140*fd3040b9SWells Lu /* LED port 0 */
141*fd3040b9SWells Lu #define MAC_LED_ACT_HI			BIT(28)
142*fd3040b9SWells Lu 
143*fd3040b9SWells Lu /* PHY control register 0  */
144*fd3040b9SWells Lu #define MAC_CPU_PHY_WT_DATA		GENMASK(31, 16)
145*fd3040b9SWells Lu #define MAC_CPU_PHY_CMD			GENMASK(14, 13)
146*fd3040b9SWells Lu #define MAC_CPU_PHY_REG_ADDR		GENMASK(12, 8)
147*fd3040b9SWells Lu #define MAC_CPU_PHY_ADDR		GENMASK(4, 0)
148*fd3040b9SWells Lu 
149*fd3040b9SWells Lu /* PHY control register 1 */
150*fd3040b9SWells Lu #define MAC_CPU_PHY_RD_DATA		GENMASK(31, 16)
151*fd3040b9SWells Lu #define MAC_PHY_RD_RDY			BIT(1)
152*fd3040b9SWells Lu #define MAC_PHY_WT_DONE			BIT(0)
153*fd3040b9SWells Lu 
154*fd3040b9SWells Lu /* MAC force mode */
155*fd3040b9SWells Lu #define MAC_EXT_PHY1_ADDR		GENMASK(28, 24)
156*fd3040b9SWells Lu #define MAC_EXT_PHY0_ADDR		GENMASK(20, 16)
157*fd3040b9SWells Lu #define MAC_FORCE_RMII_LINK		GENMASK(9, 8)
158*fd3040b9SWells Lu #define MAC_FORCE_RMII_EN_1		BIT(7)
159*fd3040b9SWells Lu #define MAC_FORCE_RMII_EN_0		BIT(6)
160*fd3040b9SWells Lu #define MAC_FORCE_RMII_FC		GENMASK(5, 4)
161*fd3040b9SWells Lu #define MAC_FORCE_RMII_DPX		GENMASK(3, 2)
162*fd3040b9SWells Lu #define MAC_FORCE_RMII_SPD		GENMASK(1, 0)
163*fd3040b9SWells Lu 
164*fd3040b9SWells Lu /* CPU transmit trigger */
165*fd3040b9SWells Lu #define MAC_TRIG_L_SOC0			BIT(1)
166*fd3040b9SWells Lu #define MAC_TRIG_H_SOC0			BIT(0)
167*fd3040b9SWells Lu 
168*fd3040b9SWells Lu /* Config descriptor queue */
169*fd3040b9SWells Lu #define TX_DESC_NUM			16	/* # of descriptors in TX queue   */
170*fd3040b9SWells Lu #define MAC_GUARD_DESC_NUM		2	/* # of descriptors of gap      0 */
171*fd3040b9SWells Lu #define RX_QUEUE0_DESC_NUM		16	/* # of descriptors in RX queue 0 */
172*fd3040b9SWells Lu #define RX_QUEUE1_DESC_NUM		16	/* # of descriptors in RX queue 1 */
173*fd3040b9SWells Lu #define TX_DESC_QUEUE_NUM		1	/* # of TX queue                  */
174*fd3040b9SWells Lu #define RX_DESC_QUEUE_NUM		2	/* # of RX queue                  */
175*fd3040b9SWells Lu 
176*fd3040b9SWells Lu #define MAC_RX_LEN_MAX			2047	/* Size of RX buffer       */
177*fd3040b9SWells Lu 
178*fd3040b9SWells Lu /* Tx descriptor */
179*fd3040b9SWells Lu /* cmd1 */
180*fd3040b9SWells Lu #define TXD_OWN				BIT(31)
181*fd3040b9SWells Lu #define TXD_ERR_CODE			GENMASK(29, 26)
182*fd3040b9SWells Lu #define TXD_SOP				BIT(25)		/* start of a packet */
183*fd3040b9SWells Lu #define TXD_EOP				BIT(24)		/* end of a packet */
184*fd3040b9SWells Lu #define TXD_VLAN			GENMASK(17, 12)
185*fd3040b9SWells Lu #define TXD_PKT_LEN			GENMASK(10, 0)	/* packet length */
186*fd3040b9SWells Lu /* cmd2 */
187*fd3040b9SWells Lu #define TXD_EOR				BIT(31)		/* end of ring */
188*fd3040b9SWells Lu #define TXD_BUF_LEN2			GENMASK(22, 12)
189*fd3040b9SWells Lu #define TXD_BUF_LEN1			GENMASK(10, 0)
190*fd3040b9SWells Lu 
191*fd3040b9SWells Lu /* Rx descriptor */
192*fd3040b9SWells Lu /* cmd1 */
193*fd3040b9SWells Lu #define RXD_OWN				BIT(31)
194*fd3040b9SWells Lu #define RXD_ERR_CODE			GENMASK(29, 26)
195*fd3040b9SWells Lu #define RXD_TCP_UDP_CHKSUM		BIT(23)
196*fd3040b9SWells Lu #define RXD_PROXY			BIT(22)
197*fd3040b9SWells Lu #define RXD_PROTOCOL			GENMASK(21, 20)
198*fd3040b9SWells Lu #define RXD_VLAN_TAG			BIT(19)
199*fd3040b9SWells Lu #define RXD_IP_CHKSUM			BIT(18)
200*fd3040b9SWells Lu #define RXD_ROUTE_TYPE			GENMASK(17, 16)
201*fd3040b9SWells Lu #define RXD_PKT_SP			GENMASK(14, 12)	/* packet source port */
202*fd3040b9SWells Lu #define RXD_PKT_LEN			GENMASK(10, 0)	/* packet length */
203*fd3040b9SWells Lu /* cmd2 */
204*fd3040b9SWells Lu #define RXD_EOR				BIT(31)		/* end of ring */
205*fd3040b9SWells Lu #define RXD_BUF_LEN2			GENMASK(22, 12)
206*fd3040b9SWells Lu #define RXD_BUF_LEN1			GENMASK(10, 0)
207*fd3040b9SWells Lu 
208*fd3040b9SWells Lu /* structure of descriptor */
209*fd3040b9SWells Lu struct spl2sw_mac_desc {
210*fd3040b9SWells Lu 	u32 cmd1;
211*fd3040b9SWells Lu 	u32 cmd2;
212*fd3040b9SWells Lu 	u32 addr1;
213*fd3040b9SWells Lu 	u32 addr2;
214*fd3040b9SWells Lu };
215*fd3040b9SWells Lu 
216*fd3040b9SWells Lu struct spl2sw_skb_info {
217*fd3040b9SWells Lu 	struct sk_buff *skb;
218*fd3040b9SWells Lu 	u32 mapping;
219*fd3040b9SWells Lu 	u32 len;
220*fd3040b9SWells Lu };
221*fd3040b9SWells Lu 
222*fd3040b9SWells Lu struct spl2sw_common {
223*fd3040b9SWells Lu 	void __iomem *l2sw_reg_base;
224*fd3040b9SWells Lu 
225*fd3040b9SWells Lu 	struct platform_device *pdev;
226*fd3040b9SWells Lu 	struct reset_control *rstc;
227*fd3040b9SWells Lu 	struct clk *clk;
228*fd3040b9SWells Lu 
229*fd3040b9SWells Lu 	void *desc_base;
230*fd3040b9SWells Lu 	dma_addr_t desc_dma;
231*fd3040b9SWells Lu 	s32 desc_size;
232*fd3040b9SWells Lu 	struct spl2sw_mac_desc *rx_desc[RX_DESC_QUEUE_NUM];
233*fd3040b9SWells Lu 	struct spl2sw_skb_info *rx_skb_info[RX_DESC_QUEUE_NUM];
234*fd3040b9SWells Lu 	u32 rx_pos[RX_DESC_QUEUE_NUM];
235*fd3040b9SWells Lu 	u32 rx_desc_num[RX_DESC_QUEUE_NUM];
236*fd3040b9SWells Lu 	u32 rx_desc_buff_size;
237*fd3040b9SWells Lu 
238*fd3040b9SWells Lu 	struct spl2sw_mac_desc *tx_desc;
239*fd3040b9SWells Lu 	struct spl2sw_skb_info tx_temp_skb_info[TX_DESC_NUM];
240*fd3040b9SWells Lu 	u32 tx_done_pos;
241*fd3040b9SWells Lu 	u32 tx_pos;
242*fd3040b9SWells Lu 	u32 tx_desc_full;
243*fd3040b9SWells Lu 
244*fd3040b9SWells Lu 	struct net_device *ndev[MAX_NETDEV_NUM];
245*fd3040b9SWells Lu 	struct mii_bus *mii_bus;
246*fd3040b9SWells Lu 
247*fd3040b9SWells Lu 	struct napi_struct rx_napi;
248*fd3040b9SWells Lu 	struct napi_struct tx_napi;
249*fd3040b9SWells Lu 
250*fd3040b9SWells Lu 	spinlock_t tx_lock;		/* spinlock for accessing tx buffer */
251*fd3040b9SWells Lu 	spinlock_t mdio_lock;		/* spinlock for mdio commands */
252*fd3040b9SWells Lu 	spinlock_t int_mask_lock;	/* spinlock for accessing int mask reg. */
253*fd3040b9SWells Lu 
254*fd3040b9SWells Lu 	u8 enable;
255*fd3040b9SWells Lu };
256*fd3040b9SWells Lu 
257*fd3040b9SWells Lu struct spl2sw_mac {
258*fd3040b9SWells Lu 	struct net_device *ndev;
259*fd3040b9SWells Lu 	struct spl2sw_common *comm;
260*fd3040b9SWells Lu 
261*fd3040b9SWells Lu 	u8 mac_addr[ETH_ALEN];
262*fd3040b9SWells Lu 	phy_interface_t phy_mode;
263*fd3040b9SWells Lu 	struct device_node *phy_node;
264*fd3040b9SWells Lu 
265*fd3040b9SWells Lu 	u8 lan_port;
266*fd3040b9SWells Lu 	u8 to_vlan;
267*fd3040b9SWells Lu 	u8 vlan_id;
268*fd3040b9SWells Lu };
269*fd3040b9SWells Lu 
270*fd3040b9SWells Lu #endif
271