3c7f3dcfb0
This commit adds a OPDL implementation of the eventdev API. The implementation here is intended to enable the community to use the OPDL infrastructure under eventdev API. The main components of the implementation is three files: - opdl_evdev.c Creation, configuration, etc - opdl_evdev_xstats.c helper function to support stats collection - opdl_evdev.h include the main data structure of opdl device and all the function prototype need to be exposed to support eventdev API. - opdl_evdev_init.c implement all initailization helper function This commit only adds the implementation, no existing DPDK files are modified. Signed-off-by: Liang Ma <liang.j.ma@intel.com> Signed-off-by: Peter Mccarthy <peter.mccarthy@intel.com>
179 lines
3.6 KiB
C
179 lines
3.6 KiB
C
/*-
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2014 Intel Corporation
|
|
*/
|
|
|
|
#include "opdl_evdev.h"
|
|
#include "opdl_log.h"
|
|
|
|
static const char * const port_xstat_str[] = {
|
|
|
|
"claim_pkts_requested",
|
|
"claim_pkts_granted",
|
|
"claim_non_empty",
|
|
"claim_empty",
|
|
"total_cycles",
|
|
};
|
|
|
|
|
|
void
|
|
opdl_xstats_init(struct rte_eventdev *dev)
|
|
{
|
|
uint32_t i, j;
|
|
|
|
struct opdl_evdev *device = opdl_pmd_priv(dev);
|
|
|
|
if (!device->do_validation)
|
|
return;
|
|
|
|
for (i = 0; i < device->max_port_nb; i++) {
|
|
struct opdl_port *port = &device->ports[i];
|
|
|
|
for (j = 0; j < max_num_port_xstat; j++) {
|
|
uint32_t index = (i * max_num_port_xstat) + j;
|
|
|
|
/* Name */
|
|
sprintf(device->port_xstat[index].stat.name,
|
|
"port_%02u_%s",
|
|
i,
|
|
port_xstat_str[j]);
|
|
|
|
/* ID */
|
|
device->port_xstat[index].id = index;
|
|
|
|
/* Stats ptr */
|
|
device->port_xstat[index].value = &port->port_stat[j];
|
|
}
|
|
}
|
|
}
|
|
|
|
int
|
|
opdl_xstats_uninit(struct rte_eventdev *dev)
|
|
{
|
|
struct opdl_evdev *device = opdl_pmd_priv(dev);
|
|
|
|
if (!device->do_validation)
|
|
return 0;
|
|
|
|
memset(device->port_xstat,
|
|
0,
|
|
sizeof(device->port_xstat));
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
opdl_xstats_get_names(const struct rte_eventdev *dev,
|
|
enum rte_event_dev_xstats_mode mode,
|
|
uint8_t queue_port_id,
|
|
struct rte_event_dev_xstats_name *xstats_names,
|
|
unsigned int *ids, unsigned int size)
|
|
{
|
|
struct opdl_evdev *device = opdl_pmd_priv(dev);
|
|
|
|
if (!device->do_validation)
|
|
return -ENOTSUP;
|
|
|
|
if (mode == RTE_EVENT_DEV_XSTATS_DEVICE ||
|
|
mode == RTE_EVENT_DEV_XSTATS_QUEUE)
|
|
return -EINVAL;
|
|
|
|
if (queue_port_id >= device->max_port_nb)
|
|
return -EINVAL;
|
|
|
|
if (size < max_num_port_xstat)
|
|
return max_num_port_xstat;
|
|
|
|
uint32_t port_idx = queue_port_id * max_num_port_xstat;
|
|
|
|
for (uint32_t j = 0; j < max_num_port_xstat; j++) {
|
|
|
|
strcpy(xstats_names[j].name,
|
|
device->port_xstat[j + port_idx].stat.name);
|
|
ids[j] = device->port_xstat[j + port_idx].id;
|
|
}
|
|
|
|
return max_num_port_xstat;
|
|
}
|
|
|
|
int
|
|
opdl_xstats_get(const struct rte_eventdev *dev,
|
|
enum rte_event_dev_xstats_mode mode,
|
|
uint8_t queue_port_id,
|
|
const unsigned int ids[],
|
|
uint64_t values[], unsigned int n)
|
|
{
|
|
struct opdl_evdev *device = opdl_pmd_priv(dev);
|
|
|
|
if (!device->do_validation)
|
|
return -ENOTSUP;
|
|
|
|
if (mode == RTE_EVENT_DEV_XSTATS_DEVICE ||
|
|
mode == RTE_EVENT_DEV_XSTATS_QUEUE)
|
|
return -EINVAL;
|
|
|
|
if (queue_port_id >= device->max_port_nb)
|
|
return -EINVAL;
|
|
|
|
if (n > max_num_port_xstat)
|
|
return -EINVAL;
|
|
|
|
uint32_t p_start = queue_port_id * max_num_port_xstat;
|
|
uint32_t p_finish = p_start + max_num_port_xstat;
|
|
|
|
for (uint32_t i = 0; i < n; i++) {
|
|
if (ids[i] < p_start || ids[i] >= p_finish)
|
|
return -EINVAL;
|
|
|
|
values[i] = *(device->port_xstat[ids[i]].value);
|
|
}
|
|
|
|
return n;
|
|
}
|
|
|
|
uint64_t
|
|
opdl_xstats_get_by_name(const struct rte_eventdev *dev,
|
|
const char *name, unsigned int *id)
|
|
{
|
|
struct opdl_evdev *device = opdl_pmd_priv(dev);
|
|
|
|
if (!device->do_validation)
|
|
return -ENOTSUP;
|
|
|
|
uint32_t max_index = device->max_port_nb * max_num_port_xstat;
|
|
|
|
for (uint32_t i = 0; i < max_index; i++) {
|
|
|
|
if (strncmp(name,
|
|
device->port_xstat[i].stat.name,
|
|
RTE_EVENT_DEV_XSTATS_NAME_SIZE) == 0) {
|
|
if (id != NULL)
|
|
*id = i;
|
|
if (device->port_xstat[i].value)
|
|
return *(device->port_xstat[i].value);
|
|
break;
|
|
}
|
|
}
|
|
return -EINVAL;
|
|
}
|
|
|
|
int
|
|
opdl_xstats_reset(struct rte_eventdev *dev,
|
|
enum rte_event_dev_xstats_mode mode,
|
|
int16_t queue_port_id, const uint32_t ids[],
|
|
uint32_t nb_ids)
|
|
{
|
|
struct opdl_evdev *device = opdl_pmd_priv(dev);
|
|
|
|
if (!device->do_validation)
|
|
return -ENOTSUP;
|
|
|
|
RTE_SET_USED(dev);
|
|
RTE_SET_USED(mode);
|
|
RTE_SET_USED(queue_port_id);
|
|
RTE_SET_USED(ids);
|
|
RTE_SET_USED(nb_ids);
|
|
|
|
return -ENOTSUP;
|
|
}
|