From: Sunil Kumar Kori <sk...@marvell.com> Implement API to add meter policy for CN10K platform.
Signed-off-by: Sunil Kumar Kori <sk...@marvell.com> --- drivers/net/cnxk/cn10k_ethdev_mtr.c | 47 +++++++++++++++++++++++++++++ drivers/net/cnxk/cnxk_ethdev.h | 12 ++++++++ 2 files changed, 59 insertions(+) diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c index 8374f40681..854d30dc20 100644 --- a/drivers/net/cnxk/cn10k_ethdev_mtr.c +++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c @@ -50,6 +50,18 @@ nix_mtr_profile_find(struct cnxk_eth_dev *dev, uint32_t profile_id) return NULL; } +static struct cn10k_flow_meter_policy * +nix_mtr_policy_find(struct cnxk_eth_dev *dev, uint32_t meter_policy_id) +{ + struct cn10k_mtr_policy *fmps = &dev->mtr_policy; + struct cn10k_flow_meter_policy *fmp; + + TAILQ_FOREACH(fmp, fmps, next) + if (meter_policy_id == fmp->id) + return fmp; + return NULL; +} + static int nix_mtr_profile_validate(struct cnxk_eth_dev *dev, uint32_t profile_id, struct rte_mtr_meter_profile *profile, @@ -246,11 +258,46 @@ cn10k_nix_mtr_policy_validate(struct rte_eth_dev *dev, return 0; } +static int +cn10k_nix_mtr_policy_add(struct rte_eth_dev *eth_dev, uint32_t policy_id, + struct rte_mtr_meter_policy_params *policy, + struct rte_mtr_error *error) +{ + struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); + struct cn10k_mtr_policy *fmps = &dev->mtr_policy; + struct cn10k_flow_meter_policy *fmp; + int rc; + + fmp = nix_mtr_policy_find(dev, policy_id); + if (fmp) { + plt_info("Policy already exist"); + return 0; + } + + fmp = plt_zmalloc(sizeof(struct cn10k_flow_meter_policy), ROC_ALIGN); + if (fmp == NULL) { + return -rte_mtr_error_set(error, ENOMEM, + RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL, + "Memory allocation failure"); + } else { + rc = cn10k_nix_mtr_policy_validate(eth_dev, policy, error); + if (rc) + return rc; + } + + fmp->id = policy_id; + fmp->policy = *policy; + TAILQ_INSERT_TAIL(fmps, fmp, next); + + return 0; +} + const struct rte_mtr_ops nix_mtr_ops = { .capabilities_get = cn10k_nix_mtr_capabilities_get, .meter_profile_add = cn10k_nix_mtr_profile_add, .meter_profile_delete = cn10k_nix_mtr_profile_delete, .meter_policy_validate = cn10k_nix_mtr_policy_validate, + .meter_policy_add = cn10k_nix_mtr_policy_add, }; int diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h index 5d7cf58a24..3811360b75 100644 --- a/drivers/net/cnxk/cnxk_ethdev.h +++ b/drivers/net/cnxk/cnxk_ethdev.h @@ -145,6 +145,16 @@ struct cnxk_timesync_info { uint64_t *tx_tstamp; } __plt_cache_aligned; + +struct cn10k_flow_meter_policy { + TAILQ_ENTRY(cn10k_flow_meter_policy) next; + /**< Pointer to the next flow meter structure. */ + uint32_t id; /**< Policy id */ + uint32_t mtr_id; /** Meter id */ + struct rte_mtr_meter_policy_params policy; + uint32_t ref_cnt; +}; + struct cn10k_flow_meter_profile { TAILQ_ENTRY(cn10k_flow_meter_profile) next; struct rte_mtr_meter_profile profile; /**< Profile detail. */ @@ -153,6 +163,7 @@ struct cn10k_flow_meter_profile { }; TAILQ_HEAD(cn10k_mtr_profiles, cn10k_flow_meter_profile); +TAILQ_HEAD(cn10k_mtr_policy, cn10k_flow_meter_policy); struct cnxk_eth_dev { /* ROC NIX */ @@ -223,6 +234,7 @@ struct cnxk_eth_dev { /* Ingress policer */ struct cn10k_mtr_profiles mtr_profiles; + struct cn10k_mtr_policy mtr_policy; /* Rx burst for cleanup(Only Primary) */ eth_rx_burst_t rx_pkt_burst_no_offload; -- 2.25.1