99a2dd955f
There is no reason for the DPDK libraries to all have 'librte_' prefix on the directory names. This prefix makes the directory names longer and also makes it awkward to add features referring to individual libraries in the build - should the lib names be specified with or without the prefix. Therefore, we can just remove the library prefix and use the library's unique name as the directory name, i.e. 'eal' rather than 'librte_eal' Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
159 lines
3.4 KiB
C
159 lines
3.4 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2016-2017 Cavium, Inc
|
|
*/
|
|
|
|
#ifndef _RTE_EVENTDEV_PMD_PCI_H_
|
|
#define _RTE_EVENTDEV_PMD_PCI_H_
|
|
|
|
/** @file
|
|
* RTE Eventdev PCI PMD APIs
|
|
*
|
|
* @note
|
|
* These API are from event PCI PMD only and user applications should not call
|
|
* them directly.
|
|
*/
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <string.h>
|
|
|
|
#include <rte_config.h>
|
|
#include <rte_eal.h>
|
|
#include <rte_lcore.h>
|
|
#include <rte_pci.h>
|
|
#include <rte_bus_pci.h>
|
|
|
|
#include "eventdev_pmd.h"
|
|
|
|
typedef int (*eventdev_pmd_pci_callback_t)(struct rte_eventdev *dev);
|
|
|
|
/**
|
|
* @internal
|
|
* Wrapper for use by pci drivers as a .probe function to attach to an event
|
|
* interface. Same as rte_event_pmd_pci_probe, except caller can specify
|
|
* the name.
|
|
*/
|
|
__rte_experimental
|
|
static inline int
|
|
rte_event_pmd_pci_probe_named(struct rte_pci_driver *pci_drv,
|
|
struct rte_pci_device *pci_dev,
|
|
size_t private_data_size,
|
|
eventdev_pmd_pci_callback_t devinit,
|
|
const char *name)
|
|
{
|
|
struct rte_eventdev *eventdev;
|
|
int retval;
|
|
|
|
if (devinit == NULL)
|
|
return -EINVAL;
|
|
|
|
eventdev = rte_event_pmd_allocate(name,
|
|
pci_dev->device.numa_node);
|
|
if (eventdev == NULL)
|
|
return -ENOMEM;
|
|
|
|
if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
|
|
eventdev->data->dev_private =
|
|
rte_zmalloc_socket(
|
|
"eventdev private structure",
|
|
private_data_size,
|
|
RTE_CACHE_LINE_SIZE,
|
|
rte_socket_id());
|
|
|
|
if (eventdev->data->dev_private == NULL)
|
|
rte_panic("Cannot allocate memzone for private "
|
|
"device data");
|
|
}
|
|
|
|
eventdev->dev = &pci_dev->device;
|
|
|
|
/* Invoke PMD device initialization function */
|
|
retval = devinit(eventdev);
|
|
if (retval == 0)
|
|
return 0;
|
|
|
|
RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)"
|
|
" failed", pci_drv->driver.name,
|
|
(unsigned int) pci_dev->id.vendor_id,
|
|
(unsigned int) pci_dev->id.device_id);
|
|
|
|
rte_event_pmd_release(eventdev);
|
|
|
|
return -ENXIO;
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
* Wrapper for use by pci drivers as a .probe function to attach to a event
|
|
* interface.
|
|
*/
|
|
static inline int
|
|
rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv,
|
|
struct rte_pci_device *pci_dev,
|
|
size_t private_data_size,
|
|
eventdev_pmd_pci_callback_t devinit)
|
|
{
|
|
char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
|
|
|
|
rte_pci_device_name(&pci_dev->addr, eventdev_name,
|
|
sizeof(eventdev_name));
|
|
|
|
return rte_event_pmd_pci_probe_named(pci_drv,
|
|
pci_dev,
|
|
private_data_size,
|
|
devinit,
|
|
eventdev_name);
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
* Wrapper for use by pci drivers as a .remove function to detach a event
|
|
* interface.
|
|
*/
|
|
static inline int
|
|
rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev,
|
|
eventdev_pmd_pci_callback_t devuninit)
|
|
{
|
|
struct rte_eventdev *eventdev;
|
|
char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
|
|
int ret = 0;
|
|
|
|
if (pci_dev == NULL)
|
|
return -EINVAL;
|
|
|
|
rte_pci_device_name(&pci_dev->addr, eventdev_name,
|
|
sizeof(eventdev_name));
|
|
|
|
eventdev = rte_event_pmd_get_named_dev(eventdev_name);
|
|
if (eventdev == NULL)
|
|
return -ENODEV;
|
|
|
|
if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
|
|
ret = rte_event_dev_close(eventdev->data->dev_id);
|
|
if (ret < 0)
|
|
return ret;
|
|
}
|
|
|
|
/* Invoke PMD device un-init function */
|
|
if (devuninit)
|
|
ret = devuninit(eventdev);
|
|
if (ret)
|
|
return ret;
|
|
|
|
/* Free event device */
|
|
rte_event_pmd_release(eventdev);
|
|
|
|
eventdev->dev = NULL;
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _RTE_EVENTDEV_PMD_PCI_H_ */
|