#include <rte_debug.h>
#include <rte_dev.h>
#include <rte_eal.h>
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
#include <rte_event_eth_rx_adapter.h>
#include <rte_kvargs.h>
#include <rte_lcore.h>
RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES|
RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK |
RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT |
- RTE_EVENT_DEV_CAP_NONSEQ_MODE;
+ RTE_EVENT_DEV_CAP_NONSEQ_MODE |
+ RTE_EVENT_DEV_CAP_CARRY_FLOW_ID;
}
port_conf->new_event_threshold = edev->max_num_events;
port_conf->dequeue_depth = 1;
port_conf->enqueue_depth = 1;
- port_conf->disable_implicit_release = 0;
+ port_conf->event_port_cfg = 0;
}
static void
const struct rte_eth_dev *eth_dev, int32_t rx_queue_id,
const struct rte_event_eth_rx_adapter_queue_conf *queue_conf)
{
- int ret = 0;
const struct octeontx_nic *nic = eth_dev->data->dev_private;
struct ssovf_evdev *edev = ssovf_pmd_priv(dev);
+ uint16_t free_idx = UINT16_MAX;
+ struct octeontx_rxq *rxq;
pki_mod_qos_t pki_qos;
- RTE_SET_USED(dev);
+ uint8_t found = false;
+ int i, ret = 0;
+ void *old_ptr;
ret = strncmp(eth_dev->data->name, "eth_octeontx", 12);
if (ret)
return -EINVAL;
- if (rx_queue_id >= 0)
- return -EINVAL;
-
if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_PARALLEL)
return -ENOTSUP;
+ /* eth_octeontx only supports one rq. */
+ rx_queue_id = rx_queue_id == -1 ? 0 : rx_queue_id;
+ rxq = eth_dev->data->rx_queues[rx_queue_id];
+ /* Add rxq pool to list of used pools and reduce available events. */
+ for (i = 0; i < edev->rxq_pools; i++) {
+ if (edev->rxq_pool_array[i] == (uintptr_t)rxq->pool) {
+ edev->rxq_pool_rcnt[i]++;
+ found = true;
+ break;
+ } else if (free_idx == UINT16_MAX &&
+ edev->rxq_pool_array[i] == 0) {
+ free_idx = i;
+ }
+ }
+
+ if (!found) {
+ uint16_t idx;
+
+ if (edev->available_events < rxq->pool->size) {
+ ssovf_log_err(
+ "Max available events %"PRIu32" requested events in rxq pool %"PRIu32"",
+ edev->available_events, rxq->pool->size);
+ return -ENOMEM;
+ }
+
+ if (free_idx != UINT16_MAX) {
+ idx = free_idx;
+ } else {
+ old_ptr = edev->rxq_pool_array;
+ edev->rxq_pools++;
+ edev->rxq_pool_array = rte_realloc(
+ edev->rxq_pool_array,
+ sizeof(uint64_t) * edev->rxq_pools, 0);
+ if (edev->rxq_pool_array == NULL) {
+ edev->rxq_pools--;
+ edev->rxq_pool_array = old_ptr;
+ return -ENOMEM;
+ }
+
+ old_ptr = edev->rxq_pool_rcnt;
+ edev->rxq_pool_rcnt = rte_realloc(
+ edev->rxq_pool_rcnt,
+ sizeof(uint8_t) * edev->rxq_pools, 0);
+ if (edev->rxq_pool_rcnt == NULL) {
+ edev->rxq_pools--;
+ edev->rxq_pool_rcnt = old_ptr;
+ return -ENOMEM;
+ }
+ idx = edev->rxq_pools - 1;
+ }
+
+ edev->rxq_pool_array[idx] = (uintptr_t)rxq->pool;
+ edev->rxq_pool_rcnt[idx] = 1;
+ edev->available_events -= rxq->pool->size;
+ }
+
memset(&pki_qos, 0, sizeof(pki_mod_qos_t));
pki_qos.port_type = 0;
ssovf_eth_rx_adapter_queue_del(const struct rte_eventdev *dev,
const struct rte_eth_dev *eth_dev, int32_t rx_queue_id)
{
- int ret = 0;
const struct octeontx_nic *nic = eth_dev->data->dev_private;
+ struct ssovf_evdev *edev = ssovf_pmd_priv(dev);
+ struct octeontx_rxq *rxq;
pki_del_qos_t pki_qos;
- RTE_SET_USED(dev);
+ uint8_t found = false;
+ int i, ret = 0;
+
+ rx_queue_id = rx_queue_id == -1 ? 0 : rx_queue_id;
+ rxq = eth_dev->data->rx_queues[rx_queue_id];
+ for (i = 0; i < edev->rxq_pools; i++) {
+ if (edev->rxq_pool_array[i] == (uintptr_t)rxq->pool) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ edev->rxq_pool_rcnt[i]--;
+ if (edev->rxq_pool_rcnt[i] == 0)
+ edev->rxq_pool_array[i] = 0;
+ edev->available_events += rxq->pool->size;
+ }
ret = strncmp(eth_dev->data->name, "eth_octeontx", 12);
if (ret)
}
static int
-ssovf_selftest(const char *key __rte_unused, const char *value,
- void *opaque)
+ssovf_parsekv(const char *key __rte_unused, const char *value, void *opaque)
{
int *flag = opaque;
*flag = !!atoi(value);
const char *name;
const char *params;
int ret;
- int selftest = 0;
static const char *const args[] = {
- SSOVF_SELFTEST_ARG,
TIMVF_ENABLE_STATS_ARG,
NULL
};
"Ignoring unsupported params supplied '%s'",
name);
} else {
- int ret = rte_kvargs_process(kvlist,
- SSOVF_SELFTEST_ARG,
- ssovf_selftest, &selftest);
- if (ret != 0) {
- ssovf_log_err("%s: Error in selftest", name);
- rte_kvargs_free(kvlist);
- return ret;
- }
-
- ret = rte_kvargs_process(kvlist,
- TIMVF_ENABLE_STATS_ARG,
- ssovf_selftest, &timvf_enable_stats);
+ ret = rte_kvargs_process(kvlist, TIMVF_ENABLE_STATS_ARG,
+ ssovf_parsekv,
+ &timvf_enable_stats);
if (ret != 0) {
ssovf_log_err("%s: Error in timvf stats", name);
rte_kvargs_free(kvlist);
}
eventdev->dev_ops = &ssovf_ops;
+ timvf_set_eventdevice(eventdev);
+
/* For secondary processes, the primary has done all the work */
if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
ssovf_fastpath_fns_set(eventdev);
edev->min_deq_timeout_ns = info.min_deq_timeout_ns;
edev->max_deq_timeout_ns = info.max_deq_timeout_ns;
edev->max_num_events = info.max_num_events;
- ssovf_log_dbg("min_deq_tmo=%"PRId64" max_deq_tmo=%"PRId64" max_evts=%d",
- info.min_deq_timeout_ns, info.max_deq_timeout_ns,
- info.max_num_events);
+ edev->available_events = info.max_num_events;
+
+ ssovf_log_dbg("min_deq_tmo=%" PRId64 " max_deq_tmo=%" PRId64
+ " max_evts=%d",
+ info.min_deq_timeout_ns, info.max_deq_timeout_ns,
+ info.max_num_events);
if (!edev->max_event_ports || !edev->max_event_queues) {
ssovf_log_err("Not enough eventdev resource queues=%d ports=%d",
edev->max_event_ports);
ssovf_init_once = 1;
- if (selftest)
- test_eventdev_octeontx();
return 0;
error: