From patchwork Wed Jun 22 16:54:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ganapati Kundapura X-Patchwork-Id: 113260 X-Patchwork-Delegate: jerinj@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D48CDA034C; Wed, 22 Jun 2022 18:54:31 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A983C4069F; Wed, 22 Jun 2022 18:54:20 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mails.dpdk.org (Postfix) with ESMTP id D6C6140DDD for ; Wed, 22 Jun 2022 18:54:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1655916855; x=1687452855; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=HF8rspENHf8njPePyfB9atWn+EfhubG6RzA8Zxbmxus=; b=O/SH3UJBbgG8Mv575AuG0kSCuZHkbNGeM27CXWYNCqhwOa1g+xlPcVjj O9YGySBhyt4iS7BUN8tcEPvTQ4rwRXep5Ri776ssnh4q3pMqbgfa22z/4 P6RGEH06jtHe3/fRsdxl1AGOJd6H9WViUaJzJmvBMuu7PYObZ7IyFoFYJ s7df58JMQYaR5v/e86KvANVTBVWvwTRLlE9SOoBJC6J09HQHcP/q38zVR IqY4fZJJFVSzEILFKL9g9SjZNlUxmN02vHDd5whgxIuKYlb6GTh6xmHpW BrxwBNa4BjT51jqm3YQsqXLzsjWnjvNpkA7D4LQczyzt0lNYP5fYYx0TB g==; X-IronPort-AV: E=McAfee;i="6400,9594,10386"; a="281549252" X-IronPort-AV: E=Sophos;i="5.92,212,1650956400"; d="scan'208";a="281549252" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Jun 2022 09:54:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.92,212,1650956400"; d="scan'208";a="677645882" Received: from txandevlnx322.an.intel.com ([10.123.117.44]) by FMSMGA003.fm.intel.com with ESMTP; 22 Jun 2022 09:54:12 -0700 From: Ganapati Kundapura To: dev@dpdk.org, jerinj@marvell.com, jay.jayatheerthan@intel.com, s.v.naga.harish.k@intel.com Subject: [PATCH v8 4/7] eventdev/eth_tx: add instance get API Date: Wed, 22 Jun 2022 11:54:02 -0500 Message-Id: <20220622165405.533042-4-ganapati.kundapura@intel.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20220622165405.533042-1-ganapati.kundapura@intel.com> References: <20220622103756.421869-1-ganapati.kundapura@intel.com> <20220622165405.533042-1-ganapati.kundapura@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Added rte_event_eth_tx_adapter_instance_get() to get the adapter instance id for specified ethernet device id and tx queue index. Signed-off-by: Ganapati Kundapura Reviewed-by: Naga Harish K S V --- lib/eventdev/eventdev_pmd.h | 23 +++++++ lib/eventdev/rte_event_eth_tx_adapter.c | 102 +++++++++++++++++++++++++++++++- lib/eventdev/rte_event_eth_tx_adapter.h | 24 ++++++++ lib/eventdev/version.map | 1 + 4 files changed, 148 insertions(+), 2 deletions(-) diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h index c58ba05..f514a37 100644 --- a/lib/eventdev/eventdev_pmd.h +++ b/lib/eventdev/eventdev_pmd.h @@ -1274,6 +1274,27 @@ typedef int (*eventdev_eth_tx_adapter_stats_get_t)( typedef int (*eventdev_eth_tx_adapter_stats_reset_t)(uint8_t id, const struct rte_eventdev *dev); +/** + * Get TX adapter instance id for TX queue + * + * @param eth_dev_id + * Port identifier of Ethernet device + * + * @param tx_queue_id + * Ethernet device TX queue index + * + * @param[out] txa_inst_id + * Pointer to TX adapter instance identifier + * Contains valid Tx adapter instance id when return value is 0 + * + * @return + * - 0: Success + * - <0: Error code on failure + */ +typedef int (*eventdev_eth_tx_adapter_instance_get_t) + (uint16_t eth_dev_id, uint16_t tx_queue_id, uint8_t *txa_inst_id); + + /** Event device operations function pointer table */ struct eventdev_ops { eventdev_info_get_t dev_infos_get; /**< Get device info. */ @@ -1386,6 +1407,8 @@ struct eventdev_ops { /**< Get eth Tx adapter statistics */ eventdev_eth_tx_adapter_stats_reset_t eth_tx_adapter_stats_reset; /**< Reset eth Tx adapter statistics */ + eventdev_eth_tx_adapter_instance_get_t eth_tx_adapter_instance_get; + /**< Get Tx adapter instance id for Tx queue */ eventdev_selftest dev_selftest; /**< Start eventdev Selftest */ diff --git a/lib/eventdev/rte_event_eth_tx_adapter.c b/lib/eventdev/rte_event_eth_tx_adapter.c index c700fb7..44a60cc 100644 --- a/lib/eventdev/rte_event_eth_tx_adapter.c +++ b/lib/eventdev/rte_event_eth_tx_adapter.c @@ -18,6 +18,9 @@ #define TXA_INVALID_DEV_ID INT32_C(-1) #define TXA_INVALID_SERVICE_ID INT64_C(-1) +#define TXA_ADAPTER_ARRAY "txa_adapter_array" +#define TXA_SERVICE_DATA_ARRAY "txa_service_data_array" + #define txa_evdev(id) (&rte_eventdevs[txa_dev_id_array[(id)]]) #define txa_dev_caps_get(id) txa_evdev((id))->dev_ops->eth_tx_adapter_caps_get @@ -41,6 +44,9 @@ #define txa_dev_stats_get(t) txa_evdev(t)->dev_ops->eth_tx_adapter_stats_get +#define txa_dev_instance_get(id) \ + txa_evdev(id)->dev_ops->eth_tx_adapter_instance_get + #define RTE_EVENT_ETH_TX_ADAPTER_ID_VALID_OR_ERR_RET(id, retval) \ do { \ if (!txa_valid_id(id)) { \ @@ -194,12 +200,34 @@ txa_memzone_array_get(const char *name, unsigned int elt_size, int nb_elems) } static int +txa_lookup(void) +{ + const struct rte_memzone *mz; + + if (txa_dev_id_array == NULL) { + mz = rte_memzone_lookup(TXA_ADAPTER_ARRAY); + if (mz == NULL) + return -ENOMEM; + txa_dev_id_array = mz->addr; + } + + if (txa_service_data_array == NULL) { + mz = rte_memzone_lookup(TXA_SERVICE_DATA_ARRAY); + if (mz == NULL) + return -ENOMEM; + txa_service_data_array = mz->addr; + } + + return 0; +} + +static int txa_dev_id_array_init(void) { if (txa_dev_id_array == NULL) { int i; - txa_dev_id_array = txa_memzone_array_get("txa_adapter_array", + txa_dev_id_array = txa_memzone_array_get(TXA_ADAPTER_ARRAY, sizeof(int), RTE_EVENT_ETH_TX_ADAPTER_MAX_INSTANCE); if (txa_dev_id_array == NULL) @@ -222,12 +250,18 @@ static int txa_service_data_init(void) { if (txa_service_data_array == NULL) { + int i; + txa_service_data_array = - txa_memzone_array_get("txa_service_data_array", + txa_memzone_array_get(TXA_SERVICE_DATA_ARRAY, sizeof(*txa_service_data_array), RTE_EVENT_ETH_TX_ADAPTER_MAX_INSTANCE); if (txa_service_data_array == NULL) return -ENOMEM; + + /* Reset the txa service pointers */ + for (i = 0; i < RTE_EVENT_ETH_TX_ADAPTER_MAX_INSTANCE; i++) + txa_service_data_array[i] = NULL; } return 0; @@ -1218,3 +1252,67 @@ rte_event_eth_tx_adapter_stop(uint8_t id) rte_eventdev_trace_eth_tx_adapter_stop(id, ret); return ret; } + +int +rte_event_eth_tx_adapter_instance_get(uint16_t eth_dev_id, + uint16_t tx_queue_id, + uint8_t *txa_inst_id) +{ + uint8_t id; + int ret = -EINVAL; + uint32_t caps; + struct txa_service_data *txa; + + if (txa_lookup()) + return -ENOMEM; + + if (eth_dev_id >= rte_eth_dev_count_avail()) { + RTE_EDEV_LOG_ERR("Invalid ethernet port id %u", eth_dev_id); + return -EINVAL; + } + + if (tx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_tx_queues) { + RTE_EDEV_LOG_ERR("Invalid tx queue id %u", tx_queue_id); + return -EINVAL; + } + + if (txa_inst_id == NULL) { + RTE_EDEV_LOG_ERR("txa_instance_id cannot be NULL"); + return -EINVAL; + } + + /* Iterate through all Tx adapter instances */ + for (id = 0; id < RTE_EVENT_ETH_TX_ADAPTER_MAX_INSTANCE; id++) { + txa = txa_service_id_to_data(id); + if (!txa) + continue; + + caps = 0; + if (rte_event_eth_tx_adapter_caps_get(txa->eventdev_id, + eth_dev_id, + &caps)) + continue; + + if (caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT) { + ret = txa_dev_instance_get(id) ? + txa_dev_instance_get(id)(eth_dev_id, + tx_queue_id, + txa_inst_id) + : -EINVAL; + if (ret == 0) + return ret; + } else { + struct rte_eth_dev *eth_dev; + + eth_dev = &rte_eth_devices[eth_dev_id]; + + if (txa_service_is_queue_added(txa, eth_dev, + tx_queue_id)) { + *txa_inst_id = txa->id; + return 0; + } + } + } + + return -EINVAL; +} diff --git a/lib/eventdev/rte_event_eth_tx_adapter.h b/lib/eventdev/rte_event_eth_tx_adapter.h index 3908c2d..9432b74 100644 --- a/lib/eventdev/rte_event_eth_tx_adapter.h +++ b/lib/eventdev/rte_event_eth_tx_adapter.h @@ -34,6 +34,7 @@ * - rte_event_eth_tx_adapter_enqueue() * - rte_event_eth_tx_adapter_event_port_get() * - rte_event_eth_tx_adapter_service_id_get() + * - rte_event_eth_tx_adapter_instance_get() * * The application creates the adapter using * rte_event_eth_tx_adapter_create() or rte_event_eth_tx_adapter_create_ext(). @@ -423,6 +424,29 @@ rte_event_eth_tx_adapter_stats_reset(uint8_t id); int rte_event_eth_tx_adapter_service_id_get(uint8_t id, uint32_t *service_id); +/** + * Get TX adapter instance id for TX queue + * + * @param eth_dev_id + * Port identifier of Ethernet device + * + * @param tx_queue_id + * Etherdev device TX queue index + * + * @param[out] txa_inst_id + * Pointer to TX adapter instance identifier + * Contains valid Tx adapter instance id when return value is 0 + * + * @return + * - 0: Success + * - <0: Error code on failure + */ +__rte_experimental +int +rte_event_eth_tx_adapter_instance_get(uint16_t eth_dev_id, + uint16_t tx_queue_id, + uint8_t *txa_inst_id); + #ifdef __cplusplus } #endif diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map index d1ecda4..dd9255c 100644 --- a/lib/eventdev/version.map +++ b/lib/eventdev/version.map @@ -111,6 +111,7 @@ EXPERIMENTAL { # added in 22.07 rte_event_eth_rx_adapter_instance_get; + rte_event_eth_tx_adapter_instance_get; rte_event_port_quiesce; rte_event_queue_attr_set; };