From be19e7fe871af8e76dd98dd768f7e7defadfd5fe Mon Sep 17 00:00:00 2001 From: Peter Spreadborough Date: Wed, 15 Jul 2020 19:20:29 +0530 Subject: [PATCH] net/bnxt: delay EEM sysmem mapping - The mapping of kernel pages for EEM sysmem operation takes a significant amount of time. This change give the build option to delay the sysmem mapping until the first write to EEM Signed-off-by: Peter Spreadborough Signed-off-by: Somnath Kotur Reviewed-by: Randy Schacher --- drivers/net/bnxt/tf_core/tf_core.c | 17 ++++++++-- drivers/net/bnxt/tf_core/tf_em.h | 11 ++++++ drivers/net/bnxt/tf_core/tf_em_common.c | 41 +++++++++++++++++++++++ drivers/net/bnxt/tf_core/tf_em_internal.c | 2 +- drivers/net/bnxt/tf_core/tf_em_system.c | 6 ++-- 5 files changed, 72 insertions(+), 5 deletions(-) diff --git a/drivers/net/bnxt/tf_core/tf_core.c b/drivers/net/bnxt/tf_core/tf_core.c index 00b2775edd..a404cb8c78 100644 --- a/drivers/net/bnxt/tf_core/tf_core.c +++ b/drivers/net/bnxt/tf_core/tf_core.c @@ -49,9 +49,22 @@ tf_open_session(struct tf *tfp, &slot, &device); if (rc != 4) { - TFP_DRV_LOG(ERR, + /* PCI Domain not provided (optional in DPDK), thus we + * force domain to 0 and recheck. + */ + domain = 0; + + /* Check parsing of bus/slot/device */ + rc = sscanf(parms->ctrl_chan_name, + "%x:%x.%d", + &bus, + &slot, + &device); + if (rc != 3) { + TFP_DRV_LOG(ERR, "Failed to scan device ctrl_chan_name\n"); - return -EINVAL; + return -EINVAL; + } } parms->session_id.internal.domain = domain; diff --git a/drivers/net/bnxt/tf_core/tf_em.h b/drivers/net/bnxt/tf_core/tf_em.h index 089026178e..ae2e64dd74 100644 --- a/drivers/net/bnxt/tf_core/tf_em.h +++ b/drivers/net/bnxt/tf_core/tf_em.h @@ -9,6 +9,16 @@ #include "tf_core.h" #include "tf_session.h" +#ifdef TF_USE_SYSTEM_MEM +/** + * Select EEM sysmem mmap export to be done at init + * or on the first write to EEM. + */ +#define TF_EM_SYSMEM_DELAY_EXPORT 1 +#else +#define TF_EM_SYSMEM_DELAY_EXPORT 0 +#endif + #define SUPPORT_CFA_HW_P4 1 #define SUPPORT_CFA_HW_P58 0 #define SUPPORT_CFA_HW_P59 0 @@ -482,4 +492,5 @@ 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); #endif /* _TF_EM_H_ */ diff --git a/drivers/net/bnxt/tf_core/tf_em_common.c b/drivers/net/bnxt/tf_core/tf_em_common.c index 8b02b8ba3e..65b9abf4d6 100644 --- a/drivers/net/bnxt/tf_core/tf_em_common.c +++ b/drivers/net/bnxt/tf_core/tf_em_common.c @@ -700,6 +700,26 @@ tf_insert_eem_entry(struct tf_tbl_scope_cb *tbl_scope_cb, uint64_t big_hash; int rc; +#if (TF_EM_SYSMEM_DELAY_EXPORT == 1) + if (!tbl_scope_cb->valid) { + rc = offload_system_mmap(tbl_scope_cb); + + if (rc) { + struct tf_rm_free_parms fparms = { 0 }; + + TFP_DRV_LOG(ERR, + "System alloc mmap failed\n"); + /* Free Table control block */ + fparms.rm_db = eem_db[TF_DIR_RX]; + fparms.db_index = TF_EM_TBL_TYPE_TBL_SCOPE; + fparms.index = parms->tbl_scope_id; + tf_rm_free(&fparms); + return -EINVAL; + } + + tbl_scope_cb->valid = true; + } +#endif /* 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); @@ -1017,6 +1037,27 @@ int tf_tbl_ext_common_set(struct tf *tfp, return -EINVAL; } +#if (TF_EM_SYSMEM_DELAY_EXPORT == 1) + if (!tbl_scope_cb->valid) { + rc = offload_system_mmap(tbl_scope_cb); + + if (rc) { + struct tf_rm_free_parms fparms = { 0 }; + + TFP_DRV_LOG(ERR, + "System alloc mmap failed\n"); + /* Free Table control block */ + fparms.rm_db = eem_db[TF_DIR_RX]; + fparms.db_index = TF_EM_TBL_TYPE_TBL_SCOPE; + fparms.index = parms->tbl_scope_id; + tf_rm_free(&fparms); + return -EINVAL; + } + + tbl_scope_cb->valid = true; + } +#endif + op.opcode = HCAPI_CFA_HWOPS_PUT; key_tbl.base0 = (uint8_t *)&tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_RECORD_TABLE]; diff --git a/drivers/net/bnxt/tf_core/tf_em_internal.c b/drivers/net/bnxt/tf_core/tf_em_internal.c index 3129fbe317..462d0fa769 100644 --- a/drivers/net/bnxt/tf_core/tf_em_internal.c +++ b/drivers/net/bnxt/tf_core/tf_em_internal.c @@ -179,7 +179,7 @@ tf_em_insert_int_entry(struct tf *tfp, return -1; PMD_DRV_LOG - (ERR, + (DEBUG, "%s, Internal entry @ Index:%d rptr_index:0x%x rptr_entry:0x%x num_of_entries:%d\n", tf_dir_2_str(parms->dir), index, diff --git a/drivers/net/bnxt/tf_core/tf_em_system.c b/drivers/net/bnxt/tf_core/tf_em_system.c index 339392c609..1c3c7029d4 100644 --- a/drivers/net/bnxt/tf_core/tf_em_system.c +++ b/drivers/net/bnxt/tf_core/tf_em_system.c @@ -272,8 +272,7 @@ tf_prepare_dmabuf_bnxt_lfc_device(struct tf_tbl_scope_cb *tbl_scope_cb) return 0; } -static int -offload_system_mmap(struct tf_tbl_scope_cb *tbl_scope_cb) +int offload_system_mmap(struct tf_tbl_scope_cb *tbl_scope_cb) { int rc; int dmabuf_fd; @@ -455,6 +454,7 @@ tf_em_ext_alloc(struct tf *tfp, } } +#if (TF_EM_SYSMEM_DELAY_EXPORT == 0) rc = offload_system_mmap(tbl_scope_cb); if (rc) { @@ -462,6 +462,7 @@ tf_em_ext_alloc(struct tf *tfp, "System alloc mmap failed\n"); goto cleanup_full; } +#endif return rc; @@ -527,6 +528,7 @@ tf_em_ext_free(struct tf *tfp, } tf_dmabuf_free(tfp, tbl_scope_cb); + tbl_scope_cb->valid = false; return rc; } -- 2.20.1