mlxsw: spectrum_acl: Move block items encoding into Spectrum op
authorJiri Pirko <jiri@mellanox.com>
Sun, 8 Jul 2018 20:51:23 +0000 (23:51 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 9 Jul 2018 23:24:17 +0000 (16:24 -0700)
Since Spectrum-2 encodes blocks into different HW layout, push this
code into Spectrum-specific op.

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/core_acl_flex_keys.c
drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_ctcam.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c

index 098665e..bf64521 100644 (file)
@@ -416,45 +416,8 @@ void mlxsw_afk_values_add_buf(struct mlxsw_afk_element_values *values,
 }
 EXPORT_SYMBOL(mlxsw_afk_values_add_buf);
 
-static void mlxsw_afk_encode_u32(const struct mlxsw_item *storage_item,
-                                const struct mlxsw_item *output_item,
-                                char *storage, char *output_indexed)
-{
-       u32 value;
-
-       value = __mlxsw_item_get32(storage, storage_item, 0);
-       __mlxsw_item_set32(output_indexed, output_item, 0, value);
-}
-
-static void mlxsw_afk_encode_buf(const struct mlxsw_item *storage_item,
-                                const struct mlxsw_item *output_item,
-                                char *storage, char *output_indexed)
-{
-       char *storage_data = __mlxsw_item_data(storage, storage_item, 0);
-       char *output_data = __mlxsw_item_data(output_indexed, output_item, 0);
-       size_t len = output_item->size.bytes;
-
-       memcpy(output_data, storage_data, len);
-}
-
-#define MLXSW_AFK_KEY_BLOCK_SIZE 16
-
-static void mlxsw_afk_encode_one(const struct mlxsw_afk_element_inst *elinst,
-                                int block_index, char *storage, char *output)
-{
-       char *output_indexed = output + block_index * MLXSW_AFK_KEY_BLOCK_SIZE;
-       const struct mlxsw_item *storage_item = &elinst->info->item;
-       const struct mlxsw_item *output_item = &elinst->item;
-
-       if (elinst->type == MLXSW_AFK_ELEMENT_TYPE_U32)
-               mlxsw_afk_encode_u32(storage_item, output_item,
-                                    storage, output_indexed);
-       else if (elinst->type == MLXSW_AFK_ELEMENT_TYPE_BUF)
-               mlxsw_afk_encode_buf(storage_item, output_item,
-                                    storage, output_indexed);
-}
-
-void mlxsw_afk_encode(struct mlxsw_afk_key_info *key_info,
+void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
+                     struct mlxsw_afk_key_info *key_info,
                      struct mlxsw_afk_element_values *values,
                      char *key, char *mask)
 {
@@ -467,10 +430,10 @@ void mlxsw_afk_encode(struct mlxsw_afk_key_info *key_info,
                                                       &block_index);
                if (!elinst)
                        continue;
-               mlxsw_afk_encode_one(elinst, block_index,
-                                    values->storage.key, key);
-               mlxsw_afk_encode_one(elinst, block_index,
-                                    values->storage.mask, mask);
+               mlxsw_afk->ops->encode_one(elinst, block_index,
+                                          values->storage.key, key);
+               mlxsw_afk->ops->encode_one(elinst, block_index,
+                                          values->storage.mask, mask);
        }
 }
 EXPORT_SYMBOL(mlxsw_afk_encode);
index 6d3817d..441636c 100644 (file)
@@ -219,6 +219,8 @@ struct mlxsw_afk;
 struct mlxsw_afk_ops {
        const struct mlxsw_afk_block *blocks;
        unsigned int blocks_count;
+       void (*encode_one)(const struct mlxsw_afk_element_inst *elinst,
+                          int block_index, char *storage, char *output);
 };
 
 struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks,
@@ -255,7 +257,8 @@ void mlxsw_afk_values_add_buf(struct mlxsw_afk_element_values *values,
                              enum mlxsw_afk_element element,
                              const char *key_value, const char *mask_value,
                              unsigned int len);
