xref: /dpdk/drivers/vdpa/sfc/sfc_vdpa.c (revision c555d75201c3917108824a756db7095467829a11)
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