mlxsw: reg: Add support for activity information from PEFA register
authorJiri Pirko <jiri@mellanox.com>
Wed, 18 Jul 2018 08:14:35 +0000 (11:14 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Jul 2018 17:13:13 +0000 (02:13 +0900)
In Spectrum-2, the PEFA register is extend to report if the action set
was hit during processing of packets. Introduce this extension and
adjust the code around this accordingly.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/reg.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.c

index f6bfdca..6d65210 100644 (file)
@@ -2332,6 +2332,23 @@ MLXSW_REG_DEFINE(pefa, MLXSW_REG_PEFA_ID, MLXSW_REG_PEFA_LEN);
  */
 MLXSW_ITEM32(reg, pefa, index, 0x00, 0, 24);
 
+/* reg_pefa_a
+ * Index in the KVD Linear Centralized Database.
+ * Activity
+ * For a new entry: set if ca=0, clear if ca=1
+ * Set if a packet lookup has hit on the specific entry
+ * Access: RO
+ */
+MLXSW_ITEM32(reg, pefa, a, 0x04, 29, 1);
+
+/* reg_pefa_ca
+ * Clear activity
+ * When write: activity is according to this field
+ * When read: after reading the activity is cleared according to ca
+ * Access: OP
+ */
+MLXSW_ITEM32(reg, pefa, ca, 0x04, 24, 1);
+
 #define MLXSW_REG_FLEX_ACTION_SET_LEN 0xA8
 
 /* reg_pefa_flex_action_set
@@ -2341,12 +2358,20 @@ MLXSW_ITEM32(reg, pefa, index, 0x00, 0, 24);
  */
 MLXSW_ITEM_BUF(reg, pefa, flex_action_set, 0x08, MLXSW_REG_FLEX_ACTION_SET_LEN);
 
-static inline void mlxsw_reg_pefa_pack(char *payload, u32 index,
+static inline void mlxsw_reg_pefa_pack(char *payload, u32 index, bool ca,
                                       const char *flex_action_set)
 {
        MLXSW_REG_ZERO(pefa, payload);
        mlxsw_reg_pefa_index_set(payload, index);
-       mlxsw_reg_pefa_flex_action_set_memcpy_to(payload, flex_action_set);
+       mlxsw_reg_pefa_ca_set(payload, ca);
+       if (flex_action_set)
+               mlxsw_reg_pefa_flex_action_set_memcpy_to(payload,
+                                                        flex_action_set);
+}
+
+static inline void mlxsw_reg_pefa_unpack(char *payload, bool *p_a)
+{
+       *p_a = mlxsw_reg_pefa_a_get(payload);
 }
 
 /* PTCE-V2 - Policy-Engine TCAM Entry Register Version 2
index 7649570..9119a02 100644 (file)
@@ -38,7 +38,7 @@
 #include "spectrum_span.h"
 
 static int mlxsw_sp_act_kvdl_set_add(void *priv, u32 *p_kvdl_index,
-                                    char *enc_actions, bool is_first)
+                                    char *enc_actions, bool is_first, bool ca)
 {
        struct mlxsw_sp *mlxsw_sp = priv;
        char pefa_pl[MLXSW_REG_PEFA_LEN];
@@ -55,7 +55,7 @@ static int mlxsw_sp_act_kvdl_set_add(void *priv, u32 *p_kvdl_index,
                                  1, &kvdl_index);
        if (err)
                return err;
-       mlxsw_reg_pefa_pack(pefa_pl, kvdl_index, enc_actions);
+       mlxsw_reg_pefa_pack(pefa_pl, kvdl_index, ca, enc_actions);
        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(pefa), pefa_pl);
        if (err)
                goto err_pefa_write;
@@ -68,6 +68,20 @@ err_pefa_write:
        return err;
 }
 
+static int mlxsw_sp1_act_kvdl_set_add(void *priv, u32 *p_kvdl_index,
+                                     char *enc_actions, bool is_first)
+{
+       return mlxsw_sp_act_kvdl_set_add(priv, p_kvdl_index, enc_actions,
+                                        is_first, false);
+}
+
+static int mlxsw_sp2_act_kvdl_set_add(void *priv, u32 *p_kvdl_index,
+                                     char *enc_actions, bool is_first)
+{
+       return mlxsw_sp_act_kvdl_set_add(priv, p_kvdl_index, enc_actions,
+                                        is_first, true);
+}
+
 static void mlxsw_sp_act_kvdl_set_del(void *priv, u32 kvdl_index,
                                      bool is_first)
 {
@@ -158,7 +172,7 @@ mlxsw_sp_act_mirror_del(void *priv, u8 local_in_port, int span_id, bool ingress)
 }
 
 const struct mlxsw_afa_ops mlxsw_sp1_act_afa_ops = {
-       .kvdl_set_add           = mlxsw_sp_act_kvdl_set_add,
+       .kvdl_set_add           = mlxsw_sp1_act_kvdl_set_add,
        .kvdl_set_del           = mlxsw_sp_act_kvdl_set_del,
        .kvdl_fwd_entry_add     = mlxsw_sp_act_kvdl_fwd_entry_add,
        .kvdl_fwd_entry_del     = mlxsw_sp_act_kvdl_fwd_entry_del,
@@ -169,7 +183,7 @@ const struct mlxsw_afa_ops mlxsw_sp1_act_afa_ops = {
 };
 
 const struct mlxsw_afa_ops mlxsw_sp2_act_afa_ops = {
-       .kvdl_set_add           = mlxsw_sp_act_kvdl_set_add,
+       .kvdl_set_add           = mlxsw_sp2_act_kvdl_set_add,
        .kvdl_set_del           = mlxsw_sp_act_kvdl_set_del,
        .kvdl_fwd_entry_add     = mlxsw_sp_act_kvdl_fwd_entry_add,
        .kvdl_fwd_entry_del     = mlxsw_sp_act_kvdl_fwd_entry_del,