- default:
- BNXT_TF_DBG(ERR, "Invalid port_data %s\n", fld->description);
- return -EINVAL;
- }
- return 0;
-}
-
-static int32_t
-ulp_mapper_field_process_inc_dec(struct bnxt_ulp_mapper_field_info *fld,
- struct ulp_blob *blob,
- uint64_t *val64,
- uint16_t const_val16,
- uint32_t bitlen,
- uint32_t *update_flag)
-{
- uint64_t l_val64 = *val64;
-
- if (fld->field_opc == BNXT_ULP_FIELD_OPC_SRC1_PLUS_CONST ||
- fld->field_opc == BNXT_ULP_FIELD_OPC_SRC1_PLUS_CONST_POST) {
- l_val64 += const_val16;
- l_val64 = tfp_be_to_cpu_64(l_val64);
- ulp_blob_push_64(blob, &l_val64, bitlen);
- } else if (fld->field_opc == BNXT_ULP_FIELD_OPC_SRC1_MINUS_CONST ||
- fld->field_opc == BNXT_ULP_FIELD_OPC_SRC1_MINUS_CONST_POST) {
- l_val64 -= const_val16;
- l_val64 = tfp_be_to_cpu_64(l_val64);
- ulp_blob_push_64(blob, &l_val64, bitlen);
- } else {
- BNXT_TF_DBG(ERR, "Invalid field opcode %u\n", fld->field_opc);
- return -EINVAL;
- }
-
- if (fld->field_opc == BNXT_ULP_FIELD_OPC_SRC1_MINUS_CONST_POST ||
- fld->field_opc == BNXT_ULP_FIELD_OPC_SRC1_PLUS_CONST_POST) {
- *val64 = l_val64;
- *update_flag = 1;
- }
- return 0;
-}
-
-static int32_t
-ulp_mapper_field_process(struct bnxt_ulp_mapper_parms *parms,
- enum tf_dir dir,
- struct bnxt_ulp_mapper_field_info *fld,
- struct ulp_blob *blob,
- uint8_t is_key,
- const char *name)
-{
- uint32_t val_size = 0, field_size = 0;
- uint64_t hdr_bit, act_bit, regval;
- uint16_t write_idx = blob->write_idx;
- uint16_t idx, size_idx, bitlen, offset;
- uint8_t *val = NULL;
- uint8_t tmpval[16];
- uint8_t bit;
- uint32_t src1_sel = 0;
- enum bnxt_ulp_field_src fld_src;
- uint8_t *fld_src_oper;
- enum bnxt_ulp_field_cond_src field_cond_src;
- uint16_t const_val = 0;
- uint32_t update_flag = 0;
- uint64_t src1_val64;
- uint32_t port_id;
-
- /* process the field opcode */
- if (fld->field_opc != BNXT_ULP_FIELD_OPC_COND_OP) {
- field_cond_src = BNXT_ULP_FIELD_COND_SRC_TRUE;
- /* Read the constant from the second operand */
- memcpy(&const_val, fld->field_opr2, sizeof(uint16_t));
- const_val = tfp_be_to_cpu_16(const_val);
- } else {
- field_cond_src = fld->field_cond_src;
- }
-
- bitlen = fld->field_bit_size;
- /* Evaluate the condition */
- switch (field_cond_src) {
- case BNXT_ULP_FIELD_COND_SRC_TRUE:
- src1_sel = 1;
- break;
- case BNXT_ULP_FIELD_COND_SRC_CF:
- if (!ulp_operand_read(fld->field_cond_opr,
- (uint8_t *)&idx, sizeof(uint16_t))) {
- BNXT_TF_DBG(ERR, "%s operand read failed.\n", name);
- return -EINVAL;
- }
- idx = tfp_be_to_cpu_16(idx);
- if (idx >= BNXT_ULP_CF_IDX_LAST) {
- BNXT_TF_DBG(ERR, "%s invalid index %u\n", name, idx);
- return -EINVAL;
- }
- /* check if the computed field is set */
- if (ULP_COMP_FLD_IDX_RD(parms, idx))
- src1_sel = 1;
- break;
- case BNXT_ULP_FIELD_COND_SRC_RF:
- if (!ulp_operand_read(fld->field_cond_opr,
- (uint8_t *)&idx, sizeof(uint16_t))) {
- BNXT_TF_DBG(ERR, "%s operand read failed\n", name);
- return -EINVAL;
- }
-
- idx = tfp_be_to_cpu_16(idx);
- /* Uninitialized regfile entries return 0 */
- if (!ulp_regfile_read(parms->regfile, idx, ®val)) {
- BNXT_TF_DBG(ERR, "%s regfile[%d] read oob\n",
- name, idx);
- return -EINVAL;
- }
- if (regval)
- src1_sel = 1;
- break;
- case BNXT_ULP_FIELD_COND_SRC_ACT_BIT:
- if (!ulp_operand_read(fld->field_cond_opr,
- (uint8_t *)&act_bit, sizeof(uint64_t))) {
- BNXT_TF_DBG(ERR, "%s operand read failed\n", name);
- return -EINVAL;
- }
- act_bit = tfp_be_to_cpu_64(act_bit);
- if (ULP_BITMAP_ISSET(parms->act_bitmap->bits, act_bit))
- src1_sel = 1;
- break;
- case BNXT_ULP_FIELD_COND_SRC_HDR_BIT:
- if (!ulp_operand_read(fld->field_cond_opr,
- (uint8_t *)&hdr_bit, sizeof(uint64_t))) {
- BNXT_TF_DBG(ERR, "%s operand read failed\n", name);