1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
5 #include "cnxk_ethdev.h"
6 #include <rte_mtr_driver.h>
8 #define NIX_MTR_COUNT_MAX 73 /* 64(leaf) + 8(mid) + 1(top) */
9 #define NIX_MTR_COUNT_PER_FLOW 3 /* 1(leaf) + 1(mid) + 1(top) */
11 #define NIX_BPF_STATS_MASK_ALL \
13 ROC_NIX_BPF_GREEN_PKT_F_PASS | ROC_NIX_BPF_GREEN_OCTS_F_PASS | \
14 ROC_NIX_BPF_GREEN_PKT_F_DROP | \
15 ROC_NIX_BPF_GREEN_OCTS_F_DROP | \
16 ROC_NIX_BPF_YELLOW_PKT_F_PASS | \
17 ROC_NIX_BPF_YELLOW_OCTS_F_PASS | \
18 ROC_NIX_BPF_YELLOW_PKT_F_DROP | \
19 ROC_NIX_BPF_YELLOW_OCTS_F_DROP | \
20 ROC_NIX_BPF_RED_PKT_F_PASS | \
21 ROC_NIX_BPF_RED_OCTS_F_PASS | \
22 ROC_NIX_BPF_RED_PKT_F_DROP | \
23 ROC_NIX_BPF_RED_OCTS_F_DROP \
26 static const enum roc_nix_bpf_level_flag lvl_map[] = {ROC_NIX_BPF_LEVEL_F_LEAF,
27 ROC_NIX_BPF_LEVEL_F_MID,
28 ROC_NIX_BPF_LEVEL_F_TOP};
30 static struct rte_mtr_capabilities mtr_capa = {
31 .n_shared_max = NIX_MTR_COUNT_PER_FLOW,
33 .shared_identical = true,
34 /* .shared_n_flows_per_mtr_max = ,*/
35 .chaining_n_mtrs_per_flow_max = NIX_MTR_COUNT_PER_FLOW,
36 .chaining_use_prev_mtr_color_supported = true,
37 .chaining_use_prev_mtr_color_enforced = true,
38 .color_aware_srtcm_rfc2697_supported = true,
39 .color_aware_trtcm_rfc2698_supported = true,
40 .color_aware_trtcm_rfc4115_supported = true,
41 .srtcm_rfc2697_byte_mode_supported = true,
42 .srtcm_rfc2697_packet_mode_supported = true,
43 .trtcm_rfc2698_byte_mode_supported = true,
44 .trtcm_rfc2698_packet_mode_supported = true,
45 .trtcm_rfc4115_byte_mode_supported = true,
46 .trtcm_rfc4115_packet_mode_supported = true,
47 .stats_mask = RTE_MTR_STATS_N_PKTS_GREEN | RTE_MTR_STATS_N_PKTS_YELLOW |
48 RTE_MTR_STATS_N_PKTS_RED | RTE_MTR_STATS_N_PKTS_DROPPED |
49 RTE_MTR_STATS_N_BYTES_GREEN |
50 RTE_MTR_STATS_N_BYTES_YELLOW | RTE_MTR_STATS_N_BYTES_RED |
51 RTE_MTR_STATS_N_BYTES_DROPPED};
53 static struct cnxk_meter_node *
54 nix_mtr_find(struct cnxk_eth_dev *dev, uint32_t meter_id)
56 struct cnxk_mtr *fms = &dev->mtr;
57 struct cnxk_meter_node *fm;
59 TAILQ_FOREACH(fm, fms, next)
60 if (meter_id == fm->id)
65 static struct cnxk_mtr_profile_node *
66 nix_mtr_profile_find(struct cnxk_eth_dev *dev, uint32_t profile_id)
68 struct cnxk_mtr_profiles *fmps = &dev->mtr_profiles;
69 struct cnxk_mtr_profile_node *fmp;
71 TAILQ_FOREACH(fmp, fmps, next)
72 if (profile_id == fmp->id)
78 static struct cnxk_mtr_policy_node *
79 nix_mtr_policy_find(struct cnxk_eth_dev *dev, uint32_t meter_policy_id)
81 struct cnxk_mtr_policy *fmps = &dev->mtr_policy;
82 struct cnxk_mtr_policy_node *fmp;
84 TAILQ_FOREACH(fmp, fmps, next)
85 if (meter_policy_id == fmp->id)
91 nix_mtr_profile_validate(struct cnxk_eth_dev *dev, uint32_t profile_id,
92 struct rte_mtr_meter_profile *profile,
93 struct rte_mtr_error *error)
100 return -rte_mtr_error_set(error, EINVAL,
101 RTE_MTR_ERROR_TYPE_METER_PROFILE,
102 NULL, "Meter profile is null.");
104 if (profile_id == UINT32_MAX)
105 return -rte_mtr_error_set(error, EINVAL,
106 RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
107 NULL, "Meter profile id not valid.");
109 switch (profile->alg) {
110 case RTE_MTR_SRTCM_RFC2697:
111 if (profile->srtcm_rfc2697.cir > mtr_capa.meter_rate_max)
112 rc = -rte_mtr_error_set(error, EINVAL,
113 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
114 "CIR exceeds max meter rate");
116 if (profile->srtcm_rfc2697.cbs > NIX_BPF_BURST_MAX)
117 rc = -rte_mtr_error_set(error, EINVAL,
118 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
119 "CBS exceeds max meter burst size");
121 if (profile->srtcm_rfc2697.ebs > NIX_BPF_BURST_MAX)
122 rc = -rte_mtr_error_set(error, EINVAL,
123 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
124 "EBS exceeds max meter burst size");
127 case RTE_MTR_TRTCM_RFC2698:
128 if (profile->trtcm_rfc2698.cir > mtr_capa.meter_rate_max)
129 rc = -rte_mtr_error_set(error, EINVAL,
130 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
131 "CIR exceeds max meter rate");
133 if (profile->trtcm_rfc2698.pir > mtr_capa.meter_rate_max)
134 rc = -rte_mtr_error_set(error, EINVAL,
135 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
136 "PIR exceeds max meter rate");
138 if (profile->trtcm_rfc2698.cbs > NIX_BPF_BURST_MAX)
139 rc = -rte_mtr_error_set(error, EINVAL,
140 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
141 "CBS exceeds max meter burst size");
143 if (profile->trtcm_rfc2698.pbs > NIX_BPF_BURST_MAX)
144 rc = -rte_mtr_error_set(error, EINVAL,
145 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
146 "PBS exceeds max meter burst size");
149 case RTE_MTR_TRTCM_RFC4115:
150 if ((profile->trtcm_rfc4115.cir + profile->trtcm_rfc4115.eir) >
151 mtr_capa.meter_rate_max)
152 rc = -rte_mtr_error_set(error, EINVAL,
153 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
154 "PIR + EIR exceeds max rate");
156 if (profile->trtcm_rfc4115.cbs > NIX_BPF_BURST_MAX)
157 rc = -rte_mtr_error_set(error, EINVAL,
158 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
159 "CBS exceeds max meter burst size");
161 if (profile->trtcm_rfc4115.ebs > NIX_BPF_BURST_MAX)
162 rc = -rte_mtr_error_set(error, EINVAL,
163 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
164 "PBS exceeds max meter burst size");
168 rc = -rte_mtr_error_set(error, EINVAL,
169 RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
178 cnxk_nix_mtr_capabilities_get(struct rte_eth_dev *dev,
179 struct rte_mtr_capabilities *capa,
180 struct rte_mtr_error *error)
182 uint8_t lvl_mask = ROC_NIX_BPF_LEVEL_F_LEAF | ROC_NIX_BPF_LEVEL_F_MID |
183 ROC_NIX_BPF_LEVEL_F_TOP;
184 struct cnxk_eth_dev *eth_dev = cnxk_eth_pmd_priv(dev);
185 uint16_t count[ROC_NIX_BPF_LEVEL_MAX] = {0};
186 struct roc_nix *nix = ð_dev->nix;
193 return -rte_mtr_error_set(error, EINVAL,
194 RTE_MTR_ERROR_TYPE_MTR_PARAMS, NULL,
195 "NULL input parameter");
197 rc = roc_nix_bpf_count_get(nix, lvl_mask, count);
201 for (i = 0; i < ROC_NIX_BPF_LEVEL_MAX; i++)
202 mtr_capa.n_max += count[i];
204 mtr_capa.meter_srtcm_rfc2697_n_max = mtr_capa.n_max;
205 mtr_capa.meter_trtcm_rfc2698_n_max = mtr_capa.n_max;
206 mtr_capa.meter_trtcm_rfc4115_n_max = mtr_capa.n_max;
207 mtr_capa.meter_policy_n_max = mtr_capa.n_max;
209 rc = roc_nix_bpf_timeunit_get(nix, &time_unit);
213 mtr_capa.meter_rate_max =
214 NIX_BPF_RATE(time_unit, NIX_BPF_MAX_RATE_EXPONENT,
215 NIX_BPF_MAX_RATE_MANTISSA, 0) /
223 cnxk_nix_mtr_profile_add(struct rte_eth_dev *eth_dev, uint32_t profile_id,
224 struct rte_mtr_meter_profile *profile,
225 struct rte_mtr_error *error)
227 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
228 struct cnxk_mtr_profiles *fmps = &dev->mtr_profiles;
229 struct cnxk_mtr_profile_node *fmp;
232 /* Check input params. */
233 ret = nix_mtr_profile_validate(dev, profile_id, profile, error);
237 fmp = nix_mtr_profile_find(dev, profile_id);
239 return -rte_mtr_error_set(error, EEXIST,
240 RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
241 NULL, "Profile already exist");
244 fmp = plt_zmalloc(sizeof(struct cnxk_mtr_profile_node), ROC_ALIGN);
246 return -rte_mtr_error_set(error, ENOMEM,
247 RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
248 "Meter profile memory "
251 fmp->id = profile_id;
252 fmp->profile = *profile;
254 TAILQ_INSERT_TAIL(fmps, fmp, next);
260 cnxk_nix_mtr_profile_delete(struct rte_eth_dev *eth_dev, uint32_t profile_id,
261 struct rte_mtr_error *error)
263 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
264 struct cnxk_mtr_profile_node *fmp;
266 if (profile_id == UINT32_MAX)
267 return -rte_mtr_error_set(error, EINVAL,
268 RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
269 NULL, "Meter profile id not valid.");
271 fmp = nix_mtr_profile_find(dev, profile_id);
273 return -rte_mtr_error_set(error, ENOENT,
274 RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
276 "Meter profile is invalid.");
279 return -rte_mtr_error_set(error, EBUSY,
280 RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
281 NULL, "Meter profile is in use.");
283 TAILQ_REMOVE(&dev->mtr_profiles, fmp, next);
289 update_mtr_err(uint32_t act_color, struct rte_mtr_error *error, bool action)
293 case RTE_COLOR_GREEN:
295 str = "Green action is not valid";
298 str = "Green action is null";
302 case RTE_COLOR_YELLOW:
304 str = "Yellow action is not valid";
307 str = "Yellow action is null";
313 str = "Red action is not valid";
316 str = "Red action is null";
322 return -rte_mtr_error_set(error, ENOTSUP,
323 RTE_MTR_ERROR_TYPE_METER_POLICY, NULL, str);
325 return -rte_mtr_error_set(error, EINVAL,
326 RTE_MTR_ERROR_TYPE_METER_POLICY, NULL, str);
330 cnxk_nix_mtr_policy_validate(struct rte_eth_dev *dev,
331 struct rte_mtr_meter_policy_params *policy,
332 struct rte_mtr_error *error)
334 bool supported[RTE_COLORS] = {false, false, false};
335 const struct rte_flow_action *action;
341 return 0; /* Nothing to be validated */
343 for (i = 0; i < RTE_COLORS; i++) {
344 if (policy->actions[i]) {
345 for (action = policy->actions[i];
346 action->type != RTE_FLOW_ACTION_TYPE_END;
348 if (action->type == RTE_FLOW_ACTION_TYPE_METER)
351 if (action->type == RTE_FLOW_ACTION_TYPE_DROP)
354 if (action->type == RTE_FLOW_ACTION_TYPE_VOID)
358 return update_mtr_err(i, error, true);
361 return update_mtr_err(i, error, false);
369 cnxk_fill_policy_actions(struct cnxk_mtr_policy_node *fmp,
370 struct rte_mtr_meter_policy_params *policy)
373 const struct rte_flow_action_meter *mtr;
374 const struct rte_flow_action *action;
377 for (i = 0; i < RTE_COLORS; i++) {
378 if (policy->actions[i]) {
379 for (action = policy->actions[i];
380 action->type != RTE_FLOW_ACTION_TYPE_END;
383 RTE_FLOW_ACTION_TYPE_METER) {
384 fmp->actions[i].action_fate =
387 rte_flow_action_meter *)
389 fmp->actions[i].mtr_id = mtr->mtr_id;
392 if (action->type == RTE_FLOW_ACTION_TYPE_DROP) {
393 fmp->actions[i].action_fate =
402 cnxk_nix_mtr_policy_add(struct rte_eth_dev *eth_dev, uint32_t policy_id,
403 struct rte_mtr_meter_policy_params *policy,
404 struct rte_mtr_error *error)
406 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
407 struct cnxk_mtr_policy *fmps = &dev->mtr_policy;
408 struct cnxk_mtr_policy_node *fmp;
411 fmp = nix_mtr_policy_find(dev, policy_id);
413 return -rte_mtr_error_set(error, EEXIST,
414 RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
415 NULL, "Policy already exist");
418 fmp = plt_zmalloc(sizeof(struct cnxk_mtr_policy_node), ROC_ALIGN);
420 return -rte_mtr_error_set(error, ENOMEM,
421 RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
422 "Memory allocation failure");
424 rc = cnxk_nix_mtr_policy_validate(eth_dev, policy, error);
430 cnxk_fill_policy_actions(fmp, policy);
431 TAILQ_INSERT_TAIL(fmps, fmp, next);
440 cnxk_nix_mtr_policy_delete(struct rte_eth_dev *eth_dev, uint32_t policy_id,
441 struct rte_mtr_error *error)
443 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
444 struct cnxk_mtr_policy_node *fmp;
446 fmp = nix_mtr_policy_find(dev, policy_id);
448 return -rte_mtr_error_set(error, ENOENT,
449 RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
450 NULL, "No policy found");
454 return -rte_mtr_error_set(error, EBUSY,
455 RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
456 NULL, "Meter policy is in use.");
458 TAILQ_REMOVE(&dev->mtr_policy, fmp, next);
465 cnxk_nix_mtr_create(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
466 struct rte_mtr_params *params, int shared,
467 struct rte_mtr_error *error)
469 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
470 struct cnxk_mtr_profile_node *profile;
471 struct cnxk_mtr_policy_node *policy;
472 struct cnxk_mtr *fm = &dev->mtr;
473 struct cnxk_meter_node *mtr;
476 RTE_SET_USED(shared);
479 return -rte_mtr_error_set(error, ENOENT,
480 RTE_MTR_ERROR_TYPE_MTR_PARAMS, NULL,
481 "Meter params are invalid.");
483 profile = nix_mtr_profile_find(dev, params->meter_profile_id);
485 return -rte_mtr_error_set(error, ENOENT,
486 RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
487 ¶ms->meter_profile_id,
488 "Meter profile is invalid.");
490 policy = nix_mtr_policy_find(dev, params->meter_policy_id);
492 return -rte_mtr_error_set(error, ENOENT,
493 RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
494 ¶ms->meter_policy_id,
495 "Meter policy is invalid.");
497 mtr = nix_mtr_find(dev, mtr_id);
499 return -rte_mtr_error_set(error, EEXIST,
500 RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
501 "Meter already exist");
504 mtr = plt_zmalloc(sizeof(struct cnxk_meter_node), ROC_ALIGN);
506 return -rte_mtr_error_set(error, ENOMEM,
507 RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
508 "Meter memory alloc failed.");
512 mtr->profile = profile;
513 mtr->policy = policy;
514 mtr->params = *params;
515 mtr->bpf_id = ROC_NIX_BPF_ID_INVALID;
517 for (i = 0; i < MAX_PRV_MTR_NODES; i++)
518 mtr->prev_id[i] = ROC_NIX_BPF_ID_INVALID;
520 mtr->next_id = ROC_NIX_BPF_ID_INVALID;
521 mtr->is_next = false;
522 mtr->level = ROC_NIX_BPF_LEVEL_IDX_INVALID;
524 if (params->dscp_table) {
525 mtr->params.dscp_table =
526 plt_zmalloc(ROC_NIX_BPF_PRE_COLOR_MAX, ROC_ALIGN);
527 if (mtr->params.dscp_table == NULL) {
529 return -rte_mtr_error_set(error, ENOMEM,
530 RTE_MTR_ERROR_TYPE_UNSPECIFIED,
531 NULL, "Memory alloc failed.");
534 for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
535 mtr->params.dscp_table[i] = params->dscp_table[i];
540 TAILQ_INSERT_TAIL(fm, mtr, next);
545 cnxk_nix_mtr_destroy(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
546 struct rte_mtr_error *error)
548 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
549 struct roc_nix_bpf_objs profs = {0};
550 struct cnxk_mtr *fm = &dev->mtr;
551 struct roc_nix *nix = &dev->nix;
552 struct cnxk_meter_node *mtr;
553 struct cnxk_meter_node *mid_mtr;
554 struct cnxk_meter_node *top_mtr;
557 mtr = nix_mtr_find(dev, mtr_id);
559 return -rte_mtr_error_set(error, ENOENT,
560 RTE_MTR_ERROR_TYPE_MTR_ID, &mtr_id,
561 "Meter id is invalid.");
565 return -rte_mtr_error_set(error, EADDRINUSE,
566 RTE_MTR_ERROR_TYPE_MTR_ID, &mtr_id,
570 switch (lvl_map[mtr->level]) {
571 case ROC_NIX_BPF_LEVEL_F_LEAF:
573 rc = roc_nix_bpf_connect(nix, ROC_NIX_BPF_LEVEL_F_LEAF,
575 ROC_NIX_BPF_ID_INVALID);
578 case ROC_NIX_BPF_LEVEL_F_MID:
579 while ((mtr->prev_cnt) + 1) {
581 nix_mtr_find(dev, mtr->prev_id[mtr->prev_cnt]);
582 rc = roc_nix_bpf_connect(nix, ROC_NIX_BPF_LEVEL_F_LEAF,
584 ROC_NIX_BPF_ID_INVALID);
588 rc = roc_nix_bpf_connect(nix, ROC_NIX_BPF_LEVEL_F_MID,
590 ROC_NIX_BPF_ID_INVALID);
593 case ROC_NIX_BPF_LEVEL_F_TOP:
594 while (mtr->prev_cnt) {
596 nix_mtr_find(dev, mtr->prev_id[mtr->prev_cnt]);
597 rc = roc_nix_bpf_connect(nix, ROC_NIX_BPF_LEVEL_F_MID,
599 ROC_NIX_BPF_ID_INVALID);
604 return -rte_mtr_error_set(error, EINVAL,
605 RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
606 "Invalid meter level");
612 profs.level = mtr->level;
614 profs.ids[0] = mtr->bpf_id;
615 rc = roc_nix_bpf_free(nix, &profs, 1);
619 mtr->policy->ref_cnt--;
620 mtr->profile->ref_cnt--;
621 TAILQ_REMOVE(fm, mtr, next);
622 plt_free(mtr->params.dscp_table);
630 cnxk_nix_mtr_enable(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
631 struct rte_mtr_error *error)
633 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
634 struct roc_nix *nix = &dev->nix;
635 struct cnxk_meter_node *mtr;
636 struct roc_nix_rq *rq;
640 mtr = nix_mtr_find(dev, mtr_id);
642 return -rte_mtr_error_set(error, ENOENT,
643 RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
644 "Meter id is invalid.");
650 for (i = 0; i < mtr->rq_num; i++) {
651 rq = &dev->rqs[mtr->rq_id[i]];
652 rc |= roc_nix_bpf_ena_dis(nix, mtr->bpf_id, rq, true);
659 cnxk_nix_mtr_disable(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
660 struct rte_mtr_error *error)
662 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
663 struct roc_nix *nix = &dev->nix;
664 struct cnxk_meter_node *mtr;
665 struct roc_nix_rq *rq;
669 mtr = nix_mtr_find(dev, mtr_id);
671 return -rte_mtr_error_set(error, ENOENT,
672 RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
673 "Meter id is invalid.");
679 for (i = 0; i < mtr->rq_num; i++) {
680 rq = &dev->rqs[mtr->rq_id[i]];
681 rc |= roc_nix_bpf_ena_dis(nix, mtr->bpf_id, rq, false);
688 cnxk_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
689 enum rte_color *dscp_table,
690 struct rte_mtr_error *error)
692 enum roc_nix_bpf_color nix_dscp_tbl[ROC_NIX_BPF_PRE_COLOR_MAX];
693 enum roc_nix_bpf_color color_map[] = {ROC_NIX_BPF_COLOR_GREEN,
694 ROC_NIX_BPF_COLOR_YELLOW,
695 ROC_NIX_BPF_COLOR_RED};
696 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
697 struct roc_nix_bpf_precolor table;
698 struct roc_nix *nix = &dev->nix;
699 struct cnxk_meter_node *mtr;
702 mtr = nix_mtr_find(dev, mtr_id);
704 return -rte_mtr_error_set(error, ENOENT,
705 RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
706 "Meter object not found");
710 for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
711 nix_dscp_tbl[i] = ROC_NIX_BPF_COLOR_GREEN;
713 for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
714 nix_dscp_tbl[i] = color_map[dscp_table[i]];
717 table.count = ROC_NIX_BPF_PRE_COLOR_MAX;
718 table.mode = ROC_NIX_BPF_PC_MODE_DSCP_OUTER;
719 for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
720 table.color[i] = nix_dscp_tbl[i];
722 rc = roc_nix_bpf_pre_color_tbl_setup(nix, mtr->bpf_id,
723 lvl_map[mtr->level], &table);
725 rte_mtr_error_set(error, rc, RTE_MTR_ERROR_TYPE_UNSPECIFIED,
730 for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
731 dev->precolor_tbl[i] = nix_dscp_tbl[i];
738 cnxk_nix_mtr_stats_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
739 uint64_t stats_mask, struct rte_mtr_error *error)
741 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
742 struct cnxk_meter_node *mtr;
745 return -rte_mtr_error_set(error, EINVAL,
746 RTE_MTR_ERROR_TYPE_MTR_PARAMS, NULL,
747 "no bit is set to stats mask");
749 mtr = nix_mtr_find(dev, mtr_id);
751 return -rte_mtr_error_set(error, ENOENT,
752 RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
753 "Meter object not found");
756 mtr->params.stats_mask = stats_mask;
761 cnxk_nix_mtr_stats_read(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
762 struct rte_mtr_stats *stats, uint64_t *stats_mask,
763 int clear, struct rte_mtr_error *error)
765 uint8_t yellow_pkt_pass, yellow_octs_pass, yellow_pkt_drop;
766 uint8_t green_octs_drop, yellow_octs_drop, red_octs_drop;
767 uint8_t green_pkt_pass, green_octs_pass, green_pkt_drop;
768 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
769 uint8_t red_pkt_pass, red_octs_pass, red_pkt_drop;
770 uint64_t bpf_stats[ROC_NIX_BPF_STATS_MAX] = {0};
771 uint64_t mask = NIX_BPF_STATS_MASK_ALL;
772 struct roc_nix *nix = &dev->nix;
773 struct cnxk_meter_node *mtr;
777 return -rte_mtr_error_set(error, EINVAL,
778 RTE_MTR_ERROR_TYPE_MTR_PARAMS, NULL,
779 "stats pointer is NULL");
781 mtr = nix_mtr_find(dev, mtr_id);
783 return -rte_mtr_error_set(error, ENOENT,
784 RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
785 "Meter object not found");
788 rc = roc_nix_bpf_stats_read(nix, mtr->bpf_id, mask, lvl_map[mtr->level],
791 rte_mtr_error_set(error, rc, RTE_MTR_ERROR_TYPE_UNSPECIFIED,
796 green_pkt_pass = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_GREEN_PKT_F_PASS);
798 roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_GREEN_OCTS_F_PASS);
799 green_pkt_drop = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_GREEN_PKT_F_DROP);
801 roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_GREEN_OCTS_F_DROP);
803 roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_YELLOW_PKT_F_PASS);
805 roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_YELLOW_OCTS_F_PASS);
807 roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_YELLOW_PKT_F_DROP);
809 roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_YELLOW_OCTS_F_DROP);
810 red_pkt_pass = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_RED_PKT_F_PASS);
811 red_octs_pass = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_RED_OCTS_F_PASS);
812 red_pkt_drop = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_RED_PKT_F_DROP);
813 red_octs_drop = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_RED_OCTS_F_DROP);
815 if (mtr->params.stats_mask & RTE_MTR_STATS_N_PKTS_GREEN)
816 stats->n_pkts[RTE_COLOR_GREEN] = bpf_stats[green_pkt_pass];
818 if (mtr->params.stats_mask & RTE_MTR_STATS_N_PKTS_YELLOW)
819 stats->n_pkts[RTE_COLOR_YELLOW] = bpf_stats[yellow_pkt_pass];
821 if (mtr->params.stats_mask & RTE_MTR_STATS_N_PKTS_RED)
822 stats->n_pkts[RTE_COLOR_RED] = bpf_stats[red_pkt_pass];
824 if (mtr->params.stats_mask & RTE_MTR_STATS_N_BYTES_GREEN)
825 stats->n_bytes[RTE_COLOR_GREEN] = bpf_stats[green_octs_pass];
827 if (mtr->params.stats_mask & RTE_MTR_STATS_N_BYTES_YELLOW)
828 stats->n_bytes[RTE_COLOR_YELLOW] = bpf_stats[yellow_octs_pass];
830 if (mtr->params.stats_mask & RTE_MTR_STATS_N_BYTES_RED)
831 stats->n_bytes[RTE_COLOR_RED] = bpf_stats[red_octs_pass];
833 if (mtr->params.stats_mask & RTE_MTR_STATS_N_PKTS_DROPPED)
834 stats->n_pkts_dropped = bpf_stats[green_pkt_drop] +
835 bpf_stats[yellow_pkt_drop] +
836 bpf_stats[red_pkt_drop];
838 if (mtr->params.stats_mask & RTE_MTR_STATS_N_BYTES_DROPPED)
839 stats->n_bytes_dropped = bpf_stats[green_octs_drop] +
840 bpf_stats[yellow_octs_drop] +
841 bpf_stats[red_octs_drop];
844 *stats_mask = mtr->params.stats_mask;
847 rc = roc_nix_bpf_stats_reset(nix, mtr->bpf_id, mask,
848 lvl_map[mtr->level]);
850 rte_mtr_error_set(error, rc,
851 RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
861 const struct rte_mtr_ops nix_mtr_ops = {
862 .capabilities_get = cnxk_nix_mtr_capabilities_get,
863 .meter_profile_add = cnxk_nix_mtr_profile_add,
864 .meter_profile_delete = cnxk_nix_mtr_profile_delete,
865 .meter_policy_validate = cnxk_nix_mtr_policy_validate,
866 .meter_policy_add = cnxk_nix_mtr_policy_add,
867 .meter_policy_delete = cnxk_nix_mtr_policy_delete,
868 .create = cnxk_nix_mtr_create,
869 .destroy = cnxk_nix_mtr_destroy,
870 .meter_enable = cnxk_nix_mtr_enable,
871 .meter_disable = cnxk_nix_mtr_disable,
872 .meter_dscp_table_update = cnxk_nix_mtr_dscp_table_update,
873 .stats_update = cnxk_nix_mtr_stats_update,
874 .stats_read = cnxk_nix_mtr_stats_read,
878 cnxk_nix_mtr_ops_get(struct rte_eth_dev *dev, void *ops)
882 *(const void **)ops = &nix_mtr_ops;
887 nix_mtr_validate(struct rte_eth_dev *eth_dev, uint32_t id)
889 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
890 struct cnxk_mtr_profile_node *profile;
891 struct cnxk_mtr_policy_node *policy;
892 struct cnxk_meter_node *mtr;
894 mtr = nix_mtr_find(dev, id);
898 profile = nix_mtr_profile_find(dev, mtr->params.meter_profile_id);
902 policy = nix_mtr_policy_find(dev, mtr->params.meter_policy_id);
910 nix_mtr_policy_act_get(struct rte_eth_dev *eth_dev, uint32_t id,
911 struct cnxk_mtr_policy_node **policy_act)
913 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
914 struct cnxk_mtr_policy_node *policy;
915 struct cnxk_meter_node *mtr;
917 mtr = nix_mtr_find(dev, id);
921 policy = nix_mtr_policy_find(dev, mtr->params.meter_policy_id);
925 *policy_act = policy;
931 nix_mtr_rq_update(struct rte_eth_dev *eth_dev, uint32_t id, uint32_t queue_num,
932 const uint16_t *queue)
934 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
935 struct cnxk_meter_node *mtr;
938 mtr = nix_mtr_find(dev, id);
942 mtr->rq_id = plt_zmalloc(queue_num * sizeof(uint32_t), ROC_ALIGN);
943 if (mtr->rq_id == NULL)
946 mtr->rq_num = queue_num;
947 for (i = 0; i < queue_num; i++)
948 mtr->rq_id[i] = queue[i];
954 nix_mtr_chain_reset(struct rte_eth_dev *eth_dev, uint32_t cur_id)
956 struct cnxk_meter_node *mtr[ROC_NIX_BPF_LEVEL_MAX] = {0};
957 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
958 uint32_t mtr_id = cur_id;
961 for (i = 0; i < ROC_NIX_BPF_LEVEL_MAX; i++) {
962 mtr[i] = nix_mtr_find(dev, mtr_id);
964 mtr_id = mtr[i]->next_id;
966 for (i = 0; i < ROC_NIX_BPF_LEVEL_MAX; i++) {
968 for (j = 0; j < MAX_PRV_MTR_NODES; j++)
969 mtr[i]->prev_id[i] = ROC_NIX_BPF_ID_INVALID;
970 mtr[i]->level = ROC_NIX_BPF_LEVEL_IDX_INVALID;
971 mtr[i]->next_id = ROC_NIX_BPF_ID_INVALID;
972 mtr[i]->is_next = false;
973 mtr[i]->prev_cnt = 0;
980 nix_mtr_chain_update(struct rte_eth_dev *eth_dev, uint32_t cur_id,
981 uint32_t prev_id, uint32_t next_id)
983 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
984 struct cnxk_meter_node *mtr;
986 mtr = nix_mtr_find(dev, cur_id);
990 switch (lvl_map[mtr->level]) {
991 case ROC_NIX_BPF_LEVEL_F_LEAF:
992 mtr->prev_id[mtr->prev_cnt] = ROC_NIX_BPF_ID_INVALID;
993 mtr->next_id = next_id;
996 case ROC_NIX_BPF_LEVEL_F_MID:
997 mtr->prev_id[mtr->prev_cnt] = prev_id;
998 mtr->next_id = next_id;
1001 case ROC_NIX_BPF_LEVEL_F_TOP:
1002 mtr->prev_id[mtr->prev_cnt] = prev_id;
1003 mtr->next_id = ROC_NIX_BPF_ID_INVALID;
1004 mtr->is_next = false;
1007 plt_err("Invalid meter level");
1014 struct cnxk_meter_node *
1015 nix_get_mtr(struct rte_eth_dev *eth_dev, uint32_t id)
1017 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
1018 struct cnxk_meter_node *mtr;
1020 mtr = nix_mtr_find(dev, id);
1028 nix_mtr_level_update(struct rte_eth_dev *eth_dev, uint32_t id, uint32_t level)
1030 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
1031 struct cnxk_meter_node *mtr;
1033 mtr = nix_mtr_find(dev, id);
1042 nix_mtr_config_map(struct cnxk_meter_node *mtr, struct roc_nix_bpf_cfg *cfg)
1044 enum roc_nix_bpf_algo alg_map[] = {
1045 ROC_NIX_BPF_ALGO_NONE, ROC_NIX_BPF_ALGO_2697,
1046 ROC_NIX_BPF_ALGO_2698, ROC_NIX_BPF_ALGO_4115};
1047 struct cnxk_mtr_profile_node *profile = mtr->profile;
1048 struct cnxk_mtr_policy_node *policy = mtr->policy;
1050 cfg->alg = alg_map[profile->profile.alg];
1051 cfg->lmode = profile->profile.packet_mode;
1054 case ROC_NIX_BPF_ALGO_2697:
1055 cfg->algo2697.cir = profile->profile.srtcm_rfc2697.cir * 8;
1056 cfg->algo2697.cbs = profile->profile.srtcm_rfc2697.cbs;
1057 cfg->algo2697.ebs = profile->profile.srtcm_rfc2697.ebs;
1059 case ROC_NIX_BPF_ALGO_2698:
1060 cfg->algo2698.cir = profile->profile.trtcm_rfc2698.cir * 8;
1061 cfg->algo2698.pir = profile->profile.trtcm_rfc2698.pir * 8;
1062 cfg->algo2698.cbs = profile->profile.trtcm_rfc2698.cbs;
1063 cfg->algo2698.pbs = profile->profile.trtcm_rfc2698.pbs;
1065 case ROC_NIX_BPF_ALGO_4115:
1066 cfg->algo4115.cir = profile->profile.trtcm_rfc4115.cir * 8;
1067 cfg->algo4115.eir = profile->profile.trtcm_rfc4115.eir * 8;
1068 cfg->algo4115.cbs = profile->profile.trtcm_rfc4115.cbs;
1069 cfg->algo4115.ebs = profile->profile.trtcm_rfc4115.ebs;
1075 cfg->action[ROC_NIX_BPF_COLOR_GREEN] = ROC_NIX_BPF_ACTION_PASS;
1076 cfg->action[ROC_NIX_BPF_COLOR_YELLOW] = ROC_NIX_BPF_ACTION_PASS;
1077 cfg->action[ROC_NIX_BPF_COLOR_RED] = ROC_NIX_BPF_ACTION_PASS;
1079 if (policy->actions[RTE_COLOR_GREEN].action_fate ==
1080 RTE_FLOW_ACTION_TYPE_DROP)
1081 cfg->action[ROC_NIX_BPF_COLOR_GREEN] = ROC_NIX_BPF_ACTION_DROP;
1083 if (policy->actions[RTE_COLOR_YELLOW].action_fate ==
1084 RTE_FLOW_ACTION_TYPE_DROP)
1085 cfg->action[ROC_NIX_BPF_COLOR_YELLOW] = ROC_NIX_BPF_ACTION_DROP;
1087 if (policy->actions[RTE_COLOR_RED].action_fate ==
1088 RTE_FLOW_ACTION_TYPE_DROP)
1089 cfg->action[ROC_NIX_BPF_COLOR_RED] = ROC_NIX_BPF_ACTION_DROP;
1093 nix_dscp_table_map(struct cnxk_meter_node *mtr,
1094 struct roc_nix_bpf_precolor *tbl)
1096 enum roc_nix_bpf_color color_map[] = {ROC_NIX_BPF_COLOR_GREEN,
1097 ROC_NIX_BPF_COLOR_YELLOW,
1098 ROC_NIX_BPF_COLOR_RED};
1101 tbl->count = ROC_NIX_BPF_PRE_COLOR_MAX;
1102 tbl->mode = ROC_NIX_BPF_PC_MODE_DSCP_OUTER;
1104 for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
1105 tbl->color[i] = ROC_NIX_BPF_COLOR_GREEN;
1107 if (mtr->params.dscp_table) {
1108 for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
1109 tbl->color[i] = color_map[mtr->params.dscp_table[i]];
1114 nix_mtr_destroy(struct rte_eth_dev *eth_dev, uint32_t id,
1115 struct rte_mtr_error *error)
1117 return cnxk_nix_mtr_destroy(eth_dev, id, error);
1121 nix_mtr_connect(struct rte_eth_dev *eth_dev, uint32_t id)
1123 enum roc_nix_bpf_level_flag lvl_flag = ROC_NIX_BPF_LEVEL_IDX_INVALID;
1124 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
1125 struct cnxk_meter_node *base_mtr, *next_mtr;
1126 struct roc_nix *nix = &dev->nix;
1127 uint32_t cur_mtr_id = id;
1130 for (i = 0; i < ROC_NIX_BPF_LEVEL_MAX; i++) {
1131 base_mtr = nix_mtr_find(dev, cur_mtr_id);
1133 lvl_flag = lvl_map[base_mtr->level];
1134 if (base_mtr->is_next) {
1135 next_mtr = nix_mtr_find(dev, base_mtr->next_id);
1137 if (!base_mtr->is_used) {
1138 rc = roc_nix_bpf_connect(nix,
1146 cur_mtr_id = base_mtr->next_id;
1154 nix_mtr_configure(struct rte_eth_dev *eth_dev, uint32_t id)
1156 struct cnxk_meter_node *mtr[ROC_NIX_BPF_LEVEL_MAX] = {0};
1157 struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
1158 struct roc_nix_bpf_objs profs[ROC_NIX_BPF_LEVEL_MAX];
1159 uint8_t idx0 = ROC_NIX_BPF_LEVEL_IDX_INVALID;
1160 uint8_t idx1 = ROC_NIX_BPF_LEVEL_IDX_INVALID;
1161 uint8_t idx2 = ROC_NIX_BPF_LEVEL_IDX_INVALID;
1162 uint16_t per_lvl_cnt[ROC_NIX_BPF_LEVEL_MAX];
1163 int num_mtr[ROC_NIX_BPF_LEVEL_MAX] = {0};
1164 struct roc_nix *nix = &dev->nix;
1165 struct roc_nix_bpf_precolor tbl;
1166 struct roc_nix_bpf_cfg cfg;
1167 struct roc_nix_rq *rq;
1173 mtr[0] = nix_mtr_find(dev, id);
1178 idx0 = roc_nix_bpf_level_to_idx(lvl_map[mtr[0]->level]);
1179 if (idx0 == ROC_NIX_BPF_LEVEL_IDX_INVALID)
1182 lvl_mask = ROC_NIX_BPF_LEVEL_F_LEAF;
1183 if (mtr[0]->is_used)
1184 per_lvl_cnt[idx0] = 0;
1186 per_lvl_cnt[idx0] = 1;
1188 if (mtr[0]->is_next) {
1189 mtr[1] = nix_mtr_find(dev, mtr[0]->next_id);
1193 idx1 = roc_nix_bpf_level_to_idx(lvl_map[mtr[1]->level]);
1194 if (idx1 == ROC_NIX_BPF_LEVEL_IDX_INVALID)
1197 lvl_mask |= ROC_NIX_BPF_LEVEL_F_MID;
1198 if (mtr[1]->is_used)
1199 per_lvl_cnt[idx1] = 0;
1201 per_lvl_cnt[idx1] = 1;
1204 if (mtr[1] && mtr[1]->is_next) {
1205 mtr[2] = nix_mtr_find(dev, mtr[1]->next_id);
1210 idx2 = roc_nix_bpf_level_to_idx(lvl_map[mtr[2]->level]);
1211 if (idx2 == ROC_NIX_BPF_LEVEL_IDX_INVALID)
1214 lvl_mask |= ROC_NIX_BPF_LEVEL_F_TOP;
1215 if (mtr[2]->is_used)
1216 per_lvl_cnt[idx2] = 0;
1218 per_lvl_cnt[idx2] = 1;
1221 rc = roc_nix_bpf_alloc(nix, lvl_mask, per_lvl_cnt, profs);
1224 if (mtr[0]->bpf_id == ROC_NIX_BPF_ID_INVALID)
1225 mtr[0]->bpf_id = profs[idx0].ids[0];
1228 if (mtr[0]->is_next && idx1 != ROC_NIX_BPF_LEVEL_IDX_INVALID)
1229 if (mtr[1]->bpf_id == ROC_NIX_BPF_ID_INVALID)
1230 mtr[1]->bpf_id = profs[idx1].ids[0];
1233 if (mtr[1]->is_next && idx2 != ROC_NIX_BPF_LEVEL_IDX_INVALID)
1234 if (mtr[2]->bpf_id == ROC_NIX_BPF_ID_INVALID)
1235 mtr[2]->bpf_id = profs[idx2].ids[0];
1237 for (i = 0; i < ROC_NIX_BPF_LEVEL_MAX; i++) {
1239 if (!mtr[i]->is_used) {
1240 memset(&cfg, 0, sizeof(struct roc_nix_bpf_cfg));
1241 nix_mtr_config_map(mtr[i], &cfg);
1242 rc = roc_nix_bpf_config(nix, mtr[i]->bpf_id,
1243 lvl_map[mtr[i]->level],
1247 sizeof(struct roc_nix_bpf_precolor));
1248 nix_dscp_table_map(mtr[i], &tbl);
1249 rc = roc_nix_bpf_pre_color_tbl_setup(nix,
1250 mtr[i]->bpf_id, lvl_map[mtr[i]->level],
1253 if (mtr[i]->params.meter_enable) {
1254 for (j = 0; j < mtr[i]->rq_num; j++) {
1255 rq = &dev->rqs[mtr[i]->rq_id
1257 rc = roc_nix_bpf_ena_dis(nix,
1270 nix_mtr_color_action_validate(struct rte_eth_dev *eth_dev, uint32_t id,
1271 uint32_t *prev_id, uint32_t *next_id,
1272 struct cnxk_mtr_policy_node *policy,
1275 uint32_t action_fate_red = policy->actions[RTE_COLOR_RED].action_fate;
1276 uint32_t action_fate_green =
1277 policy->actions[RTE_COLOR_GREEN].action_fate;
1278 uint32_t action_fate_yellow =
1279 policy->actions[RTE_COLOR_YELLOW].action_fate;
1280 uint32_t cur_mtr_id = *next_id;
1281 uint32_t next_mtr_id = 0xffff;
1282 uint32_t prev_mtr_id = 0xffff;
1283 struct cnxk_meter_node *mtr;
1285 if (action_fate_green == RTE_FLOW_ACTION_TYPE_METER)
1286 next_mtr_id = policy->actions[RTE_COLOR_GREEN].mtr_id;
1288 if (action_fate_yellow == RTE_FLOW_ACTION_TYPE_METER)
1289 next_mtr_id = policy->actions[RTE_COLOR_YELLOW].mtr_id;
1291 if (action_fate_red == RTE_FLOW_ACTION_TYPE_METER)
1292 next_mtr_id = policy->actions[RTE_COLOR_RED].mtr_id;
1294 if (next_mtr_id != 0xffff) {
1295 switch (*tree_level) {
1297 mtr = nix_get_mtr(eth_dev, cur_mtr_id);
1298 if (mtr->level == ROC_NIX_BPF_LEVEL_IDX_INVALID) {
1299 nix_mtr_level_update(eth_dev, cur_mtr_id, 0);
1300 nix_mtr_chain_update(eth_dev, cur_mtr_id, -1,
1303 if (mtr->level == 0)
1304 mtr->is_used = true;
1309 *next_id = next_mtr_id;
1312 mtr = nix_get_mtr(eth_dev, cur_mtr_id);
1313 if (mtr->level == ROC_NIX_BPF_LEVEL_IDX_INVALID) {
1314 nix_mtr_level_update(eth_dev, cur_mtr_id, 1);
1316 nix_mtr_chain_update(eth_dev, cur_mtr_id,
1317 prev_mtr_id, next_mtr_id);
1319 if (mtr->level == 1) {
1322 nix_mtr_chain_update(eth_dev,
1323 cur_mtr_id, prev_mtr_id,
1326 mtr->is_used = true;
1332 *next_id = next_mtr_id;
1333 *prev_id = cur_mtr_id;
1336 nix_mtr_chain_reset(eth_dev, id);
1340 switch (*tree_level) {
1342 mtr = nix_get_mtr(eth_dev, cur_mtr_id);
1343 if (mtr->level == ROC_NIX_BPF_LEVEL_IDX_INVALID) {
1344 nix_mtr_level_update(eth_dev, cur_mtr_id, 0);
1346 if (mtr->level == 0)
1347 mtr->is_used = true;
1353 mtr = nix_get_mtr(eth_dev, cur_mtr_id);
1354 if (mtr->level == ROC_NIX_BPF_LEVEL_IDX_INVALID) {
1355 nix_mtr_level_update(eth_dev, cur_mtr_id, 1);
1357 nix_mtr_chain_update(eth_dev, cur_mtr_id,
1360 if (mtr->level == 1) {
1363 nix_mtr_chain_update(eth_dev,
1366 mtr->is_used = true;
1373 mtr = nix_get_mtr(eth_dev, cur_mtr_id);
1374 if (mtr->level == ROC_NIX_BPF_LEVEL_IDX_INVALID) {
1375 nix_mtr_level_update(eth_dev, cur_mtr_id, 2);
1376 prev_mtr_id = *prev_id;
1377 nix_mtr_chain_update(eth_dev, cur_mtr_id,
1380 if (mtr->level == 2) {
1382 prev_mtr_id = *prev_id;
1383 nix_mtr_chain_update(eth_dev,
1386 mtr->is_used = true;
1400 nix_mtr_capabilities_init(struct rte_eth_dev *eth_dev)
1402 struct rte_mtr_capabilities capa;
1403 struct rte_mtr_error error;
1405 return cnxk_nix_mtr_capabilities_get(eth_dev, &capa, &error);