xref: /f-stack/dpdk/drivers/net/igc/igc_ethdev.h (revision 2d9fd380)
1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606  * Copyright(c) 2019-2020 Intel Corporation
3*2d9fd380Sjfb8856606  */
4*2d9fd380Sjfb8856606 
5*2d9fd380Sjfb8856606 #ifndef _IGC_ETHDEV_H_
6*2d9fd380Sjfb8856606 #define _IGC_ETHDEV_H_
7*2d9fd380Sjfb8856606 
8*2d9fd380Sjfb8856606 #include <rte_ethdev.h>
9*2d9fd380Sjfb8856606 
10*2d9fd380Sjfb8856606 #include "base/igc_osdep.h"
11*2d9fd380Sjfb8856606 #include "base/igc_hw.h"
12*2d9fd380Sjfb8856606 #include "base/igc_i225.h"
13*2d9fd380Sjfb8856606 #include "base/igc_api.h"
14*2d9fd380Sjfb8856606 
15*2d9fd380Sjfb8856606 #ifdef __cplusplus
16*2d9fd380Sjfb8856606 extern "C" {
17*2d9fd380Sjfb8856606 #endif
18*2d9fd380Sjfb8856606 
19*2d9fd380Sjfb8856606 #define IGC_RSS_RDT_SIZD		128
20*2d9fd380Sjfb8856606 
21*2d9fd380Sjfb8856606 /* VLAN filter table size */
22*2d9fd380Sjfb8856606 #define IGC_VFTA_SIZE			128
23*2d9fd380Sjfb8856606 
24*2d9fd380Sjfb8856606 #define IGC_QUEUE_PAIRS_NUM		4
25*2d9fd380Sjfb8856606 
26*2d9fd380Sjfb8856606 #define IGC_HKEY_MAX_INDEX		10
27*2d9fd380Sjfb8856606 #define IGC_RSS_RDT_SIZD		128
28*2d9fd380Sjfb8856606 
29*2d9fd380Sjfb8856606 #define IGC_DEFAULT_REG_SIZE		4
30*2d9fd380Sjfb8856606 #define IGC_DEFAULT_REG_SIZE_MASK	0xf
31*2d9fd380Sjfb8856606 
32*2d9fd380Sjfb8856606 #define IGC_RSS_RDT_REG_SIZE		IGC_DEFAULT_REG_SIZE
33*2d9fd380Sjfb8856606 #define IGC_RSS_RDT_REG_SIZE_MASK	IGC_DEFAULT_REG_SIZE_MASK
34*2d9fd380Sjfb8856606 #define IGC_HKEY_REG_SIZE		IGC_DEFAULT_REG_SIZE
35*2d9fd380Sjfb8856606 #define IGC_HKEY_SIZE			(IGC_HKEY_REG_SIZE * IGC_HKEY_MAX_INDEX)
36*2d9fd380Sjfb8856606 
37*2d9fd380Sjfb8856606 /*
38*2d9fd380Sjfb8856606  * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be
39*2d9fd380Sjfb8856606  * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary.
40*2d9fd380Sjfb8856606  * This will also optimize cache line size effect.
41*2d9fd380Sjfb8856606  * H/W supports up to cache line size 128.
42*2d9fd380Sjfb8856606  */
43*2d9fd380Sjfb8856606 #define IGC_ALIGN			128
44*2d9fd380Sjfb8856606 
45*2d9fd380Sjfb8856606 #define IGC_TX_DESCRIPTOR_MULTIPLE	8
46*2d9fd380Sjfb8856606 #define IGC_RX_DESCRIPTOR_MULTIPLE	8
47*2d9fd380Sjfb8856606 
48*2d9fd380Sjfb8856606 #define IGC_RXD_ALIGN	((uint16_t)(IGC_ALIGN / \
49*2d9fd380Sjfb8856606 		sizeof(union igc_adv_rx_desc)))
50*2d9fd380Sjfb8856606 #define IGC_TXD_ALIGN	((uint16_t)(IGC_ALIGN / \
51*2d9fd380Sjfb8856606 		sizeof(union igc_adv_tx_desc)))
52*2d9fd380Sjfb8856606 #define IGC_MIN_TXD	IGC_TX_DESCRIPTOR_MULTIPLE
53*2d9fd380Sjfb8856606 #define IGC_MAX_TXD	((uint16_t)(0x80000 / sizeof(union igc_adv_tx_desc)))
54*2d9fd380Sjfb8856606 #define IGC_MIN_RXD	IGC_RX_DESCRIPTOR_MULTIPLE
55*2d9fd380Sjfb8856606 #define IGC_MAX_RXD	((uint16_t)(0x80000 / sizeof(union igc_adv_rx_desc)))
56*2d9fd380Sjfb8856606 
57*2d9fd380Sjfb8856606 #define IGC_TX_MAX_SEG		UINT8_MAX
58*2d9fd380Sjfb8856606 #define IGC_TX_MAX_MTU_SEG	UINT8_MAX
59*2d9fd380Sjfb8856606 
60*2d9fd380Sjfb8856606 #define IGC_RX_OFFLOAD_ALL	(    \
61*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_VLAN_STRIP  | \
62*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_VLAN_FILTER | \
63*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_VLAN_EXTEND | \
64*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_IPV4_CKSUM  | \
65*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_UDP_CKSUM   | \
66*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_TCP_CKSUM   | \
67*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_SCTP_CKSUM  | \
68*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_JUMBO_FRAME | \
69*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_KEEP_CRC    | \
70*2d9fd380Sjfb8856606 	DEV_RX_OFFLOAD_SCATTER)
71*2d9fd380Sjfb8856606 
72*2d9fd380Sjfb8856606 #define IGC_TX_OFFLOAD_ALL	(    \
73*2d9fd380Sjfb8856606 	DEV_TX_OFFLOAD_VLAN_INSERT | \
74*2d9fd380Sjfb8856606 	DEV_TX_OFFLOAD_IPV4_CKSUM  | \
75*2d9fd380Sjfb8856606 	DEV_TX_OFFLOAD_UDP_CKSUM   | \
76*2d9fd380Sjfb8856606 	DEV_TX_OFFLOAD_TCP_CKSUM   | \
77*2d9fd380Sjfb8856606 	DEV_TX_OFFLOAD_SCTP_CKSUM  | \
78*2d9fd380Sjfb8856606 	DEV_TX_OFFLOAD_TCP_TSO     | \
79*2d9fd380Sjfb8856606 	DEV_TX_OFFLOAD_UDP_TSO	   | \
80*2d9fd380Sjfb8856606 	DEV_TX_OFFLOAD_MULTI_SEGS)
81*2d9fd380Sjfb8856606 
82*2d9fd380Sjfb8856606 #define IGC_RSS_OFFLOAD_ALL	(    \
83*2d9fd380Sjfb8856606 	ETH_RSS_IPV4               | \
84*2d9fd380Sjfb8856606 	ETH_RSS_NONFRAG_IPV4_TCP   | \
85*2d9fd380Sjfb8856606 	ETH_RSS_NONFRAG_IPV4_UDP   | \
86*2d9fd380Sjfb8856606 	ETH_RSS_IPV6               | \
87*2d9fd380Sjfb8856606 	ETH_RSS_NONFRAG_IPV6_TCP   | \
88*2d9fd380Sjfb8856606 	ETH_RSS_NONFRAG_IPV6_UDP   | \
89*2d9fd380Sjfb8856606 	ETH_RSS_IPV6_EX            | \
90*2d9fd380Sjfb8856606 	ETH_RSS_IPV6_TCP_EX        | \
91*2d9fd380Sjfb8856606 	ETH_RSS_IPV6_UDP_EX)
92*2d9fd380Sjfb8856606 
93*2d9fd380Sjfb8856606 #define IGC_MAX_ETQF_FILTERS		3	/* etqf(3) is used for 1588 */
94*2d9fd380Sjfb8856606 #define IGC_ETQF_FILTER_1588		3
95*2d9fd380Sjfb8856606 #define IGC_ETQF_QUEUE_SHIFT		16
96*2d9fd380Sjfb8856606 #define IGC_ETQF_QUEUE_MASK		(7u << IGC_ETQF_QUEUE_SHIFT)
97*2d9fd380Sjfb8856606 
98*2d9fd380Sjfb8856606 #define IGC_MAX_NTUPLE_FILTERS		8
99*2d9fd380Sjfb8856606 #define IGC_NTUPLE_MAX_PRI		7
100*2d9fd380Sjfb8856606 
101*2d9fd380Sjfb8856606 #define IGC_SYN_FILTER_ENABLE		0x01	/* syn filter enable field */
102*2d9fd380Sjfb8856606 #define IGC_SYN_FILTER_QUEUE_SHIFT	1	/* syn filter queue field */
103*2d9fd380Sjfb8856606 #define IGC_SYN_FILTER_QUEUE	0x0000000E	/* syn filter queue field */
104*2d9fd380Sjfb8856606 #define IGC_RFCTL_SYNQFP	0x00080000	/* SYNQFP in RFCTL register */
105*2d9fd380Sjfb8856606 
106*2d9fd380Sjfb8856606 /* structure for interrupt relative data */
107*2d9fd380Sjfb8856606 struct igc_interrupt {
108*2d9fd380Sjfb8856606 	uint32_t flags;
109*2d9fd380Sjfb8856606 	uint32_t mask;
110*2d9fd380Sjfb8856606 };
111*2d9fd380Sjfb8856606 
112*2d9fd380Sjfb8856606 /* Union of RSS redirect table register */
113*2d9fd380Sjfb8856606 union igc_rss_reta_reg {
114*2d9fd380Sjfb8856606 	uint32_t dword;
115*2d9fd380Sjfb8856606 	uint8_t  bytes[4];
116*2d9fd380Sjfb8856606 };
117*2d9fd380Sjfb8856606 
118*2d9fd380Sjfb8856606 /* Structure to per-queue statics */
119*2d9fd380Sjfb8856606 struct igc_hw_queue_stats {
120*2d9fd380Sjfb8856606 	u64	pqgprc[IGC_QUEUE_PAIRS_NUM];
121*2d9fd380Sjfb8856606 	/* per queue good packets received count */
122*2d9fd380Sjfb8856606 	u64	pqgptc[IGC_QUEUE_PAIRS_NUM];
123*2d9fd380Sjfb8856606 	/* per queue good packets transmitted count */
124*2d9fd380Sjfb8856606 	u64	pqgorc[IGC_QUEUE_PAIRS_NUM];
125*2d9fd380Sjfb8856606 	/* per queue good octets received count */
126*2d9fd380Sjfb8856606 	u64	pqgotc[IGC_QUEUE_PAIRS_NUM];
127*2d9fd380Sjfb8856606 	/* per queue good octets transmitted count */
128*2d9fd380Sjfb8856606 	u64	pqmprc[IGC_QUEUE_PAIRS_NUM];
129*2d9fd380Sjfb8856606 	/* per queue multicast packets received count */
130*2d9fd380Sjfb8856606 	u64	rqdpc[IGC_QUEUE_PAIRS_NUM];
131*2d9fd380Sjfb8856606 	/* per receive queue drop packet count */
132*2d9fd380Sjfb8856606 	u64	tqdpc[IGC_QUEUE_PAIRS_NUM];
133*2d9fd380Sjfb8856606 	/* per transmit queue drop packet count */
134*2d9fd380Sjfb8856606 };
135*2d9fd380Sjfb8856606 
136*2d9fd380Sjfb8856606 /* local vfta copy */
137*2d9fd380Sjfb8856606 struct igc_vfta {
138*2d9fd380Sjfb8856606 	uint32_t vfta[IGC_VFTA_SIZE];
139*2d9fd380Sjfb8856606 };
140*2d9fd380Sjfb8856606 
141*2d9fd380Sjfb8856606 /* ethertype filter structure */
142*2d9fd380Sjfb8856606 struct igc_ethertype_filter {
143*2d9fd380Sjfb8856606 	uint16_t ether_type;
144*2d9fd380Sjfb8856606 	uint16_t queue;
145*2d9fd380Sjfb8856606 };
146*2d9fd380Sjfb8856606 
147*2d9fd380Sjfb8856606 /* Structure of ntuple filter info. */
148*2d9fd380Sjfb8856606 struct igc_ntuple_info {
149*2d9fd380Sjfb8856606 	uint16_t dst_port;
150*2d9fd380Sjfb8856606 	uint8_t proto;		/* l4 protocol. */
151*2d9fd380Sjfb8856606 
152*2d9fd380Sjfb8856606 	/*
153*2d9fd380Sjfb8856606 	 * the packet matched above 2tuple and contain any set bit will hit
154*2d9fd380Sjfb8856606 	 * this filter.
155*2d9fd380Sjfb8856606 	 */
156*2d9fd380Sjfb8856606 	uint8_t tcp_flags;
157*2d9fd380Sjfb8856606 
158*2d9fd380Sjfb8856606 	/*
159*2d9fd380Sjfb8856606 	 * seven levels (001b-111b), 111b is highest, used when more than one
160*2d9fd380Sjfb8856606 	 * filter matches.
161*2d9fd380Sjfb8856606 	 */
162*2d9fd380Sjfb8856606 	uint8_t priority;
163*2d9fd380Sjfb8856606 	uint8_t dst_port_mask:1, /* if mask is 1b, do compare dst port. */
164*2d9fd380Sjfb8856606 		proto_mask:1;    /* if mask is 1b, do compare protocol. */
165*2d9fd380Sjfb8856606 };
166*2d9fd380Sjfb8856606 
167*2d9fd380Sjfb8856606 /* Structure of n-tuple filter */
168*2d9fd380Sjfb8856606 struct igc_ntuple_filter {
169*2d9fd380Sjfb8856606 	RTE_STD_C11
170*2d9fd380Sjfb8856606 	union {
171*2d9fd380Sjfb8856606 		uint64_t hash_val;
172*2d9fd380Sjfb8856606 		struct igc_ntuple_info tuple_info;
173*2d9fd380Sjfb8856606 	};
174*2d9fd380Sjfb8856606 
175*2d9fd380Sjfb8856606 	uint8_t queue;
176*2d9fd380Sjfb8856606 };
177*2d9fd380Sjfb8856606 
178*2d9fd380Sjfb8856606 /* Structure of TCP SYN filter */
179*2d9fd380Sjfb8856606 struct igc_syn_filter {
180*2d9fd380Sjfb8856606 	uint8_t queue;
181*2d9fd380Sjfb8856606 
182*2d9fd380Sjfb8856606 	uint8_t hig_pri:1,	/* 1 - higher priority than other filters, */
183*2d9fd380Sjfb8856606 				/* 0 - lower priority. */
184*2d9fd380Sjfb8856606 		enable:1;	/* 1-enable; 0-disable */
185*2d9fd380Sjfb8856606 };
186*2d9fd380Sjfb8856606 
187*2d9fd380Sjfb8856606 /* Structure to store RTE flow RSS configure. */
188*2d9fd380Sjfb8856606 struct igc_rss_filter {
189*2d9fd380Sjfb8856606 	struct rte_flow_action_rss conf; /* RSS parameters. */
190*2d9fd380Sjfb8856606 	uint8_t key[IGC_HKEY_MAX_INDEX * sizeof(uint32_t)]; /* Hash key. */
191*2d9fd380Sjfb8856606 	uint16_t queue[IGC_RSS_RDT_SIZD];/* Queues indices to use. */
192*2d9fd380Sjfb8856606 	uint8_t enable;	/* 1-enabled, 0-disabled */
193*2d9fd380Sjfb8856606 };
194*2d9fd380Sjfb8856606 
195*2d9fd380Sjfb8856606 /* Feature filter types */
196*2d9fd380Sjfb8856606 enum igc_filter_type {
197*2d9fd380Sjfb8856606 	IGC_FILTER_TYPE_ETHERTYPE,
198*2d9fd380Sjfb8856606 	IGC_FILTER_TYPE_NTUPLE,
199*2d9fd380Sjfb8856606 	IGC_FILTER_TYPE_SYN,
200*2d9fd380Sjfb8856606 	IGC_FILTER_TYPE_HASH
201*2d9fd380Sjfb8856606 };
202*2d9fd380Sjfb8856606 
203*2d9fd380Sjfb8856606 /* Structure to store flow */
204*2d9fd380Sjfb8856606 struct rte_flow {
205*2d9fd380Sjfb8856606 	TAILQ_ENTRY(rte_flow) node;
206*2d9fd380Sjfb8856606 	enum igc_filter_type filter_type;
207*2d9fd380Sjfb8856606 	RTE_STD_C11
208*2d9fd380Sjfb8856606 	char filter[0];		/* filter data */
209*2d9fd380Sjfb8856606 };
210*2d9fd380Sjfb8856606 
211*2d9fd380Sjfb8856606 /* Flow list header */
212*2d9fd380Sjfb8856606 TAILQ_HEAD(igc_flow_list, rte_flow);
213*2d9fd380Sjfb8856606 
214*2d9fd380Sjfb8856606 /*
215*2d9fd380Sjfb8856606  * Structure to store private data for each driver instance (for each port).
216*2d9fd380Sjfb8856606  */
217*2d9fd380Sjfb8856606 struct igc_adapter {
218*2d9fd380Sjfb8856606 	struct igc_hw		hw;
219*2d9fd380Sjfb8856606 	struct igc_hw_stats	stats;
220*2d9fd380Sjfb8856606 	struct igc_hw_queue_stats queue_stats;
221*2d9fd380Sjfb8856606 	int16_t txq_stats_map[IGC_QUEUE_PAIRS_NUM];
222*2d9fd380Sjfb8856606 	int16_t rxq_stats_map[IGC_QUEUE_PAIRS_NUM];
223*2d9fd380Sjfb8856606 
224*2d9fd380Sjfb8856606 	struct igc_interrupt	intr;
225*2d9fd380Sjfb8856606 	struct igc_vfta	shadow_vfta;
226*2d9fd380Sjfb8856606 	bool		stopped;
227*2d9fd380Sjfb8856606 
228*2d9fd380Sjfb8856606 	struct igc_ethertype_filter ethertype_filters[IGC_MAX_ETQF_FILTERS];
229*2d9fd380Sjfb8856606 	struct igc_ntuple_filter ntuple_filters[IGC_MAX_NTUPLE_FILTERS];
230*2d9fd380Sjfb8856606 	struct igc_syn_filter syn_filter;
231*2d9fd380Sjfb8856606 	struct igc_rss_filter rss_filter;
232*2d9fd380Sjfb8856606 	struct igc_flow_list flow_list;
233*2d9fd380Sjfb8856606 };
234*2d9fd380Sjfb8856606 
235*2d9fd380Sjfb8856606 #define IGC_DEV_PRIVATE(_dev)	((_dev)->data->dev_private)
236*2d9fd380Sjfb8856606 
237*2d9fd380Sjfb8856606 #define IGC_DEV_PRIVATE_HW(_dev) \
238*2d9fd380Sjfb8856606 	(&((struct igc_adapter *)(_dev)->data->dev_private)->hw)
239*2d9fd380Sjfb8856606 
240*2d9fd380Sjfb8856606 #define IGC_DEV_PRIVATE_STATS(_dev) \
241*2d9fd380Sjfb8856606 	(&((struct igc_adapter *)(_dev)->data->dev_private)->stats)
242*2d9fd380Sjfb8856606 
243*2d9fd380Sjfb8856606 #define IGC_DEV_PRIVATE_QUEUE_STATS(_dev) \
244*2d9fd380Sjfb8856606 	(&((struct igc_adapter *)(_dev)->data->dev_private)->queue_stats)
245*2d9fd380Sjfb8856606 
246*2d9fd380Sjfb8856606 #define IGC_DEV_PRIVATE_INTR(_dev) \
247*2d9fd380Sjfb8856606 	(&((struct igc_adapter *)(_dev)->data->dev_private)->intr)
248*2d9fd380Sjfb8856606 
249*2d9fd380Sjfb8856606 #define IGC_DEV_PRIVATE_VFTA(_dev) \
250*2d9fd380Sjfb8856606 	(&((struct igc_adapter *)(_dev)->data->dev_private)->shadow_vfta)
251*2d9fd380Sjfb8856606 
252*2d9fd380Sjfb8856606 #define IGC_DEV_PRIVATE_RSS_FILTER(_dev) \
253*2d9fd380Sjfb8856606 	(&((struct igc_adapter *)(_dev)->data->dev_private)->rss_filter)
254*2d9fd380Sjfb8856606 
255*2d9fd380Sjfb8856606 #define IGC_DEV_PRIVATE_FLOW_LIST(_dev) \
256*2d9fd380Sjfb8856606 	(&((struct igc_adapter *)(_dev)->data->dev_private)->flow_list)
257*2d9fd380Sjfb8856606 
258*2d9fd380Sjfb8856606 static inline void
igc_read_reg_check_set_bits(struct igc_hw * hw,uint32_t reg,uint32_t bits)259*2d9fd380Sjfb8856606 igc_read_reg_check_set_bits(struct igc_hw *hw, uint32_t reg, uint32_t bits)
260*2d9fd380Sjfb8856606 {
261*2d9fd380Sjfb8856606 	uint32_t reg_val = IGC_READ_REG(hw, reg);
262*2d9fd380Sjfb8856606 
263*2d9fd380Sjfb8856606 	bits |= reg_val;
264*2d9fd380Sjfb8856606 	if (bits == reg_val)
265*2d9fd380Sjfb8856606 		return;	/* no need to write back */
266*2d9fd380Sjfb8856606 
267*2d9fd380Sjfb8856606 	IGC_WRITE_REG(hw, reg, bits);
268*2d9fd380Sjfb8856606 }
269*2d9fd380Sjfb8856606 
270*2d9fd380Sjfb8856606 static inline void
igc_read_reg_check_clear_bits(struct igc_hw * hw,uint32_t reg,uint32_t bits)271*2d9fd380Sjfb8856606 igc_read_reg_check_clear_bits(struct igc_hw *hw, uint32_t reg, uint32_t bits)
272*2d9fd380Sjfb8856606 {
273*2d9fd380Sjfb8856606 	uint32_t reg_val = IGC_READ_REG(hw, reg);
274*2d9fd380Sjfb8856606 
275*2d9fd380Sjfb8856606 	bits = reg_val & ~bits;
276*2d9fd380Sjfb8856606 	if (bits == reg_val)
277*2d9fd380Sjfb8856606 		return;	/* no need to write back */
278*2d9fd380Sjfb8856606 
279*2d9fd380Sjfb8856606 	IGC_WRITE_REG(hw, reg, bits);
280*2d9fd380Sjfb8856606 }
281*2d9fd380Sjfb8856606 
282*2d9fd380Sjfb8856606 #ifdef __cplusplus
283*2d9fd380Sjfb8856606 }
284*2d9fd380Sjfb8856606 #endif
285*2d9fd380Sjfb8856606 
286*2d9fd380Sjfb8856606 #endif /* _IGC_ETHDEV_H_ */
287