[v2,1/7] net/iavf: stop the PCI probe in DCF mode

Message ID 20200310065029.40966-2-haiyue.wang@intel.com (mailing list archive)
State Superseded, archived
Delegated to: xiaolong ye
Headers
Series add Intel DCF PMD support |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Performance-Testing fail build patch failure
ci/Intel-compilation fail Compilation issues

Commit Message

Wang, Haiyue March 10, 2020, 6:50 a.m. UTC
  A new DCF PMD will be introduced, which runs on Intel VF hardware, and
it is a pure software design to control the advance functionality (such
as switch, ACL) for rest of the VFs.

So if the DCF (Device Config Function) mode is specified by the devarg
'cap=dcf', then it will stop the PCI probe in the iavf PMD.

Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
---
 drivers/net/iavf/iavf_ethdev.c | 43 ++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)
  

Comments

Xiaolong Ye March 13, 2020, 5:27 a.m. UTC | #1
On 03/10, Haiyue Wang wrote:
>A new DCF PMD will be introduced, which runs on Intel VF hardware, and
>it is a pure software design to control the advance functionality (such
>as switch, ACL) for rest of the VFs.
>
>So if the DCF (Device Config Function) mode is specified by the devarg
>'cap=dcf', then it will stop the PCI probe in the iavf PMD.
>
>Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
>---
> drivers/net/iavf/iavf_ethdev.c | 43 ++++++++++++++++++++++++++++++++++
> 1 file changed, 43 insertions(+)
>
>diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
>index 34913f9c4..c0b95e169 100644
>--- a/drivers/net/iavf/iavf_ethdev.c
>+++ b/drivers/net/iavf/iavf_ethdev.c
>@@ -1416,9 +1416,51 @@ iavf_dev_uninit(struct rte_eth_dev *dev)
> 	return 0;
> }
> 
>+static int
>+iavf_dcf_cap_check_handler(__rte_unused const char *key,
>+			   const char *value, __rte_unused void *opaque)
>+{
>+	if (strcmp(value, "dcf"))
>+		return -1;
>+
>+	return 0;
>+}
>+
>+static int
>+iavf_dcf_cap_selected(struct rte_devargs *devargs)
>+{
>+	struct rte_kvargs *kvlist;
>+	const char *key = "cap";
>+	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;
>+
>+	/* dcf capability selected when there's a key-value pair: cap=dcf */
>+	if (rte_kvargs_process(kvlist, key,
>+			       iavf_dcf_cap_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))
>+		return 1;
>+
> 	return rte_eth_dev_pci_generic_probe(pci_dev,
> 		sizeof(struct iavf_adapter), iavf_dev_init);
> }
>@@ -1439,6 +1481,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_INIT(iavf_init_log)
> {
> 	iavf_logtype_init = rte_log_register("pmd.net.iavf.init");
>-- 
>2.25.1
>

Reviewed-by: Xiaolong Ye <xiaolong.ye@intel.com>
  

Patch

diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index 34913f9c4..c0b95e169 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -1416,9 +1416,51 @@  iavf_dev_uninit(struct rte_eth_dev *dev)
 	return 0;
 }
 
+static int
+iavf_dcf_cap_check_handler(__rte_unused const char *key,
+			   const char *value, __rte_unused void *opaque)
+{
+	if (strcmp(value, "dcf"))
+		return -1;
+
+	return 0;
+}
+
+static int
+iavf_dcf_cap_selected(struct rte_devargs *devargs)
+{
+	struct rte_kvargs *kvlist;
+	const char *key = "cap";
+	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;
+
+	/* dcf capability selected when there's a key-value pair: cap=dcf */
+	if (rte_kvargs_process(kvlist, key,
+			       iavf_dcf_cap_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))
+		return 1;
+
 	return rte_eth_dev_pci_generic_probe(pci_dev,
 		sizeof(struct iavf_adapter), iavf_dev_init);
 }
@@ -1439,6 +1481,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_INIT(iavf_init_log)
 {
 	iavf_logtype_init = rte_log_register("pmd.net.iavf.init");