From patchwork Sun Jun 13 00:06:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 94108 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 7EDA9A0C41; Sun, 13 Jun 2021 02:08:59 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9492B4117E; Sun, 13 Jun 2021 02:07:20 +0200 (CEST) Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) by mails.dpdk.org (Postfix) with ESMTP id 2209741163 for ; Sun, 13 Jun 2021 02:07:17 +0200 (CEST) Received: by mail-pl1-f177.google.com with SMTP id 11so4676131plk.12 for ; Sat, 12 Jun 2021 17:07:17 -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=OvFJ0+skv4PT3NfsoACdTfqOH7AEmtpFtkLpKttCGTE=; b=GaYZ83LswY8onNptEj1iPfnXTZh3Dtm5wlem6dj6XLe4vTrqGM+i1NcveyiWiBTeKD hwPM7ikYMtQgDTTT1CdTbVT154Vw8dunkKSBv+3J4jqrllnhOOL8Qjyv++I7lI0HgVZ7 ob8EnlgueCu68G+wluK378r9PHC40w6nsAue0= 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=OvFJ0+skv4PT3NfsoACdTfqOH7AEmtpFtkLpKttCGTE=; b=n35GB1ISzvaa+1V2/1LMF8jcUJsNxpo16tk09mMIo2ris3CDQxjyE/o4E9obeOl50x nfJRY6byxNYfX9t31f6QR87fwq0hW3QoDaY0UF/ZMxWZ0ynobRm4wbyYEGYt+Uz7a0D8 B68zWXAznAt6U6DB5mCZx/lfGqn1DY+0nCQKylvAOgCqUrS59HqfWujnSYsIkLUnhrJI 8zVgVx+kkXZr1gKKepfaUebtGb0+rcmHUgFocMl6hZDyO2rx9ZeO98MsiRhMmcUkYBvB QOz7RK/6zWeF4iybELif1Ne8kg1abQ2Od5MFQlSEfdhe18s+KD4cD1vbafQqfS7+BsQS aCEw== X-Gm-Message-State: AOAM532ksC52C1MV6jN8Fi5rzUuXs1p3d5vgv8CmTvMtltnCuaI+dzg9 TP9Q1R9Y6uGf8Uq7iQO/AvtKhj9Fe9ABvznXxQrhWt9lGmVLiB17+itf0qTnrOsZZ+M3zVWEO4c 7P2dIuniBawit0z8dnjbJgrM7FOAgEdJNlzA2BH87SlghWveaMuD627dUFzGYQXQ= X-Google-Smtp-Source: ABdhPJzgQVLy5H+GLNwWPNRkpuPbQKjUnaOGy6GzTHVCUqI+oNeJMUg0OAExixhtNs49Oh5V1x7lbA== X-Received: by 2002:a17:902:b210:b029:11a:bf7b:1a83 with SMTP id t16-20020a170902b210b029011abf7b1a83mr970100plr.84.1623542834054; Sat, 12 Jun 2021 17:07:14 -0700 (PDT) Received: from localhost.localdomain ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id gg22sm12774609pjb.17.2021.06.12.17.07.12 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 12 Jun 2021 17:07:13 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: Farah Smith , Peter Spreadborough , Randy Schacher , Venkat Duvvuru Date: Sat, 12 Jun 2021 17:06:06 -0700 Message-Id: <20210613000652.28191-13-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 12/58] net/bnxt: modify TRUFLOW HWRM messages 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 - Move Bulk get to a direct HWRM message - Deprecate code based on HCAPI changes Signed-off-by: Farah Smith Signed-off-by: Peter Spreadborough Signed-off-by: Randy Schacher Signed-off-by: Venkat Duvvuru Reviewed-by: Ajit Khaparde --- drivers/net/bnxt/hcapi/cfa/hcapi_cfa.h | 72 +---- drivers/net/bnxt/hcapi/cfa/hcapi_cfa_common.c | 4 +- drivers/net/bnxt/hcapi/cfa/hcapi_cfa_defs.h | 193 ++++++++---- drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.c | 113 +++---- drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.h | 282 +---------------- drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.c | 2 +- drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.h | 287 +----------------- drivers/net/bnxt/tf_core/hwrm_tf.h | 196 ------------ drivers/net/bnxt/tf_core/lookup3.h | 2 +- drivers/net/bnxt/tf_core/tf_core.c | 1 - drivers/net/bnxt/tf_core/tf_core.h | 127 ++++---- drivers/net/bnxt/tf_core/tf_device.c | 2 +- drivers/net/bnxt/tf_core/tf_device_p4.h | 75 +++-- drivers/net/bnxt/tf_core/tf_device_p58.h | 48 ++- drivers/net/bnxt/tf_core/tf_em.h | 4 +- drivers/net/bnxt/tf_core/tf_em_common.c | 250 ++++++++++----- drivers/net/bnxt/tf_core/tf_em_common.h | 68 ++++- drivers/net/bnxt/tf_core/tf_em_host.c | 109 +++++-- drivers/net/bnxt/tf_core/tf_msg.c | 263 ++++++++++++++-- drivers/net/bnxt/tf_core/tf_msg.h | 87 ++++++ drivers/net/bnxt/tf_core/tf_msg_common.h | 3 - drivers/net/bnxt/tf_core/tf_session.c | 115 +++++++ drivers/net/bnxt/tf_core/tf_session.h | 90 ++++++ drivers/net/bnxt/tf_core/tf_tbl.h | 30 -- drivers/net/bnxt/tf_core/tf_util.c | 12 - drivers/net/bnxt/tf_core/tf_util.h | 4 + drivers/net/bnxt/tf_core/tfp.c | 34 --- drivers/net/bnxt/tf_core/tfp.h | 52 ---- 28 files changed, 1198 insertions(+), 1327 deletions(-) delete mode 100644 drivers/net/bnxt/tf_core/hwrm_tf.h diff --git a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa.h b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa.h index 0580e07c45..c67aa29ad0 100644 --- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa.h +++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa.h @@ -63,74 +63,10 @@ struct hcapi_cfa_devops { */ uint64_t (*hcapi_cfa_key_hash)(uint64_t *key_data, uint16_t bitlen); -int hcapi_cfa_action_hw_op(struct hcapi_cfa_hwop *op, - uint8_t *act_tbl, - struct hcapi_cfa_data *act_obj); -int hcapi_cfa_dev_hw_op(struct hcapi_cfa_hwop *op, uint16_t tbl_id, - struct hcapi_cfa_data *obj_data); -int hcapi_cfa_rm_register_client(hcapi_cfa_rm_data_t *data, - const char *client_name, - int *client_id); -int hcapi_cfa_rm_unregister_client(hcapi_cfa_rm_data_t *data, - int client_id); -int hcapi_cfa_rm_query_resources(hcapi_cfa_rm_data_t *data, - int client_id, - uint16_t chnl_id, - struct hcapi_cfa_resc_req_db *req_db); -int hcapi_cfa_rm_query_resources_one(hcapi_cfa_rm_data_t *data, - int clien_id, - struct hcapi_cfa_resc_db *resc_db); -int hcapi_cfa_rm_reserve_resources(hcapi_cfa_rm_data_t *data, - int client_id, - struct hcapi_cfa_resc_req_db *resc_req, - struct hcapi_cfa_resc_db *resc_db); -int hcapi_cfa_rm_release_resources(hcapi_cfa_rm_data_t *data, - int client_id, - struct hcapi_cfa_resc_req_db *resc_req, - struct hcapi_cfa_resc_db *resc_db); -int hcapi_cfa_rm_initialize(hcapi_cfa_rm_data_t *data); - -#if SUPPORT_CFA_HW_P4 - -int hcapi_cfa_p4_dev_hw_op(struct hcapi_cfa_hwop *op, uint16_t tbl_id, - struct hcapi_cfa_data *obj_data); -int hcapi_cfa_p4_prof_l2ctxt_hwop(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_data *obj_data); -int hcapi_cfa_p4_prof_l2ctxtrmp_hwop(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_data *obj_data); -int hcapi_cfa_p4_prof_tcam_hwop(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_data *obj_data); -int hcapi_cfa_p4_prof_tcamrmp_hwop(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_data *obj_data); -int hcapi_cfa_p4_wc_tcam_hwop(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_data *obj_data); -int hcapi_cfa_p4_wc_tcam_rec_hwop(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_data *obj_data); -int hcapi_cfa_p4_mirror_hwop(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_data *mirror); -int hcapi_cfa_p4_global_cfg_hwop(struct hcapi_cfa_hwop *op, - uint32_t type, - struct hcapi_cfa_data *config); -/* SUPPORT_CFA_HW_P4 */ -#elif SUPPORT_CFA_HW_P45 -int hcapi_cfa_p45_mirror_hwop(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_data *mirror); -int hcapi_cfa_p45_global_cfg_hwop(struct hcapi_cfa_hwop *op, - uint32_t type, - struct hcapi_cfa_data *config); -/* SUPPORT_CFA_HW_P45 */ -#endif - -/** - * HCAPI CFA device HW operation function callback definition - * This is standardized function callback hook to install different - * CFA HW table programming function callback. - */ - -struct hcapi_cfa_tbl_cb { - /** - * This function callback provides the functionality to read/write - * HW table entry from a HW table. + /** hardware operation on the CFA EM key + * + * This API provides the functionality to program the exact match and + * key data to exact match record memory. * * @param[in] op * A pointer to the Hardware operation parameter diff --git a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_common.c b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_common.c index fc96e3bff7..93a9f555df 100644 --- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_common.c +++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_common.c @@ -3,9 +3,7 @@ * All rights reserved. */ -#include "hcapi_cfa_defs.h" -#include -#include "assert.h" +#include "hcapi_cfa.h" const uint32_t crc32tbl[] = { /* CRC polynomial 0xedb88320 */ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, diff --git a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_defs.h b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_defs.h index 579f1d5693..581dc6bc64 100644 --- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_defs.h +++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_defs.h @@ -1,6 +1,5 @@ - /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2014-2021 Broadcom + * Copyright(c) 2019-2021 Broadcom * All rights reserved. */ @@ -14,27 +13,54 @@ #include #include #include -#include #include +#include + +#if !defined(__GNUC__) +#pragma anon_unions +#endif #define CFA_BITS_PER_BYTE (8) +#define CFA_BITS_PER_WORD (sizeof(uint32_t) * CFA_BITS_PER_BYTE) #define __CFA_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) -#define CFA_ALIGN(x, a) __CFA_ALIGN_MASK(x, (a) - 1) +#define CFA_ALIGN(x, a) __CFA_ALIGN_MASK((x), (a) - 1) +#define CFA_ALIGN_256(x) CFA_ALIGN(x, 256) #define CFA_ALIGN_128(x) CFA_ALIGN(x, 128) #define CFA_ALIGN_32(x) CFA_ALIGN(x, 32) -#define NUM_WORDS_ALIGN_32BIT(x) \ - (CFA_ALIGN_32(x) / (sizeof(uint32_t) * CFA_BITS_PER_BYTE)) -#define NUM_WORDS_ALIGN_128BIT(x) \ - (CFA_ALIGN_128(x) / (sizeof(uint32_t) * CFA_BITS_PER_BYTE)) +#define NUM_WORDS_ALIGN_32BIT(x) (CFA_ALIGN_32(x) / CFA_BITS_PER_WORD) +#define NUM_WORDS_ALIGN_128BIT(x) (CFA_ALIGN_128(x) / CFA_BITS_PER_WORD) +#define NUM_WORDS_ALIGN_256BIT(x) (CFA_ALIGN_256(x) / CFA_BITS_PER_WORD) +/* TODO: redefine according to chip variant */ #define CFA_GLOBAL_CFG_DATA_SZ (100) +#ifndef SUPPORT_CFA_HW_P4 +#define SUPPORT_CFA_HW_P4 (0) +#endif + +#ifndef SUPPORT_CFA_HW_P45 +#define SUPPORT_CFA_HW_P45 (0) +#endif + +#ifndef SUPPORT_CFA_HW_P58 +#define SUPPORT_CFA_HW_P58 (0) +#endif + #if SUPPORT_CFA_HW_ALL #include "hcapi_cfa_p4.h" #include "hcapi_cfa_p58.h" #endif /* SUPPORT_CFA_HW_ALL */ +/* + * Hashing defines + */ +#define HCAPI_CFA_LKUP_SEED_MEM_SIZE 512 + +/* CRC32i support for Key0 hash */ +#define ucrc32(ch, crc) (crc32tbl[((crc) ^ (ch)) & 0xff] ^ ((crc) >> 8)) +#define crc32(x, y) crc32i(~0, x, y) + /** * CFA HW version definition */ @@ -54,35 +80,30 @@ enum hcapi_cfa_dir { HCAPI_CFA_DIR_MAX = 2 }; -/* - * Hashing defines - */ -#define HCAPI_CFA_LKUP_SEED_MEM_SIZE 512 - -/* CRC32i support for Key0 hash */ -#define ucrc32(ch, crc) (crc32tbl[((crc) ^ (ch)) & 0xff] ^ ((crc) >> 8)) -#define crc32(x, y) crc32i(~0, x, y) - - /** * CFA HW OPCODE definition */ enum hcapi_cfa_hwops { - HCAPI_CFA_HWOPS_PUT, /**< Write to HW operation */ - HCAPI_CFA_HWOPS_GET, /**< Read from HW operation */ - HCAPI_CFA_HWOPS_ADD, /**< For operations which require more than simple - * writes to HW, this operation is used. The - * distinction with this operation when compared - * to the PUT ops is that this operation is used - * in conjunction with the HCAPI_CFA_HWOPS_DEL - * op to remove the operations issued by the - * ADD OP. - */ - HCAPI_CFA_HWOPS_DEL, /**< This issues operations to clear the hardware. - * This operation is used in conjunction - * with the HCAPI_CFA_HWOPS_ADD op and is the - * way to undo/clear the ADD op. - */ + HCAPI_CFA_HWOPS_PUT, /**< Write to HW operation */ + HCAPI_CFA_HWOPS_GET, /**< Read from HW operation */ + HCAPI_CFA_HWOPS_ADD, /*< + * For operations which require more then + * simple writes to HW, this operation is + * used. The distinction with this operation + * when compared to the PUT ops is that this + * operation is used in conjunction with + * the HCAPI_CFA_HWOPS_DEL op to remove + * the operations issued by the ADD OP. + */ + HCAPI_CFA_HWOPS_DEL, /*< + * Beside to delete from the hardware, this + * operation is also undo the add operation + * performed by the HCAPI_CFA_HWOPS_ADD op. + */ + HCAPI_CFA_HWOPS_EVICT, /*< This operation is used to evict entries from + * CFA cache memories. This operation is only + * applicable to tables that use CFA caches. + */ HCAPI_CFA_HWOPS_MAX }; @@ -91,11 +112,10 @@ enum hcapi_cfa_hwops { */ enum hcapi_cfa_key_ctrlops { HCAPI_CFA_KEY_CTRLOPS_INSERT, /**< insert control bits */ - HCAPI_CFA_KEY_CTRLOPS_STRIP, /**< strip control bits */ + HCAPI_CFA_KEY_CTRLOPS_STRIP, /**< strip control bits */ HCAPI_CFA_KEY_CTRLOPS_MAX }; - /** * CFA HW definition */ @@ -132,18 +152,23 @@ struct hcapi_cfa_data { /** [in] physical offset to the HW table for the data to be * written to. If this is an array of registers, this is the * index into the array of registers. For writing keys, this - * is the byte offset into the memory where the key should be + * is the byte pointer into the memory where the key should be * written. */ union { uint32_t index; uint32_t byte_offset; - } u; + }; /** [in] HW data buffer pointer */ uint8_t *data; - /** [in] HW data mask buffer pointer */ + /** [in] HW data mask buffer pointer. + * When the CFA data is a FKB and data_mask pointer + * is NULL, then the default mask to enable all bit will + * be used. + */ uint8_t *data_mask; - /** [in] size of the HW data buffer in bytes */ + /** [in/out] size of the HW data buffer in bytes + */ uint16_t data_sz; }; @@ -160,35 +185,36 @@ enum hcapi_cfa_em_table_type { TF_KEY1_TABLE, TF_RECORD_TABLE, TF_EFC_TABLE, + TF_ACTION_TABLE, + TF_EM_LKUP_TABLE, TF_MAX_TABLE }; struct hcapi_cfa_em_page_tbl { - uint32_t pg_count; - uint32_t pg_size; - void **pg_va_tbl; - uint64_t *pg_pa_tbl; + uint32_t pg_count; + uint32_t pg_size; + void **pg_va_tbl; + uint64_t *pg_pa_tbl; }; struct hcapi_cfa_em_table { - int type; - uint32_t num_entries; - uint16_t ctx_id; - uint32_t entry_size; - int num_lvl; - uint32_t page_cnt[TF_PT_LVL_MAX]; - uint64_t num_data_pages; - void *l0_addr; - uint64_t l0_dma_addr; - struct hcapi_cfa_em_page_tbl pg_tbl[TF_PT_LVL_MAX]; + int type; + uint32_t num_entries; + uint16_t ctx_id; + uint32_t entry_size; + int num_lvl; + uint32_t page_cnt[TF_PT_LVL_MAX]; + uint64_t num_data_pages; + void *l0_addr; + uint64_t l0_dma_addr; + struct hcapi_cfa_em_page_tbl pg_tbl[TF_PT_LVL_MAX]; }; struct hcapi_cfa_em_ctx_mem_info { - struct hcapi_cfa_em_table em_tables[TF_MAX_TABLE]; + struct hcapi_cfa_em_table em_tables[TF_MAX_TABLE]; }; /*********************** Truflow end ****************************/ - /** * CFA HW key table definition * @@ -210,6 +236,10 @@ struct hcapi_cfa_key_tbl { * applicable for newer chip */ uint8_t *base1; + /** [in] Optional - If the table is managed by a Backing Store + * database, then this object can be use to configure the EM Key. + */ + struct hcapi_cfa_bs_db *bs_db; /** [in] Page size for EEM tables */ uint32_t page_size; }; @@ -220,7 +250,7 @@ struct hcapi_cfa_key_tbl { struct hcapi_cfa_key_obj { /** [in] pointer to the key data buffer */ uint32_t *data; - /** [in] buffer len in bits */ + /** [in] buffer len in bytes */ uint32_t len; /** [in] Pointer to the key layout */ struct hcapi_cfa_key_layout *layout; @@ -239,6 +269,13 @@ struct hcapi_cfa_key_data { uint8_t *data; /** [in] size of the key in bytes */ uint16_t size; + /** [in] optional table scope ID */ + uint8_t tbl_scope; + /** [in] the fid owner of the key */ + uint64_t metadata; + /** [in] stored with the bucket which can be used to by + * the caller to retreved later via the GET HW OP. + */ }; /** @@ -247,8 +284,52 @@ struct hcapi_cfa_key_data { struct hcapi_cfa_key_loc { /** [out] on-chip EM bucket offset or off-chip EM bucket mem pointer */ uint64_t bucket_mem_ptr; + /** [out] off-chip EM key offset mem pointer */ + uint64_t mem_ptr; + /** [out] index within the array of the EM buckets */ + uint32_t bucket_mem_idx; /** [out] index within the EM bucket */ uint8_t bucket_idx; + /** [out] index within the EM records */ + uint32_t mem_idx; +}; + +/** + * Action record info + */ +struct hcapi_cfa_action_addr { + /** [in] action SRAM block ID for on-chip action records or table + * scope of the action backing store + */ + uint16_t blk_id; + /** [in] ar_id or cache line aligned address offset for the action + * record + */ + uint32_t offset; +}; + +/** + * Action data definition + */ +struct hcapi_cfa_action_data { + /** [in] action record addr info for on-chip action records */ + struct hcapi_cfa_action_addr addr; + /** [in/out] pointer to the action data buffer */ + uint32_t *data; + /** [in] action data buffer len in bytes */ + uint32_t len; +}; + +/** + * Action object definition + */ +struct hcapi_cfa_action_obj { + /** [in] pointer to the action data buffer */ + uint32_t *data; + /** [in] buffer len in bytes */ + uint32_t len; + /** [in] pointer to the action layout */ + struct hcapi_cfa_action_layout *layout; }; /** diff --git a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.c b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.c index f097be9dfb..813b33943c 100644 --- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.c +++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.c @@ -2,7 +2,7 @@ * Copyright(c) 2019-2021 Broadcom * All rights reserved. */ -#include + #include #include #include @@ -10,6 +10,7 @@ #include "lookup3.h" #include "rand.h" +#include "hcapi_cfa.h" #include "hcapi_cfa_defs.h" static uint32_t hcapi_cfa_lkup_lkup3_init_cfg; @@ -18,8 +19,7 @@ static bool hcapi_cfa_lkup_init; static inline uint32_t SWAP_WORDS32(uint32_t val32) { - return (((val32 & 0x0000ffff) << 16) | - ((val32 & 0xffff0000) >> 16)); + return (((val32 & 0x0000ffff) << 16) | ((val32 & 0xffff0000) >> 16)); } static void hcapi_cfa_seeds_init(void) @@ -77,9 +77,8 @@ static uint32_t hcapi_cfa_crc32_hash(uint8_t *key) if (!(val2 & 0x1)) val1 = hcapi_cfa_crc32i(~val1, temp, 4); - val1 = hcapi_cfa_crc32i(~val1, - (key - (CFA_P4_EEM_KEY_MAX_SIZE - 1)), - CFA_P4_EEM_KEY_MAX_SIZE); + val1 = hcapi_cfa_crc32i(~val1, (key - (CFA_P4_EEM_KEY_MAX_SIZE - 1)), + CFA_P4_EEM_KEY_MAX_SIZE); /* End with seed */ if (val2 & 0x1) @@ -92,16 +91,14 @@ static uint32_t hcapi_cfa_lookup3_hash(uint8_t *in_key) { uint32_t val1; - val1 = hashword(((const uint32_t *)(uintptr_t *)in_key) + 1, - CFA_P4_EEM_KEY_MAX_SIZE / (sizeof(uint32_t)), - hcapi_cfa_lkup_lkup3_init_cfg); + val1 = hashword(((uint32_t *)in_key) + 1, + CFA_P4_EEM_KEY_MAX_SIZE / (sizeof(uint32_t)), + hcapi_cfa_lkup_lkup3_init_cfg); return val1; } - -uint64_t hcapi_get_table_page(struct hcapi_cfa_em_table *mem, - uint32_t page) +uint64_t hcapi_get_table_page(struct hcapi_cfa_em_table *mem, uint32_t page) { int level = 0; uint64_t addr; @@ -114,7 +111,7 @@ uint64_t hcapi_get_table_page(struct hcapi_cfa_em_table *mem, */ level = mem->num_lvl - 1; - addr = (uintptr_t)mem->pg_tbl[level].pg_va_tbl[page]; + addr = (uint64_t)mem->pg_tbl[level].pg_va_tbl[page]; return addr; } @@ -136,42 +133,39 @@ uint64_t hcapi_cfa_p4_key_hash(uint64_t *key_data, if (!hcapi_cfa_lkup_init) hcapi_cfa_seeds_init(); - key0_hash = hcapi_cfa_crc32_hash(((uint8_t *)key_data) + - (bitlen / 8) - 1); + key0_hash = + hcapi_cfa_crc32_hash(((uint8_t *)key_data) + (bitlen / 8) - 1); key1_hash = hcapi_cfa_lookup3_hash((uint8_t *)key_data); return ((uint64_t)key0_hash) << 32 | (uint64_t)key1_hash; } -static int hcapi_cfa_key_hw_op_put(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_key_data *key_obj) +static int hcapi_cfa_p4_key_hw_op_put(struct hcapi_cfa_hwop *op, + struct hcapi_cfa_key_data *key_obj) { int rc = 0; - memcpy((uint8_t *)(uintptr_t)op->hw.base_addr + - key_obj->offset, - key_obj->data, - key_obj->size); + memcpy((uint8_t *)(uintptr_t)op->hw.base_addr + key_obj->offset, + key_obj->data, key_obj->size); return rc; } -static int hcapi_cfa_key_hw_op_get(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_key_data *key_obj) +static int hcapi_cfa_p4_key_hw_op_get(struct hcapi_cfa_hwop *op, + struct hcapi_cfa_key_data *key_obj) { int rc = 0; memcpy(key_obj->data, - (uint8_t *)(uintptr_t)op->hw.base_addr + - key_obj->offset, + (uint8_t *)(uintptr_t)op->hw.base_addr + key_obj->offset, key_obj->size); return rc; } -static int hcapi_cfa_key_hw_op_add(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_key_data *key_obj) +static int hcapi_cfa_p4_key_hw_op_add(struct hcapi_cfa_hwop *op, + struct hcapi_cfa_key_data *key_obj) { int rc = 0; struct cfa_p4_eem_64b_entry table_entry; @@ -180,8 +174,7 @@ static int hcapi_cfa_key_hw_op_add(struct hcapi_cfa_hwop *op, * Is entry free? */ memcpy(&table_entry, - (uint8_t *)(uintptr_t)op->hw.base_addr + - key_obj->offset, + (uint8_t *)(uintptr_t)op->hw.base_addr + key_obj->offset, key_obj->size); /* @@ -190,16 +183,14 @@ static int hcapi_cfa_key_hw_op_add(struct hcapi_cfa_hwop *op, if (table_entry.hdr.word1 & (1 << CFA_P4_EEM_ENTRY_VALID_SHIFT)) return -1; - memcpy((uint8_t *)(uintptr_t)op->hw.base_addr + - key_obj->offset, - key_obj->data, - key_obj->size); + memcpy((uint8_t *)(uintptr_t)op->hw.base_addr + key_obj->offset, + key_obj->data, key_obj->size); return rc; } -static int hcapi_cfa_key_hw_op_del(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_key_data *key_obj) +static int hcapi_cfa_p4_key_hw_op_del(struct hcapi_cfa_hwop *op, + struct hcapi_cfa_key_data *key_obj) { int rc = 0; struct cfa_p4_eem_64b_entry table_entry; @@ -208,8 +199,7 @@ static int hcapi_cfa_key_hw_op_del(struct hcapi_cfa_hwop *op, * Read entry */ memcpy(&table_entry, - (uint8_t *)(uintptr_t)op->hw.base_addr + - key_obj->offset, + (uint8_t *)(uintptr_t)op->hw.base_addr + key_obj->offset, key_obj->size); /* @@ -221,8 +211,7 @@ static int hcapi_cfa_key_hw_op_del(struct hcapi_cfa_hwop *op, * before deleting the entry. */ if (key_obj->data != NULL) { - if (memcmp(&table_entry, - key_obj->data, + if (memcmp(&table_entry, key_obj->data, key_obj->size) != 0) return -1; } @@ -230,40 +219,33 @@ static int hcapi_cfa_key_hw_op_del(struct hcapi_cfa_hwop *op, return -1; } - /* * Delete entry */ - memset((uint8_t *)(uintptr_t)op->hw.base_addr + - key_obj->offset, - 0, - key_obj->size); + memset((uint8_t *)(uintptr_t)op->hw.base_addr + key_obj->offset, 0, key_obj->size); return rc; } - /** Apporiximation of hcapi_cfa_key_hw_op() * * */ -int hcapi_cfa_key_hw_op(struct hcapi_cfa_hwop *op, - struct hcapi_cfa_key_tbl *key_tbl, - struct hcapi_cfa_key_data *key_obj, - struct hcapi_cfa_key_loc *key_loc) +static int hcapi_cfa_p4_key_hw_op(struct hcapi_cfa_hwop *op, + struct hcapi_cfa_key_tbl *key_tbl, + struct hcapi_cfa_key_data *key_obj, + struct hcapi_cfa_key_loc *key_loc) { int rc = 0; + struct hcapi_cfa_em_table *em_tbl; + uint32_t page; - if (op == NULL || - key_tbl == NULL || - key_obj == NULL || - key_loc == NULL) + if (op == NULL || key_tbl == NULL || key_obj == NULL || key_loc == NULL) return -1; - op->hw.base_addr = - hcapi_get_table_page((struct hcapi_cfa_em_table *) - key_tbl->base0, - key_obj->offset / key_tbl->page_size); + page = key_obj->offset / key_tbl->page_size; + em_tbl = (struct hcapi_cfa_em_table *)key_tbl->base0; + op->hw.base_addr = hcapi_get_table_page(em_tbl, page); /* Offset is adjusted to be the offset into the page */ key_obj->offset = key_obj->offset % key_tbl->page_size; @@ -272,14 +254,14 @@ int hcapi_cfa_key_hw_op(struct hcapi_cfa_hwop *op, switch (op->opcode) { case HCAPI_CFA_HWOPS_PUT: /**< Write to HW operation */ - rc = hcapi_cfa_key_hw_op_put(op, key_obj); + rc = hcapi_cfa_p4_key_hw_op_put(op, key_obj); break; case HCAPI_CFA_HWOPS_GET: /**< Read from HW operation */ - rc = hcapi_cfa_key_hw_op_get(op, key_obj); + rc = hcapi_cfa_p4_key_hw_op_get(op, key_obj); break; case HCAPI_CFA_HWOPS_ADD: - /**< For operations which require more than - * simple writes to HW, this operation is used. The + /**< For operations which require more then simple + * writes to HW, this operation is used. The * distinction with this operation when compared * to the PUT ops is that this operation is used * in conjunction with the HCAPI_CFA_HWOPS_DEL @@ -287,11 +269,11 @@ int hcapi_cfa_key_hw_op(struct hcapi_cfa_hwop *op, * ADD OP. */ - rc = hcapi_cfa_key_hw_op_add(op, key_obj); + rc = hcapi_cfa_p4_key_hw_op_add(op, key_obj); break; case HCAPI_CFA_HWOPS_DEL: - rc = hcapi_cfa_key_hw_op_del(op, key_obj); + rc = hcapi_cfa_p4_key_hw_op_del(op, key_obj); break; default: rc = -1; @@ -300,3 +282,8 @@ int hcapi_cfa_key_hw_op(struct hcapi_cfa_hwop *op, return rc; } + +const struct hcapi_cfa_devops cfa_p4_devops = { + .hcapi_cfa_key_hash = hcapi_cfa_p4_key_hash, + .hcapi_cfa_key_hw_op = hcapi_cfa_p4_key_hw_op, +}; diff --git a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.h b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.h index 74a5483c0b..363ffcd57c 100644 --- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.h +++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2014-2021 Broadcom + * Copyright(c) 2019-2021 Broadcom * All rights reserved. */ @@ -44,286 +44,6 @@ struct cfa_p4_prof_key_cfg { enum cfa_p4_mac_sel_mode mode; }; -/** - * CFA action layout definition - */ - -#define CFA_P4_ACTION_MAX_LAYOUT_SIZE 184 - -/** - * Action object template structure - * - * Template structure presents data fields that are necessary to know - * at the beginning of Action Builder (AB) processing. Like before the - * AB compilation. One such example could be a template that is - * flexible in size (Encap Record) and the presence of these fields - * allows for determining the template size as well as where the - * fields are located in the record. - * - * The template may also present fields that are not made visible to - * the caller by way of the action fields. - * - * Template fields also allow for additional checking on user visible - * fields. One such example could be the encap pointer behavior on a - * CFA_P4_ACT_OBJ_TYPE_ACT or CFA_P4_ACT_OBJ_TYPE_ACT_SRAM. - */ -struct cfa_p4_action_template { - /** Action Object type - * - * Controls the type of the Action Template - */ - enum { - /** Select this type to build an Action Record Object - */ - CFA_P4_ACT_OBJ_TYPE_ACT, - /** Select this type to build an Action Statistics - * Object - */ - CFA_P4_ACT_OBJ_TYPE_STAT, - /** Select this type to build a SRAM Action Record - * Object. - */ - CFA_P4_ACT_OBJ_TYPE_ACT_SRAM, - /** Select this type to build a SRAM Action - * Encapsulation Object. - */ - CFA_P4_ACT_OBJ_TYPE_ENCAP_SRAM, - /** Select this type to build a SRAM Action Modify - * Object, with IPv4 capability. - */ - /* In case of Stingray the term Modify is used for the 'NAT - * action'. Action builder is leveraged to fill in the NAT - * object which then can be referenced by the action - * record. - */ - CFA_P4_ACT_OBJ_TYPE_MODIFY_IPV4_SRAM, - /** Select this type to build a SRAM Action Source - * Property Object. - */ - /* In case of Stingray this is not a 'pure' action record. - * Action builder is leveraged to full in the Source Property - * object which can then be referenced by the action - * record. - */ - CFA_P4_ACT_OBJ_TYPE_SRC_PROP_SRAM, - /** Select this type to build a SRAM Action Statistics - * Object - */ - CFA_P4_ACT_OBJ_TYPE_STAT_SRAM, - } obj_type; - - /** Action Control - * - * Controls the internals of the Action Template - * - * act is valid when: - * (obj_type == CFA_P4_ACT_OBJ_TYPE_ACT) - */ - /* - * Stat and encap are always inline for EEM as table scope - * allocation does not allow for separate Stats allocation, - * but has the xx_inline flags as to be forward compatible - * with Stingray 2, always treated as TRUE. - */ - struct { - /** Set to CFA_HCAPI_TRUE to enable statistics - */ - uint8_t stat_enable; - /** Set to CFA_HCAPI_TRUE to enable statistics to be inlined - */ - uint8_t stat_inline; - - /** Set to CFA_HCAPI_TRUE to enable encapsulation - */ - uint8_t encap_enable; - /** Set to CFA_HCAPI_TRUE to enable encapsulation to be inlined - */ - uint8_t encap_inline; - } act; - - /** Modify Setting - * - * Controls the type of the Modify Action the template is - * describing - * - * modify is valid when: - * (obj_type == CFA_P4_ACT_OBJ_TYPE_MODIFY_SRAM) - */ - enum { - /** Set to enable Modify of Source IPv4 Address - */ - CFA_P4_MR_REPLACE_SOURCE_IPV4 = 0, - /** Set to enable Modify of Destination IPv4 Address - */ - CFA_P4_MR_REPLACE_DEST_IPV4 - } modify; - - /** Encap Control - * Controls the type of encapsulation the template is - * describing - * - * encap is valid when: - * ((obj_type == CFA_P4_ACT_OBJ_TYPE_ACT) && - * act.encap_enable) || - * ((obj_type == CFA_P4_ACT_OBJ_TYPE_SRC_PROP_SRAM) - */ - struct { - /* Direction is required as Stingray Encap on RX is - * limited to l2 and VTAG only. - */ - /** Receive or Transmit direction - */ - uint8_t direction; - /** Set to CFA_HCAPI_TRUE to enable L2 capability in the - * template - */ - uint8_t l2_enable; - /** vtag controls the Encap Vector - VTAG Encoding, 4 bits - * - *
    - *
  • CFA_P4_ACT_ENCAP_VTAGS_PUSH_0, default, no VLAN - * Tags applied - *
  • CFA_P4_ACT_ENCAP_VTAGS_PUSH_1, adds capability to - * set 1 VLAN Tag. Action Template compile adds - * the following field to the action object - * ::TF_ER_VLAN1 - *
  • CFA_P4_ACT_ENCAP_VTAGS_PUSH_2, adds capability to - * set 2 VLAN Tags. Action Template compile adds - * the following fields to the action object - * ::TF_ER_VLAN1 and ::TF_ER_VLAN2 - *
- */ - enum { CFA_P4_ACT_ENCAP_VTAGS_PUSH_0 = 0, - CFA_P4_ACT_ENCAP_VTAGS_PUSH_1, - CFA_P4_ACT_ENCAP_VTAGS_PUSH_2 } vtag; - - /* - * The remaining fields are NOT supported when - * direction is RX and ((obj_type == - * CFA_P4_ACT_OBJ_TYPE_ACT) && act.encap_enable). - * ab_compile_layout will perform the checking and - * skip remaining fields. - */ - /** L3 Encap controls the Encap Vector - L3 Encoding, - * 3 bits. Defines the type of L3 Encapsulation the - * template is describing. - *
    - *
  • CFA_P4_ACT_ENCAP_L3_NONE, default, no L3 - * Encapsulation processing. - *
  • CFA_P4_ACT_ENCAP_L3_IPV4, enables L3 IPv4 - * Encapsulation. - *
  • CFA_P4_ACT_ENCAP_L3_IPV6, enables L3 IPv6 - * Encapsulation. - *
  • CFA_P4_ACT_ENCAP_L3_MPLS_8847, enables L3 MPLS - * 8847 Encapsulation. - *
  • CFA_P4_ACT_ENCAP_L3_MPLS_8848, enables L3 MPLS - * 8848 Encapsulation. - *
- */ - enum { - /** Set to disable any L3 encapsulation - * processing, default - */ - CFA_P4_ACT_ENCAP_L3_NONE = 0, - /** Set to enable L3 IPv4 encapsulation - */ - CFA_P4_ACT_ENCAP_L3_IPV4 = 4, - /** Set to enable L3 IPv6 encapsulation - */ - CFA_P4_ACT_ENCAP_L3_IPV6 = 5, - /** Set to enable L3 MPLS 8847 encapsulation - */ - CFA_P4_ACT_ENCAP_L3_MPLS_8847 = 6, - /** Set to enable L3 MPLS 8848 encapsulation - */ - CFA_P4_ACT_ENCAP_L3_MPLS_8848 = 7 - } l3; - -#define CFA_P4_ACT_ENCAP_MAX_MPLS_LABELS 8 - /** 1-8 labels, valid when - * (l3 == CFA_P4_ACT_ENCAP_L3_MPLS_8847) || - * (l3 == CFA_P4_ACT_ENCAP_L3_MPLS_8848) - * - * MAX number of MPLS Labels 8. - */ - uint8_t l3_num_mpls_labels; - - /** Set to CFA_HCAPI_TRUE to enable L4 capability in the - * template. - * - * CFA_HCAPI_TRUE adds ::TF_EN_UDP_SRC_PORT and - * ::TF_EN_UDP_DST_PORT to the template. - */ - uint8_t l4_enable; - - /** Tunnel Encap controls the Encap Vector - Tunnel - * Encap, 3 bits. Defines the type of Tunnel - * encapsulation the template is describing - *
    - *
  • CFA_P4_ACT_ENCAP_TNL_NONE, default, no Tunnel - * Encapsulation processing. - *
  • CFA_P4_ACT_ENCAP_TNL_GENERIC_FULL - *
  • CFA_P4_ACT_ENCAP_TNL_VXLAN. NOTE: Expects - * l4_enable set to CFA_P4_TRUE; - *
  • CFA_P4_ACT_ENCAP_TNL_NGE. NOTE: Expects l4_enable - * set to CFA_P4_TRUE; - *
  • CFA_P4_ACT_ENCAP_TNL_NVGRE. NOTE: only valid if - * l4_enable set to CFA_HCAPI_FALSE. - *
  • CFA_P4_ACT_ENCAP_TNL_GRE.NOTE: only valid if - * l4_enable set to CFA_HCAPI_FALSE. - *
  • CFA_P4_ACT_ENCAP_TNL_GENERIC_AFTER_TL4 - *
  • CFA_P4_ACT_ENCAP_TNL_GENERIC_AFTER_TNL - *
- */ - enum { - /** Set to disable Tunnel header encapsulation - * processing, default - */ - CFA_P4_ACT_ENCAP_TNL_NONE = 0, - /** Set to enable Tunnel Generic Full header - * encapsulation - */ - CFA_P4_ACT_ENCAP_TNL_GENERIC_FULL, - /** Set to enable VXLAN header encapsulation - */ - CFA_P4_ACT_ENCAP_TNL_VXLAN, - /** Set to enable NGE (VXLAN2) header encapsulation - */ - CFA_P4_ACT_ENCAP_TNL_NGE, - /** Set to enable NVGRE header encapsulation - */ - CFA_P4_ACT_ENCAP_TNL_NVGRE, - /** Set to enable GRE header encapsulation - */ - CFA_P4_ACT_ENCAP_TNL_GRE, - /** Set to enable Generic header after Tunnel - * L4 encapsulation - */ - CFA_P4_ACT_ENCAP_TNL_GENERIC_AFTER_TL4, - /** Set to enable Generic header after Tunnel - * encapsulation - */ - CFA_P4_ACT_ENCAP_TNL_GENERIC_AFTER_TNL - } tnl; - - /** Number of bytes of generic tunnel header, - * valid when - * (tnl == CFA_P4_ACT_ENCAP_TNL_GENERIC_FULL) || - * (tnl == CFA_P4_ACT_ENCAP_TNL_GENERIC_AFTER_TL4) || - * (tnl == CFA_P4_ACT_ENCAP_TNL_GENERIC_AFTER_TNL) - */ - uint8_t tnl_generic_size; - /** Number of 32b words of nge options, - * valid when - * (tnl == CFA_P4_ACT_ENCAP_TNL_NGE) - */ - uint8_t tnl_nge_op_len; - /* Currently not planned */ - /* Custom Header */ - /* uint8_t custom_enable; */ - } encap; -}; - /** * Enumeration of SRAM entry types, used for allocation of * fixed SRAM entities. The memory model for CFA HCAPI diff --git a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.c b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.c index 15cbdc6eba..a82add3526 100644 --- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.c +++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.c @@ -86,7 +86,7 @@ static uint32_t hcapi_cfa_lookup3_hash(uint8_t *in_key) { uint32_t val1; - val1 = hashword(((uint32_t *)in_key) + 1, + val1 = hashword(((uint32_t *)in_key), CFA_P58_EEM_KEY_MAX_SIZE / (sizeof(uint32_t)), hcapi_cfa_lkup_lkup3_init_cfg); diff --git a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.h b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.h index 27796b1b2f..d272d3ffec 100644 --- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.h +++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.h @@ -12,6 +12,11 @@ #define CFA_P58_EEM_KEY_MAX_SIZE 80 #define CFA_P58_EEM_KEY_RECORD_SIZE 80 +#define CFA_P58_EM_FKB_NUM_WORDS 4 +#define CFA_P58_EM_FKB_NUM_ENTRIES 64 +#define CFA_P58_WC_TCAM_FKB_NUM_WORDS 4 +#define CFA_P58_WC_TCAM_FKB_NUM_ENTRIES 64 + /** CFA phase 5.8 fix formatted table(layout) ID definition * */ @@ -29,7 +34,7 @@ enum cfa_p58_tbl_id { CFA_P58_TBL_PROF_PARIF_DFLT_ACT_REC_PTR, /** Error Profile TCAM Miss Action Record Pointer Table */ CFA_P58_TBL_PROF_PARIF_ERR_ACT_REC_PTR, - /** SR2 VNIC/SVIF Properties Table */ + /** VNIC/SVIF Properties Table */ CFA_P58_TBL_VSPT, CFA_P58_TBL_MAX }; @@ -56,286 +61,6 @@ struct cfa_p58_prof_key_cfg { enum cfa_p58_mac_sel_mode mode; }; -/** - * CFA action layout definition - */ - -#define CFA_P58_ACTION_MAX_LAYOUT_SIZE 184 - -/** - * Action object template structure - * - * Template structure presents data fields that are necessary to know - * at the beginning of Action Builder (AB) processing. Like before the - * AB compilation. One such example could be a template that is - * flexible in size (Encap Record) and the presence of these fields - * allows for determining the template size as well as where the - * fields are located in the record. - * - * The template may also present fields that are not made visible to - * the caller by way of the action fields. - * - * Template fields also allow for additional checking on user visible - * fields. One such example could be the encap pointer behavior on a - * CFA_P58_ACT_OBJ_TYPE_ACT or CFA_P58_ACT_OBJ_TYPE_ACT_SRAM. - */ -struct cfa_p58_action_template { - /** Action Object type - * - * Controls the type of the Action Template - */ - enum { - /** Select this type to build an Action Record Object - */ - CFA_P58_ACT_OBJ_TYPE_ACT, - /** Select this type to build an Action Statistics - * Object - */ - CFA_P58_ACT_OBJ_TYPE_STAT, - /** Select this type to build a SRAM Action Record - * Object. - */ - CFA_P58_ACT_OBJ_TYPE_ACT_SRAM, - /** Select this type to build a SRAM Action - * Encapsulation Object. - */ - CFA_P58_ACT_OBJ_TYPE_ENCAP_SRAM, - /** Select this type to build a SRAM Action Modify - * Object, with IPv4 capability. - */ - /* In case of Stingray the term Modify is used for the 'NAT - * action'. Action builder is leveraged to fill in the NAT - * object which then can be referenced by the action - * record. - */ - CFA_P58_ACT_OBJ_TYPE_MODIFY_IPV4_SRAM, - /** Select this type to build a SRAM Action Source - * Property Object. - */ - /* In case of Stingray this is not a 'pure' action record. - * Action builder is leveraged to full in the Source Property - * object which can then be referenced by the action - * record. - */ - CFA_P58_ACT_OBJ_TYPE_SRC_PROP_SRAM, - /** Select this type to build a SRAM Action Statistics - * Object - */ - CFA_P58_ACT_OBJ_TYPE_STAT_SRAM, - } obj_type; - - /** Action Control - * - * Controls the internals of the Action Template - * - * act is valid when: - * (obj_type == CFA_P58_ACT_OBJ_TYPE_ACT) - */ - /* - * Stat and encap are always inline for EEM as table scope - * allocation does not allow for separate Stats allocation, - * but has the xx_inline flags as to be forward compatible - * with Stingray 2, always treated as TRUE. - */ - struct { - /** Set to CFA_HCAPI_TRUE to enable statistics - */ - uint8_t stat_enable; - /** Set to CFA_HCAPI_TRUE to enable statistics to be inlined - */ - uint8_t stat_inline; - - /** Set to CFA_HCAPI_TRUE to enable encapsulation - */ - uint8_t encap_enable; - /** Set to CFA_HCAPI_TRUE to enable encapsulation to be inlined - */ - uint8_t encap_inline; - } act; - - /** Modify Setting - * - * Controls the type of the Modify Action the template is - * describing - * - * modify is valid when: - * (obj_type == CFA_P58_ACT_OBJ_TYPE_MODIFY_SRAM) - */ - enum { - /** Set to enable Modify of Source IPv4 Address - */ - CFA_P58_MR_REPLACE_SOURCE_IPV4 = 0, - /** Set to enable Modify of Destination IPv4 Address - */ - CFA_P58_MR_REPLACE_DEST_IPV4 - } modify; - - /** Encap Control - * Controls the type of encapsulation the template is - * describing - * - * encap is valid when: - * ((obj_type == CFA_P58_ACT_OBJ_TYPE_ACT) && - * act.encap_enable) || - * ((obj_type == CFA_P58_ACT_OBJ_TYPE_SRC_PROP_SRAM) - */ - struct { - /* Direction is required as Stingray Encap on RX is - * limited to l2 and VTAG only. - */ - /** Receive or Transmit direction - */ - uint8_t direction; - /** Set to CFA_HCAPI_TRUE to enable L2 capability in the - * template - */ - uint8_t l2_enable; - /** vtag controls the Encap Vector - VTAG Encoding, 4 bits - * - *
    - *
  • CFA_P58_ACT_ENCAP_VTAGS_PUSH_0, default, no VLAN - * Tags applied - *
  • CFA_P58_ACT_ENCAP_VTAGS_PUSH_1, adds capability to - * set 1 VLAN Tag. Action Template compile adds - * the following field to the action object - * ::TF_ER_VLAN1 - *
  • CFA_P58_ACT_ENCAP_VTAGS_PUSH_2, adds capability to - * set 2 VLAN Tags. Action Template compile adds - * the following fields to the action object - * ::TF_ER_VLAN1 and ::TF_ER_VLAN2 - *
- */ - enum { CFA_P58_ACT_ENCAP_VTAGS_PUSH_0 = 0, - CFA_P58_ACT_ENCAP_VTAGS_PUSH_1, - CFA_P58_ACT_ENCAP_VTAGS_PUSH_2 } vtag; - - /* - * The remaining fields are NOT supported when - * direction is RX and ((obj_type == - * CFA_P58_ACT_OBJ_TYPE_ACT) && act.encap_enable). - * ab_compile_layout will perform the checking and - * skip remaining fields. - */ - /** L3 Encap controls the Encap Vector - L3 Encoding, - * 3 bits. Defines the type of L3 Encapsulation the - * template is describing. - *
    - *
  • CFA_P58_ACT_ENCAP_L3_NONE, default, no L3 - * Encapsulation processing. - *
  • CFA_P58_ACT_ENCAP_L3_IPV4, enables L3 IPv4 - * Encapsulation. - *
  • CFA_P58_ACT_ENCAP_L3_IPV6, enables L3 IPv6 - * Encapsulation. - *
  • CFA_P58_ACT_ENCAP_L3_MPLS_8847, enables L3 MPLS - * 8847 Encapsulation. - *
  • CFA_P58_ACT_ENCAP_L3_MPLS_8848, enables L3 MPLS - * 8848 Encapsulation. - *
- */ - enum { - /** Set to disable any L3 encapsulation - * processing, default - */ - CFA_P58_ACT_ENCAP_L3_NONE = 0, - /** Set to enable L3 IPv4 encapsulation - */ - CFA_P58_ACT_ENCAP_L3_IPV4 = 4, - /** Set to enable L3 IPv6 encapsulation - */ - CFA_P58_ACT_ENCAP_L3_IPV6 = 5, - /** Set to enable L3 MPLS 8847 encapsulation - */ - CFA_P58_ACT_ENCAP_L3_MPLS_8847 = 6, - /** Set to enable L3 MPLS 8848 encapsulation - */ - CFA_P58_ACT_ENCAP_L3_MPLS_8848 = 7 - } l3; - -#define CFA_P58_ACT_ENCAP_MAX_MPLS_LABELS 8 - /** 1-8 labels, valid when - * (l3 == CFA_P58_ACT_ENCAP_L3_MPLS_8847) || - * (l3 == CFA_P58_ACT_ENCAP_L3_MPLS_8848) - * - * MAX number of MPLS Labels 8. - */ - uint8_t l3_num_mpls_labels; - - /** Set to CFA_HCAPI_TRUE to enable L4 capability in the - * template. - * - * CFA_HCAPI_TRUE adds ::TF_EN_UDP_SRC_PORT and - * ::TF_EN_UDP_DST_PORT to the template. - */ - uint8_t l4_enable; - - /** Tunnel Encap controls the Encap Vector - Tunnel - * Encap, 3 bits. Defines the type of Tunnel - * encapsulation the template is describing - *
    - *
  • CFA_P58_ACT_ENCAP_TNL_NONE, default, no Tunnel - * Encapsulation processing. - *
  • CFA_P58_ACT_ENCAP_TNL_GENERIC_FULL - *
  • CFA_P58_ACT_ENCAP_TNL_VXLAN. NOTE: Expects - * l4_enable set to CFA_P58_TRUE; - *
  • CFA_P58_ACT_ENCAP_TNL_NGE. NOTE: Expects l4_enable - * set to CFA_P58_TRUE; - *
  • CFA_P58_ACT_ENCAP_TNL_NVGRE. NOTE: only valid if - * l4_enable set to CFA_HCAPI_FALSE. - *
  • CFA_P58_ACT_ENCAP_TNL_GRE.NOTE: only valid if - * l4_enable set to CFA_HCAPI_FALSE. - *
  • CFA_P58_ACT_ENCAP_TNL_GENERIC_AFTER_TL4 - *
  • CFA_P58_ACT_ENCAP_TNL_GENERIC_AFTER_TNL - *
