From patchwork Wed Jul 1 06:51:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 72549 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 00EEFA0523; Wed, 1 Jul 2020 08:58:42 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DC2D01D405; Wed, 1 Jul 2020 08:52:56 +0200 (CEST) Received: from rnd-relay.smtp.broadcom.com (rnd-relay.smtp.broadcom.com [192.19.229.170]) by dpdk.org (Postfix) with ESMTP id B78A21C139 for ; Wed, 1 Jul 2020 08:52:26 +0200 (CEST) Received: from mail-irv-17.broadcom.com (mail-irv-17.lvn.broadcom.net [10.75.242.48]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id 0202930C336; Tue, 30 Jun 2020 23:52:26 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com 0202930C336 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1593586346; bh=PW9vVwxdnIDV3G04UJQeuRuKZd7K+0e5MCBsGfUZKQk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YuWMW4qCFgwtaYQjxd5PujnBE2q3WwQDWWzPAWcFFMDwH9tsYn0juK5ela/j3YBx7 yHcAYwtAI0FCkG1tIDo/SvK6qlw0bhQbIulrq7n7tsfr9qYK+hRqSyeN0kipCs2uyD 90gjwScaELTIYWJMe5T+iCqlJR8kBsJq5B0yFPGg= Received: from localhost.localdomain (unknown [10.230.185.215]) by mail-irv-17.broadcom.com (Postfix) with ESMTP id B27E714008B; Tue, 30 Jun 2020 23:52:25 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: Jay Ding , Venkat Duvvuru , Randy Schacher Date: Tue, 30 Jun 2020 23:51:49 -0700 Message-Id: <20200701065212.41391-29-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200701065212.41391-1-ajit.khaparde@broadcom.com> References: <20200612132934.16488-1-somnath.kotur@broadcom.com> <20200701065212.41391-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 28/51] net/bnxt: implement IF tables set and get X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Jay Ding - Implement set/get for PROF_SPIF_CTXT, LKUP_PF_DFLT_ARP, PROF_PF_ERR_ARP with tunneled HWRM messages - Add IF table for PROF_PARIF_DFLT_ARP - Fix page size offset in the HCAPI code - Fix Entry offset calculation Signed-off-by: Jay Ding Signed-off-by: Venkat Duvvuru Reviewed-by: Randy Schacher Reviewed-by: Ajit Khaparde --- drivers/net/bnxt/hcapi/cfa_p40_tbl.h | 53 +++++ drivers/net/bnxt/hcapi/hcapi_cfa_defs.h | 12 +- drivers/net/bnxt/hcapi/hcapi_cfa_p4.c | 8 +- drivers/net/bnxt/hcapi/hcapi_cfa_p4.h | 18 +- drivers/net/bnxt/meson.build | 2 +- drivers/net/bnxt/tf_core/Makefile | 2 + drivers/net/bnxt/tf_core/hwrm_tf.h | 63 +++++- drivers/net/bnxt/tf_core/tf_core.c | 116 +++++++++++ drivers/net/bnxt/tf_core/tf_core.h | 104 ++++++++++ drivers/net/bnxt/tf_core/tf_device.c | 21 ++ drivers/net/bnxt/tf_core/tf_device.h | 39 ++++ drivers/net/bnxt/tf_core/tf_device_p4.c | 5 + drivers/net/bnxt/tf_core/tf_device_p4.h | 10 + drivers/net/bnxt/tf_core/tf_em_common.c | 5 +- drivers/net/bnxt/tf_core/tf_em_host.c | 12 +- drivers/net/bnxt/tf_core/tf_identifier.c | 3 +- drivers/net/bnxt/tf_core/tf_if_tbl.c | 178 +++++++++++++++++ drivers/net/bnxt/tf_core/tf_if_tbl.h | 236 +++++++++++++++++++++++ drivers/net/bnxt/tf_core/tf_msg.c | 186 +++++++++++++++--- drivers/net/bnxt/tf_core/tf_msg.h | 30 +++ drivers/net/bnxt/tf_core/tf_session.c | 14 +- 21 files changed, 1060 insertions(+), 57 deletions(-) create mode 100644 drivers/net/bnxt/tf_core/tf_if_tbl.c create mode 100644 drivers/net/bnxt/tf_core/tf_if_tbl.h diff --git a/drivers/net/bnxt/hcapi/cfa_p40_tbl.h b/drivers/net/bnxt/hcapi/cfa_p40_tbl.h index c30e4f49c..3243b3f2b 100644 --- a/drivers/net/bnxt/hcapi/cfa_p40_tbl.h +++ b/drivers/net/bnxt/hcapi/cfa_p40_tbl.h @@ -127,6 +127,11 @@ const struct hcapi_cfa_field cfa_p40_prof_profile_tcam_remap_mem_layout[] = { CFA_P40_PROF_PROFILE_TCAM_REMAP_MEM_TCAM_PROFILE_ID_NUM_BITS}, {CFA_P40_PROF_PROFILE_TCAM_REMAP_MEM_TCAM_KEY_ID_BITPOS, CFA_P40_PROF_PROFILE_TCAM_REMAP_MEM_TCAM_KEY_ID_NUM_BITS}, + /* Fields below not generated through automation */ + {CFA_P40_PROF_PROFILE_TCAM_REMAP_MEM_BYPASS_OPT_BITPOS, + CFA_P40_PROF_PROFILE_TCAM_REMAP_MEM_BYPASS_OPT_NUM_BITS}, + {CFA_P40_PROF_PROFILE_TCAM_REMAP_MEM_ACT_REC_PTR_BITPOS, + CFA_P40_PROF_PROFILE_TCAM_REMAP_MEM_ACT_REC_PTR_NUM_BITS}, }; const struct hcapi_cfa_field cfa_p40_prof_profile_tcam_layout[] = { @@ -247,4 +252,52 @@ const struct hcapi_cfa_field cfa_p40_eem_key_tbl_layout[] = { CFA_P40_EEM_KEY_TBL_AR_PTR_NUM_BITS}, }; + +const struct hcapi_cfa_field cfa_p40_mirror_tbl_layout[] = { + {CFA_P40_MIRROR_TBL_SP_PTR_BITPOS, + CFA_P40_MIRROR_TBL_SP_PTR_NUM_BITS}, + + {CFA_P40_MIRROR_TBL_IGN_DROP_BITPOS, + CFA_P40_MIRROR_TBL_IGN_DROP_NUM_BITS}, + + {CFA_P40_MIRROR_TBL_COPY_BITPOS, + CFA_P40_MIRROR_TBL_COPY_NUM_BITS}, + + {CFA_P40_MIRROR_TBL_EN_BITPOS, + CFA_P40_MIRROR_TBL_EN_NUM_BITS}, + + {CFA_P40_MIRROR_TBL_AR_PTR_BITPOS, + CFA_P40_MIRROR_TBL_AR_PTR_NUM_BITS}, +}; + +/* P45 Defines */ + +const struct hcapi_cfa_field cfa_p45_prof_l2_ctxt_tcam_layout[] = { + {CFA_P45_PROF_L2_CTXT_TCAM_VALID_BITPOS, + CFA_P45_PROF_L2_CTXT_TCAM_VALID_NUM_BITS}, + {CFA_P45_PROF_L2_CTXT_TCAM_SPARIF_BITPOS, + CFA_P45_PROF_L2_CTXT_TCAM_SPARIF_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_KEY_TYPE_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_KEY_TYPE_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_TUN_HDR_TYPE_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_TUN_HDR_TYPE_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_T_L2_NUMTAGS_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_T_L2_NUMTAGS_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_L2_NUMTAGS_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_L2_NUMTAGS_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_MAC1_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_MAC1_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_T_OVID_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_T_OVID_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_T_IVID_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_T_IVID_NUM_BITS}, + {CFA_P45_PROF_L2_CTXT_TCAM_SVIF_BITPOS, + CFA_P45_PROF_L2_CTXT_TCAM_SVIF_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_MAC0_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_MAC0_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_OVID_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_OVID_NUM_BITS}, + {CFA_P40_PROF_L2_CTXT_TCAM_IVID_BITPOS, + CFA_P40_PROF_L2_CTXT_TCAM_IVID_NUM_BITS}, +}; #endif /* _CFA_P40_TBL_H_ */ diff --git a/drivers/net/bnxt/hcapi/hcapi_cfa_defs.h b/drivers/net/bnxt/hcapi/hcapi_cfa_defs.h index ea8d99d01..53a284887 100644 --- a/drivers/net/bnxt/hcapi/hcapi_cfa_defs.h +++ b/drivers/net/bnxt/hcapi/hcapi_cfa_defs.h @@ -35,10 +35,6 @@ #define CFA_GLOBAL_CFG_DATA_SZ (100) -#if SUPPORT_CFA_HW_P4 && SUPPORT_CFA_HW_P58 && SUPPORT_CFA_HW_P59 -#define SUPPORT_CFA_HW_ALL (1) -#endif - #include "hcapi_cfa_p4.h" #define CFA_PROF_L2CTXT_TCAM_MAX_FIELD_CNT CFA_P40_PROF_L2_CTXT_TCAM_MAX_FLD #define CFA_PROF_L2CTXT_REMAP_MAX_FIELD_CNT CFA_P40_PROF_L2_CTXT_RMP_DR_MAX_FLD @@ -121,6 +117,8 @@ struct hcapi_cfa_layout { const struct hcapi_cfa_field *field_array; /** [out] number of HW field entries in the HW layout field array */ uint32_t array_sz; + /** [out] layout_id - layout id associated with the layout */ + uint16_t layout_id; }; /** @@ -247,6 +245,8 @@ struct hcapi_cfa_key_tbl { * applicable for newer chip */ uint8_t *base1; + /** [in] Page size for EEM tables */ + uint32_t page_size; }; /** @@ -267,7 +267,7 @@ struct hcapi_cfa_key_obj { struct hcapi_cfa_key_data { /** [in] For on-chip key table, it is the offset in unit of smallest * key. For off-chip key table, it is the byte offset relative - * to the key record memory base. + * to the key record memory base and adjusted for page and entry size. */ uint32_t offset; /** [in] HW key data buffer pointer */ @@ -668,5 +668,5 @@ int hcapi_cfa_key_hw_op(struct hcapi_cfa_hwop *op, struct hcapi_cfa_key_loc *key_loc); uint64_t hcapi_get_table_page(struct hcapi_cfa_em_table *mem, - uint32_t offset); + uint32_t page); #endif /* HCAPI_CFA_DEFS_H_ */ diff --git a/drivers/net/bnxt/hcapi/hcapi_cfa_p4.c b/drivers/net/bnxt/hcapi/hcapi_cfa_p4.c index 42b37da0f..a01bbdbbb 100644 --- a/drivers/net/bnxt/hcapi/hcapi_cfa_p4.c +++ b/drivers/net/bnxt/hcapi/hcapi_cfa_p4.c @@ -13,7 +13,6 @@ #include "hcapi_cfa_defs.h" #define HCAPI_CFA_LKUP_SEED_MEM_SIZE 512 -#define TF_EM_PAGE_SIZE (1 << 21) uint32_t hcapi_cfa_lkup_lkup3_init_cfg; uint32_t hcapi_cfa_lkup_em_seed_mem[HCAPI_CFA_LKUP_SEED_MEM_SIZE]; bool hcapi_cfa_lkup_init; @@ -199,10 +198,9 @@ static uint32_t hcapi_cfa_lookup3_hash(uint8_t *in_key) uint64_t hcapi_get_table_page(struct hcapi_cfa_em_table *mem, - uint32_t offset) + uint32_t page) { int level = 0; - int page = offset / TF_EM_PAGE_SIZE; uint64_t addr; if (mem == NULL) @@ -362,7 +360,9 @@ int hcapi_cfa_key_hw_op(struct hcapi_cfa_hwop *op, op->hw.base_addr = hcapi_get_table_page((struct hcapi_cfa_em_table *) key_tbl->base0, - key_obj->offset); + key_obj->offset / key_tbl->page_size); + /* Offset is adjusted to be the offset into the page */ + key_obj->offset = key_obj->offset % key_tbl->page_size; if (op->hw.base_addr == 0) return -1; diff --git a/drivers/net/bnxt/hcapi/hcapi_cfa_p4.h b/drivers/net/bnxt/hcapi/hcapi_cfa_p4.h index 0661d6363..c6113707f 100644 --- a/drivers/net/bnxt/hcapi/hcapi_cfa_p4.h +++ b/drivers/net/bnxt/hcapi/hcapi_cfa_p4.h @@ -21,6 +21,10 @@ enum cfa_p4_tbl_id { CFA_P4_TBL_WC_TCAM_REMAP, CFA_P4_TBL_VEB_TCAM, CFA_P4_TBL_SP_TCAM, + CFA_P4_TBL_PROF_SPIF_DFLT_L2CTXT, + CFA_P4_TBL_PROF_PARIF_DFLT_ACT_REC_PTR, + CFA_P4_TBL_PROF_PARIF_ERR_ACT_REC_PTR, + CFA_P4_TBL_LKUP_PARIF_DFLT_ACT_REC_PTR, CFA_P4_TBL_MAX }; @@ -333,17 +337,29 @@ enum cfa_p4_action_sram_entry_type { */ /** SRAM Action Record */ - CFA_P4_ACTION_SRAM_ENTRY_TYPE_ACT, + CFA_P4_ACTION_SRAM_ENTRY_TYPE_FULL_ACTION, + + CFA_P4_ACTION_SRAM_ENTRY_TYPE_FORMAT_0_ACTION, + CFA_P4_ACTION_SRAM_ENTRY_TYPE_FORMAT_1_ACTION, + CFA_P4_ACTION_SRAM_ENTRY_TYPE_FORMAT_2_ACTION, + CFA_P4_ACTION_SRAM_ENTRY_TYPE_FORMAT_3_ACTION, + CFA_P4_ACTION_SRAM_ENTRY_TYPE_FORMAT_4_ACTION, + /** SRAM Action Encap 8 Bytes */ CFA_P4_ACTION_SRAM_ENTRY_TYPE_ENCAP_8B, /** SRAM Action Encap 16 Bytes */ CFA_P4_ACTION_SRAM_ENTRY_TYPE_ENCAP_16B, /** SRAM Action Encap 64 Bytes */ CFA_P4_ACTION_SRAM_ENTRY_TYPE_ENCAP_64B, + + CFA_P4_ACTION_SRAM_ENTRY_TYPE_MODIFY_PORT_SRC, + CFA_P4_ACTION_SRAM_ENTRY_TYPE_MODIFY_PORT_DEST, + /** SRAM Action Modify IPv4 Source */ CFA_P4_ACTION_SRAM_ENTRY_TYPE_MODIFY_IPV4_SRC, /** SRAM Action Modify IPv4 Destination */ CFA_P4_ACTION_SRAM_ENTRY_TYPE_MODIFY_IPV4_DEST, + /** SRAM Action Source Properties SMAC */ CFA_P4_ACTION_SRAM_ENTRY_TYPE_SP_SMAC, /** SRAM Action Source Properties SMAC IPv4 */ diff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build index 7f3ec6204..f25a9448d 100644 --- a/drivers/net/bnxt/meson.build +++ b/drivers/net/bnxt/meson.build @@ -43,7 +43,7 @@ sources = files('bnxt_cpr.c', 'tf_core/tf_shadow_tcam.c', 'tf_core/tf_tcam.c', 'tf_core/tf_util.c', - 'tf_core/tf_rm.c', + 'tf_core/tf_if_tbl.c', 'hcapi/hcapi_cfa_p4.c', diff --git a/drivers/net/bnxt/tf_core/Makefile b/drivers/net/bnxt/tf_core/Makefile index 9ba60e1c2..1924bef02 100644 --- a/drivers/net/bnxt/tf_core/Makefile +++ b/drivers/net/bnxt/tf_core/Makefile @@ -25,6 +25,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_shadow_tbl.c SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_shadow_tcam.c SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_tcam.c SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_util.c +SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_if_tbl.c SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_core.h SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_project.h @@ -33,3 +34,4 @@ SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_identifier.h SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_tbl.h SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/stack.h SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_tcam.h +SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_if_tbl.h diff --git a/drivers/net/bnxt/tf_core/hwrm_tf.h b/drivers/net/bnxt/tf_core/hwrm_tf.h index 26836e488..32f152314 100644 --- a/drivers/net/bnxt/tf_core/hwrm_tf.h +++ b/drivers/net/bnxt/tf_core/hwrm_tf.h @@ -16,7 +16,9 @@ typedef enum tf_subtype { HWRM_TFT_REG_GET = 821, HWRM_TFT_REG_SET = 822, HWRM_TFT_TBL_TYPE_BULK_GET = 825, - TF_SUBTYPE_LAST = HWRM_TFT_TBL_TYPE_BULK_GET, + 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 */ @@ -46,7 +48,17 @@ typedef enum tf_subtype { /* 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 +#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 @@ -56,6 +68,9 @@ typedef enum tf_subtype { 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 table type get */ typedef struct tf_tbl_type_bulk_get_input { @@ -85,4 +100,48 @@ typedef struct tf_tbl_type_bulk_get_output { 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/tf_core.c b/drivers/net/bnxt/tf_core/tf_core.c index 45accb0ab..a980a2056 100644 --- a/drivers/net/bnxt/tf_core/tf_core.c +++ b/drivers/net/bnxt/tf_core/tf_core.c @@ -1039,3 +1039,119 @@ tf_free_tbl_scope(struct tf *tfp, return rc; } + +int +tf_set_if_tbl_entry(struct tf *tfp, + struct tf_set_if_tbl_entry_parms *parms) +{ + int rc; + struct tf_session *tfs; + struct tf_dev_info *dev; + struct tf_if_tbl_set_parms sparms = { 0 }; + + TF_CHECK_PARMS2(tfp, parms); + + /* Retrieve the session information */ + rc = tf_session_get_session(tfp, &tfs); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to lookup session, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + /* Retrieve the device information */ + rc = tf_session_get_device(tfs, &dev); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to lookup device, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + if (dev->ops->tf_dev_set_if_tbl == NULL) { + rc = -EOPNOTSUPP; + TFP_DRV_LOG(ERR, + "%s: Operation not supported, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + sparms.dir = parms->dir; + sparms.type = parms->type; + sparms.idx = parms->idx; + sparms.data_sz_in_bytes = parms->data_sz_in_bytes; + sparms.data = parms->data; + + rc = dev->ops->tf_dev_set_if_tbl(tfp, &sparms); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: If_tbl set failed, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + return 0; +} + +int +tf_get_if_tbl_entry(struct tf *tfp, + struct tf_get_if_tbl_entry_parms *parms) +{ + int rc; + struct tf_session *tfs; + struct tf_dev_info *dev; + struct tf_if_tbl_get_parms gparms = { 0 }; + + TF_CHECK_PARMS2(tfp, parms); + + /* Retrieve the session information */ + rc = tf_session_get_session(tfp, &tfs); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to lookup session, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + /* Retrieve the device information */ + rc = tf_session_get_device(tfs, &dev); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to lookup device, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + if (dev->ops->tf_dev_get_if_tbl == NULL) { + rc = -EOPNOTSUPP; + TFP_DRV_LOG(ERR, + "%s: Operation not supported, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + gparms.dir = parms->dir; + gparms.type = parms->type; + gparms.idx = parms->idx; + gparms.data_sz_in_bytes = parms->data_sz_in_bytes; + gparms.data = parms->data; + + rc = dev->ops->tf_dev_get_if_tbl(tfp, &gparms); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: If_tbl get failed, rc:%s\n", + tf_dir_2_str(parms->dir), + strerror(-rc)); + return rc; + } + + return 0; +} diff --git a/drivers/net/bnxt/tf_core/tf_core.h b/drivers/net/bnxt/tf_core/tf_core.h index e898f19a0..e3d46bd45 100644 --- a/drivers/net/bnxt/tf_core/tf_core.h +++ b/drivers/net/bnxt/tf_core/tf_core.h @@ -1556,4 +1556,108 @@ int tf_delete_em_entry(struct tf *tfp, int tf_search_em_entry(struct tf *tfp, struct tf_search_em_entry_parms *parms); +/** + * @page if_tbl Interface Table Access + * + * @ref tf_set_if_tbl_entry + * + * @ref tf_get_if_tbl_entry + * + * @ref tf_restore_if_tbl_entry + */ +/** + * Enumeration of TruFlow interface table types. + */ +enum tf_if_tbl_type { + /** Default Profile L2 Context Entry */ + TF_IF_TBL_TYPE_PROF_SPIF_DFLT_L2_CTXT, + /** Default Profile TCAM/Lookup Action Record Pointer Table */ + TF_IF_TBL_TYPE_PROF_PARIF_DFLT_ACT_REC_PTR, + /** Error Profile TCAM Miss Action Record Pointer Table */ + 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 */ + TF_IF_TBL_TYPE_ILT, + /** SR2 VNIC/SVIF Table */ + TF_IF_TBL_TYPE_VNIC_SVIF, + TF_IF_TBL_TYPE_MAX +}; + +/** + * tf_set_if_tbl_entry parameter definition + */ +struct tf_set_if_tbl_entry_parms { + /** + * [in] Receive or transmit direction + */ + enum tf_dir dir; + /** + * [in] Type of object to set + */ + enum tf_if_tbl_type type; + /** + * [in] Entry data + */ + uint32_t *data; + /** + * [in] Entry size + */ + uint16_t data_sz_in_bytes; + /** + * [in] Interface to write + */ + uint32_t idx; +}; + +/** + * set interface table entry + * + * Used to set an interface table. This API is used for managing tables indexed + * by SVIF/SPIF/PARIF interfaces. In current implementation only the value is + * set. + * Returns success or failure code. + */ +int tf_set_if_tbl_entry(struct tf *tfp, + struct tf_set_if_tbl_entry_parms *parms); + +/** + * tf_get_if_tbl_entry parameter definition + */ +struct tf_get_if_tbl_entry_parms { + /** + * [in] Receive or transmit direction + */ + enum tf_dir dir; + /** + * [in] Type of table to get + */ + enum tf_if_tbl_type type; + /** + * [out] Entry data + */ + uint32_t *data; + /** + * [in] Entry size + */ + uint16_t data_sz_in_bytes; + /** + * [in] Entry index to read + */ + uint32_t idx; +}; + +/** + * get interface table entry + * + * Used to retrieve an interface table entry. + * + * Reads the interface table entry value + * + * Returns success or failure code. Failure will be returned if the + * provided data buffer is too small for the data type requested. + */ +int tf_get_if_tbl_entry(struct tf *tfp, + struct tf_get_if_tbl_entry_parms *parms); + #endif /* _TF_CORE_H_ */ diff --git a/drivers/net/bnxt/tf_core/tf_device.c b/drivers/net/bnxt/tf_core/tf_device.c index 20b0c5948..a3073c826 100644 --- a/drivers/net/bnxt/tf_core/tf_device.c +++ b/drivers/net/bnxt/tf_core/tf_device.c @@ -44,6 +44,7 @@ tf_dev_bind_p4(struct tf *tfp, struct tf_tbl_cfg_parms tbl_cfg; struct tf_tcam_cfg_parms tcam_cfg; struct tf_em_cfg_parms em_cfg; + struct tf_if_tbl_cfg_parms if_tbl_cfg; dev_handle->type = TF_DEVICE_TYPE_WH; /* Initial function initialization */ @@ -114,6 +115,19 @@ tf_dev_bind_p4(struct tf *tfp, goto fail; } + /* + * IF_TBL + */ + if_tbl_cfg.num_elements = TF_IF_TBL_TYPE_MAX; + if_tbl_cfg.cfg = tf_if_tbl_p4; + if_tbl_cfg.shadow_copy = shadow_copy; + rc = tf_if_tbl_bind(tfp, &if_tbl_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "IF Table initialization failure\n"); + goto fail; + } + /* Final function initialization */ dev_handle->ops = &tf_dev_ops_p4; @@ -186,6 +200,13 @@ tf_dev_unbind_p4(struct tf *tfp) fail = true; } + rc = tf_if_tbl_unbind(tfp); + if (rc) { + TFP_DRV_LOG(ERR, + "Device unbind failed, IF Table Type\n"); + fail = true; + } + if (fail) return -1; diff --git a/drivers/net/bnxt/tf_core/tf_device.h b/drivers/net/bnxt/tf_core/tf_device.h index 58b7a4ab2..5a0943ad7 100644 --- a/drivers/net/bnxt/tf_core/tf_device.h +++ b/drivers/net/bnxt/tf_core/tf_device.h @@ -10,6 +10,7 @@ #include "tf_identifier.h" #include "tf_tbl.h" #include "tf_tcam.h" +#include "tf_if_tbl.h" struct tf; struct tf_session; @@ -567,6 +568,44 @@ struct tf_dev_ops { */ int (*tf_dev_free_tbl_scope)(struct tf *tfp, struct tf_free_tbl_scope_parms *parms); + + /** + * Sets the specified interface table type element. + * + * This API sets the specified element data by invoking the + * firmware. + * + * [in] tfp + * Pointer to TF handle + * + * [in] parms + * Pointer to interface table set parameters + * + * Returns + * - (0) if successful. + * - (-EINVAL) on failure. + */ + int (*tf_dev_set_if_tbl)(struct tf *tfp, + struct tf_if_tbl_set_parms *parms); + + /** + * Retrieves the specified interface table type element. + * + * This API retrieves the specified element data by invoking the + * firmware. + * + * [in] tfp + * Pointer to TF handle + * + * [in] parms + * Pointer to table get parameters + * + * Returns + * - (0) if successful. + * - (-EINVAL) on failure. + */ + int (*tf_dev_get_if_tbl)(struct tf *tfp, + struct tf_if_tbl_get_parms *parms); }; /** diff --git a/drivers/net/bnxt/tf_core/tf_device_p4.c b/drivers/net/bnxt/tf_core/tf_device_p4.c index 9a3230787..2dc34b853 100644 --- a/drivers/net/bnxt/tf_core/tf_device_p4.c +++ b/drivers/net/bnxt/tf_core/tf_device_p4.c @@ -11,6 +11,7 @@ #include "tf_tbl.h" #include "tf_tcam.h" #include "tf_em.h" +#include "tf_if_tbl.h" /** * Device specific function that retrieves the MAX number of HCAPI @@ -105,6 +106,8 @@ const struct tf_dev_ops tf_dev_ops_p4_init = { .tf_dev_delete_ext_em_entry = NULL, .tf_dev_alloc_tbl_scope = NULL, .tf_dev_free_tbl_scope = NULL, + .tf_dev_set_if_tbl = NULL, + .tf_dev_get_if_tbl = NULL, }; /** @@ -135,4 +138,6 @@ const struct tf_dev_ops tf_dev_ops_p4 = { .tf_dev_delete_ext_em_entry = tf_em_delete_ext_entry, .tf_dev_alloc_tbl_scope = tf_em_ext_common_alloc, .tf_dev_free_tbl_scope = tf_em_ext_common_free, + .tf_dev_set_if_tbl = tf_if_tbl_set, + .tf_dev_get_if_tbl = tf_if_tbl_get, }; diff --git a/drivers/net/bnxt/tf_core/tf_device_p4.h b/drivers/net/bnxt/tf_core/tf_device_p4.h index 298e100f3..3b03a7c4e 100644 --- a/drivers/net/bnxt/tf_core/tf_device_p4.h +++ b/drivers/net/bnxt/tf_core/tf_device_p4.h @@ -10,6 +10,7 @@ #include "tf_core.h" #include "tf_rm.h" +#include "tf_if_tbl.h" struct tf_rm_element_cfg tf_ident_p4[TF_IDENT_TYPE_MAX] = { { TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_REMAP }, @@ -86,4 +87,13 @@ struct tf_rm_element_cfg tf_em_int_p4[TF_EM_TBL_TYPE_MAX] = { { TF_RM_ELEM_CFG_NULL, CFA_RESOURCE_TYPE_INVALID }, }; +struct tf_if_tbl_cfg tf_if_tbl_p4[TF_IF_TBL_TYPE_MAX] = { + { TF_IF_TBL_CFG, CFA_P4_TBL_PROF_SPIF_DFLT_L2CTXT }, + { TF_IF_TBL_CFG, CFA_P4_TBL_PROF_PARIF_DFLT_ACT_REC_PTR }, + { TF_IF_TBL_CFG, CFA_P4_TBL_PROF_PARIF_ERR_ACT_REC_PTR }, + { TF_IF_TBL_CFG, CFA_P4_TBL_LKUP_PARIF_DFLT_ACT_REC_PTR }, + { TF_IF_TBL_CFG_NULL, CFA_IF_TBL_TYPE_INVALID }, + { TF_IF_TBL_CFG_NULL, CFA_IF_TBL_TYPE_INVALID } +}; + #endif /* _TF_DEVICE_P4_H_ */ diff --git a/drivers/net/bnxt/tf_core/tf_em_common.c b/drivers/net/bnxt/tf_core/tf_em_common.c index 39a8412b3..23a7fc9c2 100644 --- a/drivers/net/bnxt/tf_core/tf_em_common.c +++ b/drivers/net/bnxt/tf_core/tf_em_common.c @@ -337,11 +337,10 @@ tf_em_ext_common_bind(struct tf *tfp, db_exists = 1; } - if (db_exists) { - mem_type = parms->mem_type; + if (db_exists) init = 1; - } + mem_type = parms->mem_type; return 0; } diff --git a/drivers/net/bnxt/tf_core/tf_em_host.c b/drivers/net/bnxt/tf_core/tf_em_host.c index d7c147a15..2626a59fe 100644 --- a/drivers/net/bnxt/tf_core/tf_em_host.c +++ b/drivers/net/bnxt/tf_core/tf_em_host.c @@ -831,7 +831,8 @@ tf_insert_eem_entry(struct tf_tbl_scope_cb *tbl_scope_cb, op.opcode = HCAPI_CFA_HWOPS_ADD; key_tbl.base0 = (uint8_t *) &tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_KEY0_TABLE]; - key_obj.offset = (index * TF_EM_KEY_RECORD_SIZE) % TF_EM_PAGE_SIZE; + key_tbl.page_size = TF_EM_PAGE_SIZE; + key_obj.offset = index * TF_EM_KEY_RECORD_SIZE; key_obj.data = (uint8_t *)&key_entry; key_obj.size = TF_EM_KEY_RECORD_SIZE; @@ -847,8 +848,7 @@ tf_insert_eem_entry(struct tf_tbl_scope_cb *tbl_scope_cb, key_tbl.base0 = (uint8_t *) &tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_KEY1_TABLE]; - key_obj.offset = - (index * TF_EM_KEY_RECORD_SIZE) % TF_EM_PAGE_SIZE; + key_obj.offset = index * TF_EM_KEY_RECORD_SIZE; rc = hcapi_cfa_key_hw_op(&op, &key_tbl, @@ -914,7 +914,8 @@ tf_delete_eem_entry(struct tf_tbl_scope_cb *tbl_scope_cb, &tbl_scope_cb->em_ctx_info[parms->dir].em_tables[(hash_type == 0 ? TF_KEY0_TABLE : TF_KEY1_TABLE)]; - key_obj.offset = (index * TF_EM_KEY_RECORD_SIZE) % TF_EM_PAGE_SIZE; + key_tbl.page_size = TF_EM_PAGE_SIZE; + key_obj.offset = index * TF_EM_KEY_RECORD_SIZE; key_obj.data = NULL; key_obj.size = TF_EM_KEY_RECORD_SIZE; @@ -1195,7 +1196,8 @@ int tf_tbl_ext_host_set(struct tf *tfp, op.opcode = HCAPI_CFA_HWOPS_PUT; key_tbl.base0 = (uint8_t *)&tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_RECORD_TABLE]; - key_obj.offset = parms->idx % TF_EM_PAGE_SIZE; + key_tbl.page_size = TF_EM_PAGE_SIZE; + key_obj.offset = parms->idx; key_obj.data = parms->data; key_obj.size = parms->data_sz_in_bytes; diff --git a/drivers/net/bnxt/tf_core/tf_identifier.c b/drivers/net/bnxt/tf_core/tf_identifier.c index 2cc43b40f..90aeaa468 100644 --- a/drivers/net/bnxt/tf_core/tf_identifier.c +++ b/drivers/net/bnxt/tf_core/tf_identifier.c @@ -68,7 +68,7 @@ tf_ident_bind(struct tf *tfp, int tf_ident_unbind(struct tf *tfp) { - int rc; + int rc = 0; int i; struct tf_rm_free_db_parms fparms = { 0 }; @@ -89,7 +89,6 @@ tf_ident_unbind(struct tf *tfp) TFP_DRV_LOG(ERR, "rm free failed on unbind\n"); } - ident_db[i] = NULL; } diff --git a/drivers/net/bnxt/tf_core/tf_if_tbl.c b/drivers/net/bnxt/tf_core/tf_if_tbl.c new file mode 100644 index 000000000..dc73ba2d0 --- /dev/null +++ b/drivers/net/bnxt/tf_core/tf_if_tbl.c @@ -0,0 +1,178 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2019-2020 Broadcom + * All rights reserved. + */ + +#include + +#include "tf_if_tbl.h" +#include "tf_common.h" +#include "tf_rm.h" +#include "tf_util.h" +#include "tf_msg.h" +#include "tfp.h" + +struct tf; + +/** + * IF Table DBs. + */ +static void *if_tbl_db[TF_DIR_MAX]; + +/** + * IF Table Shadow DBs + */ +/* static void *shadow_if_tbl_db[TF_DIR_MAX]; */ + +/** + * Init flag, set on bind and cleared on unbind + */ +static uint8_t init; + +/** + * Shadow init flag, set on bind and cleared on unbind + */ +/* static uint8_t shadow_init; */ + +/** + * Convert if_tbl_type to hwrm type. + * + * [in] if_tbl_type + * Interface table type + * + * [out] hwrm_type + * HWRM device data type + * + * Returns: + * 0 - Success + * -EOPNOTSUPP - Type not supported + */ +static int +tf_if_tbl_get_hcapi_type(struct tf_if_tbl_get_hcapi_parms *parms) +{ + struct tf_if_tbl_cfg *tbl_cfg; + enum tf_if_tbl_cfg_type cfg_type; + + tbl_cfg = (struct tf_if_tbl_cfg *)parms->tbl_db; + cfg_type = tbl_cfg[parms->db_index].cfg_type; + + if (cfg_type != TF_IF_TBL_CFG) + return -ENOTSUP; + + *parms->hcapi_type = tbl_cfg[parms->db_index].hcapi_type; + + return 0; +} + +int +tf_if_tbl_bind(struct tf *tfp __rte_unused, + struct tf_if_tbl_cfg_parms *parms) +{ + TF_CHECK_PARMS2(tfp, parms); + + if (init) { + TFP_DRV_LOG(ERR, + "IF TBL DB already initialized\n"); + return -EINVAL; + } + + if_tbl_db[TF_DIR_RX] = parms->cfg; + if_tbl_db[TF_DIR_TX] = parms->cfg; + + init = 1; + + TFP_DRV_LOG(INFO, + "Table Type - initialized\n"); + + return 0; +} + +int +tf_if_tbl_unbind(struct tf *tfp __rte_unused) +{ + /* Bail if nothing has been initialized */ + if (!init) { + TFP_DRV_LOG(INFO, + "No Table DBs created\n"); + return 0; + } + + if_tbl_db[TF_DIR_RX] = NULL; + if_tbl_db[TF_DIR_TX] = NULL; + init = 0; + + return 0; +} + +int +tf_if_tbl_set(struct tf *tfp, + struct tf_if_tbl_set_parms *parms) +{ + int rc; + struct tf_if_tbl_get_hcapi_parms hparms; + + TF_CHECK_PARMS3(tfp, parms, parms->data); + + if (!init) { + TFP_DRV_LOG(ERR, + "%s: No Table DBs created\n", + tf_dir_2_str(parms->dir)); + return -EINVAL; + } + + /* Convert TF type to HCAPI type */ + hparms.tbl_db = if_tbl_db[parms->dir]; + hparms.db_index = parms->type; + hparms.hcapi_type = &parms->hcapi_type; + rc = tf_if_tbl_get_hcapi_type(&hparms); + if (rc) + return rc; + + rc = tf_msg_set_if_tbl_entry(tfp, parms); + if (rc) { + TFP_DRV_LOG(ERR, + "%s, If Tbl set failed, type:%d, rc:%s\n", + tf_dir_2_str(parms->dir), + parms->type, + strerror(-rc)); + } + + return 0; +} + +int +tf_if_tbl_get(struct tf *tfp, + struct tf_if_tbl_get_parms *parms) +{ + int rc; + struct tf_if_tbl_get_hcapi_parms hparms; + + TF_CHECK_PARMS3(tfp, parms, parms->data); + + if (!init) { + TFP_DRV_LOG(ERR, + "%s: No Table DBs created\n", + tf_dir_2_str(parms->dir)); + return -EINVAL; + } + + /* Convert TF type to HCAPI type */ + hparms.tbl_db = if_tbl_db[parms->dir]; + hparms.db_index = parms->type; + hparms.hcapi_type = &parms->hcapi_type; + rc = tf_if_tbl_get_hcapi_type(&hparms); + if (rc) + return rc; + + /* Get the entry */ + rc = tf_msg_get_if_tbl_entry(tfp, parms); + if (rc) { + TFP_DRV_LOG(ERR, + "%s, If Tbl get failed, type:%d, rc:%s\n", + tf_dir_2_str(parms->dir), + parms->type, + strerror(-rc)); + } + + return 0; +} diff --git a/drivers/net/bnxt/tf_core/tf_if_tbl.h b/drivers/net/bnxt/tf_core/tf_if_tbl.h new file mode 100644 index 000000000..54d4c37f5 --- /dev/null +++ b/drivers/net/bnxt/tf_core/tf_if_tbl.h @@ -0,0 +1,236 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2019-2020 Broadcom + * All rights reserved. + */ + +#ifndef TF_IF_TBL_TYPE_H_ +#define TF_IF_TBL_TYPE_H_ + +#include "tf_core.h" +#include "stack.h" + +/* + * This is the constant used to define invalid CFA + * types across all devices. + */ +#define CFA_IF_TBL_TYPE_INVALID 65535 + +struct tf; + +/** + * The IF Table module provides processing of Internal TF interface table types. + */ + +/** + * IF table configuration enumeration. + */ +enum tf_if_tbl_cfg_type { + /** + * No configuration + */ + TF_IF_TBL_CFG_NULL, + /** + * HCAPI 'controlled' + */ + TF_IF_TBL_CFG, +}; + +/** + * IF table configuration structure, used by the Device to configure + * how an individual TF type is configured in regard to the HCAPI type. + */ +struct tf_if_tbl_cfg { + /** + * IF table config controls how the DB for that element is + * processed. + */ + enum tf_if_tbl_cfg_type cfg_type; + + /** + * HCAPI Type for the element. Used for TF to HCAPI type + * conversion. + */ + uint16_t hcapi_type; +}; + +/** + * Get HCAPI type parameters for a single element + */ +struct tf_if_tbl_get_hcapi_parms { + /** + * [in] IF Tbl DB Handle + */ + void *tbl_db; + /** + * [in] DB Index, indicates which DB entry to perform the + * action on. + */ + uint16_t db_index; + /** + * [out] Pointer to the hcapi type for the specified db_index + */ + uint16_t *hcapi_type; +}; + +/** + * Table configuration parameters + */ +struct tf_if_tbl_cfg_parms { + /** + * Number of table types in each of the configuration arrays + */ + uint16_t num_elements; + /** + * Table Type element configuration array + */ + struct tf_if_tbl_cfg *cfg; + /** + * Shadow table type configuration array + */ + struct tf_shadow_if_tbl_cfg *shadow_cfg; + /** + * Boolean controlling the request shadow copy. + */ + bool shadow_copy; +}; + +/** + * IF Table set parameters + */ +struct tf_if_tbl_set_parms { + /** + * [in] Receive or transmit direction + */ + enum tf_dir dir; + /** + * [in] Type of object to set + */ + enum tf_if_tbl_type type; + /** + * [in] Type of HCAPI + */ + uint16_t hcapi_type; + /** + * [in] Entry data + */ + uint32_t *data; + /** + * [in] Entry size + */ + uint16_t data_sz_in_bytes; + /** + * [in] Entry index to write to + */ + uint32_t idx; +}; + +/** + * IF Table get parameters + */ +struct tf_if_tbl_get_parms { + /** + * [in] Receive or transmit direction + */ + enum tf_dir dir; + /** + * [in] Type of object to get + */ + enum tf_if_tbl_type type; + /** + * [in] Type of HCAPI + */ + uint16_t hcapi_type; + /** + * [out] Entry data + */ + uint32_t *data; + /** + * [out] Entry size + */ + uint16_t data_sz_in_bytes; + /** + * [in] Entry index to read + */ + uint32_t idx; +}; + +/** + * @page if tbl Table + * + * @ref tf_if_tbl_bind + * + * @ref tf_if_tbl_unbind + * + * @ref tf_tbl_set + * + * @ref tf_tbl_get + * + * @ref tf_tbl_restore + */ +/** + * Initializes the Table module with the requested DBs. Must be + * invoked as the first thing before any of the access functions. + * + * [in] tfp + * Pointer to TF handle, used for HCAPI communication + * + * [in] parms + * Pointer to Table configuration parameters + * + * Returns + * - (0) if successful. + * - (-EINVAL) on failure. + */ +int tf_if_tbl_bind(struct tf *tfp, + struct tf_if_tbl_cfg_parms *parms); + +/** + * Cleans up the private DBs and releases all the data. + * + * [in] tfp + * Pointer to TF handle, used for HCAPI communication + * + * [in] parms + * Pointer to parameters + * + * Returns + * - (0) if successful. + * - (-EINVAL) on failure. + */ +int tf_if_tbl_unbind(struct tf *tfp); + +/** + * Configures the requested element by sending a firmware request which + * then installs it into the device internal structures. + * + * [in] tfp + * Pointer to TF handle, used for HCAPI communication + * + * [in] parms + * Pointer to Interface Table set parameters + * + * Returns + * - (0) if successful. + * - (-EINVAL) on failure. + */ +int tf_if_tbl_set(struct tf *tfp, + struct tf_if_tbl_set_parms *parms); + +/** + * Retrieves the requested element by sending a firmware request to get + * the element. + * + * [in] tfp + * Pointer to TF handle, used for HCAPI communication + * + * [in] parms + * Pointer to Table get parameters + * + * Returns + * - (0) if successful. + * - (-EINVAL) on failure. + */ +int tf_if_tbl_get(struct tf *tfp, + struct tf_if_tbl_get_parms *parms); + +#endif /* TF_IF_TBL_TYPE_H */ diff --git a/drivers/net/bnxt/tf_core/tf_msg.c b/drivers/net/bnxt/tf_core/tf_msg.c index 659065de3..6600a14c8 100644 --- a/drivers/net/bnxt/tf_core/tf_msg.c +++ b/drivers/net/bnxt/tf_core/tf_msg.c @@ -125,12 +125,19 @@ tf_msg_session_close(struct tf *tfp) int rc; struct hwrm_tf_session_close_input req = { 0 }; struct hwrm_tf_session_close_output resp = { 0 }; - struct tf_session *tfs = (struct tf_session *)(tfp->session->core_data); struct tfp_send_msg_parms parms = { 0 }; + uint8_t fw_session_id; + + rc = tf_session_get_fw_session_id(tfp, &fw_session_id); + if (rc) { + TFP_DRV_LOG(ERR, + "Unable to lookup FW id, rc:%s\n", + strerror(-rc)); + return rc; + } /* Populate the request */ - req.fw_session_id = - tfp_cpu_to_le_32(tfs->session_id.internal.fw_session_id); + req.fw_session_id = tfp_cpu_to_le_32(fw_session_id); parms.tf_type = HWRM_TF_SESSION_CLOSE; parms.req_data = (uint32_t *)&req; @@ -150,12 +157,19 @@ tf_msg_session_qcfg(struct tf *tfp) int rc; struct hwrm_tf_session_qcfg_input req = { 0 }; struct hwrm_tf_session_qcfg_output resp = { 0 }; - struct tf_session *tfs = (struct tf_session *)(tfp->session->core_data); struct tfp_send_msg_parms parms = { 0 }; + uint8_t fw_session_id; + + rc = tf_session_get_fw_session_id(tfp, &fw_session_id); + if (rc) { + TFP_DRV_LOG(ERR, + "Unable to lookup FW id, rc:%s\n", + strerror(-rc)); + return rc; + } /* Populate the request */ - req.fw_session_id = - tfp_cpu_to_le_32(tfs->session_id.internal.fw_session_id); + req.fw_session_id = tfp_cpu_to_le_32(fw_session_id); parms.tf_type = HWRM_TF_SESSION_QCFG, parms.req_data = (uint32_t *)&req; @@ -448,13 +462,22 @@ tf_msg_insert_em_internal_entry(struct tf *tfp, struct tfp_send_msg_parms parms = { 0 }; struct hwrm_tf_em_insert_input req = { 0 }; struct hwrm_tf_em_insert_output resp = { 0 }; - struct tf_session *tfs = (struct tf_session *)(tfp->session->core_data); struct tf_em_64b_entry *em_result = (struct tf_em_64b_entry *)em_parms->em_record; uint16_t flags; + uint8_t fw_session_id; - req.fw_session_id = - tfp_cpu_to_le_32(tfs->session_id.internal.fw_session_id); + rc = tf_session_get_fw_session_id(tfp, &fw_session_id); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Unable to lookup FW id, rc:%s\n", + tf_dir_2_str(em_parms->dir), + strerror(-rc)); + return rc; + } + + /* Populate the request */ + req.fw_session_id = tfp_cpu_to_le_32(fw_session_id); tfp_memcpy(req.em_key, em_parms->key, ((em_parms->key_sz_in_bits + 7) / 8)); @@ -498,11 +521,19 @@ tf_msg_delete_em_entry(struct tf *tfp, struct hwrm_tf_em_delete_input req = { 0 }; struct hwrm_tf_em_delete_output resp = { 0 }; uint16_t flags; - struct tf_session *tfs = - (struct tf_session *)(tfp->session->core_data); + uint8_t fw_session_id; - req.fw_session_id = - tfp_cpu_to_le_32(tfs->session_id.internal.fw_session_id); + rc = tf_session_get_fw_session_id(tfp, &fw_session_id); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Unable to lookup FW id, rc:%s\n", + tf_dir_2_str(em_parms->dir), + strerror(-rc)); + return rc; + } + + /* Populate the request */ + req.fw_session_id = tfp_cpu_to_le_32(fw_session_id); flags = (em_parms->dir == TF_DIR_TX ? HWRM_TF_EM_DELETE_INPUT_FLAGS_DIR_TX : @@ -789,21 +820,19 @@ tf_msg_set_tbl_entry(struct tf *tfp, struct hwrm_tf_tbl_type_set_input req = { 0 }; struct hwrm_tf_tbl_type_set_output resp = { 0 }; struct tfp_send_msg_parms parms = { 0 }; - struct tf_session *tfs; + uint8_t fw_session_id; - /* Retrieve the session information */ - rc = tf_session_get_session(tfp, &tfs); + rc = tf_session_get_fw_session_id(tfp, &fw_session_id); if (rc) { TFP_DRV_LOG(ERR, - "%s: Failed to lookup session, rc:%s\n", + "%s: Unable to lookup FW id, rc:%s\n", tf_dir_2_str(dir), strerror(-rc)); return rc; } /* Populate the request */ - req.fw_session_id = - tfp_cpu_to_le_32(tfs->session_id.internal.fw_session_id); + req.fw_session_id = tfp_cpu_to_le_32(fw_session_id); req.flags = tfp_cpu_to_le_16(dir); req.type = tfp_cpu_to_le_32(hcapi_type); req.size = tfp_cpu_to_le_16(size); @@ -840,21 +869,19 @@ tf_msg_get_tbl_entry(struct tf *tfp, struct hwrm_tf_tbl_type_get_input req = { 0 }; struct hwrm_tf_tbl_type_get_output resp = { 0 }; struct tfp_send_msg_parms parms = { 0 }; - struct tf_session *tfs; + uint8_t fw_session_id; - /* Retrieve the session information */ - rc = tf_session_get_session(tfp, &tfs); + rc = tf_session_get_fw_session_id(tfp, &fw_session_id); if (rc) { TFP_DRV_LOG(ERR, - "%s: Failed to lookup session, rc:%s\n", + "%s: Unable to lookup FW id, rc:%s\n", tf_dir_2_str(dir), strerror(-rc)); return rc; } /* Populate the request */ - req.fw_session_id = - tfp_cpu_to_le_32(tfs->session_id.internal.fw_session_id); + req.fw_session_id = tfp_cpu_to_le_32(fw_session_id); req.flags = tfp_cpu_to_le_16(dir); req.type = tfp_cpu_to_le_32(hcapi_type); req.index = tfp_cpu_to_le_32(index); @@ -897,22 +924,20 @@ tf_msg_bulk_get_tbl_entry(struct tf *tfp, 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 tf_session *tfs; int data_size = 0; + uint8_t fw_session_id; - /* Retrieve the session information */ - rc = tf_session_get_session(tfp, &tfs); + rc = tf_session_get_fw_session_id(tfp, &fw_session_id); if (rc) { TFP_DRV_LOG(ERR, - "%s: Failed to lookup session, rc:%s\n", + "%s: Unable to lookup FW id, rc:%s\n", tf_dir_2_str(dir), strerror(-rc)); return rc; } /* Populate the request */ - req.fw_session_id = - tfp_cpu_to_le_32(tfs->session_id.internal.fw_session_id); + req.fw_session_id = tfp_cpu_to_le_32(fw_session_id); req.flags = tfp_cpu_to_le_16(dir); req.type = tfp_cpu_to_le_32(hcapi_type); req.start_index = tfp_cpu_to_le_32(starting_idx); @@ -939,3 +964,102 @@ tf_msg_bulk_get_tbl_entry(struct tf *tfp, return tfp_le_to_cpu_32(parms.tf_resp_code); } + +int +tf_msg_get_if_tbl_entry(struct tf *tfp, + struct tf_if_tbl_get_parms *params) +{ + int rc = 0; + struct tfp_send_msg_parms parms = { 0 }; + tf_if_tbl_get_input_t req = { 0 }; + tf_if_tbl_get_output_t resp; + uint32_t flags = 0; + struct tf_session *tfs; + + /* Retrieve the session information */ + rc = tf_session_get_session(tfp, &tfs); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to lookup session, rc:%s\n", + tf_dir_2_str(params->dir), + strerror(-rc)); + return rc; + } + + flags = (params->dir == TF_DIR_TX ? TF_IF_TBL_SET_INPUT_FLAGS_DIR_TX : + TF_IF_TBL_SET_INPUT_FLAGS_DIR_RX); + + /* Populate the request */ + req.fw_session_id = + tfp_cpu_to_le_32(tfs->session_id.internal.fw_session_id); + req.flags = flags; + req.tf_if_tbl_type = params->hcapi_type; + req.idx = tfp_cpu_to_le_16(params->idx); + req.data_sz_in_bytes = tfp_cpu_to_le_16(params->data_sz_in_bytes); + + MSG_PREP(parms, + TF_KONG_MB, + HWRM_TF, + HWRM_TFT_IF_TBL_GET, + req, + resp); + + rc = tfp_send_msg_tunneled(tfp, &parms); + + if (rc != 0) + return rc; + + if (parms.tf_resp_code != 0) + return tfp_le_to_cpu_32(parms.tf_resp_code); + + tfp_memcpy(¶ms->data[0], resp.data, req.data_sz_in_bytes); + + return tfp_le_to_cpu_32(parms.tf_resp_code); +} + +int +tf_msg_set_if_tbl_entry(struct tf *tfp, + struct tf_if_tbl_set_parms *params) +{ + int rc = 0; + struct tfp_send_msg_parms parms = { 0 }; + tf_if_tbl_set_input_t req = { 0 }; + uint32_t flags = 0; + struct tf_session *tfs; + + /* Retrieve the session information */ + rc = tf_session_get_session(tfp, &tfs); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to lookup session, rc:%s\n", + tf_dir_2_str(params->dir), + strerror(-rc)); + return rc; + } + + + flags = (params->dir == TF_DIR_TX ? TF_IF_TBL_SET_INPUT_FLAGS_DIR_TX : + TF_IF_TBL_SET_INPUT_FLAGS_DIR_RX); + + /* Populate the request */ + req.fw_session_id = + tfp_cpu_to_le_32(tfs->session_id.internal.fw_session_id); + req.flags = flags; + req.tf_if_tbl_type = params->hcapi_type; + req.idx = tfp_cpu_to_le_32(params->idx); + req.data_sz_in_bytes = tfp_cpu_to_le_32(params->data_sz_in_bytes); + tfp_memcpy(&req.data[0], params->data, params->data_sz_in_bytes); + + MSG_PREP_NO_RESP(parms, + TF_KONG_MB, + HWRM_TF, + HWRM_TFT_IF_TBL_SET, + req); + + rc = tfp_send_msg_tunneled(tfp, &parms); + + if (rc != 0) + return rc; + + return tfp_le_to_cpu_32(parms.tf_resp_code); +} diff --git a/drivers/net/bnxt/tf_core/tf_msg.h b/drivers/net/bnxt/tf_core/tf_msg.h index 7432873d7..37f291016 100644 --- a/drivers/net/bnxt/tf_core/tf_msg.h +++ b/drivers/net/bnxt/tf_core/tf_msg.h @@ -428,4 +428,34 @@ int tf_msg_bulk_get_tbl_entry(struct tf *tfp, uint16_t entry_sz_in_bytes, uint64_t physical_mem_addr); +/** + * Sends Set message of a IF Table Type element to the firmware. + * + * [in] tfp + * Pointer to session handle + * + * [in] parms + * Pointer to IF table set parameters + * + * Returns: + * 0 on Success else internal Truflow error + */ +int tf_msg_set_if_tbl_entry(struct tf *tfp, + struct tf_if_tbl_set_parms *params); + +/** + * Sends get message of a IF Table Type element to the firmware. + * + * [in] tfp + * Pointer to session handle + * + * [in] parms + * Pointer to IF table get parameters + * + * Returns: + * 0 on Success else internal Truflow error + */ +int tf_msg_get_if_tbl_entry(struct tf *tfp, + struct tf_if_tbl_get_parms *params); + #endif /* _TF_MSG_H_ */ diff --git a/drivers/net/bnxt/tf_core/tf_session.c b/drivers/net/bnxt/tf_core/tf_session.c index ab9e05f2d..6c07e4745 100644 --- a/drivers/net/bnxt/tf_core/tf_session.c +++ b/drivers/net/bnxt/tf_core/tf_session.c @@ -70,14 +70,24 @@ tf_session_open_session(struct tf *tfp, goto cleanup; } tfp->session->core_data = cparms.mem_va; + session_id = &parms->open_cfg->session_id; + + /* Update Session Info, which is what is visible to the caller */ + tfp->session->ver.major = 0; + tfp->session->ver.minor = 0; + tfp->session->ver.update = 0; - /* Initialize Session and Device */ + tfp->session->session_id.internal.domain = session_id->internal.domain; + tfp->session->session_id.internal.bus = session_id->internal.bus; + tfp->session->session_id.internal.device = session_id->internal.device; + tfp->session->session_id.internal.fw_session_id = fw_session_id; + + /* Initialize Session and Device, which is private */ session = (struct tf_session *)tfp->session->core_data; session->ver.major = 0; session->ver.minor = 0; session->ver.update = 0; - session_id = &parms->open_cfg->session_id; session->session_id.internal.domain = session_id->internal.domain; session->session_id.internal.bus = session_id->internal.bus; session->session_id.internal.device = session_id->internal.device;