net/igc: support RSS
[dpdk.git] / drivers / net / igc / igc_ethdev.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019-2020 Intel Corporation
3  */
4
5 #ifndef _IGC_ETHDEV_H_
6 #define _IGC_ETHDEV_H_
7
8 #include <rte_ethdev.h>
9
10 #include "base/igc_osdep.h"
11 #include "base/igc_hw.h"
12 #include "base/igc_i225.h"
13 #include "base/igc_api.h"
14
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18
19 #define IGC_RSS_RDT_SIZD                128
20 #define IGC_QUEUE_PAIRS_NUM             4
21
22 #define IGC_HKEY_MAX_INDEX              10
23 #define IGC_RSS_RDT_SIZD                128
24
25 #define IGC_DEFAULT_REG_SIZE            4
26 #define IGC_DEFAULT_REG_SIZE_MASK       0xf
27
28 #define IGC_RSS_RDT_REG_SIZE            IGC_DEFAULT_REG_SIZE
29 #define IGC_RSS_RDT_REG_SIZE_MASK       IGC_DEFAULT_REG_SIZE_MASK
30 #define IGC_HKEY_REG_SIZE               IGC_DEFAULT_REG_SIZE
31 #define IGC_HKEY_SIZE                   (IGC_HKEY_REG_SIZE * IGC_HKEY_MAX_INDEX)
32
33 /*
34  * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be
35  * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary.
36  * This will also optimize cache line size effect.
37  * H/W supports up to cache line size 128.
38  */
39 #define IGC_ALIGN                       128
40
41 #define IGC_TX_DESCRIPTOR_MULTIPLE      8
42 #define IGC_RX_DESCRIPTOR_MULTIPLE      8
43
44 #define IGC_RXD_ALIGN   ((uint16_t)(IGC_ALIGN / \
45                 sizeof(union igc_adv_rx_desc)))
46 #define IGC_TXD_ALIGN   ((uint16_t)(IGC_ALIGN / \
47                 sizeof(union igc_adv_tx_desc)))
48 #define IGC_MIN_TXD     IGC_TX_DESCRIPTOR_MULTIPLE
49 #define IGC_MAX_TXD     ((uint16_t)(0x80000 / sizeof(union igc_adv_tx_desc)))
50 #define IGC_MIN_RXD     IGC_RX_DESCRIPTOR_MULTIPLE
51 #define IGC_MAX_RXD     ((uint16_t)(0x80000 / sizeof(union igc_adv_rx_desc)))
52
53 #define IGC_TX_MAX_SEG          UINT8_MAX
54 #define IGC_TX_MAX_MTU_SEG      UINT8_MAX
55
56 #define IGC_RX_OFFLOAD_ALL      (    \
57         DEV_RX_OFFLOAD_IPV4_CKSUM  | \
58         DEV_RX_OFFLOAD_UDP_CKSUM   | \
59         DEV_RX_OFFLOAD_TCP_CKSUM   | \
60         DEV_RX_OFFLOAD_SCTP_CKSUM  | \
61         DEV_RX_OFFLOAD_JUMBO_FRAME | \
62         DEV_RX_OFFLOAD_KEEP_CRC    | \
63         DEV_RX_OFFLOAD_SCATTER)
64
65 #define IGC_TX_OFFLOAD_ALL      (    \
66         DEV_TX_OFFLOAD_VLAN_INSERT | \
67         DEV_TX_OFFLOAD_IPV4_CKSUM  | \
68         DEV_TX_OFFLOAD_UDP_CKSUM   | \
69         DEV_TX_OFFLOAD_TCP_CKSUM   | \
70         DEV_TX_OFFLOAD_SCTP_CKSUM  | \
71         DEV_TX_OFFLOAD_TCP_TSO     | \
72         DEV_TX_OFFLOAD_UDP_TSO     | \
73         DEV_TX_OFFLOAD_MULTI_SEGS)
74
75 #define IGC_RSS_OFFLOAD_ALL     (    \
76         ETH_RSS_IPV4               | \
77         ETH_RSS_NONFRAG_IPV4_TCP   | \
78         ETH_RSS_NONFRAG_IPV4_UDP   | \
79         ETH_RSS_IPV6               | \
80         ETH_RSS_NONFRAG_IPV6_TCP   | \
81         ETH_RSS_NONFRAG_IPV6_UDP   | \
82         ETH_RSS_IPV6_EX            | \
83         ETH_RSS_IPV6_TCP_EX        | \
84         ETH_RSS_IPV6_UDP_EX)
85
86 /* structure for interrupt relative data */
87 struct igc_interrupt {
88         uint32_t flags;
89         uint32_t mask;
90 };
91
92 /* Union of RSS redirect table register */
93 union igc_rss_reta_reg {
94         uint32_t dword;
95         uint8_t  bytes[4];
96 };
97
98 /* Structure to per-queue statics */
99 struct igc_hw_queue_stats {
100         u64     pqgprc[IGC_QUEUE_PAIRS_NUM];
101         /* per queue good packets received count */
102         u64     pqgptc[IGC_QUEUE_PAIRS_NUM];
103         /* per queue good packets transmitted count */
104         u64     pqgorc[IGC_QUEUE_PAIRS_NUM];
105         /* per queue good octets received count */
106         u64     pqgotc[IGC_QUEUE_PAIRS_NUM];
107         /* per queue good octets transmitted count */
108         u64     pqmprc[IGC_QUEUE_PAIRS_NUM];
109         /* per queue multicast packets received count */
110         u64     rqdpc[IGC_QUEUE_PAIRS_NUM];
111         /* per receive queue drop packet count */
112         u64     tqdpc[IGC_QUEUE_PAIRS_NUM];
113         /* per transmit queue drop packet count */
114 };
115
116 /*
117  * Structure to store private data for each driver instance (for each port).
118  */
119 struct igc_adapter {
120         struct igc_hw           hw;
121         struct igc_hw_stats     stats;
122         struct igc_hw_queue_stats queue_stats;
123         int16_t txq_stats_map[IGC_QUEUE_PAIRS_NUM];
124         int16_t rxq_stats_map[IGC_QUEUE_PAIRS_NUM];
125
126         struct igc_interrupt    intr;
127         bool            stopped;
128 };
129
130 #define IGC_DEV_PRIVATE(_dev)   ((_dev)->data->dev_private)
131
132 #define IGC_DEV_PRIVATE_HW(_dev) \
133         (&((struct igc_adapter *)(_dev)->data->dev_private)->hw)
134
135 #define IGC_DEV_PRIVATE_STATS(_dev) \
136         (&((struct igc_adapter *)(_dev)->data->dev_private)->stats)
137
138 #define IGC_DEV_PRIVATE_QUEUE_STATS(_dev) \
139         (&((struct igc_adapter *)(_dev)->data->dev_private)->queue_stats)
140
141 #define IGC_DEV_PRIVATE_INTR(_dev) \
142         (&((struct igc_adapter *)(_dev)->data->dev_private)->intr)
143
144 static inline void
145 igc_read_reg_check_set_bits(struct igc_hw *hw, uint32_t reg, uint32_t bits)
146 {
147         uint32_t reg_val = IGC_READ_REG(hw, reg);
148
149         bits |= reg_val;
150         if (bits == reg_val)
151                 return; /* no need to write back */
152
153         IGC_WRITE_REG(hw, reg, bits);
154 }
155
156 static inline void
157 igc_read_reg_check_clear_bits(struct igc_hw *hw, uint32_t reg, uint32_t bits)
158 {
159         uint32_t reg_val = IGC_READ_REG(hw, reg);
160
161         bits = reg_val & ~bits;
162         if (bits == reg_val)
163                 return; /* no need to write back */
164
165         IGC_WRITE_REG(hw, reg, bits);
166 }
167
168 #ifdef __cplusplus
169 }
170 #endif
171
172 #endif /* _IGC_ETHDEV_H_ */