net/mlx5: introduce hardware steering enable routine
[dpdk.git] / drivers / vdpa / sfc / sfc_vdpa.c
index 9d407b5..53f598f 100644 (file)
@@ -7,7 +7,9 @@
 #include <sys/queue.h>
 
 #include <rte_common.h>
+#include <rte_devargs.h>
 #include <rte_errno.h>
+#include <rte_kvargs.h>
 #include <rte_string_fns.h>
 #include <rte_vfio.h>
 #include <rte_vhost.h>
@@ -42,6 +44,26 @@ sfc_vdpa_get_adapter_by_dev(struct rte_pci_device *pdev)
        return found ? sva : NULL;
 }
 
+struct sfc_vdpa_ops_data *
+sfc_vdpa_get_data_by_dev(struct rte_vdpa_device *vdpa_dev)
+{
+       bool found = false;
+       struct sfc_vdpa_adapter *sva;
+
+       pthread_mutex_lock(&sfc_vdpa_adapter_list_lock);
+
+       TAILQ_FOREACH(sva, &sfc_vdpa_adapter_list, next) {
+               if (vdpa_dev == sva->ops_data->vdpa_dev) {
+                       found = true;
+                       break;
+               }
+       }
+
+       pthread_mutex_unlock(&sfc_vdpa_adapter_list_lock);
+
+       return found ? sva->ops_data : NULL;
+}
+
 static int
 sfc_vdpa_vfio_setup(struct sfc_vdpa_adapter *sva)
 {
@@ -177,6 +199,31 @@ sfc_vdpa_register_logtype(const struct rte_pci_addr *pci_addr,
        return ret < 0 ? RTE_LOGTYPE_PMD : ret;
 }
 
+static int
+sfc_vdpa_kvargs_parse(struct sfc_vdpa_adapter *sva)
+{
+       struct rte_pci_device *pci_dev = sva->pdev;
+       struct rte_devargs *devargs = pci_dev->device.devargs;
+       /*
+        * To get the device class a mandatory param 'class' is being
+        * used so included SFC_EFX_KVARG_DEV_CLASS in the param list.
+        */
+       const char **params = (const char *[]){
+               RTE_DEVARGS_KEY_CLASS,
+               SFC_VDPA_MAC_ADDR,
+               NULL,
+       };
+
+       if (devargs == NULL)
+               return 0;
+
+       sva->kvargs = rte_kvargs_parse(devargs->args, params);
+       if (sva->kvargs == NULL)
+               return -EINVAL;
+
+       return 0;
+}
+
 static struct rte_pci_id pci_id_sfc_vdpa_efx_map[] = {
        { RTE_PCI_DEVICE(EFX_PCI_VENID_XILINX, EFX_PCI_DEVID_RIVERHEAD_VF) },
        { .vendor_id = 0, /* sentinel */ },
@@ -219,14 +266,33 @@ sfc_vdpa_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
        if (ret != 0)
                goto fail_set_log_prefix;
 
+       ret = sfc_vdpa_kvargs_parse(sva);
+       if (ret != 0)
+               goto fail_kvargs_parse;
+
        sfc_vdpa_log_init(sva, "entry");
 
+       sfc_vdpa_adapter_lock_init(sva);
+
        sfc_vdpa_log_init(sva, "vfio init");
        if (sfc_vdpa_vfio_setup(sva) < 0) {
                sfc_vdpa_err(sva, "failed to setup device %s", pci_dev->name);
                goto fail_vfio_setup;
        }
 
+       sfc_vdpa_log_init(sva, "hw init");
+       if (sfc_vdpa_hw_init(sva) != 0) {
+               sfc_vdpa_err(sva, "failed to init HW %s", pci_dev->name);
+               goto fail_hw_init;
+       }
+
+       sfc_vdpa_log_init(sva, "dev init");
+       sva->ops_data = sfc_vdpa_device_init(sva, SFC_VDPA_AS_VF);
+       if (sva->ops_data == NULL) {
+               sfc_vdpa_err(sva, "failed vDPA dev init %s", pci_dev->name);
+               goto fail_dev_init;
+       }
+
        pthread_mutex_lock(&sfc_vdpa_adapter_list_lock);
        TAILQ_INSERT_TAIL(&sfc_vdpa_adapter_list, sva, next);
        pthread_mutex_unlock(&sfc_vdpa_adapter_list_lock);
@@ -235,7 +301,16 @@ sfc_vdpa_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 
        return 0;
 
+fail_dev_init:
+       sfc_vdpa_hw_fini(sva);
+
+fail_hw_init:
+       sfc_vdpa_vfio_teardown(sva);
+
 fail_vfio_setup:
+       sfc_vdpa_adapter_lock_fini(sva);
+
+fail_kvargs_parse:
 fail_set_log_prefix:
        rte_free(sva);
 
@@ -253,7 +328,8 @@ sfc_vdpa_pci_remove(struct rte_pci_device *pci_dev)
 
        sva = sfc_vdpa_get_adapter_by_dev(pci_dev);
        if (sva == NULL) {
-               sfc_vdpa_info(sva, "invalid device: %s", pci_dev->name);
+               SFC_VDPA_GENERIC_LOG(INFO,
+                       "Invalid device: %s.", pci_dev->name);
                return -1;
        }
 
@@ -261,8 +337,14 @@ sfc_vdpa_pci_remove(struct rte_pci_device *pci_dev)
        TAILQ_REMOVE(&sfc_vdpa_adapter_list, sva, next);
        pthread_mutex_unlock(&sfc_vdpa_adapter_list_lock);
 
+       sfc_vdpa_device_fini(sva->ops_data);
+
+       sfc_vdpa_hw_fini(sva);
+
        sfc_vdpa_vfio_teardown(sva);
 
+       sfc_vdpa_adapter_lock_fini(sva);
+
        rte_free(sva);
 
        return 0;