All of lore.kernel.org
 help / color / mirror / Atom feed
From: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
To: dev@dpdk.org
Cc: Farah Smith <farah.smith@broadcom.com>,
	Peter Spreadborough <peter.spreadborough@broadcom.com>,
	Randy Schacher <stuart.schacher@broadcom.com>,
	Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Subject: [dpdk-dev] [PATCH 12/58] net/bnxt: modify TRUFLOW HWRM messages
Date: Sun, 30 May 2021 14:28:43 +0530	[thread overview]
Message-ID: <20210530085929.29695-13-venkatkumar.duvvuru@broadcom.com> (raw)
In-Reply-To: <20210530085929.29695-1-venkatkumar.duvvuru@broadcom.com>

From: Farah Smith <farah.smith@broadcom.com>

- Move Bulk get to a direct HWRM message
- Deprecate code based on HCAPI changes

Signed-off-by: Farah Smith <farah.smith@broadcom.com>
Signed-off-by: Peter Spreadborough <peter.spreadborough@broadcom.com>
Signed-off-by: Randy Schacher <stuart.schacher@broadcom.com>
Signed-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Reviewed-by: Randy Schacher <stuart.schacher@broadcom.com>
---
 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   | 197 ++++++++----
 drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.c     | 116 ++++---
 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, 1202 insertions(+), 1330 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 <errno.h>
-#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..5135a857e1 100644
--- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_defs.h
+++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_defs.h
@@ -1,7 +1,6 @@
-
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2014-2021 Broadcom
- * All rights reserved.
+/*
+ *   Copyright(c) Broadcom Limited.
+ *   All rights reserved.
  */
 
 /*!
@@ -14,27 +13,54 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdbool.h>
-#include <stdint.h>
 #include <stddef.h>
+#include <stdint.h>
+
+#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 operaton is used to evit 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 0544b667dd..79bc569989 100644
--- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.c
+++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p4.c
@@ -1,8 +1,9 @@
+
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright(c) 2019-2021 Broadcom
  * All rights reserved.
  */
-#include <inttypes.h>
+
 #include <stdint.h>
 #include <stdlib.h>
 #include <stdbool.h>
@@ -10,6 +11,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,10 +20,9 @@ static bool hcapi_cfa_lkup_init;
 
 extern const uint32_t crc32tbl[];
 
-static inline uint32_t SWAP_WORDS32(uint32_t val32)
+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)
@@ -79,9 +80,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)
@@ -94,16 +94,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;
@@ -116,7 +114,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;
 }
