numam-dpdk/lib/librte_ethdev/rte_ethdev_driver.h
Ferruh Yigit 70815c9eca ethdev: add new offload flag to keep CRC
DEV_RX_OFFLOAD_KEEP_CRC offload flag is added. PMDs that support
keeping CRC should advertise this offload capability.

DEV_RX_OFFLOAD_CRC_STRIP flag will remain one more release
default behavior in PMDs are to keep the CRC until this flag removed

Until DEV_RX_OFFLOAD_CRC_STRIP flag is removed:
- Setting both KEEP_CRC & CRC_STRIP is INVALID
- Setting only CRC_STRIP PMD should strip the CRC
- Setting only KEEP_CRC PMD should keep the CRC
- Not setting both PMD should keep the CRC

A helper function rte_eth_dev_is_keep_crc() has been added to be able to
change the no flag behavior with minimal changes in PMDs.

The PMDs that doesn't report the DEV_RX_OFFLOAD_KEEP_CRC offload can
remove rte_eth_dev_is_keep_crc() checks next release, related code
commented to help the maintenance task.

And DEV_RX_OFFLOAD_CRC_STRIP has been added to virtual drivers since
they don't use CRC at all, when an application requires this offload
virtual PMDs should not return error.

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Allain Legacy <allain.legacy@windriver.com>
Acked-by: Andrew Rybchenko <arybchenko@solarflare.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
2018-07-03 01:35:58 +02:00

