1acb7f5474
Make rte_driver opaque for non internal users. This will make extending this object possible without breaking the ABI. Introduce a new driver header and move rte_driver definition. Update drivers and library to use the internal header. Some applications may have been dereferencing rte_driver objects, mark this object's accessors as stable. Signed-off-by: David Marchand <david.marchand@redhat.com> Acked-by: Bruce Richardson <bruce.richardson@intel.com> Acked-by: Jay Jayatheerthan <jay.jayatheerthan@intel.com> Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com> Acked-by: Akhil Goyal <gakhil@marvell.com> Acked-by: Abhinandan Gujjar <abhinandan.gujjar@intel.com>
191 lines
5.2 KiB
C
191 lines
5.2 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright (c) 2021 NVIDIA Corporation & Affiliates
|
|
*/
|
|
|
|
#ifndef BUS_AUXILIARY_DRIVER_H
|
|
#define BUS_AUXILIARY_DRIVER_H
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* Auxiliary Bus Interface.
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <limits.h>
|
|
#include <errno.h>
|
|
#include <stdint.h>
|
|
#include <inttypes.h>
|
|
|
|
#include <rte_compat.h>
|
|
#include <rte_debug.h>
|
|
#include <rte_interrupts.h>
|
|
#include <dev_driver.h>
|
|
#include <rte_kvargs.h>
|
|
|
|
#define RTE_BUS_AUXILIARY_NAME "auxiliary"
|
|
|
|
/* Forward declarations */
|
|
struct rte_auxiliary_driver;
|
|
struct rte_auxiliary_device;
|
|
|
|
/**
|
|
* Match function for the driver to decide if device can be handled.
|
|
*
|
|
* @param name
|
|
* Pointer to the auxiliary device name.
|
|
* @return
|
|
* Whether the driver can handle the auxiliary device.
|
|
*/
|
|
typedef bool (rte_auxiliary_match_t)(const char *name);
|
|
|
|
/**
|
|
* Initialization function for the driver called during auxiliary probing.
|
|
*
|
|
* @param drv
|
|
* Pointer to the auxiliary driver.
|
|
* @param dev
|
|
* Pointer to the auxiliary device.
|
|
* @return
|
|
* - 0 On success.
|
|
* - Negative value and rte_errno is set otherwise.
|
|
*/
|
|
typedef int (rte_auxiliary_probe_t)(struct rte_auxiliary_driver *drv,
|
|
struct rte_auxiliary_device *dev);
|
|
|
|
/**
|
|
* Uninitialization function for the driver called during hotplugging.
|
|
*
|
|
* @param dev
|
|
* Pointer to the auxiliary device.
|
|
* @return
|
|
* - 0 On success.
|
|
* - Negative value and rte_errno is set otherwise.
|
|
*/
|
|
typedef int (rte_auxiliary_remove_t)(struct rte_auxiliary_device *dev);
|
|
|
|
/**
|
|
* Driver-specific DMA mapping. After a successful call the device
|
|
* will be able to read/write from/to this segment.
|
|
*
|
|
* @param dev
|
|
* Pointer to the auxiliary device.
|
|
* @param addr
|
|
* Starting virtual address of memory to be mapped.
|
|
* @param iova
|
|
* Starting IOVA address of memory to be mapped.
|
|
* @param len
|
|
* Length of memory segment being mapped.
|
|
* @return
|
|
* - 0 On success.
|
|
* - Negative value and rte_errno is set otherwise.
|
|
*/
|
|
typedef int (rte_auxiliary_dma_map_t)(struct rte_auxiliary_device *dev,
|
|
void *addr, uint64_t iova, size_t len);
|
|
|
|
/**
|
|
* Driver-specific DMA un-mapping. After a successful call the device
|
|
* will not be able to read/write from/to this segment.
|
|
*
|
|
* @param dev
|
|
* Pointer to the auxiliary device.
|
|
* @param addr
|
|
* Starting virtual address of memory to be unmapped.
|
|
* @param iova
|
|
* Starting IOVA address of memory to be unmapped.
|
|
* @param len
|
|
* Length of memory segment being unmapped.
|
|
* @return
|
|
* - 0 On success.
|
|
* - Negative value and rte_errno is set otherwise.
|
|
*/
|
|
typedef int (rte_auxiliary_dma_unmap_t)(struct rte_auxiliary_device *dev,
|
|
void *addr, uint64_t iova, size_t len);
|
|
|
|
/**
|
|
* A structure describing an auxiliary device.
|
|
*/
|
|
struct rte_auxiliary_device {
|
|
RTE_TAILQ_ENTRY(rte_auxiliary_device) next; /**< Next probed device. */
|
|
struct rte_device device; /**< Inherit core device */
|
|
char name[RTE_DEV_NAME_MAX_LEN + 1]; /**< ASCII device name */
|
|
struct rte_intr_handle *intr_handle; /**< Interrupt handle */
|
|
struct rte_auxiliary_driver *driver; /**< Device driver */
|
|
};
|
|
|
|
/**
|
|
* A structure describing an auxiliary driver.
|
|
*/
|
|
struct rte_auxiliary_driver {
|
|
RTE_TAILQ_ENTRY(rte_auxiliary_driver) next; /**< Next in list. */
|
|
struct rte_driver driver; /**< Inherit core driver. */
|
|
rte_auxiliary_match_t *match; /**< Device match function. */
|
|
rte_auxiliary_probe_t *probe; /**< Device probe function. */
|
|
rte_auxiliary_remove_t *remove; /**< Device remove function. */
|
|
rte_auxiliary_dma_map_t *dma_map; /**< Device DMA map function. */
|
|
rte_auxiliary_dma_unmap_t *dma_unmap; /**< Device DMA unmap function. */
|
|
uint32_t drv_flags; /**< Flags RTE_AUXILIARY_DRV_*. */
|
|
};
|
|
|
|
/**
|
|
* @internal
|
|
* Helper macro for drivers that need to convert to struct rte_auxiliary_device.
|
|
*/
|
|
#define RTE_DEV_TO_AUXILIARY(ptr) \
|
|
container_of(ptr, struct rte_auxiliary_device, device)
|
|
|
|
#define RTE_DEV_TO_AUXILIARY_CONST(ptr) \
|
|
container_of(ptr, const struct rte_auxiliary_device, device)
|
|
|
|
#define RTE_ETH_DEV_TO_AUXILIARY(eth_dev) \
|
|
RTE_DEV_TO_AUXILIARY((eth_dev)->device)
|
|
|
|
/** Device driver needs IOVA as VA and cannot work with IOVA as PA */
|
|
#define RTE_AUXILIARY_DRV_NEED_IOVA_AS_VA 0x002
|
|
|
|
/**
|
|
* Register an auxiliary driver.
|
|
*
|
|
* @warning
|
|
* @b EXPERIMENTAL: this API may change without prior notice.
|
|
*
|
|
* @param driver
|
|
* A pointer to a rte_auxiliary_driver structure describing the driver
|
|
* to be registered.
|
|
*/
|
|
__rte_internal
|
|
void rte_auxiliary_register(struct rte_auxiliary_driver *driver);
|
|
|
|
/** Helper for auxiliary device registration from driver instance */
|
|
#define RTE_PMD_REGISTER_AUXILIARY(nm, auxiliary_drv) \
|
|
RTE_INIT(auxiliaryinitfn_ ##nm) \
|
|
{ \
|
|
(auxiliary_drv).driver.name = RTE_STR(nm); \
|
|
rte_auxiliary_register(&(auxiliary_drv)); \
|
|
} \
|
|
RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
|
|
|
|
/**
|
|
* Unregister an auxiliary driver.
|
|
*
|
|
* @warning
|
|
* @b EXPERIMENTAL: this API may change without prior notice.
|
|
*
|
|
* @param driver
|
|
* A pointer to a rte_auxiliary_driver structure describing the driver
|
|
* to be unregistered.
|
|
*/
|
|
__rte_internal
|
|
void rte_auxiliary_unregister(struct rte_auxiliary_driver *driver);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* BUS_AUXILIARY_DRIVER_H */
|