Lines Matching full:rt

6 static void ice_rt_tsr_set(struct ice_parser_rt *rt, u16 tsr)  in ice_rt_tsr_set()  argument
8 rt->gpr[ICE_GPR_TSR_IDX] = tsr; in ice_rt_tsr_set()
11 static void ice_rt_ho_set(struct ice_parser_rt *rt, u16 ho) in ice_rt_ho_set() argument
13 rt->gpr[ICE_GPR_HO_IDX] = ho; in ice_rt_ho_set()
14 memcpy(&rt->gpr[ICE_GPR_HV_IDX], &rt->pkt_buf[ho], ICE_GPR_HV_SIZE); in ice_rt_ho_set()
17 static void ice_rt_np_set(struct ice_parser_rt *rt, u16 pc) in ice_rt_np_set() argument
19 rt->gpr[ICE_GPR_NP_IDX] = pc; in ice_rt_np_set()
22 static void ice_rt_nn_set(struct ice_parser_rt *rt, u16 node) in ice_rt_nn_set() argument
24 rt->gpr[ICE_GPR_NN_IDX] = node; in ice_rt_nn_set()
28 ice_rt_flag_set(struct ice_parser_rt *rt, unsigned int idx, bool set) in ice_rt_flag_set() argument
30 struct ice_hw *hw = rt->psr->hw; in ice_rt_flag_set()
37 rt->gpr[ICE_GPR_FLG_IDX + word] |= (u16)BIT(id); in ice_rt_flag_set()
40 rt->gpr[ICE_GPR_FLG_IDX + word] &= ~(u16)BIT(id); in ice_rt_flag_set()
45 static void ice_rt_gpr_set(struct ice_parser_rt *rt, int idx, u16 val) in ice_rt_gpr_set() argument
47 struct ice_hw *hw = rt->psr->hw; in ice_rt_gpr_set()
50 ice_rt_ho_set(rt, val); in ice_rt_gpr_set()
52 rt->gpr[idx] = val; in ice_rt_gpr_set()
57 static void ice_rt_err_set(struct ice_parser_rt *rt, unsigned int idx, bool set) in ice_rt_err_set() argument
59 struct ice_hw *hw = rt->psr->hw; in ice_rt_err_set()
62 rt->gpr[ICE_GPR_ERR_IDX] |= (u16)BIT(idx); in ice_rt_err_set()
65 rt->gpr[ICE_GPR_ERR_IDX] &= ~(u16)BIT(idx); in ice_rt_err_set()
72 * @rt: pointer to the parser runtime
74 void ice_parser_rt_reset(struct ice_parser_rt *rt) in ice_parser_rt_reset() argument
76 struct ice_parser *psr = rt->psr; in ice_parser_rt_reset()
82 memset(rt, 0, sizeof(*rt)); in ice_parser_rt_reset()
83 rt->psr = psr; in ice_parser_rt_reset()
85 ice_rt_tsr_set(rt, mi->tsr); in ice_parser_rt_reset()
86 ice_rt_ho_set(rt, mi->ho); in ice_parser_rt_reset()
87 ice_rt_np_set(rt, mi->pc); in ice_parser_rt_reset()
88 ice_rt_nn_set(rt, mi->pg_rn); in ice_parser_rt_reset()
92 ice_rt_flag_set(rt, i, true); in ice_parser_rt_reset()
98 * @rt: pointer to the parser runtime
102 void ice_parser_rt_pktbuf_set(struct ice_parser_rt *rt, const u8 *pkt_buf, in ice_parser_rt_pktbuf_set() argument
106 u16 ho = rt->gpr[ICE_GPR_HO_IDX]; in ice_parser_rt_pktbuf_set()
108 memcpy(rt->pkt_buf, pkt_buf, len); in ice_parser_rt_pktbuf_set()
109 rt->pkt_len = pkt_len; in ice_parser_rt_pktbuf_set()
111 memcpy(&rt->gpr[ICE_GPR_HV_IDX], &rt->pkt_buf[ho], ICE_GPR_HV_SIZE); in ice_parser_rt_pktbuf_set()
114 static void ice_bst_key_init(struct ice_parser_rt *rt, in ice_bst_key_init() argument
117 u8 tsr = (u8)rt->gpr[ICE_GPR_TSR_IDX]; in ice_bst_key_init()
118 u16 ho = rt->gpr[ICE_GPR_HO_IDX]; in ice_bst_key_init()
119 u8 *key = rt->bst_key; in ice_bst_key_init()
134 key[i] = rt->pkt_buf[ho + idd - i]; in ice_bst_key_init()
139 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Generated Boost TCAM Key:\n"); in ice_bst_key_init()
140 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", in ice_bst_key_init()
143 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "\n"); in ice_bst_key_init()
156 static u32 ice_hv_bit_sel(struct ice_parser_rt *rt, int start, int len) in ice_hv_bit_sel() argument
164 memcpy(buf, &rt->gpr[offset], sizeof(buf)); in ice_hv_bit_sel()
175 static u32 ice_pk_build(struct ice_parser_rt *rt, in ice_pk_build() argument
179 return ice_hv_bit_sel(rt, kb->start_reg0, kb->len_reg1); in ice_pk_build()
181 return rt->gpr[kb->start_reg0] | in ice_pk_build()
182 ((u32)rt->gpr[kb->len_reg1] << BITS_PER_TYPE(u16)); in ice_pk_build()
186 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Unsupported OP Code %u\n", in ice_pk_build()
191 static bool ice_flag_get(struct ice_parser_rt *rt, unsigned int index) in ice_flag_get() argument
196 return !!(rt->gpr[ICE_GPR_FLG_IDX + word] & (u16)BIT(id)); in ice_flag_get()
199 static int ice_imem_pgk_init(struct ice_parser_rt *rt, in ice_imem_pgk_init() argument
202 memset(&rt->pg_key, 0, sizeof(rt->pg_key)); in ice_imem_pgk_init()
203 rt->pg_key.next_proto = ice_pk_build(rt, &imem->np_kb); in ice_imem_pgk_init()
204 if (rt->pg_key.next_proto == U32_MAX) in ice_imem_pgk_init()
208 rt->pg_key.flag0 = ice_flag_get(rt, imem->pg_kb.flag0_idx); in ice_imem_pgk_init()
210 rt->pg_key.flag1 = ice_flag_get(rt, imem->pg_kb.flag1_idx); in ice_imem_pgk_init()
212 rt->pg_key.flag2 = ice_flag_get(rt, imem->pg_kb.flag2_idx); in ice_imem_pgk_init()
214 rt->pg_key.flag3 = ice_flag_get(rt, imem->pg_kb.flag3_idx); in ice_imem_pgk_init()
216 rt->pg_key.alu_reg = rt->gpr[imem->pg_kb.alu_reg_idx]; in ice_imem_pgk_init()
217 rt->pg_key.node_id = rt->gpr[ICE_GPR_NN_IDX]; in ice_imem_pgk_init()
219 …ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Generate Parse Graph Key: node_id(%d), flag0-3(%d,%d,%d,%d… in ice_imem_pgk_init()
220 rt->pg_key.node_id, in ice_imem_pgk_init()
221 rt->pg_key.flag0, in ice_imem_pgk_init()
222 rt->pg_key.flag1, in ice_imem_pgk_init()
223 rt->pg_key.flag2, in ice_imem_pgk_init()
224 rt->pg_key.flag3, in ice_imem_pgk_init()
225 rt->pg_key.boost_idx, in ice_imem_pgk_init()
226 rt->pg_key.alu_reg, in ice_imem_pgk_init()
227 rt->pg_key.next_proto); in ice_imem_pgk_init()
232 static void ice_imem_alu0_set(struct ice_parser_rt *rt, in ice_imem_alu0_set() argument
235 rt->alu0 = &imem->alu0; in ice_imem_alu0_set()
236 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Load ALU0 from imem pc %d\n", in ice_imem_alu0_set()
240 static void ice_imem_alu1_set(struct ice_parser_rt *rt, in ice_imem_alu1_set() argument
243 rt->alu1 = &imem->alu1; in ice_imem_alu1_set()
244 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Load ALU1 from imem pc %d\n", in ice_imem_alu1_set()
248 static void ice_imem_alu2_set(struct ice_parser_rt *rt, in ice_imem_alu2_set() argument
251 rt->alu2 = &imem->alu2; in ice_imem_alu2_set()
252 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Load ALU2 from imem pc %d\n", in ice_imem_alu2_set()
256 static void ice_imem_pgp_set(struct ice_parser_rt *rt, in ice_imem_pgp_set() argument
259 rt->pg_prio = imem->pg_prio; in ice_imem_pgp_set()
260 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Load PG priority %d from imem pc %d\n", in ice_imem_pgp_set()
261 rt->pg_prio, imem->idx); in ice_imem_pgp_set()
264 static int ice_bst_pgk_init(struct ice_parser_rt *rt, in ice_bst_pgk_init() argument
267 memset(&rt->pg_key, 0, sizeof(rt->pg_key)); in ice_bst_pgk_init()
268 rt->pg_key.boost_idx = bst->hit_idx_grp; in ice_bst_pgk_init()
269 rt->pg_key.next_proto = ice_pk_build(rt, &bst->np_kb); in ice_bst_pgk_init()
270 if (rt->pg_key.next_proto == U32_MAX) in ice_bst_pgk_init()
274 rt->pg_key.flag0 = ice_flag_get(rt, bst->pg_kb.flag0_idx); in ice_bst_pgk_init()
276 rt->pg_key.flag1 = ice_flag_get(rt, bst->pg_kb.flag1_idx); in ice_bst_pgk_init()
278 rt->pg_key.flag2 = ice_flag_get(rt, bst->pg_kb.flag2_idx); in ice_bst_pgk_init()
280 rt->pg_key.flag3 = ice_flag_get(rt, bst->pg_kb.flag3_idx); in ice_bst_pgk_init()
282 rt->pg_key.alu_reg = rt->gpr[bst->pg_kb.alu_reg_idx]; in ice_bst_pgk_init()
283 rt->pg_key.node_id = rt->gpr[ICE_GPR_NN_IDX]; in ice_bst_pgk_init()
285 …ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Generate Parse Graph Key: node_id(%d), flag0-3(%d,%d,%d,%d… in ice_bst_pgk_init()
286 rt->pg_key.node_id, in ice_bst_pgk_init()
287 rt->pg_key.flag0, in ice_bst_pgk_init()
288 rt->pg_key.flag1, in ice_bst_pgk_init()
289 rt->pg_key.flag2, in ice_bst_pgk_init()
290 rt->pg_key.flag3, in ice_bst_pgk_init()
291 rt->pg_key.boost_idx, in ice_bst_pgk_init()
292 rt->pg_key.alu_reg, in ice_bst_pgk_init()
293 rt->pg_key.next_proto); in ice_bst_pgk_init()
298 static void ice_bst_alu0_set(struct ice_parser_rt *rt, in ice_bst_alu0_set() argument
301 rt->alu0 = &bst->alu0; in ice_bst_alu0_set()
302 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Load ALU0 from boost address %d\n", in ice_bst_alu0_set()
306 static void ice_bst_alu1_set(struct ice_parser_rt *rt, in ice_bst_alu1_set() argument
309 rt->alu1 = &bst->alu1; in ice_bst_alu1_set()
310 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Load ALU1 from boost address %d\n", in ice_bst_alu1_set()
314 static void ice_bst_alu2_set(struct ice_parser_rt *rt, in ice_bst_alu2_set() argument
317 rt->alu2 = &bst->alu2; in ice_bst_alu2_set()
318 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Load ALU2 from boost address %d\n", in ice_bst_alu2_set()
322 static void ice_bst_pgp_set(struct ice_parser_rt *rt, in ice_bst_pgp_set() argument
325 rt->pg_prio = bst->pg_prio; in ice_bst_pgp_set()
326 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Load PG priority %d from boost address %d\n", in ice_bst_pgp_set()
327 rt->pg_prio, bst->addr); in ice_bst_pgp_set()
330 static struct ice_pg_cam_item *ice_rt_pg_cam_match(struct ice_parser_rt *rt) in ice_rt_pg_cam_match() argument
332 struct ice_parser *psr = rt->psr; in ice_rt_pg_cam_match()
336 &rt->pg_key); in ice_rt_pg_cam_match()
339 ICE_PG_SP_CAM_TABLE_SIZE, &rt->pg_key); in ice_rt_pg_cam_match()
344 struct ice_pg_nm_cam_item *ice_rt_pg_nm_cam_match(struct ice_parser_rt *rt) in ice_rt_pg_nm_cam_match() argument
346 struct ice_parser *psr = rt->psr; in ice_rt_pg_nm_cam_match()
350 ICE_PG_NM_CAM_TABLE_SIZE, &rt->pg_key); in ice_rt_pg_nm_cam_match()
355 &rt->pg_key); in ice_rt_pg_nm_cam_match()
359 static void ice_gpr_add(struct ice_parser_rt *rt, int idx, u16 val) in ice_gpr_add() argument
361 rt->pu.gpr_val_upd[idx] = true; in ice_gpr_add()
362 rt->pu.gpr_val[idx] = val; in ice_gpr_add()
364 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Pending update for register %d value %d\n", in ice_gpr_add()
368 static void ice_pg_exe(struct ice_parser_rt *rt) in ice_pg_exe() argument
370 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Executing ParseGraph action ...\n"); in ice_pg_exe()
372 ice_gpr_add(rt, ICE_GPR_NP_IDX, rt->action->next_pc); in ice_pg_exe()
373 ice_gpr_add(rt, ICE_GPR_NN_IDX, rt->action->next_node); in ice_pg_exe()
375 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Executing ParseGraph action done.\n"); in ice_pg_exe()
378 static void ice_flg_add(struct ice_parser_rt *rt, int idx, bool val) in ice_flg_add() argument
380 rt->pu.flg_msk |= BIT_ULL(idx); in ice_flg_add()
382 rt->pu.flg_val |= BIT_ULL(idx); in ice_flg_add()
384 rt->pu.flg_val &= ~BIT_ULL(idx); in ice_flg_add()
386 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Pending update for flag %d value %d\n", in ice_flg_add()
390 static void ice_flg_update(struct ice_parser_rt *rt, struct ice_alu *alu) in ice_flg_update() argument
400 ice_flg_add(rt, alu->dst_start + i, in ice_flg_update()
404 hv_bit_sel = ice_hv_bit_sel(rt, in ice_flg_update()
407 ice_flg_add(rt, alu->dst_start + i, !!hv_bit_sel); in ice_flg_update()
412 static void ice_po_update(struct ice_parser_rt *rt, struct ice_alu *alu) in ice_po_update() argument
415 rt->po = (u16)(rt->gpr[ICE_GPR_HO_IDX] + alu->proto_offset); in ice_po_update()
417 rt->po = (u16)(rt->gpr[ICE_GPR_HO_IDX] - alu->proto_offset); in ice_po_update()
419 rt->po = rt->gpr[ICE_GPR_HO_IDX]; in ice_po_update()
421 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Update Protocol Offset = %d\n", in ice_po_update()
422 rt->po); in ice_po_update()
425 static u16 ice_reg_bit_sel(struct ice_parser_rt *rt, int reg_idx, in ice_reg_bit_sel() argument
433 memcpy(&val, &rt->gpr[offset], sizeof(val)); in ice_reg_bit_sel()
441 static void ice_err_add(struct ice_parser_rt *rt, int idx, bool val) in ice_err_add() argument
443 rt->pu.err_msk |= (u16)BIT(idx); in ice_err_add()
445 rt->pu.flg_val |= (u64)BIT_ULL(idx); in ice_err_add()
447 rt->pu.flg_val &= ~(u64)BIT_ULL(idx); in ice_err_add()
449 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Pending update for error %d value %d\n", in ice_err_add()
453 static void ice_dst_reg_bit_set(struct ice_parser_rt *rt, struct ice_alu *alu, in ice_dst_reg_bit_set() argument
459 …ice_debug(rt->psr->hw, ICE_DBG_PARSER, "DedicatedFlagsEnable should not be enabled in opcode %d\n", in ice_dst_reg_bit_set()
466 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Invalid error %d\n", in ice_dst_reg_bit_set()
470 ice_err_add(rt, alu->dst_start, val); in ice_dst_reg_bit_set()
476 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Invalid flag %d\n", in ice_dst_reg_bit_set()
480 ice_flg_add(rt, flg_idx, val); in ice_dst_reg_bit_set()
482 …ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Unexpected Dest Register Bit set, RegisterID %d Start %d\n… in ice_dst_reg_bit_set()
487 static void ice_alu_exe(struct ice_parser_rt *rt, struct ice_alu *alu) in ice_alu_exe() argument
492 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "shift_xlate_sel != 0 is not expected\n"); in ice_alu_exe()
496 ice_po_update(rt, alu); in ice_alu_exe()
497 ice_flg_update(rt, alu); in ice_alu_exe()
499 dst = rt->gpr[alu->dst_reg_id]; in ice_alu_exe()
500 src = ice_reg_bit_sel(rt, alu->src_reg_id, in ice_alu_exe()
510 ice_gpr_add(rt, alu->dst_reg_id, dst); in ice_alu_exe()
514 ice_gpr_add(rt, alu->dst_reg_id, dst); in ice_alu_exe()
518 ice_dst_reg_bit_set(rt, alu, true); in ice_alu_exe()
519 ice_gpr_add(rt, ICE_GPR_NP_IDX, alu->branch_addr); in ice_alu_exe()
523 ice_dst_reg_bit_set(rt, alu, true); in ice_alu_exe()
524 ice_gpr_add(rt, ICE_GPR_NP_IDX, alu->branch_addr); in ice_alu_exe()
527 ice_dst_reg_bit_set(rt, alu, src == imm); in ice_alu_exe()
528 ice_gpr_add(rt, ICE_GPR_NP_IDX, alu->branch_addr); in ice_alu_exe()
532 ice_gpr_add(rt, alu->dst_reg_id, dst); in ice_alu_exe()
535 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Unsupported ALU instruction %d\n", in ice_alu_exe()
541 static void ice_alu0_exe(struct ice_parser_rt *rt) in ice_alu0_exe() argument
543 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Executing ALU0 ...\n"); in ice_alu0_exe()
544 ice_alu_exe(rt, rt->alu0); in ice_alu0_exe()
545 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Executing ALU0 done.\n"); in ice_alu0_exe()
548 static void ice_alu1_exe(struct ice_parser_rt *rt) in ice_alu1_exe() argument
550 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Executing ALU1 ...\n"); in ice_alu1_exe()
551 ice_alu_exe(rt, rt->alu1); in ice_alu1_exe()
552 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Executing ALU1 done.\n"); in ice_alu1_exe()
555 static void ice_alu2_exe(struct ice_parser_rt *rt) in ice_alu2_exe() argument
557 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Executing ALU2 ...\n"); in ice_alu2_exe()
558 ice_alu_exe(rt, rt->alu2); in ice_alu2_exe()
559 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Executing ALU2 done.\n"); in ice_alu2_exe()
562 static void ice_pu_exe(struct ice_parser_rt *rt) in ice_pu_exe() argument
564 struct ice_gpr_pu *pu = &rt->pu; in ice_pu_exe()
567 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Updating Registers ...\n"); in ice_pu_exe()
571 ice_rt_gpr_set(rt, i, pu->gpr_val[i]); in ice_pu_exe()
576 ice_rt_flag_set(rt, i, pu->flg_val & BIT(i)); in ice_pu_exe()
581 ice_rt_err_set(rt, i, pu->err_val & BIT(i)); in ice_pu_exe()
584 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Updating Registers done.\n"); in ice_pu_exe()
587 static void ice_alu_pg_exe(struct ice_parser_rt *rt) in ice_alu_pg_exe() argument
589 memset(&rt->pu, 0, sizeof(rt->pu)); in ice_alu_pg_exe()
591 switch (rt->pg_prio) { in ice_alu_pg_exe()
593 ice_pg_exe(rt); in ice_alu_pg_exe()
594 ice_alu0_exe(rt); in ice_alu_pg_exe()
595 ice_alu1_exe(rt); in ice_alu_pg_exe()
596 ice_alu2_exe(rt); in ice_alu_pg_exe()
599 ice_alu0_exe(rt); in ice_alu_pg_exe()
600 ice_pg_exe(rt); in ice_alu_pg_exe()
601 ice_alu1_exe(rt); in ice_alu_pg_exe()
602 ice_alu2_exe(rt); in ice_alu_pg_exe()
605 ice_alu0_exe(rt); in ice_alu_pg_exe()
606 ice_alu1_exe(rt); in ice_alu_pg_exe()
607 ice_pg_exe(rt); in ice_alu_pg_exe()
608 ice_alu2_exe(rt); in ice_alu_pg_exe()
611 ice_alu0_exe(rt); in ice_alu_pg_exe()
612 ice_alu1_exe(rt); in ice_alu_pg_exe()
613 ice_alu2_exe(rt); in ice_alu_pg_exe()
614 ice_pg_exe(rt); in ice_alu_pg_exe()
618 ice_pu_exe(rt); in ice_alu_pg_exe()
620 if (rt->action->ho_inc == 0) in ice_alu_pg_exe()
623 if (rt->action->ho_polarity) in ice_alu_pg_exe()
624 ice_rt_ho_set(rt, rt->gpr[ICE_GPR_HO_IDX] + rt->action->ho_inc); in ice_alu_pg_exe()
626 ice_rt_ho_set(rt, rt->gpr[ICE_GPR_HO_IDX] - rt->action->ho_inc); in ice_alu_pg_exe()
629 static void ice_proto_off_update(struct ice_parser_rt *rt) in ice_proto_off_update() argument
631 struct ice_parser *psr = rt->psr; in ice_proto_off_update()
633 if (rt->action->is_pg) { in ice_proto_off_update()
635 &psr->proto_grp_table[rt->action->proto_id]; in ice_proto_off_update()
646 po = rt->po + entry->offset; in ice_proto_off_update()
648 po = rt->po - entry->offset; in ice_proto_off_update()
650 rt->protocols[entry->proto_id] = true; in ice_proto_off_update()
651 rt->offsets[entry->proto_id] = po; in ice_proto_off_update()
653 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Set Protocol %d at offset %d\n", in ice_proto_off_update()
657 rt->protocols[rt->action->proto_id] = true; in ice_proto_off_update()
658 rt->offsets[rt->action->proto_id] = rt->po; in ice_proto_off_update()
660 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Set Protocol %d at offset %d\n", in ice_proto_off_update()
661 rt->action->proto_id, rt->po); in ice_proto_off_update()
665 static void ice_marker_set(struct ice_parser_rt *rt, int idx) in ice_marker_set() argument
670 rt->markers[byte] |= (u8)BIT(bit); in ice_marker_set()
673 static void ice_marker_update(struct ice_parser_rt *rt) in ice_marker_update() argument
675 struct ice_parser *psr = rt->psr; in ice_marker_update()
677 if (rt->action->is_mg) { in ice_marker_update()
679 &psr->mk_grp_table[rt->action->marker_id]; in ice_marker_update()
688 ice_marker_set(rt, marker); in ice_marker_update()
689 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Set Marker %d\n", in ice_marker_update()
693 if (rt->action->marker_id != ICE_MARKER_MAX_SIZE) in ice_marker_update()
694 ice_marker_set(rt, rt->action->marker_id); in ice_marker_update()
696 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Set Marker %d\n", in ice_marker_update()
697 rt->action->marker_id); in ice_marker_update()
701 static u16 ice_ptype_resolve(struct ice_parser_rt *rt) in ice_ptype_resolve() argument
704 struct ice_parser *psr = rt->psr; in ice_ptype_resolve()
707 rt->markers, ICE_MARKER_ID_SIZE); in ice_ptype_resolve()
711 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Could not resolve PTYPE\n"); in ice_ptype_resolve()
715 static void ice_proto_off_resolve(struct ice_parser_rt *rt, in ice_proto_off_resolve() argument
721 if (rt->protocols[i]) { in ice_proto_off_resolve()
723 rslt->po[rslt->po_num].offset = rt->offsets[i]; in ice_proto_off_resolve()
729 static void ice_result_resolve(struct ice_parser_rt *rt, in ice_result_resolve() argument
732 struct ice_parser *psr = rt->psr; in ice_result_resolve()
736 memcpy(&rslt->flags_psr, &rt->gpr[ICE_GPR_FLG_IDX], in ice_result_resolve()
743 ice_proto_off_resolve(rt, rslt); in ice_result_resolve()
744 rslt->ptype = ice_ptype_resolve(rt); in ice_result_resolve()
749 * @rt: pointer to the parser runtime
754 int ice_parser_rt_execute(struct ice_parser_rt *rt, in ice_parser_rt_execute() argument
758 struct ice_parser *psr = rt->psr; in ice_parser_rt_execute()
764 node = rt->gpr[ICE_GPR_NN_IDX]; in ice_parser_rt_execute()
765 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Start with Node: %u\n", node); in ice_parser_rt_execute()
771 pc = rt->gpr[ICE_GPR_NP_IDX]; in ice_parser_rt_execute()
773 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Load imem at pc: %u\n", in ice_parser_rt_execute()
776 ice_bst_key_init(rt, imem); in ice_parser_rt_execute()
777 bst = ice_bst_tcam_match(psr->bst_tcam_table, rt->bst_key); in ice_parser_rt_execute()
779 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "No Boost TCAM Match\n"); in ice_parser_rt_execute()
780 status = ice_imem_pgk_init(rt, imem); in ice_parser_rt_execute()
783 ice_imem_alu0_set(rt, imem); in ice_parser_rt_execute()
784 ice_imem_alu1_set(rt, imem); in ice_parser_rt_execute()
785 ice_imem_alu2_set(rt, imem); in ice_parser_rt_execute()
786 ice_imem_pgp_set(rt, imem); in ice_parser_rt_execute()
788 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Boost TCAM Match address: %u\n", in ice_parser_rt_execute()
791 status = ice_bst_pgk_init(rt, bst); in ice_parser_rt_execute()
794 ice_bst_pgp_set(rt, bst); in ice_parser_rt_execute()
796 status = ice_imem_pgk_init(rt, imem); in ice_parser_rt_execute()
799 ice_imem_pgp_set(rt, imem); in ice_parser_rt_execute()
803 ice_bst_alu0_set(rt, bst); in ice_parser_rt_execute()
805 ice_imem_alu0_set(rt, imem); in ice_parser_rt_execute()
808 ice_bst_alu1_set(rt, bst); in ice_parser_rt_execute()
810 ice_imem_alu1_set(rt, imem); in ice_parser_rt_execute()
813 ice_bst_alu2_set(rt, bst); in ice_parser_rt_execute()
815 ice_imem_alu2_set(rt, imem); in ice_parser_rt_execute()
818 rt->action = NULL; in ice_parser_rt_execute()
819 pg_cam = ice_rt_pg_cam_match(rt); in ice_parser_rt_execute()
821 pg_nm_cam = ice_rt_pg_nm_cam_match(rt); in ice_parser_rt_execute()
823 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Match ParseGraph Nomatch CAM Address %u\n", in ice_parser_rt_execute()
825 rt->action = &pg_nm_cam->action; in ice_parser_rt_execute()
828 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Match ParseGraph CAM Address %u\n", in ice_parser_rt_execute()
830 rt->action = &pg_cam->action; in ice_parser_rt_execute()
833 if (!rt->action) { in ice_parser_rt_execute()
834 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Failed to match ParseGraph CAM, stop parsing.\n"); in ice_parser_rt_execute()
839 ice_alu_pg_exe(rt); in ice_parser_rt_execute()
840 ice_marker_update(rt); in ice_parser_rt_execute()
841 ice_proto_off_update(rt); in ice_parser_rt_execute()
843 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Go to node %u\n", in ice_parser_rt_execute()
844 rt->action->next_node); in ice_parser_rt_execute()
846 if (rt->action->is_last_round) { in ice_parser_rt_execute()
847 ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Last Round in ParseGraph Action, stop parsing.\n"); in ice_parser_rt_execute()
851 if (rt->gpr[ICE_GPR_HO_IDX] >= rt->pkt_len) { in ice_parser_rt_execute()
852 …ice_debug(rt->psr->hw, ICE_DBG_PARSER, "Header Offset (%u) is larger than packet len (%u), stop pa… in ice_parser_rt_execute()
853 rt->gpr[ICE_GPR_HO_IDX], rt->pkt_len); in ice_parser_rt_execute()
858 ice_result_resolve(rt, rslt); in ice_parser_rt_execute()