@@ -21,9 +21,7 @@ sources += files(
'tf_device.c',
'tf_device_p4.c',
'tf_device_p58.c',
- 'tf_em_common.c',
'tf_em_hash_internal.c',
- 'tf_em_host.c',
'tf_em_internal.c',
'tf_global_cfg.c',
'tf_hash.c',
@@ -21,9 +21,15 @@
/********** BEGIN Truflow Core DEFINITIONS **********/
+/**
+ * \cond DO_NOT_DOCUMENT
+ */
#define TF_KILOBYTE 1024
#define TF_MEGABYTE (1024 * 1024)
+/**
+ * \endcond
+ */
/**
* direction
*/
@@ -93,15 +99,19 @@ enum tf_sram_bank_id {
*
* Convert absolute offset to action record pointer in EEM record entry
* Convert action record pointer in EEM record entry to absolute offset
+ * \cond DO_NOT_DOCUMENT
*/
#define TF_ACT_REC_OFFSET_2_PTR(offset) ((offset) >> 4)
#define TF_ACT_REC_PTR_2_OFFSET(offset) ((offset) << 4)
-/*
+/**
* Helper Macros
*/
#define TF_BITS_2_BYTES(num_bits) (((num_bits) + 7) / 8)
+/**
+ * \endcond
+ */
/********** BEGIN API FUNCTION PROTOTYPES/PARAMETERS **********/
/**
@@ -147,6 +157,8 @@ enum tf_sram_bank_id {
* TruFlow session. Session ID is constructed from the passed in
* ctrl_chan_name in tf_open_session() together with an allocated
* fw_session_id. Done by TruFlow on tf_open_session().
+ *
+ * \cond DO_NOT_DOCUMENT
*/
union tf_session_id {
uint32_t id;
@@ -172,6 +184,10 @@ union tf_session_client_id {
uint8_t fw_session_client_id;
} internal;
};
+/**
+ * \endcond
+ */
+
/**
* Session Version
@@ -181,12 +197,17 @@ union tf_session_client_id {
* versions can be supported.
*
* Please see the TF_VER_MAJOR/MINOR and UPDATE defines.
+ *
+ * \cond DO_NOT_DOCUMENT
*/
struct tf_session_version {
uint8_t major;
uint8_t minor;
uint8_t update;
};
+/**
+ * \endcond
+ */
/**
* Session supported device types
@@ -485,6 +506,7 @@ struct tf_session_info {
*
* NOTE: This struct must be within the BNXT PMD struct bnxt
* (bp). This allows use of container_of() to get access to the PMD.
+ * \cond DO_NOT_DOCUMENT
*/
struct tf {
struct tf_session_info *session;
@@ -493,6 +515,9 @@ struct tf {
*/
void *bp;
};
+/**
+ * \endcond
+ */
/**
* Identifier resource definition
@@ -716,12 +741,15 @@ int tf_open_session(struct tf *tfp,
/**
* General internal resource info
- *
+ * \cond DO_NOT_DOCUMENT
*/
struct tf_resource_info {
uint16_t start;
uint16_t stride;
};
+/**
+ * \endcond
+ */
/**
* Identifier resource definition
@@ -2386,6 +2414,7 @@ struct tf_get_version_parms {
/* [out] major
*
* Version Major number.
+ * \cond DO_NOT_DOCUMENT
*/
uint8_t major;
@@ -2402,6 +2431,7 @@ struct tf_get_version_parms {
uint8_t update;
/**
+ * \endcond
* [out] dev_ident_caps
*
* fw available identifier resource list
@@ -153,28 +153,6 @@ tf_dev_bind_p4(struct tf *tfp,
}
no_rsv_flag = false;
}
-
- /*
- * EEM
- */
-
- em_cfg.cfg = tf_em_ext_p4;
- rsv_cnt = tf_dev_reservation_check(TF_EM_TBL_TYPE_MAX,
- em_cfg.cfg,
- (uint16_t *)resources->em_cnt);
- if (rsv_cnt) {
- em_cfg.num_elements = TF_EM_TBL_TYPE_MAX;
- em_cfg.resources = resources;
- em_cfg.mem_type = TF_EEM_MEM_TYPE_HOST;
- rc = tf_em_ext_common_bind(tfp, &em_cfg);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "EEM initialization failure\n");
- goto fail;
- }
- no_rsv_flag = false;
- }
-
/*
* EM
*/
@@ -294,14 +272,6 @@ tf_dev_unbind_p4(struct tf *tfp)
"Device unbind failed, Table Type\n");
fail = true;
}
-
- rc = tf_em_ext_common_unbind(tfp);
- if (rc) {
- TFP_DRV_LOG(INFO,
- "Device unbind failed, EEM\n");
- fail = true;
- }
-
rc = tf_em_int_unbind(tfp);
if (rc) {
TFP_DRV_LOG(INFO,
@@ -15,6 +15,7 @@
#include "tf_if_tbl.h"
#include "tfp.h"
#include "tf_msg_common.h"
+#include "tf_util.h"
#define TF_DEV_P4_PARIF_MAX 16
#define TF_DEV_P4_PF_MASK 0xfUL
@@ -528,13 +529,13 @@ const struct tf_dev_ops tf_dev_ops_p4 = {
.tf_dev_get_tbl_info = NULL,
.tf_dev_is_sram_managed = tf_dev_p4_is_sram_managed,
.tf_dev_alloc_tbl = tf_tbl_alloc,
- .tf_dev_alloc_ext_tbl = tf_tbl_ext_alloc,
+ .tf_dev_alloc_ext_tbl = NULL,
.tf_dev_alloc_sram_tbl = tf_tbl_alloc,
.tf_dev_free_tbl = tf_tbl_free,
- .tf_dev_free_ext_tbl = tf_tbl_ext_free,
+ .tf_dev_free_ext_tbl = NULL,
.tf_dev_free_sram_tbl = tf_tbl_free,
.tf_dev_set_tbl = tf_tbl_set,
- .tf_dev_set_ext_tbl = tf_tbl_ext_common_set,
+ .tf_dev_set_ext_tbl = NULL,
.tf_dev_set_sram_tbl = NULL,
.tf_dev_get_tbl = tf_tbl_get,
.tf_dev_get_sram_tbl = NULL,
@@ -551,13 +552,13 @@ const struct tf_dev_ops tf_dev_ops_p4 = {
.tf_dev_get_tcam_resc_info = tf_tcam_get_resc_info,
.tf_dev_insert_int_em_entry = tf_em_insert_int_entry,
.tf_dev_delete_int_em_entry = tf_em_delete_int_entry,
- .tf_dev_insert_ext_em_entry = tf_em_insert_ext_entry,
- .tf_dev_delete_ext_em_entry = tf_em_delete_ext_entry,
+ .tf_dev_insert_ext_em_entry = NULL,
+ .tf_dev_delete_ext_em_entry = NULL,
.tf_dev_get_em_resc_info = tf_em_get_resc_info,
- .tf_dev_alloc_tbl_scope = tf_em_ext_common_alloc,
- .tf_dev_map_tbl_scope = tf_em_ext_map_tbl_scope,
+ .tf_dev_alloc_tbl_scope = NULL,
+ .tf_dev_map_tbl_scope = NULL,
.tf_dev_map_parif = tf_dev_p4_map_parif,
- .tf_dev_free_tbl_scope = tf_em_ext_common_free,
+ .tf_dev_free_tbl_scope = NULL,
.tf_dev_set_if_tbl = tf_if_tbl_set,
.tf_dev_get_if_tbl = tf_if_tbl_get,
.tf_dev_set_global_cfg = tf_global_cfg_set,
@@ -11,6 +11,7 @@
#include "tf_rm.h"
#include "tf_if_tbl.h"
#include "tf_global_cfg.h"
+#include "hcapi_cfa_defs.h"
extern struct tf_rm_element_cfg tf_tbl_p4[TF_DIR_MAX][TF_TBL_TYPE_MAX];
@@ -853,12 +853,12 @@ const struct tf_dev_ops tf_dev_ops_p58 = {
.tf_dev_get_tbl_info = tf_dev_p58_get_sram_tbl_info,
.tf_dev_alloc_tbl = tf_tbl_alloc,
.tf_dev_alloc_sram_tbl = tf_tbl_sram_alloc,
- .tf_dev_alloc_ext_tbl = tf_tbl_ext_alloc,
+ .tf_dev_alloc_ext_tbl = NULL,
.tf_dev_free_tbl = tf_tbl_free,
- .tf_dev_free_ext_tbl = tf_tbl_ext_free,
+ .tf_dev_free_ext_tbl = NULL,
.tf_dev_free_sram_tbl = tf_tbl_sram_free,
.tf_dev_set_tbl = tf_tbl_set,
- .tf_dev_set_ext_tbl = tf_tbl_ext_common_set,
+ .tf_dev_set_ext_tbl = NULL,
.tf_dev_set_sram_tbl = tf_tbl_sram_set,
.tf_dev_get_tbl = tf_tbl_get,
.tf_dev_get_sram_tbl = tf_tbl_sram_get,
@@ -12,70 +12,11 @@
#include "hcapi_cfa_defs.h"
-#define TF_EM_MIN_ENTRIES (1 << 15) /* 32K */
-#define TF_EM_MAX_ENTRIES (1 << 27) /* 128M */
-
#define TF_P4_HW_EM_KEY_MAX_SIZE 52
#define TF_P4_EM_KEY_RECORD_SIZE 64
#define TF_P58_HW_EM_KEY_MAX_SIZE 80
-#define TF_EM_MAX_MASK 0x7FFF
-#define TF_EM_MAX_ENTRY (128 * 1024 * 1024)
-
-/**
- * Hardware Page sizes supported for EEM:
- * 4K, 8K, 64K, 256K, 1M, 2M, 4M, 1G.
- *
- * Round-down other page sizes to the lower hardware page
- * size supported.
- */
-#define TF_EM_PAGE_SIZE_4K 12
-#define TF_EM_PAGE_SIZE_8K 13
-#define TF_EM_PAGE_SIZE_64K 16
-#define TF_EM_PAGE_SIZE_256K 18
-#define TF_EM_PAGE_SIZE_1M 20
-#define TF_EM_PAGE_SIZE_2M 21
-#define TF_EM_PAGE_SIZE_4M 22
-#define TF_EM_PAGE_SIZE_1G 30
-
-/* Set page size */
-#define BNXT_TF_PAGE_SIZE TF_EM_PAGE_SIZE_2M
-
-#if (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_4K) /** 4K */
-#define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_4K
-#define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_4K
-#elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_8K) /** 8K */
-#define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_8K
-#define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_8K
-#elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_64K) /** 64K */
-#define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_64K
-#define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_64K
-#elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_256K) /** 256K */
-#define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_256K
-#define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_256K
-#elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_1M) /** 1M */
-#define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_1M
-#define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_1M
-#elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_2M) /** 2M */
-#define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_2M
-#define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_2M
-#elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_4M) /** 4M */
-#define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_4M
-#define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_4M
-#elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_1G) /** 1G */
-#define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_1G
-#define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_1G
-#else
-#error "Invalid Page Size specified. Please use a TF_EM_PAGE_SIZE_n define"
-#endif
-
-/*
- * System memory always uses 4K pages
- */
-#define TF_EM_PAGE_SIZE (1 << TF_EM_PAGE_SHIFT)
-#define TF_EM_PAGE_ALIGNMENT (1 << TF_EM_PAGE_SHIFT)
-
/*
* Used to build GFID:
*
@@ -90,16 +31,6 @@
#define TF_EM_INTERNAL_INDEX_MASK 0xFFFC
#define TF_EM_INTERNAL_ENTRY_MASK 0x3
-/** EM Entry
- * Each EM entry is 512-bit (64-bytes) but ordered differently to
- * EEM.
- */
-struct tf_em_64b_entry {
- /** Header is 8 bytes long */
- struct cfa_p4_eem_entry_hdr hdr;
- /** Key is 448 bits - 56 bytes */
- uint8_t key[TF_P4_EM_KEY_RECORD_SIZE - sizeof(struct cfa_p4_eem_entry_hdr)];
-};
/** EEM Memory Type
*
@@ -132,6 +63,17 @@ struct tf_em_cfg_parms {
enum tf_mem_type mem_type;
};
+/** EM Entry
+ * Each EM entry is 512-bit (64-bytes) but ordered differently to
+ * EEM.
+ */
+struct tf_em_64b_entry {
+ /** Header is 8 bytes long */
+ struct cfa_p4_eem_entry_hdr hdr;
+ /** Key is 448 bits - 56 bytes */
+ uint8_t key[TF_P4_EM_KEY_RECORD_SIZE - sizeof(struct cfa_p4_eem_entry_hdr)];
+};
+
/**
* EM database
*
@@ -153,29 +95,33 @@ struct em_rm_db {
*
* @ref tf_em_delete_int_entry
*
- * @ref tf_em_insert_ext_entry
+ * @ref tf_em_insert_ext_entry DEFUNCT
*
- * @ref tf_em_delete_ext_entry
+ * @ref tf_em_delete_ext_entry DEFUNCT
*
- * @ref tf_em_insert_ext_sys_entry
+ * @ref tf_em_insert_ext_sys_entry DEFUNCT
*
- * @ref tf_em_delete_ext_sys_entry
+ * @ref tf_em_delete_ext_sys_entry DEFUNCT
*
* @ref tf_em_int_bind
*
* @ref tf_em_int_unbind
*
- * @ref tf_em_ext_common_bind
+ * @ref tf_em_ext_common_bind DEFUNCT
*
- * @ref tf_em_ext_common_unbind
+ * @ref tf_em_ext_common_unbind DEFUNCT
*
- * @ref tf_em_ext_alloc
+ * @ref tf_em_ext_host_alloc DEFUNCT
*
- * @ref tf_em_ext_free
+ * @ref tf_em_ext_host_free DEFUNCT
*
- * @ref tf_em_ext_common_free
+ * @ref tf_em_ext_system_alloc DEFUNCT
*
- * @ref tf_em_ext_common_alloc
+ * @ref tf_em_ext_system_free DEFUNCT
+ *
+ * @ref tf_em_ext_common_free DEFUNCT
+ *
+ * @ref tf_em_ext_common_alloc DEFUNCT
*/
/**
@@ -258,70 +204,6 @@ int tf_em_hash_delete_int_entry(struct tf *tfp,
int tf_em_move_int_entry(struct tf *tfp,
struct tf_move_em_entry_parms *parms);
-/**
- * Insert record in to external EEM table
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_insert_ext_entry(struct tf *tfp,
- struct tf_insert_em_entry_parms *parms);
-
-/**
- * Insert record from external EEM table
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_delete_ext_entry(struct tf *tfp,
- struct tf_delete_em_entry_parms *parms);
-
-/**
- * Insert record in to external system EEM table
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_insert_ext_sys_entry(struct tf *tfp,
- struct tf_insert_em_entry_parms *parms);
-
-/**
- * Delete record from external system EEM table
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_delete_ext_sys_entry(struct tf *tfp,
- struct tf_delete_em_entry_parms *parms);
-
/**
* Bind internal EM device interface
*
@@ -353,199 +235,6 @@ int tf_em_int_bind(struct tf *tfp,
*/
int tf_em_int_unbind(struct tf *tfp);
-/**
- * Common bind for EEM device interface. Used for both host and
- * system memory
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_ext_common_bind(struct tf *tfp,
- struct tf_em_cfg_parms *parms);
-
-/**
- * Common unbind for EEM device interface. Used for both host and
- * system memory
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_ext_common_unbind(struct tf *tfp);
-
-/**
- * Alloc for external EEM using host memory
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_ext_alloc(struct tf *tfp,
- struct tf_alloc_tbl_scope_parms *parms);
-
-/**
- * Free for external EEM using host memory
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_ext_free(struct tf *tfp,
- struct tf_free_tbl_scope_parms *parms);
-
-/**
- * Common free table scope for external EEM using host or system memory
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_ext_common_free(struct tf *tfp,
- struct tf_free_tbl_scope_parms *parms);
-
-/**
- * Common alloc table scope for external EEM using host or system memory
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_ext_common_alloc(struct tf *tfp,
- struct tf_alloc_tbl_scope_parms *parms);
-/**
- * Map a set of parifs to a set of EEM base addresses (table scope)
- *
- * [in] tfp
- * Pointer to TruFlow handle
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int tf_em_ext_map_tbl_scope(struct tf *tfp,
- struct tf_map_tbl_scope_parms *parms);
-
-/**
- * Allocate External Tbl entry from the scope pool.
- *
- * [in] tfp
- * Pointer to Truflow Handle
- * [in] parms
- * Allocation parameters
- *
- * Return:
- * 0 - Success, entry allocated - no search support
- * -ENOMEM -EINVAL -EOPNOTSUPP
- * - Failure, entry not allocated, out of resources
- */
-int
-tf_tbl_ext_alloc(struct tf *tfp,
- struct tf_tbl_alloc_parms *parms);
-
-/**
- * Free External Tbl entry to the scope pool.
- *
- * [in] tfp
- * Pointer to Truflow Handle
- * [in] parms
- * Allocation parameters
- *
- * Return:
- * 0 - Success, entry freed
- *
- * - Failure, entry not successfully freed for these reasons
- * -ENOMEM
- * -EOPNOTSUPP
- * -EINVAL
- */
-int
-tf_tbl_ext_free(struct tf *tfp,
- struct tf_tbl_free_parms *parms);
-
-/**
- * Sets the specified external table type element.
- *
- * This API sets the specified element data by invoking the
- * firmware.
- *
- * [in] tfp
- * Pointer to TF handle
- *
- * [in] parms
- * Pointer to table set parameters
- *
- * Returns
- * - (0) if successful.
- * - (-EINVAL) on failure.
- */
-int tf_tbl_ext_common_set(struct tf *tfp,
- struct tf_tbl_set_parms *parms);
-
-/**
- * Sets the specified external table type element.
- *
- * This API sets the specified element data by invoking the
- * firmware.
- *
- * [in] tfp
- * Pointer to TF handle
- *
- * [in] parms
- * Pointer to table set parameters
- *
- * Returns
- * - (0) if successful.
- * - (-EINVAL) on failure.
- */
-int tf_tbl_ext_set(struct tf *tfp,
- struct tf_tbl_set_parms *parms);
-
-int
-tf_em_ext_system_bind(struct tf *tfp,
- struct tf_em_cfg_parms *parms);
-
-int offload_system_mmap(struct tf_tbl_scope_cb *tbl_scope_cb);
-
/**
* Retrieves the allocated resource info
*
@@ -21,1194 +21,3 @@
#include "hcapi_cfa.h"
#include "bnxt.h"
-/** Invalid table scope id */
-#define TF_TBL_SCOPE_INVALID 0xffffffff
-
-/* Number of pointers per page_size */
-#define MAX_PAGE_PTRS(page_size) ((page_size) / sizeof(void *))
-
-/**
- * Host or system
- */
-static enum tf_mem_type mem_type;
-
-/* API defined in tf_em.h */
-int
-tf_create_tbl_pool_external(enum tf_dir dir,
- struct tf_tbl_scope_cb *tbl_scope_cb,
- uint32_t num_entries,
- uint32_t entry_sz_bytes)
-{
- struct tfp_calloc_parms parms;
- uint32_t i;
- int32_t j;
- int rc = 0;
- struct stack *pool = &tbl_scope_cb->ext_act_pool[dir];
-
- parms.nitems = num_entries;
- parms.size = sizeof(uint32_t);
- parms.alignment = 0;
-
- if (tfp_calloc(&parms) != 0) {
- TFP_DRV_LOG(ERR, "%s: TBL: external pool failure %s\n",
- tf_dir_2_str(dir), strerror(ENOMEM));
- return -ENOMEM;
- }
-
- /* Create empty stack
- */
- rc = stack_init(num_entries, parms.mem_va, pool);
-
- if (rc != 0) {
- TFP_DRV_LOG(ERR, "%s: TBL: stack init failure %s\n",
- tf_dir_2_str(dir), strerror(-rc));
- goto cleanup;
- }
-
- /* Save the malloced memory address so that it can
- * be freed when the table scope is freed.
- */
- tbl_scope_cb->ext_act_pool_mem[dir] = (uint32_t *)parms.mem_va;
-
- /* Fill pool with indexes in reverse
- */
- j = (num_entries - 1) * entry_sz_bytes;
-
- for (i = 0; i < num_entries; i++) {
- rc = stack_push(pool, j);
- if (rc != 0) {
- TFP_DRV_LOG(ERR, "%s TBL: stack failure %s\n",
- tf_dir_2_str(dir), strerror(-rc));
- goto cleanup;
- }
-
- if (j < 0) {
- TFP_DRV_LOG(ERR, "%d TBL: invalid offset (%d)\n",
- dir, j);
- goto cleanup;
- }
- j -= entry_sz_bytes;
- }
-
- if (!stack_is_full(pool)) {
- rc = -EINVAL;
- TFP_DRV_LOG(ERR, "%s TBL: stack failure %s\n",
- tf_dir_2_str(dir), strerror(-rc));
- goto cleanup;
- }
- return 0;
-cleanup:
- tfp_free((void *)parms.mem_va);
- return rc;
-}
-
-/**
- * Destroy External Tbl pool of memory indexes.
- *
- * [in] dir
- * direction
- * [in] tbl_scope_cb
- * pointer to the table scope
- */
-void
-tf_destroy_tbl_pool_external(enum tf_dir dir,
- struct tf_tbl_scope_cb *tbl_scope_cb)
-{
- uint32_t *ext_act_pool_mem =
- tbl_scope_cb->ext_act_pool_mem[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.
- *
- * [in] tfp
- * Pointer to Truflow Handle
- * [in] parms
- * Allocation parameters
- *
- * Return:
- * 0 - Success, entry allocated - no search support
- * -ENOMEM -EINVAL -EOPNOTSUPP
- * - Failure, entry not allocated, out of resources
- */
-int
-tf_tbl_ext_alloc(struct tf *tfp,
- struct tf_tbl_alloc_parms *parms)
-{
- int rc;
- uint32_t index;
- struct tf_tbl_scope_cb *tbl_scope_cb;
- struct stack *pool;
-
- TF_CHECK_PARMS2(tfp, parms);
-
- 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
- */
- rc = stack_pop(pool, &index);
-
- if (rc != 0) {
- TFP_DRV_LOG(ERR,
- "%s, Allocation failed, type:%d\n",
- tf_dir_2_str(parms->dir),
- parms->type);
- return rc;
- }
-
- *parms->idx = index;
- return rc;
-}
-
-/**
- * Free External Tbl entry to the scope pool.
- *
- * [in] tfp
- * Pointer to Truflow Handle
- * [in] parms
- * Allocation parameters
- *
- * Return:
- * 0 - Success, entry freed
- *
- * - Failure, entry not successfully freed for these reasons
- * -ENOMEM
- * -EOPNOTSUPP
- * -EINVAL
- */
-int
-tf_tbl_ext_free(struct tf *tfp,
- struct tf_tbl_free_parms *parms)
-{
- int rc = 0;
- uint32_t index;
- struct tf_tbl_scope_cb *tbl_scope_cb;
- struct stack *pool;
-
- TF_CHECK_PARMS2(tfp, parms);
-
- 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",
- tf_dir_2_str(parms->dir));
- return -EINVAL;
- }
- pool = &tbl_scope_cb->ext_act_pool[parms->dir];
-
- index = parms->idx;
-
- rc = stack_push(pool, index);
-
- if (rc != 0) {
- TFP_DRV_LOG(ERR,
- "%s, consistency error, stack full, type:%d, idx:%d\n",
- tf_dir_2_str(parms->dir),
- parms->type,
- index);
- }
- return rc;
-}
-
-uint32_t
-tf_em_get_key_mask(int num_entries)
-{
- uint32_t mask = num_entries - 1;
-
- if (num_entries & TF_EM_MAX_MASK)
- return 0;
-
- if (num_entries > TF_EM_MAX_ENTRY)
- return 0;
-
- return mask;
-}
-
-void
-tf_em_create_key_entry(struct cfa_p4_eem_entry_hdr *result,
- uint8_t *in_key,
- struct cfa_p4_eem_64b_entry *key_entry)
-{
- key_entry->hdr.word1 = result->word1;
- key_entry->hdr.pointer = result->pointer;
- memcpy(key_entry->key, in_key, TF_P4_HW_EM_KEY_MAX_SIZE + 4);
-}
-
-/**
- * Return the number of page table pages needed to
- * reference the given number of next level pages.
- *
- * [in] num_pages
- * Number of EM pages
- *
- * [in] page_size
- * Size of each EM page
- *
- * Returns:
- * Number of EM page table pages
- */
-static uint32_t
-tf_em_page_tbl_pgcnt(uint32_t num_pages,
- uint32_t page_size)
-{
- return roundup(num_pages, MAX_PAGE_PTRS(page_size)) /
- MAX_PAGE_PTRS(page_size);
- return 0;
-}
-
-/**
- * Given the number of data pages, page_size and the maximum
- * number of page table levels (already determined), size
- * the number of page table pages required at each level.
- *
- * [in] max_lvl
- * Max number of levels
- *
- * [in] num_data_pages
- * Number of EM data pages
- *
- * [in] page_size
- * Size of an EM page
- *
- * [out] *page_cnt
- * EM page count
- */
-static void
-tf_em_size_page_tbls(int max_lvl,
- uint64_t num_data_pages,
- uint32_t page_size,
- uint32_t *page_cnt)
-{
- if (max_lvl == TF_PT_LVL_0) {
- page_cnt[TF_PT_LVL_0] = num_data_pages;
- } else if (max_lvl == TF_PT_LVL_1) {
- page_cnt[TF_PT_LVL_1] = num_data_pages;
- page_cnt[TF_PT_LVL_0] =
- tf_em_page_tbl_pgcnt(page_cnt[TF_PT_LVL_1], page_size);
- } else if (max_lvl == TF_PT_LVL_2) {
- page_cnt[TF_PT_LVL_2] = num_data_pages;
- page_cnt[TF_PT_LVL_1] =
- tf_em_page_tbl_pgcnt(page_cnt[TF_PT_LVL_2], page_size);
- page_cnt[TF_PT_LVL_0] =
- tf_em_page_tbl_pgcnt(page_cnt[TF_PT_LVL_1], page_size);
- } else {
- return;
- }
-}
-
-/**
- * Given the page size, size of each data item (entry size),
- * and the total number of entries needed, determine the number
- * of page table levels and the number of data pages required.
- *
- * [in] page_size
- * Page size
- *
- * [in] entry_size
- * Entry size
- *
- * [in] num_entries
- * Number of entries needed
- *
- * [out] num_data_pages
- * Number of pages required
- *
- * Returns:
- * Success - Number of EM page levels required
- * -ENOMEM - Out of memory
- */
-static int
-tf_em_size_page_tbl_lvl(uint32_t page_size,
- uint32_t entry_size,
- uint32_t num_entries,
- uint64_t *num_data_pages)
-{
- uint64_t lvl_data_size = page_size;
- int lvl = TF_PT_LVL_0;
- uint64_t data_size;
-
- *num_data_pages = 0;
- data_size = (uint64_t)num_entries * entry_size;
-
- while (lvl_data_size < data_size) {
- lvl++;
-
- if (lvl == TF_PT_LVL_1)
- lvl_data_size = (uint64_t)MAX_PAGE_PTRS(page_size) *
- page_size;
- else if (lvl == TF_PT_LVL_2)
- lvl_data_size = (uint64_t)MAX_PAGE_PTRS(page_size) *
- MAX_PAGE_PTRS(page_size) * page_size;
- else
- return -ENOMEM;
- }
-
- *num_data_pages = roundup(data_size, page_size) / page_size;
-
- return lvl;
-}
-
-/**
- * Size the EM table based on capabilities
- *
- * [in] tbl
- * EM table to size
- *
- * Returns:
- * 0 - Success
- * - EINVAL - Parameter error
- * - ENOMEM - Out of memory
- */
-int
-tf_em_size_table(struct hcapi_cfa_em_table *tbl,
- uint32_t page_size)
-{
- uint64_t num_data_pages;
- uint32_t *page_cnt;
- int max_lvl;
- uint32_t num_entries;
- uint32_t cnt = TF_EM_MIN_ENTRIES;
-
- /* Ignore entry if both size and number are zero */
- if (!tbl->entry_size && !tbl->num_entries)
- return 0;
-
- /* If only one is set then error */
- if (!tbl->entry_size || !tbl->num_entries)
- return -EINVAL;
-
- /* Determine number of page table levels and the number
- * of data pages needed to process the given eem table.
- */
- if (tbl->type == TF_RECORD_TABLE) {
- /*
- * For action records just a memory size is provided. Work
- * backwards to resolve to number of entries
- */
- num_entries = tbl->num_entries / tbl->entry_size;
- if (num_entries < TF_EM_MIN_ENTRIES) {
- num_entries = TF_EM_MIN_ENTRIES;
- } else {
- while (num_entries > cnt && cnt <= TF_EM_MAX_ENTRIES)
- cnt *= 2;
- num_entries = cnt;
- }
- } else {
- num_entries = tbl->num_entries;
- }
-
- max_lvl = tf_em_size_page_tbl_lvl(page_size,
- tbl->entry_size,
- tbl->num_entries,
- &num_data_pages);
- if (max_lvl < 0) {
- TFP_DRV_LOG(WARNING, "EEM: Failed to size page table levels\n");
- TFP_DRV_LOG(WARNING,
- "table: %d data-sz: %016" PRIu64 " page-sz: %u\n",
- tbl->type, (uint64_t)num_entries * tbl->entry_size,
- page_size);
- return -ENOMEM;
- }
-
- tbl->num_lvl = max_lvl + 1;
- tbl->num_data_pages = num_data_pages;
-
- /* Determine the number of pages needed at each level */
- page_cnt = tbl->page_cnt;
- memset(page_cnt, 0, sizeof(tbl->page_cnt));
- tf_em_size_page_tbls(max_lvl, num_data_pages, page_size,
- page_cnt);
-
- TFP_DRV_LOG(INFO, "EEM: Sized page table: %d\n", tbl->type);
- TFP_DRV_LOG(INFO,
- "EEM: lvls: %d sz: %016" PRIu64 " pgs: %016" PRIu64 \
- " l0: %u l1: %u l2: %u\n",
- max_lvl + 1,
- (uint64_t)num_data_pages * page_size,
- num_data_pages,
- page_cnt[TF_PT_LVL_0],
- page_cnt[TF_PT_LVL_1],
- page_cnt[TF_PT_LVL_2]);
-
- return 0;
-}
-
-/**
- * Validates EM number of entries requested
- *
- * [in] tbl_scope_cb
- * Pointer to table scope control block to be populated
- *
- * [in] parms
- * Pointer to input parameters
- *
- * Returns:
- * 0 - Success
- * -EINVAL - Parameter error
- */
-int
-tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb,
- struct tf_alloc_tbl_scope_parms *parms)
-{
- uint32_t cnt;
-
- if (parms->rx_mem_size_in_mb != 0) {
- uint32_t key_b = 2 * ((parms->rx_max_key_sz_in_bits / 8) + 1);
- uint32_t action_b = ((parms->rx_max_action_entry_sz_in_bits / 8)
- + 1);
- uint32_t num_entries = (parms->rx_mem_size_in_mb *
- TF_MEGABYTE) / (key_b + action_b);
-
- if (num_entries < TF_EM_MIN_ENTRIES) {
- TFP_DRV_LOG(ERR, "EEM: Insufficient memory requested:"
- "%uMB\n",
- parms->rx_mem_size_in_mb);
- return -EINVAL;
- }
-
- cnt = TF_EM_MIN_ENTRIES;
- while (num_entries > cnt &&
- cnt <= TF_EM_MAX_ENTRIES)
- cnt *= 2;
-
- if (cnt > TF_EM_MAX_ENTRIES) {
- TFP_DRV_LOG(ERR, "EEM: Invalid number of Tx requested: "
- "%u\n",
- (parms->tx_num_flows_in_k * TF_KILOBYTE));
- return -EINVAL;
- }
-
- parms->rx_num_flows_in_k = cnt / TF_KILOBYTE;
- } else {
- if ((parms->rx_num_flows_in_k * TF_KILOBYTE) <
- TF_EM_MIN_ENTRIES ||
- (parms->rx_num_flows_in_k * TF_KILOBYTE) >
- tbl_scope_cb->em_caps[TF_DIR_RX].max_entries_supported) {
- TFP_DRV_LOG(ERR,
- "EEM: Invalid number of Rx flows "
- "requested:%u max:%u\n",
- parms->rx_num_flows_in_k * TF_KILOBYTE,
- tbl_scope_cb->em_caps[TF_DIR_RX].max_entries_supported);
- return -EINVAL;
- }
-
- /* must be a power-of-2 supported value
- * in the range 32K - 128M
- */
- cnt = TF_EM_MIN_ENTRIES;
- while ((parms->rx_num_flows_in_k * TF_KILOBYTE) != cnt &&
- cnt <= TF_EM_MAX_ENTRIES)
- cnt *= 2;
-
- if (cnt > TF_EM_MAX_ENTRIES) {
- TFP_DRV_LOG(ERR,
- "EEM: Invalid number of Rx requested: %u\n",
- (parms->rx_num_flows_in_k * TF_KILOBYTE));
- return -EINVAL;
- }
- }
-
- if (parms->tx_mem_size_in_mb != 0) {
- uint32_t key_b = 2 * (parms->tx_max_key_sz_in_bits / 8 + 1);
- uint32_t action_b = ((parms->tx_max_action_entry_sz_in_bits / 8)
- + 1);
- uint32_t num_entries = (parms->tx_mem_size_in_mb *
- (TF_KILOBYTE * TF_KILOBYTE)) /
- (key_b + action_b);
-
- if (num_entries < TF_EM_MIN_ENTRIES) {
- TFP_DRV_LOG(ERR,
- "EEM: Insufficient memory requested:%uMB\n",
- parms->rx_mem_size_in_mb);
- return -EINVAL;
- }
-
- cnt = TF_EM_MIN_ENTRIES;
- while (num_entries > cnt &&
- cnt <= TF_EM_MAX_ENTRIES)
- cnt *= 2;
-
- if (cnt > TF_EM_MAX_ENTRIES) {
- TFP_DRV_LOG(ERR,
- "EEM: Invalid number of Tx requested: %u\n",
- (parms->tx_num_flows_in_k * TF_KILOBYTE));
- return -EINVAL;
- }
-
- parms->tx_num_flows_in_k = cnt / TF_KILOBYTE;
- } else {
- if ((parms->tx_num_flows_in_k * TF_KILOBYTE) <
- TF_EM_MIN_ENTRIES ||
- (parms->tx_num_flows_in_k * TF_KILOBYTE) >
- tbl_scope_cb->em_caps[TF_DIR_TX].max_entries_supported) {
- TFP_DRV_LOG(ERR,
- "EEM: Invalid number of Tx flows "
- "requested:%u max:%u\n",
- (parms->tx_num_flows_in_k * TF_KILOBYTE),
- tbl_scope_cb->em_caps[TF_DIR_TX].max_entries_supported);
- return -EINVAL;
- }
-
- cnt = TF_EM_MIN_ENTRIES;
- while ((parms->tx_num_flows_in_k * TF_KILOBYTE) != cnt &&
- cnt <= TF_EM_MAX_ENTRIES)
- cnt *= 2;
-
- if (cnt > TF_EM_MAX_ENTRIES) {
- TFP_DRV_LOG(ERR,
- "EEM: Invalid number of Tx requested: %u\n",
- (parms->tx_num_flows_in_k * TF_KILOBYTE));
- return -EINVAL;
- }
- }
-
- if (parms->rx_num_flows_in_k != 0 &&
- parms->rx_max_key_sz_in_bits / 8 == 0) {
- TFP_DRV_LOG(ERR,
- "EEM: Rx key size required: %u\n",
- (parms->rx_max_key_sz_in_bits));
- return -EINVAL;
- }
-
- if (parms->tx_num_flows_in_k != 0 &&
- parms->tx_max_key_sz_in_bits / 8 == 0) {
- TFP_DRV_LOG(ERR,
- "EEM: Tx key size required: %u\n",
- (parms->tx_max_key_sz_in_bits));
- return -EINVAL;
- }
- /* Rx */
- tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_KEY0_TABLE].num_entries =
- parms->rx_num_flows_in_k * TF_KILOBYTE;
- tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_KEY0_TABLE].entry_size =
- parms->rx_max_key_sz_in_bits / 8;
-
- tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_KEY1_TABLE].num_entries =
- parms->rx_num_flows_in_k * TF_KILOBYTE;
- tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_KEY1_TABLE].entry_size =
- parms->rx_max_key_sz_in_bits / 8;
-
- tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[TF_RECORD_TABLE].num_entries =
- parms->rx_num_flows_in_k * TF_KILOBYTE;
- 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_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 =
- parms->tx_num_flows_in_k * TF_KILOBYTE;
- tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_KEY0_TABLE].entry_size =
- parms->tx_max_key_sz_in_bits / 8;
-
- tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_KEY1_TABLE].num_entries =
- parms->tx_num_flows_in_k * TF_KILOBYTE;
- tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_KEY1_TABLE].entry_size =
- parms->tx_max_key_sz_in_bits / 8;
-
- tbl_scope_cb->em_ctx_info[TF_DIR_TX].em_tables[TF_RECORD_TABLE].num_entries =
- parms->tx_num_flows_in_k * TF_KILOBYTE;
- 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_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;
-}
-
-/** insert EEM entry API
- *
- * returns:
- * 0
- * TF_ERR - unable to get lock
- *
- * insert callback returns:
- * 0
- * TF_ERR_EM_DUP - key is already in table
- */
-static int
-tf_insert_eem_entry(struct tf_dev_info *dev,
- struct tf_tbl_scope_cb *tbl_scope_cb,
- struct tf_insert_em_entry_parms *parms)
-{
- uint32_t mask;
- uint32_t key0_hash;
- uint32_t key1_hash;
- uint32_t key0_index;
- uint32_t key1_index;
- struct cfa_p4_eem_64b_entry key_entry;
- uint32_t index;
- enum hcapi_cfa_em_table_type table_type;
- uint32_t gfid;
- 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;
- uint64_t big_hash;
- int rc;
-
- /* Get mask to use on hash */
- mask = tf_em_get_key_mask(tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_KEY0_TABLE].num_entries);
-
- if (!mask)
- return -EINVAL;
-
- if (dev->ops->tf_dev_cfa_key_hash == NULL)
- return -EINVAL;
-
- big_hash = dev->ops->tf_dev_cfa_key_hash((uint64_t *)parms->key,
- (TF_P4_HW_EM_KEY_MAX_SIZE + 4) * 8);
- key0_hash = (uint32_t)(big_hash >> 32);
- key1_hash = (uint32_t)(big_hash & 0xFFFFFFFF);
-
- key0_index = key0_hash & mask;
- key1_index = key1_hash & mask;
-
- /*
- * Use the "result" arg to populate all of the key entry then
- * store the byte swapped "raw" entry in a local copy ready
- * for insertion in to the table.
- */
- tf_em_create_key_entry((struct cfa_p4_eem_entry_hdr *)parms->em_record,
- ((uint8_t *)parms->key),
- &key_entry);
-
- /*
- * Try to add to Key0 table, if that does not work then
- * try the key1 table.
- */
- index = key0_index;
- op.opcode = HCAPI_CFA_HWOPS_ADD;
- key_tbl.base0 =
- (uint8_t *)&tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_KEY0_TABLE];
- key_tbl.page_size = TF_EM_PAGE_SIZE;
- key_obj.offset = index * TF_P4_EM_KEY_RECORD_SIZE;
- key_obj.data = (uint8_t *)&key_entry;
- key_obj.size = TF_P4_EM_KEY_RECORD_SIZE;
-
- rc = cfa_p4_devops.hcapi_cfa_key_hw_op(&op,
- &key_tbl,
- &key_obj,
- &key_loc);
-
- if (rc == 0) {
- table_type = TF_KEY0_TABLE;
- } else {
- index = key1_index;
-
- key_tbl.base0 =
- (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 = cfa_p4_devops.hcapi_cfa_key_hw_op(&op,
- &key_tbl,
- &key_obj,
- &key_loc);
- if (rc != 0)
- return rc;
-
- table_type = TF_KEY1_TABLE;
- }
-
- TF_SET_GFID(gfid,
- index,
- table_type);
- TF_SET_FLOW_ID(parms->flow_id,
- gfid,
- TF_GFID_TABLE_EXTERNAL,
- parms->dir);
- TF_SET_FIELDS_IN_FLOW_HANDLE(parms->flow_handle,
- 0,
- 0,
- 0,
- index,
- 0,
- table_type);
-
- return 0;
-}
-
-/** delete EEM hash entry API
- *
- * returns:
- * 0
- * -EINVAL - parameter error
- * TF_NO_SESSION - bad session ID
- * TF_ERR_TBL_SCOPE - invalid table scope
- * TF_ERR_TBL_IF - invalid table interface
- *
- * insert callback returns
- * 0
- * TF_NO_EM_MATCH - entry not found
- */
-static int
-tf_delete_eem_entry(struct tf_tbl_scope_cb *tbl_scope_cb,
- struct tf_delete_em_entry_parms *parms)
-{
- enum hcapi_cfa_em_table_type hash_type;
- uint32_t index;
- 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;
-
- TF_GET_HASH_TYPE_FROM_FLOW_HANDLE(parms->flow_handle, hash_type);
- TF_GET_INDEX_FROM_FLOW_HANDLE(parms->flow_handle, index);
-
- op.opcode = HCAPI_CFA_HWOPS_DEL;
- key_tbl.base0 =
- (uint8_t *)&tbl_scope_cb->em_ctx_info[parms->dir].em_tables
- [(hash_type == 0 ? TF_KEY0_TABLE : TF_KEY1_TABLE)];
- key_tbl.page_size = TF_EM_PAGE_SIZE;
- key_obj.offset = index * TF_P4_EM_KEY_RECORD_SIZE;
- key_obj.data = NULL;
- key_obj.size = TF_P4_EM_KEY_RECORD_SIZE;
-
- rc = cfa_p4_devops.hcapi_cfa_key_hw_op(&op,
- &key_tbl,
- &key_obj,
- &key_loc);
-
- if (!rc)
- return rc;
-
- return 0;
-}
-
-/** insert EM hash entry API
- *
- * returns:
- * 0 - Success
- * -EINVAL - Error
- */
-int
-tf_em_insert_ext_entry(struct tf *tfp,
- struct tf_insert_em_entry_parms *parms)
-{
- int rc;
- struct tf_tbl_scope_cb *tbl_scope_cb;
- struct tf_session *tfs;
- struct tf_dev_info *dev;
-
- 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;
- }
-
- /* Retrieve the session information */
- rc = tf_session_get_session_internal(tfp, &tfs);
- if (rc)
- return rc;
-
- /* Retrieve the device information */
- rc = tf_session_get_device(tfs, &dev);
- if (rc)
- return rc;
-
- return tf_insert_eem_entry
- (dev,
- tbl_scope_cb,
- parms);
-}
-
-/** Delete EM hash entry API
- *
- * returns:
- * 0 - Success
- * -EINVAL - Error
- */
-int
-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 = 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;
- }
-
- return tf_delete_eem_entry(tbl_scope_cb, parms);
-}
-
-int
-tf_em_ext_common_bind(struct tf *tfp,
- struct tf_em_cfg_parms *parms)
-{
- int rc;
- int i;
- struct tf_rm_create_db_parms db_cfg = { 0 };
- struct em_ext_db *ext_db;
- struct tfp_calloc_parms cparms;
-
- TF_CHECK_PARMS2(tfp, parms);
-
- 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;
-
- for (i = 0; i < TF_DIR_MAX; i++) {
- db_cfg.dir = i;
- db_cfg.alloc_cnt = parms->resources->em_cnt[i].cnt;
-
- /* Check if we got any request to support EEM, if so
- * we build an EM Ext DB holding Table Scopes.
- */
- if (db_cfg.alloc_cnt[TF_EM_TBL_TYPE_TBL_SCOPE] == 0)
- continue;
-
- db_cfg.rm_db = (void *)&ext_db->eem_db[i];
- rc = tf_rm_create_db(tfp, &db_cfg);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "%s: EM Ext DB creation failed\n",
- tf_dir_2_str(i));
-
- return rc;
- }
- }
-
- mem_type = parms->mem_type;
-
- return 0;
-}
-
-int
-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);
-
- 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;
- if (ext_db != NULL) {
- 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 = ext_db->eem_db[i];
- rc = tf_rm_free_db(tfp, &fparms);
- if (rc)
- return rc;
-
- ext_db->eem_db[i] = NULL;
- }
-
- tfp_free(ext_db);
- }
-
- tf_session_set_em_ext_db(tfp, NULL);
-
- return 0;
-}
-
-/**
- * Sets the specified external table type element.
- *
- * This API sets the specified element data
- *
- * [in] tfp
- * Pointer to TF handle
- *
- * [in] parms
- * Pointer to table set parameters
- *
- * Returns
- * - (0) if successful.
- * - (-EINVAL) on failure.
- */
-int tf_tbl_ext_common_set(struct tf *tfp,
- struct tf_tbl_set_parms *parms)
-{
- int rc = 0;
- struct tf_tbl_scope_cb *tbl_scope_cb;
- uint32_t tbl_scope_id;
- 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;
-
- TF_CHECK_PARMS2(tfp, parms);
-
- if (parms->data == NULL) {
- TFP_DRV_LOG(ERR,
- "%s, invalid parms->data\n",
- tf_dir_2_str(parms->dir));
- return -EINVAL;
- }
-
- tbl_scope_id = parms->tbl_scope_id;
-
- if (tbl_scope_id == TF_TBL_SCOPE_INVALID) {
- TFP_DRV_LOG(ERR,
- "%s, Table scope not allocated\n",
- tf_dir_2_str(parms->dir));
- return -EINVAL;
- }
-
- 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",
- tf_dir_2_str(parms->dir));
- return -EINVAL;
- }
-
- op.opcode = HCAPI_CFA_HWOPS_PUT;
- key_tbl.base0 =
- (uint8_t *)&tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_RECORD_TABLE];
- key_tbl.page_size = TF_EM_PAGE_SIZE;
- key_obj.offset = parms->idx;
- key_obj.data = parms->data;
- key_obj.size = parms->data_sz_in_bytes;
-
- rc = cfa_p4_devops.hcapi_cfa_key_hw_op(&op,
- &key_tbl,
- &key_obj,
- &key_loc);
-
- return rc;
-}
-
-int
-tf_em_ext_common_alloc(struct tf *tfp,
- struct tf_alloc_tbl_scope_parms *parms)
-{
- return tf_em_ext_alloc(tfp, parms);
-}
-
-int
-tf_em_ext_common_free(struct tf *tfp,
- struct tf_free_tbl_scope_parms *parms)
-{
- return tf_em_ext_free(tfp, parms);
-}
-
-int tf_em_ext_map_tbl_scope(struct tf *tfp,
- struct tf_map_tbl_scope_parms *parms)
-{
- int rc = 0;
- struct tf_session *tfs;
- struct tf_tbl_scope_cb *tbl_scope_cb;
- struct tf_global_cfg_parms gcfg_parms = { 0 };
- struct tfp_calloc_parms aparms;
- uint32_t *data, *mask;
- uint32_t sz_in_bytes = 8;
- struct tf_dev_info *dev;
-
- /* Retrieve the session information */
- rc = tf_session_get_session_internal(tfp, &tfs);
- if (rc)
- return rc;
-
- /* Retrieve the device information */
- rc = tf_session_get_device(tfs, &dev);
- 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,
- "Map table scope operation not supported, rc:%s\n",
- strerror(-rc));
- return rc;
- }
-
- aparms.nitems = 2;
- aparms.size = sizeof(uint32_t);
- aparms.alignment = 0;
-
- if (tfp_calloc(&aparms) != 0) {
- TFP_DRV_LOG(ERR, "Map tbl scope alloc data error %s\n",
- strerror(ENOMEM));
- return -ENOMEM;
- }
- data = aparms.mem_va;
-
- if (tfp_calloc(&aparms) != 0) {
- TFP_DRV_LOG(ERR, "Map tbl scope alloc mask error %s\n",
- strerror(ENOMEM));
- rc = -ENOMEM;
- goto clean;
- }
- mask = aparms.mem_va;
-
- rc = dev->ops->tf_dev_map_parif(tfp, parms->parif_bitmask,
- tbl_scope_cb->pf,
- (uint8_t *)data, (uint8_t *)mask,
- sz_in_bytes);
-
- if (rc) {
- TFP_DRV_LOG(ERR,
- "Map table scope config failure, rc:%s\n",
- strerror(-rc));
- goto cleaner;
- }
-
- /* Note that TF_GLOBAL_CFG_INTERNAL_PARIF_2_PF is same as below enum */
- gcfg_parms.type = TF_GLOBAL_CFG_TYPE_MAX;
- gcfg_parms.offset = 0;
- gcfg_parms.config = (uint8_t *)data;
- gcfg_parms.config_mask = (uint8_t *)mask;
- gcfg_parms.config_sz_in_bytes = sizeof(uint64_t);
-
- rc = tf_msg_set_global_cfg(tfp, &gcfg_parms);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "Map tbl scope, set failed, rc:%s\n",
- strerror(-rc));
- }
-cleaner:
- tfp_free(mask);
-clean:
- tfp_free(data);
-
- return rc;
-}
@@ -6,6 +6,7 @@
#ifndef _TF_EM_COMMON_H_
#define _TF_EM_COMMON_H_
+#include "hcapi_cfa_defs.h"
#include "tf_core.h"
#include "tf_session.h"
#include "ll.h"
@@ -21,577 +21,3 @@
#include "tf_ext_flow_handle.h"
#include "bnxt.h"
-
-#define PTU_PTE_VALID 0x1UL
-#define PTU_PTE_LAST 0x2UL
-#define PTU_PTE_NEXT_TO_LAST 0x4UL
-
-/* Number of pointers per page_size */
-#define MAX_PAGE_PTRS(page_size) ((page_size) / sizeof(void *))
-
-/**
- * Function to free a page table
- *
- * [in] tp
- * Pointer to the page table to free
- */
-static void
-tf_em_free_pg_tbl(struct hcapi_cfa_em_page_tbl *tp)
-{
- uint32_t i;
-
- for (i = 0; i < tp->pg_count; i++) {
- if (!tp->pg_va_tbl[i]) {
- TFP_DRV_LOG(WARNING,
- "No mapping for page: %d table: %016" PRIu64 "\n",
- i,
- (uint64_t)(uintptr_t)tp);
- continue;
- }
-
- tfp_free(tp->pg_va_tbl[i]);
- tp->pg_va_tbl[i] = NULL;
- }
-
- tp->pg_count = 0;
- tfp_free(tp->pg_va_tbl);
- tp->pg_va_tbl = NULL;
- tfp_free(tp->pg_pa_tbl);
- tp->pg_pa_tbl = NULL;
-}
-
-/**
- * Function to free an EM table
- *
- * [in] tbl
- * Pointer to the EM table to free
- */
-static void
-tf_em_free_page_table(struct hcapi_cfa_em_table *tbl)
-{
- struct hcapi_cfa_em_page_tbl *tp;
- int i;
-
- for (i = 0; i < tbl->num_lvl; i++) {
- tp = &tbl->pg_tbl[i];
- TFP_DRV_LOG(INFO,
- "EEM: Freeing page table: size %u lvl %d cnt %u\n",
- TF_EM_PAGE_SIZE,
- i,
- tp->pg_count);
-
- tf_em_free_pg_tbl(tp);
- }
-
- tbl->l0_addr = NULL;
- tbl->l0_dma_addr = 0;
- tbl->num_lvl = 0;
- tbl->num_data_pages = 0;
-}
-
-/**
- * Allocation of page tables
- *
- * [in] tfp
- * Pointer to a TruFlow handle
- *
- * [in] pg_count
- * Page count to allocate
- *
- * [in] pg_size
- * Size of each page
- *
- * Returns:
- * 0 - Success
- * -ENOMEM - Out of memory
- */
-static int
-tf_em_alloc_pg_tbl(struct hcapi_cfa_em_page_tbl *tp,
- uint32_t pg_count,
- uint32_t pg_size)
-{
- uint32_t i;
- struct tfp_calloc_parms parms;
-
- parms.nitems = pg_count;
- parms.size = sizeof(void *);
- parms.alignment = 0;
-
- if (tfp_calloc(&parms) != 0)
- return -ENOMEM;
-
- tp->pg_va_tbl = parms.mem_va;
-
- if (tfp_calloc(&parms) != 0) {
- tfp_free(tp->pg_va_tbl);
- return -ENOMEM;
- }
-
- tp->pg_pa_tbl = parms.mem_va;
-
- tp->pg_count = 0;
- tp->pg_size = pg_size;
-
- for (i = 0; i < pg_count; i++) {
- parms.nitems = 1;
- parms.size = pg_size;
- parms.alignment = TF_EM_PAGE_ALIGNMENT;
-
- if (tfp_calloc(&parms) != 0)
- goto cleanup;
-
- tp->pg_pa_tbl[i] = (uintptr_t)parms.mem_pa;
- tp->pg_va_tbl[i] = parms.mem_va;
-
- memset(tp->pg_va_tbl[i], 0, pg_size);
- tp->pg_count++;
- }
-
- return 0;
-
-cleanup:
- tf_em_free_pg_tbl(tp);
- return -ENOMEM;
-}
-
-/**
- * Allocates EM page tables
- *
- * [in] tbl
- * Table to allocate pages for
- *
- * Returns:
- * 0 - Success
- * -ENOMEM - Out of memory
- */
-static int
-tf_em_alloc_page_table(struct hcapi_cfa_em_table *tbl)
-{
- struct hcapi_cfa_em_page_tbl *tp;
- int rc = 0;
- int i;
- uint32_t j;
-
- for (i = 0; i < tbl->num_lvl; i++) {
- tp = &tbl->pg_tbl[i];
-
- rc = tf_em_alloc_pg_tbl(tp,
- tbl->page_cnt[i],
- TF_EM_PAGE_SIZE);
- if (rc) {
- TFP_DRV_LOG(WARNING,
- "Failed to allocate page table: lvl: %d, rc:%s\n",
- i,
- strerror(-rc));
- goto cleanup;
- }
-
- for (j = 0; j < tp->pg_count; j++) {
- TFP_DRV_LOG(INFO,
- "EEM: Allocated page table: size %u lvl %d cnt"
- " %u VA:%p PA:%p\n",
- TF_EM_PAGE_SIZE,
- i,
- tp->pg_count,
- (void *)(uintptr_t)tp->pg_va_tbl[j],
- (void *)(uintptr_t)tp->pg_pa_tbl[j]);
- }
- }
- return rc;
-
-cleanup:
- tf_em_free_page_table(tbl);
- return rc;
-}
-
-/**
- * Links EM page tables
- *
- * [in] tp
- * Pointer to page table
- *
- * [in] tp_next
- * Pointer to the next page table
- *
- * [in] set_pte_last
- * Flag controlling if the page table is last
- */
-static void
-tf_em_link_page_table(struct hcapi_cfa_em_page_tbl *tp,
- struct hcapi_cfa_em_page_tbl *tp_next,
- bool set_pte_last)
-{
- uint64_t *pg_pa = tp_next->pg_pa_tbl;
- uint64_t *pg_va;
- uint64_t valid;
- uint32_t k = 0;
- uint32_t i;
- uint32_t j;
-
- for (i = 0; i < tp->pg_count; i++) {
- pg_va = tp->pg_va_tbl[i];
-
- for (j = 0; j < MAX_PAGE_PTRS(tp->pg_size); j++) {
- if (k == tp_next->pg_count - 2 && set_pte_last)
- valid = PTU_PTE_NEXT_TO_LAST | PTU_PTE_VALID;
- else if (k == tp_next->pg_count - 1 && set_pte_last)
- valid = PTU_PTE_LAST | PTU_PTE_VALID;
- else
- valid = PTU_PTE_VALID;
-
- pg_va[j] = tfp_cpu_to_le_64(pg_pa[k] | valid);
- if (++k >= tp_next->pg_count)
- return;
- }
- }
-}
-
-/**
- * Setup a EM page table
- *
- * [in] tbl
- * Pointer to EM page table
- */
-static void
-tf_em_setup_page_table(struct hcapi_cfa_em_table *tbl)
-{
- struct hcapi_cfa_em_page_tbl *tp_next;
- struct hcapi_cfa_em_page_tbl *tp;
- bool set_pte_last = 0;
- int i;
-
- for (i = 0; i < tbl->num_lvl - 1; i++) {
- tp = &tbl->pg_tbl[i];
- tp_next = &tbl->pg_tbl[i + 1];
- if (i == tbl->num_lvl - 2)
- set_pte_last = 1;
- tf_em_link_page_table(tp, tp_next, set_pte_last);
- }
-
- tbl->l0_addr = tbl->pg_tbl[TF_PT_LVL_0].pg_va_tbl[0];
- tbl->l0_dma_addr = tbl->pg_tbl[TF_PT_LVL_0].pg_pa_tbl[0];
-}
-
-/**
- * Unregisters EM Ctx in Firmware
- *
- * [in] tfp
- * Pointer to a TruFlow handle
- *
- * [in] tbl_scope_cb
- * Pointer to a table scope control block
- *
- * [in] dir
- * Receive or transmit direction
- */
-static void
-tf_em_ctx_unreg(struct tf *tfp,
- struct tf_tbl_scope_cb *tbl_scope_cb,
- int dir)
-{
- struct hcapi_cfa_em_ctx_mem_info *ctxp = &tbl_scope_cb->em_ctx_info[dir];
- struct hcapi_cfa_em_table *tbl;
- int i;
-
- for (i = TF_KEY0_TABLE; i < TF_MAX_TABLE; i++) {
- tbl = &ctxp->em_tables[i];
-
- if (tbl->num_entries != 0 && tbl->entry_size != 0) {
- tf_msg_em_mem_unrgtr(tfp, &tbl->ctx_id);
- tf_em_free_page_table(tbl);
- }
- }
-}
-
-/**
- * Registers EM Ctx in Firmware
- *
- * [in] tfp
- * Pointer to a TruFlow handle
- *
- * [in] tbl_scope_cb
- * Pointer to a table scope control block
- *
- * [in] dir
- * Receive or transmit direction
- *
- * Returns:
- * 0 - Success
- * -ENOMEM - Out of Memory
- */
-static int
-tf_em_ctx_reg(struct tf *tfp,
- struct tf_tbl_scope_cb *tbl_scope_cb,
- int dir)
-{
- struct hcapi_cfa_em_ctx_mem_info *ctxp = &tbl_scope_cb->em_ctx_info[dir];
- struct hcapi_cfa_em_table *tbl;
- int rc = 0;
- int i;
-
- for (i = TF_KEY0_TABLE; i < TF_MAX_TABLE; i++) {
- tbl = &ctxp->em_tables[i];
-
- if (tbl->num_entries && tbl->entry_size) {
- rc = tf_em_size_table(tbl, TF_EM_PAGE_SIZE);
-
- if (rc)
- goto cleanup;
-
- rc = tf_em_alloc_page_table(tbl);
- if (rc)
- goto cleanup;
-
- tf_em_setup_page_table(tbl);
- rc = tf_msg_em_mem_rgtr(tfp,
- tbl->num_lvl - 1,
- TF_EM_PAGE_SIZE_ENUM,
- tbl->l0_dma_addr,
- &tbl->ctx_id);
- if (rc)
- goto cleanup;
- }
- }
- return rc;
-
-cleanup:
- tf_em_ctx_unreg(tfp, tbl_scope_cb, dir);
- return rc;
-}
-
-int
-tf_em_ext_alloc(struct tf *tfp,
- struct tf_alloc_tbl_scope_parms *parms)
-{
- int rc;
- enum tf_dir dir;
- struct tf_tbl_scope_cb *tbl_scope_cb;
- struct hcapi_cfa_em_table *em_tables;
- 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 = 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");
- goto cleanup;
- }
-
- /* 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,
- "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,
- &tbl_scope_cb->em_caps[dir]);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "EEM: Unable to query for EEM capability,"
- " rc:%s\n",
- strerror(-rc));
- goto cleanup_ts;
- }
- }
-
- /*
- * Validate and setup table sizes
- */
- if (tf_em_validate_num_entries(tbl_scope_cb, parms))
- goto cleanup_ts;
-
- for (dir = 0; dir < TF_DIR_MAX; dir++) {
- /*
- * Allocate tables and signal configuration to FW
- */
- rc = tf_em_ctx_reg(tfp, tbl_scope_cb, dir);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "EEM: Unable to register for EEM ctx,"
- " rc:%s\n",
- strerror(-rc));
- goto cleanup_ts;
- }
-
- em_tables = tbl_scope_cb->em_ctx_info[dir].em_tables;
- rc = tf_msg_em_cfg(tfp,
- em_tables[TF_KEY0_TABLE].num_entries,
- em_tables[TF_KEY0_TABLE].ctx_id,
- em_tables[TF_KEY1_TABLE].ctx_id,
- em_tables[TF_RECORD_TABLE].ctx_id,
- em_tables[TF_EFC_TABLE].ctx_id,
- parms->hw_flow_cache_flush_timer,
- dir);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "TBL: Unable to configure EEM in firmware"
- " rc:%s\n",
- strerror(-rc));
- goto cleanup_full;
- }
-
- rc = tf_msg_em_op(tfp,
- dir,
- HWRM_TF_EXT_EM_OP_INPUT_OP_EXT_EM_ENABLE);
-
- if (rc) {
- TFP_DRV_LOG(ERR,
- "EEM: Unable to enable EEM in firmware"
- " rc:%s\n",
- strerror(-rc));
- goto cleanup_full;
- }
-
- /* Allocate the pool of offsets of the external memory.
- * Initially, this is a single fixed size pool for all external
- * actions related to a single table scope.
- */
- rc = tf_create_tbl_pool_external(dir,
- tbl_scope_cb,
- em_tables[TF_RECORD_TABLE].num_entries,
- em_tables[TF_RECORD_TABLE].entry_size);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "%s TBL: Unable to allocate idx pools %s\n",
- tf_dir_2_str(dir),
- strerror(-rc));
- goto cleanup_full;
- }
- }
-
- /* 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 = ext_db->eem_db[TF_DIR_RX];
- fparms.subtype = TF_EM_TBL_TYPE_TBL_SCOPE;
- fparms.index = parms->tbl_scope_id;
- rc = tf_rm_free(&fparms);
- if (rc)
- TFP_DRV_LOG(ERR, "Failed to free table scope\n");
-
- return -EINVAL;
-}
-
-int
-tf_em_ext_free(struct tf *tfp,
- struct tf_free_tbl_scope_parms *parms)
-{
- 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 };
-
- 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 = 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);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "Failed to free table scope\n");
- }
-
- /* free table scope locks */
- for (dir = 0; dir < TF_DIR_MAX; dir++) {
- /* Free associated external pools
- */
- tf_destroy_tbl_pool_external(dir,
- tbl_scope_cb);
- tf_msg_em_op(tfp,
- dir,
- HWRM_TF_EXT_EM_OP_INPUT_OP_EXT_EM_DISABLE);
-
- /* free table scope and all associated resources */
- tf_em_ctx_unreg(tfp, tbl_scope_cb, dir);
- }
-
- /* 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;
-}
@@ -1100,471 +1100,6 @@ tf_msg_move_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(tf_session_get_bp(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(tf_session_get_bp(tfp), &parms);
-
- return rc;
-}
-
-int
-tf_msg_em_mem_rgtr(struct tf *tfp,
- int page_lvl,
- int page_size,
- uint64_t dma_addr,
- uint16_t *ctx_id)
-{
- int rc;
- struct hwrm_tf_ctxt_mem_rgtr_input req = { 0 };
- struct hwrm_tf_ctxt_mem_rgtr_output resp = { 0 };
- 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);
- 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;
- }
- 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);
-
- parms.tf_type = HWRM_TF_CTXT_MEM_RGTR;
- 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(tf_session_get_bp(tfp),
- &parms);
- if (rc)
- return rc;
-
- *ctx_id = tfp_le_to_cpu_16(resp.ctx_id);
-
- return rc;
-}
-
-int
-tf_msg_em_mem_unrgtr(struct tf *tfp,
- uint16_t *ctx_id)
-{
- int rc;
- struct hwrm_tf_ctxt_mem_unrgtr_input req = {0};
- struct hwrm_tf_ctxt_mem_unrgtr_output resp = {0};
- 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);
- 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;
- }
-
- 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;
- 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(tf_session_get_bp(tfp),
- &parms);
- return rc;
-}
-
-int
-tf_msg_em_qcaps(struct tf *tfp,
- int dir,
- struct tf_em_caps *em_caps)
-{
- int rc;
- struct hwrm_tf_ext_em_qcaps_input req = {0};
- struct hwrm_tf_ext_em_qcaps_output resp = { 0 };
- uint32_t flags;
- 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);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "%s: Failed to lookup session, rc:%s\n",
- tf_dir_2_str(dir),
- 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);
- if (rc) {
- TFP_DRV_LOG(ERR,
- "%s: Failed to lookup device, rc:%s\n",
- tf_dir_2_str(dir),
- strerror(-rc));
- return rc;
- }
-
- flags = (dir == TF_DIR_TX ? HWRM_TF_EXT_EM_QCAPS_INPUT_FLAGS_DIR_TX :
- HWRM_TF_EXT_EM_QCAPS_INPUT_FLAGS_DIR_RX);
- 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;
- parms.resp_size = sizeof(resp);
- parms.mailbox = dev->ops->tf_dev_get_mailbox();
-
- rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
- &parms);
- if (rc)
- return rc;
-
- em_caps->supported = tfp_le_to_cpu_32(resp.supported);
- em_caps->max_entries_supported =
- tfp_le_to_cpu_32(resp.max_entries_supported);
- em_caps->key_entry_size = tfp_le_to_cpu_16(resp.key_entry_size);
- em_caps->record_entry_size =
- tfp_le_to_cpu_16(resp.record_entry_size);
- em_caps->efc_entry_size = tfp_le_to_cpu_16(resp.efc_entry_size);
-
- return rc;
-}
-
-int
-tf_msg_em_cfg(struct tf *tfp,
- uint32_t num_entries,
- uint16_t key0_ctx_id,
- uint16_t key1_ctx_id,
- uint16_t record_ctx_id,
- uint16_t efc_ctx_id,
- uint8_t flush_interval,
- int dir)
-{
- int rc;
- struct hwrm_tf_ext_em_cfg_input req = {0};
- struct hwrm_tf_ext_em_cfg_output resp = {0};
- uint32_t flags;
- struct tfp_send_msg_parms parms = { 0 };
- struct tf_dev_info *dev;
- struct tf_session *tfs;
-
- /* 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;
- }
-
- 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(num_entries);
-
- req.flush_interval = flush_interval;
-
- req.key0_ctx_id = tfp_cpu_to_le_16(key0_ctx_id);
- req.key1_ctx_id = tfp_cpu_to_le_16(key1_ctx_id);
- req.record_ctx_id = tfp_cpu_to_le_16(record_ctx_id);
- req.efc_ctx_id = tfp_cpu_to_le_16(efc_ctx_id);
-
- 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(tf_session_get_bp(tfp),
- &parms);
- 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(tf_session_get_bp(tfp),
- &parms);
- return rc;
-}
-
-int
-tf_msg_em_op(struct tf *tfp,
- int dir,
- uint16_t op)
-{
- int rc;
- struct hwrm_tf_ext_em_op_input req = {0};
- struct hwrm_tf_ext_em_op_output resp = {0};
- uint32_t flags;
- struct tfp_send_msg_parms parms = { 0 };
- struct tf_dev_info *dev;
- struct tf_session *tfs;
-
- /* 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;
- }
-
- flags = (dir == TF_DIR_TX ? HWRM_TF_EXT_EM_CFG_INPUT_FLAGS_DIR_TX :
- HWRM_TF_EXT_EM_CFG_INPUT_FLAGS_DIR_RX);
- req.flags = tfp_cpu_to_le_32(flags);
- req.op = tfp_cpu_to_le_16(op);
-
- parms.tf_type = HWRM_TF_EXT_EM_OP;
- 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(tf_session_get_bp(tfp),
- &parms);
- return rc;
-}
-
int
tf_msg_tcam_entry_set(struct tf *tfp,
struct tf_dev_info *dev,
@@ -261,7 +261,6 @@ tf_tcam_unbind(struct tf *tfp)
tcam_db->tcam_db[i] = NULL;
}
-
}
rc = tf_tcam_mgr_unbind_msg(tfp, dev);