- break;
- case BNXT_ULP_MAPPER_OPC_SET_TO_HDR_FIELD:
- if (!ulp_operand_read(operand, (uint8_t *)&idx,
- sizeof(uint16_t))) {
- BNXT_TF_DBG(ERR, "%s key operand read failed.\n", name);
- return -EINVAL;
- }
- idx = tfp_be_to_cpu_16(idx);
- if (is_key)
- val = parms->hdr_field[idx].spec;
- else
- val = parms->hdr_field[idx].mask;
-
- /*
- * Need to account for how much data was pushed to the header
- * field vs how much is to be inserted in the key/mask.
- */
- field_size = parms->hdr_field[idx].size;
- if (bitlen < ULP_BYTE_2_BITS(field_size)) {
- field_size = field_size - ((bitlen + 7) / 8);
- val += field_size;
- }
-
- if (!ulp_blob_push(blob, val, bitlen)) {
- BNXT_TF_DBG(ERR, "%s push to key blob failed\n", name);
- return -EINVAL;
- }
- break;
- case BNXT_ULP_MAPPER_OPC_SET_TO_COMP_FIELD:
- if (!ulp_operand_read(operand, (uint8_t *)&idx,
- sizeof(uint16_t))) {
- BNXT_TF_DBG(ERR, "%s key operand read failed.\n", name);
- return -EINVAL;
- }
- idx = tfp_be_to_cpu_16(idx);
- if (idx < BNXT_ULP_CF_IDX_LAST)
- val = ulp_blob_push_32(blob, &parms->comp_fld[idx],
- bitlen);
- if (!val) {
- BNXT_TF_DBG(ERR, "%s push to key blob failed\n", name);
- return -EINVAL;
- }
- break;
- case BNXT_ULP_MAPPER_OPC_SET_TO_REGFILE:
- if (!ulp_operand_read(operand, (uint8_t *)&idx,
- sizeof(uint16_t))) {
- BNXT_TF_DBG(ERR, "%s key operand read failed.\n", name);
- return -EINVAL;
- }
- idx = tfp_be_to_cpu_16(idx);
-
- if (!ulp_regfile_read(regfile, idx, &val64)) {
- BNXT_TF_DBG(ERR, "%s regfile[%d] read failed.\n",
- name, idx);
- return -EINVAL;
- }
-
- val = ulp_blob_push_64(blob, &val64, bitlen);
- if (!val) {
- BNXT_TF_DBG(ERR, "%s push to key blob failed\n", name);
- return -EINVAL;
- }
- break;
- case BNXT_ULP_MAPPER_OPC_SET_TO_GLB_REGFILE:
- if (!ulp_operand_read(operand, (uint8_t *)&idx,
- sizeof(uint16_t))) {
- BNXT_TF_DBG(ERR, "%s key operand read failed.\n", name);
- return -EINVAL;
- }
- idx = tfp_be_to_cpu_16(idx);
- if (ulp_mapper_glb_resource_read(parms->mapper_data,
- dir,
- idx, &val64)) {
- BNXT_TF_DBG(ERR, "%s regfile[%d] read failed.\n",
- name, idx);
- return -EINVAL;
- }
- val = ulp_blob_push_64(blob, &val64, bitlen);
- if (!val) {
- BNXT_TF_DBG(ERR, "%s push to key blob failed\n", name);
- return -EINVAL;
- }
- break;
- default:
- BNXT_TF_DBG(ERR, "invalid keymask mapper opcode 0x%x\n",
- opcode);
- return -EINVAL;
- }
- return 0;
-}
-
-static int32_t
-ulp_mapper_mark_gfid_process(struct bnxt_ulp_mapper_parms *parms,
- struct bnxt_ulp_mapper_tbl_info *tbl,
- uint64_t flow_id)
-{
- struct ulp_flow_db_res_params fid_parms;
- uint32_t mark, gfid, mark_flag;
- enum bnxt_ulp_mark_db_opc mark_op = tbl->mark_db_opcode;
- int32_t rc = 0;
-
- if (mark_op == BNXT_ULP_MARK_DB_OPC_NOP ||
- !(mark_op == BNXT_ULP_MARK_DB_OPC_PUSH_IF_MARK_ACTION &&
- ULP_BITMAP_ISSET(parms->act_bitmap->bits,
- BNXT_ULP_ACTION_BIT_MARK)))
- return rc; /* no need to perform gfid process */
-
- /* Get the mark id details from action property */
- memcpy(&mark, &parms->act_prop->act_details[BNXT_ULP_ACT_PROP_IDX_MARK],
- sizeof(mark));
- mark = tfp_be_to_cpu_32(mark);
-
- TF_GET_GFID_FROM_FLOW_ID(flow_id, gfid);
- mark_flag = BNXT_ULP_MARK_GLOBAL_HW_FID;