From: Sunil Kumar Kori <sk...@marvell.com>

CN10K platform supports policer up to 3 level of hierarchy.
Implement RoC API to get corresponding index for given level.

Signed-off-by: Sunil Kumar Kori <sk...@marvell.com>
---
v5:
 - Fix checkpatch errors
 - Fix patch apply errors

v4:
 - Rebase support on dpdk-next-net-mrvl branch
 - Handled meter action during flow destroy
 - Handled meter cleanup during port shutdown
 
v3:
 - Rebase support on latest DPDK
 - Handled multilevel chaining for tree hierarchy
 - Fix naming convention

v2:
 - Rebase support on latest DPDK
 - Handled multilevel chaining for linear hierarchy
 - Review comments incorporated

 drivers/common/cnxk/meson.build    |  1 +
 drivers/common/cnxk/roc_nix.h      | 12 ++++++++++++
 drivers/common/cnxk/roc_nix_bpf.c  | 22 ++++++++++++++++++++++
 drivers/common/cnxk/roc_nix_priv.h |  1 +
 drivers/common/cnxk/roc_utils.c    |  3 +++
 drivers/common/cnxk/version.map    |  1 +
 6 files changed, 40 insertions(+)
 create mode 100644 drivers/common/cnxk/roc_nix_bpf.c

diff --git a/drivers/common/cnxk/meson.build b/drivers/common/cnxk/meson.build
index 97db5f087b..32d3ad5087 100644
--- a/drivers/common/cnxk/meson.build
+++ b/drivers/common/cnxk/meson.build
@@ -25,6 +25,7 @@ sources = files(
         'roc_mbox.c',
         'roc_model.c',
         'roc_nix.c',
+        'roc_nix_bpf.c',
         'roc_nix_debug.c',
         'roc_nix_fc.c',
         'roc_nix_irq.c',
diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index b06895a565..bf4fd2f208 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -6,6 +6,8 @@
 #define _ROC_NIX_H_
 
 /* Constants */
+#define ROC_NIX_BPF_LEVEL_IDX_INVALID 0xFF
+
 enum roc_nix_rss_reta_sz {
        ROC_NIX_RSS_RETA_SZ_64 = 64,
        ROC_NIX_RSS_RETA_SZ_128 = 128,
@@ -29,6 +31,12 @@ enum roc_nix_vlan_type {
        ROC_NIX_VLAN_TYPE_OUTER = 0x02,
 };
 
+enum roc_nix_bpf_level_flag {
+       ROC_NIX_BPF_LEVEL_F_LEAF = BIT(0),
+       ROC_NIX_BPF_LEVEL_F_MID = BIT(1),
+       ROC_NIX_BPF_LEVEL_F_TOP = BIT(2),
+};
+
 struct roc_nix_vlan_config {
        uint32_t type;
        union {
@@ -508,6 +516,10 @@ int __roc_api roc_nix_tm_prepare_rate_limited_tree(struct 
roc_nix *roc_nix);
 bool __roc_api roc_nix_tm_is_user_hierarchy_enabled(struct roc_nix *nix);
 int __roc_api roc_nix_tm_tree_type_get(struct roc_nix *nix);
 
+/* Ingress Policer API */
+uint8_t __roc_api
+roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
+
 /* MAC */
 int __roc_api roc_nix_mac_rxtx_start_stop(struct roc_nix *roc_nix, bool start);
 int __roc_api roc_nix_mac_link_event_start_stop(struct roc_nix *roc_nix,
diff --git a/drivers/common/cnxk/roc_nix_bpf.c 
b/drivers/common/cnxk/roc_nix_bpf.c
new file mode 100644
index 0000000000..b588cc16e4
--- /dev/null
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "roc_api.h"
+#include "roc_priv.h"
+
+uint8_t
+roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag level_f)
+{
+       uint8_t idx;
+
+       if (level_f & ROC_NIX_BPF_LEVEL_F_LEAF)
+               idx = 0;
+       else if (level_f & ROC_NIX_BPF_LEVEL_F_MID)
+               idx = 1;
+       else if (level_f & ROC_NIX_BPF_LEVEL_F_TOP)
+               idx = 2;
+       else
+               idx = ROC_NIX_BPF_LEVEL_IDX_INVALID;
+       return idx;
+}
diff --git a/drivers/common/cnxk/roc_nix_priv.h 
b/drivers/common/cnxk/roc_nix_priv.h
index 7653c5a328..02b1be852d 100644
--- a/drivers/common/cnxk/roc_nix_priv.h
+++ b/drivers/common/cnxk/roc_nix_priv.h
@@ -187,6 +187,7 @@ enum nix_err_status {
        NIX_ERR_INVALID_RANGE,
        NIX_ERR_INTERNAL,
        NIX_ERR_OP_NOTSUP,
+       NIX_ERR_HW_NOTSUP,
        NIX_ERR_QUEUE_INVALID_RANGE,
        NIX_ERR_AQ_READ_FAILED,
        NIX_ERR_AQ_WRITE_FAILED,
diff --git a/drivers/common/cnxk/roc_utils.c b/drivers/common/cnxk/roc_utils.c
index 751486f503..f1b5ef3b70 100644
--- a/drivers/common/cnxk/roc_utils.c
+++ b/drivers/common/cnxk/roc_utils.c
@@ -34,6 +34,9 @@ roc_error_msg_get(int errorcode)
        case NIX_ERR_OP_NOTSUP:
                err_msg = "Operation not supported";
                break;
+       case NIX_ERR_HW_NOTSUP:
+               err_msg = "Hardware does not support";
+               break;
        case NIX_ERR_QUEUE_INVALID_RANGE:
                err_msg = "Invalid Queue range";
                break;
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index ccf8ec157e..c84c229938 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -82,6 +82,7 @@ INTERNAL {
        roc_model;
        roc_se_auth_key_set;
        roc_se_ciph_key_set;
+       roc_nix_bpf_level_to_idx;
        roc_nix_cq_dump;
        roc_nix_cq_fini;
        roc_nix_cq_init;
-- 
2.25.1

Reply via email to