From patchwork Sun Jun 13 00:06:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 94120 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 C1CE9A0C41; Sun, 13 Jun 2021 02:10:54 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id EE10C411D4; Sun, 13 Jun 2021 02:07:37 +0200 (CEST) Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) by mails.dpdk.org (Postfix) with ESMTP id 449694014F for ; Sun, 13 Jun 2021 02:07:33 +0200 (CEST) Received: by mail-pj1-f46.google.com with SMTP id h16so7699469pjv.2 for ; Sat, 12 Jun 2021 17:07:33 -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=SjkvSstDTpw95gf8IgazypCIN7hpUhB7rOA/gcK4Sko=; b=MPQU2HlTV7zbFxlt1fugZQ5juDjsYj7tWe9QhynY/THXckqmAekP2BD7HPdsn43yy5 w9pGKX3xIIHEpS4P+/fG/bsWxYbvl0Zoe52KwvTarAre1WKM0Mnjzr4DssVZS3jo9DBA yeE4vNLSGCsYoWbaH7VkP8aSlDe/2zo8WgOEo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version; bh=SjkvSstDTpw95gf8IgazypCIN7hpUhB7rOA/gcK4Sko=; b=fFy9Yktc2++O9RdW8VQoVvCcs6ocFr8E4PZRsqqM3KVNUUfb9M20OokEmGOV4fZK9l nFVH0Qit3cL6pxNwEFc/9EW+jyqkVs3MrqdRtYudFQjzjmsl+Zfjip+5nLe0xmClX+YW P0WLmC61kVXeHBjJO9Uf2rzkXucEu5W0jMnLOBUcUrPxlZvU9jp4W3lFJDjr4FKog4ah 5XkfyOp1SJHd/S/ObYRJ+A0c1/4wgNaPHuA4sKOKivyO4UbgURHKCAS22OxOIeYJdzjG 6kHLSpDYzmNyjIj/tXk1/E2X1iPV0jInrnp0L6h5mjw1J8VwBKQ/1aNwbhQWHwq0lNTg kK7g== X-Gm-Message-State: AOAM5314B9eDFrA+Tw641vA6Jmnl7KQwMvwFeAbnc85DpH+I6dMybsK3 SWWkFJ5wBE343y3iMfk67MOGegq+pqGGE2SgUfFMwokgkQyEGgL4KkPrlQpJVgaIctvhd9Z5xtx tXWY5rTwNDeZNEUa4GGjiV3LmCdROUg9zjQVxCPKYn96xXJBbF7/fQb32/fIcI9o= X-Google-Smtp-Source: ABdhPJzln/pXUUC+jQ9cryeV4sUsb3sTyfVwODjdkmOpAMlV0Mal4aBObP6ZCkxqtIXuGXn0fB/SFg== X-Received: by 2002:a17:90a:390d:: with SMTP id y13mr15708721pjb.133.1623542851887; Sat, 12 Jun 2021 17:07:31 -0700 (PDT) Received: from localhost.localdomain ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id gg22sm12774609pjb.17.2021.06.12.17.07.30 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 12 Jun 2021 17:07:31 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: Farah Smith , Randy Schacher , Venkat Duvvuru , Jay Ding , Peter Spreadborough Date: Sat, 12 Jun 2021 17:06:19 -0700 Message-Id: <20210613000652.28191-26-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20210613000652.28191-1-ajit.khaparde@broadcom.com> References: <20210530085929.29695-1-venkatkumar.duvvuru@broadcom.com> <20210613000652.28191-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [dpdk-dev] [PATCH v2 25/58] net/bnxt: add API to clear TCAM regions 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: Farah Smith Add TRUFLOW API to clear either the hi or the low regions in WildCard TCAM for ungraceful exit cleanup. Signed-off-by: Farah Smith Signed-off-by: Randy Schacher Signed-off-by: Venkat Duvvuru Reviewed-by: Jay Ding Reviewed-by: Peter Spreadborough Reviewed-by: Ajit Khaparde --- drivers/net/bnxt/tf_core/tf_core.c | 51 ++++++++++ drivers/net/bnxt/tf_core/tf_core.h | 39 +++++++- drivers/net/bnxt/tf_core/tf_device.h | 19 +++- drivers/net/bnxt/tf_core/tf_device_p4.c | 4 +- drivers/net/bnxt/tf_core/tf_device_p58.c | 1 + drivers/net/bnxt/tf_core/tf_tcam_shared.c | 111 +++++++++++++++++++++- drivers/net/bnxt/tf_core/tf_tcam_shared.h | 21 ++++ drivers/net/bnxt/tf_core/tf_util.h | 1 - 8 files changed, 235 insertions(+), 12 deletions(-) diff --git a/drivers/net/bnxt/tf_core/tf_core.c b/drivers/net/bnxt/tf_core/tf_core.c index 0fbbd40252..97e6165e92 100644 --- a/drivers/net/bnxt/tf_core/tf_core.c +++ b/drivers/net/bnxt/tf_core/tf_core.c @@ -968,6 +968,57 @@ tf_move_tcam_shared_entries(struct tf *tfp, return 0; } + +int +tf_clear_tcam_shared_entries(struct tf *tfp, + struct tf_clear_tcam_shared_entries_parms *parms) +{ + int rc; + struct tf_session *tfs; + struct tf_dev_info *dev; + + TF_CHECK_PARMS2(tfp, parms); + + /* Retrieve the session information */ + rc = tf_session_get_session(tfp, &tfs); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to lookup session, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + /* Retrieve the device information */ + rc = tf_session_get_device(tfs, &dev); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to lookup device, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + if (dev->ops->tf_dev_clear_tcam == NULL) { + rc = -EOPNOTSUPP; + TFP_DRV_LOG(ERR, + "%s: Operation not supported, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + rc = dev->ops->tf_dev_clear_tcam(tfp, parms); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: TCAM shared entries clear failed, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + return 0; +} #endif /* TF_TCAM_SHARED */ int diff --git a/drivers/net/bnxt/tf_core/tf_core.h b/drivers/net/bnxt/tf_core/tf_core.h index 44c30fa904..0b06bb2bb5 100644 --- a/drivers/net/bnxt/tf_core/tf_core.h +++ b/drivers/net/bnxt/tf_core/tf_core.h @@ -233,7 +233,7 @@ enum tf_identifier_type { */ TF_IDENT_TYPE_EM_PROF, /** - * TH + * (Future) * The L2 func is included in the ILT result and from recycling to * enable virtualization of further lookups. */ @@ -1244,6 +1244,8 @@ int tf_free_tbl_scope(struct tf *tfp, * #ifdef TF_TCAM_SHARED * @ref tf_move_tcam_shared_entries + * + * @ref tf_clear_tcam_shared_entries #endif */ @@ -1580,6 +1582,37 @@ struct tf_move_tcam_shared_entries_parms { int tf_move_tcam_shared_entries(struct tf *tfp, struct tf_move_tcam_shared_entries_parms *parms); +/** + * tf_clear_tcam_shared_entries parameter definition + */ +struct tf_clear_tcam_shared_entries_parms { + /** + * [in] receive or transmit direction + */ + enum tf_dir dir; + /** + * [in] TCAM table type + */ + enum tf_tcam_tbl_type tcam_tbl_type; +}; + +/** + * Clear TCAM shared entries pool + * + * This API only affects the following TCAM pools within a shared session: + * + * TF_TCAM_TBL_TYPE_WC_TCAM_HIGH + * TF_TCAM_TBL_TYPE_WC_TCAM_LOW + * + * When called, the indicated WC TCAM high or low pool will be cleared. + * + * This API is not supported on a non-shared session. + * + * Returns success or failure code. + */ +int tf_clear_tcam_shared_entries(struct tf *tfp, + struct tf_clear_tcam_shared_entries_parms *parms); + #endif /* TF_TCAM_SHARED */ /** * @page table Table Access @@ -2108,7 +2141,7 @@ struct tf_move_em_entry_parms { uint64_t flow_handle; }; /** - * tf_search_em_entry parameter definition + * tf_search_em_entry parameter definition (Future) */ struct tf_search_em_entry_parms { /** @@ -2211,7 +2244,7 @@ int tf_delete_em_entry(struct tf *tfp, struct tf_delete_em_entry_parms *parms); /** - * search em hash entry table memory + * search em hash entry table memory (Future) * * Internal: diff --git a/drivers/net/bnxt/tf_core/tf_device.h b/drivers/net/bnxt/tf_core/tf_device.h index 1893f630e7..da3f541685 100644 --- a/drivers/net/bnxt/tf_core/tf_device.h +++ b/drivers/net/bnxt/tf_core/tf_device.h @@ -595,7 +595,24 @@ struct tf_dev_ops { * -EINVAL - Error */ int (*tf_dev_move_tcam)(struct tf *tfp, - struct tf_move_tcam_shared_entries_parms *parms); + struct tf_move_tcam_shared_entries_parms *parms); + + /** + * Move TCAM shared entries + * + * [in] tfp + * Pointer to TF handle + * + * [in] parms + * Pointer to parameters + * + * returns: + * 0 - Success + * -EINVAL - Error + */ + int (*tf_dev_clear_tcam)(struct tf *tfp, + struct tf_clear_tcam_shared_entries_parms *parms); + #endif /* TF_TCAM_SHARED */ /** diff --git a/drivers/net/bnxt/tf_core/tf_device_p4.c b/drivers/net/bnxt/tf_core/tf_device_p4.c index 239784897d..971fab7bda 100644 --- a/drivers/net/bnxt/tf_core/tf_device_p4.c +++ b/drivers/net/bnxt/tf_core/tf_device_p4.c @@ -248,9 +248,6 @@ const struct tf_dev_ops tf_dev_ops_p4_init = { .tf_dev_alloc_search_tcam = NULL, .tf_dev_set_tcam = NULL, .tf_dev_get_tcam = NULL, -#ifdef TF_TCAM_SHARED - .tf_dev_move_tcam = NULL, -#endif /* TF_TCAM_SHARED */ .tf_dev_get_tcam_resc_info = NULL, .tf_dev_insert_int_em_entry = NULL, .tf_dev_delete_int_em_entry = NULL, @@ -298,6 +295,7 @@ const struct tf_dev_ops tf_dev_ops_p4 = { .tf_dev_set_tcam = tf_tcam_shared_set, .tf_dev_get_tcam = tf_tcam_shared_get, .tf_dev_move_tcam = tf_tcam_shared_move_p4, + .tf_dev_clear_tcam = tf_tcam_shared_clear, #else /* !TF_TCAM_SHARED */ .tf_dev_alloc_tcam = tf_tcam_alloc, .tf_dev_free_tcam = tf_tcam_free, diff --git a/drivers/net/bnxt/tf_core/tf_device_p58.c b/drivers/net/bnxt/tf_core/tf_device_p58.c index 483f771999..6bbc5e21e9 100644 --- a/drivers/net/bnxt/tf_core/tf_device_p58.c +++ b/drivers/net/bnxt/tf_core/tf_device_p58.c @@ -339,6 +339,7 @@ const struct tf_dev_ops tf_dev_ops_p58 = { .tf_dev_set_tcam = tf_tcam_shared_set, .tf_dev_get_tcam = tf_tcam_shared_get, .tf_dev_move_tcam = tf_tcam_shared_move_p58, + .tf_dev_clear_tcam = tf_tcam_shared_clear, #else /* !TF_TCAM_SHARED */ .tf_dev_alloc_tcam = tf_tcam_alloc, .tf_dev_free_tcam = tf_tcam_free, diff --git a/drivers/net/bnxt/tf_core/tf_tcam_shared.c b/drivers/net/bnxt/tf_core/tf_tcam_shared.c index b96d9ca9dd..c1c94829d7 100644 --- a/drivers/net/bnxt/tf_core/tf_tcam_shared.c +++ b/drivers/net/bnxt/tf_core/tf_tcam_shared.c @@ -1154,8 +1154,9 @@ int tf_tcam_shared_move(struct tf *tfp, return rc; } -int tf_tcam_shared_move_p4(struct tf *tfp, - struct tf_move_tcam_shared_entries_parms *parms) +int +tf_tcam_shared_move_p4(struct tf *tfp, + struct tf_move_tcam_shared_entries_parms *parms) { int rc = 0; rc = tf_tcam_shared_move(tfp, @@ -1167,8 +1168,9 @@ int tf_tcam_shared_move_p4(struct tf *tfp, } -int tf_tcam_shared_move_p58(struct tf *tfp, - struct tf_move_tcam_shared_entries_parms *parms) +int +tf_tcam_shared_move_p58(struct tf *tfp, + struct tf_move_tcam_shared_entries_parms *parms) { int rc = 0; rc = tf_tcam_shared_move(tfp, @@ -1178,3 +1180,104 @@ int tf_tcam_shared_move_p58(struct tf *tfp, true); /* set enable bit */ return rc; } + +int +tf_tcam_shared_clear(struct tf *tfp, + struct tf_clear_tcam_shared_entries_parms *parms) +{ + int rc = 0; + struct tf_session *tfs; + struct tf_dev_info *dev; + uint16_t start; + int phy_idx; + enum tf_tcam_shared_wc_pool_id id; + struct tf_tcam_free_parms nparms; + uint16_t hcapi_type; + struct tf_rm_alloc_info info; + void *tcam_shared_db_ptr = NULL; + struct tf_tcam_shared_wc_pools *tcam_shared_wc; + int i, cnt; + + TF_CHECK_PARMS2(tfp, parms); + + /* Retrieve the session information */ + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) + return rc; + + if (!tf_session_is_shared_session(tfs) || + (parms->tcam_tbl_type != TF_TCAM_TBL_TYPE_WC_TCAM_HIGH && + parms->tcam_tbl_type != TF_TCAM_TBL_TYPE_WC_TCAM_LOW)) + return -EOPNOTSUPP; + + if (!tf_tcam_db_valid(tfp, parms->dir)) { + TFP_DRV_LOG(ERR, + "%s: tcam shared pool doesn't exist\n", + tf_dir_2_str(parms->dir)); + return -ENOMEM; + } + + rc = tf_session_get_tcam_shared_db(tfp, (void *)&tcam_shared_db_ptr); + if (rc) { + TFP_DRV_LOG(ERR, + "Failed to get tcam_shared_db from session, rc:%s\n", + strerror(-rc)); + return rc; + } + tcam_shared_wc = (struct tf_tcam_shared_wc_pools *)tcam_shared_db_ptr; + + + if (parms->tcam_tbl_type == TF_TCAM_TBL_TYPE_WC_TCAM_HIGH) + id = TF_TCAM_SHARED_WC_POOL_HI; + else + id = TF_TCAM_SHARED_WC_POOL_LO; + + + /* Retrieve the device information */ + rc = tf_session_get_device(tfs, &dev); + if (rc) + return rc; + + rc = tf_tcam_shared_get_rm_info(tfp, + parms->dir, + &hcapi_type, + &info); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: TCAM rm info get failed\n", + tf_dir_2_str(parms->dir)); + return rc; + } + + start = tcam_shared_wc->db[parms->dir][id].info.start; + cnt = tcam_shared_wc->db[parms->dir][id].info.stride; + + /* Override HI/LO type with parent WC TCAM type */ + nparms.dir = parms->dir; + nparms.type = TF_TCAM_TBL_TYPE_WC_TCAM; + nparms.hcapi_type = hcapi_type; + + for (i = 0; i < cnt; i++) { + phy_idx = start + i; + nparms.idx = phy_idx; + + /* Clear entry */ + rc = tf_msg_tcam_entry_free(tfp, dev, &nparms); + if (rc) { + /* Log error */ + TFP_DRV_LOG(ERR, + "%s: %s: log%d free failed, rc:%s\n", + tf_dir_2_str(nparms.dir), + tf_tcam_tbl_2_str(nparms.type), + phy_idx, + strerror(-rc)); + return rc; + } + } + + TFP_DRV_LOG(DEBUG, + "%s: TCAM shared clear pool(%s)\n", + tf_dir_2_str(nparms.dir), + tf_pool_2_str(id)); + return 0; +} diff --git a/drivers/net/bnxt/tf_core/tf_tcam_shared.h b/drivers/net/bnxt/tf_core/tf_tcam_shared.h index 5588125470..020763af6b 100644 --- a/drivers/net/bnxt/tf_core/tf_tcam_shared.h +++ b/drivers/net/bnxt/tf_core/tf_tcam_shared.h @@ -24,6 +24,11 @@ * * @ref tf_tcam_shared_get * + * @ref tf_tcam_shared_move_p4 + * + * @ref tf_tcam_shared_move_p58 + * + * @ref tf_tcam_shared_clear */ /** @@ -159,4 +164,20 @@ int tf_tcam_shared_move_p4(struct tf *tfp, int tf_tcam_shared_move_p58(struct tf *tfp, struct tf_move_tcam_shared_entries_parms *parms); +/** + * Allocates and clears the entire WC_TCAM_HI or WC_TCAM_LO shared pools + * + * [in] tfp + * Pointer to the truflow handle + * + * [in] parms + * Pointer to parameters + * + * Returns + * - (0) if successful. + * - (-EINVAL) on failure. + */ +int tf_tcam_shared_clear(struct tf *tfp, + struct tf_clear_tcam_shared_entries_parms *parms); + #endif /* _TF_TCAM_SHARED_H */ diff --git a/drivers/net/bnxt/tf_core/tf_util.h b/drivers/net/bnxt/tf_core/tf_util.h index 4caf50349d..854c51931a 100644 --- a/drivers/net/bnxt/tf_core/tf_util.h +++ b/drivers/net/bnxt/tf_core/tf_util.h @@ -7,7 +7,6 @@ #define _TF_UTIL_H_ #include "tf_core.h" -#include "tf_device.h" #define TF_BITS2BYTES(x) (((x) + 7) >> 3) #define TF_BITS2BYTES_WORD_ALIGN(x) ((((x) + 31) >> 5) * 4)