- */ - enum { - /** Set to disable Tunnel header encapsulation - * processing, default - */ - CFA_P58_ACT_ENCAP_TNL_NONE = 0, - /** Set to enable Tunnel Generic Full header - * encapsulation - */ - CFA_P58_ACT_ENCAP_TNL_GENERIC_FULL, - /** Set to enable VXLAN header encapsulation - */ - CFA_P58_ACT_ENCAP_TNL_VXLAN, - /** Set to enable NGE (VXLAN2) header encapsulation - */ - CFA_P58_ACT_ENCAP_TNL_NGE, - /** Set to enable NVGRE header encapsulation - */ - CFA_P58_ACT_ENCAP_TNL_NVGRE, - /** Set to enable GRE header encapsulation - */ - CFA_P58_ACT_ENCAP_TNL_GRE, - /** Set to enable Generic header after Tunnel - * L4 encapsulation - */ - CFA_P58_ACT_ENCAP_TNL_GENERIC_AFTER_TL4, - /** Set to enable Generic header after Tunnel - * encapsulation - */ - CFA_P58_ACT_ENCAP_TNL_GENERIC_AFTER_TNL - } tnl; - - /** Number of bytes of generic tunnel header, - * valid when - * (tnl == CFA_P58_ACT_ENCAP_TNL_GENERIC_FULL) || - * (tnl == CFA_P58_ACT_ENCAP_TNL_GENERIC_AFTER_TL4) || - * (tnl == CFA_P58_ACT_ENCAP_TNL_GENERIC_AFTER_TNL) - */ - uint8_t tnl_generic_size; - /** Number of 32b words of nge options, - * valid when - * (tnl == CFA_P58_ACT_ENCAP_TNL_NGE) - */ - uint8_t tnl_nge_op_len; - /* Currently not planned */ - /* Custom Header */ - /* uint8_t custom_enable; */ - } encap; -}; - /** * Enumeration of SRAM entry types, used for allocation of * fixed SRAM entities. The memory model for CFA HCAPI diff --git a/drivers/net/bnxt/tf_core/hwrm_tf.h b/drivers/net/bnxt/tf_core/hwrm_tf.h deleted file mode 100644 index 9cc9a1435c..0000000000 --- a/drivers/net/bnxt/tf_core/hwrm_tf.h +++ /dev/null @@ -1,196 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2019-2021 Broadcom - * All rights reserved. - */ -#ifndef _HWRM_TF_H_ -#define _HWRM_TF_H_ - -#include "tf_core.h" - -typedef enum tf_type { - TF_TYPE_TRUFLOW, - TF_TYPE_LAST = TF_TYPE_TRUFLOW, -} tf_type_t; - -typedef enum tf_subtype { - HWRM_TFT_GET_GLOBAL_CFG = 821, - HWRM_TFT_SET_GLOBAL_CFG = 822, - HWRM_TFT_TBL_TYPE_BULK_GET = 825, - HWRM_TFT_IF_TBL_SET = 827, - HWRM_TFT_IF_TBL_GET = 828, - TF_SUBTYPE_LAST = HWRM_TFT_IF_TBL_GET, -} tf_subtype_t; - -/* Request and Response compile time checking */ -/* u32_t tlv_req_value[26]; */ -#define TF_MAX_REQ_SIZE 104 -/* u32_t tlv_resp_value[170]; */ -#define TF_MAX_RESP_SIZE 680 - -/* Use this to allocate/free any kind of - * indexes over HWRM and fill the parms pointer - */ -#define TF_BULK_RECV 128 -#define TF_BULK_SEND 16 - -/* EM Key value */ -#define TF_DEV_DATA_TYPE_TF_EM_RULE_INSERT_KEY_DATA 0x2e30UL -/* EM Key value */ -#define TF_DEV_DATA_TYPE_TF_EM_RULE_DELETE_KEY_DATA 0x2e40UL -/* L2 Context DMA Address Type */ -#define TF_DEV_DATA_TYPE_TF_L2_CTX_DMA_ADDR 0x2fe0UL -/* L2 Context Entry */ -#define TF_DEV_DATA_TYPE_TF_L2_CTX_ENTRY 0x2fe1UL -/* Prof tcam DMA Address Type */ -#define TF_DEV_DATA_TYPE_TF_PROF_TCAM_DMA_ADDR 0x3030UL -/* Prof tcam Entry */ -#define TF_DEV_DATA_TYPE_TF_PROF_TCAM_ENTRY 0x3031UL -/* WC DMA Address Type */ -#define TF_DEV_DATA_TYPE_TF_WC_DMA_ADDR 0x30d0UL -/* WC Entry */ -#define TF_DEV_DATA_TYPE_TF_WC_ENTRY 0x30d1UL -/* SPIF DFLT L2 CTXT Entry */ -#define TF_DEV_DATA_TYPE_SPIF_DFLT_L2_CTXT 0x3131UL -/* PARIF DFLT ACT REC PTR Entry */ -#define TF_DEV_DATA_TYPE_PARIF_DFLT_ACT_REC 0x3132UL -/* PARIF ERR DFLT ACT REC PTR Entry */ -#define TF_DEV_DATA_TYPE_PARIF_ERR_DFLT_ACT_REC 0x3133UL -/* ILT Entry */ -#define TF_DEV_DATA_TYPE_ILT 0x3134UL -/* VNIC SVIF entry */ -#define TF_DEV_DATA_TYPE_VNIC_SVIF 0x3135UL -/* Action Data */ -#define TF_DEV_DATA_TYPE_TF_ACTION_DATA 0x3170UL -#define TF_DEV_DATA_TYPE_LAST TF_DEV_DATA_TYPE_TF_ACTION_DATA - -#define TF_BITS2BYTES(x) (((x) + 7) >> 3) -#define TF_BITS2BYTES_WORD_ALIGN(x) ((((x) + 31) >> 5) * 4) -#define TF_BITS2BYTES_64B_WORD_ALIGN(x) ((((x) + 63) >> 6) * 8) - -struct tf_set_global_cfg_input; -struct tf_get_global_cfg_input; -struct tf_get_global_cfg_output; -struct tf_tbl_type_bulk_get_input; -struct tf_tbl_type_bulk_get_output; -struct tf_if_tbl_set_input; -struct tf_if_tbl_get_input; -struct tf_if_tbl_get_output; -/* Input params for global config set */ -typedef struct tf_set_global_cfg_input { - /* Session Id */ - uint32_t fw_session_id; - /* flags */ - uint32_t flags; - /* When set to 0, indicates the query apply to RX */ -#define TF_SET_GLOBAL_CFG_INPUT_FLAGS_DIR_RX (0x0) - /* When set to 1, indicates the query apply to TX */ -#define TF_SET_GLOBAL_CFG_INPUT_FLAGS_DIR_TX (0x1) - /* Config type */ - uint32_t type; - /* Offset of the type */ - uint32_t offset; - /* Size of the data to set in bytes */ - uint16_t size; - /* Data to set */ - uint8_t data[TF_BULK_SEND]; -} tf_set_global_cfg_input_t, *ptf_set_global_cfg_input_t; - -/* Input params for global config to get */ -typedef struct tf_get_global_cfg_input { - /* Session Id */ - uint32_t fw_session_id; - /* flags */ - uint32_t flags; - /* When set to 0, indicates the query apply to RX */ -#define TF_GET_GLOBAL_CFG_INPUT_FLAGS_DIR_RX (0x0) - /* When set to 1, indicates the query apply to TX */ -#define TF_GET_GLOBAL_CFG_INPUT_FLAGS_DIR_TX (0x1) - /* Config to retrieve */ - uint32_t type; - /* Offset to retrieve */ - uint32_t offset; - /* Size of the data to set in bytes */ - uint16_t size; -} tf_get_global_cfg_input_t, *ptf_get_global_cfg_input_t; - -/* Output params for global config */ -typedef struct tf_get_global_cfg_output { - /* Size of the total data read in bytes */ - uint16_t size; - /* Data to get */ - uint8_t data[TF_BULK_SEND]; -} tf_get_global_cfg_output_t, *ptf_get_global_cfg_output_t; - -/* Input params for table type get */ -typedef struct tf_tbl_type_bulk_get_input { - /* Session Id */ - uint32_t fw_session_id; - /* flags */ - uint32_t flags; - /* When set to 0, indicates the get apply to RX */ -#define TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_RX (0x0) - /* When set to 1, indicates the get apply to TX */ -#define TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_TX (0x1) - /* When set to 1, indicates the clear entry on read */ -#define TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_CLEAR_ON_READ (0x2) - /* Type of the object to set */ - uint32_t type; - /* Starting index to get from */ - uint32_t start_index; - /* Number of entries to get */ - uint32_t num_entries; - /* Host memory where data will be stored */ - uint64_t host_addr; -} tf_tbl_type_bulk_get_input_t, *ptf_tbl_type_bulk_get_input_t; - -/* Output params for table type get */ -typedef struct tf_tbl_type_bulk_get_output { - /* Size of the total data read in bytes */ - uint16_t size; -} tf_tbl_type_bulk_get_output_t, *ptf_tbl_type_bulk_get_output_t; - -/* Input params for if tbl set */ -typedef struct tf_if_tbl_set_input { - /* Session Id */ - uint32_t fw_session_id; - /* flags */ - uint16_t flags; - /* When set to 0, indicates the query apply to RX */ -#define TF_IF_TBL_SET_INPUT_FLAGS_DIR_RX (0x0) - /* When set to 1, indicates the query apply to TX */ -#define TF_IF_TBL_SET_INPUT_FLAGS_DIR_TX (0x1) - /* if table type */ - uint16_t tf_if_tbl_type; - /* index of table entry */ - uint16_t idx; - /* size of the data write to table entry */ - uint32_t data_sz_in_bytes; - /* data to write into table entry */ - uint32_t data[2]; -} tf_if_tbl_set_input_t, *ptf_if_tbl_set_input_t; - -/* Input params for if tbl get */ -typedef struct tf_if_tbl_get_input { - /* Session Id */ - uint32_t fw_session_id; - /* flags */ - uint16_t flags; - /* When set to 0, indicates the query apply to RX */ -#define TF_IF_TBL_GET_INPUT_FLAGS_DIR_RX (0x0) - /* When set to 1, indicates the query apply to TX */ -#define TF_IF_TBL_GET_INPUT_FLAGS_DIR_TX (0x1) - /* if table type */ - uint16_t tf_if_tbl_type; - /* size of the data get from table entry */ - uint32_t data_sz_in_bytes; - /* index of table entry */ - uint16_t idx; -} tf_if_tbl_get_input_t, *ptf_if_tbl_get_input_t; - -/* output params for if tbl get */ -typedef struct tf_if_tbl_get_output { - /* Value read from table entry */ - uint32_t data[2]; -} tf_if_tbl_get_output_t, *ptf_if_tbl_get_output_t; - -#endif /* _HWRM_TF_H_ */ diff --git a/drivers/net/bnxt/tf_core/lookup3.h b/drivers/net/bnxt/tf_core/lookup3.h index b1fd2cd436..743c4d9c4f 100644 --- a/drivers/net/bnxt/tf_core/lookup3.h +++ b/drivers/net/bnxt/tf_core/lookup3.h @@ -122,7 +122,7 @@ static inline uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval) { uint32_t a, b, c; - int index = 12; + int index = length - 1; /* Set up the internal state */ a = 0xdeadbeef + (((uint32_t)length) << 2) + initval; diff --git a/drivers/net/bnxt/tf_core/tf_core.c b/drivers/net/bnxt/tf_core/tf_core.c index 573fa0b1ed..9b8677caac 100644 --- a/drivers/net/bnxt/tf_core/tf_core.c +++ b/drivers/net/bnxt/tf_core/tf_core.c @@ -18,7 +18,6 @@ #include "bnxt.h" #include "rand.h" #include "tf_common.h" -#include "hwrm_tf.h" #include "tf_ext_flow_handle.h" int diff --git a/drivers/net/bnxt/tf_core/tf_core.h b/drivers/net/bnxt/tf_core/tf_core.h index fcba492dc5..7b26b58000 100644 --- a/drivers/net/bnxt/tf_core/tf_core.h +++ b/drivers/net/bnxt/tf_core/tf_core.h @@ -10,7 +10,7 @@ #include #include #include -#include "hcapi/cfa/hcapi_cfa_defs.h" +#include "hcapi_cfa_defs.h" #include "tf_project.h" /** @@ -43,6 +43,29 @@ enum tf_mem { TF_MEM_MAX }; +/** + * External memory control channel type + */ +enum tf_ext_mem_chan_type { + /** + * Direct memory write(Wh+/SR) + */ + TF_EXT_MEM_CHAN_TYPE_DIRECT = 0, + /** + * Ring interface MPC + */ + TF_EXT_MEM_CHAN_TYPE_RING_IF, + /** + * Use HWRM message to firmware + */ + TF_EXT_MEM_CHAN_TYPE_FW, + /** + * Use ring_if message to firmware + */ + TF_EXT_MEM_CHAN_TYPE_RING_IF_FW, + TF_EXT_MEM_CHAN_TYPE_MAX +}; + /** * EEM record AR helper * @@ -149,7 +172,6 @@ enum tf_device_type { TF_DEVICE_TYPE_WH = 0, /**< Whitney+ */ TF_DEVICE_TYPE_SR, /**< Stingray */ TF_DEVICE_TYPE_THOR, /**< Thor */ - TF_DEVICE_TYPE_SR2, /**< Stingray2 */ TF_DEVICE_TYPE_MAX /**< Maximum */ }; @@ -182,40 +204,39 @@ enum tf_module_type { */ enum tf_identifier_type { /** - * WH/SR/TH/SR2 + * WH/SR/TH * The L2 Context is returned from the L2 Ctxt TCAM lookup * and can be used in WC TCAM or EM keys to virtualize further * lookups. */ TF_IDENT_TYPE_L2_CTXT_HIGH, /** - * WH/SR/TH/SR2 + * WH/SR/TH * The L2 Context is returned from the L2 Ctxt TCAM lookup * and can be used in WC TCAM or EM keys to virtualize further * lookups. */ TF_IDENT_TYPE_L2_CTXT_LOW, /** - * WH/SR/TH/SR2 + * WH/SR/TH * The WC profile func is returned from the L2 Ctxt TCAM lookup * to enable virtualization of the profile TCAM. */ TF_IDENT_TYPE_PROF_FUNC, /** - * WH/SR/TH/SR2 + * WH/SR/TH * The WC profile ID is included in the WC lookup key * to enable virtualization of the WC TCAM hardware. */ TF_IDENT_TYPE_WC_PROF, /** - * WH/SR/TH/SR2 + * WH/SR/TH * The EM profile ID is included in the EM lookup key - * to enable virtualization of the EM hardware. (not required for SR2 - * as it has table scope) + * to enable virtualization of the EM hardware. */ TF_IDENT_TYPE_EM_PROF, /** - * TH/SR2 + * TH * The L2 func is included in the ILT result and from recycling to * enable virtualization of further lookups. */ @@ -273,23 +294,15 @@ enum tf_tbl_type { TF_TBL_TYPE_MIRROR_CONFIG, /** (Future) UPAR */ TF_TBL_TYPE_UPAR, - /** (Future) SR2 Epoch 0 table */ - TF_TBL_TYPE_EPOCH0, - /** (Future) SR2 Epoch 1 table */ - TF_TBL_TYPE_EPOCH1, - /** (Future) TH/SR2 Metadata */ + /** (Future) TH Metadata */ TF_TBL_TYPE_METADATA, - /** (Future) TH/SR2 CT State */ + /** (Future) TH CT State */ TF_TBL_TYPE_CT_STATE, - /** (Future) TH/SR2 Range Profile */ + /** (Future) TH Range Profile */ TF_TBL_TYPE_RANGE_PROF, - /** (Future) SR2 Range Entry */ - TF_TBL_TYPE_RANGE_ENTRY, - /** (Future) SR2 LAG Entry */ - TF_TBL_TYPE_LAG, - /** TH/SR2 EM Flexible Key builder */ + /** TH EM Flexible Key builder */ TF_TBL_TYPE_EM_FKB, - /** TH/SR2 WC Flexible Key builder */ + /** TH WC Flexible Key builder */ TF_TBL_TYPE_WC_FKB, /* External */ @@ -301,14 +314,6 @@ enum tf_tbl_type { * a pool of 64B entries. */ TF_TBL_TYPE_EXT, - /* (Future) SR2 32B External EM Action 32B Pool */ - TF_TBL_TYPE_EXT_32B, - /* (Future) SR2 64B External EM Action 64B Pool */ - TF_TBL_TYPE_EXT_64B, - /* (Future) SR2 96B External EM Action 96B Pool */ - TF_TBL_TYPE_EXT_96B, - /* (Future) SR2 128B External EM Action 128B Pool */ - TF_TBL_TYPE_EXT_128B, TF_TBL_TYPE_MAX }; @@ -969,20 +974,13 @@ struct tf_map_tbl_scope_parms { /** * allocate a table scope * - * On SR2 Firmware will allocate a scope ID. On other devices, the scope - * is a software construct to identify an EEM table. This function will + * The scope is a software construct to identify an EEM table. This function will * divide the hash memory/buckets and records according to the device * device constraints based upon calculations using either the number of flows * requested or the size of memory indicated. Other parameters passed in * determine the configuration (maximum key size, maximum external action record * size). * - * This API will allocate the table region in DRAM, program the PTU page table - * entries, and program the number of static buckets (if SR2) in the RX and TX - * CFAs. Buckets are assumed to start at 0 in the EM memory for the scope. - * Upon successful completion of this API, hash tables are fully initialized and - * ready for entries to be inserted. - * * A single API is used to allocate a common table scope identifier in both * receive and transmit CFA. The scope identifier is common due to nature of * connection tracking sending notifications between RX and TX direction. @@ -1028,7 +1026,7 @@ int tf_map_tbl_scope(struct tf *tfp, * * Firmware checks that the table scope ID is owned by the TruFlow * session, verifies that no references to this table scope remains - * (SR2 ILT) or Profile TCAM entries for either CFA (RX/TX) direction, + * or Profile TCAM entries for either CFA (RX/TX) direction, * then frees the table scope ID. * * Returns success or failure code. @@ -1589,6 +1587,10 @@ struct tf_set_tbl_entry_parms { * [in] Entry size */ uint16_t data_sz_in_bytes; + /** + * [in] External memory channel type to use + */ + enum tf_ext_mem_chan_type chan_type; /** * [in] Entry index to write to */ @@ -1627,6 +1629,10 @@ struct tf_get_tbl_entry_parms { * [in] Entry size */ uint16_t data_sz_in_bytes; + /** + * [in] External memory channel type to use + */ + enum tf_ext_mem_chan_type chan_type; /** * [in] Entry index to read */ @@ -1679,6 +1685,10 @@ struct tf_bulk_get_tbl_entry_parms { * structure for the physical address. */ uint64_t physical_mem_addr; + /** + * [in] External memory channel type to use + */ + enum tf_ext_mem_chan_type chan_type; }; /** @@ -1723,10 +1733,6 @@ struct tf_insert_em_entry_parms { * [in] ID of table scope to use (external only) */ uint32_t tbl_scope_id; - /** - * [in] ID of table interface to use (SR2 only) - */ - uint32_t tbl_if_id; /** * [in] ptr to structure containing key fields */ @@ -1747,6 +1753,10 @@ struct tf_insert_em_entry_parms { * [in] duplicate check flag */ uint8_t dup_check; + /** + * [in] External memory channel type to use + */ + enum tf_ext_mem_chan_type chan_type; /** * [out] Flow handle value for the inserted entry. This is encoded * as the entries[4]:bucket[2]:hashId[1]:hash[14] @@ -1775,19 +1785,14 @@ struct tf_delete_em_entry_parms { * [in] ID of table scope to use (external only) */ uint32_t tbl_scope_id; - /** - * [in] ID of table interface to use (SR2 only) - */ - uint32_t tbl_if_id; - /** - * [in] epoch group IDs of entry to delete - * 2 element array with 2 ids. (SR2 only) - */ - uint16_t *epochs; /** * [out] The index of the entry */ uint16_t index; + /** + * [in] External memory channel type to use + */ + enum tf_ext_mem_chan_type chan_type; /** * [in] structure containing flow delete handle information */ @@ -1809,10 +1814,6 @@ struct tf_search_em_entry_parms { * [in] ID of table scope to use (external only) */ uint32_t tbl_scope_id; - /** - * [in] ID of table interface to use (SR2 only) - */ - uint32_t tbl_if_id; /** * [in] ptr to structure containing key fields */ @@ -1830,10 +1831,9 @@ struct tf_search_em_entry_parms { */ uint16_t em_record_sz_in_bits; /** - * [in] epoch group IDs of entry to lookup - * 2 element array with 2 ids. (SR2 only) + * [in] External memory channel type to use */ - uint16_t *epochs; + enum tf_ext_mem_chan_type chan_type; /** * [in] ptr to structure containing flow delete handle */ @@ -1858,9 +1858,6 @@ struct tf_search_em_entry_parms { * This API inserts an exact match entry into DRAM EM table memory of the * specified direction and table scope. * - * When inserting an entry into an exact match table, the TruFlow library may - * need to allocate a dynamic bucket for the entry (SR2 only). - * * The insertion of duplicate entries in an EM table is not permitted. If a * TruFlow application can guarantee that it will never insert duplicates, it * can disable duplicate checking by passing a zero value in the dup_check @@ -2040,9 +2037,9 @@ enum tf_if_tbl_type { TF_IF_TBL_TYPE_PROF_PARIF_ERR_ACT_REC_PTR, /** Default Error Profile TCAM Miss Action Record Pointer Table */ TF_IF_TBL_TYPE_LKUP_PARIF_DFLT_ACT_REC_PTR, - /** SR2 Ingress lookup table */ + /** Ingress lookup table */ TF_IF_TBL_TYPE_ILT, - /** SR2 VNIC/SVIF Properties Table */ + /** VNIC/SVIF Properties Table */ TF_IF_TBL_TYPE_VSPT, TF_IF_TBL_TYPE_MAX }; diff --git a/drivers/net/bnxt/tf_core/tf_device.c b/drivers/net/bnxt/tf_core/tf_device.c index 61b3746d8b..9e71c04bf2 100644 --- a/drivers/net/bnxt/tf_core/tf_device.c +++ b/drivers/net/bnxt/tf_core/tf_device.c @@ -487,7 +487,7 @@ tf_dev_bind_p58(struct tf *tfp, * - (-EINVAL) on failure. */ static int - tf_dev_unbind_p58(struct tf *tfp) +tf_dev_unbind_p58(struct tf *tfp) { int rc = 0; bool fail = false; diff --git a/drivers/net/bnxt/tf_core/tf_device_p4.h b/drivers/net/bnxt/tf_core/tf_device_p4.h index ee283ce29d..a73ba3cd70 100644 --- a/drivers/net/bnxt/tf_core/tf_device_p4.h +++ b/drivers/net/bnxt/tf_core/tf_device_p4.h @@ -14,92 +14,117 @@ struct tf_rm_element_cfg tf_ident_p4[TF_IDENT_TYPE_MAX] = { [TF_IDENT_TYPE_L2_CTXT_HIGH] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_REMAP_HIGH + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_REMAP_HIGH, + 0, 0, 0 }, [TF_IDENT_TYPE_L2_CTXT_LOW] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_REMAP_LOW + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_REMAP_LOW, + 0, 0, 0 }, [TF_IDENT_TYPE_PROF_FUNC] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_PROF_FUNC + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_PROF_FUNC, + 0, 0, 0 }, [TF_IDENT_TYPE_WC_PROF] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_WC_TCAM_PROF_ID + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_WC_TCAM_PROF_ID, + 0, 0, 0 }, [TF_IDENT_TYPE_EM_PROF] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_EM_PROF_ID + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_EM_PROF_ID, + 0, 0, 0 }, }; struct tf_rm_element_cfg tf_tcam_p4[TF_TCAM_TBL_TYPE_MAX] = { [TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_TCAM_HIGH + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_TCAM_HIGH, + 0, 0, 0 }, [TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_TCAM_LOW + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_TCAM_LOW, + 0, 0, 0 }, [TF_TCAM_TBL_TYPE_PROF_TCAM] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_PROF_TCAM + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_PROF_TCAM, + 0, 0, 0 }, [TF_TCAM_TBL_TYPE_WC_TCAM] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_WC_TCAM + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_WC_TCAM, + 0, 0, 0 }, [TF_TCAM_TBL_TYPE_SP_TCAM] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_SP_TCAM + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_SP_TCAM, + 0, 0, 0 }, }; struct tf_rm_element_cfg tf_tbl_p4[TF_TBL_TYPE_MAX] = { [TF_TBL_TYPE_FULL_ACT_RECORD] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_FULL_ACTION + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_FULL_ACTION, + 0, 0, 0 }, [TF_TBL_TYPE_MCAST_GROUPS] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_MCG + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_MCG, + 0, 0, 0 }, [TF_TBL_TYPE_ACT_ENCAP_8B] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_ENCAP_8B + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_ENCAP_8B, + 0, 0, 0 }, [TF_TBL_TYPE_ACT_ENCAP_16B] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_ENCAP_16B + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_ENCAP_16B, + 0, 0, 0 }, [TF_TBL_TYPE_ACT_ENCAP_64B] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_ENCAP_64B + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_ENCAP_64B, + 0, 0, 0 }, [TF_TBL_TYPE_ACT_SP_SMAC] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_SP_MAC + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_SP_MAC, + 0, 0, 0 }, [TF_TBL_TYPE_ACT_SP_SMAC_IPV4] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_SP_MAC_IPV4 + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_SP_MAC_IPV4, + 0, 0, 0 }, [TF_TBL_TYPE_ACT_SP_SMAC_IPV6] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_SP_MAC_IPV6 + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_SP_MAC_IPV6, + 0, 0, 0 }, [TF_TBL_TYPE_ACT_STATS_64] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_COUNTER_64B + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_COUNTER_64B, + 0, 0, 0 }, [TF_TBL_TYPE_ACT_MODIFY_IPV4] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_NAT_IPV4 + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_NAT_IPV4, + 0, 0, 0 }, [TF_TBL_TYPE_METER_PROF] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_METER_PROF + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_METER_PROF, + 0, 0, 0 }, [TF_TBL_TYPE_METER_INST] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_METER + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_METER, + 0, 0, 0 }, [TF_TBL_TYPE_MIRROR_CONFIG] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_MIRROR + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_MIRROR, + 0, 0, 0 }, }; struct tf_rm_element_cfg tf_em_ext_p4[TF_EM_TBL_TYPE_MAX] = { [TF_EM_TBL_TYPE_TBL_SCOPE] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_TBL_SCOPE + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_TBL_SCOPE, + 0, 0, 0 }, }; struct tf_rm_element_cfg tf_em_int_p4[TF_EM_TBL_TYPE_MAX] = { [TF_EM_TBL_TYPE_EM_RECORD] = { - TF_RM_ELEM_CFG_HCAPI, CFA_RESOURCE_TYPE_P4_EM_REC + TF_RM_ELEM_CFG_HCAPI, CFA_RESOURCE_TYPE_P4_EM_REC, + 0, 0, 0 }, }; diff --git a/drivers/net/bnxt/tf_core/tf_device_p58.h b/drivers/net/bnxt/tf_core/tf_device_p58.h index 4d7a78e52c..b5e2598cb6 100644 --- a/drivers/net/bnxt/tf_core/tf_device_p58.h +++ b/drivers/net/bnxt/tf_core/tf_device_p58.h @@ -14,55 +14,70 @@ struct tf_rm_element_cfg tf_ident_p58[TF_IDENT_TYPE_MAX] = { [TF_IDENT_TYPE_L2_CTXT_HIGH] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_L2_CTXT_REMAP_HIGH + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_L2_CTXT_REMAP_HIGH, + 0, 0, 0 }, [TF_IDENT_TYPE_L2_CTXT_LOW] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_L2_CTXT_REMAP_LOW + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_L2_CTXT_REMAP_LOW, + 0, 0, 0 }, [TF_IDENT_TYPE_PROF_FUNC] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_PROF_FUNC + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_PROF_FUNC, + 0, 0, 0 }, [TF_IDENT_TYPE_WC_PROF] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_WC_TCAM_PROF_ID + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_WC_TCAM_PROF_ID, + 0, 0, 0 }, [TF_IDENT_TYPE_EM_PROF] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_EM_PROF_ID + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_EM_PROF_ID, + 0, 0, 0 }, }; struct tf_rm_element_cfg tf_tcam_p58[TF_TCAM_TBL_TYPE_MAX] = { [TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_L2_CTXT_TCAM_HIGH + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_L2_CTXT_TCAM_HIGH, + 0, 0, 0 }, [TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_L2_CTXT_TCAM_LOW + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_L2_CTXT_TCAM_LOW, + 0, 0, 0 }, [TF_TCAM_TBL_TYPE_PROF_TCAM] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_PROF_TCAM + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_PROF_TCAM, + 0, 0, 0 }, [TF_TCAM_TBL_TYPE_WC_TCAM] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_WC_TCAM + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_WC_TCAM, + 0, 0, 0 }, [TF_TCAM_TBL_TYPE_VEB_TCAM] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_VEB_TCAM + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_VEB_TCAM, + 0, 0, 0 }, }; struct tf_rm_element_cfg tf_tbl_p58[TF_TBL_TYPE_MAX] = { [TF_TBL_TYPE_EM_FKB] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_EM_FKB + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_EM_FKB, + 0, 0, 0 }, [TF_TBL_TYPE_WC_FKB] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_WC_FKB + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_WC_FKB, + 0, 0, 0 }, [TF_TBL_TYPE_METER_PROF] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_METER_PROF + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_METER_PROF, + 0, 0, 0 }, [TF_TBL_TYPE_METER_INST] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_METER + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_METER, + 0, 0, 0 }, [TF_TBL_TYPE_MIRROR_CONFIG] = { - TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_MIRROR + TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_MIRROR, + 0, 0, 0 }, /* Policy - ARs in bank 1 */ [TF_TBL_TYPE_FULL_ACT_RECORD] = { @@ -167,7 +182,8 @@ struct tf_rm_element_cfg tf_tbl_p58[TF_TBL_TYPE_MAX] = { struct tf_rm_element_cfg tf_em_int_p58[TF_EM_TBL_TYPE_MAX] = { [TF_EM_TBL_TYPE_EM_RECORD] = { - TF_RM_ELEM_CFG_HCAPI, CFA_RESOURCE_TYPE_P58_EM_REC + TF_RM_ELEM_CFG_HCAPI, CFA_RESOURCE_TYPE_P58_EM_REC, + 0, 0, 0 }, }; diff --git a/drivers/net/bnxt/tf_core/tf_em.h b/drivers/net/bnxt/tf_core/tf_em.h index 4de9e42cbc..2de1862cd9 100644 --- a/drivers/net/bnxt/tf_core/tf_em.h +++ b/drivers/net/bnxt/tf_core/tf_em.h @@ -9,7 +9,9 @@ #include "tf_core.h" #include "tf_session.h" -#include "hcapi/cfa/hcapi_cfa_defs.h" +#include "tf_em_common.h" + +#include "hcapi_cfa_defs.h" #define TF_EM_MIN_ENTRIES (1 << 15) /* 32K */ #define TF_EM_MAX_ENTRIES (1 << 27) /* 128M */ diff --git a/drivers/net/bnxt/tf_core/tf_em_common.c b/drivers/net/bnxt/tf_core/tf_em_common.c index d8278f1ce1..4dc3c86b57 100644 --- a/drivers/net/bnxt/tf_core/tf_em_common.c +++ b/drivers/net/bnxt/tf_core/tf_em_common.c @@ -19,18 +19,13 @@ #include "tfp.h" #include "tf_device.h" #include "tf_ext_flow_handle.h" -#include "cfa_resource_types.h" +#include "hcapi_cfa.h" #include "bnxt.h" /* Number of pointers per page_size */ #define MAX_PAGE_PTRS(page_size) ((page_size) / sizeof(void *)) -/** - * EM DBs. - */ -void *eem_db[TF_DIR_MAX]; - /** * Init flag, set on bind and cleared on unbind */ @@ -41,36 +36,7 @@ static uint8_t init; */ static enum tf_mem_type mem_type; -/** Table scope array */ -struct tf_tbl_scope_cb tbl_scopes[TF_NUM_TBL_SCOPE]; - /* API defined in tf_em.h */ -struct tf_tbl_scope_cb * -tbl_scope_cb_find(uint32_t tbl_scope_id) -{ - int i; - struct tf_rm_is_allocated_parms parms = { 0 }; - int allocated; - - /* Check that id is valid */ - parms.rm_db = eem_db[TF_DIR_RX]; - parms.subtype = TF_EM_TBL_TYPE_TBL_SCOPE; - parms.index = tbl_scope_id; - parms.allocated = &allocated; - - i = tf_rm_is_allocated(&parms); - - if (i < 0 || allocated != TF_RM_ALLOCATED_ENTRY_IN_USE) - return NULL; - - for (i = 0; i < TF_NUM_TBL_SCOPE; i++) { - if (tbl_scopes[i].tbl_scope_id == tbl_scope_id) - return &tbl_scopes[i]; - } - - return NULL; -} - int tf_create_tbl_pool_external(enum tf_dir dir, struct tf_tbl_scope_cb *tbl_scope_cb, @@ -158,6 +124,44 @@ tf_destroy_tbl_pool_external(enum tf_dir dir, tfp_free(ext_act_pool_mem); } +/** + * Looks up table scope control block using tbl_scope_id from tf_session. + * + * [in] tfp + * Pointer to Truflow Handle + * [in] tbl_scope_id + * table scope id + * + * Return: + * - Pointer to the tf_tbl_scope_cb, if found. + * - (NULL) on failure, not found. + */ +struct tf_tbl_scope_cb * +tf_em_ext_common_tbl_scope_find(struct tf *tfp, + uint32_t tbl_scope_id) +{ + int rc; + struct em_ext_db *ext_db; + void *ext_ptr = NULL; + struct tf_tbl_scope_cb *tbl_scope_cb = NULL; + struct ll_entry *entry; + + rc = tf_session_get_em_ext_db(tfp, &ext_ptr); + if (rc) + return NULL; + + ext_db = (struct em_ext_db *)ext_ptr; + + for (entry = ext_db->tbl_scope_ll.head; entry != NULL; + entry = entry->next) { + tbl_scope_cb = (struct tf_tbl_scope_cb *)entry; + if (tbl_scope_cb->tbl_scope_id == tbl_scope_id) + return tbl_scope_cb; + } + + return NULL; +} + /** * Allocate External Tbl entry from the scope pool. * @@ -182,16 +186,14 @@ tf_tbl_ext_alloc(struct tf *tfp, TF_CHECK_PARMS2(tfp, parms); - /* Get the pool info from the table scope - */ - tbl_scope_cb = tbl_scope_cb_find(parms->tbl_scope_id); - + tbl_scope_cb = tf_em_ext_common_tbl_scope_find(tfp, parms->tbl_scope_id); if (tbl_scope_cb == NULL) { TFP_DRV_LOG(ERR, "%s, table scope not allocated\n", tf_dir_2_str(parms->dir)); return -EINVAL; } + pool = &tbl_scope_cb->ext_act_pool[parms->dir]; /* Allocate an element @@ -237,10 +239,7 @@ tf_tbl_ext_free(struct tf *tfp, TF_CHECK_PARMS2(tfp, parms); - /* Get the pool info from the table scope - */ - tbl_scope_cb = tbl_scope_cb_find(parms->tbl_scope_id); - + tbl_scope_cb = tf_em_ext_common_tbl_scope_find(tfp, parms->tbl_scope_id); if (tbl_scope_cb == NULL) { TFP_DRV_LOG(ERR, "%s, table scope error\n", @@ -646,7 +645,18 @@ tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb, tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_RECORD_TABLE].entry_size = parms->rx_max_action_entry_sz_in_bits / 8; - tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_EFC_TABLE].num_entries = 0; + tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_EFC_TABLE].num_entries = + 0; + + tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_ACTION_TABLE].num_entries = + parms->rx_num_flows_in_k * TF_KILOBYTE; + tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_ACTION_TABLE].entry_size = + parms->rx_max_action_entry_sz_in_bits / 8; + + tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_EM_LKUP_TABLE].num_entries = + parms->rx_num_flows_in_k * TF_KILOBYTE; + tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_EM_LKUP_TABLE].entry_size = + parms->rx_max_key_sz_in_bits / 8; /* Tx */ tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_KEY0_TABLE].num_entries = @@ -664,7 +674,18 @@ tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb, tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_RECORD_TABLE].entry_size = parms->tx_max_action_entry_sz_in_bits / 8; - tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_EFC_TABLE].num_entries = 0; + tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_EFC_TABLE].num_entries = + 0; + + tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_ACTION_TABLE].num_entries = + parms->rx_num_flows_in_k * TF_KILOBYTE; + tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_ACTION_TABLE].entry_size = + parms->tx_max_action_entry_sz_in_bits / 8; + + tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_EM_LKUP_TABLE].num_entries = + parms->rx_num_flows_in_k * TF_KILOBYTE; + tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_EM_LKUP_TABLE].entry_size = + parms->tx_max_key_sz_in_bits / 8; return 0; } @@ -747,10 +768,10 @@ tf_insert_eem_entry(struct tf_dev_info *dev, key_obj.data = (uint8_t *)&key_entry; key_obj.size = TF_P4_EM_KEY_RECORD_SIZE; - rc = hcapi_cfa_key_hw_op(&op, - &key_tbl, - &key_obj, - &key_loc); + rc = cfa_p4_devops.hcapi_cfa_key_hw_op(&op, + &key_tbl, + &key_obj, + &key_loc); if (rc == 0) { table_type = TF_KEY0_TABLE; @@ -761,10 +782,10 @@ tf_insert_eem_entry(struct tf_dev_info *dev, (uint8_t *)&tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_KEY1_TABLE]; key_obj.offset = index * TF_P4_EM_KEY_RECORD_SIZE; - rc = hcapi_cfa_key_hw_op(&op, - &key_tbl, - &key_obj, - &key_loc); + rc = cfa_p4_devops.hcapi_cfa_key_hw_op(&op, + &key_tbl, + &key_obj, + &key_loc); if (rc != 0) return rc; @@ -781,7 +802,7 @@ tf_insert_eem_entry(struct tf_dev_info *dev, TF_SET_FIELDS_IN_FLOW_HANDLE(parms->flow_handle, 0, 0, - TF_FLAGS_FLOW_HANDLE_EXTERNAL, + 0, index, 0, table_type); @@ -826,10 +847,10 @@ tf_delete_eem_entry(struct tf_tbl_scope_cb *tbl_scope_cb, key_obj.data = NULL; key_obj.size = TF_P4_EM_KEY_RECORD_SIZE; - rc = hcapi_cfa_key_hw_op(&op, - &key_tbl, - &key_obj, - &key_loc); + rc = cfa_p4_devops.hcapi_cfa_key_hw_op(&op, + &key_tbl, + &key_obj, + &key_loc); if (!rc) return rc; @@ -844,7 +865,7 @@ tf_delete_eem_entry(struct tf_tbl_scope_cb *tbl_scope_cb, * -EINVAL - Error */ int -tf_em_insert_ext_entry(struct tf *tfp __rte_unused, +tf_em_insert_ext_entry(struct tf *tfp, struct tf_insert_em_entry_parms *parms) { int rc; @@ -852,7 +873,7 @@ tf_em_insert_ext_entry(struct tf *tfp __rte_unused, struct tf_session *tfs; struct tf_dev_info *dev; - tbl_scope_cb = tbl_scope_cb_find(parms->tbl_scope_id); + tbl_scope_cb = tf_em_ext_common_tbl_scope_find(tfp, parms->tbl_scope_id); if (tbl_scope_cb == NULL) { TFP_DRV_LOG(ERR, "Invalid tbl_scope_cb\n"); return -EINVAL; @@ -881,12 +902,12 @@ tf_em_insert_ext_entry(struct tf *tfp __rte_unused, * -EINVAL - Error */ int -tf_em_delete_ext_entry(struct tf *tfp __rte_unused, +tf_em_delete_ext_entry(struct tf *tfp, struct tf_delete_em_entry_parms *parms) { struct tf_tbl_scope_cb *tbl_scope_cb; - tbl_scope_cb = tbl_scope_cb_find(parms->tbl_scope_id); + tbl_scope_cb = tf_em_ext_common_tbl_scope_find(tfp, parms->tbl_scope_id); if (tbl_scope_cb == NULL) { TFP_DRV_LOG(ERR, "Invalid tbl_scope_cb\n"); return -EINVAL; @@ -904,6 +925,8 @@ tf_em_ext_common_bind(struct tf *tfp, int i; struct tf_rm_create_db_parms db_cfg = { 0 }; uint8_t db_exists = 0; + struct em_ext_db *ext_db; + struct tfp_calloc_parms cparms; TF_CHECK_PARMS2(tfp, parms); @@ -913,6 +936,21 @@ tf_em_ext_common_bind(struct tf *tfp, return -EINVAL; } + cparms.nitems = 1; + cparms.size = sizeof(struct em_ext_db); + cparms.alignment = 0; + if (tfp_calloc(&cparms) != 0) { + TFP_DRV_LOG(ERR, "em_ext_db alloc error %s\n", + strerror(ENOMEM)); + return -ENOMEM; + } + + ext_db = cparms.mem_va; + ll_init(&ext_db->tbl_scope_ll); + for (i = 0; i < TF_DIR_MAX; i++) + ext_db->eem_db[i] = NULL; + tf_session_set_em_ext_db(tfp, ext_db); + db_cfg.module = TF_MODULE_TYPE_EM; db_cfg.num_elements = parms->num_elements; db_cfg.cfg = parms->cfg; @@ -927,7 +965,7 @@ tf_em_ext_common_bind(struct tf *tfp, if (db_cfg.alloc_cnt[TF_EM_TBL_TYPE_TBL_SCOPE] == 0) continue; - db_cfg.rm_db = &eem_db[i]; + db_cfg.rm_db = (void *)&ext_db->eem_db[i]; rc = tf_rm_create_db(tfp, &db_cfg); if (rc) { TFP_DRV_LOG(ERR, @@ -953,6 +991,13 @@ tf_em_ext_common_unbind(struct tf *tfp) int rc; int i; struct tf_rm_free_db_parms fparms = { 0 }; + struct em_ext_db *ext_db = NULL; + struct tf_session *tfs = NULL; + struct tf_dev_info *dev; + struct ll_entry *entry; + struct tf_tbl_scope_cb *tbl_scope_cb = NULL; + void *ext_ptr = NULL; + struct tf_free_tbl_scope_parms tparms = { 0 }; TF_CHECK_PARMS1(tfp); @@ -963,16 +1008,62 @@ tf_em_ext_common_unbind(struct tf *tfp) return 0; } + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) { + TFP_DRV_LOG(ERR, "Failed to get tf_session, rc:%s\n", + strerror(-rc)); + return rc; + } + + /* Retrieve the device information */ + rc = tf_session_get_device(tfs, &dev); + if (rc) { + TFP_DRV_LOG(ERR, + "Failed to lookup device, rc:%s\n", + strerror(-rc)); + return rc; + } + + rc = tf_session_get_em_ext_db(tfp, &ext_ptr); + if (rc) { + TFP_DRV_LOG(ERR, + "Failed to get em_ext_db from session, rc:%s\n", + strerror(-rc)); + return rc; + } + ext_db = (struct em_ext_db *)ext_ptr; + + entry = ext_db->tbl_scope_ll.head; + while (entry != NULL) { + tbl_scope_cb = (struct tf_tbl_scope_cb *)entry; + entry = entry->next; + tparms.tbl_scope_id = tbl_scope_cb->tbl_scope_id; + + if (dev->ops->tf_dev_free_tbl_scope) { + dev->ops->tf_dev_free_tbl_scope(tfp, &tparms); + } else { + /* should not reach here */ + ll_delete(&ext_db->tbl_scope_ll, &tbl_scope_cb->ll_entry); + tfp_free(tbl_scope_cb); + } + } + for (i = 0; i < TF_DIR_MAX; i++) { + if (ext_db->eem_db[i] == NULL) + continue; + fparms.dir = i; - fparms.rm_db = eem_db[i]; + fparms.rm_db = ext_db->eem_db[i]; rc = tf_rm_free_db(tfp, &fparms); if (rc) return rc; - eem_db[i] = NULL; + ext_db->eem_db[i] = NULL; } + tfp_free(ext_db); + tf_session_set_em_ext_db(tfp, NULL); + init = 0; return 0; @@ -1022,11 +1113,7 @@ int tf_tbl_ext_common_set(struct tf *tfp, return -EINVAL; } - /* Get the table scope control block associated with the - * external pool - */ - tbl_scope_cb = tbl_scope_cb_find(tbl_scope_id); - + tbl_scope_cb = tf_em_ext_common_tbl_scope_find(tfp, tbl_scope_id); if (tbl_scope_cb == NULL) { TFP_DRV_LOG(ERR, "%s, table scope error\n", @@ -1042,10 +1129,10 @@ int tf_tbl_ext_common_set(struct tf *tfp, key_obj.data = parms->data; key_obj.size = parms->data_sz_in_bytes; - rc = hcapi_cfa_key_hw_op(&op, - &key_tbl, - &key_obj, - &key_loc); + rc = cfa_p4_devops.hcapi_cfa_key_hw_op(&op, + &key_tbl, + &key_obj, + &key_loc); return rc; } @@ -1076,14 +1163,6 @@ int tf_em_ext_map_tbl_scope(struct tf *tfp, uint32_t sz_in_bytes = 8; struct tf_dev_info *dev; - tbl_scope_cb = tbl_scope_cb_find(parms->tbl_scope_id); - - if (tbl_scope_cb == NULL) { - TFP_DRV_LOG(ERR, "Invalid tbl_scope_cb tbl_scope_id(%d)\n", - parms->tbl_scope_id); - return -EINVAL; - } - /* Retrieve the session information */ rc = tf_session_get_session_internal(tfp, &tfs); if (rc) @@ -1094,6 +1173,13 @@ int tf_em_ext_map_tbl_scope(struct tf *tfp, if (rc) return rc; + tbl_scope_cb = tf_em_ext_common_tbl_scope_find(tfp, parms->tbl_scope_id); + if (tbl_scope_cb == NULL) { + TFP_DRV_LOG(ERR, "Invalid tbl_scope_cb tbl_scope_id(%d)\n", + parms->tbl_scope_id); + return -EINVAL; + } + if (dev->ops->tf_dev_map_tbl_scope == NULL) { rc = -EOPNOTSUPP; TFP_DRV_LOG(ERR, diff --git a/drivers/net/bnxt/tf_core/tf_em_common.h b/drivers/net/bnxt/tf_core/tf_em_common.h index 5e55f4e968..7f215adef2 100644 --- a/drivers/net/bnxt/tf_core/tf_em_common.h +++ b/drivers/net/bnxt/tf_core/tf_em_common.h @@ -8,7 +8,7 @@ #include "tf_core.h" #include "tf_session.h" - +#include "ll.h" /** * Function to search for table scope control block structure @@ -23,6 +23,53 @@ */ struct tf_tbl_scope_cb *tbl_scope_cb_find(uint32_t tbl_scope_id); +/** + * Table scope control block content + */ +struct tf_em_caps { + uint32_t flags; + uint32_t supported; + uint32_t max_entries_supported; + uint16_t key_entry_size; + uint16_t record_entry_size; + uint16_t efc_entry_size; +}; + +/** + * EEM data + * + * Link list of ext em data allocated and managed by EEM module + * for a TruFlow session. + */ +struct em_ext_db { + struct ll tbl_scope_ll; + struct rm_db *eem_db[TF_DIR_MAX]; +}; + +/** + * Table Scope Control Block + * + * Holds private data for a table scope. + */ +struct tf_tbl_scope_cb { + /** + * Linked list of tbl_scope + */ + struct ll_entry ll_entry; /* For inserting in link list, must be + * first field of struct. + */ + + uint32_t tbl_scope_id; + + /** The pf or parent pf of the vf used for table scope creation + */ + uint16_t pf; + struct hcapi_cfa_em_ctx_mem_info em_ctx_info[TF_DIR_MAX]; + struct tf_em_caps em_caps[TF_DIR_MAX]; + struct stack ext_act_pool[TF_DIR_MAX]; + uint32_t *ext_act_pool_mem[TF_DIR_MAX]; +}; + /** * Create and initialize a stack to use for action entries * @@ -131,4 +178,23 @@ int tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb, int tf_em_size_table(struct hcapi_cfa_em_table *tbl, uint32_t page_size); + +/** + * Look up table scope control block using tbl_scope_id from + * tf_session + * + * [in] tbl_scope_cb + * Pointer to Truflow Handle + * + * [in] tbl_scope_id + * table scope id + * + * Returns: + * - Pointer to the tf_tbl_scope_cb, if found. + * - (NULL) on failure, not found. + */ +struct tf_tbl_scope_cb * +tf_em_ext_common_tbl_scope_find(struct tf *tfp, + uint32_t tbl_scope_id); + #endif /* _TF_EM_COMMON_H_ */ diff --git a/drivers/net/bnxt/tf_core/tf_em_host.c b/drivers/net/bnxt/tf_core/tf_em_host.c index 166f397935..869a78e904 100644 --- a/drivers/net/bnxt/tf_core/tf_em_host.c +++ b/drivers/net/bnxt/tf_core/tf_em_host.c @@ -29,13 +29,6 @@ /* Number of pointers per page_size */ #define MAX_PAGE_PTRS(page_size) ((page_size) / sizeof(void *)) -/** - * EM DBs. - */ -extern void *eem_db[TF_DIR_MAX]; - -extern struct tf_tbl_scope_cb tbl_scopes[TF_NUM_TBL_SCOPE]; - /** * Function to free a page table * @@ -367,7 +360,8 @@ tf_em_ctx_reg(struct tf *tfp, } int -tf_em_ext_alloc(struct tf *tfp, struct tf_alloc_tbl_scope_parms *parms) +tf_em_ext_alloc(struct tf *tfp, + struct tf_alloc_tbl_scope_parms *parms) { int rc; enum tf_dir dir; @@ -376,30 +370,65 @@ tf_em_ext_alloc(struct tf *tfp, struct tf_alloc_tbl_scope_parms *parms) struct tf_free_tbl_scope_parms free_parms; struct tf_rm_allocate_parms aparms = { 0 }; struct tf_rm_free_parms fparms = { 0 }; + struct tfp_calloc_parms cparms; + struct tf_session *tfs = NULL; + struct em_ext_db *ext_db = NULL; + void *ext_ptr = NULL; + uint16_t pf; + + + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) { + TFP_DRV_LOG(ERR, "Failed to get tf_session, rc:%s\n", + strerror(-rc)); + return rc; + } + + rc = tf_session_get_em_ext_db(tfp, &ext_ptr); + if (rc) { + TFP_DRV_LOG(ERR, + "Failed to get em_ext_db from session, rc:%s\n", + strerror(-rc)); + return rc; + } + ext_db = (struct em_ext_db *)ext_ptr; + + rc = tfp_get_pf(tfp, &pf); + if (rc) { + TFP_DRV_LOG(ERR, + "EEM: PF query error rc:%s\n", + strerror(-rc)); + goto cleanup; + } /* Get Table Scope control block from the session pool */ - aparms.rm_db = eem_db[TF_DIR_RX]; + aparms.rm_db = ext_db->eem_db[TF_DIR_RX]; aparms.subtype = TF_EM_TBL_TYPE_TBL_SCOPE; aparms.index = (uint32_t *)&parms->tbl_scope_id; rc = tf_rm_allocate(&aparms); if (rc) { TFP_DRV_LOG(ERR, "Failed to allocate table scope\n"); - return rc; + goto cleanup; } - tbl_scope_cb = &tbl_scopes[parms->tbl_scope_id]; - tbl_scope_cb->index = parms->tbl_scope_id; - tbl_scope_cb->tbl_scope_id = parms->tbl_scope_id; - - rc = tfp_get_pf(tfp, &tbl_scope_cb->pf); + /* Create tbl_scope, initialize and attach to the session */ + cparms.nitems = 1; + cparms.size = sizeof(struct tf_tbl_scope_cb); + cparms.alignment = 0; + rc = tfp_calloc(&cparms); if (rc) { + /* Log error */ TFP_DRV_LOG(ERR, - "EEM: PF query error rc:%s\n", - strerror(-rc)); + "Failed to allocate session table scope, rc:%s\n", + strerror(-rc)); goto cleanup; } + tbl_scope_cb = cparms.mem_va; + tbl_scope_cb->tbl_scope_id = parms->tbl_scope_id; + tbl_scope_cb->pf = pf; + for (dir = 0; dir < TF_DIR_MAX; dir++) { rc = tf_msg_em_qcaps(tfp, dir, @@ -409,7 +438,7 @@ tf_em_ext_alloc(struct tf *tfp, struct tf_alloc_tbl_scope_parms *parms) "EEM: Unable to query for EEM capability," " rc:%s\n", strerror(-rc)); - goto cleanup; + goto cleanup_ts; } } @@ -417,7 +446,7 @@ tf_em_ext_alloc(struct tf *tfp, struct tf_alloc_tbl_scope_parms *parms) * Validate and setup table sizes */ if (tf_em_validate_num_entries(tbl_scope_cb, parms)) - goto cleanup; + goto cleanup_ts; for (dir = 0; dir < TF_DIR_MAX; dir++) { /* @@ -429,7 +458,7 @@ tf_em_ext_alloc(struct tf *tfp, struct tf_alloc_tbl_scope_parms *parms) "EEM: Unable to register for EEM ctx," " rc:%s\n", strerror(-rc)); - goto cleanup; + goto cleanup_ts; } em_tables = tbl_scope_cb->em_ctx_info[dir].em_tables; @@ -478,19 +507,29 @@ tf_em_ext_alloc(struct tf *tfp, struct tf_alloc_tbl_scope_parms *parms) } } + /* Insert into session tbl_scope list */ + ll_insert(&ext_db->tbl_scope_ll, &tbl_scope_cb->ll_entry); return 0; cleanup_full: free_parms.tbl_scope_id = parms->tbl_scope_id; + /* Insert into session list prior to ext_free */ + ll_insert(&ext_db->tbl_scope_ll, &tbl_scope_cb->ll_entry); tf_em_ext_free(tfp, &free_parms); return -EINVAL; +cleanup_ts: + tfp_free(tbl_scope_cb); + cleanup: /* Free Table control block */ - fparms.rm_db = eem_db[TF_DIR_RX]; + fparms.rm_db = ext_db->eem_db[TF_DIR_RX]; fparms.subtype = TF_EM_TBL_TYPE_TBL_SCOPE; fparms.index = parms->tbl_scope_id; - tf_rm_free(&fparms); + rc = tf_rm_free(&fparms); + if (rc) + TFP_DRV_LOG(ERR, "Failed to free table scope\n"); + return -EINVAL; } @@ -501,17 +540,35 @@ tf_em_ext_free(struct tf *tfp, int rc = 0; enum tf_dir dir; struct tf_tbl_scope_cb *tbl_scope_cb; + struct tf_session *tfs; + struct em_ext_db *ext_db = NULL; + void *ext_ptr = NULL; struct tf_rm_free_parms aparms = { 0 }; - tbl_scope_cb = tbl_scope_cb_find(parms->tbl_scope_id); + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) { + TFP_DRV_LOG(ERR, "Failed to get tf_session, rc:%s\n", + strerror(-rc)); + return -EINVAL; + } + + rc = tf_session_get_em_ext_db(tfp, &ext_ptr); + if (rc) { + TFP_DRV_LOG(ERR, + "Failed to get em_ext_db from session, rc:%s\n", + strerror(-rc)); + return rc; + } + ext_db = (struct em_ext_db *)ext_ptr; + tbl_scope_cb = tf_em_ext_common_tbl_scope_find(tfp, parms->tbl_scope_id); if (tbl_scope_cb == NULL) { TFP_DRV_LOG(ERR, "Table scope error\n"); return -EINVAL; } /* Free Table control block */ - aparms.rm_db = eem_db[TF_DIR_RX]; + aparms.rm_db = ext_db->eem_db[TF_DIR_RX]; aparms.subtype = TF_EM_TBL_TYPE_TBL_SCOPE; aparms.index = parms->tbl_scope_id; rc = tf_rm_free(&aparms); @@ -534,6 +591,8 @@ tf_em_ext_free(struct tf *tfp, tf_em_ctx_unreg(tfp, tbl_scope_cb, dir); } - tbl_scopes[parms->tbl_scope_id].tbl_scope_id = TF_TBL_SCOPE_INVALID; + /* remove from session list and free tbl_scope */ + ll_delete(&ext_db->tbl_scope_ll, &tbl_scope_cb->ll_entry); + tfp_free(tbl_scope_cb); return rc; } diff --git a/drivers/net/bnxt/tf_core/tf_msg.c b/drivers/net/bnxt/tf_core/tf_msg.c index ec4c7890c3..c6eb94bee0 100644 --- a/drivers/net/bnxt/tf_core/tf_msg.c +++ b/drivers/net/bnxt/tf_core/tf_msg.c @@ -9,6 +9,7 @@ #include #include +#include "tf_em_common.h" #include "tf_msg_common.h" #include "tf_device.h" #include "tf_msg.h" @@ -16,7 +17,6 @@ #include "tf_common.h" #include "tf_session.h" #include "tfp.h" -#include "hwrm_tf.h" #include "tf_em.h" /* Specific msg size defines as we cannot use defines in tf.yaml. This @@ -39,8 +39,19 @@ * array size (define above) should be checked and compared. */ #define TF_MSG_SIZE_HWRM_TF_GLOBAL_CFG_SET 56 +static_assert(sizeof(struct hwrm_tf_global_cfg_set_input) == + TF_MSG_SIZE_HWRM_TF_GLOBAL_CFG_SET, + "HWRM message size changed: hwrm_tf_global_cfg_set_input"); + #define TF_MSG_SIZE_HWRM_TF_EM_INSERT 104 +static_assert(sizeof(struct hwrm_tf_em_insert_input) == + TF_MSG_SIZE_HWRM_TF_EM_INSERT, + "HWRM message size changed: hwrm_tf_em_insert_input"); + #define TF_MSG_SIZE_HWRM_TF_TBL_TYPE_SET 128 +static_assert(sizeof(struct hwrm_tf_tbl_type_set_input) == + TF_MSG_SIZE_HWRM_TF_TBL_TYPE_SET, + "HWRM message size changed: hwrm_tf_tbl_type_set_input"); /** * This is the MAX data we can transport across regular HWRM @@ -862,6 +873,117 @@ tf_msg_delete_em_entry(struct tf *tfp, return 0; } +int tf_msg_ext_em_ctxt_mem_alloc(struct tf *tfp, + struct hcapi_cfa_em_table *tbl, + uint64_t *dma_addr, + uint32_t *page_lvl, + uint32_t *page_size) +{ + struct tfp_send_msg_parms parms = { 0 }; + struct hwrm_tf_ctxt_mem_alloc_input req = {0}; + struct hwrm_tf_ctxt_mem_alloc_output resp = {0}; + uint32_t mem_size_k; + int rc = 0; + struct tf_dev_info *dev; + struct tf_session *tfs; + uint32_t fw_se_id; + + /* 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; + } + + /* Retrieve the device information */ + rc = tf_session_get_device(tfs, &dev); + if (rc) { + TFP_DRV_LOG(ERR, + "Failed to lookup device, rc:%s\n", + strerror(-rc)); + return rc; + } + /* Retrieve the session information */ + fw_se_id = tfs->session_id.internal.fw_session_id; + + if (tbl->num_entries && tbl->entry_size) { + /* unit: kbytes */ + mem_size_k = (tbl->num_entries / TF_KILOBYTE) * tbl->entry_size; + req.mem_size = tfp_cpu_to_le_32(mem_size_k); + req.fw_session_id = tfp_cpu_to_le_32(fw_se_id); + parms.tf_type = HWRM_TF_CTXT_MEM_ALLOC; + parms.req_data = (uint32_t *)&req; + parms.req_size = sizeof(req); + parms.resp_data = (uint32_t *)&resp; + parms.resp_size = sizeof(resp); + parms.mailbox = dev->ops->tf_dev_get_mailbox(); + rc = tfp_send_msg_direct(tfp, &parms); + if (rc) { + TFP_DRV_LOG(ERR, "Failed ext_em_alloc error rc:%s\n", + strerror(-rc)); + return rc; + } + + *dma_addr = tfp_le_to_cpu_64(resp.page_dir); + *page_lvl = resp.page_level; + *page_size = resp.page_size; + } + + return rc; +} + +int tf_msg_ext_em_ctxt_mem_free(struct tf *tfp, + uint32_t mem_size_k, + uint64_t dma_addr, + uint8_t page_level, + uint8_t page_size) +{ + struct tfp_send_msg_parms parms = { 0 }; + struct hwrm_tf_ctxt_mem_free_input req = {0}; + struct hwrm_tf_ctxt_mem_free_output resp = {0}; + int rc = 0; + struct tf_dev_info *dev; + struct tf_session *tfs; + uint32_t fw_se_id; + + /* 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; + } + + /* Retrieve the device information */ + rc = tf_session_get_device(tfs, &dev); + if (rc) { + TFP_DRV_LOG(ERR, + "Failed to lookup device, rc:%s\n", + strerror(-rc)); + return rc; + } + /* Retrieve the session information */ + fw_se_id = tfs->session_id.internal.fw_session_id; + + req.fw_session_id = tfp_cpu_to_le_32(fw_se_id); + req.mem_size = tfp_cpu_to_le_32(mem_size_k); + req.page_dir = tfp_cpu_to_le_64(dma_addr); + req.page_level = page_level; + req.page_size = page_size; + parms.tf_type = HWRM_TF_CTXT_MEM_FREE; + parms.req_data = (uint32_t *)&req; + parms.req_size = sizeof(req); + parms.resp_data = (uint32_t *)&resp; + parms.resp_size = sizeof(resp); + parms.mailbox = dev->ops->tf_dev_get_mailbox(); + rc = tfp_send_msg_direct(tfp, &parms); + + return rc; +} + int tf_msg_em_mem_rgtr(struct tf *tfp, int page_lvl, @@ -875,6 +997,7 @@ tf_msg_em_mem_rgtr(struct tf *tfp, struct tfp_send_msg_parms parms = { 0 }; struct tf_dev_info *dev; struct tf_session *tfs; + uint32_t fw_se_id; /* Retrieve the session information */ rc = tf_session_get_session_internal(tfp, &tfs); @@ -893,7 +1016,9 @@ tf_msg_em_mem_rgtr(struct tf *tfp, strerror(-rc)); return rc; } + fw_se_id = tfs->session_id.internal.fw_session_id; + req.fw_session_id = tfp_cpu_to_le_32(fw_se_id); req.page_level = page_lvl; req.page_size = page_size; req.page_dir = tfp_cpu_to_le_64(dma_addr); @@ -925,6 +1050,7 @@ tf_msg_em_mem_unrgtr(struct tf *tfp, struct tfp_send_msg_parms parms = { 0 }; struct tf_dev_info *dev; struct tf_session *tfs; + uint32_t fw_se_id; /* Retrieve the session information */ rc = tf_session_get_session_internal(tfp, &tfs); @@ -944,6 +1070,9 @@ tf_msg_em_mem_unrgtr(struct tf *tfp, return rc; } + fw_se_id = tfs->session_id.internal.fw_session_id; + req.fw_session_id = tfp_cpu_to_le_32(fw_se_id); + req.ctx_id = tfp_cpu_to_le_32(*ctx_id); parms.tf_type = HWRM_TF_CTXT_MEM_UNRGTR; @@ -970,6 +1099,7 @@ tf_msg_em_qcaps(struct tf *tfp, struct tfp_send_msg_parms parms = { 0 }; struct tf_dev_info *dev; struct tf_session *tfs; + uint32_t fw_se_id; /* Retrieve the session information */ rc = tf_session_get_session_internal(tfp, &tfs); @@ -980,6 +1110,7 @@ tf_msg_em_qcaps(struct tf *tfp, strerror(-rc)); return rc; } + fw_se_id = tfs->session_id.internal.fw_session_id; /* Retrieve the device information */ rc = tf_session_get_device(tfs, &dev); @@ -996,6 +1127,7 @@ tf_msg_em_qcaps(struct tf *tfp, req.flags = tfp_cpu_to_le_32(flags); parms.tf_type = HWRM_TF_EXT_EM_QCAPS; + req.fw_session_id = tfp_cpu_to_le_32(fw_se_id); parms.req_data = (uint32_t *)&req; parms.req_size = sizeof(req); parms.resp_data = (uint32_t *)&resp; @@ -1082,6 +1214,80 @@ tf_msg_em_cfg(struct tf *tfp, return rc; } +int +tf_msg_ext_em_cfg(struct tf *tfp, + struct tf_tbl_scope_cb *tbl_scope_cb, + uint32_t st_buckets, + uint8_t flush_interval, + enum tf_dir dir) +{ + struct hcapi_cfa_em_ctx_mem_info *ctxp = &tbl_scope_cb->em_ctx_info[dir]; + struct hcapi_cfa_em_table *lkup_tbl, *act_tbl; + struct hwrm_tf_ext_em_cfg_input req = {0}; + struct hwrm_tf_ext_em_cfg_output resp = {0}; + struct tfp_send_msg_parms parms = { 0 }; + uint32_t flags; + struct tf_dev_info *dev; + struct tf_session *tfs; + uint32_t fw_se_id; + int rc; + + /* Retrieve the session information */ + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to lookup session, rc:%s\n", + tf_dir_2_str(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(dir), + strerror(-rc)); + return rc; + } + fw_se_id = tfs->session_id.internal.fw_session_id; + + lkup_tbl = &ctxp->em_tables[TF_EM_LKUP_TABLE]; + act_tbl = &ctxp->em_tables[TF_ACTION_TABLE]; + flags = (dir == TF_DIR_TX ? HWRM_TF_EXT_EM_CFG_INPUT_FLAGS_DIR_TX : + HWRM_TF_EXT_EM_CFG_INPUT_FLAGS_DIR_RX); + flags |= HWRM_TF_EXT_EM_QCAPS_INPUT_FLAGS_PREFERRED_OFFLOAD; + + req.flags = tfp_cpu_to_le_32(flags); + req.num_entries = tfp_cpu_to_le_32(act_tbl->num_entries); + req.lkup_static_buckets = tfp_cpu_to_le_32(st_buckets); + req.fw_session_id = tfp_cpu_to_le_32(fw_se_id); + req.flush_interval = flush_interval; + req.action_ctx_id = tfp_cpu_to_le_16(act_tbl->ctx_id); + req.action_tbl_scope = tfp_cpu_to_le_16(tbl_scope_cb->tbl_scope_id); + req.lkup_ctx_id = tfp_cpu_to_le_16(lkup_tbl->ctx_id); + req.lkup_tbl_scope = tfp_cpu_to_le_16(tbl_scope_cb->tbl_scope_id); + + req.enables = (HWRM_TF_EXT_EM_CFG_INPUT_ENABLES_ACTION_CTX_ID | + HWRM_TF_EXT_EM_CFG_INPUT_ENABLES_ACTION_TBL_SCOPE | + HWRM_TF_EXT_EM_CFG_INPUT_ENABLES_LKUP_CTX_ID | + HWRM_TF_EXT_EM_CFG_INPUT_ENABLES_LKUP_TBL_SCOPE | + HWRM_TF_EXT_EM_CFG_INPUT_ENABLES_LKUP_STATIC_BUCKETS | + HWRM_TF_EXT_EM_CFG_INPUT_ENABLES_NUM_ENTRIES); + + parms.tf_type = HWRM_TF_EXT_EM_CFG; + parms.req_data = (uint32_t *)&req; + parms.req_size = sizeof(req); + parms.resp_data = (uint32_t *)&resp; + parms.resp_size = sizeof(resp); + parms.mailbox = dev->ops->tf_dev_get_mailbox(); + + rc = tfp_send_msg_direct(tfp, + &parms); + return rc; +} + int tf_msg_em_op(struct tf *tfp, int dir, @@ -1244,9 +1450,6 @@ tf_msg_tcam_entry_get(struct tf *tfp, if (rc != 0) return rc; - if (mparms.tf_resp_code != 0) - return tfp_le_to_cpu_32(mparms.tf_resp_code); - if (parms->key_size < resp.key_size || parms->result_size < resp.result_size) { rc = -EINVAL; @@ -1264,7 +1467,7 @@ tf_msg_tcam_entry_get(struct tf *tfp, tfp_memcpy(parms->mask, &resp.dev_data[resp.key_size], resp.key_size); tfp_memcpy(parms->result, &resp.dev_data[resp.result_offset], resp.result_size); - return tfp_le_to_cpu_32(mparms.tf_resp_code); + return 0; } int @@ -1388,7 +1591,7 @@ tf_msg_set_tbl_entry(struct tf *tfp, if (rc) return rc; - return tfp_le_to_cpu_32(parms.tf_resp_code); + return 0; } int @@ -1454,15 +1657,22 @@ tf_msg_get_tbl_entry(struct tf *tfp, if (rc) return rc; - /* Verify that we got enough buffer to return the requested data */ - if (tfp_le_to_cpu_32(resp.size) != size) + /* + * The response will be 64 bytes long, the response size will + * be in words (16). All we can test for is that the response + * size is < to the requested size. + */ + if ((tfp_le_to_cpu_32(resp.size) * 4) < size) return -EINVAL; + /* + * Copy the requested number of bytes + */ tfp_memcpy(data, &resp.data, size); - return tfp_le_to_cpu_32(parms.tf_resp_code); + return 0; } /* HWRM Tunneled messages */ @@ -1544,7 +1754,7 @@ tf_msg_get_global_cfg(struct tf *tfp, else return -EFAULT; - return tfp_le_to_cpu_32(parms.tf_resp_code); + return 0; } int @@ -1560,9 +1770,6 @@ tf_msg_set_global_cfg(struct tf *tfp, struct tf_dev_info *dev; struct tf_session *tfs; - RTE_BUILD_BUG_ON(sizeof(struct hwrm_tf_global_cfg_set_input) != - TF_MSG_SIZE_HWRM_TF_GLOBAL_CFG_SET); - /* Retrieve the session information */ rc = tf_session_get_session_internal(tfp, &tfs); if (rc) { @@ -1637,7 +1844,7 @@ tf_msg_set_global_cfg(struct tf *tfp, if (rc != 0) return rc; - return tfp_le_to_cpu_32(parms.tf_resp_code); + return 0; } int @@ -1651,8 +1858,8 @@ tf_msg_bulk_get_tbl_entry(struct tf *tfp, { int rc; struct tfp_send_msg_parms parms = { 0 }; - struct tf_tbl_type_bulk_get_input req = { 0 }; - struct tf_tbl_type_bulk_get_output resp = { 0 }; + struct hwrm_tf_tbl_type_bulk_get_input req = { 0 }; + struct hwrm_tf_tbl_type_bulk_get_output resp = { 0 }; int data_size = 0; uint8_t fw_session_id; struct tf_dev_info *dev; @@ -1698,14 +1905,15 @@ tf_msg_bulk_get_tbl_entry(struct tf *tfp, req.host_addr = tfp_cpu_to_le_64(physical_mem_addr); - MSG_PREP(parms, - dev->ops->tf_dev_get_mailbox(), - HWRM_TF, - HWRM_TFT_TBL_TYPE_BULK_GET, - req, - resp); + parms.tf_type = HWRM_TF_TBL_TYPE_BULK_GET; + parms.req_data = (uint32_t *)&req; + parms.req_size = sizeof(req); + parms.resp_data = (uint32_t *)&resp; + parms.resp_size = sizeof(resp); + parms.mailbox = dev->ops->tf_dev_get_mailbox(); - rc = tfp_send_msg_tunneled(tfp, &parms); + rc = tfp_send_msg_direct(tfp, + &parms); if (rc) return rc; @@ -1713,7 +1921,7 @@ tf_msg_bulk_get_tbl_entry(struct tf *tfp, if (tfp_le_to_cpu_32(resp.size) != data_size) return -EINVAL; - return tfp_le_to_cpu_32(parms.tf_resp_code); + return 0; } int @@ -1772,12 +1980,9 @@ tf_msg_get_if_tbl_entry(struct tf *tfp, if (rc != 0) return rc; - if (parms.tf_resp_code != 0) - return tfp_le_to_cpu_32(parms.tf_resp_code); - tfp_memcpy(params->data, resp.data, req.size); - return tfp_le_to_cpu_32(parms.tf_resp_code); + return 0; } int @@ -1832,5 +2037,5 @@ tf_msg_set_if_tbl_entry(struct tf *tfp, if (rc != 0) return rc; - return tfp_le_to_cpu_32(parms.tf_resp_code); + return 0; } diff --git a/drivers/net/bnxt/tf_core/tf_msg.h b/drivers/net/bnxt/tf_core/tf_msg.h index a14bcd3927..7b4a6a3d92 100644 --- a/drivers/net/bnxt/tf_core/tf_msg.h +++ b/drivers/net/bnxt/tf_core/tf_msg.h @@ -9,6 +9,7 @@ #include #include +#include "tf_em_common.h" #include "tf_tbl.h" #include "tf_rm.h" #include "tf_tcam.h" @@ -275,6 +276,60 @@ tf_msg_hash_insert_em_internal_entry(struct tf *tfp, int tf_msg_delete_em_entry(struct tf *tfp, struct tf_delete_em_entry_parms *em_parms); +/** + * Sends Ext EM mem allocation request to Firmware + * + * [in] tfp + * Pointer to TF handle + * + * [in] tbl + * memory allocation details + * + * [out] dma_addr + * memory address + * + * [out] page_lvl + * page level + * + * [out] page_size + * page size + * + * Returns: + * 0 on Success else internal Truflow error + */ +int tf_msg_ext_em_ctxt_mem_alloc(struct tf *tfp, + struct hcapi_cfa_em_table *tbl, + uint64_t *dma_addr, + uint32_t *page_lvl, + uint32_t *page_size); + +/** + * Sends Ext EM mem allocation request to Firmware + * + * [in] tfp + * Pointer to TF handle + * + * [in] mem_size_k + * memory size in KB + * + * [in] page_dir + * Pointer to the PBL or PDL depending on number of levels + * + * [in] page_level + * PBL indirect levels + * + * [in] page_size + * page size + * + * Returns: + * 0 on Success else internal Truflow error + */ +int tf_msg_ext_em_ctxt_mem_free(struct tf *tfp, + uint32_t mem_size_k, + uint64_t dma_addr, + uint8_t page_level, + uint8_t page_size); + /** * Sends EM mem register request to Firmware * @@ -377,6 +432,38 @@ int tf_msg_em_cfg(struct tf *tfp, uint8_t flush_interval, int dir); +/** + * Sends Ext EM config request to Firmware + * + * [in] tfp + * Pointer to TF handle + * + * [in] fw_se_id + * FW session id + * + * [in] tbl_scope_cb + * Table scope parameters + * + * [in] st_buckets + * static bucket size + * + * [in] flush_interval + * Flush pending HW cached flows every 1/10th of value set in + * seconds, both idle and active flows are flushed from the HW + * cache. If set to 0, this feature will be disabled. + * + * [in] dir + * Receive or Transmit direction + * + * Returns: + * 0 on Success else internal Truflow error + */ +int tf_msg_ext_em_cfg(struct tf *tfp, + struct tf_tbl_scope_cb *tbl_scope_cb, + uint32_t st_buckets, + uint8_t flush_interval, + enum tf_dir dir); + /** * Sends EM operation request to Firmware * diff --git a/drivers/net/bnxt/tf_core/tf_msg_common.h b/drivers/net/bnxt/tf_core/tf_msg_common.h index 0c5c21fd68..49f334717d 100644 --- a/drivers/net/bnxt/tf_core/tf_msg_common.h +++ b/drivers/net/bnxt/tf_core/tf_msg_common.h @@ -15,7 +15,6 @@ parms.mailbox = mb; \ parms.tf_type = type; \ parms.tf_subtype = subtype; \ - parms.tf_resp_code = 0; \ parms.req_size = sizeof(req); \ parms.req_data = (uint32_t *)&(req); \ parms.resp_size = sizeof(resp); \ @@ -26,7 +25,6 @@ parms.mailbox = mb; \ parms.tf_type = type; \ parms.tf_subtype = subtype; \ - parms.tf_resp_code = 0; \ parms.req_size = 0; \ parms.req_data = NULL; \ parms.resp_size = sizeof(resp); \ @@ -37,7 +35,6 @@ parms.mailbox = mb; \ parms.tf_type = type; \ parms.tf_subtype = subtype; \ - parms.tf_resp_code = 0; \ parms.req_size = sizeof(req); \ parms.req_data = (uint32_t *)&(req); \ parms.resp_size = 0; \ diff --git a/drivers/net/bnxt/tf_core/tf_session.c b/drivers/net/bnxt/tf_core/tf_session.c index d2b24f5e20..f591fbe3f5 100644 --- a/drivers/net/bnxt/tf_core/tf_session.c +++ b/drivers/net/bnxt/tf_core/tf_session.c @@ -173,6 +173,9 @@ tf_session_create(struct tf *tfp, ll_insert(&session->client_ll, &client->ll_entry); session->ref_count++; + /* Init session em_ext_db */ + session->em_ext_db_handle = NULL; + rc = tf_dev_bind(tfp, parms->open_cfg->device_type, session->shadow_copy, @@ -796,3 +799,115 @@ tf_session_get_session_id(struct tf *tfp, return 0; } + +int +tf_session_get_em_ext_db(struct tf *tfp, + void **em_ext_db_handle) +{ + struct tf_session *tfs = NULL; + int rc = 0; + + *em_ext_db_handle = NULL; + + if (tfp == NULL) + return (-EINVAL); + + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) + return rc; + + *em_ext_db_handle = tfs->em_ext_db_handle; + return rc; +} + +int +tf_session_set_em_ext_db(struct tf *tfp, + void *em_ext_db_handle) +{ + struct tf_session *tfs = NULL; + int rc = 0; + + if (tfp == NULL) + return (-EINVAL); + + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) + return rc; + + tfs->em_ext_db_handle = em_ext_db_handle; + return rc; +} + +int +tf_session_get_db(struct tf *tfp, + enum tf_module_type type, + void **db_handle) +{ + struct tf_session *tfs = NULL; + int rc = 0; + + *db_handle = NULL; + + if (tfp == NULL) + return (-EINVAL); + + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) + return rc; + + switch (type) { + case TF_MODULE_TYPE_IDENTIFIER: + *db_handle = tfs->id_db_handle; + break; + case TF_MODULE_TYPE_TABLE: + *db_handle = tfs->tbl_db_handle; + break; + case TF_MODULE_TYPE_TCAM: + *db_handle = tfs->tcam_db_handle; + break; + case TF_MODULE_TYPE_EM: + *db_handle = tfs->em_db_handle; + break; + default: + rc = -EINVAL; + break; + } + + return rc; +} + +int +tf_session_set_db(struct tf *tfp, + enum tf_module_type type, + void *db_handle) +{ + struct tf_session *tfs = NULL; + int rc = 0; + + if (tfp == NULL) + return (-EINVAL); + + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) + return rc; + + switch (type) { + case TF_MODULE_TYPE_IDENTIFIER: + tfs->id_db_handle = db_handle; + break; + case TF_MODULE_TYPE_TABLE: + tfs->tbl_db_handle = db_handle; + break; + case TF_MODULE_TYPE_TCAM: + tfs->tcam_db_handle = db_handle; + break; + case TF_MODULE_TYPE_EM: + tfs->em_db_handle = db_handle; + break; + default: + rc = -EINVAL; + break; + } + + return rc; +} diff --git a/drivers/net/bnxt/tf_core/tf_session.h b/drivers/net/bnxt/tf_core/tf_session.h index 1d51fa12f8..e5c7a07daf 100644 --- a/drivers/net/bnxt/tf_core/tf_session.h +++ b/drivers/net/bnxt/tf_core/tf_session.h @@ -112,6 +112,31 @@ struct tf_session { * Linked list of clients registered for this session */ struct ll client_ll; + + /** + * em ext db reference for the session + */ + void *em_ext_db_handle; + + /** + * tcam db reference for the session + */ + void *tcam_db_handle; + + /** + * table db reference for the session + */ + void *tbl_db_handle; + + /** + * identifier db reference for the session + */ + void *id_db_handle; + + /** + * em db reference for the session + */ + void *em_db_handle; }; /** @@ -410,4 +435,69 @@ int tf_session_get_fw_session_id(struct tf *tfp, int tf_session_get_session_id(struct tf *tfp, union tf_session_id *session_id); +/** + * API to get the em_ext_db from tf_session. + * + * [in] tfp + * Pointer to TF handle + * + * [out] em_ext_db_handle, pointer to eem handle + * + * Returns: + * - (0) if successful. + * - (-EINVAL) on failure. + */ +int +tf_session_get_em_ext_db(struct tf *tfp, + void **em_ext_db_handle); + +/** + * API to set the em_ext_db in tf_session. + * + * [in] tfp + * Pointer to TF handle + * + * [in] em_ext_db_handle, pointer to eem handle + * + * Returns: + * - (0) if successful. + * - (-EINVAL) on failure. + */ +int +tf_session_set_em_ext_db(struct tf *tfp, + void *em_ext_db_handle); + +/** + * API to get the db from tf_session. + * + * [in] tfp + * Pointer to TF handle + * + * [out] db_handle, pointer to db handle + * + * Returns: + * - (0) if successful. + * - (-EINVAL) on failure. + */ +int +tf_session_get_db(struct tf *tfp, + enum tf_module_type type, + void **db_handle); + +/** + * API to set the db in tf_session. + * + * [in] tfp + * Pointer to TF handle + * + * [in] db_handle, pointer to db handle + * + * Returns: + * - (0) if successful. + * - (-EINVAL) on failure. + */ +int +tf_session_set_db(struct tf *tfp, + enum tf_module_type type, + void *db_handle); #endif /* _TF_SESSION_H_ */ diff --git a/drivers/net/bnxt/tf_core/tf_tbl.h b/drivers/net/bnxt/tf_core/tf_tbl.h index f0d8e94f7e..9271cf28eb 100644 --- a/drivers/net/bnxt/tf_core/tf_tbl.h +++ b/drivers/net/bnxt/tf_core/tf_tbl.h @@ -15,39 +15,9 @@ struct tf; * The Table module provides processing of Internal TF table types. */ -/** - * Table scope control block content - */ -struct tf_em_caps { - uint32_t flags; - uint32_t supported; - uint32_t max_entries_supported; - uint16_t key_entry_size; - uint16_t record_entry_size; - uint16_t efc_entry_size; -}; - /** Invalid table scope id */ #define TF_TBL_SCOPE_INVALID 0xffffffff -/** - * Table Scope Control Block - * - * Holds private data for a table scope. Only one instance of a table - * scope with Internal EM is supported. - */ -struct tf_tbl_scope_cb { - uint32_t tbl_scope_id; - /** The pf or parent pf of the vf used for table scope creation - */ - uint16_t pf; - int index; - struct hcapi_cfa_em_ctx_mem_info em_ctx_info[TF_DIR_MAX]; - struct tf_em_caps em_caps[TF_DIR_MAX]; - struct stack ext_act_pool[TF_DIR_MAX]; - uint32_t *ext_act_pool_mem[TF_DIR_MAX]; -}; - /** * Table configuration parameters */ diff --git a/drivers/net/bnxt/tf_core/tf_util.c b/drivers/net/bnxt/tf_core/tf_util.c index b4d47d5a8c..25f5c152d2 100644 --- a/drivers/net/bnxt/tf_core/tf_util.c +++ b/drivers/net/bnxt/tf_core/tf_util.c @@ -98,20 +98,8 @@ tf_tbl_type_2_str(enum tf_tbl_type tbl_type) return "Mirror"; case TF_TBL_TYPE_UPAR: return "UPAR"; - case TF_TBL_TYPE_EPOCH0: - return "EPOCH0"; - case TF_TBL_TYPE_EPOCH1: - return "EPOCH1"; case TF_TBL_TYPE_METADATA: return "Metadata"; - case TF_TBL_TYPE_CT_STATE: - return "Connection State"; - case TF_TBL_TYPE_RANGE_PROF: - return "Range Profile"; - case TF_TBL_TYPE_RANGE_ENTRY: - return "Range"; - case TF_TBL_TYPE_LAG: - return "Link Aggregation"; case TF_TBL_TYPE_EM_FKB: return "EM Flexible Key Builder"; case TF_TBL_TYPE_WC_FKB: diff --git a/drivers/net/bnxt/tf_core/tf_util.h b/drivers/net/bnxt/tf_core/tf_util.h index 1aa35b6b82..4caf50349d 100644 --- a/drivers/net/bnxt/tf_core/tf_util.h +++ b/drivers/net/bnxt/tf_core/tf_util.h @@ -9,6 +9,10 @@ #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) +#define TF_BITS2BYTES_64B_WORD_ALIGN(x) ((((x) + 63) >> 6) * 8) + /** * Helper function converting direction to text string * diff --git a/drivers/net/bnxt/tf_core/tfp.c b/drivers/net/bnxt/tf_core/tfp.c index b88affcf1e..37c49b587d 100644 --- a/drivers/net/bnxt/tf_core/tfp.c +++ b/drivers/net/bnxt/tf_core/tfp.c @@ -53,40 +53,6 @@ tfp_send_msg_direct(struct tf *tfp, return rc; } -/** - * Sends preformatted TruFlow msg to the TruFlow Firmware using - * the Truflow tunnel HWRM message type. - * - * Returns success or failure code. - */ -int -tfp_send_msg_tunneled(struct tf *tfp, - struct tfp_send_msg_parms *parms) -{ - int rc = 0; - uint8_t use_kong_mb = 1; - - if (parms == NULL) - return -EINVAL; - - if (parms->mailbox == TF_CHIMP_MB) - use_kong_mb = 0; - - rc = bnxt_hwrm_tf_message_tunneled(container_of(tfp, - struct bnxt, - tfp), - use_kong_mb, - parms->tf_type, - parms->tf_subtype, - &parms->tf_resp_code, - parms->req_data, - parms->req_size, - parms->resp_data, - parms->resp_size); - - return rc; -} - /** * Allocates zero'ed memory from the heap. * diff --git a/drivers/net/bnxt/tf_core/tfp.h b/drivers/net/bnxt/tf_core/tfp.h index 2e4ca7ac44..bcc56b0a54 100644 --- a/drivers/net/bnxt/tf_core/tfp.h +++ b/drivers/net/bnxt/tf_core/tfp.h @@ -56,11 +56,6 @@ struct tfp_send_msg_parms { * [in] tlv_subtype, specifies the tlv_subtype. */ uint16_t tf_subtype; - /** - * [out] tf_resp_code, response code from the internal tlv - * message. Only supported on tunneled messages. - */ - uint32_t tf_resp_code; /** * [out] size, number specifying the request size of the data in bytes */ @@ -111,7 +106,6 @@ struct tfp_calloc_parms { * @page Portability * * @ref tfp_send_direct - * @ref tfp_send_msg_tunneled * * @ref tfp_calloc * @ref tfp_memcpy @@ -139,37 +133,6 @@ struct tfp_calloc_parms { int tfp_send_msg_direct(struct tf *tfp, struct tfp_send_msg_parms *parms); -/** - * Provides communication capability from the TrueFlow API layer to - * the TrueFlow firmware. The portability layer internally provides - * the transport to the firmware. - * - * [in] session, pointer to session handle - * [in] parms, parameter structure - * - * Returns: - * 0 - Success - * -1 - Global error like not supported - * -EINVAL - Parameter Error - */ -int tfp_send_msg_tunneled(struct tf *tfp, - struct tfp_send_msg_parms *parms); - -/** - * Sends OEM command message to Chimp - * - * [in] session, pointer to session handle - * [in] max_flows, max number of flows requested - * - * Returns: - * 0 - Success - * -1 - Global error like not supported - * -EINVAL - Parameter Error - */ -int -tfp_msg_hwrm_oem_cmd(struct tf *tfp, - uint32_t max_flows); - /** * Sends OEM command message to Chimp * @@ -253,21 +216,6 @@ int tfp_get_fid(struct tf *tfp, uint16_t *fw_fid); #define tfp_bswap_32(val) rte_bswap32(val) #define tfp_bswap_64(val) rte_bswap64(val) -/** - * Lookup of the FID in the platform specific structure. - * - * [in] session - * Pointer to session handle - * - * [out] fw_fid - * Pointer to the fw_fid - * - * Returns: - * 0 - Success - * -EINVAL - Parameter error - */ -int tfp_get_fid(struct tf *tfp, uint16_t *fw_fid); - /** * Get the PF associated with the fw communications channel. *