xref: /dpdk/drivers/net/pfe/pfe_ethdev.c (revision b1bc1afa4a0e18a68f8f64e99497a858f54a2f11)
167fc3ff9SGagandeep Singh /* SPDX-License-Identifier: BSD-3-Clause
267fc3ff9SGagandeep Singh  * Copyright 2019 NXP
367fc3ff9SGagandeep Singh  */
467fc3ff9SGagandeep Singh 
567fc3ff9SGagandeep Singh #include <rte_kvargs.h>
667fc3ff9SGagandeep Singh #include <rte_ethdev_vdev.h>
767fc3ff9SGagandeep Singh #include <rte_bus_vdev.h>
867fc3ff9SGagandeep Singh #include <dpaa_of.h>
967fc3ff9SGagandeep Singh 
10*b1bc1afaSGagandeep Singh #include "pfe_logs.h"
1167fc3ff9SGagandeep Singh #include "pfe_mod.h"
1267fc3ff9SGagandeep Singh 
1367fc3ff9SGagandeep Singh #define PFE_MAX_MACS 1 /*we can support upto 4 MACs per IF*/
1467fc3ff9SGagandeep Singh #define PFE_VDEV_GEM_ID_ARG	"intf"
1567fc3ff9SGagandeep Singh 
1667fc3ff9SGagandeep Singh struct pfe_vdev_init_params {
1767fc3ff9SGagandeep Singh 	int8_t	gem_id;
1867fc3ff9SGagandeep Singh };
1967fc3ff9SGagandeep Singh static struct pfe *g_pfe;
2067fc3ff9SGagandeep Singh 
2167fc3ff9SGagandeep Singh /* TODO: make pfe_svr a runtime option.
2267fc3ff9SGagandeep Singh  * Driver should be able to get the SVR
2367fc3ff9SGagandeep Singh  * information from HW.
2467fc3ff9SGagandeep Singh  */
2567fc3ff9SGagandeep Singh unsigned int pfe_svr = SVR_LS1012A_REV1;
2667fc3ff9SGagandeep Singh 
27*b1bc1afaSGagandeep Singh int pfe_logtype_pmd;
28*b1bc1afaSGagandeep Singh 
2967fc3ff9SGagandeep Singh static void
3067fc3ff9SGagandeep Singh pfe_soc_version_get(void)
3167fc3ff9SGagandeep Singh {
3267fc3ff9SGagandeep Singh 	FILE *svr_file = NULL;
3367fc3ff9SGagandeep Singh 	unsigned int svr_ver = 0;
3467fc3ff9SGagandeep Singh 
35*b1bc1afaSGagandeep Singh 	PMD_INIT_FUNC_TRACE();
36*b1bc1afaSGagandeep Singh 
3767fc3ff9SGagandeep Singh 	svr_file = fopen(PFE_SOC_ID_FILE, "r");
38*b1bc1afaSGagandeep Singh 	if (!svr_file) {
39*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("Unable to open SoC device");
4067fc3ff9SGagandeep Singh 		return; /* Not supported on this infra */
41*b1bc1afaSGagandeep Singh 	}
4267fc3ff9SGagandeep Singh 
4367fc3ff9SGagandeep Singh 	if (fscanf(svr_file, "svr:%x", &svr_ver) > 0)
4467fc3ff9SGagandeep Singh 		pfe_svr = svr_ver;
4567fc3ff9SGagandeep Singh 	else
46*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("Unable to read SoC device");
4767fc3ff9SGagandeep Singh 
4867fc3ff9SGagandeep Singh 	fclose(svr_file);
4967fc3ff9SGagandeep Singh }
5067fc3ff9SGagandeep Singh 
5167fc3ff9SGagandeep Singh static int
5267fc3ff9SGagandeep Singh pfe_eth_open_cdev(struct pfe_eth_priv_s *priv)
5367fc3ff9SGagandeep Singh {
5467fc3ff9SGagandeep Singh 	int pfe_cdev_fd;
5567fc3ff9SGagandeep Singh 
5667fc3ff9SGagandeep Singh 	if (priv == NULL)
5767fc3ff9SGagandeep Singh 		return -1;
5867fc3ff9SGagandeep Singh 
5967fc3ff9SGagandeep Singh 	pfe_cdev_fd = open(PFE_CDEV_PATH, O_RDONLY);
6067fc3ff9SGagandeep Singh 	if (pfe_cdev_fd < 0) {
61*b1bc1afaSGagandeep Singh 		PFE_PMD_WARN("Unable to open PFE device file (%s).\n",
62*b1bc1afaSGagandeep Singh 			     PFE_CDEV_PATH);
63*b1bc1afaSGagandeep Singh 		PFE_PMD_WARN("Link status update will not be available.\n");
6467fc3ff9SGagandeep Singh 		priv->link_fd = PFE_CDEV_INVALID_FD;
6567fc3ff9SGagandeep Singh 		return -1;
6667fc3ff9SGagandeep Singh 	}
6767fc3ff9SGagandeep Singh 
6867fc3ff9SGagandeep Singh 	priv->link_fd = pfe_cdev_fd;
6967fc3ff9SGagandeep Singh 
7067fc3ff9SGagandeep Singh 	return 0;
7167fc3ff9SGagandeep Singh }
7267fc3ff9SGagandeep Singh 
7367fc3ff9SGagandeep Singh static void
7467fc3ff9SGagandeep Singh pfe_eth_close_cdev(struct pfe_eth_priv_s *priv)
7567fc3ff9SGagandeep Singh {
7667fc3ff9SGagandeep Singh 	if (priv == NULL)
7767fc3ff9SGagandeep Singh 		return;
7867fc3ff9SGagandeep Singh 
7967fc3ff9SGagandeep Singh 	if (priv->link_fd != PFE_CDEV_INVALID_FD) {
8067fc3ff9SGagandeep Singh 		close(priv->link_fd);
8167fc3ff9SGagandeep Singh 		priv->link_fd = PFE_CDEV_INVALID_FD;
8267fc3ff9SGagandeep Singh 	}
8367fc3ff9SGagandeep Singh }
8467fc3ff9SGagandeep Singh 
8567fc3ff9SGagandeep Singh static void
8667fc3ff9SGagandeep Singh pfe_eth_exit(struct rte_eth_dev *dev, struct pfe *pfe)
8767fc3ff9SGagandeep Singh {
88*b1bc1afaSGagandeep Singh 	PMD_INIT_FUNC_TRACE();
89*b1bc1afaSGagandeep Singh 
9067fc3ff9SGagandeep Singh 	/* Close the device file for link status */
9167fc3ff9SGagandeep Singh 	pfe_eth_close_cdev(dev->data->dev_private);
9267fc3ff9SGagandeep Singh 
9367fc3ff9SGagandeep Singh 	rte_free(dev->data->mac_addrs);
9467fc3ff9SGagandeep Singh 	rte_eth_dev_release_port(dev);
9567fc3ff9SGagandeep Singh 	pfe->nb_devs--;
9667fc3ff9SGagandeep Singh }
9767fc3ff9SGagandeep Singh 
9867fc3ff9SGagandeep Singh static int
9967fc3ff9SGagandeep Singh pfe_eth_init(struct rte_vdev_device *vdev, struct pfe *pfe, int id)
10067fc3ff9SGagandeep Singh {
10167fc3ff9SGagandeep Singh 	struct rte_eth_dev *eth_dev = NULL;
10267fc3ff9SGagandeep Singh 	struct pfe_eth_priv_s *priv = NULL;
10367fc3ff9SGagandeep Singh 	int err;
10467fc3ff9SGagandeep Singh 
10567fc3ff9SGagandeep Singh 	eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*priv));
10667fc3ff9SGagandeep Singh 	if (eth_dev == NULL)
10767fc3ff9SGagandeep Singh 		return -ENOMEM;
10867fc3ff9SGagandeep Singh 
10967fc3ff9SGagandeep Singh 	priv = eth_dev->data->dev_private;
11067fc3ff9SGagandeep Singh 	priv->ndev = eth_dev;
11167fc3ff9SGagandeep Singh 	priv->pfe = pfe;
11267fc3ff9SGagandeep Singh 
11367fc3ff9SGagandeep Singh 	pfe->eth.eth_priv[id] = priv;
11467fc3ff9SGagandeep Singh 
11567fc3ff9SGagandeep Singh #define HIF_GEMAC_TMUQ_BASE	6
11667fc3ff9SGagandeep Singh 	priv->low_tmu_q = HIF_GEMAC_TMUQ_BASE + (id * 2);
11767fc3ff9SGagandeep Singh 	priv->high_tmu_q = priv->low_tmu_q + 1;
11867fc3ff9SGagandeep Singh 
11967fc3ff9SGagandeep Singh 	rte_spinlock_init(&priv->lock);
12067fc3ff9SGagandeep Singh 
12167fc3ff9SGagandeep Singh 	/* Copy the station address into the dev structure, */
12267fc3ff9SGagandeep Singh 	eth_dev->data->mac_addrs = rte_zmalloc("mac_addr",
12367fc3ff9SGagandeep Singh 			ETHER_ADDR_LEN * PFE_MAX_MACS, 0);
12467fc3ff9SGagandeep Singh 	if (eth_dev->data->mac_addrs == NULL) {
125*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("Failed to allocate mem %d to store MAC addresses",
126*b1bc1afaSGagandeep Singh 			ETHER_ADDR_LEN * PFE_MAX_MACS);
12767fc3ff9SGagandeep Singh 		err = -ENOMEM;
12867fc3ff9SGagandeep Singh 		goto err0;
12967fc3ff9SGagandeep Singh 	}
13067fc3ff9SGagandeep Singh 
13167fc3ff9SGagandeep Singh 	eth_dev->data->mtu = 1500;
13267fc3ff9SGagandeep Singh 
13367fc3ff9SGagandeep Singh 	eth_dev->data->nb_rx_queues = 1;
13467fc3ff9SGagandeep Singh 	eth_dev->data->nb_tx_queues = 1;
13567fc3ff9SGagandeep Singh 
13667fc3ff9SGagandeep Singh 	/* For link status, open the PFE CDEV; Error from this function
13767fc3ff9SGagandeep Singh 	 * is silently ignored; In case of error, the link status will not
13867fc3ff9SGagandeep Singh 	 * be available.
13967fc3ff9SGagandeep Singh 	 */
14067fc3ff9SGagandeep Singh 	pfe_eth_open_cdev(priv);
14167fc3ff9SGagandeep Singh 	rte_eth_dev_probing_finish(eth_dev);
14267fc3ff9SGagandeep Singh 
14367fc3ff9SGagandeep Singh 	return 0;
14467fc3ff9SGagandeep Singh err0:
14567fc3ff9SGagandeep Singh 	rte_eth_dev_release_port(eth_dev);
14667fc3ff9SGagandeep Singh 	return err;
14767fc3ff9SGagandeep Singh }
14867fc3ff9SGagandeep Singh 
14967fc3ff9SGagandeep Singh /* Parse integer from integer argument */
15067fc3ff9SGagandeep Singh static int
15167fc3ff9SGagandeep Singh parse_integer_arg(const char *key __rte_unused,
15267fc3ff9SGagandeep Singh 		const char *value, void *extra_args)
15367fc3ff9SGagandeep Singh {
15467fc3ff9SGagandeep Singh 	int i;
15567fc3ff9SGagandeep Singh 	char *end;
15667fc3ff9SGagandeep Singh 	errno = 0;
15767fc3ff9SGagandeep Singh 
15867fc3ff9SGagandeep Singh 	i = strtol(value, &end, 10);
159*b1bc1afaSGagandeep Singh 	if (*end != 0 || errno != 0 || i < 0 || i > 1) {
160*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("Supported Port IDS are 0 and 1");
16167fc3ff9SGagandeep Singh 		return -EINVAL;
162*b1bc1afaSGagandeep Singh 	}
16367fc3ff9SGagandeep Singh 
16467fc3ff9SGagandeep Singh 	*((uint32_t *)extra_args) = i;
16567fc3ff9SGagandeep Singh 
16667fc3ff9SGagandeep Singh 	return 0;
16767fc3ff9SGagandeep Singh }
16867fc3ff9SGagandeep Singh 
16967fc3ff9SGagandeep Singh static int
17067fc3ff9SGagandeep Singh pfe_parse_vdev_init_params(struct pfe_vdev_init_params *params,
17167fc3ff9SGagandeep Singh 			   struct rte_vdev_device *dev)
17267fc3ff9SGagandeep Singh {
17367fc3ff9SGagandeep Singh 	struct rte_kvargs *kvlist = NULL;
17467fc3ff9SGagandeep Singh 	int ret = 0;
17567fc3ff9SGagandeep Singh 
17667fc3ff9SGagandeep Singh 	static const char * const pfe_vdev_valid_params[] = {
17767fc3ff9SGagandeep Singh 		PFE_VDEV_GEM_ID_ARG,
17867fc3ff9SGagandeep Singh 		NULL
17967fc3ff9SGagandeep Singh 	};
18067fc3ff9SGagandeep Singh 
18167fc3ff9SGagandeep Singh 	const char *input_args = rte_vdev_device_args(dev);
18267fc3ff9SGagandeep Singh 
18367fc3ff9SGagandeep Singh 	if (!input_args)
18467fc3ff9SGagandeep Singh 		return -1;
18567fc3ff9SGagandeep Singh 
18667fc3ff9SGagandeep Singh 	kvlist = rte_kvargs_parse(input_args, pfe_vdev_valid_params);
18767fc3ff9SGagandeep Singh 	if (kvlist == NULL)
18867fc3ff9SGagandeep Singh 		return -1;
18967fc3ff9SGagandeep Singh 
19067fc3ff9SGagandeep Singh 	ret = rte_kvargs_process(kvlist,
19167fc3ff9SGagandeep Singh 				PFE_VDEV_GEM_ID_ARG,
19267fc3ff9SGagandeep Singh 				&parse_integer_arg,
19367fc3ff9SGagandeep Singh 				&params->gem_id);
19467fc3ff9SGagandeep Singh 	rte_kvargs_free(kvlist);
19567fc3ff9SGagandeep Singh 	return ret;
19667fc3ff9SGagandeep Singh }
19767fc3ff9SGagandeep Singh 
19867fc3ff9SGagandeep Singh static int
19967fc3ff9SGagandeep Singh pmd_pfe_probe(struct rte_vdev_device *vdev)
20067fc3ff9SGagandeep Singh {
20167fc3ff9SGagandeep Singh 	const u32 *prop;
20267fc3ff9SGagandeep Singh 	const struct device_node *np;
20367fc3ff9SGagandeep Singh 	const char *name;
20467fc3ff9SGagandeep Singh 	const uint32_t *addr;
20567fc3ff9SGagandeep Singh 	uint64_t cbus_addr, ddr_size, cbus_size;
20667fc3ff9SGagandeep Singh 	int rc = -1, fd = -1, gem_id;
20767fc3ff9SGagandeep Singh 	unsigned int interface_count = 0;
20867fc3ff9SGagandeep Singh 	size_t size = 0;
20967fc3ff9SGagandeep Singh 	struct pfe_vdev_init_params init_params = {
21067fc3ff9SGagandeep Singh 		.gem_id = -1
21167fc3ff9SGagandeep Singh 	};
21267fc3ff9SGagandeep Singh 
21367fc3ff9SGagandeep Singh 	name = rte_vdev_device_name(vdev);
21467fc3ff9SGagandeep Singh 	rc = pfe_parse_vdev_init_params(&init_params, vdev);
21567fc3ff9SGagandeep Singh 	if (rc < 0)
21667fc3ff9SGagandeep Singh 		return -EINVAL;
21767fc3ff9SGagandeep Singh 
218*b1bc1afaSGagandeep Singh 	RTE_LOG(INFO, PMD, "Initializing pmd_pfe for %s Given gem-id %d\n",
219*b1bc1afaSGagandeep Singh 		name, init_params.gem_id);
22067fc3ff9SGagandeep Singh 
221*b1bc1afaSGagandeep Singh 	if (g_pfe) {
222*b1bc1afaSGagandeep Singh 		if (g_pfe->nb_devs >= g_pfe->max_intf) {
223*b1bc1afaSGagandeep Singh 			PFE_PMD_ERR("PFE %d dev already created Max is %d",
224*b1bc1afaSGagandeep Singh 				g_pfe->nb_devs, g_pfe->max_intf);
225*b1bc1afaSGagandeep Singh 			return -EINVAL;
226*b1bc1afaSGagandeep Singh 		}
22767fc3ff9SGagandeep Singh 		goto eth_init;
22867fc3ff9SGagandeep Singh 	}
22967fc3ff9SGagandeep Singh 
23067fc3ff9SGagandeep Singh 	g_pfe = rte_zmalloc(NULL, sizeof(*g_pfe), RTE_CACHE_LINE_SIZE);
23167fc3ff9SGagandeep Singh 	if (g_pfe == NULL)
23267fc3ff9SGagandeep Singh 		return  -EINVAL;
23367fc3ff9SGagandeep Singh 
23467fc3ff9SGagandeep Singh 	/* Load the device-tree driver */
23567fc3ff9SGagandeep Singh 	rc = of_init();
236*b1bc1afaSGagandeep Singh 	if (rc) {
237*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("of_init failed with ret: %d", rc);
23867fc3ff9SGagandeep Singh 		goto err;
239*b1bc1afaSGagandeep Singh 	}
24067fc3ff9SGagandeep Singh 
24167fc3ff9SGagandeep Singh 	np = of_find_compatible_node(NULL, NULL, "fsl,pfe");
24267fc3ff9SGagandeep Singh 	if (!np) {
243*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("Invalid device node");
24467fc3ff9SGagandeep Singh 		rc = -EINVAL;
24567fc3ff9SGagandeep Singh 		goto err;
24667fc3ff9SGagandeep Singh 	}
24767fc3ff9SGagandeep Singh 
24867fc3ff9SGagandeep Singh 	addr = of_get_address(np, 0, &cbus_size, NULL);
249*b1bc1afaSGagandeep Singh 	if (!addr) {
250*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("of_get_address cannot return qman address\n");
25167fc3ff9SGagandeep Singh 		goto err;
252*b1bc1afaSGagandeep Singh 	}
25367fc3ff9SGagandeep Singh 	cbus_addr = of_translate_address(np, addr);
254*b1bc1afaSGagandeep Singh 	if (!cbus_addr) {
255*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("of_translate_address failed\n");
25667fc3ff9SGagandeep Singh 		goto err;
257*b1bc1afaSGagandeep Singh 	}
25867fc3ff9SGagandeep Singh 
25967fc3ff9SGagandeep Singh 	addr = of_get_address(np, 1, &ddr_size, NULL);
260*b1bc1afaSGagandeep Singh 	if (!addr) {
261*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("of_get_address cannot return qman address\n");
26267fc3ff9SGagandeep Singh 		goto err;
263*b1bc1afaSGagandeep Singh 	}
26467fc3ff9SGagandeep Singh 
26567fc3ff9SGagandeep Singh 	g_pfe->ddr_phys_baseaddr = of_translate_address(np, addr);
266*b1bc1afaSGagandeep Singh 	if (!g_pfe->ddr_phys_baseaddr) {
267*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("of_translate_address failed\n");
26867fc3ff9SGagandeep Singh 		goto err;
269*b1bc1afaSGagandeep Singh 	}
27067fc3ff9SGagandeep Singh 
27167fc3ff9SGagandeep Singh 	g_pfe->ddr_size = ddr_size;
27267fc3ff9SGagandeep Singh 	g_pfe->cbus_size = cbus_size;
27367fc3ff9SGagandeep Singh 
27467fc3ff9SGagandeep Singh 	fd = open("/dev/mem", O_RDWR);
27567fc3ff9SGagandeep Singh 	g_pfe->cbus_baseaddr = mmap(NULL, cbus_size, PROT_READ | PROT_WRITE,
27667fc3ff9SGagandeep Singh 					MAP_SHARED, fd, cbus_addr);
27767fc3ff9SGagandeep Singh 	close(fd);
27867fc3ff9SGagandeep Singh 	if (g_pfe->cbus_baseaddr == MAP_FAILED) {
279*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("Can not map cbus base");
28067fc3ff9SGagandeep Singh 		rc = -EINVAL;
28167fc3ff9SGagandeep Singh 		goto err;
28267fc3ff9SGagandeep Singh 	}
28367fc3ff9SGagandeep Singh 
28467fc3ff9SGagandeep Singh 	/* Read interface count */
28567fc3ff9SGagandeep Singh 	prop = of_get_property(np, "fsl,pfe-num-interfaces", &size);
28667fc3ff9SGagandeep Singh 	if (!prop) {
287*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("Failed to read number of interfaces");
28867fc3ff9SGagandeep Singh 		rc = -ENXIO;
28967fc3ff9SGagandeep Singh 		goto err_prop;
29067fc3ff9SGagandeep Singh 	}
29167fc3ff9SGagandeep Singh 
29267fc3ff9SGagandeep Singh 	interface_count = rte_be_to_cpu_32((unsigned int)*prop);
29367fc3ff9SGagandeep Singh 	if (interface_count <= 0) {
294*b1bc1afaSGagandeep Singh 		PFE_PMD_ERR("No ethernet interface count : %d",
295*b1bc1afaSGagandeep Singh 				interface_count);
29667fc3ff9SGagandeep Singh 		rc = -ENXIO;
29767fc3ff9SGagandeep Singh 		goto err_prop;
29867fc3ff9SGagandeep Singh 	}
299*b1bc1afaSGagandeep Singh 	PFE_PMD_INFO("num interfaces = %d ", interface_count);
300*b1bc1afaSGagandeep Singh 
30167fc3ff9SGagandeep Singh 	g_pfe->max_intf  = interface_count;
30267fc3ff9SGagandeep Singh 	pfe_soc_version_get();
30367fc3ff9SGagandeep Singh eth_init:
30467fc3ff9SGagandeep Singh 	if (init_params.gem_id < 0)
30567fc3ff9SGagandeep Singh 		gem_id = g_pfe->nb_devs;
30667fc3ff9SGagandeep Singh 	else
30767fc3ff9SGagandeep Singh 		gem_id = init_params.gem_id;
30867fc3ff9SGagandeep Singh 
30967fc3ff9SGagandeep Singh 	RTE_LOG(INFO, PMD, "Init pmd_pfe for %s gem-id %d(given =%d)\n",
31067fc3ff9SGagandeep Singh 		name, gem_id, init_params.gem_id);
31167fc3ff9SGagandeep Singh 
31267fc3ff9SGagandeep Singh 	rc = pfe_eth_init(vdev, g_pfe, gem_id);
31367fc3ff9SGagandeep Singh 	if (rc < 0)
31467fc3ff9SGagandeep Singh 		goto err_eth;
31567fc3ff9SGagandeep Singh 	else
31667fc3ff9SGagandeep Singh 		g_pfe->nb_devs++;
31767fc3ff9SGagandeep Singh 
31867fc3ff9SGagandeep Singh 	return 0;
31967fc3ff9SGagandeep Singh 
32067fc3ff9SGagandeep Singh err_eth:
32167fc3ff9SGagandeep Singh err_prop:
32267fc3ff9SGagandeep Singh 	munmap(g_pfe->cbus_baseaddr, cbus_size);
32367fc3ff9SGagandeep Singh err:
32467fc3ff9SGagandeep Singh 	rte_free(g_pfe);
32567fc3ff9SGagandeep Singh 	return rc;
32667fc3ff9SGagandeep Singh }
32767fc3ff9SGagandeep Singh 
32867fc3ff9SGagandeep Singh static int
32967fc3ff9SGagandeep Singh pmd_pfe_remove(struct rte_vdev_device *vdev)
33067fc3ff9SGagandeep Singh {
33167fc3ff9SGagandeep Singh 	const char *name;
33267fc3ff9SGagandeep Singh 	struct rte_eth_dev *eth_dev = NULL;
33367fc3ff9SGagandeep Singh 
33467fc3ff9SGagandeep Singh 	name = rte_vdev_device_name(vdev);
33567fc3ff9SGagandeep Singh 	if (name == NULL)
33667fc3ff9SGagandeep Singh 		return -EINVAL;
33767fc3ff9SGagandeep Singh 
338*b1bc1afaSGagandeep Singh 	PFE_PMD_INFO("Closing eventdev sw device %s", name);
339*b1bc1afaSGagandeep Singh 
34067fc3ff9SGagandeep Singh 	if (!g_pfe)
34167fc3ff9SGagandeep Singh 		return 0;
34267fc3ff9SGagandeep Singh 
34367fc3ff9SGagandeep Singh 	eth_dev = rte_eth_dev_allocated(name);
34467fc3ff9SGagandeep Singh 	if (eth_dev == NULL)
34567fc3ff9SGagandeep Singh 		return -ENODEV;
34667fc3ff9SGagandeep Singh 
34767fc3ff9SGagandeep Singh 	pfe_eth_exit(eth_dev, g_pfe);
34867fc3ff9SGagandeep Singh 	munmap(g_pfe->cbus_baseaddr, g_pfe->cbus_size);
34967fc3ff9SGagandeep Singh 
35067fc3ff9SGagandeep Singh 	return 0;
35167fc3ff9SGagandeep Singh }
35267fc3ff9SGagandeep Singh 
35367fc3ff9SGagandeep Singh static
35467fc3ff9SGagandeep Singh struct rte_vdev_driver pmd_pfe_drv = {
35567fc3ff9SGagandeep Singh 	.probe = pmd_pfe_probe,
35667fc3ff9SGagandeep Singh 	.remove = pmd_pfe_remove,
35767fc3ff9SGagandeep Singh };
35867fc3ff9SGagandeep Singh 
35967fc3ff9SGagandeep Singh RTE_PMD_REGISTER_VDEV(PFE_NAME_PMD, pmd_pfe_drv);
36067fc3ff9SGagandeep Singh RTE_PMD_REGISTER_PARAM_STRING(PFE_NAME_PMD, PFE_VDEV_GEM_ID_ARG "=<int> ");
361*b1bc1afaSGagandeep Singh 
362*b1bc1afaSGagandeep Singh RTE_INIT(pfe_pmd_init_log)
363*b1bc1afaSGagandeep Singh {
364*b1bc1afaSGagandeep Singh 	pfe_logtype_pmd = rte_log_register("pmd.net.pfe");
365*b1bc1afaSGagandeep Singh 	if (pfe_logtype_pmd >= 0)
366*b1bc1afaSGagandeep Singh 		rte_log_set_level(pfe_logtype_pmd, RTE_LOG_NOTICE);
367*b1bc1afaSGagandeep Singh }
368