#include "ssovf_evdev.h"
#include "timvf_evdev.h"
-int otx_logtype_ssovf;
static uint8_t timvf_enable_stats;
-RTE_INIT(otx_ssovf_init_log)
-{
- otx_logtype_ssovf = rte_log_register("pmd.event.octeontx");
- if (otx_logtype_ssovf >= 0)
- rte_log_set_level(otx_logtype_ssovf, RTE_LOG_NOTICE);
-}
+RTE_LOG_REGISTER(otx_logtype_ssovf, pmd.event.octeontx, NOTICE);
/* SSOPF Mailbox messages */
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)
}
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",