dpdk: enable interrupt support for vmxnet3
[vpp.git] / src / plugins / dpdk / device / driver.c
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright(c) 2021 Cisco Systems, Inc.
3  */
4
5 #include <vlib/vlib.h>
6
7 #include <dpdk/device/dpdk.h>
8
9 static const u32 supported_flow_actions_intel =
10   (VNET_FLOW_ACTION_MARK | VNET_FLOW_ACTION_REDIRECT_TO_NODE |
11    VNET_FLOW_ACTION_REDIRECT_TO_QUEUE | VNET_FLOW_ACTION_BUFFER_ADVANCE |
12    VNET_FLOW_ACTION_COUNT | VNET_FLOW_ACTION_DROP | VNET_FLOW_ACTION_RSS);
13
14 #define DPDK_DRIVERS(...)                                                     \
15   (dpdk_driver_name_t[])                                                      \
16   {                                                                           \
17     __VA_ARGS__, {}                                                           \
18   }
19
20 static dpdk_driver_t dpdk_drivers[] = {
21   {
22     .drivers = DPDK_DRIVERS ({ "net_ice", "Intel E810 Family" },
23                              { "net_igc", "Intel I225 2.5G Family" },
24                              { "net_e1000_igb", "Intel e1000" },
25                              { "net_e1000_em", "Intel 82540EM (e1000)" }),
26     .enable_rxq_int = 1,
27     .supported_flow_actions = supported_flow_actions_intel,
28     .use_intel_phdr_cksum = 1,
29   },
30   {
31     .drivers = DPDK_DRIVERS ({ "net_ixgbe", "Intel 82599" }),
32     .enable_rxq_int = 1,
33     .supported_flow_actions = supported_flow_actions_intel,
34     .use_intel_phdr_cksum = 1,
35   },
36   {
37     .drivers = DPDK_DRIVERS ({ "net_i40e", "Intel X710/XL710 Family" }),
38     .enable_rxq_int = 1,
39     .supported_flow_actions = supported_flow_actions_intel,
40     .use_intel_phdr_cksum = 1,
41     .int_unmaskable = 1,
42   },
43   {
44     .drivers = DPDK_DRIVERS ({ "net_liovf", "Cavium Lio VF" },
45                              { "net_thunderx", "Cavium ThunderX" }),
46     .interface_name_prefix = "VirtualFunctionEthernet",
47   },
48   {
49     .drivers = DPDK_DRIVERS ({ "net_iavf", "Intel iAVF" },
50                              { "net_i40e_vf", "Intel X710/XL710 Family VF" }),
51     .interface_name_prefix = "VirtualFunctionEthernet",
52     .supported_flow_actions = supported_flow_actions_intel,
53     .use_intel_phdr_cksum = 1,
54     .int_unmaskable = 1,
55   },
56   {
57     .drivers = DPDK_DRIVERS ({ "net_e1000_igb_vf", "Intel e1000 VF" }),
58     .interface_name_prefix = "VirtualFunctionEthernet",
59     .use_intel_phdr_cksum = 1,
60   },
61   {
62     .drivers = DPDK_DRIVERS ({ "net_ixgbe_vf", "Intel 82599 VF" }),
63     .interface_name_prefix = "VirtualFunctionEthernet",
64     .use_intel_phdr_cksum = 1,
65     .program_vlans = 1,
66   },
67   {
68     .drivers = DPDK_DRIVERS ({ "net_dpaa2", "NXP DPAA2 Mac" }),
69     .interface_name_prefix = "TenGigabitEthernet",
70   },
71   {
72     .drivers =
73       DPDK_DRIVERS ({ "net_fm10k", "Intel FM10000 Family Ethernet Switch" }),
74     .interface_name_prefix = "EthernetSwitch",
75   },
76   {
77     .drivers = DPDK_DRIVERS ({ "net_cxgbe", "Chelsio T4/T5" }),
78     .interface_number_from_port_id = 1,
79   },
80   {
81     .drivers = DPDK_DRIVERS ({ "net_mlx4", "Mellanox ConnectX-3 Family" },
82                              { "net_qede", "Cavium QLogic FastLinQ QL4xxxx" },
83                              { "net_bnxt", "Broadcom NetXtreme E/S-Series" }),
84   },
85   {
86     .drivers = DPDK_DRIVERS ({ "net_virtio_user", "Virtio User" }),
87     .interface_name_prefix = "VirtioUser",
88   },
89   {
90     .drivers = DPDK_DRIVERS ({ "net_vhost", "VhostEthernet" }),
91     .interface_name_prefix = "VhostEthernet",
92   },
93   {
94     .drivers = DPDK_DRIVERS ({ "mlx5_pci", "Mellanox ConnectX-4 Family" },
95                              { "net_enic", "Cisco VIC" }),
96     .use_intel_phdr_cksum = 1,
97   },
98   {
99     .drivers = DPDK_DRIVERS ({ "net_failsafe", "FailsafeEthernet" }),
100     .interface_name_prefix = "FailsafeEthernet",
101     .enable_lsc_int = 1,
102   },
103   {
104     .drivers = DPDK_DRIVERS ({ "AF_PACKET PMD", "af_packet" }),
105     .interface_name_prefix = "af_packet",
106   },
107   {
108     .drivers = DPDK_DRIVERS ({ "net_netvsc", "Microsoft Hyper-V Netvsc" }),
109     .interface_name_prefix = "NetVSC",
110   },
111   {
112     .drivers = DPDK_DRIVERS ({ "net_ena", "AWS ENA VF" }),
113     .interface_name_prefix = "VirtualFunctionEthernet",
114     .enable_rxq_int = 1,
115   },
116   {
117     .drivers = DPDK_DRIVERS ({ "net_vmxnet3", "VMware VMXNET3" }),
118     .interface_name_prefix = "GigabitEthernet",
119     .enable_rxq_int = 1,
120   },
121   {
122     .drivers = DPDK_DRIVERS ({ "net_virtio", "Red Hat Virtio" }),
123     .interface_name_prefix = "GigabitEthernet",
124     .n_rx_desc = 256,
125     .n_tx_desc = 256,
126     .mq_mode_none = 1,
127     .enable_rxq_int = 1,
128   }
129 };
130
131 dpdk_driver_t *
132 dpdk_driver_find (const char *name, const char **desc)
133 {
134   for (int i = 0; i < ARRAY_LEN (dpdk_drivers); i++)
135     {
136       dpdk_driver_t *dr = dpdk_drivers + i;
137       dpdk_driver_name_t *dn = dr->drivers;
138
139       while (dn->name)
140         {
141           if (name && !strcmp (name, dn->name))
142             {
143               *desc = dn->desc;
144               return dr;
145             }
146           dn++;
147         }
148     }
149   return 0;
150 }