net/iavf: deprecate i40evf PMD
The i40evf PMD will be deprecated, iavf will be the only VF driver for Intel 700 serial (i40e) NIC family. To reach this, there will be 2 steps: Step 1: iavf will be the default VF driver, while i40evf still can be selected by devarg: "driver=i40evf". This is covered by this patch, which include: 1) add all 700 serial NIC VF device ID into iavf PMD 2) skip probe if devargs contain "driver=i40evf" in iavf 3) continue probe if devargs contain "driver=i40evf" in i40evf Step 2: i40evf and related devarg are removed, this will happen at DPDK 21.11 Between step 1 and step 2, no new feature will be added into i40evf except bug fix. Signed-off-by: Robin Zhang <robinx.zhang@intel.com> Acked-by: Qi Zhang <qi.z.zhang@intel.com> Acked-by: Ferruh Yigit <ferruh.yigit@intel.com> Acked-by: Beilei Xing <beilei.xing@intel.com>
This commit is contained in:
parent
cafd87f62a
commit
e9c5672ac1
@ -88,6 +88,12 @@ For more detail on SR-IOV, please refer to the following documents:
|
||||
assignment in hypervisor. Take qemu for example, the device assignment should carry the IAVF device id (0x1889) like
|
||||
``-device vfio-pci,x-pci-device-id=0x1889,host=03:0a.0``.
|
||||
|
||||
Starting from DPDK 21.05, the default VF driver for Intel® 700 Series Ethernet Controller will be IAVF. No new feature
|
||||
will be added into i40evf except bug fix until it's removed in DPDK 21.11. Between DPDK 21.05 and 21.11, by using the
|
||||
``devargs`` option ``driver=i40evf``, i40evf PMD still can be used on Intel® 700 Series Ethernet Controller, for example::
|
||||
|
||||
-a 81:02.0,driver=i40evf
|
||||
|
||||
When IAVF is backed by an Intel® E810 device, the "Protocol Extraction" feature which is supported by ice PMD is also
|
||||
available for IAVF PMD. The same devargs with the same parameters can be applied to IAVF PMD, for detail please reference
|
||||
the section ``Protocol extraction for per queue`` of ice.rst.
|
||||
|
@ -118,6 +118,14 @@ Deprecation Notices
|
||||
consistent with existing outer header checksum status flag naming, which
|
||||
should help in reducing confusion about its usage.
|
||||
|
||||
* i40e: As there are both i40evf and iavf pmd, the functions of them are
|
||||
duplicated. And now more and more advanced features are developed on iavf.
|
||||
To keep consistent with kernel driver's name
|
||||
(https://patchwork.ozlabs.org/patch/970154/), i40evf is no need to maintain.
|
||||
Starting from 21.05, the default VF driver of i40e will be iavf, but i40evf
|
||||
can still be used if users specify the devarg "driver=i40evf". I40evf will
|
||||
be deleted in DPDK 21.11.
|
||||
|
||||
* eventdev: The structure ``rte_event_eth_rx_adapter_queue_conf`` will be
|
||||
extended to include ``rte_event_eth_rx_adapter_event_vector_config`` elements
|
||||
and the function ``rte_event_eth_rx_adapter_queue_event_vector_config`` will
|
||||
|
@ -13,5 +13,6 @@
|
||||
#define IAVF_DEV_ID_VF_HV 0x1571
|
||||
#define IAVF_DEV_ID_ADAPTIVE_VF 0x1889
|
||||
#define IAVF_DEV_ID_X722_VF 0x37CD
|
||||
#define IAVF_DEV_ID_X722_A0_VF 0x374D
|
||||
|
||||
#endif /* _IAVF_DEVIDS_H_ */
|
||||
|
@ -1645,9 +1645,53 @@ i40evf_dev_uninit(struct rte_eth_dev *eth_dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
i40evf_check_driver_handler(__rte_unused const char *key,
|
||||
const char *value, __rte_unused void *opaque)
|
||||
{
|
||||
if (strcmp(value, "i40evf"))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
i40evf_driver_selected(struct rte_devargs *devargs)
|
||||
{
|
||||
struct rte_kvargs *kvlist;
|
||||
const char *key = "driver";
|
||||
int ret = 0;
|
||||
|
||||
if (devargs == NULL)
|
||||
return 0;
|
||||
|
||||
kvlist = rte_kvargs_parse(devargs->args, NULL);
|
||||
if (kvlist == NULL)
|
||||
return 0;
|
||||
|
||||
if (!rte_kvargs_count(kvlist, key))
|
||||
goto exit;
|
||||
|
||||
/* i40evf driver selected when there's a key-value pair:
|
||||
* driver=i40evf
|
||||
*/
|
||||
if (rte_kvargs_process(kvlist, key,
|
||||
i40evf_check_driver_handler, NULL) < 0)
|
||||
goto exit;
|
||||
|
||||
ret = 1;
|
||||
|
||||
exit:
|
||||
rte_kvargs_free(kvlist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int eth_i40evf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
|
||||
struct rte_pci_device *pci_dev)
|
||||
{
|
||||
if (!i40evf_driver_selected(pci_dev->device.devargs))
|
||||
return 1;
|
||||
|
||||
return rte_eth_dev_pci_generic_probe(pci_dev,
|
||||
sizeof(struct i40e_adapter), i40evf_dev_init);
|
||||
}
|
||||
@ -1670,6 +1714,7 @@ static struct rte_pci_driver rte_i40evf_pmd = {
|
||||
RTE_PMD_REGISTER_PCI(net_i40e_vf, rte_i40evf_pmd);
|
||||
RTE_PMD_REGISTER_PCI_TABLE(net_i40e_vf, pci_id_i40evf_map);
|
||||
RTE_PMD_REGISTER_KMOD_DEP(net_i40e_vf, "* igb_uio | vfio-pci");
|
||||
RTE_PMD_REGISTER_PARAM_STRING(net_i40e_vf, "driver=i40evf");
|
||||
|
||||
static int
|
||||
i40evf_dev_configure(struct rte_eth_dev *dev)
|
||||
|
@ -125,6 +125,10 @@ static int iavf_set_mc_addr_list(struct rte_eth_dev *dev,
|
||||
|
||||
static const struct rte_pci_id pci_id_iavf_map[] = {
|
||||
{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_ADAPTIVE_VF) },
|
||||
{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_VF) },
|
||||
{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_VF_HV) },
|
||||
{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_X722_VF) },
|
||||
{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_X722_A0_VF) },
|
||||
{ .vendor_id = 0, /* sentinel */ },
|
||||
};
|
||||
|
||||
@ -2321,10 +2325,59 @@ iavf_dcf_cap_selected(struct rte_devargs *devargs)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
iavf_drv_i40evf_check_handler(__rte_unused const char *key,
|
||||
const char *value, __rte_unused void *opaque)
|
||||
{
|
||||
if (strcmp(value, "i40evf"))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
iavf_drv_i40evf_selected(struct rte_devargs *devargs, uint16_t device_id)
|
||||
{
|
||||
struct rte_kvargs *kvlist;
|
||||
const char *key = "driver";
|
||||
int ret = 0;
|
||||
|
||||
if (device_id != IAVF_DEV_ID_VF &&
|
||||
device_id != IAVF_DEV_ID_VF_HV &&
|
||||
device_id != IAVF_DEV_ID_X722_VF &&
|
||||
device_id != IAVF_DEV_ID_X722_A0_VF)
|
||||
return 0;
|
||||
|
||||
if (devargs == NULL)
|
||||
return 0;
|
||||
|
||||
kvlist = rte_kvargs_parse(devargs->args, NULL);
|
||||
if (kvlist == NULL)
|
||||
return 0;
|
||||
|
||||
if (!rte_kvargs_count(kvlist, key))
|
||||
goto exit;
|
||||
|
||||
/* i40evf driver selected when there's a key-value pair:
|
||||
* driver=i40evf
|
||||
*/
|
||||
if (rte_kvargs_process(kvlist, key,
|
||||
iavf_drv_i40evf_check_handler, NULL) < 0)
|
||||
goto exit;
|
||||
|
||||
ret = 1;
|
||||
|
||||
exit:
|
||||
rte_kvargs_free(kvlist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int eth_iavf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
|
||||
struct rte_pci_device *pci_dev)
|
||||
{
|
||||
if (iavf_dcf_cap_selected(pci_dev->device.devargs))
|
||||
if (iavf_dcf_cap_selected(pci_dev->device.devargs) ||
|
||||
iavf_drv_i40evf_selected(pci_dev->device.devargs,
|
||||
pci_dev->id.device_id))
|
||||
return 1;
|
||||
|
||||
return rte_eth_dev_pci_generic_probe(pci_dev,
|
||||
@ -2347,7 +2400,7 @@ static struct rte_pci_driver rte_iavf_pmd = {
|
||||
RTE_PMD_REGISTER_PCI(net_iavf, rte_iavf_pmd);
|
||||
RTE_PMD_REGISTER_PCI_TABLE(net_iavf, pci_id_iavf_map);
|
||||
RTE_PMD_REGISTER_KMOD_DEP(net_iavf, "* igb_uio | vfio-pci");
|
||||
RTE_PMD_REGISTER_PARAM_STRING(net_iavf, "cap=dcf");
|
||||
RTE_PMD_REGISTER_PARAM_STRING(net_iavf, "cap=dcf driver=i40evf");
|
||||
RTE_LOG_REGISTER(iavf_logtype_init, pmd.net.iavf.init, NOTICE);
|
||||
RTE_LOG_REGISTER(iavf_logtype_driver, pmd.net.iavf.driver, NOTICE);
|
||||
#ifdef RTE_ETHDEV_DEBUG_RX
|
||||
|
Loading…
Reference in New Issue
Block a user