@@ -138,42 +136,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;
@@ -182,8 +177,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);
 
 	/*
@@ -192,16 +186,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;
@@ -210,8 +202,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);
 
 	/*
@@ -223,8 +214,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;
 		}
@@ -232,40 +222,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;
 
@@ -274,14 +257,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
@@ -289,11 +272,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;
@@ -302,3 +285,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
-		 *
-		 * <ul>
-		 * <li> CFA_P4_ACT_ENCAP_VTAGS_PUSH_0, default, no VLAN
-		 *      Tags applied
-		 * <li> 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
-		 * <li> 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
-		 * </ul>
-		 */
-		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.
-		 * <ul>
-		 * <li> CFA_P4_ACT_ENCAP_L3_NONE, default, no L3
-		 *      Encapsulation processing.
-		 * <li> CFA_P4_ACT_ENCAP_L3_IPV4, enables L3 IPv4
-		 *      Encapsulation.
-		 * <li> CFA_P4_ACT_ENCAP_L3_IPV6, enables L3 IPv6
-		 *      Encapsulation.
-		 * <li> CFA_P4_ACT_ENCAP_L3_MPLS_8847, enables L3 MPLS
-		 *      8847 Encapsulation.
-		 * <li> CFA_P4_ACT_ENCAP_L3_MPLS_8848, enables L3 MPLS
-		 *      8848 Encapsulation.
-		 * </ul>
-		 */
-		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
-		 * <ul>
-		 * <li> CFA_P4_ACT_ENCAP_TNL_NONE, default, no Tunnel
-		 *      Encapsulation processing.
-		 * <li> CFA_P4_ACT_ENCAP_TNL_GENERIC_FULL
-		 * <li> CFA_P4_ACT_ENCAP_TNL_VXLAN. NOTE: Expects
-		 *      l4_enable set to CFA_P4_TRUE;
-		 * <li> CFA_P4_ACT_ENCAP_TNL_NGE. NOTE: Expects l4_enable
-		 *      set to CFA_P4_TRUE;
-		 * <li> CFA_P4_ACT_ENCAP_TNL_NVGRE. NOTE: only valid if
-		 *      l4_enable set to CFA_HCAPI_FALSE.
-		 * <li> CFA_P4_ACT_ENCAP_TNL_GRE.NOTE: only valid if
-		 *      l4_enable set to CFA_HCAPI_FALSE.
-		 * <li> CFA_P4_ACT_ENCAP_TNL_GENERIC_AFTER_TL4
-		 * <li> CFA_P4_ACT_ENCAP_TNL_GENERIC_AFTER_TNL
-		 * </ul>
-		 */
-		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 723b8393b9..a70c6f4eaa 100644
--- a/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.c
+++ b/drivers/net/bnxt/hcapi/cfa/hcapi_cfa_p58.c
@@ -88,7 +88,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
-		 *
-		 * <ul>
-		 * <li> CFA_P58_ACT_ENCAP_VTAGS_PUSH_0, default, no VLAN
-		 *      Tags applied
-		 * <li> 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
-		 * <li> 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
-		 * </ul>
-		 */
-		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.
-		 * <ul>
-		 * <li> CFA_P58_ACT_ENCAP_L3_NONE, default, no L3
-		 *      Encapsulation processing.
-		 * <li> CFA_P58_ACT_ENCAP_L3_IPV4, enables L3 IPv4
-		 *      Encapsulation.
-		 * <li> CFA_P58_ACT_ENCAP_L3_IPV6, enables L3 IPv6
-		 *      Encapsulation.
-		 * <li> CFA_P58_ACT_ENCAP_L3_MPLS_8847, enables L3 MPLS
-		 *      8847 Encapsulation.
-		 * <li> CFA_P58_ACT_ENCAP_L3_MPLS_8848, enables L3 MPLS
-		 *      8848 Encapsulation.
-		 * </ul>
-		 */
-		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
-		 * <ul>
-		 * <li> CFA_P58_ACT_ENCAP_TNL_NONE, default, no Tunnel
-		 *      Encapsulation processing.
-		 * <li> CFA_P58_ACT_ENCAP_TNL_GENERIC_FULL
-		 * <li> CFA_P58_ACT_ENCAP_TNL_VXLAN. NOTE: Expects
-		 *      l4_enable set to CFA_P58_TRUE;
-		 * <li> CFA_P58_ACT_ENCAP_TNL_NGE. NOTE: Expects l4_enable
-		 *      set to CFA_P58_TRUE;
-		 * <li> CFA_P58_ACT_ENCAP_TNL_NVGRE. NOTE: only valid if
-		 *      l4_enable set to CFA_HCAPI_FALSE.
-		 * <li> CFA_P58_ACT_ENCAP_TNL_GRE.NOTE: only valid if
-		 *      l4_enable set to CFA_HCAPI_FALSE.
-		 * <li> CFA_P58_ACT_ENCAP_TNL_GENERIC_AFTER_TL4
-		 * <li> CFA_P58_ACT_ENCAP_TNL_GENERIC_AFTER_TNL
-		 * </ul>
-		 */
-		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 <stdlib.h>
 #include <stdbool.h>
 #include <stdio.h>
-#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 <stdlib.h>
 #include <string.h>
 
+#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 <rte_common.h>
 #include <hsi_struct_def_dpdk.h>
 
+#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.
  *
-- 
2.17.1


  parent reply	other threads:[~2021-05-30  9:02 UTC|newest]

