15e7596baSVijay Kumar Srivastava /* SPDX-License-Identifier: BSD-3-Clause
25e7596baSVijay Kumar Srivastava * Copyright(c) 2020-2021 Xilinx, Inc.
35e7596baSVijay Kumar Srivastava */
45e7596baSVijay Kumar Srivastava
55e7596baSVijay Kumar Srivastava #include <stdbool.h>
65e7596baSVijay Kumar Srivastava #include <stdint.h>
72744cb6eSThomas Monjalon #include <pthread.h>
85e7596baSVijay Kumar Srivastava #include <sys/queue.h>
95e7596baSVijay Kumar Srivastava
105e7596baSVijay Kumar Srivastava #include <rte_common.h>
11cfeed08aSVijay Kumar Srivastava #include <rte_devargs.h>
125e7596baSVijay Kumar Srivastava #include <rte_errno.h>
13cfeed08aSVijay Kumar Srivastava #include <rte_kvargs.h>
145e7596baSVijay Kumar Srivastava #include <rte_string_fns.h>
155e7596baSVijay Kumar Srivastava #include <rte_vfio.h>
165e7596baSVijay Kumar Srivastava #include <rte_vhost.h>
175e7596baSVijay Kumar Srivastava
185e7596baSVijay Kumar Srivastava #include "efx.h"
195e7596baSVijay Kumar Srivastava #include "sfc_efx.h"
205e7596baSVijay Kumar Srivastava #include "sfc_vdpa.h"
215e7596baSVijay Kumar Srivastava
225e7596baSVijay Kumar Srivastava TAILQ_HEAD(sfc_vdpa_adapter_list_head, sfc_vdpa_adapter);
235e7596baSVijay Kumar Srivastava static struct sfc_vdpa_adapter_list_head sfc_vdpa_adapter_list =
245e7596baSVijay Kumar Srivastava TAILQ_HEAD_INITIALIZER(sfc_vdpa_adapter_list);
255e7596baSVijay Kumar Srivastava
265e7596baSVijay Kumar Srivastava static pthread_mutex_t sfc_vdpa_adapter_list_lock = PTHREAD_MUTEX_INITIALIZER;
275e7596baSVijay Kumar Srivastava
285e7596baSVijay Kumar Srivastava struct sfc_vdpa_adapter *
sfc_vdpa_get_adapter_by_dev(struct rte_pci_device * pdev)295e7596baSVijay Kumar Srivastava sfc_vdpa_get_adapter_by_dev(struct rte_pci_device *pdev)
305e7596baSVijay Kumar Srivastava {
315e7596baSVijay Kumar Srivastava bool found = false;
325e7596baSVijay Kumar Srivastava struct sfc_vdpa_adapter *sva;
335e7596baSVijay Kumar Srivastava
345e7596baSVijay Kumar Srivastava pthread_mutex_lock(&sfc_vdpa_adapter_list_lock);
355e7596baSVijay Kumar Srivastava
365e7596baSVijay Kumar Srivastava TAILQ_FOREACH(sva, &sfc_vdpa_adapter_list, next) {
375e7596baSVijay Kumar Srivastava if (pdev == sva->pdev) {
385e7596baSVijay Kumar Srivastava found = true;
395e7596baSVijay Kumar Srivastava break;
405e7596baSVijay Kumar Srivastava }
415e7596baSVijay Kumar Srivastava }
425e7596baSVijay Kumar Srivastava
435e7596baSVijay Kumar Srivastava pthread_mutex_unlock(&sfc_vdpa_adapter_list_lock);
445e7596baSVijay Kumar Srivastava
455e7596baSVijay Kumar Srivastava return found ? sva : NULL;
465e7596baSVijay Kumar Srivastava }
475e7596baSVijay Kumar Srivastava
48f66a66e6SVijay Kumar Srivastava struct sfc_vdpa_ops_data *
sfc_vdpa_get_data_by_dev(struct rte_vdpa_device * vdpa_dev)49f66a66e6SVijay Kumar Srivastava sfc_vdpa_get_data_by_dev(struct rte_vdpa_device *vdpa_dev)
50f66a66e6SVijay Kumar Srivastava {
51f66a66e6SVijay Kumar Srivastava bool found = false;
52f66a66e6SVijay Kumar Srivastava struct sfc_vdpa_adapter *sva;
53f66a66e6SVijay Kumar Srivastava
54f66a66e6SVijay Kumar Srivastava pthread_mutex_lock(&sfc_vdpa_adapter_list_lock);
55f66a66e6SVijay Kumar Srivastava
56f66a66e6SVijay Kumar Srivastava TAILQ_FOREACH(sva, &sfc_vdpa_adapter_list, next) {
57f66a66e6SVijay Kumar Srivastava if (vdpa_dev == sva->ops_data->vdpa_dev) {
58f66a66e6SVijay Kumar Srivastava found = true;
59f66a66e6SVijay Kumar Srivastava break;
60f66a66e6SVijay Kumar Srivastava }
61f66a66e6SVijay Kumar Srivastava }
62f66a66e6SVijay Kumar Srivastava
63f66a66e6SVijay Kumar Srivastava pthread_mutex_unlock(&sfc_vdpa_adapter_list_lock);
64f66a66e6SVijay Kumar Srivastava
65f66a66e6SVijay Kumar Srivastava return found ? sva->ops_data : NULL;
66f66a66e6SVijay Kumar Srivastava }
67f66a66e6SVijay Kumar Srivastava
685e7596baSVijay Kumar Srivastava static int
sfc_vdpa_vfio_setup(struct sfc_vdpa_adapter * sva)695e7596baSVijay Kumar Srivastava sfc_vdpa_vfio_setup(struct sfc_vdpa_adapter *sva)
705e7596baSVijay Kumar Srivastava {
715e7596baSVijay Kumar Srivastava struct rte_pci_device *dev = sva->pdev;
725e7596baSVijay Kumar Srivastava char dev_name[RTE_DEV_NAME_MAX_LEN] = {0};
735e7596baSVijay Kumar Srivastava int rc;
745e7596baSVijay Kumar Srivastava
755e7596baSVijay Kumar Srivastava rte_pci_device_name(&dev->addr, dev_name, RTE_DEV_NAME_MAX_LEN);
765e7596baSVijay Kumar Srivastava
775e7596baSVijay Kumar Srivastava sva->vfio_container_fd = rte_vfio_container_create();
785e7596baSVijay Kumar Srivastava if (sva->vfio_container_fd < 0) {
795e7596baSVijay Kumar Srivastava sfc_vdpa_err(sva, "failed to create VFIO container");
805e7596baSVijay Kumar Srivastava goto fail_container_create;
815e7596baSVijay Kumar Srivastava }
825e7596baSVijay Kumar Srivastava
835e7596baSVijay Kumar Srivastava rc = rte_vfio_get_group_num(rte_pci_get_sysfs_path(), dev_name,
845e7596baSVijay Kumar Srivastava &sva->iommu_group_num);
855e7596baSVijay Kumar Srivastava if (rc <= 0) {
865e7596baSVijay Kumar Srivastava sfc_vdpa_err(sva, "failed to get IOMMU group for %s : %s",
875e7596baSVijay Kumar Srivastava dev_name, rte_strerror(-rc));
885e7596baSVijay Kumar Srivastava goto fail_get_group_num;
895e7596baSVijay Kumar Srivastava }
905e7596baSVijay Kumar Srivastava
915e7596baSVijay Kumar Srivastava sva->vfio_group_fd =
925e7596baSVijay Kumar Srivastava rte_vfio_container_group_bind(sva->vfio_container_fd,
935e7596baSVijay Kumar Srivastava sva->iommu_group_num);
945e7596baSVijay Kumar Srivastava if (sva->vfio_group_fd < 0) {
955e7596baSVijay Kumar Srivastava sfc_vdpa_err(sva,
965e7596baSVijay Kumar Srivastava "failed to bind IOMMU group %d to container %d",
975e7596baSVijay Kumar Srivastava sva->iommu_group_num, sva->vfio_container_fd);
985e7596baSVijay Kumar Srivastava goto fail_group_bind;
995e7596baSVijay Kumar Srivastava }
1005e7596baSVijay Kumar Srivastava
1015e7596baSVijay Kumar Srivastava if (rte_pci_map_device(dev) != 0) {
1025e7596baSVijay Kumar Srivastava sfc_vdpa_err(sva, "failed to map PCI device %s : %s",
1035e7596baSVijay Kumar Srivastava dev_name, rte_strerror(rte_errno));
1045e7596baSVijay Kumar Srivastava goto fail_pci_map_device;
1055e7596baSVijay Kumar Srivastava }
1065e7596baSVijay Kumar Srivastava
1075e7596baSVijay Kumar Srivastava sva->vfio_dev_fd = rte_intr_dev_fd_get(dev->intr_handle);
1085e7596baSVijay Kumar Srivastava
1095e7596baSVijay Kumar Srivastava return 0;
1105e7596baSVijay Kumar Srivastava
1115e7596baSVijay Kumar Srivastava fail_pci_map_device:
1125e7596baSVijay Kumar Srivastava if (rte_vfio_container_group_unbind(sva->vfio_container_fd,
1135e7596baSVijay Kumar Srivastava sva->iommu_group_num) != 0) {
1145e7596baSVijay Kumar Srivastava sfc_vdpa_err(sva,
1155e7596baSVijay Kumar Srivastava "failed to unbind IOMMU group %d from container %d",
1165e7596baSVijay Kumar Srivastava sva->iommu_group_num, sva->vfio_container_fd);
1175e7596baSVijay Kumar Srivastava }
1185e7596baSVijay Kumar Srivastava
1195e7596baSVijay Kumar Srivastava fail_group_bind:
1205e7596baSVijay Kumar Srivastava fail_get_group_num:
1215e7596baSVijay Kumar Srivastava if (rte_vfio_container_destroy(sva->vfio_container_fd) != 0) {
1225e7596baSVijay Kumar Srivastava sfc_vdpa_err(sva, "failed to destroy container %d",
1235e7596baSVijay Kumar Srivastava sva->vfio_container_fd);
1245e7596baSVijay Kumar Srivastava }
1255e7596baSVijay Kumar Srivastava
1265e7596baSVijay Kumar Srivastava fail_container_create:
1275e7596baSVijay Kumar Srivastava return -1;
1285e7596baSVijay Kumar Srivastava }
1295e7596baSVijay Kumar Srivastava
1305e7596baSVijay Kumar Srivastava static void
sfc_vdpa_vfio_teardown(struct sfc_vdpa_adapter * sva)1315e7596baSVijay Kumar Srivastava sfc_vdpa_vfio_teardown(struct sfc_vdpa_adapter *sva)
1325e7596baSVijay Kumar Srivastava {
1335e7596baSVijay Kumar Srivastava rte_pci_unmap_device(sva->pdev);
1345e7596baSVijay Kumar Srivastava
1355e7596baSVijay Kumar Srivastava if (rte_vfio_container_group_unbind(sva->vfio_container_fd,
1365e7596baSVijay Kumar Srivastava sva->iommu_group_num) != 0) {
1375e7596baSVijay Kumar Srivastava sfc_vdpa_err(sva,
1385e7596baSVijay Kumar Srivastava "failed to unbind IOMMU group %d from container %d",
1395e7596baSVijay Kumar Srivastava sva->iommu_group_num, sva->vfio_container_fd);
1405e7596baSVijay Kumar Srivastava }
1415e7596baSVijay Kumar Srivastava
1425e7596baSVijay Kumar Srivastava if (rte_vfio_container_destroy(sva->vfio_container_fd) != 0) {
1435e7596baSVijay Kumar Srivastava sfc_vdpa_err(sva,
1445e7596baSVijay Kumar Srivastava "failed to destroy container %d",
1455e7596baSVijay Kumar Srivastava sva->vfio_container_fd);
1465e7596baSVijay Kumar Srivastava }
1475e7596baSVijay Kumar Srivastava }
1485e7596baSVijay Kumar Srivastava
1495e7596baSVijay Kumar Srivastava static int
sfc_vdpa_set_log_prefix(struct sfc_vdpa_adapter * sva)1505e7596baSVijay Kumar Srivastava sfc_vdpa_set_log_prefix(struct sfc_vdpa_adapter *sva)
1515e7596baSVijay Kumar Srivastava {
1525e7596baSVijay Kumar Srivastava struct rte_pci_device *pci_dev = sva->pdev;
1535e7596baSVijay Kumar Srivastava int ret;
1545e7596baSVijay Kumar Srivastava
1555e7596baSVijay Kumar Srivastava ret = snprintf(sva->log_prefix, sizeof(sva->log_prefix),
1565e7596baSVijay Kumar Srivastava "PMD: sfc_vdpa " PCI_PRI_FMT " : ",
1575e7596baSVijay Kumar Srivastava pci_dev->addr.domain, pci_dev->addr.bus,
1585e7596baSVijay Kumar Srivastava pci_dev->addr.devid, pci_dev->addr.function);
1595e7596baSVijay Kumar Srivastava
1605e7596baSVijay Kumar Srivastava if (ret < 0 || ret >= (int)sizeof(sva->log_prefix)) {
1615e7596baSVijay Kumar Srivastava SFC_VDPA_GENERIC_LOG(ERR,
1625e7596baSVijay Kumar Srivastava "reserved log prefix is too short for " PCI_PRI_FMT,
1635e7596baSVijay Kumar Srivastava pci_dev->addr.domain, pci_dev->addr.bus,
1645e7596baSVijay Kumar Srivastava pci_dev->addr.devid, pci_dev->addr.function);
1655e7596baSVijay Kumar Srivastava return -EINVAL;
1665e7596baSVijay Kumar Srivastava }
1675e7596baSVijay Kumar Srivastava
1685e7596baSVijay Kumar Srivastava return 0;
1695e7596baSVijay Kumar Srivastava }
1705e7596baSVijay Kumar Srivastava
1715e7596baSVijay Kumar Srivastava uint32_t
sfc_vdpa_register_logtype(const struct rte_pci_addr * pci_addr,const char * lt_prefix_str,uint32_t ll_default)1725e7596baSVijay Kumar Srivastava sfc_vdpa_register_logtype(const struct rte_pci_addr *pci_addr,
1735e7596baSVijay Kumar Srivastava const char *lt_prefix_str, uint32_t ll_default)
1745e7596baSVijay Kumar Srivastava {
1755e7596baSVijay Kumar Srivastava size_t lt_prefix_str_size = strlen(lt_prefix_str);
1765e7596baSVijay Kumar Srivastava size_t lt_str_size_max;
1775e7596baSVijay Kumar Srivastava char *lt_str = NULL;
1785e7596baSVijay Kumar Srivastava int ret;
1795e7596baSVijay Kumar Srivastava
1805e7596baSVijay Kumar Srivastava if (SIZE_MAX - PCI_PRI_STR_SIZE - 1 > lt_prefix_str_size) {
1815e7596baSVijay Kumar Srivastava ++lt_prefix_str_size; /* Reserve space for prefix separator */
1825e7596baSVijay Kumar Srivastava lt_str_size_max = lt_prefix_str_size + PCI_PRI_STR_SIZE + 1;
1835e7596baSVijay Kumar Srivastava } else {
184*c555d752SDavid Marchand return sfc_vdpa_logtype_driver;
1855e7596baSVijay Kumar Srivastava }
1865e7596baSVijay Kumar Srivastava
1875e7596baSVijay Kumar Srivastava lt_str = rte_zmalloc("logtype_str", lt_str_size_max, 0);
1885e7596baSVijay Kumar Srivastava if (lt_str == NULL)
189*c555d752SDavid Marchand return sfc_vdpa_logtype_driver;
1905e7596baSVijay Kumar Srivastava
1915e7596baSVijay Kumar Srivastava strncpy(lt_str, lt_prefix_str, lt_prefix_str_size);
1925e7596baSVijay Kumar Srivastava lt_str[lt_prefix_str_size - 1] = '.';
1935e7596baSVijay Kumar Srivastava rte_pci_device_name(pci_addr, lt_str + lt_prefix_str_size,
1945e7596baSVijay Kumar Srivastava lt_str_size_max - lt_prefix_str_size);
1955e7596baSVijay Kumar Srivastava lt_str[lt_str_size_max - 1] = '\0';
1965e7596baSVijay Kumar Srivastava
1975e7596baSVijay Kumar Srivastava ret = rte_log_register_type_and_pick_level(lt_str, ll_default);
1985e7596baSVijay Kumar Srivastava rte_free(lt_str);
1995e7596baSVijay Kumar Srivastava
200*c555d752SDavid Marchand return ret < 0 ? sfc_vdpa_logtype_driver : ret;
2015e7596baSVijay Kumar Srivastava }
2025e7596baSVijay Kumar Srivastava
203cfeed08aSVijay Kumar Srivastava static int
sfc_vdpa_kvargs_parse(struct sfc_vdpa_adapter * sva)204cfeed08aSVijay Kumar Srivastava sfc_vdpa_kvargs_parse(struct sfc_vdpa_adapter *sva)
205cfeed08aSVijay Kumar Srivastava {
206cfeed08aSVijay Kumar Srivastava struct rte_pci_device *pci_dev = sva->pdev;
207cfeed08aSVijay Kumar Srivastava struct rte_devargs *devargs = pci_dev->device.devargs;
208cfeed08aSVijay Kumar Srivastava /*
209cfeed08aSVijay Kumar Srivastava * To get the device class a mandatory param 'class' is being
210cfeed08aSVijay Kumar Srivastava * used so included SFC_EFX_KVARG_DEV_CLASS in the param list.
211cfeed08aSVijay Kumar Srivastava */
212cfeed08aSVijay Kumar Srivastava const char **params = (const char *[]){
213cfeed08aSVijay Kumar Srivastava RTE_DEVARGS_KEY_CLASS,
214cfeed08aSVijay Kumar Srivastava SFC_VDPA_MAC_ADDR,
215cfeed08aSVijay Kumar Srivastava NULL,
216cfeed08aSVijay Kumar Srivastava };
217cfeed08aSVijay Kumar Srivastava
218cfeed08aSVijay Kumar Srivastava if (devargs == NULL)
219cfeed08aSVijay Kumar Srivastava return 0;
220cfeed08aSVijay Kumar Srivastava
221cfeed08aSVijay Kumar Srivastava sva->kvargs = rte_kvargs_parse(devargs->args, params);
222cfeed08aSVijay Kumar Srivastava if (sva->kvargs == NULL)
223cfeed08aSVijay Kumar Srivastava return -EINVAL;
224cfeed08aSVijay Kumar Srivastava
225cfeed08aSVijay Kumar Srivastava return 0;
226cfeed08aSVijay Kumar Srivastava }
227cfeed08aSVijay Kumar Srivastava
2285e7596baSVijay Kumar Srivastava static struct rte_pci_id pci_id_sfc_vdpa_efx_map[] = {
2295e7596baSVijay Kumar Srivastava { RTE_PCI_DEVICE(EFX_PCI_VENID_XILINX, EFX_PCI_DEVID_RIVERHEAD_VF) },
2305e7596baSVijay Kumar Srivastava { .vendor_id = 0, /* sentinel */ },
2315e7596baSVijay Kumar Srivastava };
2325e7596baSVijay Kumar Srivastava
2335e7596baSVijay Kumar Srivastava static int
sfc_vdpa_pci_probe(struct rte_pci_driver * pci_drv __rte_unused,struct rte_pci_device * pci_dev)2345e7596baSVijay Kumar Srivastava sfc_vdpa_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
2355e7596baSVijay Kumar Srivastava struct rte_pci_device *pci_dev)
2365e7596baSVijay Kumar Srivastava {
2375e7596baSVijay Kumar Srivastava struct sfc_vdpa_adapter *sva = NULL;
2385e7596baSVijay Kumar Srivastava uint32_t logtype_main;
2395e7596baSVijay Kumar Srivastava int ret = 0;
2405e7596baSVijay Kumar Srivastava
2415e7596baSVijay Kumar Srivastava if (sfc_efx_dev_class_get(pci_dev->device.devargs) !=
2425e7596baSVijay Kumar Srivastava SFC_EFX_DEV_CLASS_VDPA) {
2435e7596baSVijay Kumar Srivastava SFC_VDPA_GENERIC_LOG(INFO,
2445e7596baSVijay Kumar Srivastava "Incompatible device class: skip probing, should be probed by other sfc driver.");
2455e7596baSVijay Kumar Srivastava return 1;
2465e7596baSVijay Kumar Srivastava }
2475e7596baSVijay Kumar Srivastava
2485e7596baSVijay Kumar Srivastava /*
2495e7596baSVijay Kumar Srivastava * It will not be probed in the secondary process. As device class
2505e7596baSVijay Kumar Srivastava * is vdpa so return 0 to avoid probe by other sfc driver
2515e7596baSVijay Kumar Srivastava */
2525e7596baSVijay Kumar Srivastava if (rte_eal_process_type() != RTE_PROC_PRIMARY)
2535e7596baSVijay Kumar Srivastava return 0;
2545e7596baSVijay Kumar Srivastava
2555e7596baSVijay Kumar Srivastava logtype_main = sfc_vdpa_register_logtype(&pci_dev->addr,
2565e7596baSVijay Kumar Srivastava SFC_VDPA_LOGTYPE_MAIN_STR,
2575e7596baSVijay Kumar Srivastava RTE_LOG_NOTICE);
2585e7596baSVijay Kumar Srivastava
2595e7596baSVijay Kumar Srivastava sva = rte_zmalloc("sfc_vdpa", sizeof(struct sfc_vdpa_adapter), 0);
2605e7596baSVijay Kumar Srivastava if (sva == NULL)
2615e7596baSVijay Kumar Srivastava goto fail_zmalloc;
2625e7596baSVijay Kumar Srivastava
2635e7596baSVijay Kumar Srivastava sva->pdev = pci_dev;
2645e7596baSVijay Kumar Srivastava sva->logtype_main = logtype_main;
2655e7596baSVijay Kumar Srivastava
2665e7596baSVijay Kumar Srivastava ret = sfc_vdpa_set_log_prefix(sva);
2675e7596baSVijay Kumar Srivastava if (ret != 0)
2685e7596baSVijay Kumar Srivastava goto fail_set_log_prefix;
2695e7596baSVijay Kumar Srivastava
270cfeed08aSVijay Kumar Srivastava ret = sfc_vdpa_kvargs_parse(sva);
271cfeed08aSVijay Kumar Srivastava if (ret != 0)
272cfeed08aSVijay Kumar Srivastava goto fail_kvargs_parse;
273cfeed08aSVijay Kumar Srivastava
2745e7596baSVijay Kumar Srivastava sfc_vdpa_log_init(sva, "entry");
2755e7596baSVijay Kumar Srivastava
276b1196136SVijay Kumar Srivastava sfc_vdpa_adapter_lock_init(sva);
277b1196136SVijay Kumar Srivastava
2785e7596baSVijay Kumar Srivastava sfc_vdpa_log_init(sva, "vfio init");
2795e7596baSVijay Kumar Srivastava if (sfc_vdpa_vfio_setup(sva) < 0) {
2805e7596baSVijay Kumar Srivastava sfc_vdpa_err(sva, "failed to setup device %s", pci_dev->name);
2815e7596baSVijay Kumar Srivastava goto fail_vfio_setup;
2825e7596baSVijay Kumar Srivastava }
2835e7596baSVijay Kumar Srivastava
2846dad9a73SVijay Kumar Srivastava sfc_vdpa_log_init(sva, "hw init");
2856dad9a73SVijay Kumar Srivastava if (sfc_vdpa_hw_init(sva) != 0) {
2866dad9a73SVijay Kumar Srivastava sfc_vdpa_err(sva, "failed to init HW %s", pci_dev->name);
2876dad9a73SVijay Kumar Srivastava goto fail_hw_init;
2886dad9a73SVijay Kumar Srivastava }
2896dad9a73SVijay Kumar Srivastava
2906dad9a73SVijay Kumar Srivastava sfc_vdpa_log_init(sva, "dev init");
2916dad9a73SVijay Kumar Srivastava sva->ops_data = sfc_vdpa_device_init(sva, SFC_VDPA_AS_VF);
2926dad9a73SVijay Kumar Srivastava if (sva->ops_data == NULL) {
2936dad9a73SVijay Kumar Srivastava sfc_vdpa_err(sva, "failed vDPA dev init %s", pci_dev->name);
2946dad9a73SVijay Kumar Srivastava goto fail_dev_init;
2956dad9a73SVijay Kumar Srivastava }
2966dad9a73SVijay Kumar Srivastava
2975e7596baSVijay Kumar Srivastava pthread_mutex_lock(&sfc_vdpa_adapter_list_lock);
2985e7596baSVijay Kumar Srivastava TAILQ_INSERT_TAIL(&sfc_vdpa_adapter_list, sva, next);
2995e7596baSVijay Kumar Srivastava pthread_mutex_unlock(&sfc_vdpa_adapter_list_lock);
3005e7596baSVijay Kumar Srivastava
3015e7596baSVijay Kumar Srivastava sfc_vdpa_log_init(sva, "done");
3025e7596baSVijay Kumar Srivastava
3035e7596baSVijay Kumar Srivastava return 0;
3045e7596baSVijay Kumar Srivastava
3056dad9a73SVijay Kumar Srivastava fail_dev_init:
3066dad9a73SVijay Kumar Srivastava sfc_vdpa_hw_fini(sva);
3076dad9a73SVijay Kumar Srivastava
3086dad9a73SVijay Kumar Srivastava fail_hw_init:
3096dad9a73SVijay Kumar Srivastava sfc_vdpa_vfio_teardown(sva);
3106dad9a73SVijay Kumar Srivastava
3115e7596baSVijay Kumar Srivastava fail_vfio_setup:
312b1196136SVijay Kumar Srivastava sfc_vdpa_adapter_lock_fini(sva);
313b1196136SVijay Kumar Srivastava
314cfeed08aSVijay Kumar Srivastava fail_kvargs_parse:
3155e7596baSVijay Kumar Srivastava fail_set_log_prefix:
3165e7596baSVijay Kumar Srivastava rte_free(sva);
3175e7596baSVijay Kumar Srivastava
3185e7596baSVijay Kumar Srivastava fail_zmalloc:
3195e7596baSVijay Kumar Srivastava return -1;
3205e7596baSVijay Kumar Srivastava }
3215e7596baSVijay Kumar Srivastava
3225e7596baSVijay Kumar Srivastava static int
sfc_vdpa_pci_remove(struct rte_pci_device * pci_dev)3235e7596baSVijay Kumar Srivastava sfc_vdpa_pci_remove(struct rte_pci_device *pci_dev)
3245e7596baSVijay Kumar Srivastava {
3255e7596baSVijay Kumar Srivastava struct sfc_vdpa_adapter *sva = NULL;
3265e7596baSVijay Kumar Srivastava
3275e7596baSVijay Kumar Srivastava if (rte_eal_process_type() != RTE_PROC_PRIMARY)
3285e7596baSVijay Kumar Srivastava return -1;
3295e7596baSVijay Kumar Srivastava
3305e7596baSVijay Kumar Srivastava sva = sfc_vdpa_get_adapter_by_dev(pci_dev);
3315e7596baSVijay Kumar Srivastava if (sva == NULL) {
332500640b3SWeiguo Li SFC_VDPA_GENERIC_LOG(INFO,
333500640b3SWeiguo Li "Invalid device: %s.", pci_dev->name);
3345e7596baSVijay Kumar Srivastava return -1;
3355e7596baSVijay Kumar Srivastava }
3365e7596baSVijay Kumar Srivastava
3375e7596baSVijay Kumar Srivastava pthread_mutex_lock(&sfc_vdpa_adapter_list_lock);
3385e7596baSVijay Kumar Srivastava TAILQ_REMOVE(&sfc_vdpa_adapter_list, sva, next);
3395e7596baSVijay Kumar Srivastava pthread_mutex_unlock(&sfc_vdpa_adapter_list_lock);
3405e7596baSVijay Kumar Srivastava
3416dad9a73SVijay Kumar Srivastava sfc_vdpa_device_fini(sva->ops_data);
3426dad9a73SVijay Kumar Srivastava
3436dad9a73SVijay Kumar Srivastava sfc_vdpa_hw_fini(sva);
3446dad9a73SVijay Kumar Srivastava
3455e7596baSVijay Kumar Srivastava sfc_vdpa_vfio_teardown(sva);
3465e7596baSVijay Kumar Srivastava
347b1196136SVijay Kumar Srivastava sfc_vdpa_adapter_lock_fini(sva);
348b1196136SVijay Kumar Srivastava
3495e7596baSVijay Kumar Srivastava rte_free(sva);
3505e7596baSVijay Kumar Srivastava
3515e7596baSVijay Kumar Srivastava return 0;
3525e7596baSVijay Kumar Srivastava }
3535e7596baSVijay Kumar Srivastava
3545e7596baSVijay Kumar Srivastava static struct rte_pci_driver rte_sfc_vdpa = {
3555e7596baSVijay Kumar Srivastava .id_table = pci_id_sfc_vdpa_efx_map,
3565e7596baSVijay Kumar Srivastava .drv_flags = 0,
3575e7596baSVijay Kumar Srivastava .probe = sfc_vdpa_pci_probe,
3585e7596baSVijay Kumar Srivastava .remove = sfc_vdpa_pci_remove,
3595e7596baSVijay Kumar Srivastava };
3605e7596baSVijay Kumar Srivastava
3615e7596baSVijay Kumar Srivastava RTE_PMD_REGISTER_PCI(net_sfc_vdpa, rte_sfc_vdpa);
3625e7596baSVijay Kumar Srivastava RTE_PMD_REGISTER_PCI_TABLE(net_sfc_vdpa, pci_id_sfc_vdpa_efx_map);
3635e7596baSVijay Kumar Srivastava RTE_PMD_REGISTER_KMOD_DEP(net_sfc_vdpa, "* vfio-pci");
3645e7596baSVijay Kumar Srivastava RTE_LOG_REGISTER_SUFFIX(sfc_vdpa_logtype_driver, driver, NOTICE);
365