-void mlxsw_afk_encode(struct mlxsw_afk_key_info *key_info,
+void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
+                     struct mlxsw_afk_key_info *key_info,
                      struct mlxsw_afk_element_values *values,
                      char *key, char *mask);
 
index c5cbec5..013ab85 100644 (file)
@@ -73,6 +73,7 @@ mlxsw_sp_acl_ctcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp,
                                       unsigned int offset,
                                       struct mlxsw_sp_acl_rule_info *rulei)
 {
+       struct mlxsw_afk *afk = mlxsw_sp_acl_afk(mlxsw_sp->acl);
        char ptce2_pl[MLXSW_REG_PTCE2_LEN];
        char *act_set;
        char *mask;
@@ -82,7 +83,7 @@ mlxsw_sp_acl_ctcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp,
                             region->tcam_region_info, offset);
        key = mlxsw_reg_ptce2_flex_key_blocks_data(ptce2_pl);
        mask = mlxsw_reg_ptce2_mask_data(ptce2_pl);
-       mlxsw_afk_encode(region->key_info, &rulei->values, key, mask);
+       mlxsw_afk_encode(afk, region->key_info, &rulei->values, key, mask);
 
        /* Only the first action set belongs here, the rest is in KVD */
        act_set = mlxsw_afa_block_first_set(rulei->act_block);
index 4ed9a52..80f22b7 100644 (file)
@@ -127,7 +127,48 @@ static const struct mlxsw_afk_block mlxsw_sp1_afk_blocks[] = {
        MLXSW_AFK_BLOCK(0xB0, mlxsw_sp_afk_element_info_packet_type),
 };
 
+static void mlxsw_sp1_afk_encode_u32(const struct mlxsw_item *storage_item,
+                                    const struct mlxsw_item *output_item,
+                                    char *storage, char *output_indexed)
+{
+       u32 value;
+
+       value = __mlxsw_item_get32(storage, storage_item, 0);
+       __mlxsw_item_set32(output_indexed, output_item, 0, value);
+}
+
+static void mlxsw_sp1_afk_encode_buf(const struct mlxsw_item *storage_item,
+                                    const struct mlxsw_item *output_item,
+                                    char *storage, char *output_indexed)
+{
+       char *storage_data = __mlxsw_item_data(storage, storage_item, 0);
+       char *output_data = __mlxsw_item_data(output_indexed, output_item, 0);
+       size_t len = output_item->size.bytes;
+
+       memcpy(output_data, storage_data, len);
+}
+
+#define MLXSW_SP1_AFK_KEY_BLOCK_SIZE 16
+
+static void
+mlxsw_sp1_afk_encode_one(const struct mlxsw_afk_element_inst *elinst,
+                        int block_index, char *storage, char *output)
+{
+       unsigned int offset = block_index * MLXSW_SP1_AFK_KEY_BLOCK_SIZE;
+       char *output_indexed = output + offset;
+       const struct mlxsw_item *storage_item = &elinst->info->item;
+       const struct mlxsw_item *output_item = &elinst->item;
+
+       if (elinst->type == MLXSW_AFK_ELEMENT_TYPE_U32)
+               mlxsw_sp1_afk_encode_u32(storage_item, output_item,
+                                        storage, output_indexed);
+       else if (elinst->type == MLXSW_AFK_ELEMENT_TYPE_BUF)
+               mlxsw_sp1_afk_encode_buf(storage_item, output_item,
+                                        storage, output_indexed);
+}
+
 const struct mlxsw_afk_ops mlxsw_sp1_afk_ops = {
        .blocks         = mlxsw_sp1_afk_blocks,
        .blocks_count   = ARRAY_SIZE(mlxsw_sp1_afk_blocks),
+       .encode_one     = mlxsw_sp1_afk_encode_one,
 };