+static int32_t
+ulp_mapper_func_opr_compute(struct bnxt_ulp_mapper_parms *parms,
+ enum tf_dir dir,
+ enum bnxt_ulp_func_src func_src,
+ uint16_t func_opr,
+ uint64_t *result)
+{
+ uint64_t regval;
+ bool shared;
+
+ *result = false;
+ switch (func_src) {
+ case BNXT_ULP_FUNC_SRC_COMP_FIELD:
+ if (func_opr >= BNXT_ULP_CF_IDX_LAST) {
+ BNXT_TF_DBG(ERR, "invalid index %u\n", func_opr);
+ return -EINVAL;
+ }
+ *result = ULP_COMP_FLD_IDX_RD(parms, func_opr);
+ break;
+ case BNXT_ULP_FUNC_SRC_REGFILE:
+ if (!ulp_regfile_read(parms->regfile, func_opr, ®val)) {
+ BNXT_TF_DBG(ERR, "regfile[%d] read oob\n", func_opr);
+ return -EINVAL;
+ }
+ *result = tfp_be_to_cpu_64(regval);
+ break;
+ case BNXT_ULP_FUNC_SRC_GLB_REGFILE:
+ if (ulp_mapper_glb_resource_read(parms->mapper_data, dir,
+ func_opr, ®val, &shared)) {
+ BNXT_TF_DBG(ERR, "global regfile[%d] read failed.\n",
+ func_opr);
+ return -EINVAL;
+ }
+ *result = tfp_be_to_cpu_64(regval);
+ break;
+ case BNXT_ULP_FUNC_SRC_CONST:
+ *result = func_opr;
+ break;
+ default:
+ BNXT_TF_DBG(ERR, "invalid src code %u\n", func_src);
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int32_t
+ulp_mapper_func_info_process(struct bnxt_ulp_mapper_parms *parms,
+ struct bnxt_ulp_mapper_tbl_info *tbl)
+{
+ struct bnxt_ulp_mapper_func_info *func_info = &tbl->func_info;
+ uint64_t res = 0, res1 = 0, res2 = 0;
+ int32_t rc = 0;
+ uint32_t process_src1 = 0, process_src2 = 0;
+
+ /* determine which functional operands to compute */
+ switch (func_info->func_opc) {
+ case BNXT_ULP_FUNC_OPC_NOP:
+ return rc;
+ case BNXT_ULP_FUNC_OPC_EQ:
+ case BNXT_ULP_FUNC_OPC_NE:
+ case BNXT_ULP_FUNC_OPC_GE:
+ case BNXT_ULP_FUNC_OPC_GT:
+ case BNXT_ULP_FUNC_OPC_LE:
+ case BNXT_ULP_FUNC_OPC_LT:
+ process_src1 = 1;
+ process_src2 = 1;
+ break;
+ case BNXT_ULP_FUNC_OPC_COPY_SRC1_TO_RF:
+ process_src1 = 1;
+ break;
+ default:
+ break;
+ }
+
+ if (process_src1) {
+ rc = ulp_mapper_func_opr_compute(parms, tbl->direction,
+ func_info->func_src1,
+ func_info->func_opr1, &res1);
+ if (rc)
+ return rc;
+ }
+
+ if (process_src2) {
+ rc = ulp_mapper_func_opr_compute(parms, tbl->direction,
+ func_info->func_src2,
+ func_info->func_opr2, &res2);
+ if (rc)
+ return rc;
+ }
+
+ /* perform the functional opcode operations */
+ switch (func_info->func_opc) {
+ case BNXT_ULP_FUNC_OPC_EQ:
+ if (res1 == res2)
+ res = 1;
+ break;
+ case BNXT_ULP_FUNC_OPC_NE:
+ if (res1 != res2)
+ res = 1;
+ break;
+ case BNXT_ULP_FUNC_OPC_GE:
+ if (res1 >= res2)
+ res = 1;
+ break;
+ case BNXT_ULP_FUNC_OPC_GT:
+ if (res1 > res2)
+ res = 1;
+ break;
+ case BNXT_ULP_FUNC_OPC_LE:
+ if (res1 <= res2)
+ res = 1;
+ break;
+ case BNXT_ULP_FUNC_OPC_LT:
+ if (res1 < res2)
+ res = 1;
+ break;
+ case BNXT_ULP_FUNC_OPC_COPY_SRC1_TO_RF:
+ res = res1;
+ break;
+ case BNXT_ULP_FUNC_OPC_RSS_CONFIG:
+ /* apply the rss config using pmd method */
+ return bnxt_rss_config_action_apply(parms);
+ case BNXT_ULP_FUNC_OPC_GET_PARENT_MAC_ADDR:
+ rc = bnxt_pmd_get_parent_mac_addr(parms, (uint8_t *)&res);
+ if (rc)
+ return -EINVAL;
+ res = tfp_be_to_cpu_64(res);
+ break;
+ default:
+ BNXT_TF_DBG(ERR, "invalid func code %u\n", func_info->func_opc);
+ return -EINVAL;
+ }
+ if (ulp_regfile_write(parms->regfile, func_info->func_dst_opr,
+ tfp_cpu_to_be_64(res))) {
+ BNXT_TF_DBG(ERR, "Failed write the func_opc %u\n",
+ func_info->func_dst_opr);
+ return -EINVAL;
+ }
+
+ return rc;
+}
+
+