From patchwork Thu Nov 4 21:58:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 103803 X-Patchwork-Delegate: ajit.khaparde@broadcom.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 1BB86A0C5E; Thu, 4 Nov 2021 23:00:58 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 091B442803; Thu, 4 Nov 2021 22:59:22 +0100 (CET) Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) by mails.dpdk.org (Postfix) with ESMTP id 58F574279F for ; Thu, 4 Nov 2021 22:59:16 +0100 (CET) Received: by mail-pl1-f170.google.com with SMTP id f8so9512199plo.12 for ; Thu, 04 Nov 2021 14:59:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version; bh=S61qCXnXkArRf7WVDjWMnL0iNcet0YU6NXM01UaI8cg=; b=XBXACR8Aw00TxQ2BlwqpbAZByyt6ekrpN8Kfin/FkB5oGhgf4ll2tl7jzbo6r43eb9 2BtrcrFkWiHh7KccB9malgQYTTpHENdim8Oo18JqZSIJJVan9X8XZ8YGqcdRhDxTeVmH xrqzSsEadIjgwVrjStHfT7IIGhjemlK6llqF0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version; bh=S61qCXnXkArRf7WVDjWMnL0iNcet0YU6NXM01UaI8cg=; b=fXsaFqcs0NndG1RqxfWFLBV3BTU0XnP7rnFnR7olYDRkuJwJBum8GKcVzb1rx5OPhK /D6aQKC8087EsIeDjfvPYfyK+0OrM/XmX73Y+n6tUeSf4HIpxYsFFgw2VP4lYrVaevVc pj/8KoKRPzHa9cJFRWzulAS8+DKxl8sMXwW5YJhdBg0jRCIrFWNKK29pYNbGze2zH3vy /H7IlmrQ3TgyMvoc0CWoqPlrxmLPGQf7TqmlGpccg5xcQUh4f61OQQ0lrkbQs3//EAZH ARww/Cik0C+IzDTVvjI3eEH1Vw+u3YybwF74bHwDba5pXuEuIzRLMj9g/qkFjoZTUJp2 fLbQ== X-Gm-Message-State: AOAM531eQ/CR/A1X8LcVq9srSCUrDPA9ct8/rYiDsbANgM+ltt/T/mJR lyBSVE+abyvEommA4+lLnZuaUYqGogsidJsRiE0UuW4R8RFAbDJgu2W3qnZskVnTHQRBDfj++IX zPaO3IuPDdUdmlJJjm2vr8eDsVT9ZTRAoyVWzcXZBge3IRDelCRCamUbo+lTrLaI= X-Google-Smtp-Source: ABdhPJyKezZmuC98+YZ8ZCXjOkbDyGXtDHZkkbGodfxyuZQidQAlDTn77JchBPIWtIOCVfSnRrRoWA== X-Received: by 2002:a17:902:bf43:b0:142:41bb:a6f with SMTP id u3-20020a170902bf4300b0014241bb0a6fmr2278767pls.22.1636063155152; Thu, 04 Nov 2021 14:59:15 -0700 (PDT) Received: from C02GC2QQMD6T.wifi.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id pg5sm8532242pjb.26.2021.11.04.14.59.14 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Nov 2021 14:59:14 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: Jay Ding , Venkat Duvvuru , Farah Smith , Randy Schacher Date: Thu, 4 Nov 2021 14:58:41 -0700 Message-Id: <20211104215846.58672-18-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.30.1 (Apple Git-130) In-Reply-To: <20211104215846.58672-1-ajit.khaparde@broadcom.com> References: <20211103005251.25524-1-ajit.khaparde@broadcom.com> <20211104215846.58672-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [dpdk-dev] [PATCH v5 17/22] net/bnxt: add new TruFlow API to get SRAM resources 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 Sender: "dev" From: Jay Ding Implement tf_get_sram_resources to return SRAM partition information, including bank count and SRAM profile number. Signed-off-by: Jay Ding Signed-off-by: Venkat Duvvuru Reviewed-by: Farah Smith Reviewed-by: Randy Schacher Acked-by: Ajit Khaparde --- drivers/net/bnxt/tf_core/tf_core.c | 86 ++++++++++++++++++++++++ drivers/net/bnxt/tf_core/tf_core.h | 63 +++++++++++++++++ drivers/net/bnxt/tf_core/tf_device.h | 20 ++++++ drivers/net/bnxt/tf_core/tf_device_p4.c | 6 +- drivers/net/bnxt/tf_core/tf_device_p58.c | 53 ++++++++++++++- drivers/net/bnxt/tf_core/tf_msg.c | 28 ++------ drivers/net/bnxt/tf_core/tf_msg.h | 6 +- drivers/net/bnxt/tf_core/tf_rm.c | 3 +- drivers/net/bnxt/tf_core/tf_sram_mgr.h | 10 --- 9 files changed, 237 insertions(+), 38 deletions(-) diff --git a/drivers/net/bnxt/tf_core/tf_core.c b/drivers/net/bnxt/tf_core/tf_core.c index 86dfec0eb4..346d220c87 100644 --- a/drivers/net/bnxt/tf_core/tf_core.c +++ b/drivers/net/bnxt/tf_core/tf_core.c @@ -1831,3 +1831,89 @@ int tf_get_version(struct tf *tfp, return 0; } + +int tf_query_sram_resources(struct tf *tfp, + struct tf_query_sram_resources_parms *parms) +{ + int rc; + struct tf_dev_info dev; + uint16_t max_types; + struct tfp_calloc_parms cparms; + struct tf_rm_resc_req_entry *query; + enum tf_rm_resc_resv_strategy resv_strategy; + + TF_CHECK_PARMS2(tfp, parms); + + /* This function can be called before open session, filter + * out any non-supported device types on the Core side. + */ + if (parms->device_type != TF_DEVICE_TYPE_THOR) { + TFP_DRV_LOG(ERR, + "Unsupported device type %d\n", + parms->device_type); + return -ENOTSUP; + } + + tf_dev_bind_ops(parms->device_type, &dev); + + if (dev.ops->tf_dev_get_max_types == NULL) { + rc = -EOPNOTSUPP; + TFP_DRV_LOG(ERR, + "%s: Operation not supported, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return -EOPNOTSUPP; + } + + /* Need device max number of elements for the RM QCAPS */ + rc = dev.ops->tf_dev_get_max_types(tfp, &max_types); + if (rc) { + TFP_DRV_LOG(ERR, + "Get SRAM resc info failed, rc:%s\n", + strerror(-rc)); + return rc; + } + + /* Allocate memory for RM QCAPS request */ + cparms.nitems = max_types; + cparms.size = sizeof(struct tf_rm_resc_req_entry); + cparms.alignment = 0; + rc = tfp_calloc(&cparms); + if (rc) + return rc; + + query = (struct tf_rm_resc_req_entry *)cparms.mem_va; + tfp->bp = parms->bp; + + /* Get Firmware Capabilities */ + rc = tf_msg_session_resc_qcaps(tfp, + &dev, + parms->dir, + max_types, + query, + &resv_strategy, + &parms->sram_profile); + if (rc) + return rc; + + if (dev.ops->tf_dev_get_sram_resources == NULL) { + rc = -EOPNOTSUPP; + TFP_DRV_LOG(ERR, + "%s: Operation not supported, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return -EOPNOTSUPP; + } + + rc = dev.ops->tf_dev_get_sram_resources((void *)query, + parms->bank_resc_count, + &parms->dynamic_sram_capable); + if (rc) { + TFP_DRV_LOG(ERR, + "Get SRAM resc info failed, rc:%s\n", + strerror(-rc)); + return rc; + } + + return 0; +} diff --git a/drivers/net/bnxt/tf_core/tf_core.h b/drivers/net/bnxt/tf_core/tf_core.h index ba9881c69d..078fd278a1 100644 --- a/drivers/net/bnxt/tf_core/tf_core.h +++ b/drivers/net/bnxt/tf_core/tf_core.h @@ -75,6 +75,17 @@ enum tf_wc_num_slice { TF_WC_TCAM_8_SLICE_PER_ROW = 8, }; +/** + * Bank identifier + */ +enum tf_sram_bank_id { + TF_SRAM_BANK_ID_0, /**< SRAM Bank 0 id */ + TF_SRAM_BANK_ID_1, /**< SRAM Bank 1 id */ + TF_SRAM_BANK_ID_2, /**< SRAM Bank 2 id */ + TF_SRAM_BANK_ID_3, /**< SRAM Bank 3 id */ + TF_SRAM_BANK_ID_MAX /**< SRAM Bank index limit */ +}; + /** * EEM record AR helper * @@ -2438,4 +2449,56 @@ struct tf_get_version_parms { */ int tf_get_version(struct tf *tfp, struct tf_get_version_parms *parms); + +/** + * tf_query_sram_resources parameter definition + */ +struct tf_query_sram_resources_parms { + /** + * [in] device type + * + * Device type for the session. + */ + enum tf_device_type device_type; + + /** + * [in] bp + * The pointer to the parent bp struct. This is only used for HWRM + * message passing within the portability layer. The type is struct + * bnxt. + */ + void *bp; + + /** + * [in] Receive or transmit direction + */ + enum tf_dir dir; + + /** + * [out] Bank resource count in 8 bytes entry + */ + + uint32_t bank_resc_count[TF_SRAM_BANK_ID_MAX]; + + /** + * [out] Dynamic SRAM Enable + */ + bool dynamic_sram_capable; + + /** + * [out] SRAM profile + */ + uint8_t sram_profile; +}; + +/** + * Get SRAM resources information + * + * Used to retrieve sram bank partition information + * + * Returns success or failure code. + */ +int tf_query_sram_resources(struct tf *tfp, + struct tf_query_sram_resources_parms *parms); + #endif /* _TF_CORE_H_ */ diff --git a/drivers/net/bnxt/tf_core/tf_device.h b/drivers/net/bnxt/tf_core/tf_device.h index 88bd4515ff..9360eb1358 100644 --- a/drivers/net/bnxt/tf_core/tf_device.h +++ b/drivers/net/bnxt/tf_core/tf_device.h @@ -1081,6 +1081,26 @@ struct tf_dev_ops { uint32_t *tcam_caps, uint32_t *tbl_caps, uint32_t *em_caps); + + /** + * Device specific function that retrieve the sram resource + * + * [in] query + * Point to resources query result + * + * [out] sram_bank_caps + * Pointer to SRAM bank capabilities + * + * [out] dynamic_sram_capable + * Pointer to dynamic sram capable + * + * Returns + * - (0) if successful. + * - (-EINVAL) on failure. + */ + int (*tf_dev_get_sram_resources)(void *query, + uint32_t *sram_bank_caps, + bool *dynamic_sram_capable); }; /** diff --git a/drivers/net/bnxt/tf_core/tf_device_p4.c b/drivers/net/bnxt/tf_core/tf_device_p4.c index 8089785b82..cf0e919f9f 100644 --- a/drivers/net/bnxt/tf_core/tf_device_p4.c +++ b/drivers/net/bnxt/tf_core/tf_device_p4.c @@ -382,7 +382,8 @@ const struct tf_dev_ops tf_dev_ops_p4_init = { .tf_dev_get_global_cfg = NULL, .tf_dev_get_mailbox = tf_dev_p4_get_mailbox, .tf_dev_word_align = NULL, - .tf_dev_map_hcapi_caps = tf_dev_p4_map_hcapi_caps + .tf_dev_map_hcapi_caps = tf_dev_p4_map_hcapi_caps, + .tf_dev_get_sram_resources = NULL }; /** @@ -445,5 +446,6 @@ const struct tf_dev_ops tf_dev_ops_p4 = { .tf_dev_get_mailbox = tf_dev_p4_get_mailbox, .tf_dev_word_align = tf_dev_p4_word_align, .tf_dev_cfa_key_hash = hcapi_cfa_p4_key_hash, - .tf_dev_map_hcapi_caps = tf_dev_p4_map_hcapi_caps + .tf_dev_map_hcapi_caps = tf_dev_p4_map_hcapi_caps, + .tf_dev_get_sram_resources = NULL }; diff --git a/drivers/net/bnxt/tf_core/tf_device_p58.c b/drivers/net/bnxt/tf_core/tf_device_p58.c index 03e72b90f5..4687fa65dd 100644 --- a/drivers/net/bnxt/tf_core/tf_device_p58.c +++ b/drivers/net/bnxt/tf_core/tf_device_p58.c @@ -397,6 +397,53 @@ static int tf_dev_p58_map_hcapi_caps(uint64_t hcapi_caps, return 0; } +/** + * Device specific function that retrieve the sram resource + * + * [in] query + * Point to resources query result + * + * [out] sram_bank_caps + * Pointer to SRAM bank capabilities + * + * [out] dynamic_sram_capable + * Pointer to dynamic sram capable + * + * Returns + * - (0) if successful. + * - (-EINVAL) on failure. + */ +static int tf_dev_p58_get_sram_resources(void *q, + uint32_t *sram_bank_caps, + bool *dynamic_sram_capable) +{ + uint32_t i; + struct tf_rm_resc_req_entry *query = q; + + for (i = 0; i < CFA_RESOURCE_TYPE_P58_LAST + 1; i++) { + switch (query[i].type) { + case CFA_RESOURCE_TYPE_P58_SRAM_BANK_0: + sram_bank_caps[0] = query[i].max; + break; + case CFA_RESOURCE_TYPE_P58_SRAM_BANK_1: + sram_bank_caps[1] = query[i].max; + break; + case CFA_RESOURCE_TYPE_P58_SRAM_BANK_2: + sram_bank_caps[2] = query[i].max; + break; + case CFA_RESOURCE_TYPE_P58_SRAM_BANK_3: + sram_bank_caps[3] = query[i].max; + break; + default: + break; + } + } + + *dynamic_sram_capable = false; + + return 0; +} + /** * Truflow P58 device specific functions */ @@ -447,7 +494,8 @@ const struct tf_dev_ops tf_dev_ops_p58_init = { .tf_dev_get_global_cfg = NULL, .tf_dev_get_mailbox = tf_dev_p58_get_mailbox, .tf_dev_word_align = NULL, - .tf_dev_map_hcapi_caps = tf_dev_p58_map_hcapi_caps + .tf_dev_map_hcapi_caps = tf_dev_p58_map_hcapi_caps, + .tf_dev_get_sram_resources = tf_dev_p58_get_sram_resources }; /** @@ -511,5 +559,6 @@ const struct tf_dev_ops tf_dev_ops_p58 = { .tf_dev_get_mailbox = tf_dev_p58_get_mailbox, .tf_dev_word_align = tf_dev_p58_word_align, .tf_dev_cfa_key_hash = hcapi_cfa_p58_key_hash, - .tf_dev_map_hcapi_caps = tf_dev_p58_map_hcapi_caps + .tf_dev_map_hcapi_caps = tf_dev_p58_map_hcapi_caps, + .tf_dev_get_sram_resources = tf_dev_p58_get_sram_resources }; diff --git a/drivers/net/bnxt/tf_core/tf_msg.c b/drivers/net/bnxt/tf_core/tf_msg.c index 25bf026658..fbc96d374c 100644 --- a/drivers/net/bnxt/tf_core/tf_msg.c +++ b/drivers/net/bnxt/tf_core/tf_msg.c @@ -380,39 +380,20 @@ tf_msg_session_resc_qcaps(struct tf *tfp, enum tf_dir dir, uint16_t size, struct tf_rm_resc_req_entry *query, - enum tf_rm_resc_resv_strategy *resv_strategy) + enum tf_rm_resc_resv_strategy *resv_strategy, + uint8_t *sram_profile) { int rc; int i; struct tfp_send_msg_parms parms = { 0 }; struct hwrm_tf_session_resc_qcaps_input req = { 0 }; struct hwrm_tf_session_resc_qcaps_output resp = { 0 }; - uint8_t fw_session_id; struct tf_msg_dma_buf qcaps_buf = { 0 }; struct tf_rm_resc_req_entry *data; int dma_size; - struct tf_session *tfs; - - /* Retrieve the session information */ - rc = tf_session_get_session_internal(tfp, &tfs); - if (rc) { - TFP_DRV_LOG(ERR, - "Failed to lookup session, rc:%s\n", - strerror(-rc)); - return rc; - } TF_CHECK_PARMS3(tfp, query, resv_strategy); - rc = tf_session_get_fw_session_id(tfp, &fw_session_id); - if (rc) { - TFP_DRV_LOG(ERR, - "%s: Unable to lookup FW id, rc:%s\n", - tf_dir_2_str(dir), - strerror(-rc)); - return rc; - } - /* Prepare DMA buffer */ dma_size = size * sizeof(struct tf_rm_resc_req_entry); rc = tf_msg_alloc_dma_buf(&qcaps_buf, dma_size); @@ -420,7 +401,7 @@ tf_msg_session_resc_qcaps(struct tf *tfp, return rc; /* Populate the request */ - req.fw_session_id = tfp_cpu_to_le_32(fw_session_id); + req.fw_session_id = 0; req.flags = tfp_cpu_to_le_16(dir); req.qcaps_size = size; req.qcaps_addr = tfp_cpu_to_le_64(qcaps_buf.pa_addr); @@ -460,6 +441,9 @@ tf_msg_session_resc_qcaps(struct tf *tfp, *resv_strategy = resp.flags & HWRM_TF_SESSION_RESC_QCAPS_OUTPUT_FLAGS_SESS_RESV_STRATEGY_MASK; + if (sram_profile != NULL) + *sram_profile = resp.sram_profile; + cleanup: tf_msg_free_dma_buf(&qcaps_buf); diff --git a/drivers/net/bnxt/tf_core/tf_msg.h b/drivers/net/bnxt/tf_core/tf_msg.h index 08d20cdd7a..188b361d71 100644 --- a/drivers/net/bnxt/tf_core/tf_msg.h +++ b/drivers/net/bnxt/tf_core/tf_msg.h @@ -158,6 +158,9 @@ int tf_msg_session_qcfg(struct tf *tfp); * [out] resv_strategy * Pointer to the reservation strategy * + * [out] sram_profile + * Pointer to the sram profile + * * Returns: * 0 on Success else internal Truflow error */ @@ -166,7 +169,8 @@ int tf_msg_session_resc_qcaps(struct tf *tfp, enum tf_dir dir, uint16_t size, struct tf_rm_resc_req_entry *query, - enum tf_rm_resc_resv_strategy *resv_strategy); + enum tf_rm_resc_resv_strategy *resv_strategy, + uint8_t *sram_profile); /** * Sends session HW resource allocation request to TF Firmware diff --git a/drivers/net/bnxt/tf_core/tf_rm.c b/drivers/net/bnxt/tf_core/tf_rm.c index dd537aaece..d2045921b9 100644 --- a/drivers/net/bnxt/tf_core/tf_rm.c +++ b/drivers/net/bnxt/tf_core/tf_rm.c @@ -551,7 +551,8 @@ tf_rm_create_db(struct tf *tfp, parms->dir, max_types, query, - &resv_strategy); + &resv_strategy, + NULL); if (rc) return rc; diff --git a/drivers/net/bnxt/tf_core/tf_sram_mgr.h b/drivers/net/bnxt/tf_core/tf_sram_mgr.h index 4abe3fb468..eb2156456a 100644 --- a/drivers/net/bnxt/tf_core/tf_sram_mgr.h +++ b/drivers/net/bnxt/tf_core/tf_sram_mgr.h @@ -28,16 +28,6 @@ #define TF_SRAM_MGR_BLOCK_SZ_BYTES 64 #define TF_SRAM_MGR_MIN_SLICE_BYTES 8 -/** - * Bank identifier - */ -enum tf_sram_bank_id { - TF_SRAM_BANK_ID_0, /**< SRAM Bank 0 id */ - TF_SRAM_BANK_ID_1, /**< SRAM Bank 1 id */ - TF_SRAM_BANK_ID_2, /**< SRAM Bank 2 id */ - TF_SRAM_BANK_ID_3, /**< SRAM Bank 3 id */ - TF_SRAM_BANK_ID_MAX /**< SRAM Bank index limit */ -}; /** * TF slice size.