<div dir="ltr"><br><br>On Fri, Nov 21, 2025 at 2:24 PM Ajit Khaparde <<a href="mailto:ajit.khaparde@broadcom.com">ajit.khaparde@broadcom.com</a>> wrote:<br>><br>> On Fri, Nov 14, 2025 at 9:51 AM Stephen Hemminger<br>> <<a href="mailto:stephen@networkplumber.org">stephen@networkplumber.org</a>> wrote:<br>> ><br>> > Several C files are never used or built.<br>> > Looks like they were converted to header files but the old source<br>> > was never removed.<br>> ><br>> > Fixes: aa49b38fa7c3 ("net/bnxt/tf_core: cleanup external EM support")<br>> > Cc: <a href="mailto:shuanglin.wang@broadcom.com">shuanglin.wang@broadcom.com</a><br>> ><br>> > Signed-off-by: Stephen Hemminger <<a href="mailto:stephen@networkplumber.org">stephen@networkplumber.org</a>><br>> Acked-by: Ajit Khaparde <<a href="mailto:ajit.khaparde@broadcom.com">ajit.khaparde@broadcom.com</a>><div>Acked-by: Kishore Padmanabha<<a href="mailto:kishore.padmanabha@broadcom.com">kishore.padmanabha@broadcom.com</a>><br>><br>> > ---<br>> >  .../net/bnxt/tf_core/cfa_tcam_mgr_session.c   |  390 ------<br>> >  drivers/net/bnxt/tf_core/tf_em_common.c       |   23 -<br>> >  drivers/net/bnxt/tf_core/tf_em_host.c         |   23 -<br>> >  drivers/net/bnxt/tf_ulp/ulp_utils.c           | 1100 -----------------<br>> >  4 files changed, 1536 deletions(-)<br>> >  delete mode 100644 drivers/net/bnxt/tf_core/cfa_tcam_mgr_session.c<br>> >  delete mode 100644 drivers/net/bnxt/tf_core/tf_em_common.c<br>> >  delete mode 100644 drivers/net/bnxt/tf_core/tf_em_host.c<br>> >  delete mode 100644 drivers/net/bnxt/tf_ulp/ulp_utils.c<br>> ><br>> > diff --git a/drivers/net/bnxt/tf_core/cfa_tcam_mgr_session.c b/drivers/net/bnxt/tf_core/cfa_tcam_mgr_session.c<br>> > deleted file mode 100644<br>> > index 40bbcc54c8..0000000000<br>> > --- a/drivers/net/bnxt/tf_core/cfa_tcam_mgr_session.c<br>> > +++ /dev/null<br>> > @@ -1,390 +0,0 @@<br>> > -/* SPDX-License-Identifier: BSD-3-Clause<br>> > - * Copyright(c) 2021-2023 Broadcom<br>> > - * All rights reserved.<br>> > - */<br>> > -<br>> > -#include <inttypes.h><br>> > -#include "hcapi_cfa_defs.h"<br>> > -#include "tf_util.h"<br>> > -#include "cfa_tcam_mgr.h"<br>> > -#include "cfa_tcam_mgr_device.h"<br>> > -#include "cfa_tcam_mgr_session.h"<br>> > -#include "cfa_tcam_mgr_sbmp.h"<br>> > -#include "tfp.h"<br>> > -#include "cfa_tcam_mgr_p58.h"<br>> > -#include "cfa_tcam_mgr_p4.h"<br>> > -<br>> > -struct cfa_tcam_mgr_session_data {<br>> > -       uint32_t session_id;<br>> > -       /* The following are per-session values */<br>> > -       uint16_t max_entries[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX];<br>> > -       uint16_t used_entries[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX];<br>> > -};<br>> > -<br>> > -static struct cfa_tcam_mgr_session_data session_data[TF_TCAM_MAX_SESSIONS];<br>> > -<br>> > -static uint16_t last_entry_id;<br>> > -<br>> > -static struct sbmp *session_bmp[TF_TCAM_MAX_SESSIONS];<br>> > -<br>> > -int<br>> > -cfa_tcam_mgr_session_init(int sess_idx, enum cfa_tcam_mgr_device_type type)<br>> > -{<br>> > -       int rc;<br>> > -<br>> > -       switch (type) {<br>> > -       case CFA_TCAM_MGR_DEVICE_TYPE_P4:<br>> > -       case CFA_TCAM_MGR_DEVICE_TYPE_SR:<br>> > -               rc = cfa_tcam_mgr_sess_table_get_p4(sess_idx, &session_bmp[sess_idx]);<br>> > -               break;<br>> > -       case CFA_TCAM_MGR_DEVICE_TYPE_P5:<br>> > -               rc = cfa_tcam_mgr_sess_table_get_p58(sess_idx, &session_bmp[sess_idx]);<br>> > -               break;<br>> > -       default:<br>> > -               CFA_TCAM_MGR_LOG(ERR, "No such device %d\n", type);<br>> > -               rc = -CFA_TCAM_MGR_ERR_CODE(NODEV);<br>> > -       }<br>> > -<br>> > -       return rc;<br>> > -}<br>> > -<br>> > -int<br>> > -cfa_tcam_mgr_get_session_from_context(struct cfa_tcam_mgr_context *context,<br>> > -                                     uint32_t *session_id)<br>> > -{<br>> > -       if (context == NULL) {<br>> > -               CFA_TCAM_MGR_LOG_0(ERR, "context passed as NULL pointer.\n");<br>> > -               return -CFA_TCAM_MGR_ERR_CODE(INVAL);<br>> > -       }<br>> > -<br>> > -       *session_id = context->tfp->session-><a href="http://session_id.id">session_id.id</a>;<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -int<br>> > -cfa_tcam_mgr_session_find(unsigned int session_id)<br>> > -{<br>> > -       unsigned int sess_idx;<br>> > -<br>> > -       for (sess_idx = 0; sess_idx < ARRAY_SIZE(session_data); sess_idx++) {<br>> > -               if (session_data[sess_idx].session_id == session_id)<br>> > -                       return sess_idx;<br>> > -       }<br>> > -<br>> > -       return -CFA_TCAM_MGR_ERR_CODE(INVAL);<br>> > -}<br>> > -<br>> > -int<br>> > -cfa_tcam_mgr_session_empty(void)<br>> > -{<br>> > -       unsigned int sess_idx;<br>> > -<br>> > -       for (sess_idx = 0; sess_idx < ARRAY_SIZE(session_data); sess_idx++) {<br>> > -               if (session_data[sess_idx].session_id)<br>> > -                       return 0;<br>> > -       }<br>> > -<br>> > -       return 1;<br>> > -}<br>> > -<br>> > -int<br>> > -cfa_tcam_mgr_session_add(unsigned int session_id)<br>> > -{<br>> > -       int sess_idx;<br>> > -<br>> > -       sess_idx = cfa_tcam_mgr_session_find(session_id);<br>> > -       if (sess_idx >= 0) {<br>> > -               CFA_TCAM_MGR_LOG_0(ERR, "Session is already bound.\n");<br>> > -               return -CFA_TCAM_MGR_ERR_CODE(BUSY);<br>> > -       }<br>> > -<br>> > -       /* Session not found in table, find first empty entry. */<br>> > -       for (sess_idx = 0;<br>> > -            sess_idx < (signed int)ARRAY_SIZE(session_data);<br>> > -            sess_idx++) {<br>> > -               if (session_data[sess_idx].session_id == 0)<br>> > -                       break;<br>> > -       }<br>> > -<br>> > -       if (sess_idx >= (signed int)ARRAY_SIZE(session_data)) {<br>> > -               /* No room in the session table */<br>> > -               CFA_TCAM_MGR_LOG_0(ERR, "Session table is full.\n");<br>> > -               return -CFA_TCAM_MGR_ERR_CODE(NOMEM);<br>> > -       }<br>> > -<br>> > -       session_data[sess_idx].session_id = session_id;<br>> > -<br>> > -       return sess_idx;<br>> > -}<br>> > -<br>> > -int<br>> > -cfa_tcam_mgr_session_free(unsigned int session_id,<br>> > -               struct cfa_tcam_mgr_context *context)<br>> > -{<br>> > -       struct cfa_tcam_mgr_free_parms free_parms;<br>> > -       int entry_id;<br>> > -       int sess_idx = cfa_tcam_mgr_session_find(session_id);<br>> > -<br>> > -       if (sess_idx < 0)<br>> > -               return sess_idx;<br>> > -<br>> > -       memset(&free_parms, 0, sizeof(free_parms));<br>> > -       /* Since we are freeing all pending TCAM entries (which is typically<br>> > -        * done during tcam_unbind), we don't know the type of each entry.<br>> > -        * So we set the type to MAX as a hint to cfa_tcam_mgr_free() to<br>> > -        * figure out the actual type. We need to set it through each<br>> > -        * iteration in the loop below; otherwise, the type determined for<br>> > -        * the first entry would be used for subsequent entries that may or<br>> > -        * may not be of the same type, resulting in errors.<br>> > -        */<br>> > -       for (entry_id = 0; entry_id < cfa_tcam_mgr_max_entries[sess_idx]; entry_id++) {<br>> > -               if (SBMP_MEMBER(session_bmp[sess_idx][entry_id], sess_idx)) {<br>> > -                       SBMP_SESSION_REMOVE(session_bmp[sess_idx][entry_id], sess_idx);<br>> > -<br>> > -                       <a href="http://free_parms.id">free_parms.id</a> = entry_id;<br>> > -                       free_parms.type = CFA_TCAM_MGR_TBL_TYPE_MAX;<br>> > -                       cfa_tcam_mgr_free(context, &free_parms);<br>> > -               }<br>> > -       }<br>> > -<br>> > -       memset(&session_data[sess_idx], 0, sizeof(session_data[sess_idx]));<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -int<br>> > -cfa_tcam_mgr_session_cfg(unsigned int session_id,<br>> > -                        uint16_t tcam_cnt[][CFA_TCAM_MGR_TBL_TYPE_MAX])<br>> > -{<br>> > -       struct cfa_tcam_mgr_table_data *table_data;<br>> > -       struct cfa_tcam_mgr_session_data *session_entry;<br>> > -       unsigned int dir, type;<br>> > -       int sess_idx = cfa_tcam_mgr_session_find(session_id);<br>> > -       uint16_t requested_cnt;<br>> > -<br>> > -       if (sess_idx < 0)<br>> > -               return sess_idx;<br>> > -<br>> > -       session_entry = &session_data[sess_idx];<br>> > -<br>> > -       /* Validate session request */<br>> > -       for (dir = 0; dir < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx]); dir++) {<br>> > -               for (type = 0;<br>> > -                    type < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx][dir]);<br>> > -                    type++) {<br>> > -                       table_data = &cfa_tcam_mgr_tables[sess_idx][dir][type];<br>> > -                       requested_cnt = tcam_cnt[dir][type];<br>> > -                       /*<br>> > -                        * Only check if table supported (max_entries > 0).<br>> > -                        */<br>> > -                       if (table_data->max_entries > 0 &&<br>> > -                           requested_cnt > table_data->max_entries) {<br>> > -                               CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, dir, type,<br>> > -                                               "Requested %d, available %d.\n",<br>> > -                                               requested_cnt,<br>> > -                                               table_data->max_entries);<br>> > -                               return -CFA_TCAM_MGR_ERR_CODE(NOSPC);<br>> > -                       }<br>> > -               }<br>> > -       }<br>> > -<br>> > -       memcpy(session_entry->max_entries, tcam_cnt,<br>> > -              sizeof(session_entry->max_entries));<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -void<br>> > -cfa_tcam_mgr_mv_session_used_entries_cnt(int sess_idx, enum tf_dir dir,<br>> > -                                        enum cfa_tcam_mgr_tbl_type dst_type,<br>> > -                                        enum cfa_tcam_mgr_tbl_type src_type)<br>> > -{<br>> > -       session_data[sess_idx].used_entries[dir][dst_type]++;<br>> > -       session_data[sess_idx].used_entries[dir][src_type]--;<br>> > -}<br>> > -<br>> > -int<br>> > -cfa_tcam_mgr_session_entry_alloc(unsigned int session_id,<br>> > -                                enum tf_dir dir,<br>> > -                                enum cfa_tcam_mgr_tbl_type type)<br>> > -{<br>> > -       int sess_idx;<br>> > -<br>> > -       sess_idx = cfa_tcam_mgr_session_find(session_id);<br>> > -       if (sess_idx < 0) {<br>> > -               CFA_TCAM_MGR_LOG_0(ERR, "Session not found.\n");<br>> > -               return -CFA_TCAM_MGR_ERR_CODE(NODEV);<br>> > -       }<br>> > -<br>> > -       if (session_data[sess_idx].used_entries[dir][type] >=<br>> > -           session_data[sess_idx].max_entries[dir][type]) {<br>> > -               CFA_TCAM_MGR_LOG_0(ERR, "Table full (session).\n");<br>> > -               return -CFA_TCAM_MGR_ERR_CODE(NOSPC);<br>> > -       }<br>> > -<br>> > -       do {<br>> > -               last_entry_id++;<br>> > -               if (cfa_tcam_mgr_max_entries[sess_idx] <= last_entry_id)<br>> > -                       last_entry_id = 0;<br>> > -       } while (!SBMP_IS_NULL(session_bmp[sess_idx][last_entry_id]));<br>> > -<br>> > -       SBMP_SESSION_ADD(session_bmp[sess_idx][last_entry_id], sess_idx);<br>> > -<br>> > -       session_data[sess_idx].used_entries[dir][type] += 1;<br>> > -<br>> > -       return last_entry_id;<br>> > -}<br>> > -<br>> > -int<br>> > -cfa_tcam_mgr_session_entry_free(unsigned int session_id,<br>> > -                               unsigned int entry_id,<br>> > -                               enum tf_dir dir,<br>> > -                               enum cfa_tcam_mgr_tbl_type type)<br>> > -{<br>> > -       int sess_idx;<br>> > -<br>> > -       sess_idx = cfa_tcam_mgr_session_find(session_id);<br>> > -       if (sess_idx < 0) {<br>> > -               CFA_TCAM_MGR_LOG_0(ERR, "Session not found.\n");<br>> > -               return -CFA_TCAM_MGR_ERR_CODE(NODEV);<br>> > -       }<br>> > -<br>> > -       SBMP_SESSION_REMOVE(session_bmp[sess_idx][entry_id], sess_idx);<br>> > -       session_data[sess_idx].used_entries[dir][type] -= 1;<br>> > -<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -#if SBMP_WORD_WIDTH == 16<br>> > -#define SBMP_FORMAT PRIX16<br>> > -#define SBMP_PRECISION "4"<br>> > -#elif SBMP_WORD_WIDTH == 32<br>> > -#define SBMP_FORMAT PRIX32<br>> > -#define SBMP_PRECISION "8"<br>> > -#elif SBMP_WORD_WIDTH == 64<br>> > -#define SBMP_FORMAT PRIX64<br>> > -#define SBMP_PRECISION "16"<br>> > -#else<br>> > -#error "Invalid value for SBMP_WORD_WIDTH."<br>> > -#endif<br>> > -<br>> > -static void<br>> > -cfa_tcam_mgr_session_bitmap_print(struct sbmp *session_bmp)<br>> > -{<br>> > -       unsigned int i;<br>> > -<br>> > -       printf("0x");<br>> > -       for (i = 0;<br>> > -            i < ARRAY_SIZE(session_bmp->bits);<br>> > -            i++) {<br>> > -               printf("%0" SBMP_PRECISION SBMP_FORMAT,<br>> > -                      session_bmp->bits[i]);<br>> > -       }<br>> > -}<br>> > -<br>> > -#define SESSION_DUMP_HEADER_1 "                             RX          TX\n"<br>> > -#define SESSION_DUMP_HEADER_2 \<br>> > -       "                         Max   Used  Max   Used\n"<br>> > -<br>> > -static void<br>> > -cfa_tcam_mgr_session_printf(struct cfa_tcam_mgr_session_data *session,<br>> > -                           enum cfa_tcam_mgr_tbl_type tbl_type)<br>> > -{<br>> > -       printf("%-22s: %5u %5u %5u %5u\n",<br>> > -              cfa_tcam_mgr_tbl_2_str(tbl_type),<br>> > -              session->max_entries[TF_DIR_RX][tbl_type],<br>> > -              session->used_entries[TF_DIR_RX][tbl_type],<br>> > -              session->max_entries[TF_DIR_TX][tbl_type],<br>> > -              session->used_entries[TF_DIR_TX][tbl_type]);<br>> > -}<br>> > -<br>> > -void<br>> > -cfa_tcam_mgr_sessions_dump(void)<br>> > -{<br>> > -       struct cfa_tcam_mgr_session_data *session;<br>> > -       unsigned int sess_idx;<br>> > -       bool sess_found = false;<br>> > -       enum cfa_tcam_mgr_tbl_type tbl_type;<br>> > -<br>> > -       printf("\nTCAM Sessions Table:\n");<br>> > -       for (sess_idx = 0; sess_idx < ARRAY_SIZE(session_data); sess_idx++) {<br>> > -               if (session_data[sess_idx].session_id != 0) {<br>> > -                       session = &session_data[sess_idx];<br>> > -                       if (!sess_found) {<br>> > -                               printf(SESSION_DUMP_HEADER_1);<br>> > -                               printf(SESSION_DUMP_HEADER_2);<br>> > -                       }<br>> > -                       printf("Session 0x%08x:\n",<br>> > -                              session->session_id);<br>> > -                       for (tbl_type = CFA_TCAM_MGR_TBL_TYPE_START;<br>> > -                            tbl_type < CFA_TCAM_MGR_TBL_TYPE_MAX;<br>> > -                            tbl_type++) {<br>> > -                               cfa_tcam_mgr_session_printf(session, tbl_type);<br>> > -                       }<br>> > -                       sess_found = true;<br>> > -               }<br>> > -       }<br>> > -<br>> > -       if (!sess_found)<br>> > -               printf("No sessions found.\n");<br>> > -}<br>> > -<br>> > -/* This dumps all the sessions using an entry */<br>> > -void<br>> > -cfa_tcam_mgr_entry_sessions_dump(int sess_idx, uint16_t id)<br>> > -{<br>> > -       bool session_found = false;<br>> > -<br>> > -       if (id >= cfa_tcam_mgr_max_entries[sess_idx]) {<br>> > -               printf("Entry ID %u out of range for sess_idx %d.  Max ID %u.\n",<br>> > -                      id, sess_idx, cfa_tcam_mgr_max_entries[sess_idx] - 1);<br>> > -               return;<br>> > -       }<br>> > -<br>> > -       if (!SBMP_IS_NULL(session_bmp[sess_idx][id])) {<br>> > -               printf("Sessions using entry ID %u:\n", id);<br>> > -               for (sess_idx = 0; sess_idx < SBMP_SESSION_MAX; sess_idx++)<br>> > -                       if (SBMP_MEMBER(session_bmp[sess_idx][id], (sess_idx))) {<br>> > -                               if (session_data[sess_idx].session_id != 0) {<br>> > -                                       printf("0x%08x (index %d)\n",<br>> > -                                         session_data[sess_idx].session_id,<br>> > -                                         sess_idx);<br>> > -                                       session_found = true;<br>> > -                               } else {<br>> > -                                       printf("Error! Entry ID %u used by "<br>> > -                                              "session index %d which is not "<br>> > -                                              "in use.\n",<br>> > -                                              id, sess_idx);<br>> > -                               }<br>> > -                       }<br>> > -               if (!session_found)<br>> > -                       printf("No sessions using entry ID %u.\n", id);<br>> > -       } else {<br>> > -               printf("Entry ID %u not in use.\n",<br>> > -                      id);<br>> > -               return;<br>> > -       }<br>> > -}<br>> > -<br>> > -/* This dumps all the entries in use by any session */<br>> > -void<br>> > -cfa_tcam_mgr_session_entries_dump(int sess_idx)<br>> > -{<br>> > -       bool entry_found = false;<br>> > -       uint16_t id;<br>> > -<br>> > -       printf("\nGlobal Maximum Entries for sess_idx %d: %d\n\n",<br>> > -              sess_idx, cfa_tcam_mgr_max_entries[sess_idx]);<br>> > -       printf("TCAM Session Entry Table:\n");<br>> > -       for (id = 0; id < cfa_tcam_mgr_max_entries[sess_idx]; id++) {<br>> > -               if (!SBMP_IS_NULL(session_bmp[sess_idx][id])) {<br>> > -                       if (!entry_found)<br>> > -                               printf("  EID Session bitmap\n");<br>> > -                       printf("%5u ", id);<br>> > -                       cfa_tcam_mgr_session_bitmap_print(&session_bmp[sess_idx][id]);<br>> > -                       printf("\n");<br>> > -                       entry_found = true;<br>> > -               }<br>> > -       }<br>> > -<br>> > -       if (!entry_found)<br>> > -               printf("No entries found.\n");<br>> > -}<br>> > diff --git a/drivers/net/bnxt/tf_core/tf_em_common.c b/drivers/net/bnxt/tf_core/tf_em_common.c<br>> > deleted file mode 100644<br>> > index 2449759db0..0000000000<br>> > --- a/drivers/net/bnxt/tf_core/tf_em_common.c<br>> > +++ /dev/null<br>> > @@ -1,23 +0,0 @@<br>> > -/* SPDX-License-Identifier: BSD-3-Clause<br>> > - * Copyright(c) 2019-2023 Broadcom<br>> > - * All rights reserved.<br>> > - */<br>> > -<br>> > -#include <string.h><br>> > -#include <math.h><br>> > -#include <sys/param.h><br>> > -#include <rte_common.h><br>> > -#include <rte_errno.h><br>> > -#include <rte_log.h><br>> > -#include "tf_core.h"<br>> > -#include "tf_util.h"<br>> > -#include "tf_common.h"<br>> > -#include "tf_em.h"<br>> > -#include "tf_em_common.h"<br>> > -#include "tf_msg.h"<br>> > -#include "tfp.h"<br>> > -#include "tf_device.h"<br>> > -#include "tf_ext_flow_handle.h"<br>> > -#include "hcapi_cfa.h"<br>> > -#include "bnxt.h"<br>> > -<br>> > diff --git a/drivers/net/bnxt/tf_core/tf_em_host.c b/drivers/net/bnxt/tf_core/tf_em_host.c<br>> > deleted file mode 100644<br>> > index 6db0057b2c..0000000000<br>> > --- a/drivers/net/bnxt/tf_core/tf_em_host.c<br>> > +++ /dev/null<br>> > @@ -1,23 +0,0 @@<br>> > -/* SPDX-License-Identifier: BSD-3-Clause<br>> > - * Copyright(c) 2019-2023 Broadcom<br>> > - * All rights reserved.<br>> > - */<br>> > -<br>> > -#include <string.h><br>> > -#include <math.h><br>> > -#include <sys/param.h><br>> > -#include <rte_common.h><br>> > -#include <rte_errno.h><br>> > -#include <rte_log.h><br>> > -<br>> > -#include "tf_core.h"<br>> > -#include "tf_util.h"<br>> > -#include "tf_common.h"<br>> > -#include "tf_em.h"<br>> > -#include "tf_em_common.h"<br>> > -#include "tf_msg.h"<br>> > -#include "tfp.h"<br>> > -#include "lookup3.h"<br>> > -#include "tf_ext_flow_handle.h"<br>> > -<br>> > -#include "bnxt.h"<br>> > diff --git a/drivers/net/bnxt/tf_ulp/ulp_utils.c b/drivers/net/bnxt/tf_ulp/ulp_utils.c<br>> > deleted file mode 100644<br>> > index 85e309d7a2..0000000000<br>> > --- a/drivers/net/bnxt/tf_ulp/ulp_utils.c<br>> > +++ /dev/null<br>> > @@ -1,1100 +0,0 @@<br>> > -/* SPDX-License-Identifier: BSD-3-Clause<br>> > - * Copyright(c) 2014-2023 Broadcom<br>> > - * All rights reserved.<br>> > - */<br>> > -<br>> > -#include <rte_common.h><br>> > -#include "ulp_utils.h"<br>> > -#include "bnxt_tf_common.h"<br>> > -<br>> > -/*<br>> > - * Initialize the regfile structure for writing<br>> > - *<br>> > - * regfile [in] Ptr to a regfile instance<br>> > - *<br>> > - * returns zero on success<br>> > - */<br>> > -int32_t<br>> > -ulp_regfile_init(struct ulp_regfile *regfile)<br>> > -{<br>> > -       /* validate the arguments */<br>> > -       if (!regfile) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -       memset(regfile, 0, sizeof(struct ulp_regfile));<br>> > -       return 0; /* Success */<br>> > -}<br>> > -<br>> > -/*<br>> > - * Read a value from the regfile<br>> > - *<br>> > - * regfile [in] The regfile instance. Must be initialized prior to being used<br>> > - *<br>> > - * field [in] The field to be read within the regfile.<br>> > - *<br>> > - * data [in/out]<br>> > - *<br>> > - * returns zero on success<br>> > - */<br>> > -int32_t<br>> > -ulp_regfile_read(struct ulp_regfile *regfile,<br>> > -                enum bnxt_ulp_rf_idx field,<br>> > -                uint64_t *data)<br>> > -{<br>> > -       /* validate the arguments */<br>> > -       if (!regfile || field >= BNXT_ULP_RF_IDX_LAST) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -<br>> > -       *data = regfile->entry[field].data;<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Write a value to the regfile<br>> > - *<br>> > - * regfile [in] The regfile instance.  Must be initialized prior to being used<br>> > - *<br>> > - * field [in] The field to be written within the regfile.<br>> > - *<br>> > - * data [in] The value is written into this variable.  It is going to be in the<br>> > - * same byte order as it was written.<br>> > - *<br>> > - * size [in] The size in bytes of the value being written into this<br>> > - * variable.<br>> > - *<br>> > - * returns 0 on success<br>> > - */<br>> > -int32_t<br>> > -ulp_regfile_write(struct ulp_regfile *regfile,<br>> > -                 enum bnxt_ulp_rf_idx field,<br>> > -                 uint64_t data)<br>> > -{<br>> > -       /* validate the arguments */<br>> > -       if (!regfile || field >= BNXT_ULP_RF_IDX_LAST) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return -EINVAL; /* failure */<br>> > -       }<br>> > -<br>> > -       regfile->entry[field].data = data;<br>> > -       return 0; /* Success */<br>> > -}<br>> > -<br>> > -static void<br>> > -ulp_bs_put_msb(uint8_t *bs, uint16_t bitpos, uint8_t bitlen, uint8_t val)<br>> > -{<br>> > -       uint8_t bitoffs = bitpos % 8;<br>> > -       uint16_t index  = bitpos / 8;<br>> > -       uint8_t mask;<br>> > -       uint8_t tmp;<br>> > -       int8_t shift;<br>> > -<br>> > -       tmp = bs[index];<br>> > -       mask = ((uint8_t)-1 >> (8 - bitlen));<br>> > -       shift = 8 - bitoffs - bitlen;<br>> > -       val &= mask;<br>> > -<br>> > -       if (shift >= 0) {<br>> > -               tmp &= ~(mask << shift);<br>> > -               tmp |= val << shift;<br>> > -               bs[index] = tmp;<br>> > -       } else {<br>> > -               tmp &= ~((uint8_t)-1 >> bitoffs);<br>> > -               tmp |= val >> -shift;<br>> > -               bs[index++] = tmp;<br>> > -<br>> > -               tmp = bs[index];<br>> > -               tmp &= ((uint8_t)-1 >> (bitlen - (8 - bitoffs)));<br>> > -               tmp |= val << (8 + shift);<br>> > -               bs[index] = tmp;<br>> > -       }<br>> > -}<br>> > -<br>> > -static void<br>> > -ulp_bs_put_lsb(uint8_t *bs, uint16_t bitpos, uint8_t bitlen, uint8_t val)<br>> > -{<br>> > -       uint8_t bitoffs = bitpos % 8;<br>> > -       uint16_t index  = bitpos / 8;<br>> > -       uint8_t mask;<br>> > -       uint8_t tmp;<br>> > -       uint8_t shift;<br>> > -       uint8_t partial;<br>> > -<br>> > -       tmp = bs[index];<br>> > -       shift = bitoffs;<br>> > -<br>> > -       if (bitoffs + bitlen <= 8) {<br>> > -               mask = ((1 << bitlen) - 1) << shift;<br>> > -               tmp &= ~mask;<br>> > -               tmp |= ((val << shift) & mask);<br>> > -               bs[index] = tmp;<br>> > -       } else {<br>> > -               partial = 8 - bitoffs;<br>> > -               mask = ((1 << partial) - 1) << shift;<br>> > -               tmp &= ~mask;<br>> > -               tmp |= ((val << shift) & mask);<br>> > -               bs[index++] = tmp;<br>> > -<br>> > -               val >>= partial;<br>> > -               partial = bitlen - partial;<br>> > -               mask = ((1 << partial) - 1);<br>> > -               tmp = bs[index];<br>> > -               tmp &= ~mask;<br>> > -               tmp |= (val & mask);<br>> > -               bs[index] = tmp;<br>> > -       }<br>> > -}<br>> > -<br>> > -/*<br>> > - * Add data to the byte array in Little endian format.<br>> > - *<br>> > - * bs [in] The byte array where data is pushed<br>> > - *<br>> > - * pos [in] The offset where data is pushed<br>> > - *<br>> > - * len [in] The number of bits to be added to the data array.<br>> > - *<br>> > - * val [in] The data to be added to the data array.<br>> > - *<br>> > - * returns the number of bits pushed.<br>> > - */<br>> > -uint32_t<br>> > -ulp_bs_push_lsb(uint8_t *bs, uint16_t pos, uint8_t len, uint8_t *val)<br>> > -{<br>> > -       int i;<br>> > -       int cnt = (len) / 8;<br>> > -       int tlen = len;<br>> > -<br>> > -       if (cnt > 0 && !(len % 8))<br>> > -               cnt -= 1;<br>> > -<br>> > -       for (i = 0; i < cnt; i++) {<br>> > -               ulp_bs_put_lsb(bs, pos, 8, val[cnt - i]);<br>> > -               pos += 8;<br>> > -               tlen -= 8;<br>> > -       }<br>> > -<br>> > -       /* Handle the remainder bits */<br>> > -       if (tlen)<br>> > -               ulp_bs_put_lsb(bs, pos, tlen, val[0]);<br>> > -       return len;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Add data to the byte array in Big endian format.<br>> > - *<br>> > - * bs [in] The byte array where data is pushed<br>> > - *<br>> > - * pos [in] The offset where data is pushed<br>> > - *<br>> > - * len [in] The number of bits to be added to the data array.<br>> > - *<br>> > - * val [in] The data to be added to the data array.<br>> > - *<br>> > - * returns the number of bits pushed.<br>> > - */<br>> > -uint32_t<br>> > -ulp_bs_push_msb(uint8_t *bs, uint16_t pos, uint8_t len, uint8_t *val)<br>> > -{<br>> > -       int i;<br>> > -       int cnt = (len + 7) / 8;<br>> > -<br>> > -       /* Handle any remainder bits */<br>> > -       int tmp = len % 8;<br>> > -<br>> > -       if (!tmp)<br>> > -               tmp = 8;<br>> > -<br>> > -       ulp_bs_put_msb(bs, pos, tmp, val[0]);<br>> > -<br>> > -       pos += tmp;<br>> > -<br>> > -       for (i = 1; i < cnt; i++) {<br>> > -               ulp_bs_put_msb(bs, pos, 8, val[i]);<br>> > -               pos += 8;<br>> > -       }<br>> > -<br>> > -       return len;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Initializes the blob structure for creating binary blob<br>> > - *<br>> > - * blob [in] The blob to be initialized<br>> > - *<br>> > - * bitlen [in] The bit length of the blob<br>> > - *<br>> > - * order [in] The byte order for the blob.  Currently only supporting<br>> > - * big endian.  All fields are packed with this order.<br>> > - *<br>> > - * returns zero on success<br>> > - * Notes - If bitlen is zero then set it to max.<br>> > - */<br>> > -int32_t<br>> > -ulp_blob_init(struct ulp_blob *blob,<br>> > -             uint16_t bitlen,<br>> > -             enum bnxt_ulp_byte_order order)<br>> > -{<br>> > -       /* validate the arguments */<br>> > -       if (!blob || bitlen > (8 * sizeof(blob->data))) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -       if (bitlen)<br>> > -               blob->bitlen = bitlen;<br>> > -       else<br>> > -               blob->bitlen = BNXT_ULP_FLMP_BLOB_SIZE_IN_BITS;<br>> > -       blob->byte_order = order;<br>> > -       blob->write_idx = 0;<br>> > -       memset(blob->data, 0, sizeof(blob->data));<br>> > -       return 0; /* Success */<br>> > -}<br>> > -<br>> > -/*<br>> > - * Add data to the binary blob at the current offset.<br>> > - *<br>> > - * blob [in] The blob that data is added to.  The blob must<br>> > - * be initialized prior to pushing data.<br>> > - *<br>> > - * data [in] A pointer to bytes to be added to the blob.<br>> > - *<br>> > - * datalen [in] The number of bits to be added to the blob.<br>> > - *<br>> > - * The offset of the data is updated after each push of data.<br>> > - *<br>> > - * returns zero on success<br>> > - */<br>> > -#define ULP_BLOB_BYTE          8<br>> > -#define ULP_BLOB_BYTE_HEX      0xFF<br>> > -#define BLOB_MASK_CAL(x)       ((0xFF << (x)) & 0xFF)<br>> > -int32_t<br>> > -ulp_blob_push(struct ulp_blob *blob,<br>> > -             uint8_t *data,<br>> > -             uint32_t datalen)<br>> > -{<br>> > -       uint32_t rc;<br>> > -<br>> > -       /* validate the arguments */<br>> > -       if (!blob || datalen > (uint32_t)(blob->bitlen - blob->write_idx)) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -<br>> > -       if (blob->byte_order == BNXT_ULP_BYTE_ORDER_BE)<br>> > -               rc = ulp_bs_push_msb(blob->data,<br>> > -                                    blob->write_idx,<br>> > -                                    datalen,<br>> > -                                    data);<br>> > -       else<br>> > -               rc = ulp_bs_push_lsb(blob->data,<br>> > -                                    blob->write_idx,<br>> > -                                    datalen,<br>> > -                                    data);<br>> > -       if (!rc) {<br>> > -               BNXT_DRV_DBG(ERR, "Failed to write blob\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -       blob->write_idx += datalen;<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Insert data into the binary blob at the given offset.<br>> > - *<br>> > - * blob [in] The blob that data is added to.  The blob must<br>> > - * be initialized prior to pushing data.<br>> > - *<br>> > - * offset [in] The offset where the data needs to be inserted.<br>> > - *<br>> > - * data [in/out] A pointer to bytes to be added to the blob.<br>> > - *<br>> > - * datalen [in] The number of bits to be added to the blob.<br>> > - *<br>> > - * The offset of the data is updated after each push of data.<br>> > - *<br>> > - * returns zero on success<br>> > - */<br>> > -int32_t<br>> > -ulp_blob_insert(struct ulp_blob *blob, uint32_t offset,<br>> > -               uint8_t *data, uint32_t datalen)<br>> > -{<br>> > -       uint32_t rc;<br>> > -       uint8_t local_data[BNXT_ULP_FLMP_BLOB_SIZE];<br>> > -       uint16_t mov_len;<br>> > -<br>> > -       /* validate the arguments */<br>> > -       if (!blob || datalen > (uint32_t)(blob->bitlen - blob->write_idx) ||<br>> > -           offset > blob->write_idx) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -<br>> > -       mov_len = blob->write_idx - offset;<br>> > -       /* If offset and data len are not 8 bit aligned then return error */<br>> > -       if (ULP_BITS_IS_BYTE_NOT_ALIGNED(offset) ||<br>> > -           ULP_BITS_IS_BYTE_NOT_ALIGNED(datalen)) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument, not aligned\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -<br>> > -       /* copy the data so we can move the data */<br>> > -       memcpy(local_data, &blob->data[ULP_BITS_2_BYTE_NR(offset)],<br>> > -              ULP_BITS_2_BYTE(mov_len));<br>> > -       blob->write_idx = offset;<br>> > -       if (blob->byte_order == BNXT_ULP_BYTE_ORDER_BE)<br>> > -               rc = ulp_bs_push_msb(blob->data,<br>> > -                                    blob->write_idx,<br>> > -                                    datalen,<br>> > -                                    data);<br>> > -       else<br>> > -               rc = ulp_bs_push_lsb(blob->data,<br>> > -                                    blob->write_idx,<br>> > -                                    datalen,<br>> > -                                    data);<br>> > -       if (!rc) {<br>> > -               BNXT_DRV_DBG(ERR, "Failed to write blob\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -       /* copy the previously stored data */<br>> > -       memcpy(&blob->data[ULP_BITS_2_BYTE_NR(offset + datalen)], local_data,<br>> > -              ULP_BITS_2_BYTE(mov_len));<br>> > -       blob->write_idx += (mov_len + datalen);<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Add data to the binary blob at the current offset.<br>> > - *<br>> > - * blob [in] The blob that data is added to.  The blob must<br>> > - * be initialized prior to pushing data.<br>> > - *<br>> > - * data [in] 64-bit value to be added to the blob.<br>> > - *<br>> > - * datalen [in] The number of bits to be added to the blob.<br>> > - *<br>> > - * The offset of the data is updated after each push of data.<br>> > - * NULL returned on error, pointer pushed value otherwise.<br>> > - */<br>> > -uint8_t *<br>> > -ulp_blob_push_64(struct ulp_blob *blob,<br>> > -                uint64_t *data,<br>> > -                uint32_t datalen)<br>> > -{<br>> > -       uint8_t *val = (uint8_t *)data;<br>> > -       int rc;<br>> > -<br>> > -       int size = (datalen + 7) / 8;<br>> > -<br>> > -       if (!blob || !data ||<br>> > -           datalen > (uint32_t)(blob->bitlen - blob->write_idx)) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return NULL;<br>> > -       }<br>> > -<br>> > -       rc = ulp_blob_push(blob, &val[8 - size], datalen);<br>> > -       if (rc)<br>> > -               return NULL;<br>> > -<br>> > -       return &val[8 - size];<br>> > -}<br>> > -<br>> > -/*<br>> > - * Add data to the binary blob at the current offset.<br>> > - *<br>> > - * blob [in] The blob that data is added to.  The blob must<br>> > - * be initialized prior to pushing data.<br>> > - *<br>> > - * data [in] 32-bit value to be added to the blob.<br>> > - *<br>> > - * datalen [in] The number of bits to be added to the blob.<br>> > - *<br>> > - * The offset of the data is updated after each push of data.<br>> > - * NULL returned on error, pointer pushed value otherwise.<br>> > - */<br>> > -uint8_t *<br>> > -ulp_blob_push_32(struct ulp_blob *blob,<br>> > -                uint32_t *data,<br>> > -                uint32_t datalen)<br>> > -{<br>> > -       uint8_t *val = (uint8_t *)data;<br>> > -       uint32_t rc;<br>> > -       uint32_t size = ULP_BITS_2_BYTE(datalen);<br>> > -<br>> > -       if (!data || size > sizeof(uint32_t)) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return NULL;<br>> > -       }<br>> > -<br>> > -       rc = ulp_blob_push(blob, &val[sizeof(uint32_t) - size], datalen);<br>> > -       if (rc)<br>> > -               return NULL;<br>> > -<br>> > -       return &val[sizeof(uint32_t) - size];<br>> > -}<br>> > -<br>> > -/*<br>> > - * Add encap data to the binary blob at the current offset.<br>> > - *<br>> > - * blob [in] The blob that data is added to.  The blob must<br>> > - * be initialized prior to pushing data.<br>> > - *<br>> > - * data [in] value to be added to the blob.<br>> > - *<br>> > - * datalen [in] The number of bits to be added to the blob.<br>> > - *<br>> > - * The offset of the data is updated after each push of data.<br>> > - * NULL returned on error, pointer pushed value otherwise.<br>> > - */<br>> > -int32_t<br>> > -ulp_blob_push_encap(struct ulp_blob *blob,<br>> > -                   uint8_t *data,<br>> > -                   uint32_t datalen)<br>> > -{<br>> > -       uint8_t         *val = (uint8_t *)data;<br>> > -       uint32_t        initial_size, write_size = datalen;<br>> > -       uint32_t        size = 0;<br>> > -<br>> > -       if (!blob || !data ||<br>> > -           datalen > (uint32_t)(blob->bitlen - blob->write_idx)) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return -1;<br>> > -       }<br>> > -<br>> > -       initial_size = ULP_BYTE_2_BITS(sizeof(uint64_t)) -<br>> > -           (blob->write_idx % ULP_BYTE_2_BITS(sizeof(uint64_t)));<br>> > -       while (write_size > 0) {<br>> > -               if (initial_size && write_size > initial_size) {<br>> > -                       size = initial_size;<br>> > -                       initial_size = 0;<br>> > -               } else if (initial_size && write_size <= initial_size) {<br>> > -                       size = write_size;<br>> > -                       initial_size = 0;<br>> > -               } else if (write_size > ULP_BYTE_2_BITS(sizeof(uint64_t))) {<br>> > -                       size = ULP_BYTE_2_BITS(sizeof(uint64_t));<br>> > -               } else {<br>> > -                       size = write_size;<br>> > -               }<br>> > -               if (ulp_blob_push(blob, val, size)) {<br>> > -                       BNXT_DRV_DBG(ERR, "push field failed\n");<br>> > -                       return -1;<br>> > -               }<br>> > -               val += ULP_BITS_2_BYTE(size);<br>> > -               write_size -= size;<br>> > -       }<br>> > -       return datalen;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Adds pad to an initialized blob at the current offset<br>> > - *<br>> > - * blob [in] The blob that data is added to.  The blob must<br>> > - * be initialized prior to pushing data.<br>> > - *<br>> > - * datalen [in] The number of bits of pad to add<br>> > - *<br>> > - * returns the number of pad bits added, -1 on failure<br>> > - */<br>> > -int32_t<br>> > -ulp_blob_pad_push(struct ulp_blob *blob,<br>> > -                 uint32_t datalen)<br>> > -{<br>> > -       if (datalen > (uint32_t)(blob->bitlen - blob->write_idx)) {<br>> > -               BNXT_DRV_DBG(ERR, "Pad too large for blob\n");<br>> > -               return -1;<br>> > -       }<br>> > -<br>> > -       blob->write_idx += datalen;<br>> > -       return datalen;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Adds pad to an initialized blob at the current offset based on<br>> > - * the alignment.<br>> > - *<br>> > - * blob [in] The blob that needs to be aligned<br>> > - *<br>> > - * align [in] Alignment in bits.<br>> > - *<br>> > - * returns the number of pad bits added, -1 on failure<br>> > - */<br>> > -int32_t<br>> > -ulp_blob_pad_align(struct ulp_blob *blob,<br>> > -                  uint32_t align)<br>> > -{<br>> > -       int32_t pad = 0;<br>> > -<br>> > -       pad = RTE_ALIGN(blob->write_idx, align) - blob->write_idx;<br>> > -       if (pad > (int32_t)(blob->bitlen - blob->write_idx)) {<br>> > -               BNXT_DRV_DBG(ERR, "Pad too large for blob\n");<br>> > -               return -1;<br>> > -       }<br>> > -       blob->write_idx += pad;<br>> > -       return pad;<br>> > -}<br>> > -<br>> > -/* Get data from src and put into dst using little-endian format */<br>> > -static void<br>> > -ulp_bs_get_lsb(uint8_t *src, uint16_t bitpos, uint8_t bitlen, uint8_t *dst)<br>> > -{<br>> > -       uint8_t bitoffs = bitpos % ULP_BLOB_BYTE;<br>> > -       uint16_t index  = ULP_BITS_2_BYTE_NR(bitpos);<br>> > -       uint8_t mask, partial, shift;<br>> > -<br>> > -       shift = bitoffs;<br>> > -       partial = ULP_BLOB_BYTE - bitoffs;<br>> > -       if (bitoffs + bitlen <= ULP_BLOB_BYTE) {<br>> > -               mask = ((1 << bitlen) - 1) << shift;<br>> > -               *dst = (src[index] & mask) >> shift;<br>> > -       } else {<br>> > -               mask = ((1 << partial) - 1) << shift;<br>> > -               *dst = (src[index] & mask) >> shift;<br>> > -               index++;<br>> > -               partial = bitlen - partial;<br>> > -               mask = ((1 << partial) - 1);<br>> > -               *dst |= (src[index] & mask) << (ULP_BLOB_BYTE - bitoffs);<br>> > -       }<br>> > -}<br>> > -<br>> > -/*<br>> > - * Get data from the byte array in Little endian format.<br>> > - *<br>> > - * src [in] The byte array where data is extracted from<br>> > - *<br>> > - * dst [out] The byte array where data is pulled into<br>> > - *<br>> > - * size [in] The size of dst array in bytes<br>> > - *<br>> > - * offset [in] The offset where data is pulled<br>> > - *<br>> > - * len [in] The number of bits to be extracted from the data array<br>> > - *<br>> > - * returns None.<br>> > - */<br>> > -void<br>> > -ulp_bs_pull_lsb(uint8_t *src, uint8_t *dst, uint32_t size,<br>> > -               uint32_t offset, uint32_t len)<br>> > -{<br>> > -       uint32_t idx;<br>> > -       uint32_t cnt = ULP_BITS_2_BYTE_NR(len);<br>> > -<br>> > -       /* iterate bytewise to get data */<br>> > -       for (idx = 0; idx < cnt; idx++) {<br>> > -               ulp_bs_get_lsb(src, offset, ULP_BLOB_BYTE,<br>> > -                              &dst[size - 1 - idx]);<br>> > -               offset += ULP_BLOB_BYTE;<br>> > -               len -= ULP_BLOB_BYTE;<br>> > -       }<br>> > -<br>> > -       /* Extract the last reminder data that is not 8 byte boundary */<br>> > -       if (len)<br>> > -               ulp_bs_get_lsb(src, offset, len, &dst[size - 1 - idx]);<br>> > -}<br>> > -<br>> > -/* Get data from src and put into dst using big-endian format */<br>> > -static void<br>> > -ulp_bs_get_msb(uint8_t *src, uint16_t bitpos, uint8_t bitlen, uint8_t *dst)<br>> > -{<br>> > -       uint8_t bitoffs = bitpos % ULP_BLOB_BYTE;<br>> > -       uint16_t index  = ULP_BITS_2_BYTE_NR(bitpos);<br>> > -       uint8_t mask;<br>> > -       int32_t shift;<br>> > -<br>> > -       shift = ULP_BLOB_BYTE - bitoffs - bitlen;<br>> > -       if (shift >= 0) {<br>> > -               mask = 0xFF >> -bitlen;<br>> > -               *dst = (src[index] >> shift) & mask;<br>> > -       } else {<br>> > -               *dst = (src[index] & (0xFF >> bitoffs)) << -shift;<br>> > -               *dst |= src[index + 1] >> -shift;<br>> > -       }<br>> > -}<br>> > -<br>> > -/*<br>> > - * Get data from the byte array in Big endian format.<br>> > - *<br>> > - * src [in] The byte array where data is extracted from<br>> > - *<br>> > - * dst [out] The byte array where data is pulled into<br>> > - *<br>> > - * offset [in] The offset where data is pulled<br>> > - *<br>> > - * len [in] The number of bits to be extracted from the data array<br>> > - *<br>> > - * returns None.<br>> > - */<br>> > -void<br>> > -ulp_bs_pull_msb(uint8_t *src, uint8_t *dst,<br>> > -               uint32_t offset, uint32_t len)<br>> > -{<br>> > -       uint32_t idx;<br>> > -       uint32_t cnt = ULP_BITS_2_BYTE_NR(len);<br>> > -<br>> > -       /* iterate bytewise to get data */<br>> > -       for (idx = 0; idx < cnt; idx++) {<br>> > -               ulp_bs_get_msb(src, offset, ULP_BLOB_BYTE, &dst[idx]);<br>> > -               offset += ULP_BLOB_BYTE;<br>> > -               len -= ULP_BLOB_BYTE;<br>> > -       }<br>> > -<br>> > -       /* Extract the last reminder data that is not 8 byte boundary */<br>> > -       if (len)<br>> > -               ulp_bs_get_msb(src, offset, len, &dst[idx]);<br>> > -}<br>> > -<br>> > -/*<br>> > - * Extract data from the binary blob using given offset.<br>> > - *<br>> > - * blob [in] The blob that data is extracted from. The blob must<br>> > - * be initialized prior to pulling data.<br>> > - *<br>> > - * data [in] A pointer to put the data.<br>> > - * data_size [in] size of the data buffer in bytes.<br>> > - *offset [in] - Offset in the blob to extract the data in bits format.<br>> > - * len [in] The number of bits to be pulled from the blob.<br>> > - *<br>> > - * Output: zero on success, -1 on failure<br>> > - */<br>> > -int32_t<br>> > -ulp_blob_pull(struct ulp_blob *blob, uint8_t *data, uint32_t data_size,<br>> > -             uint16_t offset, uint16_t len)<br>> > -{<br>> > -       /* validate the arguments */<br>> > -       if (!blob || (offset + len) > blob->bitlen ||<br>> > -           ULP_BYTE_2_BITS(data_size) < len) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return -1; /* failure */<br>> > -       }<br>> > -<br>> > -       if (blob->byte_order == BNXT_ULP_BYTE_ORDER_BE)<br>> > -               ulp_bs_pull_msb(blob->data, data, offset, len);<br>> > -       else<br>> > -               ulp_bs_pull_lsb(blob->data, data, data_size, offset, len);<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Get the data portion of the binary blob.<br>> > - *<br>> > - * blob [in] The blob's data to be retrieved. The blob must be<br>> > - * initialized prior to pushing data.<br>> > - *<br>> > - * datalen [out] The number of bits that are filled.<br>> > - *<br>> > - * Returns a byte array of the blob data or NULL on error.<br>> > - */<br>> > -uint8_t *<br>> > -ulp_blob_data_get(struct ulp_blob *blob,<br>> > -                 uint16_t *datalen)<br>> > -{<br>> > -       /* validate the arguments */<br>> > -       if (!blob) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return NULL; /* failure */<br>> > -       }<br>> > -       *datalen = blob->write_idx;<br>> > -       return blob->data;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Get the data length of the binary blob.<br>> > - *<br>> > - * blob [in] The blob's data len to be retrieved.<br>> > - *<br>> > - * returns length of the binary blob<br>> > - */<br>> > -uint16_t<br>> > -ulp_blob_data_len_get(struct ulp_blob *blob)<br>> > -{<br>> > -       /* validate the arguments */<br>> > -       if (!blob) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return 0; /* failure */<br>> > -       }<br>> > -       return blob->write_idx;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Set the encap swap start index of the binary blob.<br>> > - *<br>> > - * blob [in] The blob's data to be retrieved. The blob must be<br>> > - * initialized prior to pushing data.<br>> > - *<br>> > - * returns void.<br>> > - */<br>> > -void<br>> > -ulp_blob_encap_swap_idx_set(struct ulp_blob *blob)<br>> > -{<br>> > -       /* validate the arguments */<br>> > -       if (!blob) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return; /* failure */<br>> > -       }<br>> > -       blob->encap_swap_idx = blob->write_idx;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Perform the encap buffer swap to 64 bit reversal.<br>> > - *<br>> > - * blob [in] The blob's data to be used for swap.<br>> > - *<br>> > - * returns void.<br>> > - */<br>> > -void<br>> > -ulp_blob_perform_encap_swap(struct ulp_blob *blob)<br>> > -{<br>> > -       uint32_t i, idx = 0, end_idx = 0, roundoff;<br>> > -       uint8_t temp_val_1, temp_val_2;<br>> > -<br>> > -       /* validate the arguments */<br>> > -       if (!blob) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return; /* failure */<br>> > -       }<br>> > -       idx = ULP_BITS_2_BYTE_NR(blob->encap_swap_idx);<br>> > -       end_idx = ULP_BITS_2_BYTE(blob->write_idx);<br>> > -       roundoff = ULP_BYTE_2_BITS(ULP_BITS_2_BYTE(end_idx));<br>> > -       if (roundoff > end_idx) {<br>> > -               blob->write_idx += ULP_BYTE_2_BITS(roundoff - end_idx);<br>> > -               end_idx = roundoff;<br>> > -       }<br>> > -       while (idx <= end_idx) {<br>> > -               for (i = 0; i < 4; i = i + 2) {<br>> > -                       temp_val_1 = blob->data[idx + i];<br>> > -                       temp_val_2 = blob->data[idx + i + 1];<br>> > -                       blob->data[idx + i] = blob->data[idx + 6 - i];<br>> > -                       blob->data[idx + i + 1] = blob->data[idx + 7 - i];<br>> > -                       blob->data[idx + 7 - i] = temp_val_2;<br>> > -                       blob->data[idx + 6 - i] = temp_val_1;<br>> > -               }<br>> > -               idx += 8;<br>> > -       }<br>> > -}<br>> > -<br>> > -/*<br>> > - * Perform the blob buffer reversal byte wise.<br>> > - * This api makes the first byte the last and<br>> > - * vice-versa.<br>> > - *<br>> > - * blob [in] The blob's data to be used for swap.<br>> > - * chunk_size[in] the swap is done within the chunk in bytes<br>> > - *<br>> > - * returns void.<br>> > - */<br>> > -void<br>> > -ulp_blob_perform_byte_reverse(struct ulp_blob *blob,<br>> > -                             uint32_t chunk_size)<br>> > -{<br>> > -       uint32_t idx = 0, jdx = 0, num = 0;<br>> > -       uint8_t xchar;<br>> > -       uint8_t *buff;<br>> > -<br>> > -       /* validate the arguments */<br>> > -       if (!blob) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return; /* failure */<br>> > -       }<br>> > -<br>> > -       buff = blob->data;<br>> > -       num = ULP_BITS_2_BYTE(blob->write_idx) / chunk_size;<br>> > -       for (idx = 0; idx < num; idx++) {<br>> > -               for (jdx = 0; jdx < chunk_size / 2; jdx++) {<br>> > -                       xchar = buff[jdx];<br>> > -                       buff[jdx] = buff[(chunk_size - 1) - jdx];<br>> > -                       buff[(chunk_size - 1) - jdx] = xchar;<br>> > -               }<br>> > -               buff += chunk_size;<br>> > -       }<br>> > -}<br>> > -<br>> > -/*<br>> > - * Perform the blob buffer 64 bit word swap.<br>> > - * This api makes the first 4 bytes the last in<br>> > - * a given 64 bit value and vice-versa.<br>> > - *<br>> > - * blob [in] The blob's data to be used for swap.<br>> > - *<br>> > - * returns void.<br>> > - */<br>> > -void<br>> > -ulp_blob_perform_64B_word_swap(struct ulp_blob *blob)<br>> > -{<br>> > -       uint32_t i, j, num;<br>> > -       uint8_t xchar;<br>> > -       uint32_t word_size = ULP_64B_IN_BYTES / 2;<br>> > -<br>> > -       /* validate the arguments */<br>> > -       if (!blob) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return; /* failure */<br>> > -       }<br>> > -       num = ULP_BITS_2_BYTE(blob->write_idx);<br>> > -       for (i = 0; i < num; i = i + ULP_64B_IN_BYTES) {<br>> > -               for (j = 0; j < word_size; j++) {<br>> > -                       xchar = blob->data[i + j];<br>> > -                       blob->data[i + j] = blob->data[i + j + word_size];<br>> > -                       blob->data[i + j + word_size] = xchar;<br>> > -               }<br>> > -       }<br>> > -}<br>> > -<br>> > -/*<br>> > - * Perform the blob buffer 64 bit byte swap.<br>> > - * This api makes the first byte the last in<br>> > - * a given 64 bit value and vice-versa.<br>> > - *<br>> > - * blob [in] The blob's data to be used for swap.<br>> > - *<br>> > - * returns void.<br>> > - */<br>> > -void<br>> > -ulp_blob_perform_64B_byte_swap(struct ulp_blob *blob)<br>> > -{<br>> > -       uint32_t i, j, num;<br>> > -       uint8_t xchar;<br>> > -       uint32_t offset = ULP_64B_IN_BYTES - 1;<br>> > -<br>> > -       /* validate the arguments */<br>> > -       if (!blob) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return; /* failure */<br>> > -       }<br>> > -       num = ULP_BITS_2_BYTE(blob->write_idx);<br>> > -       for (i = 0; i < num; i = i + ULP_64B_IN_BYTES) {<br>> > -               for (j = 0; j < (ULP_64B_IN_BYTES / 2); j++) {<br>> > -                       xchar = blob->data[i + j];<br>> > -                       blob->data[i + j] = blob->data[i + offset - j];<br>> > -                       blob->data[i + offset - j] = xchar;<br>> > -               }<br>> > -       }<br>> > -}<br>> > -<br>> > -static int32_t<br>> > -ulp_blob_msb_block_merge(struct ulp_blob *dst, struct ulp_blob *src,<br>> > -                        uint32_t block_size, uint32_t pad)<br>> > -{<br>> > -       uint32_t i, k, write_bytes, remaining;<br>> > -       uint16_t num;<br>> > -       uint8_t *src_buf = ulp_blob_data_get(src, &num);<br>> > -       uint8_t bluff;<br>> > -<br>> > -       for (i = 0; i < num;) {<br>> > -               if (((dst->write_idx % block_size) + (num - i)) > block_size)<br>> > -                       write_bytes = block_size -<br>> > -                               (dst->write_idx % block_size);<br>> > -               else<br>> > -                       write_bytes = num - i;<br>> > -               for (k = 0; k < ULP_BITS_2_BYTE_NR(write_bytes); k++) {<br>> > -                       ulp_bs_put_msb(dst->data, dst->write_idx, ULP_BLOB_BYTE,<br>> > -                                      *src_buf);<br>> > -                       dst->write_idx += ULP_BLOB_BYTE;<br>> > -                       src_buf++;<br>> > -               }<br>> > -               remaining = write_bytes % ULP_BLOB_BYTE;<br>> > -               if (remaining) {<br>> > -                       bluff = (*src_buf) & ((uint8_t)-1 <<<br>> > -                                             (ULP_BLOB_BYTE - remaining));<br>> > -                       ulp_bs_put_msb(dst->data, dst->write_idx,<br>> > -                                      ULP_BLOB_BYTE, bluff);<br>> > -                       dst->write_idx += remaining;<br>> > -               }<br>> > -               if (write_bytes != (num - i)) {<br>> > -                       /* add the padding */<br>> > -                       ulp_blob_pad_push(dst, pad);<br>> > -                       if (remaining) {<br>> > -                               ulp_bs_put_msb(dst->data, dst->write_idx,<br>> > -                                              ULP_BLOB_BYTE - remaining,<br>> > -                                              *src_buf);<br>> > -                               dst->write_idx += ULP_BLOB_BYTE - remaining;<br>> > -                               src_buf++;<br>> > -                       }<br>> > -               }<br>> > -               i += write_bytes;<br>> > -       }<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Perform the blob buffer merge.<br>> > - * This api makes the src blob merged to the dst blob.<br>> > - * The block size and pad size help in padding the dst blob<br>> > - *<br>> > - * dst [in] The destination blob, the blob to be merged.<br>> > - * src [in] The src blob.<br>> > - * block_size [in] The size of the block in bytes after which padding gets<br>> > - *                 applied.<br>> > - * pad [in] The size of the pad to be applied.<br>> > - *<br>> > - * returns 0 on success.<br>> > - */<br>> > -int32_t<br>> > -ulp_blob_block_merge(struct ulp_blob *dst, struct ulp_blob *src,<br>> > -                    uint32_t block_size, uint32_t pad)<br>> > -{<br>> > -       if (dst->byte_order == BNXT_ULP_BYTE_ORDER_BE &&<br>> > -           src->byte_order == BNXT_ULP_BYTE_ORDER_BE)<br>> > -               return ulp_blob_msb_block_merge(dst, src, block_size, pad);<br>> > -<br>> > -       BNXT_DRV_DBG(ERR, "block merge not implemented yet\n");<br>> > -       return -EINVAL;<br>> > -}<br>> > -<br>> > -int32_t<br>> > -ulp_blob_append(struct ulp_blob *dst, struct ulp_blob *src,<br>> > -               uint16_t src_offset, uint16_t src_len)<br>> > -{<br>> > -       uint32_t k, remaining = 0;<br>> > -       uint16_t num;<br>> > -       uint8_t bluff;<br>> > -       uint8_t *src_buf = ulp_blob_data_get(src, &num);<br>> > -<br>> > -       if ((src_offset + src_len) > num)<br>> > -               return -EINVAL;<br>> > -<br>> > -       /* Only supporting BE for now */<br>> > -       if (src->byte_order != BNXT_ULP_BYTE_ORDER_BE ||<br>> > -           dst->byte_order != BNXT_ULP_BYTE_ORDER_BE)<br>> > -               return -EINVAL;<br>> > -<br>> > -       /* Handle if the source offset is not on a byte boundary */<br>> > -       remaining = src_offset % ULP_BLOB_BYTE;<br>> > -       if (remaining) {<br>> > -               bluff = src_buf[src_offset / ULP_BLOB_BYTE] & ((uint8_t)-1 >><br>> > -                                     (ULP_BLOB_BYTE - remaining));<br>> > -               ulp_bs_put_msb(dst->data, dst->write_idx,<br>> > -                              ULP_BLOB_BYTE, bluff);<br>> > -               dst->write_idx += remaining;<br>> > -               src_offset += remaining;<br>> > -       }<br>> > -<br>> > -       src_buf += ULP_BITS_2_BYTE_NR(src_offset);<br>> > -<br>> > -       /* Push the byte aligned pieces */<br>> > -       for (k = 0; k < ULP_BITS_2_BYTE_NR(src_len); k++) {<br>> > -               ulp_bs_put_msb(dst->data, dst->write_idx, ULP_BLOB_BYTE,<br>> > -                              *src_buf);<br>> > -               dst->write_idx += ULP_BLOB_BYTE;<br>> > -               src_buf++;<br>> > -       }<br>> > -<br>> > -       /* Handle the remaining if length is not a byte boundary */<br>> > -       if (src_len > remaining)<br>> > -               remaining = (src_len - remaining) % ULP_BLOB_BYTE;<br>> > -       else<br>> > -               remaining = 0;<br>> > -       if (remaining) {<br>> > -               bluff = (*src_buf) & ((uint8_t)-1 <<<br>> > -                                     (ULP_BLOB_BYTE - remaining));<br>> > -               ulp_bs_put_msb(dst->data, dst->write_idx,<br>> > -                              ULP_BLOB_BYTE, bluff);<br>> > -               dst->write_idx += remaining;<br>> > -       }<br>> > -<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Perform the blob buffer copy.<br>> > - * This api makes the src blob merged to the dst blob.<br>> > - *<br>> > - * dst [in] The destination blob, the blob to be merged.<br>> > - * src [in] The src blob.<br>> > - *<br>> > - * returns 0 on success.<br>> > - */<br>> > -int32_t<br>> > -ulp_blob_buffer_copy(struct ulp_blob *dst, struct ulp_blob *src)<br>> > -{<br>> > -       if ((dst->write_idx + src->write_idx) > dst->bitlen) {<br>> > -               BNXT_DRV_DBG(ERR, "source buffer too large\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -       if (ULP_BITS_IS_BYTE_NOT_ALIGNED(dst->write_idx) ||<br>> > -           ULP_BITS_IS_BYTE_NOT_ALIGNED(src->write_idx)) {<br>> > -               BNXT_DRV_DBG(ERR, "source buffer is not aligned\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -       memcpy(&dst->data[ULP_BITS_2_BYTE_NR(dst->write_idx)],<br>> > -              src->data, ULP_BITS_2_BYTE_NR(src->write_idx));<br>> > -       dst->write_idx += src->write_idx;<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Read data from the operand<br>> > - *<br>> > - * operand [in] A pointer to a 16 Byte operand<br>> > - *<br>> > - * val [in/out] The variable to copy the operand to<br>> > - *<br>> > - * bytes [in] The number of bytes to read into val<br>> > - *<br>> > - * returns zero on success.<br>> > - */<br>> > -int32_t<br>> > -ulp_operand_read(uint8_t *operand,<br>> > -                uint8_t *val,<br>> > -                uint16_t bytes)<br>> > -{<br>> > -       /* validate the arguments */<br>> > -       if (!operand || !val) {<br>> > -               BNXT_DRV_DBG(ERR, "invalid argument\n");<br>> > -               return -EINVAL;<br>> > -       }<br>> > -       memcpy(val, operand, bytes);<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -/*<br>> > - * Check the buffer is empty<br>> > - *<br>> > - * buf [in] The buffer<br>> > - * size [in] The size of the buffer<br>> > - *<br>> > - */<br>> > -int32_t ulp_buffer_is_empty(const uint8_t *buf, uint32_t size)<br>> > -{<br>> > -       return buf[0] == 0 && !memcmp(buf, buf + 1, size - 1);<br>> > -}<br>> > -<br>> > -/* Function to check if bitmap is zero.Return 1 on success */<br>> > -uint32_t ulp_bitmap_is_zero(uint8_t *bitmap, int32_t size)<br>> > -{<br>> > -       while (size-- > 0) {<br>> > -               if (*bitmap != 0)<br>> > -                       return 0;<br>> > -               bitmap++;<br>> > -       }<br>> > -       return 1;<br>> > -}<br>> > -<br>> > -/* Function to check if bitmap is ones. Return 1 on success */<br>> > -uint32_t ulp_bitmap_is_ones(uint8_t *bitmap, int32_t size)<br>> > -{<br>> > -       while (size-- > 0) {<br>> > -               if (*bitmap != 0xFF)<br>> > -                       return 0;<br>> > -               bitmap++;<br>> > -       }<br>> > -       return 1;<br>> > -}<br>> > -<br>> > -/* Function to check if bitmap is not zero. Return 1 on success */<br>> > -uint32_t ulp_bitmap_notzero(const uint8_t *bitmap, int32_t size)<br>> > -{<br>> > -       while (size-- > 0) {<br>> > -               if (*bitmap != 0)<br>> > -                       return 1;<br>> > -               bitmap++;<br>> > -       }<br>> > -       return 0;<br>> > -}<br>> > -<br>> > -/* returns 0 if input is power of 2 */<br>> > -int32_t ulp_util_is_power_of_2(uint64_t x)<br>> > -{<br>> > -       if (((x - 1) & x))<br>> > -               return -1;<br>> > -       return 0;<br>> > -}<br>> > --<br>> > 2.51.0<br>> ></div></div>