Thread overview: 129+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-30  8:58 [dpdk-dev] [PATCH 00/58] enhancements to host based flow table management Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 01/58] net/bnxt: add CFA folder to HCAPI directory Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 02/58] net/bnxt: add base TRUFLOW support for Thor Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 03/58] net/bnxt: add mailbox selection via dev op Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 04/58] net/bnxt: check resource reservation in TRUFLOW Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 05/58] net/bnxt: update TRUFLOW resources Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 06/58] net/bnxt: add support for EM with FKB Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 07/58] net/bnxt: add L2 Context TCAM get support Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 08/58] net/bnxt: add action SRAM Translation Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 09/58] net/bnxt: add Thor WC TCAM support Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 10/58] net/bnxt: add 64B SRAM record management with RM Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 11/58] net/bnxt: add hashing changes for Thor Venkat Duvvuru
2021-05-30  8:58 ` Venkat Duvvuru [this message]
2021-05-30  8:58 ` [dpdk-dev] [PATCH 13/58] net/bnxt: change RM database type Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 14/58] net/bnxt: add shared session support Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 15/58] net/bnxt: add dpool allocator for EM allocation Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 16/58] net/bnxt: update shared session functionality Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 17/58] net/bnxt: modify resource reservation strategy Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 18/58] net/bnxt: shared TCAM region support Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 19/58] net/bnxt: cleanup session open/close messages Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 20/58] net/bnxt: add WC TCAM hi/lo move support Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 21/58] net/bnxt: add API to get shared table increments Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 22/58] net/bnxt: modify host session failure cleanup Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 23/58] net/bnxt: cleanup of WC TCAM shared unbind Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 24/58] net/bnxt: add support for WC TCAM shared session Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 25/58] net/bnxt: add API to clear hi/lo WC region Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 26/58] net/bnxt: check FW capability to support TRUFLOW Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 27/58] net/bnxt: add support for generic table processing Venkat Duvvuru
2021-05-30  8:58 ` [dpdk-dev] [PATCH 28/58] net/bnxt: add support for mapper flow database opcodes Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 29/58] net/bnxt: add conditional execution and rejection Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 30/58] net/bnxt: modify TCAM opcode processing Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 31/58] net/bnxt: modify VXLAN decap for multichannel mode Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 32/58] net/bnxt: modify table processing Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 33/58] net/bnxt: modify ULP priority opcode processing Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 34/58] net/bnxt: add support for conflict resolution Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 35/58] net/bnxt: add support for conditional goto processing Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 36/58] net/bnxt: set shared handle for generic table Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 37/58] net/bnxt: modify ULP template Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 38/58] net/bnxt: add conditional opcode and L4 port fields Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 39/58] net/bnxt: refactor TF ULP Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 40/58] net/bnxt: add partial header field processing Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 41/58] net/bnxt: add support for wild card pattern match Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 42/58] net/bnxt: add support for GRE flows Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 43/58] net/bnxt: enable extended exact match support Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 44/58] net/bnxt: refactor ULP mapper and parser Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 45/58] net/bnxt: add support for generic hash table Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 46/58] net/bnxt: add support for Thor platform Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 47/58] net/bnxt: refactor flow parser in ULP Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 48/58] net/bnxt: add shared session support to ULP Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 49/58] net/bnxt: add field opcodes in ULP Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 50/58] net/bnxt: add support for application ID in ULP matcher Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 51/58] net/bnxt: process resource lists before session open Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 52/58] net/bnxt: add support for shared sessions in ULP Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 53/58] net/bnxt: add HA support " Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 54/58] net/bnxt: add support for icmp6 ULP parsing Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 55/58] net/bnxt: add support for ULP context list for timers Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 56/58] net/bnxt: cleanup ULP parser and mapper Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 57/58] net/bnxt: reorganize ULP template directory structure Venkat Duvvuru
2021-05-30  8:59 ` [dpdk-dev] [PATCH 58/58] net/bnxt: add Thor template support Venkat Duvvuru
2021-06-13  0:05 ` [dpdk-dev] [PATCH v2 00/58] enhancements to host based flow table management Ajit Khaparde
2021-06-13  0:05   ` [dpdk-dev] [PATCH v2 01/58] net/bnxt: add CFA folder to HCAPI directory Ajit Khaparde
2021-06-13  0:05   ` [dpdk-dev] [PATCH v2 02/58] net/bnxt: add base TRUFLOW support for Thor Ajit Khaparde
2021-06-13  0:05   ` [dpdk-dev] [PATCH v2 03/58] net/bnxt: add mailbox selection via dev op Ajit Khaparde
2021-06-13  0:05   ` [dpdk-dev] [PATCH v2 04/58] net/bnxt: check resource reservation in TRUFLOW Ajit Khaparde
2021-06-13  0:05   ` [dpdk-dev] [PATCH v2 05/58] net/bnxt: update TRUFLOW resources Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 06/58] net/bnxt: add support for EM with FKB Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 07/58] net/bnxt: support L2 Context TCAM ops Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 08/58] net/bnxt: add action SRAM translation Ajit Khaparde
2021-07-05 21:23     ` Thomas Monjalon
2021-07-06 22:37       ` [dpdk-dev] [PATCH v3] " Ajit Khaparde
2021-07-06 22:58       ` [dpdk-dev] [PATCH v2 08/58] " Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 09/58] net/bnxt: add Thor WC TCAM support Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 10/58] net/bnxt: add 64B SRAM record management with RM Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 11/58] net/bnxt: add hashing changes for Thor Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 12/58] net/bnxt: modify TRUFLOW HWRM messages Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 13/58] net/bnxt: change RM database type Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 14/58] net/bnxt: add shared session support Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 15/58] net/bnxt: add dpool allocator for EM allocation Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 16/58] net/bnxt: update shared session functionality Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 17/58] net/bnxt: modify resource reservation strategy Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 18/58] net/bnxt: shared TCAM region support Ajit Khaparde
2021-07-05 21:27     ` Thomas Monjalon
2021-07-06 22:39       ` [dpdk-dev] [PATCH v3] " Ajit Khaparde
2021-07-06 22:57       ` [dpdk-dev] [PATCH v2 18/58] " Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 19/58] net/bnxt: cleanup logs in session handling paths Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 20/58] net/bnxt: add WC TCAM management support Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 21/58] net/bnxt: add API to get shared table increments Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 22/58] net/bnxt: refactor host session failure cleanup Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 23/58] net/bnxt: cleanup WC TCAM shared pool Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 24/58] net/bnxt: add support for WC TCAM shared session Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 25/58] net/bnxt: add API to clear TCAM regions Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 26/58] net/bnxt: check FW capability to support TRUFLOW Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 27/58] net/bnxt: add support for generic table processing Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 28/58] net/bnxt: add support for mapper flow database opcodes Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 29/58] net/bnxt: add conditional processing of templates Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 30/58] net/bnxt: modify TCAM opcode processing Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 31/58] net/bnxt: modify VXLAN decap for multichannel mode Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 32/58] net/bnxt: modify table processing Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 33/58] net/bnxt: add ULP priority opcode processing Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 34/58] net/bnxt: add support to identify duplicate flows Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 35/58] net/bnxt: add conditional goto processing Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 36/58] net/bnxt: set shared handle for generic table Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 37/58] net/bnxt: modify ULP template Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 38/58] net/bnxt: add conditional opcode and L4 port fields Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 39/58] net/bnxt: refactor TRUFLOW processing Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 40/58] net/bnxt: add partial header field processing Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 41/58] net/bnxt: add support for wild card pattern match Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 42/58] net/bnxt: add support for GRE flows Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 43/58] net/bnxt: enable extended exact match support Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 44/58] net/bnxt: refactor ULP mapper Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 45/58] net/bnxt: add support for generic hash table Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 46/58] net/bnxt: add support for Thor platform Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 47/58] net/bnxt: refactor flow parser in ULP Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 48/58] net/bnxt: add shared session support to ULP Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 49/58] net/bnxt: add field opcodes in ULP Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 50/58] net/bnxt: add support for application ID in ULP matcher Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 51/58] net/bnxt: process resource lists before session open Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 52/58] net/bnxt: add templates for shared sessions Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 53/58] net/bnxt: add HA support in ULP Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 54/58] net/bnxt: add ICMPv6 parser to ULP Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 55/58] net/bnxt: add context list for timers Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 56/58] net/bnxt: cleanup ULP parser and mapper Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 57/58] net/bnxt: reorganize ULP template directory structure Ajit Khaparde
2021-06-13  0:06   ` [dpdk-dev] [PATCH v2 58/58] net/bnxt: add Thor template support Ajit Khaparde
2021-06-15 19:33   ` [dpdk-dev] [PATCH v2 00/58] enhancements to host based flow table management Ajit Khaparde
2021-07-07  8:43     ` Thomas Monjalon
2021-07-08  3:57       ` Ajit Khaparde
2021-07-08 12:51         ` Thomas Monjalon
2021-07-08 14:37           ` Ajit Khaparde

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210530085929.29695-13-venkatkumar.duvvuru@broadcom.com \
    --to=venkatkumar.duvvuru@broadcom.com \
    --cc=dev@dpdk.org \
    --cc=farah.smith@broadcom.com \
    --cc=peter.spreadborough@broadcom.com \
    --cc=stuart.schacher@broadcom.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.