xref: /dpdk/lib/eventdev/eventdev_pmd_pci.h (revision 1f37cb2bb46b1fd403faa7c3bf8884e6a4dfde66)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2016-2017 Cavium, Inc
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #ifndef _RTE_EVENTDEV_PMD_PCI_H_
699a2dd95SBruce Richardson #define _RTE_EVENTDEV_PMD_PCI_H_
799a2dd95SBruce Richardson 
82c552933SBrian Dooley #ifdef __cplusplus
92c552933SBrian Dooley extern "C" {
102c552933SBrian Dooley #endif
112c552933SBrian Dooley 
1299a2dd95SBruce Richardson /** @file
1399a2dd95SBruce Richardson  * RTE Eventdev PCI PMD APIs
1499a2dd95SBruce Richardson  *
1599a2dd95SBruce Richardson  * @note
1699a2dd95SBruce Richardson  * These API are from event PCI PMD only and user applications should not call
1799a2dd95SBruce Richardson  * them directly.
1899a2dd95SBruce Richardson  */
1999a2dd95SBruce Richardson 
2099a2dd95SBruce Richardson #include <string.h>
2199a2dd95SBruce Richardson 
2299a2dd95SBruce Richardson #include <rte_config.h>
2399a2dd95SBruce Richardson #include <rte_eal.h>
2499a2dd95SBruce Richardson #include <rte_lcore.h>
2599a2dd95SBruce Richardson #include <rte_pci.h>
26*1f37cb2bSDavid Marchand #include <bus_pci_driver.h>
2799a2dd95SBruce Richardson 
2899a2dd95SBruce Richardson #include "eventdev_pmd.h"
2999a2dd95SBruce Richardson 
3099a2dd95SBruce Richardson typedef int (*eventdev_pmd_pci_callback_t)(struct rte_eventdev *dev);
3199a2dd95SBruce Richardson 
3299a2dd95SBruce Richardson /**
3399a2dd95SBruce Richardson  * @internal
3499a2dd95SBruce Richardson  * Wrapper for use by pci drivers as a .probe function to attach to an event
3599a2dd95SBruce Richardson  * interface.  Same as rte_event_pmd_pci_probe, except caller can specify
3699a2dd95SBruce Richardson  * the name.
3799a2dd95SBruce Richardson  */
3823d06e37SPavan Nikhilesh __rte_internal
3999a2dd95SBruce Richardson static inline int
4099a2dd95SBruce Richardson rte_event_pmd_pci_probe_named(struct rte_pci_driver *pci_drv,
4199a2dd95SBruce Richardson 			      struct rte_pci_device *pci_dev,
4299a2dd95SBruce Richardson 			      size_t private_data_size,
4399a2dd95SBruce Richardson 			      eventdev_pmd_pci_callback_t devinit,
4499a2dd95SBruce Richardson 			      const char *name)
4599a2dd95SBruce Richardson {
4699a2dd95SBruce Richardson 	struct rte_eventdev *eventdev;
4799a2dd95SBruce Richardson 	int retval;
4899a2dd95SBruce Richardson 
4999a2dd95SBruce Richardson 	if (devinit == NULL)
5099a2dd95SBruce Richardson 		return -EINVAL;
5199a2dd95SBruce Richardson 
5299a2dd95SBruce Richardson 	eventdev = rte_event_pmd_allocate(name,
5399a2dd95SBruce Richardson 			 pci_dev->device.numa_node);
5499a2dd95SBruce Richardson 	if (eventdev == NULL)
5599a2dd95SBruce Richardson 		return -ENOMEM;
5699a2dd95SBruce Richardson 
5799a2dd95SBruce Richardson 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
5899a2dd95SBruce Richardson 		eventdev->data->dev_private =
5999a2dd95SBruce Richardson 				rte_zmalloc_socket(
6099a2dd95SBruce Richardson 						"eventdev private structure",
6199a2dd95SBruce Richardson 						private_data_size,
6299a2dd95SBruce Richardson 						RTE_CACHE_LINE_SIZE,
6399a2dd95SBruce Richardson 						rte_socket_id());
6499a2dd95SBruce Richardson 
6599a2dd95SBruce Richardson 		if (eventdev->data->dev_private == NULL)
6699a2dd95SBruce Richardson 			rte_panic("Cannot allocate memzone for private "
6799a2dd95SBruce Richardson 					"device data");
6899a2dd95SBruce Richardson 	}
6999a2dd95SBruce Richardson 
7099a2dd95SBruce Richardson 	eventdev->dev = &pci_dev->device;
7199a2dd95SBruce Richardson 
7299a2dd95SBruce Richardson 	/* Invoke PMD device initialization function */
7399a2dd95SBruce Richardson 	retval = devinit(eventdev);
74d35e6132SPavan Nikhilesh 	if (retval == 0) {
75d35e6132SPavan Nikhilesh 		event_dev_probing_finish(eventdev);
7699a2dd95SBruce Richardson 		return 0;
77d35e6132SPavan Nikhilesh 	}
7899a2dd95SBruce Richardson 
7999a2dd95SBruce Richardson 	RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)"
8099a2dd95SBruce Richardson 			" failed", pci_drv->driver.name,
8199a2dd95SBruce Richardson 			(unsigned int) pci_dev->id.vendor_id,
8299a2dd95SBruce Richardson 			(unsigned int) pci_dev->id.device_id);
8399a2dd95SBruce Richardson 
8499a2dd95SBruce Richardson 	rte_event_pmd_release(eventdev);
8599a2dd95SBruce Richardson 
8699a2dd95SBruce Richardson 	return -ENXIO;
8799a2dd95SBruce Richardson }
8899a2dd95SBruce Richardson 
8999a2dd95SBruce Richardson /**
9099a2dd95SBruce Richardson  * @internal
9199a2dd95SBruce Richardson  * Wrapper for use by pci drivers as a .probe function to attach to a event
9299a2dd95SBruce Richardson  * interface.
9399a2dd95SBruce Richardson  */
9423d06e37SPavan Nikhilesh __rte_internal
9599a2dd95SBruce Richardson static inline int
9699a2dd95SBruce Richardson rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv,
9799a2dd95SBruce Richardson 			    struct rte_pci_device *pci_dev,
9899a2dd95SBruce Richardson 			    size_t private_data_size,
9999a2dd95SBruce Richardson 			    eventdev_pmd_pci_callback_t devinit)
10099a2dd95SBruce Richardson {
10199a2dd95SBruce Richardson 	char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
10299a2dd95SBruce Richardson 
10399a2dd95SBruce Richardson 	rte_pci_device_name(&pci_dev->addr, eventdev_name,
10499a2dd95SBruce Richardson 			sizeof(eventdev_name));
10599a2dd95SBruce Richardson 
10699a2dd95SBruce Richardson 	return rte_event_pmd_pci_probe_named(pci_drv,
10799a2dd95SBruce Richardson 					     pci_dev,
10899a2dd95SBruce Richardson 					     private_data_size,
10999a2dd95SBruce Richardson 					     devinit,
11099a2dd95SBruce Richardson 					     eventdev_name);
11199a2dd95SBruce Richardson }
11299a2dd95SBruce Richardson 
11399a2dd95SBruce Richardson /**
11499a2dd95SBruce Richardson  * @internal
11599a2dd95SBruce Richardson  * Wrapper for use by pci drivers as a .remove function to detach a event
11699a2dd95SBruce Richardson  * interface.
11799a2dd95SBruce Richardson  */
11823d06e37SPavan Nikhilesh __rte_internal
11999a2dd95SBruce Richardson static inline int
12099a2dd95SBruce Richardson rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev,
12199a2dd95SBruce Richardson 			     eventdev_pmd_pci_callback_t devuninit)
12299a2dd95SBruce Richardson {
12399a2dd95SBruce Richardson 	struct rte_eventdev *eventdev;
12499a2dd95SBruce Richardson 	char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
12599a2dd95SBruce Richardson 	int ret = 0;
12699a2dd95SBruce Richardson 
12799a2dd95SBruce Richardson 	if (pci_dev == NULL)
12899a2dd95SBruce Richardson 		return -EINVAL;
12999a2dd95SBruce Richardson 
13099a2dd95SBruce Richardson 	rte_pci_device_name(&pci_dev->addr, eventdev_name,
13199a2dd95SBruce Richardson 			sizeof(eventdev_name));
13299a2dd95SBruce Richardson 
13399a2dd95SBruce Richardson 	eventdev = rte_event_pmd_get_named_dev(eventdev_name);
13499a2dd95SBruce Richardson 	if (eventdev == NULL)
13599a2dd95SBruce Richardson 		return -ENODEV;
13699a2dd95SBruce Richardson 
13799a2dd95SBruce Richardson 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
13899a2dd95SBruce Richardson 		ret = rte_event_dev_close(eventdev->data->dev_id);
13999a2dd95SBruce Richardson 		if (ret < 0)
14099a2dd95SBruce Richardson 			return ret;
14199a2dd95SBruce Richardson 	}
14299a2dd95SBruce Richardson 
14399a2dd95SBruce Richardson 	/* Invoke PMD device un-init function */
14499a2dd95SBruce Richardson 	if (devuninit)
14599a2dd95SBruce Richardson 		ret = devuninit(eventdev);
14699a2dd95SBruce Richardson 	if (ret)
14799a2dd95SBruce Richardson 		return ret;
14899a2dd95SBruce Richardson 
14999a2dd95SBruce Richardson 	/* Free event device */
15099a2dd95SBruce Richardson 	rte_event_pmd_release(eventdev);
15199a2dd95SBruce Richardson 
15299a2dd95SBruce Richardson 	eventdev->dev = NULL;
15399a2dd95SBruce Richardson 
15499a2dd95SBruce Richardson 	return 0;
15599a2dd95SBruce Richardson }
15699a2dd95SBruce Richardson 
1572c552933SBrian Dooley #ifdef __cplusplus
1582c552933SBrian Dooley }
1592c552933SBrian Dooley #endif
1602c552933SBrian Dooley 
16199a2dd95SBruce Richardson #endif /* _RTE_EVENTDEV_PMD_PCI_H_ */
162