xref: /linux/drivers/net/ethernet/airoha/airoha_eth.h (revision 00a7678310fe3d3f408513e55d9a0b67f0db380f)
1b38f4ff0SLorenzo Bianconi /* SPDX-License-Identifier: GPL-2.0-only */
2b38f4ff0SLorenzo Bianconi /*
3b38f4ff0SLorenzo Bianconi  * Copyright (c) 2024 AIROHA Inc
4b38f4ff0SLorenzo Bianconi  * Author: Lorenzo Bianconi <lorenzo@kernel.org>
5b38f4ff0SLorenzo Bianconi  */
6b38f4ff0SLorenzo Bianconi 
7b38f4ff0SLorenzo Bianconi #ifndef AIROHA_ETH_H
8b38f4ff0SLorenzo Bianconi #define AIROHA_ETH_H
9b38f4ff0SLorenzo Bianconi 
10b38f4ff0SLorenzo Bianconi #include <linux/etherdevice.h>
11b38f4ff0SLorenzo Bianconi #include <linux/iopoll.h>
12b38f4ff0SLorenzo Bianconi #include <linux/kernel.h>
13b38f4ff0SLorenzo Bianconi #include <linux/netdevice.h>
14b38f4ff0SLorenzo Bianconi #include <linux/reset.h>
15*00a76783SLorenzo Bianconi #include <net/dsa.h>
16b38f4ff0SLorenzo Bianconi 
1780369686SLorenzo Bianconi #define AIROHA_MAX_NUM_GDM_PORTS	4
18b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_QDMA		2
19af3cf757SLorenzo Bianconi #define AIROHA_MAX_DSA_PORTS		7
20b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_RSTS		3
21b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_XSI_RSTS		5
22b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_MTU			2000
23b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_PACKET_SIZE		2048
24b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_QOS_CHANNELS		4
25b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_QOS_QUEUES		8
26b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_TX_RING		32
27b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_RX_RING		32
28b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_NETDEV_TX_RINGS	(AIROHA_NUM_TX_RING + \
29b38f4ff0SLorenzo Bianconi 					 AIROHA_NUM_QOS_CHANNELS)
30b38f4ff0SLorenzo Bianconi #define AIROHA_FE_MC_MAX_VLAN_TABLE	64
31b38f4ff0SLorenzo Bianconi #define AIROHA_FE_MC_MAX_VLAN_PORT	16
32b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_TX_IRQ		2
33b38f4ff0SLorenzo Bianconi #define HW_DSCP_NUM			2048
34b38f4ff0SLorenzo Bianconi #define IRQ_QUEUE_LEN(_n)		((_n) ? 1024 : 2048)
35b38f4ff0SLorenzo Bianconi #define TX_DSCP_NUM			1024
36b38f4ff0SLorenzo Bianconi #define RX_DSCP_NUM(_n)			\
37b38f4ff0SLorenzo Bianconi 	((_n) ==  2 ? 128 :		\
38b38f4ff0SLorenzo Bianconi 	 (_n) == 11 ? 128 :		\
39b38f4ff0SLorenzo Bianconi 	 (_n) == 15 ? 128 :		\
40b38f4ff0SLorenzo Bianconi 	 (_n) ==  0 ? 1024 : 16)
41b38f4ff0SLorenzo Bianconi 
42b38f4ff0SLorenzo Bianconi #define PSE_RSV_PAGES			128
43b38f4ff0SLorenzo Bianconi #define PSE_QUEUE_RSV_PAGES		64
44b38f4ff0SLorenzo Bianconi 
45b38f4ff0SLorenzo Bianconi #define QDMA_METER_IDX(_n)		((_n) & 0xff)
46b38f4ff0SLorenzo Bianconi #define QDMA_METER_GROUP(_n)		(((_n) >> 8) & 0x3)
47b38f4ff0SLorenzo Bianconi 
48*00a76783SLorenzo Bianconi #define PPE_NUM				2
49*00a76783SLorenzo Bianconi #define PPE1_SRAM_NUM_ENTRIES		(8 * 1024)
50*00a76783SLorenzo Bianconi #define PPE_SRAM_NUM_ENTRIES		(2 * PPE1_SRAM_NUM_ENTRIES)
51*00a76783SLorenzo Bianconi #define PPE_DRAM_NUM_ENTRIES		(16 * 1024)
52*00a76783SLorenzo Bianconi #define PPE_NUM_ENTRIES			(PPE_SRAM_NUM_ENTRIES + PPE_DRAM_NUM_ENTRIES)
53*00a76783SLorenzo Bianconi #define PPE_HASH_MASK			(PPE_NUM_ENTRIES - 1)
54*00a76783SLorenzo Bianconi #define PPE_ENTRY_SIZE			80
55*00a76783SLorenzo Bianconi #define PPE_RAM_NUM_ENTRIES_SHIFT(_n)	(__ffs((_n) >> 10))
56*00a76783SLorenzo Bianconi 
57af3cf757SLorenzo Bianconi #define MTK_HDR_LEN			4
58af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_8100	1
59af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_88A8	2
60af3cf757SLorenzo Bianconi 
61b38f4ff0SLorenzo Bianconi enum {
62b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX0,
63b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX1,
64b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX2,
65b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX3,
66b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX4,
67b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_MAX
68b38f4ff0SLorenzo Bianconi };
69b38f4ff0SLorenzo Bianconi 
70b38f4ff0SLorenzo Bianconi enum {
71b38f4ff0SLorenzo Bianconi 	XSI_PCIE0_VIP_PORT_MASK	= BIT(22),
72b38f4ff0SLorenzo Bianconi 	XSI_PCIE1_VIP_PORT_MASK	= BIT(23),
73b38f4ff0SLorenzo Bianconi 	XSI_USB_VIP_PORT_MASK	= BIT(25),
74b38f4ff0SLorenzo Bianconi 	XSI_ETH_VIP_PORT_MASK	= BIT(24),
75b38f4ff0SLorenzo Bianconi };
76b38f4ff0SLorenzo Bianconi 
77b38f4ff0SLorenzo Bianconi enum {
78b38f4ff0SLorenzo Bianconi 	DEV_STATE_INITIALIZED,
79b38f4ff0SLorenzo Bianconi };
80b38f4ff0SLorenzo Bianconi 
81b38f4ff0SLorenzo Bianconi enum {
82b38f4ff0SLorenzo Bianconi 	CDM_CRSN_QSEL_Q1 = 1,
83b38f4ff0SLorenzo Bianconi 	CDM_CRSN_QSEL_Q5 = 5,
84b38f4ff0SLorenzo Bianconi 	CDM_CRSN_QSEL_Q6 = 6,
85b38f4ff0SLorenzo Bianconi 	CDM_CRSN_QSEL_Q15 = 15,
86b38f4ff0SLorenzo Bianconi };
87b38f4ff0SLorenzo Bianconi 
88b38f4ff0SLorenzo Bianconi enum {
89b38f4ff0SLorenzo Bianconi 	CRSN_08 = 0x8,
90b38f4ff0SLorenzo Bianconi 	CRSN_21 = 0x15, /* KA */
91b38f4ff0SLorenzo Bianconi 	CRSN_22 = 0x16, /* hit bind and force route to CPU */
92b38f4ff0SLorenzo Bianconi 	CRSN_24 = 0x18,
93b38f4ff0SLorenzo Bianconi 	CRSN_25 = 0x19,
94b38f4ff0SLorenzo Bianconi };
95b38f4ff0SLorenzo Bianconi 
96b38f4ff0SLorenzo Bianconi enum {
97b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM1,
98b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_GDM1,
99b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_GDM2,
100b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_GDM3,
101b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_PPE1,
102b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM2,
103b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM3,
104b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM4,
105b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_PPE2,
106b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_GDM4,
107b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM5,
108b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_DROP = 0xf,
109b38f4ff0SLorenzo Bianconi };
110b38f4ff0SLorenzo Bianconi 
111b38f4ff0SLorenzo Bianconi enum tx_sched_mode {
112b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR8,
113b38f4ff0SLorenzo Bianconi 	TC_SCH_SP,
114b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR7,
115b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR6,
116b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR5,
117b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR4,
118b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR3,
119b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR2,
120b38f4ff0SLorenzo Bianconi };
121b38f4ff0SLorenzo Bianconi 
122b38f4ff0SLorenzo Bianconi enum trtcm_param_type {
123b38f4ff0SLorenzo Bianconi 	TRTCM_MISC_MODE, /* meter_en, pps_mode, tick_sel */
124b38f4ff0SLorenzo Bianconi 	TRTCM_TOKEN_RATE_MODE,
125b38f4ff0SLorenzo Bianconi 	TRTCM_BUCKETSIZE_SHIFT_MODE,
126b38f4ff0SLorenzo Bianconi 	TRTCM_BUCKET_COUNTER_MODE,
127b38f4ff0SLorenzo Bianconi };
128b38f4ff0SLorenzo Bianconi 
129b38f4ff0SLorenzo Bianconi enum trtcm_mode_type {
130b38f4ff0SLorenzo Bianconi 	TRTCM_COMMIT_MODE,
131b38f4ff0SLorenzo Bianconi 	TRTCM_PEAK_MODE,
132b38f4ff0SLorenzo Bianconi };
133b38f4ff0SLorenzo Bianconi 
134b38f4ff0SLorenzo Bianconi enum trtcm_param {
135b38f4ff0SLorenzo Bianconi 	TRTCM_TICK_SEL = BIT(0),
136b38f4ff0SLorenzo Bianconi 	TRTCM_PKT_MODE = BIT(1),
137b38f4ff0SLorenzo Bianconi 	TRTCM_METER_MODE = BIT(2),
138b38f4ff0SLorenzo Bianconi };
139b38f4ff0SLorenzo Bianconi 
140b38f4ff0SLorenzo Bianconi #define MIN_TOKEN_SIZE				4096
141b38f4ff0SLorenzo Bianconi #define MAX_TOKEN_SIZE_OFFSET			17
142b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_MASK			GENMASK(23, 6)
143b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_FRACTION_MASK		GENMASK(5, 0)
144b38f4ff0SLorenzo Bianconi 
145b38f4ff0SLorenzo Bianconi struct airoha_queue_entry {
146b38f4ff0SLorenzo Bianconi 	union {
147b38f4ff0SLorenzo Bianconi 		void *buf;
148b38f4ff0SLorenzo Bianconi 		struct sk_buff *skb;
149b38f4ff0SLorenzo Bianconi 	};
150b38f4ff0SLorenzo Bianconi 	dma_addr_t dma_addr;
151b38f4ff0SLorenzo Bianconi 	u16 dma_len;
152b38f4ff0SLorenzo Bianconi };
153b38f4ff0SLorenzo Bianconi 
154b38f4ff0SLorenzo Bianconi struct airoha_queue {
155b38f4ff0SLorenzo Bianconi 	struct airoha_qdma *qdma;
156b38f4ff0SLorenzo Bianconi 
157b38f4ff0SLorenzo Bianconi 	/* protect concurrent queue accesses */
158b38f4ff0SLorenzo Bianconi 	spinlock_t lock;
159b38f4ff0SLorenzo Bianconi 	struct airoha_queue_entry *entry;
160b38f4ff0SLorenzo Bianconi 	struct airoha_qdma_desc *desc;
161b38f4ff0SLorenzo Bianconi 	u16 head;
162b38f4ff0SLorenzo Bianconi 	u16 tail;
163b38f4ff0SLorenzo Bianconi 
164b38f4ff0SLorenzo Bianconi 	int queued;
165b38f4ff0SLorenzo Bianconi 	int ndesc;
166b38f4ff0SLorenzo Bianconi 	int free_thr;
167b38f4ff0SLorenzo Bianconi 	int buf_size;
168b38f4ff0SLorenzo Bianconi 
169b38f4ff0SLorenzo Bianconi 	struct napi_struct napi;
170b38f4ff0SLorenzo Bianconi 	struct page_pool *page_pool;
171b38f4ff0SLorenzo Bianconi };
172b38f4ff0SLorenzo Bianconi 
173b38f4ff0SLorenzo Bianconi struct airoha_tx_irq_queue {
174b38f4ff0SLorenzo Bianconi 	struct airoha_qdma *qdma;
175b38f4ff0SLorenzo Bianconi 
176b38f4ff0SLorenzo Bianconi 	struct napi_struct napi;
177b38f4ff0SLorenzo Bianconi 
178b38f4ff0SLorenzo Bianconi 	int size;
179b38f4ff0SLorenzo Bianconi 	u32 *q;
180b38f4ff0SLorenzo Bianconi };
181b38f4ff0SLorenzo Bianconi 
182b38f4ff0SLorenzo Bianconi struct airoha_hw_stats {
183b38f4ff0SLorenzo Bianconi 	/* protect concurrent hw_stats accesses */
184b38f4ff0SLorenzo Bianconi 	spinlock_t lock;
185b38f4ff0SLorenzo Bianconi 	struct u64_stats_sync syncp;
186b38f4ff0SLorenzo Bianconi 
187b38f4ff0SLorenzo Bianconi 	/* get_stats64 */
188b38f4ff0SLorenzo Bianconi 	u64 rx_ok_pkts;
189b38f4ff0SLorenzo Bianconi 	u64 tx_ok_pkts;
190b38f4ff0SLorenzo Bianconi 	u64 rx_ok_bytes;
191b38f4ff0SLorenzo Bianconi 	u64 tx_ok_bytes;
192b38f4ff0SLorenzo Bianconi 	u64 rx_multicast;
193b38f4ff0SLorenzo Bianconi 	u64 rx_errors;
194b38f4ff0SLorenzo Bianconi 	u64 rx_drops;
195b38f4ff0SLorenzo Bianconi 	u64 tx_drops;
196b38f4ff0SLorenzo Bianconi 	u64 rx_crc_error;
197b38f4ff0SLorenzo Bianconi 	u64 rx_over_errors;
198b38f4ff0SLorenzo Bianconi 	/* ethtool stats */
199b38f4ff0SLorenzo Bianconi 	u64 tx_broadcast;
200b38f4ff0SLorenzo Bianconi 	u64 tx_multicast;
201b38f4ff0SLorenzo Bianconi 	u64 tx_len[7];
202b38f4ff0SLorenzo Bianconi 	u64 rx_broadcast;
203b38f4ff0SLorenzo Bianconi 	u64 rx_fragment;
204b38f4ff0SLorenzo Bianconi 	u64 rx_jabber;
205b38f4ff0SLorenzo Bianconi 	u64 rx_len[7];
206b38f4ff0SLorenzo Bianconi };
207b38f4ff0SLorenzo Bianconi 
208*00a76783SLorenzo Bianconi enum {
209*00a76783SLorenzo Bianconi 	PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
210*00a76783SLorenzo Bianconi };
211*00a76783SLorenzo Bianconi 
212*00a76783SLorenzo Bianconi enum {
213*00a76783SLorenzo Bianconi 	AIROHA_FOE_STATE_INVALID,
214*00a76783SLorenzo Bianconi 	AIROHA_FOE_STATE_UNBIND,
215*00a76783SLorenzo Bianconi 	AIROHA_FOE_STATE_BIND,
216*00a76783SLorenzo Bianconi 	AIROHA_FOE_STATE_FIN
217*00a76783SLorenzo Bianconi };
218*00a76783SLorenzo Bianconi 
219*00a76783SLorenzo Bianconi enum {
220*00a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV4_HNAPT = 0,
221*00a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV4_ROUTE = 1,
222*00a76783SLorenzo Bianconi 	PPE_PKT_TYPE_BRIDGE = 2,
223*00a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV4_DSLITE = 3,
224*00a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV6_ROUTE_3T = 4,
225*00a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV6_ROUTE_5T = 5,
226*00a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV6_6RD = 7,
227*00a76783SLorenzo Bianconi };
228*00a76783SLorenzo Bianconi 
229*00a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_SMAC_ID		GENMASK(20, 16)
230*00a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_PPPOE_ID		GENMASK(15, 0)
231*00a76783SLorenzo Bianconi 
232*00a76783SLorenzo Bianconi struct airoha_foe_mac_info_common {
233*00a76783SLorenzo Bianconi 	u16 vlan1;
234*00a76783SLorenzo Bianconi 	u16 etype;
235*00a76783SLorenzo Bianconi 
236*00a76783SLorenzo Bianconi 	u32 dest_mac_hi;
237*00a76783SLorenzo Bianconi 
238*00a76783SLorenzo Bianconi 	u16 vlan2;
239*00a76783SLorenzo Bianconi 	u16 dest_mac_lo;
240*00a76783SLorenzo Bianconi 
241*00a76783SLorenzo Bianconi 	u32 src_mac_hi;
242*00a76783SLorenzo Bianconi };
243*00a76783SLorenzo Bianconi 
244*00a76783SLorenzo Bianconi struct airoha_foe_mac_info {
245*00a76783SLorenzo Bianconi 	struct airoha_foe_mac_info_common common;
246*00a76783SLorenzo Bianconi 
247*00a76783SLorenzo Bianconi 	u16 pppoe_id;
248*00a76783SLorenzo Bianconi 	u16 src_mac_lo;
249*00a76783SLorenzo Bianconi };
250*00a76783SLorenzo Bianconi 
251*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PREBIND		BIT(24)
252*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PACKETS		GENMASK(23, 8)
253*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_TIMESTAMP		GENMASK(7, 0)
254*00a76783SLorenzo Bianconi 
255*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATIC		BIT(31)
256*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_UDP			BIT(30)
257*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATE		GENMASK(29, 28)
258*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PACKET_TYPE		GENMASK(27, 25)
259*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TTL			BIT(24)
260*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TUNNEL_DECAP	BIT(23)
261*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PPPOE		BIT(22)
262*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VPM			GENMASK(21, 20)
263*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VLAN_LAYER		GENMASK(19, 16)
264*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_KEEPALIVE		BIT(15)
265*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TIMESTAMP		GENMASK(14, 0)
266*00a76783SLorenzo Bianconi 
267*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_DSCP			GENMASK(31, 24)
268*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PORT_AG			GENMASK(23, 13)
269*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PCP			BIT(12)
270*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_MULTICAST		BIT(11)
271*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_FAST_PATH		BIT(10)
272*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_QOS			BIT(9)
273*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_PORT			GENMASK(8, 5)
274*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_NBQ			GENMASK(4, 0)
275*00a76783SLorenzo Bianconi 
276*00a76783SLorenzo Bianconi #define AIROHA_FOE_ACTDP			GENMASK(31, 24)
277*00a76783SLorenzo Bianconi #define AIROHA_FOE_SHAPER_ID			GENMASK(23, 16)
278*00a76783SLorenzo Bianconi #define AIROHA_FOE_CHANNEL			GENMASK(15, 11)
279*00a76783SLorenzo Bianconi #define AIROHA_FOE_QID				GENMASK(10, 8)
280*00a76783SLorenzo Bianconi #define AIROHA_FOE_DPI				BIT(7)
281*00a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL			BIT(6)
282*00a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL_ID			GENMASK(5, 0)
283*00a76783SLorenzo Bianconi 
284*00a76783SLorenzo Bianconi struct airoha_foe_bridge {
285*00a76783SLorenzo Bianconi 	u32 dest_mac_hi;
286*00a76783SLorenzo Bianconi 
287*00a76783SLorenzo Bianconi 	u16 src_mac_hi;
288*00a76783SLorenzo Bianconi 	u16 dest_mac_lo;
289*00a76783SLorenzo Bianconi 
290*00a76783SLorenzo Bianconi 	u32 src_mac_lo;
291*00a76783SLorenzo Bianconi 
292*00a76783SLorenzo Bianconi 	u32 ib2;
293*00a76783SLorenzo Bianconi 
294*00a76783SLorenzo Bianconi 	u32 rsv[5];
295*00a76783SLorenzo Bianconi 
296*00a76783SLorenzo Bianconi 	u32 data;
297*00a76783SLorenzo Bianconi 
298*00a76783SLorenzo Bianconi 	struct airoha_foe_mac_info l2;
299*00a76783SLorenzo Bianconi };
300*00a76783SLorenzo Bianconi 
301*00a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple {
302*00a76783SLorenzo Bianconi 	u32 src_ip;
303*00a76783SLorenzo Bianconi 	u32 dest_ip;
304*00a76783SLorenzo Bianconi 	union {
305*00a76783SLorenzo Bianconi 		struct {
306*00a76783SLorenzo Bianconi 			u16 dest_port;
307*00a76783SLorenzo Bianconi 			u16 src_port;
308*00a76783SLorenzo Bianconi 		};
309*00a76783SLorenzo Bianconi 		struct {
310*00a76783SLorenzo Bianconi 			u8 protocol;
311*00a76783SLorenzo Bianconi 			u8 _pad[3]; /* fill with 0xa5a5a5 */
312*00a76783SLorenzo Bianconi 		};
313*00a76783SLorenzo Bianconi 		u32 ports;
314*00a76783SLorenzo Bianconi 	};
315*00a76783SLorenzo Bianconi };
316*00a76783SLorenzo Bianconi 
317*00a76783SLorenzo Bianconi struct airoha_foe_ipv4 {
318*00a76783SLorenzo Bianconi 	struct airoha_foe_ipv4_tuple orig_tuple;
319*00a76783SLorenzo Bianconi 
320*00a76783SLorenzo Bianconi 	u32 ib2;
321*00a76783SLorenzo Bianconi 
322*00a76783SLorenzo Bianconi 	struct airoha_foe_ipv4_tuple new_tuple;
323*00a76783SLorenzo Bianconi 
324*00a76783SLorenzo Bianconi 	u32 rsv[2];
325*00a76783SLorenzo Bianconi 
326*00a76783SLorenzo Bianconi 	u32 data;
327*00a76783SLorenzo Bianconi 
328*00a76783SLorenzo Bianconi 	struct airoha_foe_mac_info l2;
329*00a76783SLorenzo Bianconi };
330*00a76783SLorenzo Bianconi 
331*00a76783SLorenzo Bianconi struct airoha_foe_ipv4_dslite {
332*00a76783SLorenzo Bianconi 	struct airoha_foe_ipv4_tuple ip4;
333*00a76783SLorenzo Bianconi 
334*00a76783SLorenzo Bianconi 	u32 ib2;
335*00a76783SLorenzo Bianconi 
336*00a76783SLorenzo Bianconi 	u8 flow_label[3];
337*00a76783SLorenzo Bianconi 	u8 priority;
338*00a76783SLorenzo Bianconi 
339*00a76783SLorenzo Bianconi 	u32 rsv[4];
340*00a76783SLorenzo Bianconi 
341*00a76783SLorenzo Bianconi 	u32 data;
342*00a76783SLorenzo Bianconi 
343*00a76783SLorenzo Bianconi 	struct airoha_foe_mac_info l2;
344*00a76783SLorenzo Bianconi };
345*00a76783SLorenzo Bianconi 
346*00a76783SLorenzo Bianconi struct airoha_foe_ipv6 {
347*00a76783SLorenzo Bianconi 	u32 src_ip[4];
348*00a76783SLorenzo Bianconi 	u32 dest_ip[4];
349*00a76783SLorenzo Bianconi 
350*00a76783SLorenzo Bianconi 	union {
351*00a76783SLorenzo Bianconi 		struct {
352*00a76783SLorenzo Bianconi 			u16 dest_port;
353*00a76783SLorenzo Bianconi 			u16 src_port;
354*00a76783SLorenzo Bianconi 		};
355*00a76783SLorenzo Bianconi 		struct {
356*00a76783SLorenzo Bianconi 			u8 protocol;
357*00a76783SLorenzo Bianconi 			u8 pad[3];
358*00a76783SLorenzo Bianconi 		};
359*00a76783SLorenzo Bianconi 		u32 ports;
360*00a76783SLorenzo Bianconi 	};
361*00a76783SLorenzo Bianconi 
362*00a76783SLorenzo Bianconi 	u32 data;
363*00a76783SLorenzo Bianconi 
364*00a76783SLorenzo Bianconi 	u32 ib2;
365*00a76783SLorenzo Bianconi 
366*00a76783SLorenzo Bianconi 	struct airoha_foe_mac_info_common l2;
367*00a76783SLorenzo Bianconi };
368*00a76783SLorenzo Bianconi 
369*00a76783SLorenzo Bianconi struct airoha_foe_entry {
370*00a76783SLorenzo Bianconi 	union {
371*00a76783SLorenzo Bianconi 		struct {
372*00a76783SLorenzo Bianconi 			u32 ib1;
373*00a76783SLorenzo Bianconi 			union {
374*00a76783SLorenzo Bianconi 				struct airoha_foe_bridge bridge;
375*00a76783SLorenzo Bianconi 				struct airoha_foe_ipv4 ipv4;
376*00a76783SLorenzo Bianconi 				struct airoha_foe_ipv4_dslite dslite;
377*00a76783SLorenzo Bianconi 				struct airoha_foe_ipv6 ipv6;
378*00a76783SLorenzo Bianconi 				DECLARE_FLEX_ARRAY(u32, d);
379*00a76783SLorenzo Bianconi 			};
380*00a76783SLorenzo Bianconi 		};
381*00a76783SLorenzo Bianconi 		u8 data[PPE_ENTRY_SIZE];
382*00a76783SLorenzo Bianconi 	};
383*00a76783SLorenzo Bianconi };
384*00a76783SLorenzo Bianconi 
385*00a76783SLorenzo Bianconi struct airoha_flow_data {
386*00a76783SLorenzo Bianconi 	struct ethhdr eth;
387*00a76783SLorenzo Bianconi 
388*00a76783SLorenzo Bianconi 	union {
389*00a76783SLorenzo Bianconi 		struct {
390*00a76783SLorenzo Bianconi 			__be32 src_addr;
391*00a76783SLorenzo Bianconi 			__be32 dst_addr;
392*00a76783SLorenzo Bianconi 		} v4;
393*00a76783SLorenzo Bianconi 
394*00a76783SLorenzo Bianconi 		struct {
395*00a76783SLorenzo Bianconi 			struct in6_addr src_addr;
396*00a76783SLorenzo Bianconi 			struct in6_addr dst_addr;
397*00a76783SLorenzo Bianconi 		} v6;
398*00a76783SLorenzo Bianconi 	};
399*00a76783SLorenzo Bianconi 
400*00a76783SLorenzo Bianconi 	__be16 src_port;
401*00a76783SLorenzo Bianconi 	__be16 dst_port;
402*00a76783SLorenzo Bianconi 
403*00a76783SLorenzo Bianconi 	struct {
404*00a76783SLorenzo Bianconi 		struct {
405*00a76783SLorenzo Bianconi 			u16 id;
406*00a76783SLorenzo Bianconi 			__be16 proto;
407*00a76783SLorenzo Bianconi 		} hdr[2];
408*00a76783SLorenzo Bianconi 		u8 num;
409*00a76783SLorenzo Bianconi 	} vlan;
410*00a76783SLorenzo Bianconi 	struct {
411*00a76783SLorenzo Bianconi 		u16 sid;
412*00a76783SLorenzo Bianconi 		u8 num;
413*00a76783SLorenzo Bianconi 	} pppoe;
414*00a76783SLorenzo Bianconi };
415*00a76783SLorenzo Bianconi 
416*00a76783SLorenzo Bianconi struct airoha_flow_table_entry {
417*00a76783SLorenzo Bianconi 	struct hlist_node list;
418*00a76783SLorenzo Bianconi 
419*00a76783SLorenzo Bianconi 	struct airoha_foe_entry data;
420*00a76783SLorenzo Bianconi 	u32 hash;
421*00a76783SLorenzo Bianconi 
422*00a76783SLorenzo Bianconi 	struct rhash_head node;
423*00a76783SLorenzo Bianconi 	unsigned long cookie;
424*00a76783SLorenzo Bianconi };
425*00a76783SLorenzo Bianconi 
426b38f4ff0SLorenzo Bianconi struct airoha_qdma {
427b38f4ff0SLorenzo Bianconi 	struct airoha_eth *eth;
428b38f4ff0SLorenzo Bianconi 	void __iomem *regs;
429b38f4ff0SLorenzo Bianconi 
430b38f4ff0SLorenzo Bianconi 	/* protect concurrent irqmask accesses */
431b38f4ff0SLorenzo Bianconi 	spinlock_t irq_lock;
432b38f4ff0SLorenzo Bianconi 	u32 irqmask[QDMA_INT_REG_MAX];
433b38f4ff0SLorenzo Bianconi 	int irq;
434b38f4ff0SLorenzo Bianconi 
43580369686SLorenzo Bianconi 	atomic_t users;
43680369686SLorenzo Bianconi 
437b38f4ff0SLorenzo Bianconi 	struct airoha_tx_irq_queue q_tx_irq[AIROHA_NUM_TX_IRQ];
438b38f4ff0SLorenzo Bianconi 
439b38f4ff0SLorenzo Bianconi 	struct airoha_queue q_tx[AIROHA_NUM_TX_RING];
440b38f4ff0SLorenzo Bianconi 	struct airoha_queue q_rx[AIROHA_NUM_RX_RING];
441b38f4ff0SLorenzo Bianconi 
442b38f4ff0SLorenzo Bianconi 	/* descriptor and packet buffers for qdma hw forward */
443b38f4ff0SLorenzo Bianconi 	struct {
444b38f4ff0SLorenzo Bianconi 		void *desc;
445b38f4ff0SLorenzo Bianconi 		void *q;
446b38f4ff0SLorenzo Bianconi 	} hfwd;
447b38f4ff0SLorenzo Bianconi };
448b38f4ff0SLorenzo Bianconi 
449b38f4ff0SLorenzo Bianconi struct airoha_gdm_port {
450b38f4ff0SLorenzo Bianconi 	struct airoha_qdma *qdma;
451b38f4ff0SLorenzo Bianconi 	struct net_device *dev;
452b38f4ff0SLorenzo Bianconi 	int id;
453b38f4ff0SLorenzo Bianconi 
454b38f4ff0SLorenzo Bianconi 	struct airoha_hw_stats stats;
455b38f4ff0SLorenzo Bianconi 
456b38f4ff0SLorenzo Bianconi 	DECLARE_BITMAP(qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS);
457b38f4ff0SLorenzo Bianconi 
458b38f4ff0SLorenzo Bianconi 	/* qos stats counters */
459b38f4ff0SLorenzo Bianconi 	u64 cpu_tx_packets;
460b38f4ff0SLorenzo Bianconi 	u64 fwd_tx_packets;
461af3cf757SLorenzo Bianconi 
462af3cf757SLorenzo Bianconi 	struct metadata_dst *dsa_meta[AIROHA_MAX_DSA_PORTS];
463b38f4ff0SLorenzo Bianconi };
464b38f4ff0SLorenzo Bianconi 
465*00a76783SLorenzo Bianconi #define AIROHA_RXD4_PPE_CPU_REASON	GENMASK(20, 16)
466*00a76783SLorenzo Bianconi #define AIROHA_RXD4_FOE_ENTRY		GENMASK(15, 0)
467*00a76783SLorenzo Bianconi 
468*00a76783SLorenzo Bianconi struct airoha_ppe {
469*00a76783SLorenzo Bianconi 	struct airoha_eth *eth;
470*00a76783SLorenzo Bianconi 
471*00a76783SLorenzo Bianconi 	void *foe;
472*00a76783SLorenzo Bianconi 	dma_addr_t foe_dma;
473*00a76783SLorenzo Bianconi 
474*00a76783SLorenzo Bianconi 	struct hlist_head *foe_flow;
475*00a76783SLorenzo Bianconi 	u16 foe_check_time[PPE_NUM_ENTRIES];
476*00a76783SLorenzo Bianconi };
477*00a76783SLorenzo Bianconi 
478b38f4ff0SLorenzo Bianconi struct airoha_eth {
479b38f4ff0SLorenzo Bianconi 	struct device *dev;
480b38f4ff0SLorenzo Bianconi 
481b38f4ff0SLorenzo Bianconi 	unsigned long state;
482b38f4ff0SLorenzo Bianconi 	void __iomem *fe_regs;
483b38f4ff0SLorenzo Bianconi 
48423290c7bSLorenzo Bianconi 	struct airoha_npu __rcu *npu;
48523290c7bSLorenzo Bianconi 
486*00a76783SLorenzo Bianconi 	struct airoha_ppe *ppe;
487*00a76783SLorenzo Bianconi 	struct rhashtable flow_table;
488*00a76783SLorenzo Bianconi 
489b38f4ff0SLorenzo Bianconi 	struct reset_control_bulk_data rsts[AIROHA_MAX_NUM_RSTS];
490b38f4ff0SLorenzo Bianconi 	struct reset_control_bulk_data xsi_rsts[AIROHA_MAX_NUM_XSI_RSTS];
491b38f4ff0SLorenzo Bianconi 
492b38f4ff0SLorenzo Bianconi 	struct net_device *napi_dev;
493b38f4ff0SLorenzo Bianconi 
494b38f4ff0SLorenzo Bianconi 	struct airoha_qdma qdma[AIROHA_MAX_NUM_QDMA];
495b38f4ff0SLorenzo Bianconi 	struct airoha_gdm_port *ports[AIROHA_MAX_NUM_GDM_PORTS];
496b38f4ff0SLorenzo Bianconi };
497b38f4ff0SLorenzo Bianconi 
498e0758a86SLorenzo Bianconi u32 airoha_rr(void __iomem *base, u32 offset);
499e0758a86SLorenzo Bianconi void airoha_wr(void __iomem *base, u32 offset, u32 val);
500e0758a86SLorenzo Bianconi u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val);
501e0758a86SLorenzo Bianconi 
502e0758a86SLorenzo Bianconi #define airoha_fe_rr(eth, offset)				\
503e0758a86SLorenzo Bianconi 	airoha_rr((eth)->fe_regs, (offset))
504e0758a86SLorenzo Bianconi #define airoha_fe_wr(eth, offset, val)				\
505e0758a86SLorenzo Bianconi 	airoha_wr((eth)->fe_regs, (offset), (val))
506e0758a86SLorenzo Bianconi #define airoha_fe_rmw(eth, offset, mask, val)			\
507e0758a86SLorenzo Bianconi 	airoha_rmw((eth)->fe_regs, (offset), (mask), (val))
508e0758a86SLorenzo Bianconi #define airoha_fe_set(eth, offset, val)				\
509e0758a86SLorenzo Bianconi 	airoha_rmw((eth)->fe_regs, (offset), 0, (val))
510e0758a86SLorenzo Bianconi #define airoha_fe_clear(eth, offset, val)			\
511e0758a86SLorenzo Bianconi 	airoha_rmw((eth)->fe_regs, (offset), (val), 0)
512e0758a86SLorenzo Bianconi 
513e0758a86SLorenzo Bianconi #define airoha_qdma_rr(qdma, offset)				\
514e0758a86SLorenzo Bianconi 	airoha_rr((qdma)->regs, (offset))
515e0758a86SLorenzo Bianconi #define airoha_qdma_wr(qdma, offset, val)			\
516e0758a86SLorenzo Bianconi 	airoha_wr((qdma)->regs, (offset), (val))
517e0758a86SLorenzo Bianconi #define airoha_qdma_rmw(qdma, offset, mask, val)		\
518e0758a86SLorenzo Bianconi 	airoha_rmw((qdma)->regs, (offset), (mask), (val))
519e0758a86SLorenzo Bianconi #define airoha_qdma_set(qdma, offset, val)			\
520e0758a86SLorenzo Bianconi 	airoha_rmw((qdma)->regs, (offset), 0, (val))
521e0758a86SLorenzo Bianconi #define airoha_qdma_clear(qdma, offset, val)			\
522e0758a86SLorenzo Bianconi 	airoha_rmw((qdma)->regs, (offset), (val), 0)
523e0758a86SLorenzo Bianconi 
524*00a76783SLorenzo Bianconi void airoha_ppe_check_skb(struct airoha_ppe *ppe, u16 hash);
525*00a76783SLorenzo Bianconi int airoha_ppe_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
526*00a76783SLorenzo Bianconi 				 void *cb_priv);
527*00a76783SLorenzo Bianconi int airoha_ppe_init(struct airoha_eth *eth);
528*00a76783SLorenzo Bianconi void airoha_ppe_deinit(struct airoha_eth *eth);
529*00a76783SLorenzo Bianconi 
530b38f4ff0SLorenzo Bianconi #endif /* AIROHA_ETH_H */
531