359 lines
9.2 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2017 Intel Corporation
*/
#ifndef _RTE_ETHDEV_DRIVER_H_
#define _RTE_ETHDEV_DRIVER_H_
/**
* @file
*
* RTE Ethernet Device PMD API
*
* These APIs for the use from Ethernet drivers, user applications shouldn't
* use them.
*
*/
#include <rte_ethdev.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @internal
* Returns a ethdev slot specified by the unique identifier name.
*
* @param name
* The pointer to the Unique identifier name for each Ethernet device
* @return
* - The pointer to the ethdev slot, on success. NULL on error
*/
struct rte_eth_dev *rte_eth_dev_allocated(const char *name);
/**
* @internal
* Allocates a new ethdev slot for an ethernet device and returns the pointer
* to that slot for the driver to use.
*
* @param name Unique identifier name for each Ethernet device
* @param type Device type of this Ethernet device
* @return
* - Slot in the rte_dev_devices array for a new device;
*/
struct rte_eth_dev *rte_eth_dev_allocate(const char *name);
/**
* @internal
* Attach to the ethdev already initialized by the primary
* process.
*
* @param name Ethernet device's name.
* @return
* - Success: Slot in the rte_dev_devices array for attached
* device.
* - Error: Null pointer.
*/
struct rte_eth_dev *rte_eth_dev_attach_secondary(const char *name);
/**
* @internal
* Release the specified ethdev port.
*
* @param eth_dev
* The *eth_dev* pointer is the address of the *rte_eth_dev* structure.
* @return
* - 0 on success, negative on error
*/
int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev);
/**
* @internal
* Release device queues and clear its configuration to force the user
* application to reconfigure it. It is for internal use only.
*
* @param dev
* Pointer to struct rte_eth_dev.
*
* @return
* void
*/
void _rte_eth_dev_reset(struct rte_eth_dev *dev);
/**
* @internal Executes all the user application registered callbacks for
* the specific device. It is for DPDK internal user only. User
* application should not call it directly.
*
* @param dev
* Pointer to struct rte_eth_dev.
* @param event
* Eth device interrupt event type.
* @param ret_param
* To pass data back to user application.
* This allows the user application to decide if a particular function
* is permitted or not.
*
* @return
* int
*/
int _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
enum rte_eth_event_type event, void *ret_param);
/**
* @internal
* This is the last step of device probing.
* It must be called after a port is allocated and initialized successfully.
*
* The notification RTE_ETH_EVENT_NEW is sent to other entities
* (libraries and applications).
* The state is set as RTE_ETH_DEV_ATTACHED.
*
* @param dev
* New ethdev port.
*/
void rte_eth_dev_probing_finish(struct rte_eth_dev *dev);
/**
* Create memzone for HW rings.
* malloc can't be used as the physical address is needed.
* If the memzone is already created, then this function returns a ptr
* to the old one.
*
* @param eth_dev
* The *eth_dev* pointer is the address of the *rte_eth_dev* structure
* @param name
* The name of the memory zone
* @param queue_id
* The index of the queue to add to name
* @param size
* The sizeof of the memory area
* @param align
* Alignment for resulting memzone. Must be a power of 2.
* @param socket_id
* The *socket_id* argument is the socket identifier in case of NUMA.
*/
const struct rte_memzone *
rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name,
uint16_t queue_id, size_t size,
unsigned align, int socket_id);
/**
* @internal
* Atomically set the link status for the specific device.
* It is for use by DPDK device driver use only.
* User applications should not call it
*
* @param dev
* Pointer to struct rte_eth_dev.
* @param link
* New link status value.
* @return
* Same convention as eth_link_update operation.
* 0 if link up status has changed
* -1 if link up status was unchanged
*/
static inline int
rte_eth_linkstatus_set(struct rte_eth_dev *dev,
const struct rte_eth_link *new_link)
{
volatile uint64_t *dev_link
= (volatile uint64_t *)&(dev->data->dev_link);
union {
uint64_t val64;
struct rte_eth_link link;
} orig;
RTE_BUILD_BUG_ON(sizeof(*new_link) != sizeof(uint64_t));
orig.val64 = rte_atomic64_exchange(dev_link,
*(const uint64_t *)new_link);
return (orig.link.link_status == new_link->link_status) ? -1 : 0;
}
/**
* @internal
* Atomically get the link speed and status.
*
* @param dev
* Pointer to struct rte_eth_dev.
* @param link
* link status value.
*/
static inline void
rte_eth_linkstatus_get(const struct rte_eth_dev *dev,
struct rte_eth_link *link)
{
volatile uint64_t *src = (uint64_t *)&(dev->data->dev_link);
uint64_t *dst = (uint64_t *)link;
RTE_BUILD_BUG_ON(sizeof(*link) != sizeof(uint64_t));
#ifdef __LP64__
/* if cpu arch has 64 bit unsigned lon then implicitly atomic */
*dst = *src;
#else
/* can't use rte_atomic64_read because it returns signed int */
do {
*dst = *src;
} while (!rte_atomic64_cmpset(src, *dst, *dst));
#endif
}
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice.
*
* Allocate an unique switch domain identifier.
*
* A pool of switch domain identifiers which can be allocated on request. This
* will enabled devices which support the concept of switch domains to request
* a switch domain id which is guaranteed to be unique from other devices
* running in the same process.
*
* @param domain_id
* switch domain identifier parameter to pass back to application
*
* @return
* Negative errno value on error, 0 on success.
*/
int __rte_experimental
rte_eth_switch_domain_alloc(uint16_t *domain_id);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice.
*
* Free switch domain.
*
* Return a switch domain identifier to the pool of free identifiers after it is
* no longer in use by device.
*
* @param domain_id
* switch domain identifier to free
*
* @return
* Negative errno value on error, 0 on success.
*/
int __rte_experimental
rte_eth_switch_domain_free(uint16_t domain_id);
/** Generic Ethernet device arguments */
struct rte_eth_devargs {
uint16_t ports[RTE_MAX_ETHPORTS];
/** port/s number to enable on a multi-port single function */
uint16_t nb_ports;
/** number of ports in ports field */
uint16_t representor_ports[RTE_MAX_ETHPORTS];
/** representor port/s identifier to enable on device */
uint16_t nb_representor_ports;
/** number of ports in representor port field */
};
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice.
*
* PMD helper function to parse ethdev arguments
*
* @param devargs
* device arguments
* @param eth_devargs
* parsed ethdev specific arguments.
*
* @return
* Negative errno value on error, 0 on success.
*/
int __rte_experimental
rte_eth_devargs_parse(const char *devargs, struct rte_eth_devargs *eth_devargs);
typedef int (*ethdev_init_t)(struct rte_eth_dev *ethdev, void *init_params);
typedef int (*ethdev_bus_specific_init)(struct rte_eth_dev *ethdev,
void *bus_specific_init_params);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice.
*
* PMD helper function for the creation of a new ethdev ports.
*
* @param device
* rte_device handle.
* @param name
* port name.
* @param priv_data_size
* size of private data required for port.
* @param bus_specific_init
* port bus specific initialisation callback function
* @param bus_init_params
* port bus specific initialisation parameters
* @param ethdev_init
* device specific port initialization callback function
* @param init_params
* port initialisation parameters
*
* @return
* Negative errno value on error, 0 on success.
*/
int __rte_experimental
rte_eth_dev_create(struct rte_device *device, const char *name,
size_t priv_data_size,
ethdev_bus_specific_init bus_specific_init, void *bus_init_params,
ethdev_init_t ethdev_init, void *init_params);
typedef int (*ethdev_uninit_t)(struct rte_eth_dev *ethdev);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice.
*
* PMD helper function for cleaing up the resources of a ethdev port on it's
* destruction.
*
* @param ethdev
* ethdev handle of port.
* @param ethdev_uninit
* device specific port un-initialise callback function
*
* @return
* Negative errno value on error, 0 on success.
*/
int __rte_experimental
rte_eth_dev_destroy(struct rte_eth_dev *ethdev, ethdev_uninit_t ethdev_uninit);
/**
* PMD helper function to check if keeping CRC is requested
*
* @note
* When CRC_STRIP offload flag is removed and default behavior switch to
* strip CRC, as planned, this helper function is not that useful and will be
* removed. In PMDs this function will be replaced with check:
* if (offloads & DEV_RX_OFFLOAD_KEEP_CRC)
*
* @param rx_offloads
* offload bits to be applied
*
* @return
* Return positive if keeping CRC is requested,
* zero if stripping CRC is requested
*/
static inline int
rte_eth_dev_must_keep_crc(uint64_t rx_offloads)
{
if (rx_offloads & DEV_RX_OFFLOAD_CRC_STRIP)
return 0;
/* no KEEP_CRC or CRC_STRIP offload flags means keep CRC */
return 1;
}
#ifdef __cplusplus
}
#endif
#endif /* _RTE_ETHDEV_DRIVER_H_ */