On Sat, Jul 03, 2021 at 02:44:04AM +0530, pbhagavat...@marvell.com wrote:
> From: Pavan Nikhilesh <pbhagavat...@marvell.com>
> 
> Add support for event eth Tx adapter.
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com>
> ---
>  doc/guides/eventdevs/cnxk.rst            |   4 +-
>  doc/guides/rel_notes/release_21_08.rst   |   6 +-
>  drivers/common/cnxk/roc_nix.h            |   1 +
>  drivers/common/cnxk/roc_nix_queue.c      |   7 +-
>  drivers/event/cnxk/cn10k_eventdev.c      |  91 ++++++++++++++
>  drivers/event/cnxk/cn9k_eventdev.c       | 148 +++++++++++++++++++++++
>  drivers/event/cnxk/cnxk_eventdev.h       |  22 +++-
>  drivers/event/cnxk/cnxk_eventdev_adptr.c |  88 ++++++++++++++
>  8 files changed, 358 insertions(+), 9 deletions(-)
> 
> diff --git a/doc/guides/eventdevs/cnxk.rst b/doc/guides/eventdevs/cnxk.rst
> index b7e82c127..6fdccc2ab 100644
> --- a/doc/guides/eventdevs/cnxk.rst
> +++ b/doc/guides/eventdevs/cnxk.rst
> @@ -42,7 +42,9 @@ Features of the OCTEON cnxk SSO PMD are:
>  - HW managed packets enqueued from ethdev to eventdev exposed through event 
> eth
>    RX adapter.
>  - N:1 ethernet device Rx queue to Event queue mapping.
> -- Full Rx offload support defined through ethdev queue configuration.
> +- Lockfree Tx from event eth Tx adapter using ``DEV_TX_OFFLOAD_MT_LOCKFREE``
> +  capability while maintaining receive packet order.
> +- Full Rx/Tx offload support defined through ethdev queue configuration.
>  
>  Prerequisites and Compilation procedure
>  ---------------------------------------
> diff --git a/doc/guides/rel_notes/release_21_08.rst 
> b/doc/guides/rel_notes/release_21_08.rst
> index 3892c8017..80ff93269 100644
> --- a/doc/guides/rel_notes/release_21_08.rst
> +++ b/doc/guides/rel_notes/release_21_08.rst
> @@ -60,10 +60,10 @@ New Features
>    * Added net/cnxk driver which provides the support for the integrated 
> ethernet
>      device.
>  
> -* **Added support for Marvell CN10K, CN9K, event Rx adapter.**
> +* **Added support for Marvell CN10K, CN9K, event Rx/Tx adapter.**
>  
> -  * Added Rx adapter support for event/cnxk when the ethernet device 
> requested is
> -    net/cnxk.
> +  * Added Rx/Tx adapter support for event/cnxk when the ethernet device 
> requested
> +    is net/cnxk.
>  
>  
>  Removed Items
> diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
> index 76613fe84..822c1900e 100644
> --- a/drivers/common/cnxk/roc_nix.h
> +++ b/drivers/common/cnxk/roc_nix.h
> @@ -200,6 +200,7 @@ struct roc_nix_sq {
>       uint64_t aura_handle;
>       int16_t nb_sqb_bufs_adj;
>       uint16_t nb_sqb_bufs;
> +     uint16_t aura_sqb_bufs;
>       plt_iova_t io_addr;
>       void *lmt_addr;
>       void *sqe_mem;
> diff --git a/drivers/common/cnxk/roc_nix_queue.c 
> b/drivers/common/cnxk/roc_nix_queue.c
> index 0604e7a18..f69771c15 100644
> --- a/drivers/common/cnxk/roc_nix_queue.c
> +++ b/drivers/common/cnxk/roc_nix_queue.c
> @@ -587,12 +587,12 @@ sqb_pool_populate(struct roc_nix *roc_nix, struct 
> roc_nix_sq *sq)
>       aura.fc_ena = 1;
>       aura.fc_addr = (uint64_t)sq->fc;
>       aura.fc_hyst_bits = 0; /* Store count on all updates */
> -     rc = roc_npa_pool_create(&sq->aura_handle, blk_sz, nb_sqb_bufs, &aura,
> +     rc = roc_npa_pool_create(&sq->aura_handle, blk_sz, NIX_MAX_SQB, &aura,
>                                &pool);
>       if (rc)
>               goto fail;
>  
> -     sq->sqe_mem = plt_zmalloc(blk_sz * nb_sqb_bufs, blk_sz);
> +     sq->sqe_mem = plt_zmalloc(blk_sz * NIX_MAX_SQB, blk_sz);
>       if (sq->sqe_mem == NULL) {
>               rc = NIX_ERR_NO_MEM;
>               goto nomem;
> @@ -600,11 +600,12 @@ sqb_pool_populate(struct roc_nix *roc_nix, struct 
> roc_nix_sq *sq)
>  
>       /* Fill the initial buffers */
>       iova = (uint64_t)sq->sqe_mem;
> -     for (count = 0; count < nb_sqb_bufs; count++) {
> +     for (count = 0; count < NIX_MAX_SQB; count++) {
>               roc_npa_aura_op_free(sq->aura_handle, 0, iova);
>               iova += blk_sz;
>       }
>       roc_npa_aura_op_range_set(sq->aura_handle, (uint64_t)sq->sqe_mem, iova);
> +     sq->aura_sqb_bufs = NIX_MAX_SQB;

Since now aura is created with NIX_MAX_SQB's, we need to also modify the aura
limit here to sq->nb_sqb_bufs for poll mode ?

With this fixed, Acked-by:  Nithin Dabilpuram <ndabilpu...@marvell.com>
        

>  
>       return rc;
>  nomem:
> diff --git a/drivers/event/cnxk/cn10k_eventdev.c 
> b/drivers/event/cnxk/cn10k_eventdev.c
> index ba7d95fff..8a9b04a3d 100644
> --- a/drivers/event/cnxk/cn10k_eventdev.c
> +++ b/drivers/event/cnxk/cn10k_eventdev.c
> @@ -44,6 +44,7 @@ cn10k_sso_init_hws_mem(void *arg, uint8_t port_id)
>       /* First cache line is reserved for cookie */
>       ws = (struct cn10k_sso_hws *)((uint8_t *)ws + RTE_CACHE_LINE_SIZE);
>       ws->base = roc_sso_hws_base_get(&dev->sso, port_id);
> +     ws->tx_base = ws->base;
>       ws->hws_id = port_id;
>       ws->swtag_req = 0;
>       ws->gw_wdata = cn10k_sso_gw_mode_wdata(dev);
> @@ -233,6 +234,39 @@ cn10k_sso_rsrc_init(void *arg, uint8_t hws, uint8_t 
> hwgrp)
>       return roc_sso_rsrc_init(&dev->sso, hws, hwgrp);
>  }
>  
> +static int
> +cn10k_sso_updt_tx_adptr_data(const struct rte_eventdev *event_dev)
> +{
> +     struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
> +     int i;
> +
> +     if (dev->tx_adptr_data == NULL)
> +             return 0;
> +
> +     for (i = 0; i < dev->nb_event_ports; i++) {
> +             struct cn10k_sso_hws *ws = event_dev->data->ports[i];
> +             void *ws_cookie;
> +
> +             ws_cookie = cnxk_sso_hws_get_cookie(ws);
> +             ws_cookie = rte_realloc_socket(
> +                     ws_cookie,
> +                     sizeof(struct cnxk_sso_hws_cookie) +
> +                             sizeof(struct cn10k_sso_hws) +
> +                             (sizeof(uint64_t) * (dev->max_port_id + 1) *
> +                              RTE_MAX_QUEUES_PER_PORT),
> +                     RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
> +             if (ws_cookie == NULL)
> +                     return -ENOMEM;
> +             ws = RTE_PTR_ADD(ws_cookie, sizeof(struct cnxk_sso_hws_cookie));
> +             memcpy(&ws->tx_adptr_data, dev->tx_adptr_data,
> +                    sizeof(uint64_t) * (dev->max_port_id + 1) *
> +                            RTE_MAX_QUEUES_PER_PORT);
> +             event_dev->data->ports[i] = ws;
> +     }
> +
> +     return 0;
> +}
> +
>  static void
>  cn10k_sso_fp_fns_set(struct rte_eventdev *event_dev)
>  {
> @@ -493,6 +527,10 @@ cn10k_sso_start(struct rte_eventdev *event_dev)
>  {
>       int rc;
>  
> +     rc = cn10k_sso_updt_tx_adptr_data(event_dev);
> +     if (rc < 0)
> +             return rc;
> +
>       rc = cnxk_sso_start(event_dev, cn10k_sso_hws_reset,
>                           cn10k_sso_hws_flush_events);
>       if (rc < 0)
> @@ -595,6 +633,55 @@ cn10k_sso_rx_adapter_queue_del(const struct rte_eventdev 
> *event_dev,
>       return cnxk_sso_rx_adapter_queue_del(event_dev, eth_dev, rx_queue_id);
>  }
>  
> +static int
> +cn10k_sso_tx_adapter_caps_get(const struct rte_eventdev *dev,
> +                           const struct rte_eth_dev *eth_dev, uint32_t *caps)
> +{
> +     int ret;
> +
> +     RTE_SET_USED(dev);
> +     ret = strncmp(eth_dev->device->driver->name, "net_cn10k", 8);
> +     if (ret)
> +             *caps = 0;
> +     else
> +             *caps = RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT;
> +
> +     return 0;
> +}
> +
> +static int
> +cn10k_sso_tx_adapter_queue_add(uint8_t id, const struct rte_eventdev 
> *event_dev,
> +                            const struct rte_eth_dev *eth_dev,
> +                            int32_t tx_queue_id)
> +{
> +     int rc;
> +
> +     RTE_SET_USED(id);
> +     rc = cnxk_sso_tx_adapter_queue_add(event_dev, eth_dev, tx_queue_id);
> +     if (rc < 0)
> +             return rc;
> +     rc = cn10k_sso_updt_tx_adptr_data(event_dev);
> +     if (rc < 0)
> +             return rc;
> +     cn10k_sso_fp_fns_set((struct rte_eventdev *)(uintptr_t)event_dev);
> +
> +     return 0;
> +}
> +
> +static int
> +cn10k_sso_tx_adapter_queue_del(uint8_t id, const struct rte_eventdev 
> *event_dev,
> +                            const struct rte_eth_dev *eth_dev,
> +                            int32_t tx_queue_id)
> +{
> +     int rc;
> +
> +     RTE_SET_USED(id);
> +     rc = cnxk_sso_tx_adapter_queue_del(event_dev, eth_dev, tx_queue_id);
> +     if (rc < 0)
> +             return rc;
> +     return cn10k_sso_updt_tx_adptr_data(event_dev);
> +}
> +
>  static struct rte_eventdev_ops cn10k_sso_dev_ops = {
>       .dev_infos_get = cn10k_sso_info_get,
>       .dev_configure = cn10k_sso_dev_configure,
> @@ -614,6 +701,10 @@ static struct rte_eventdev_ops cn10k_sso_dev_ops = {
>       .eth_rx_adapter_start = cnxk_sso_rx_adapter_start,
>       .eth_rx_adapter_stop = cnxk_sso_rx_adapter_stop,
>  
> +     .eth_tx_adapter_caps_get = cn10k_sso_tx_adapter_caps_get,
> +     .eth_tx_adapter_queue_add = cn10k_sso_tx_adapter_queue_add,
> +     .eth_tx_adapter_queue_del = cn10k_sso_tx_adapter_queue_del,
> +
>       .timer_adapter_caps_get = cnxk_tim_caps_get,
>  
>       .dump = cnxk_sso_dump,
> diff --git a/drivers/event/cnxk/cn9k_eventdev.c 
> b/drivers/event/cnxk/cn9k_eventdev.c
> index e386cb784..21f80323d 100644
> --- a/drivers/event/cnxk/cn9k_eventdev.c
> +++ b/drivers/event/cnxk/cn9k_eventdev.c
> @@ -248,6 +248,66 @@ cn9k_sso_rsrc_init(void *arg, uint8_t hws, uint8_t hwgrp)
>       return roc_sso_rsrc_init(&dev->sso, hws, hwgrp);
>  }
>  
> +static int
> +cn9k_sso_updt_tx_adptr_data(const struct rte_eventdev *event_dev)
> +{
> +     struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
> +     int i;
> +
> +     if (dev->tx_adptr_data == NULL)
> +             return 0;
> +
> +     for (i = 0; i < dev->nb_event_ports; i++) {
> +             if (dev->dual_ws) {
> +                     struct cn9k_sso_hws_dual *dws =
> +                             event_dev->data->ports[i];
> +                     void *ws_cookie;
> +
> +                     ws_cookie = cnxk_sso_hws_get_cookie(dws);
> +                     ws_cookie = rte_realloc_socket(
> +                             ws_cookie,
> +                             sizeof(struct cnxk_sso_hws_cookie) +
> +                                     sizeof(struct cn9k_sso_hws_dual) +
> +                                     (sizeof(uint64_t) *
> +                                      (dev->max_port_id + 1) *
> +                                      RTE_MAX_QUEUES_PER_PORT),
> +                             RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
> +                     if (ws_cookie == NULL)
> +                             return -ENOMEM;
> +                     dws = RTE_PTR_ADD(ws_cookie,
> +                                       sizeof(struct cnxk_sso_hws_cookie));
> +                     memcpy(&dws->tx_adptr_data, dev->tx_adptr_data,
> +                            sizeof(uint64_t) * (dev->max_port_id + 1) *
> +                                    RTE_MAX_QUEUES_PER_PORT);
> +                     event_dev->data->ports[i] = dws;
> +             } else {
> +                     struct cn9k_sso_hws *ws = event_dev->data->ports[i];
> +                     void *ws_cookie;
> +
> +                     ws_cookie = cnxk_sso_hws_get_cookie(ws);
> +                     ws_cookie = rte_realloc_socket(
> +                             ws_cookie,
> +                             sizeof(struct cnxk_sso_hws_cookie) +
> +                                     sizeof(struct cn9k_sso_hws_dual) +
> +                                     (sizeof(uint64_t) *
> +                                      (dev->max_port_id + 1) *
> +                                      RTE_MAX_QUEUES_PER_PORT),
> +                             RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
> +                     if (ws_cookie == NULL)
> +                             return -ENOMEM;
> +                     ws = RTE_PTR_ADD(ws_cookie,
> +                                      sizeof(struct cnxk_sso_hws_cookie));
> +                     memcpy(&ws->tx_adptr_data, dev->tx_adptr_data,
> +                            sizeof(uint64_t) * (dev->max_port_id + 1) *
> +                                    RTE_MAX_QUEUES_PER_PORT);
> +                     event_dev->data->ports[i] = ws;
> +             }
> +     }
> +     rte_mb();
> +
> +     return 0;
> +}
> +
>  static void
>  cn9k_sso_fp_fns_set(struct rte_eventdev *event_dev)
>  {
> @@ -734,6 +794,10 @@ cn9k_sso_start(struct rte_eventdev *event_dev)
>  {
>       int rc;
>  
> +     rc = cn9k_sso_updt_tx_adptr_data(event_dev);
> +     if (rc < 0)
> +             return rc;
> +
>       rc = cnxk_sso_start(event_dev, cn9k_sso_hws_reset,
>                           cn9k_sso_hws_flush_events);
>       if (rc < 0)
> @@ -844,6 +908,86 @@ cn9k_sso_rx_adapter_queue_del(const struct rte_eventdev 
> *event_dev,
>       return cnxk_sso_rx_adapter_queue_del(event_dev, eth_dev, rx_queue_id);
>  }
>  
> +static int
> +cn9k_sso_tx_adapter_caps_get(const struct rte_eventdev *dev,
> +                          const struct rte_eth_dev *eth_dev, uint32_t *caps)
> +{
> +     int ret;
> +
> +     RTE_SET_USED(dev);
> +     ret = strncmp(eth_dev->device->driver->name, "net_cn9k", 8);
> +     if (ret)
> +             *caps = 0;
> +     else
> +             *caps = RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT;
> +
> +     return 0;
> +}
> +
> +static void
> +cn9k_sso_txq_fc_update(const struct rte_eth_dev *eth_dev, int32_t 
> tx_queue_id,
> +                    bool ena)
> +{
> +     struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
> +     struct cn9k_eth_txq *txq;
> +     struct roc_nix_sq *sq;
> +     int i;
> +
> +     if (tx_queue_id < 0) {
> +             for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
> +                     cn9k_sso_txq_fc_update(eth_dev, i, ena);
> +     } else {
> +             uint16_t sq_limit;
> +
> +             sq = &cnxk_eth_dev->sqs[tx_queue_id];
> +             txq = eth_dev->data->tx_queues[tx_queue_id];
> +             sq_limit =
> +                     ena ? RTE_MIN(CNXK_SSO_SQB_LIMIT, sq->aura_sqb_bufs) :
> +                                 sq->nb_sqb_bufs;
> +             txq->nb_sqb_bufs_adj =
> +                     sq_limit -
> +                     RTE_ALIGN_MUL_CEIL(sq_limit,
> +                                        (1ULL << txq->sqes_per_sqb_log2)) /
> +                             (1ULL << txq->sqes_per_sqb_log2);
> +             txq->nb_sqb_bufs_adj = (70 * txq->nb_sqb_bufs_adj) / 100;
> +     }
> +}
> +
> +static int
> +cn9k_sso_tx_adapter_queue_add(uint8_t id, const struct rte_eventdev 
> *event_dev,
> +                           const struct rte_eth_dev *eth_dev,
> +                           int32_t tx_queue_id)
> +{
> +     int rc;
> +
> +     RTE_SET_USED(id);
> +     rc = cnxk_sso_tx_adapter_queue_add(event_dev, eth_dev, tx_queue_id);
> +     if (rc < 0)
> +             return rc;
> +     cn9k_sso_txq_fc_update(eth_dev, tx_queue_id, true);
> +     rc = cn9k_sso_updt_tx_adptr_data(event_dev);
> +     if (rc < 0)
> +             return rc;
> +     cn9k_sso_fp_fns_set((struct rte_eventdev *)(uintptr_t)event_dev);
> +
> +     return 0;
> +}
> +
> +static int
> +cn9k_sso_tx_adapter_queue_del(uint8_t id, const struct rte_eventdev 
> *event_dev,
> +                           const struct rte_eth_dev *eth_dev,
> +                           int32_t tx_queue_id)
> +{
> +     int rc;
> +
> +     RTE_SET_USED(id);
> +     rc = cnxk_sso_tx_adapter_queue_del(event_dev, eth_dev, tx_queue_id);
> +     if (rc < 0)
> +             return rc;
> +     cn9k_sso_txq_fc_update(eth_dev, tx_queue_id, false);
> +     return cn9k_sso_updt_tx_adptr_data(event_dev);
> +}
> +
>  static struct rte_eventdev_ops cn9k_sso_dev_ops = {
>       .dev_infos_get = cn9k_sso_info_get,
>       .dev_configure = cn9k_sso_dev_configure,
> @@ -863,6 +1007,10 @@ static struct rte_eventdev_ops cn9k_sso_dev_ops = {
>       .eth_rx_adapter_start = cnxk_sso_rx_adapter_start,
>       .eth_rx_adapter_stop = cnxk_sso_rx_adapter_stop,
>  
> +     .eth_tx_adapter_caps_get = cn9k_sso_tx_adapter_caps_get,
> +     .eth_tx_adapter_queue_add = cn9k_sso_tx_adapter_queue_add,
> +     .eth_tx_adapter_queue_del = cn9k_sso_tx_adapter_queue_del,
> +
>       .timer_adapter_caps_get = cnxk_tim_caps_get,
>  
>       .dump = cnxk_sso_dump,
> diff --git a/drivers/event/cnxk/cnxk_eventdev.h 
> b/drivers/event/cnxk/cnxk_eventdev.h
> index 9d5d2d033..24e1be6a9 100644
> --- a/drivers/event/cnxk/cnxk_eventdev.h
> +++ b/drivers/event/cnxk/cnxk_eventdev.h
> @@ -8,6 +8,7 @@
>  #include <rte_devargs.h>
>  #include <rte_ethdev.h>
>  #include <rte_event_eth_rx_adapter.h>
> +#include <rte_event_eth_tx_adapter.h>
>  #include <rte_kvargs.h>
>  #include <rte_mbuf_pool_ops.h>
>  #include <rte_pci.h>
> @@ -34,6 +35,7 @@
>  #define CNXK_SSO_XAQ_CACHE_CNT (0x7)
>  #define CNXK_SSO_XAQ_SLACK     (8)
>  #define CNXK_SSO_WQE_SG_PTR    (9)
> +#define CNXK_SSO_SQB_LIMIT     (0x180)
>  
>  #define CNXK_TT_FROM_TAG(x)      (((x) >> 32) & SSO_TT_EMPTY)
>  #define CNXK_TT_FROM_EVENT(x)            (((x) >> 38) & SSO_TT_EMPTY)
> @@ -86,9 +88,12 @@ struct cnxk_sso_evdev {
>       rte_iova_t fc_iova;
>       struct rte_mempool *xaq_pool;
>       uint64_t rx_offloads;
> +     uint64_t tx_offloads;
>       uint64_t adptr_xae_cnt;
>       uint16_t rx_adptr_pool_cnt;
>       uint64_t *rx_adptr_pools;
> +     uint64_t *tx_adptr_data;
> +     uint16_t max_port_id;
>       uint16_t tim_adptr_ring_cnt;
>       uint16_t *timer_adptr_rings;
>       uint64_t *timer_adptr_sz;
> @@ -115,7 +120,10 @@ struct cn10k_sso_hws {
>       uint64_t xaq_lmt __rte_cache_aligned;
>       uint64_t *fc_mem;
>       uintptr_t grps_base[CNXK_SSO_MAX_HWGRP];
> +     /* Tx Fastpath data */
> +     uint64_t tx_base __rte_cache_aligned;
>       uintptr_t lmt_base;
> +     uint8_t tx_adptr_data[];
>  } __rte_cache_aligned;
>  
>  /* CN9K HWS ops */
> @@ -140,7 +148,9 @@ struct cn9k_sso_hws {
>       uint64_t xaq_lmt __rte_cache_aligned;
>       uint64_t *fc_mem;
>       uintptr_t grps_base[CNXK_SSO_MAX_HWGRP];
> -     uint64_t base;
> +     /* Tx Fastpath data */
> +     uint64_t base __rte_cache_aligned;
> +     uint8_t tx_adptr_data[];
>  } __rte_cache_aligned;
>  
>  struct cn9k_sso_hws_state {
> @@ -160,7 +170,9 @@ struct cn9k_sso_hws_dual {
>       uint64_t xaq_lmt __rte_cache_aligned;
>       uint64_t *fc_mem;
>       uintptr_t grps_base[CNXK_SSO_MAX_HWGRP];
> -     uint64_t base[2];
> +     /* Tx Fastpath data */
> +     uint64_t base[2] __rte_cache_aligned;
> +     uint8_t tx_adptr_data[];
>  } __rte_cache_aligned;
>  
>  struct cnxk_sso_hws_cookie {
> @@ -267,5 +279,11 @@ int cnxk_sso_rx_adapter_start(const struct rte_eventdev 
> *event_dev,
>                             const struct rte_eth_dev *eth_dev);
>  int cnxk_sso_rx_adapter_stop(const struct rte_eventdev *event_dev,
>                            const struct rte_eth_dev *eth_dev);
> +int cnxk_sso_tx_adapter_queue_add(const struct rte_eventdev *event_dev,
> +                               const struct rte_eth_dev *eth_dev,
> +                               int32_t tx_queue_id);
> +int cnxk_sso_tx_adapter_queue_del(const struct rte_eventdev *event_dev,
> +                               const struct rte_eth_dev *eth_dev,
> +                               int32_t tx_queue_id);
>  
>  #endif /* __CNXK_EVENTDEV_H__ */
> diff --git a/drivers/event/cnxk/cnxk_eventdev_adptr.c 
> b/drivers/event/cnxk/cnxk_eventdev_adptr.c
> index 3b7ecb375..502da272d 100644
> --- a/drivers/event/cnxk/cnxk_eventdev_adptr.c
> +++ b/drivers/event/cnxk/cnxk_eventdev_adptr.c
> @@ -223,3 +223,91 @@ cnxk_sso_rx_adapter_stop(const struct rte_eventdev 
> *event_dev,
>  
>       return 0;
>  }
> +
> +static int
> +cnxk_sso_sqb_aura_limit_edit(struct roc_nix_sq *sq, uint16_t nb_sqb_bufs)
> +{
> +     return roc_npa_aura_limit_modify(
> +             sq->aura_handle, RTE_MIN(nb_sqb_bufs, sq->aura_sqb_bufs));
> +}
> +
> +static int
> +cnxk_sso_updt_tx_queue_data(const struct rte_eventdev *event_dev,
> +                         uint16_t eth_port_id, uint16_t tx_queue_id,
> +                         void *txq)
> +{
> +     struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
> +     uint16_t max_port_id = dev->max_port_id;
> +     uint64_t *txq_data = dev->tx_adptr_data;
> +
> +     if (txq_data == NULL || eth_port_id > max_port_id) {
> +             max_port_id = RTE_MAX(max_port_id, eth_port_id);
> +             txq_data = rte_realloc_socket(
> +                     txq_data,
> +                     (sizeof(uint64_t) * (max_port_id + 1) *
> +                      RTE_MAX_QUEUES_PER_PORT),
> +                     RTE_CACHE_LINE_SIZE, event_dev->data->socket_id);
> +             if (txq_data == NULL)
> +                     return -ENOMEM;
> +     }
> +
> +     ((uint64_t(*)[RTE_MAX_QUEUES_PER_PORT])
> +              txq_data)[eth_port_id][tx_queue_id] = (uint64_t)txq;
> +     dev->max_port_id = max_port_id;
> +     dev->tx_adptr_data = txq_data;
> +     return 0;
> +}
> +
> +int
> +cnxk_sso_tx_adapter_queue_add(const struct rte_eventdev *event_dev,
> +                           const struct rte_eth_dev *eth_dev,
> +                           int32_t tx_queue_id)
> +{
> +     struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
> +     struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
> +     struct roc_nix_sq *sq;
> +     int i, ret;
> +     void *txq;
> +
> +     if (tx_queue_id < 0) {
> +             for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
> +                     cnxk_sso_tx_adapter_queue_add(event_dev, eth_dev, i);
> +     } else {
> +             txq = eth_dev->data->tx_queues[tx_queue_id];
> +             sq = &cnxk_eth_dev->sqs[tx_queue_id];
> +             cnxk_sso_sqb_aura_limit_edit(sq, CNXK_SSO_SQB_LIMIT);
> +             ret = cnxk_sso_updt_tx_queue_data(
> +                     event_dev, eth_dev->data->port_id, tx_queue_id, txq);
> +             if (ret < 0)
> +                     return ret;
> +
> +             dev->tx_offloads |= cnxk_eth_dev->tx_offload_flags;
> +     }
> +
> +     return 0;
> +}
> +
> +int
> +cnxk_sso_tx_adapter_queue_del(const struct rte_eventdev *event_dev,
> +                           const struct rte_eth_dev *eth_dev,
> +                           int32_t tx_queue_id)
> +{
> +     struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
> +     struct roc_nix_sq *sq;
> +     int i, ret;
> +
> +     RTE_SET_USED(event_dev);
> +     if (tx_queue_id < 0) {
> +             for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
> +                     cnxk_sso_tx_adapter_queue_del(event_dev, eth_dev, i);
> +     } else {
> +             sq = &cnxk_eth_dev->sqs[tx_queue_id];
> +             cnxk_sso_sqb_aura_limit_edit(sq, sq->nb_sqb_bufs);
> +             ret = cnxk_sso_updt_tx_queue_data(
> +                     event_dev, eth_dev->data->port_id, tx_queue_id, NULL);
> +             if (ret < 0)
> +                     return ret;
> +     }
> +
> +     return 0;
> +}
> -- 
> 2.17.1
> 

Reply via email to