* [PATCH] event/cnxk: add event vector adapter support @ 2025-05-30 16:34 pbhagavatula 2025-06-01 20:46 ` [PATCH v2] " pbhagavatula 0 siblings, 1 reply; 3+ messages in thread From: pbhagavatula @ 2025-05-30 16:34 UTC (permalink / raw) To: jerinj, Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao, Harman Kalra, Pavan Nikhilesh, Shijith Thotton Cc: dev From: Pavan Nikhilesh <pbhagavatula@marvell.com> Add event vector adapter support to CN20K event device. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- drivers/common/cnxk/roc_sso.c | 4 +- drivers/common/cnxk/roc_sso.h | 2 +- drivers/event/cnxk/cn20k_eventdev.c | 4 + drivers/event/cnxk/cnxk_vector_adptr.c | 144 +++++++++++++++++++++++++ drivers/event/cnxk/cnxk_vector_adptr.h | 22 ++++ 5 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 drivers/event/cnxk/cnxk_vector_adptr.c create mode 100644 drivers/event/cnxk/cnxk_vector_adptr.h diff --git a/drivers/common/cnxk/roc_sso.c b/drivers/common/cnxk/roc_sso.c index 4996329018fb..1d82e5b9782c 100644 --- a/drivers/common/cnxk/roc_sso.c +++ b/drivers/common/cnxk/roc_sso.c @@ -514,7 +514,8 @@ sso_agq_op_wait(struct roc_sso *roc_sso, uint16_t hwgrp) } int -roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_agq_data *data) +roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_agq_data *data, + uint32_t *agq_id) { struct sso *sso = roc_sso_to_sso_priv(roc_sso); struct sso_aggr_setconfig *req; @@ -621,6 +622,7 @@ roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_ plt_wmb(); sso->agg_used[hwgrp]++; + *agq_id = off; return 0; } diff --git a/drivers/common/cnxk/roc_sso.h b/drivers/common/cnxk/roc_sso.h index f73128087a53..f1ad34bcc745 100644 --- a/drivers/common/cnxk/roc_sso.h +++ b/drivers/common/cnxk/roc_sso.h @@ -112,7 +112,7 @@ int __roc_api roc_sso_hwgrp_stash_config(struct roc_sso *roc_sso, void __roc_api roc_sso_hws_gwc_invalidate(struct roc_sso *roc_sso, uint8_t *hws, uint8_t nb_hws); int __roc_api roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, - struct roc_sso_agq_data *data); + struct roc_sso_agq_data *data, uint32_t *agq_id); void __roc_api roc_sso_hwgrp_agq_free(struct roc_sso *roc_sso, uint16_t hwgrp, uint32_t agq_id); void __roc_api roc_sso_hwgrp_agq_release(struct roc_sso *roc_sso, uint16_t hwgrp); uint32_t __roc_api roc_sso_hwgrp_agq_from_tag(struct roc_sso *roc_sso, uint16_t hwgrp, uint32_t tag, diff --git a/drivers/event/cnxk/cn20k_eventdev.c b/drivers/event/cnxk/cn20k_eventdev.c index 0688cf97e5d6..302783380730 100644 --- a/drivers/event/cnxk/cn20k_eventdev.c +++ b/drivers/event/cnxk/cn20k_eventdev.c @@ -10,6 +10,7 @@ #include "cn20k_worker.h" #include "cnxk_common.h" #include "cnxk_eventdev.h" +#include "cnxk_vector_adptr.h" #include "cnxk_worker.h" #define CN20K_SET_EVDEV_DEQ_OP(dev, deq_op, deq_ops) \ @@ -1081,6 +1082,9 @@ static struct eventdev_ops cn20k_sso_dev_ops = { .timer_adapter_caps_get = cn20k_tim_caps_get, + .vector_adapter_caps_get = cnxk_vector_caps_get, + .vector_adapter_info_get = cnxk_vector_info_get, + .xstats_get = cnxk_sso_xstats_get, .xstats_reset = cnxk_sso_xstats_reset, .xstats_get_names = cnxk_sso_xstats_get_names, diff --git a/drivers/event/cnxk/cnxk_vector_adptr.c b/drivers/event/cnxk/cnxk_vector_adptr.c new file mode 100644 index 000000000000..5cfbf34674cf --- /dev/null +++ b/drivers/event/cnxk/cnxk_vector_adptr.c @@ -0,0 +1,144 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2025 Marvell. + */ +#include <event_vector_adapter_pmd.h> +#include <eventdev_pmd.h> + +#include "roc_api.h" + +#include "cnxk_eventdev.h" +#include "cnxk_vector_adptr.h" +#include "cnxk_worker.h" + +static int +cnxk_sso_vector_adapter_create(struct rte_event_vector_adapter *adapter) +{ + struct rte_event_vector_adapter_conf *conf; + struct cnxk_event_vector_adapter *adptr; + uint32_t agq, tag_mask, stag_mask; + struct roc_sso_agq_data data; + struct cnxk_sso_evdev *dev; + uint8_t queue_id, tt; + int rc; + + adptr = rte_zmalloc("cnxk_event_vector_adapter", sizeof(struct cnxk_event_vector_adapter), + RTE_CACHE_LINE_SIZE); + if (adptr == NULL) { + plt_err("Failed to allocate memory for vector adapter"); + return -ENOMEM; + } + + conf = &adapter->data->conf; + + queue_id = adapter->data->conf.ev.queue_id; + dev = cnxk_sso_pmd_priv(&rte_eventdevs[conf->event_dev_id]); + adapter->data->adapter_priv = adptr; + + tag_mask = conf->ev.event & 0xFFFFFFFF; + stag_mask = (conf->ev_fallback.event & 0xFFFFFFFF) >> 20; + + memset(&data, 0, sizeof(struct roc_sso_agq_data)); + data.tag = tag_mask; + data.tt = conf->ev.sched_type; + data.stag = stag_mask; + data.vwqe_aura = roc_npa_aura_handle_to_aura(conf->vector_mp->pool_id); + data.vwqe_max_sz_exp = rte_log2_u32(conf->vector_sz); + data.vwqe_wait_tmo = conf->vector_timeout_ns / ((SSO_AGGR_DEF_TMO + 1) * 100); + data.xqe_type = 0; + + agq = UINT32_MAX; + rc = roc_sso_hwgrp_agq_alloc(&dev->sso, queue_id, &data, &agq); + if (rc < 0 || agq == UINT32_MAX) { + plt_err("Failed to allocate aggregation queue for queue_id=%d", queue_id); + adapter->data->adapter_priv = NULL; + rte_free(adptr); + return rc; + } + + adptr->agq = agq; + adptr->tt = conf->ev.sched_type; + adptr->base = roc_sso_hwgrp_base_get(&dev->sso, queue_id); + + return 0; +} + +static int +cnxk_sso_vector_adapter_destroy(struct rte_event_vector_adapter *adapter) +{ + struct cnxk_event_vector_adapter *adptr; + struct cnxk_sso_evdev *dev; + uint16_t queue_id; + + if (adapter == NULL || adapter->data == NULL) + return -EINVAL; + + adptr = adapter->data->adapter_priv; + if (adptr == NULL) + return -EINVAL; + + queue_id = adapter->data->conf.ev.queue_id; + dev = cnxk_sso_pmd_priv(&rte_eventdevs[adapter->data->conf.event_dev_id]); + + roc_sso_hwgrp_agq_free(&dev->sso, queue_id, adptr->agq); + rte_free(adptr); + adapter->data->adapter_priv = NULL; + + return 0; +} + +static int +cnxk_sso_vector_adapter_enqueue(struct rte_event_vector_adapter *adapter, uint64_t objs[], + uint16_t num_elem, uint64_t flags) +{ + struct cnxk_event_vector_adapter *adptr; + uint16_t n = num_elem; + uint64_t add_work0; + + plt_wmb(); + + add_work0 = adptr->agq | ((uint64_t)(adptr->tt) << 32); + roc_store_pair(add_work0 | (!!(flags & RTE_EVENT_VECTOR_ENQ_SOV) << 34), objs[num_elem - n], + adptr->base); + while (--n > 1) + roc_store_pair(add_work0, objs[num_elem - n], adptr->base); + if (n) + roc_store_pair(add_work0 | (!!(flags & RTE_EVENT_VECTOR_ENQ_EOV) << 35), + objs[num_elem - n], adptr->base); + + return num_elem; +} + +static struct event_vector_adapter_ops ops = { + .create = cnxk_sso_vector_adapter_create, + .destroy = cnxk_sso_vector_adapter_destroy, + .enqueue = cnxk_sso_vector_adapter_enqueue, +}; + +int +cnxk_vector_caps_get(const struct rte_eventdev *evdev, uint32_t *caps, + const struct event_vector_adapter_ops **ops) +{ + RTE_SET_USED(evdev); + + *caps = RTE_EVENT_VECTOR_ADAPTER_CAP_INTERNAL_PORT; + *ops = &ops; + + return 0; +} + +int +cnxk_vector_info_get(const struct rte_eventdev *evdev, struct rte_event_vector_adapter_info *info) +{ + if (info == NULL) + return -EINVAL; + + info->max_vector_adapters_per_event_queue = + SSO_AGGR_MAX_CTX > UINT8_MAX ? UINT8_MAX : SSO_AGGR_MAX_CTX; + info->log2_sz = true; + info->min_vector_sz = RTE_BIT32(ROC_NIX_VWQE_MIN_SIZE_LOG2); + info->max_vector_sz = RTE_BIT32(ROC_NIX_VWQE_MAX_SIZE_LOG2); + info->min_vector_timeout_ns = (SSO_AGGR_DEF_TMO + 1) * 100; + info->max_vector_timeout_ns = (BITMASK_ULL(11, 0) + 1) * info->min_vector_timeout_ns; + + info->log2_sz = true; +} diff --git a/drivers/event/cnxk/cnxk_vector_adptr.h b/drivers/event/cnxk/cnxk_vector_adptr.h new file mode 100644 index 000000000000..f60b0f4edd89 --- /dev/null +++ b/drivers/event/cnxk/cnxk_vector_adptr.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2025 Marvell. + */ + +#ifndef __CNXK_VECTOR_ADPTR_H__ +#define __CNXK_VECTOR_ADPTR_H__ + +#include <rte_event_vector_adapter.h> +#include <rte_eventdev.h> + +struct cnxk_event_vector_adapter { + uint8_t tt; + uint32_t agq; /**< Aggregation queue ID */ + uint64_t base; /**< Base address of the adapter */ +}; + +int cnxk_vector_caps_get(const struct rte_eventdev *evdev, uint32_t *caps, + const struct event_vector_adapter_ops **ops); +int cnxk_vector_info_get(const struct rte_eventdev *evdev, + struct rte_event_vector_adapter_info *info); + +#endif /* __CNXK_VECTOR_ADPTR_H__ */ -- 2.39.5 (Apple Git-154) ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2] event/cnxk: add event vector adapter support 2025-05-30 16:34 [PATCH] event/cnxk: add event vector adapter support pbhagavatula @ 2025-06-01 20:46 ` pbhagavatula 2025-06-04 12:43 ` [PATCH v3] " pbhagavatula 0 siblings, 1 reply; 3+ messages in thread From: pbhagavatula @ 2025-06-01 20:46 UTC (permalink / raw) To: jerinj, Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao, Harman Kalra, Pavan Nikhilesh, Shijith Thotton Cc: dev From: Pavan Nikhilesh <pbhagavatula@marvell.com> Add event vector adapter support to CN20K event device. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- Depends-on: series-35336 (introduce event vector adapter) v2 Changes: - Add depends on series tag. - Fix compilation. drivers/common/cnxk/roc_sso.c | 4 +- drivers/common/cnxk/roc_sso.h | 2 +- drivers/event/cnxk/cn20k_eventdev.c | 8 +- drivers/event/cnxk/cnxk_vector_adptr.c | 148 +++++++++++++++++++++++++ drivers/event/cnxk/cnxk_vector_adptr.h | 22 ++++ drivers/event/cnxk/meson.build | 1 + 6 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 drivers/event/cnxk/cnxk_vector_adptr.c create mode 100644 drivers/event/cnxk/cnxk_vector_adptr.h diff --git a/drivers/common/cnxk/roc_sso.c b/drivers/common/cnxk/roc_sso.c index 4996329018fb..1d82e5b9782c 100644 --- a/drivers/common/cnxk/roc_sso.c +++ b/drivers/common/cnxk/roc_sso.c @@ -514,7 +514,8 @@ sso_agq_op_wait(struct roc_sso *roc_sso, uint16_t hwgrp) } int -roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_agq_data *data) +roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_agq_data *data, + uint32_t *agq_id) { struct sso *sso = roc_sso_to_sso_priv(roc_sso); struct sso_aggr_setconfig *req; @@ -621,6 +622,7 @@ roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_ plt_wmb(); sso->agg_used[hwgrp]++; + *agq_id = off; return 0; } diff --git a/drivers/common/cnxk/roc_sso.h b/drivers/common/cnxk/roc_sso.h index f73128087a53..f1ad34bcc745 100644 --- a/drivers/common/cnxk/roc_sso.h +++ b/drivers/common/cnxk/roc_sso.h @@ -112,7 +112,7 @@ int __roc_api roc_sso_hwgrp_stash_config(struct roc_sso *roc_sso, void __roc_api roc_sso_hws_gwc_invalidate(struct roc_sso *roc_sso, uint8_t *hws, uint8_t nb_hws); int __roc_api roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, - struct roc_sso_agq_data *data); + struct roc_sso_agq_data *data, uint32_t *agq_id); void __roc_api roc_sso_hwgrp_agq_free(struct roc_sso *roc_sso, uint16_t hwgrp, uint32_t agq_id); void __roc_api roc_sso_hwgrp_agq_release(struct roc_sso *roc_sso, uint16_t hwgrp); uint32_t __roc_api roc_sso_hwgrp_agq_from_tag(struct roc_sso *roc_sso, uint16_t hwgrp, uint32_t tag, diff --git a/drivers/event/cnxk/cn20k_eventdev.c b/drivers/event/cnxk/cn20k_eventdev.c index 0688cf97e5d6..9d68397b88a4 100644 --- a/drivers/event/cnxk/cn20k_eventdev.c +++ b/drivers/event/cnxk/cn20k_eventdev.c @@ -10,6 +10,7 @@ #include "cn20k_worker.h" #include "cnxk_common.h" #include "cnxk_eventdev.h" +#include "cnxk_vector_adptr.h" #include "cnxk_worker.h" #define CN20K_SET_EVDEV_DEQ_OP(dev, deq_op, deq_ops) \ @@ -708,11 +709,11 @@ cn20k_sso_rx_adapter_vwqe_enable(struct cnxk_sso_evdev *dev, uint16_t port_id, u data.vwqe_wait_tmo = queue_conf->vector_timeout_ns / ((SSO_AGGR_DEF_TMO + 1) * 100); data.xqe_type = 0; - rc = roc_sso_hwgrp_agq_alloc(&dev->sso, queue_conf->ev.queue_id, &data); + agq = UINT32_MAX; + rc = roc_sso_hwgrp_agq_alloc(&dev->sso, queue_conf->ev.queue_id, &data, &agq); if (rc < 0) return rc; - agq = roc_sso_hwgrp_agq_from_tag(&dev->sso, queue_conf->ev.queue_id, tag_mask, 0); return agq; } @@ -1081,6 +1082,9 @@ static struct eventdev_ops cn20k_sso_dev_ops = { .timer_adapter_caps_get = cn20k_tim_caps_get, + .vector_adapter_caps_get = cnxk_vector_caps_get, + .vector_adapter_info_get = cnxk_vector_info_get, + .xstats_get = cnxk_sso_xstats_get, .xstats_reset = cnxk_sso_xstats_reset, .xstats_get_names = cnxk_sso_xstats_get_names, diff --git a/drivers/event/cnxk/cnxk_vector_adptr.c b/drivers/event/cnxk/cnxk_vector_adptr.c new file mode 100644 index 000000000000..0495258cbb5c --- /dev/null +++ b/drivers/event/cnxk/cnxk_vector_adptr.c @@ -0,0 +1,148 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2025 Marvell. + */ +#include <event_vector_adapter_pmd.h> +#include <eventdev_pmd.h> + +#include "roc_api.h" + +#include "cnxk_eventdev.h" +#include "cnxk_vector_adptr.h" +#include "cnxk_worker.h" + +static int +cnxk_sso_vector_adapter_create(struct rte_event_vector_adapter *adapter) +{ + struct rte_event_vector_adapter_conf *conf; + struct cnxk_event_vector_adapter *adptr; + uint32_t agq, tag_mask, stag_mask; + struct roc_sso_agq_data data; + struct cnxk_sso_evdev *dev; + uint8_t queue_id; + int rc; + + adptr = rte_zmalloc("cnxk_event_vector_adapter", sizeof(struct cnxk_event_vector_adapter), + RTE_CACHE_LINE_SIZE); + if (adptr == NULL) { + plt_err("Failed to allocate memory for vector adapter"); + return -ENOMEM; + } + + conf = &adapter->data->conf; + + queue_id = adapter->data->conf.ev.queue_id; + dev = cnxk_sso_pmd_priv(&rte_eventdevs[conf->event_dev_id]); + adapter->data->adapter_priv = adptr; + + tag_mask = conf->ev.event & 0xFFFFFFFF; + stag_mask = (conf->ev_fallback.event & 0xFFFFFFFF) >> 20; + + memset(&data, 0, sizeof(struct roc_sso_agq_data)); + data.tag = tag_mask; + data.tt = conf->ev.sched_type; + data.stag = stag_mask; + data.vwqe_aura = roc_npa_aura_handle_to_aura(conf->vector_mp->pool_id); + data.vwqe_max_sz_exp = rte_log2_u32(conf->vector_sz); + data.vwqe_wait_tmo = conf->vector_timeout_ns / ((SSO_AGGR_DEF_TMO + 1) * 100); + data.xqe_type = 0; + + agq = UINT32_MAX; + rc = roc_sso_hwgrp_agq_alloc(&dev->sso, queue_id, &data, &agq); + if (rc < 0 || agq == UINT32_MAX) { + plt_err("Failed to allocate aggregation queue for queue_id=%d", queue_id); + adapter->data->adapter_priv = NULL; + rte_free(adptr); + return rc; + } + + adptr->agq = agq; + adptr->tt = SSO_TT_AGG; + adptr->base = roc_sso_hwgrp_base_get(&dev->sso, queue_id); + + return 0; +} + +static int +cnxk_sso_vector_adapter_destroy(struct rte_event_vector_adapter *adapter) +{ + struct cnxk_event_vector_adapter *adptr; + struct cnxk_sso_evdev *dev; + uint16_t queue_id; + + if (adapter == NULL || adapter->data == NULL) + return -EINVAL; + + adptr = adapter->data->adapter_priv; + if (adptr == NULL) + return -EINVAL; + + queue_id = adapter->data->conf.ev.queue_id; + dev = cnxk_sso_pmd_priv(&rte_eventdevs[adapter->data->conf.event_dev_id]); + + roc_sso_hwgrp_agq_free(&dev->sso, queue_id, adptr->agq); + rte_free(adptr); + adapter->data->adapter_priv = NULL; + + return 0; +} + +static int +cnxk_sso_vector_adapter_enqueue(struct rte_event_vector_adapter *adapter, uint64_t objs[], + uint16_t num_elem, uint64_t flags) +{ + struct cnxk_event_vector_adapter *adptr; + uint16_t n = num_elem; + uint64_t add_work0; + + adptr = adapter->data->adapter_priv; + plt_wmb(); + + add_work0 = adptr->agq | ((uint64_t)(adptr->tt) << 32); + roc_store_pair(add_work0 | ((uint64_t)!!(flags & RTE_EVENT_VECTOR_ENQ_SOV) << 34), + objs[num_elem - n], adptr->base); + while (--n > 1) + roc_store_pair(add_work0, objs[num_elem - n], adptr->base); + if (n) + roc_store_pair(add_work0 | ((uint64_t)!!(flags & RTE_EVENT_VECTOR_ENQ_EOV) << 35), + objs[num_elem - n], adptr->base); + + return num_elem; +} + +static struct event_vector_adapter_ops vector_ops = { + .create = cnxk_sso_vector_adapter_create, + .destroy = cnxk_sso_vector_adapter_destroy, + .enqueue = cnxk_sso_vector_adapter_enqueue, +}; + +int +cnxk_vector_caps_get(const struct rte_eventdev *evdev, uint32_t *caps, + const struct event_vector_adapter_ops **ops) +{ + RTE_SET_USED(evdev); + + *caps = RTE_EVENT_VECTOR_ADAPTER_CAP_INTERNAL_PORT; + *ops = &vector_ops; + + return 0; +} + +int +cnxk_vector_info_get(const struct rte_eventdev *evdev, struct rte_event_vector_adapter_info *info) +{ + RTE_SET_USED(evdev); + if (info == NULL) + return -EINVAL; + + info->max_vector_adapters_per_event_queue = + SSO_AGGR_MAX_CTX > UINT8_MAX ? UINT8_MAX : SSO_AGGR_MAX_CTX; + info->log2_sz = true; + info->min_vector_sz = RTE_BIT32(ROC_NIX_VWQE_MIN_SIZE_LOG2); + info->max_vector_sz = RTE_BIT32(ROC_NIX_VWQE_MAX_SIZE_LOG2); + info->min_vector_timeout_ns = (SSO_AGGR_DEF_TMO + 1) * 100; + info->max_vector_timeout_ns = (BITMASK_ULL(11, 0) + 1) * info->min_vector_timeout_ns; + + info->log2_sz = true; + + return 0; +} diff --git a/drivers/event/cnxk/cnxk_vector_adptr.h b/drivers/event/cnxk/cnxk_vector_adptr.h new file mode 100644 index 000000000000..f60b0f4edd89 --- /dev/null +++ b/drivers/event/cnxk/cnxk_vector_adptr.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2025 Marvell. + */ + +#ifndef __CNXK_VECTOR_ADPTR_H__ +#define __CNXK_VECTOR_ADPTR_H__ + +#include <rte_event_vector_adapter.h> +#include <rte_eventdev.h> + +struct cnxk_event_vector_adapter { + uint8_t tt; + uint32_t agq; /**< Aggregation queue ID */ + uint64_t base; /**< Base address of the adapter */ +}; + +int cnxk_vector_caps_get(const struct rte_eventdev *evdev, uint32_t *caps, + const struct event_vector_adapter_ops **ops); +int cnxk_vector_info_get(const struct rte_eventdev *evdev, + struct rte_event_vector_adapter_info *info); + +#endif /* __CNXK_VECTOR_ADPTR_H__ */ diff --git a/drivers/event/cnxk/meson.build b/drivers/event/cnxk/meson.build index 9461ae33e443..84cc93e2fd73 100644 --- a/drivers/event/cnxk/meson.build +++ b/drivers/event/cnxk/meson.build @@ -26,6 +26,7 @@ sources = files( 'cnxk_eventdev_stats.c', 'cnxk_tim_evdev.c', 'cnxk_tim_worker.c', + 'cnxk_vector_adptr.c' ) disable_template = false -- 2.39.5 (Apple Git-154) ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v3] event/cnxk: add event vector adapter support 2025-06-01 20:46 ` [PATCH v2] " pbhagavatula @ 2025-06-04 12:43 ` pbhagavatula 0 siblings, 0 replies; 3+ messages in thread From: pbhagavatula @ 2025-06-04 12:43 UTC (permalink / raw) To: jerinj, Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao, Harman Kalra, Pavan Nikhilesh, Shijith Thotton Cc: dev From: Pavan Nikhilesh <pbhagavatula@marvell.com> Add event vector adapter support to CN20K event device. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- v2 Changes: - Add depends on series tag. - Fix compilation. v3 Changes: - Rebase. - Fix errors from check-meson.py drivers/common/cnxk/roc_sso.c | 4 +- drivers/common/cnxk/roc_sso.h | 2 +- drivers/event/cnxk/cn20k_eventdev.c | 8 +- drivers/event/cnxk/cnxk_vector_adptr.c | 148 +++++++++++++++++++++++++ drivers/event/cnxk/cnxk_vector_adptr.h | 22 ++++ drivers/event/cnxk/meson.build | 1 + 6 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 drivers/event/cnxk/cnxk_vector_adptr.c create mode 100644 drivers/event/cnxk/cnxk_vector_adptr.h diff --git a/drivers/common/cnxk/roc_sso.c b/drivers/common/cnxk/roc_sso.c index 4996329018fb..1d82e5b9782c 100644 --- a/drivers/common/cnxk/roc_sso.c +++ b/drivers/common/cnxk/roc_sso.c @@ -514,7 +514,8 @@ sso_agq_op_wait(struct roc_sso *roc_sso, uint16_t hwgrp) } int -roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_agq_data *data) +roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_agq_data *data, + uint32_t *agq_id) { struct sso *sso = roc_sso_to_sso_priv(roc_sso); struct sso_aggr_setconfig *req; @@ -621,6 +622,7 @@ roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_ plt_wmb(); sso->agg_used[hwgrp]++; + *agq_id = off; return 0; } diff --git a/drivers/common/cnxk/roc_sso.h b/drivers/common/cnxk/roc_sso.h index f73128087a53..f1ad34bcc745 100644 --- a/drivers/common/cnxk/roc_sso.h +++ b/drivers/common/cnxk/roc_sso.h @@ -112,7 +112,7 @@ int __roc_api roc_sso_hwgrp_stash_config(struct roc_sso *roc_sso, void __roc_api roc_sso_hws_gwc_invalidate(struct roc_sso *roc_sso, uint8_t *hws, uint8_t nb_hws); int __roc_api roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, - struct roc_sso_agq_data *data); + struct roc_sso_agq_data *data, uint32_t *agq_id); void __roc_api roc_sso_hwgrp_agq_free(struct roc_sso *roc_sso, uint16_t hwgrp, uint32_t agq_id); void __roc_api roc_sso_hwgrp_agq_release(struct roc_sso *roc_sso, uint16_t hwgrp); uint32_t __roc_api roc_sso_hwgrp_agq_from_tag(struct roc_sso *roc_sso, uint16_t hwgrp, uint32_t tag, diff --git a/drivers/event/cnxk/cn20k_eventdev.c b/drivers/event/cnxk/cn20k_eventdev.c index 0688cf97e5d6..9d68397b88a4 100644 --- a/drivers/event/cnxk/cn20k_eventdev.c +++ b/drivers/event/cnxk/cn20k_eventdev.c @@ -10,6 +10,7 @@ #include "cn20k_worker.h" #include "cnxk_common.h" #include "cnxk_eventdev.h" +#include "cnxk_vector_adptr.h" #include "cnxk_worker.h" #define CN20K_SET_EVDEV_DEQ_OP(dev, deq_op, deq_ops) \ @@ -708,11 +709,11 @@ cn20k_sso_rx_adapter_vwqe_enable(struct cnxk_sso_evdev *dev, uint16_t port_id, u data.vwqe_wait_tmo = queue_conf->vector_timeout_ns / ((SSO_AGGR_DEF_TMO + 1) * 100); data.xqe_type = 0; - rc = roc_sso_hwgrp_agq_alloc(&dev->sso, queue_conf->ev.queue_id, &data); + agq = UINT32_MAX; + rc = roc_sso_hwgrp_agq_alloc(&dev->sso, queue_conf->ev.queue_id, &data, &agq); if (rc < 0) return rc; - agq = roc_sso_hwgrp_agq_from_tag(&dev->sso, queue_conf->ev.queue_id, tag_mask, 0); return agq; } @@ -1081,6 +1082,9 @@ static struct eventdev_ops cn20k_sso_dev_ops = { .timer_adapter_caps_get = cn20k_tim_caps_get, + .vector_adapter_caps_get = cnxk_vector_caps_get, + .vector_adapter_info_get = cnxk_vector_info_get, + .xstats_get = cnxk_sso_xstats_get, .xstats_reset = cnxk_sso_xstats_reset, .xstats_get_names = cnxk_sso_xstats_get_names, diff --git a/drivers/event/cnxk/cnxk_vector_adptr.c b/drivers/event/cnxk/cnxk_vector_adptr.c new file mode 100644 index 000000000000..0495258cbb5c --- /dev/null +++ b/drivers/event/cnxk/cnxk_vector_adptr.c @@ -0,0 +1,148 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2025 Marvell. + */ +#include <event_vector_adapter_pmd.h> +#include <eventdev_pmd.h> + +#include "roc_api.h" + +#include "cnxk_eventdev.h" +#include "cnxk_vector_adptr.h" +#include "cnxk_worker.h" + +static int +cnxk_sso_vector_adapter_create(struct rte_event_vector_adapter *adapter) +{ + struct rte_event_vector_adapter_conf *conf; + struct cnxk_event_vector_adapter *adptr; + uint32_t agq, tag_mask, stag_mask; + struct roc_sso_agq_data data; + struct cnxk_sso_evdev *dev; + uint8_t queue_id; + int rc; + + adptr = rte_zmalloc("cnxk_event_vector_adapter", sizeof(struct cnxk_event_vector_adapter), + RTE_CACHE_LINE_SIZE); + if (adptr == NULL) { + plt_err("Failed to allocate memory for vector adapter"); + return -ENOMEM; + } + + conf = &adapter->data->conf; + + queue_id = adapter->data->conf.ev.queue_id; + dev = cnxk_sso_pmd_priv(&rte_eventdevs[conf->event_dev_id]); + adapter->data->adapter_priv = adptr; + + tag_mask = conf->ev.event & 0xFFFFFFFF; + stag_mask = (conf->ev_fallback.event & 0xFFFFFFFF) >> 20; + + memset(&data, 0, sizeof(struct roc_sso_agq_data)); + data.tag = tag_mask; + data.tt = conf->ev.sched_type; + data.stag = stag_mask; + data.vwqe_aura = roc_npa_aura_handle_to_aura(conf->vector_mp->pool_id); + data.vwqe_max_sz_exp = rte_log2_u32(conf->vector_sz); + data.vwqe_wait_tmo = conf->vector_timeout_ns / ((SSO_AGGR_DEF_TMO + 1) * 100); + data.xqe_type = 0; + + agq = UINT32_MAX; + rc = roc_sso_hwgrp_agq_alloc(&dev->sso, queue_id, &data, &agq); + if (rc < 0 || agq == UINT32_MAX) { + plt_err("Failed to allocate aggregation queue for queue_id=%d", queue_id); + adapter->data->adapter_priv = NULL; + rte_free(adptr); + return rc; + } + + adptr->agq = agq; + adptr->tt = SSO_TT_AGG; + adptr->base = roc_sso_hwgrp_base_get(&dev->sso, queue_id); + + return 0; +} + +static int +cnxk_sso_vector_adapter_destroy(struct rte_event_vector_adapter *adapter) +{ + struct cnxk_event_vector_adapter *adptr; + struct cnxk_sso_evdev *dev; + uint16_t queue_id; + + if (adapter == NULL || adapter->data == NULL) + return -EINVAL; + + adptr = adapter->data->adapter_priv; + if (adptr == NULL) + return -EINVAL; + + queue_id = adapter->data->conf.ev.queue_id; + dev = cnxk_sso_pmd_priv(&rte_eventdevs[adapter->data->conf.event_dev_id]); + + roc_sso_hwgrp_agq_free(&dev->sso, queue_id, adptr->agq); + rte_free(adptr); + adapter->data->adapter_priv = NULL; + + return 0; +} + +static int +cnxk_sso_vector_adapter_enqueue(struct rte_event_vector_adapter *adapter, uint64_t objs[], + uint16_t num_elem, uint64_t flags) +{ + struct cnxk_event_vector_adapter *adptr; + uint16_t n = num_elem; + uint64_t add_work0; + + adptr = adapter->data->adapter_priv; + plt_wmb(); + + add_work0 = adptr->agq | ((uint64_t)(adptr->tt) << 32); + roc_store_pair(add_work0 | ((uint64_t)!!(flags & RTE_EVENT_VECTOR_ENQ_SOV) << 34), + objs[num_elem - n], adptr->base); + while (--n > 1) + roc_store_pair(add_work0, objs[num_elem - n], adptr->base); + if (n) + roc_store_pair(add_work0 | ((uint64_t)!!(flags & RTE_EVENT_VECTOR_ENQ_EOV) << 35), + objs[num_elem - n], adptr->base); + + return num_elem; +} + +static struct event_vector_adapter_ops vector_ops = { + .create = cnxk_sso_vector_adapter_create, + .destroy = cnxk_sso_vector_adapter_destroy, + .enqueue = cnxk_sso_vector_adapter_enqueue, +}; + +int +cnxk_vector_caps_get(const struct rte_eventdev *evdev, uint32_t *caps, + const struct event_vector_adapter_ops **ops) +{ + RTE_SET_USED(evdev); + + *caps = RTE_EVENT_VECTOR_ADAPTER_CAP_INTERNAL_PORT; + *ops = &vector_ops; + + return 0; +} + +int +cnxk_vector_info_get(const struct rte_eventdev *evdev, struct rte_event_vector_adapter_info *info) +{ + RTE_SET_USED(evdev); + if (info == NULL) + return -EINVAL; + + info->max_vector_adapters_per_event_queue = + SSO_AGGR_MAX_CTX > UINT8_MAX ? UINT8_MAX : SSO_AGGR_MAX_CTX; + info->log2_sz = true; + info->min_vector_sz = RTE_BIT32(ROC_NIX_VWQE_MIN_SIZE_LOG2); + info->max_vector_sz = RTE_BIT32(ROC_NIX_VWQE_MAX_SIZE_LOG2); + info->min_vector_timeout_ns = (SSO_AGGR_DEF_TMO + 1) * 100; + info->max_vector_timeout_ns = (BITMASK_ULL(11, 0) + 1) * info->min_vector_timeout_ns; + + info->log2_sz = true; + + return 0; +} diff --git a/drivers/event/cnxk/cnxk_vector_adptr.h b/drivers/event/cnxk/cnxk_vector_adptr.h new file mode 100644 index 000000000000..f60b0f4edd89 --- /dev/null +++ b/drivers/event/cnxk/cnxk_vector_adptr.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2025 Marvell. + */ + +#ifndef __CNXK_VECTOR_ADPTR_H__ +#define __CNXK_VECTOR_ADPTR_H__ + +#include <rte_event_vector_adapter.h> +#include <rte_eventdev.h> + +struct cnxk_event_vector_adapter { + uint8_t tt; + uint32_t agq; /**< Aggregation queue ID */ + uint64_t base; /**< Base address of the adapter */ +}; + +int cnxk_vector_caps_get(const struct rte_eventdev *evdev, uint32_t *caps, + const struct event_vector_adapter_ops **ops); +int cnxk_vector_info_get(const struct rte_eventdev *evdev, + struct rte_event_vector_adapter_info *info); + +#endif /* __CNXK_VECTOR_ADPTR_H__ */ diff --git a/drivers/event/cnxk/meson.build b/drivers/event/cnxk/meson.build index 9461ae33e443..677ebc9e2814 100644 --- a/drivers/event/cnxk/meson.build +++ b/drivers/event/cnxk/meson.build @@ -26,6 +26,7 @@ sources = files( 'cnxk_eventdev_stats.c', 'cnxk_tim_evdev.c', 'cnxk_tim_worker.c', + 'cnxk_vector_adptr.c', ) disable_template = false -- 2.39.5 (Apple Git-154) ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-06-04 12:43 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-05-30 16:34 [PATCH] event/cnxk: add event vector adapter support pbhagavatula 2025-06-01 20:46 ` [PATCH v2] " pbhagavatula 2025-06-04 12:43 ` [PATCH v3] " pbhagavatula
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).