The representor id is added in rte_eth_dev_data in order to be able
to match a port with its representor id in devargs.

Signed-off-by: Thomas Monjalon <tho...@monjalon.net>
Reviewed-by: Andrew Rybchenko <arybche...@solarflare.com>
---
 drivers/net/i40e/i40e_vf_representor.c   |  1 +
 drivers/net/ixgbe/ixgbe_vf_representor.c |  1 +
 drivers/net/mlx5/mlx5.c                  |  4 ++-
 lib/librte_ethdev/rte_class_eth.c        | 44 ++++++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev_core.h      |  2 ++
 5 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_vf_representor.c 
b/drivers/net/i40e/i40e_vf_representor.c
index 24751d13c..a377c1064 100644
--- a/drivers/net/i40e/i40e_vf_representor.c
+++ b/drivers/net/i40e/i40e_vf_representor.c
@@ -504,6 +504,7 @@ i40e_vf_representor_init(struct rte_eth_dev *ethdev, void 
*init_params)
        }
 
        ethdev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
+       ethdev->data->representor_id = representor->vf_id;
 
        /* Setting the number queues allocated to the VF */
        ethdev->data->nb_rx_queues = vf->vsi->nb_qps;
diff --git a/drivers/net/ixgbe/ixgbe_vf_representor.c 
b/drivers/net/ixgbe/ixgbe_vf_representor.c
index b0fbbc49f..26e2af4f8 100644
--- a/drivers/net/ixgbe/ixgbe_vf_representor.c
+++ b/drivers/net/ixgbe/ixgbe_vf_representor.c
@@ -192,6 +192,7 @@ ixgbe_vf_representor_init(struct rte_eth_dev *ethdev, void 
*init_params)
                return -ENODEV;
 
        ethdev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
+       ethdev->data->representor_id = representor->vf_id;
 
        /* Set representor device ops */
        ethdev->dev_ops = &ixgbe_vf_representor_dev_ops;
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index cf258345f..de8bab342 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -1075,8 +1075,10 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                err = ENOMEM;
                goto error;
        }
-       if (priv->representor)
+       if (priv->representor) {
                eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
+               eth_dev->data->representor_id = priv->representor_id;
+       }
        eth_dev->data->dev_private = priv;
        priv->dev_data = eth_dev->data;
        eth_dev->data->mac_addrs = priv->mac;
diff --git a/lib/librte_ethdev/rte_class_eth.c 
b/lib/librte_ethdev/rte_class_eth.c
index 58fed694b..fca7fe4d4 100644
--- a/lib/librte_ethdev/rte_class_eth.c
+++ b/lib/librte_ethdev/rte_class_eth.c
@@ -12,13 +12,16 @@
 
 #include "rte_ethdev.h"
 #include "rte_ethdev_core.h"
+#include "rte_ethdev_driver.h"
 #include "ethdev_private.h"
 
 enum eth_params {
+       RTE_ETH_PARAM_REPRESENTOR,
        RTE_ETH_PARAM_MAX,
 };
 
 static const char * const eth_params_keys[] = {
+       [RTE_ETH_PARAM_REPRESENTOR] = "representor",
        [RTE_ETH_PARAM_MAX] = NULL,
 };
 
@@ -33,10 +36,44 @@ struct eth_dev_match_arg {
                .kvlist = (k), \
        })
 
+static int
+eth_representor_cmp(const char *key __rte_unused,
+               const char *value, void *opaque)
+{
+       int ret;
+       char *values;
+       const struct rte_eth_dev_data *data = opaque;
+       struct rte_eth_devargs representors;
+       uint16_t index;
+
+       if ((data->dev_flags & RTE_ETH_DEV_REPRESENTOR) == 0)
+               return -1; /* not a representor port */
+
+       /* Parse devargs representor values. */
+       values = strdup(value);
+       if (values == NULL)
+               return -1;
+       memset(&representors, 0, sizeof(representors));
+       ret = rte_eth_devargs_parse_list(values,
+                       rte_eth_devargs_parse_representor_ports,
+                       &representors);
+       free(values);
+       if (ret != 0)
+               return -1; /* invalid devargs value */
+
+       /* Return 0 if representor id is matching one of the values. */
+       for (index = 0; index < representors.nb_representor_ports; index++)
+               if (data->representor_id ==
+                               representors.representor_ports[index])
+                       return 0;
+       return -1; /* no match */
+}
+
 static int
 eth_dev_match(const struct rte_eth_dev *edev,
              const void *_arg)
 {
+       int ret;
        const struct eth_dev_match_arg *arg = _arg;
        const struct rte_kvargs *kvlist = arg->kvlist;
 
@@ -47,6 +84,13 @@ eth_dev_match(const struct rte_eth_dev *edev,
        if (kvlist == NULL)
                /* Empty string matches everything. */
                return 0;
+
+       ret = rte_kvargs_process(kvlist,
+                       eth_params_keys[RTE_ETH_PARAM_REPRESENTOR],
+                       eth_representor_cmp, edev->data);
+       if (ret != 0)
+               return -1;
+
        return 0;
 }
 
diff --git a/lib/librte_ethdev/rte_ethdev_core.h 
b/lib/librte_ethdev/rte_ethdev_core.h
index 33d12b3a2..ac67fde28 100644
--- a/lib/librte_ethdev/rte_ethdev_core.h
+++ b/lib/librte_ethdev/rte_ethdev_core.h
@@ -613,6 +613,8 @@ struct rte_eth_dev_data {
        struct rte_vlan_filter_conf vlan_filter_conf;
        /**< VLAN filter configuration. */
        struct rte_eth_dev_owner owner; /**< The port owner. */
+       uint16_t representor_id;
+       /**< switch specific identifier - valid if RTE_ETH_DEV_REPRESENTOR */
 } __rte_cache_aligned;
 
 /**
-- 
2.19.0

Reply via email to