net/i40e: remove dependence on Tx queue flags
[dpdk.git] / drivers / net / i40e / i40e_vf_representor.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 Intel Corporation.
3  */
4
5 #include <rte_bus_pci.h>
6 #include <rte_ethdev.h>
7 #include <rte_pci.h>
8 #include <rte_malloc.h>
9
10 #include "base/i40e_type.h"
11 #include "base/virtchnl.h"
12 #include "i40e_ethdev.h"
13 #include "i40e_rxtx.h"
14 #include "rte_pmd_i40e.h"
15
16 static int
17 i40e_vf_representor_link_update(struct rte_eth_dev *ethdev,
18         int wait_to_complete)
19 {
20         struct i40e_vf_representor *representor = ethdev->data->dev_private;
21
22         return i40e_dev_link_update(representor->adapter->eth_dev,
23                 wait_to_complete);
24 }
25 static void
26 i40e_vf_representor_dev_infos_get(struct rte_eth_dev *ethdev,
27         struct rte_eth_dev_info *dev_info)
28 {
29         struct i40e_vf_representor *representor = ethdev->data->dev_private;
30
31         /* get dev info for the vdev */
32         dev_info->device = ethdev->device;
33
34         dev_info->max_rx_queues = ethdev->data->nb_rx_queues;
35         dev_info->max_tx_queues = ethdev->data->nb_tx_queues;
36
37         dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
38         dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
39         dev_info->hash_key_size = (I40E_VFQF_HKEY_MAX_INDEX + 1) *
40                 sizeof(uint32_t);
41         dev_info->reta_size = ETH_RSS_RETA_SIZE_64;
42         dev_info->flow_type_rss_offloads = I40E_RSS_OFFLOAD_ALL;
43         dev_info->max_mac_addrs = I40E_NUM_MACADDR_MAX;
44         dev_info->rx_offload_capa =
45                 DEV_RX_OFFLOAD_VLAN_STRIP |
46                 DEV_RX_OFFLOAD_QINQ_STRIP |
47                 DEV_RX_OFFLOAD_IPV4_CKSUM |
48                 DEV_RX_OFFLOAD_UDP_CKSUM |
49                 DEV_RX_OFFLOAD_TCP_CKSUM;
50         dev_info->tx_offload_capa =
51                 DEV_TX_OFFLOAD_VLAN_INSERT |
52                 DEV_TX_OFFLOAD_QINQ_INSERT |
53                 DEV_TX_OFFLOAD_IPV4_CKSUM |
54                 DEV_TX_OFFLOAD_UDP_CKSUM |
55                 DEV_TX_OFFLOAD_TCP_CKSUM |
56                 DEV_TX_OFFLOAD_SCTP_CKSUM |
57                 DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM |
58                 DEV_TX_OFFLOAD_TCP_TSO |
59                 DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
60                 DEV_TX_OFFLOAD_GRE_TNL_TSO |
61                 DEV_TX_OFFLOAD_IPIP_TNL_TSO |
62                 DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
63
64         dev_info->default_rxconf = (struct rte_eth_rxconf) {
65                 .rx_thresh = {
66                         .pthresh = I40E_DEFAULT_RX_PTHRESH,
67                         .hthresh = I40E_DEFAULT_RX_HTHRESH,
68                         .wthresh = I40E_DEFAULT_RX_WTHRESH,
69                 },
70                 .rx_free_thresh = I40E_DEFAULT_RX_FREE_THRESH,
71                 .rx_drop_en = 0,
72                 .offloads = 0,
73         };
74
75         dev_info->default_txconf = (struct rte_eth_txconf) {
76                 .tx_thresh = {
77                         .pthresh = I40E_DEFAULT_TX_PTHRESH,
78                         .hthresh = I40E_DEFAULT_TX_HTHRESH,
79                         .wthresh = I40E_DEFAULT_TX_WTHRESH,
80                 },
81                 .tx_free_thresh = I40E_DEFAULT_TX_FREE_THRESH,
82                 .tx_rs_thresh = I40E_DEFAULT_TX_RSBIT_THRESH,
83                 .offloads = 0,
84         };
85
86         dev_info->rx_desc_lim = (struct rte_eth_desc_lim) {
87                 .nb_max = I40E_MAX_RING_DESC,
88                 .nb_min = I40E_MIN_RING_DESC,
89                 .nb_align = I40E_ALIGN_RING_DESC,
90         };
91
92         dev_info->tx_desc_lim = (struct rte_eth_desc_lim) {
93                 .nb_max = I40E_MAX_RING_DESC,
94                 .nb_min = I40E_MIN_RING_DESC,
95                 .nb_align = I40E_ALIGN_RING_DESC,
96         };
97
98         dev_info->switch_info.name =
99                 representor->adapter->eth_dev->device->name;
100         dev_info->switch_info.domain_id = representor->switch_domain_id;
101         dev_info->switch_info.port_id = representor->vf_id;
102 }
103
104 static int
105 i40e_vf_representor_dev_configure(__rte_unused struct rte_eth_dev *dev)
106 {
107         return 0;
108 }
109
110 static int
111 i40e_vf_representor_dev_start(__rte_unused struct rte_eth_dev *dev)
112 {
113         return 0;
114 }
115
116 static void
117 i40e_vf_representor_dev_stop(__rte_unused struct rte_eth_dev *dev)
118 {
119 }
120
121 static int
122 i40e_vf_representor_rx_queue_setup(__rte_unused struct rte_eth_dev *dev,
123         __rte_unused uint16_t rx_queue_id,
124         __rte_unused uint16_t nb_rx_desc,
125         __rte_unused unsigned int socket_id,
126         __rte_unused const struct rte_eth_rxconf *rx_conf,
127         __rte_unused struct rte_mempool *mb_pool)
128 {
129         return 0;
130 }
131
132 static int
133 i40e_vf_representor_tx_queue_setup(__rte_unused struct rte_eth_dev *dev,
134         __rte_unused uint16_t rx_queue_id,
135         __rte_unused uint16_t nb_rx_desc,
136         __rte_unused unsigned int socket_id,
137         __rte_unused const struct rte_eth_txconf *tx_conf)
138 {
139         return 0;
140 }
141
142 static int
143 i40e_vf_representor_stats_get(struct rte_eth_dev *ethdev,
144                 struct rte_eth_stats *stats)
145 {
146         struct i40e_vf_representor *representor = ethdev->data->dev_private;
147
148         return rte_pmd_i40e_get_vf_stats(
149                 representor->adapter->eth_dev->data->port_id,
150                 representor->vf_id, stats);
151 }
152
153 static void
154 i40e_vf_representor_stats_reset(struct rte_eth_dev *ethdev)
155 {
156         struct i40e_vf_representor *representor = ethdev->data->dev_private;
157
158         rte_pmd_i40e_reset_vf_stats(
159                 representor->adapter->eth_dev->data->port_id,
160                 representor->vf_id);
161 }
162
163 static void
164 i40e_vf_representor_promiscuous_enable(struct rte_eth_dev *ethdev)
165 {
166         struct i40e_vf_representor *representor = ethdev->data->dev_private;
167
168         rte_pmd_i40e_set_vf_unicast_promisc(
169                 representor->adapter->eth_dev->data->port_id,
170                 representor->vf_id, 1);
171 }
172
173 static void
174 i40e_vf_representor_promiscuous_disable(struct rte_eth_dev *ethdev)
175 {
176         struct i40e_vf_representor *representor = ethdev->data->dev_private;
177
178         rte_pmd_i40e_set_vf_unicast_promisc(
179                 representor->adapter->eth_dev->data->port_id,
180                 representor->vf_id, 0);
181 }
182
183 static void
184 i40e_vf_representor_allmulticast_enable(struct rte_eth_dev *ethdev)
185 {
186         struct i40e_vf_representor *representor = ethdev->data->dev_private;
187
188         rte_pmd_i40e_set_vf_multicast_promisc(
189                 representor->adapter->eth_dev->data->port_id,
190                 representor->vf_id,  1);
191 }
192
193 static void
194 i40e_vf_representor_allmulticast_disable(struct rte_eth_dev *ethdev)
195 {
196         struct i40e_vf_representor *representor = ethdev->data->dev_private;
197
198         rte_pmd_i40e_set_vf_multicast_promisc(
199                 representor->adapter->eth_dev->data->port_id,
200                 representor->vf_id,  0);
201 }
202
203 static void
204 i40e_vf_representor_mac_addr_remove(struct rte_eth_dev *ethdev, uint32_t index)
205 {
206         struct i40e_vf_representor *representor = ethdev->data->dev_private;
207
208         rte_pmd_i40e_remove_vf_mac_addr(
209                 representor->adapter->eth_dev->data->port_id,
210                 representor->vf_id, &ethdev->data->mac_addrs[index]);
211 }
212
213 static int
214 i40e_vf_representor_mac_addr_set(struct rte_eth_dev *ethdev,
215                 struct ether_addr *mac_addr)
216 {
217         struct i40e_vf_representor *representor = ethdev->data->dev_private;
218
219         return rte_pmd_i40e_set_vf_mac_addr(
220                 representor->adapter->eth_dev->data->port_id,
221                 representor->vf_id, mac_addr);
222 }
223
224 static int
225 i40e_vf_representor_vlan_filter_set(struct rte_eth_dev *ethdev,
226                 uint16_t vlan_id, int on)
227 {
228         struct i40e_vf_representor *representor = ethdev->data->dev_private;
229         uint64_t vf_mask = 1ULL << representor->vf_id;
230
231         return rte_pmd_i40e_set_vf_vlan_filter(
232                 representor->adapter->eth_dev->data->port_id,
233                 vlan_id, vf_mask, on);
234 }
235
236 static int
237 i40e_vf_representor_vlan_offload_set(struct rte_eth_dev *ethdev, int mask)
238 {
239         struct i40e_vf_representor *representor = ethdev->data->dev_private;
240         struct rte_eth_dev *pdev;
241         struct i40e_pf_vf *vf;
242         struct i40e_vsi *vsi;
243         struct i40e_pf *pf;
244         uint32_t vfid;
245
246         pdev = representor->adapter->eth_dev;
247         vfid = representor->vf_id;
248
249         if (!is_i40e_supported(pdev)) {
250                 PMD_DRV_LOG(ERR, "Invalid PF dev.");
251                 return -EINVAL;
252         }
253
254         pf = I40E_DEV_PRIVATE_TO_PF(pdev->data->dev_private);
255
256         if (vfid >= pf->vf_num || !pf->vfs) {
257                 PMD_DRV_LOG(ERR, "Invalid VF ID.");
258                 return -EINVAL;
259         }
260
261         vf = &pf->vfs[vfid];
262         vsi = vf->vsi;
263         if (!vsi) {
264                 PMD_DRV_LOG(ERR, "Invalid VSI.");
265                 return -EINVAL;
266         }
267
268         if (mask & ETH_VLAN_FILTER_MASK) {
269                 /* Enable or disable VLAN filtering offload */
270                 if (ethdev->data->dev_conf.rxmode.hw_vlan_filter)
271                         return i40e_vsi_config_vlan_filter(vsi, TRUE);
272                 else
273                         return i40e_vsi_config_vlan_filter(vsi, FALSE);
274         }
275
276         if (mask & ETH_VLAN_STRIP_MASK) {
277                 /* Enable or disable VLAN stripping offload */
278                 if (ethdev->data->dev_conf.rxmode.hw_vlan_strip)
279                         return i40e_vsi_config_vlan_stripping(vsi, TRUE);
280                 else
281                         return i40e_vsi_config_vlan_stripping(vsi, FALSE);
282         }
283
284         return -EINVAL;
285 }
286
287 static void
288 i40e_vf_representor_vlan_strip_queue_set(struct rte_eth_dev *ethdev,
289         __rte_unused uint16_t rx_queue_id, int on)
290 {
291         struct i40e_vf_representor *representor = ethdev->data->dev_private;
292
293         rte_pmd_i40e_set_vf_vlan_stripq(
294                 representor->adapter->eth_dev->data->port_id,
295                 representor->vf_id, on);
296 }
297
298 static int
299 i40e_vf_representor_vlan_pvid_set(struct rte_eth_dev *ethdev, uint16_t vlan_id,
300         __rte_unused int on)
301 {
302         struct i40e_vf_representor *representor = ethdev->data->dev_private;
303
304         return rte_pmd_i40e_set_vf_vlan_insert(
305                 representor->adapter->eth_dev->data->port_id,
306                 representor->vf_id, vlan_id);
307 }
308
309 struct eth_dev_ops i40e_representor_dev_ops = {
310         .dev_infos_get        = i40e_vf_representor_dev_infos_get,
311
312         .dev_start            = i40e_vf_representor_dev_start,
313         .dev_configure        = i40e_vf_representor_dev_configure,
314         .dev_stop             = i40e_vf_representor_dev_stop,
315
316         .rx_queue_setup       = i40e_vf_representor_rx_queue_setup,
317         .tx_queue_setup       = i40e_vf_representor_tx_queue_setup,
318
319         .link_update          = i40e_vf_representor_link_update,
320
321         .stats_get            = i40e_vf_representor_stats_get,
322         .stats_reset          = i40e_vf_representor_stats_reset,
323
324         .promiscuous_enable   = i40e_vf_representor_promiscuous_enable,
325         .promiscuous_disable  = i40e_vf_representor_promiscuous_disable,
326
327         .allmulticast_enable  = i40e_vf_representor_allmulticast_enable,
328         .allmulticast_disable = i40e_vf_representor_allmulticast_disable,
329
330         .mac_addr_remove      = i40e_vf_representor_mac_addr_remove,
331         .mac_addr_set         = i40e_vf_representor_mac_addr_set,
332
333         .vlan_filter_set      = i40e_vf_representor_vlan_filter_set,
334         .vlan_offload_set     = i40e_vf_representor_vlan_offload_set,
335         .vlan_strip_queue_set = i40e_vf_representor_vlan_strip_queue_set,
336         .vlan_pvid_set        = i40e_vf_representor_vlan_pvid_set
337
338 };
339
340 int
341 i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params)
342 {
343         struct i40e_vf_representor *representor = ethdev->data->dev_private;
344
345         struct i40e_pf *pf;
346         struct i40e_pf_vf *vf;
347         struct rte_eth_link *link;
348
349         representor->vf_id =
350                 ((struct i40e_vf_representor *)init_params)->vf_id;
351         representor->switch_domain_id =
352                 ((struct i40e_vf_representor *)init_params)->switch_domain_id;
353         representor->adapter =
354                 ((struct i40e_vf_representor *)init_params)->adapter;
355
356         pf = I40E_DEV_PRIVATE_TO_PF(
357                 representor->adapter->eth_dev->data->dev_private);
358
359         if (representor->vf_id >= pf->vf_num)
360                 return -ENODEV;
361
362         /** representor shares the same driver as it's PF device */
363         ethdev->device->driver = representor->adapter->eth_dev->device->driver;
364
365         /* Set representor device ops */
366         ethdev->dev_ops = &i40e_representor_dev_ops;
367
368         /* No data-path so no RX/TX functions */
369         ethdev->rx_pkt_burst = NULL;
370         ethdev->tx_pkt_burst = NULL;
371
372         vf = &pf->vfs[representor->vf_id];
373
374         if (!vf->vsi) {
375                 PMD_DRV_LOG(ERR, "Invalid VSI.");
376                 return -ENODEV;
377         }
378
379         ethdev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
380
381         /* Setting the number queues allocated to the VF */
382         ethdev->data->nb_rx_queues = vf->vsi->nb_qps;
383         ethdev->data->nb_tx_queues = vf->vsi->nb_qps;
384
385         ethdev->data->mac_addrs = &vf->mac_addr;
386
387         /* Link state. Inherited from PF */
388         link = &representor->adapter->eth_dev->data->dev_link;
389
390         ethdev->data->dev_link.link_speed = link->link_speed;
391         ethdev->data->dev_link.link_duplex = link->link_duplex;
392         ethdev->data->dev_link.link_status = link->link_status;
393         ethdev->data->dev_link.link_autoneg = link->link_autoneg;
394
395         return 0;
396 }
397
398 int
399 i40e_vf_representor_uninit(struct rte_eth_dev *ethdev __rte_unused)
400 {
401         return 0;
402 }