From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ido Schimmel Subject: [PATCH net-next 07/11] mlxsw: spectrum: acl: Don't encode the key again in mlxsw_sp_acl_atcam_12kb_lkey_id_get() Date: Wed, 14 Nov 2018 08:22:32 +0000 Message-ID: <20181114082138.14284-8-idosch@mellanox.com> References: <20181114082138.14284-1-idosch@mellanox.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Cc: "davem@davemloft.net" , Jiri Pirko , mlxsw , Ido Schimmel To: "netdev@vger.kernel.org" Return-path: Received: from mail-eopbgr60079.outbound.protection.outlook.com ([40.107.6.79]:35592 "EHLO EUR04-DB3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1732129AbeKNSYr (ORCPT ); Wed, 14 Nov 2018 13:24:47 -0500 In-Reply-To: <20181114082138.14284-1-idosch@mellanox.com> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: From: Jiri Pirko No need to do key encoding again in mlxsw_sp_acl_atcam_12kb_lkey_id_get(). Instead of that, introduce a new helper that would just clear unused blocks. Signed-off-by: Jiri Pirko Signed-off-by: Ido Schimmel --- .../mellanox/mlxsw/core_acl_flex_keys.c | 10 +++++++ .../mellanox/mlxsw/core_acl_flex_keys.h | 3 ++ .../mellanox/mlxsw/spectrum_acl_atcam.c | 22 +++++++-------- .../mellanox/mlxsw/spectrum_acl_flex_keys.c | 28 +++++++++++++++++-- 4 files changed, 49 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c b/dri= vers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c index 98c00ea9c398..0900ccfdf315 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c @@ -458,3 +458,13 @@ void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk, } } EXPORT_SYMBOL(mlxsw_afk_encode); + +void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key, + int block_start, int block_end) +{ + int i; + + for (i =3D block_start; i <=3D block_end; i++) + mlxsw_afk->ops->clear_block(key, i); +} +EXPORT_SYMBOL(mlxsw_afk_clear); diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h b/dri= vers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h index 6a44501d8af7..a5303c0b53b4 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h +++ b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h @@ -189,6 +189,7 @@ struct mlxsw_afk_ops { const struct mlxsw_afk_block *blocks; unsigned int blocks_count; void (*encode_block)(char *output, int block_index, char *block); + void (*clear_block)(char *output, int block_index); }; =20 struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks, @@ -229,5 +230,7 @@ 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, int block_start, int block_end); +void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key, + int block_start, int block_end); =20 #endif diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c b/dri= vers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c index 5a0b88707269..ffdf464660be 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c @@ -14,8 +14,8 @@ #include "spectrum_acl_tcam.h" #include "core_acl_flex_keys.h" =20 -#define MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_START 6 -#define MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_END 11 +#define MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_CLEAR_START 0 +#define MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_CLEAR_END 5 =20 struct mlxsw_sp_acl_atcam_lkey_id_ht_key { char enc_key[MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN]; /* MSB blocks */ @@ -34,7 +34,7 @@ struct mlxsw_sp_acl_atcam_region_ops { void (*fini)(struct mlxsw_sp_acl_atcam_region *aregion); struct mlxsw_sp_acl_atcam_lkey_id * (*lkey_id_get)(struct mlxsw_sp_acl_atcam_region *aregion, - struct mlxsw_sp_acl_rule_info *rulei, u8 erp_id); + char *enc_key, u8 erp_id); void (*lkey_id_put)(struct mlxsw_sp_acl_atcam_region *aregion, struct mlxsw_sp_acl_atcam_lkey_id *lkey_id); }; @@ -90,8 +90,7 @@ mlxsw_sp_acl_atcam_region_generic_fini(struct mlxsw_sp_ac= l_atcam_region *aregion =20 static struct mlxsw_sp_acl_atcam_lkey_id * mlxsw_sp_acl_atcam_generic_lkey_id_get(struct mlxsw_sp_acl_atcam_region *a= region, - struct mlxsw_sp_acl_rule_info *rulei, - u8 erp_id) + char *enc_key, u8 erp_id) { struct mlxsw_sp_acl_atcam_region_generic *region_generic; =20 @@ -220,8 +219,7 @@ mlxsw_sp_acl_atcam_lkey_id_destroy(struct mlxsw_sp_acl_= atcam_region *aregion, =20 static struct mlxsw_sp_acl_atcam_lkey_id * mlxsw_sp_acl_atcam_12kb_lkey_id_get(struct mlxsw_sp_acl_atcam_region *areg= ion, - struct mlxsw_sp_acl_rule_info *rulei, - u8 erp_id) + char *enc_key, u8 erp_id) { struct mlxsw_sp_acl_atcam_region_12kb *region_12kb =3D aregion->priv; struct mlxsw_sp_acl_tcam_region *region =3D aregion->region; @@ -230,9 +228,10 @@ mlxsw_sp_acl_atcam_12kb_lkey_id_get(struct mlxsw_sp_ac= l_atcam_region *aregion, struct mlxsw_afk *afk =3D mlxsw_sp_acl_afk(mlxsw_sp->acl); struct mlxsw_sp_acl_atcam_lkey_id *lkey_id; =20 - mlxsw_afk_encode(afk, region->key_info, &rulei->values, ht_key.enc_key, - NULL, MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_START, - MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_END); + memcpy(ht_key.enc_key, enc_key, sizeof(ht_key.enc_key)); + mlxsw_afk_clear(afk, ht_key.enc_key, + MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_CLEAR_START, + MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_CLEAR_END); ht_key.erp_id =3D erp_id; lkey_id =3D rhashtable_lookup_fast(®ion_12kb->lkey_ht, &ht_key, mlxsw_sp_acl_atcam_lkey_id_ht_params); @@ -389,7 +388,8 @@ mlxsw_sp_acl_atcam_region_entry_insert(struct mlxsw_sp = *mlxsw_sp, if (err) return err; =20 - lkey_id =3D aregion->ops->lkey_id_get(aregion, rulei, erp_id); + lkey_id =3D aregion->ops->lkey_id_get(aregion, aentry->ht_key.enc_key, + erp_id); if (IS_ERR(lkey_id)) return PTR_ERR(lkey_id); aentry->lkey_id =3D lkey_id; diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c b= /drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c index 9b93c6c3c89b..2e1e8c4b3922 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c @@ -107,10 +107,19 @@ static void mlxsw_sp1_afk_encode_block(char *output, = int block_index, memcpy(output_indexed, block, MLXSW_SP1_AFK_KEY_BLOCK_SIZE); } =20 +static void mlxsw_sp1_afk_clear_block(char *output, int block_index) +{ + unsigned int offset =3D block_index * MLXSW_SP1_AFK_KEY_BLOCK_SIZE; + char *output_indexed =3D output + offset; + + memset(output_indexed, 0, MLXSW_SP1_AFK_KEY_BLOCK_SIZE); +} + const struct mlxsw_afk_ops mlxsw_sp1_afk_ops =3D { .blocks =3D mlxsw_sp1_afk_blocks, .blocks_count =3D ARRAY_SIZE(mlxsw_sp1_afk_blocks), .encode_block =3D mlxsw_sp1_afk_encode_block, + .clear_block =3D mlxsw_sp1_afk_clear_block, }; =20 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_0[] =3D= { @@ -263,10 +272,9 @@ static const struct mlxsw_sp2_afk_block_layout mlxsw_s= p2_afk_blocks_layout[] =3D { MLXSW_SP2_AFK_BLOCK_LAYOUT(block11, 0x00, 12), }; =20 -static void mlxsw_sp2_afk_encode_block(char *output, int block_index, - char *block) +static void __mlxsw_sp2_afk_block_value_set(char *output, int block_index, + u64 block_value) { - u64 block_value =3D mlxsw_sp2_afk_block_value_get(block); const struct mlxsw_sp2_afk_block_layout *block_layout; =20 if (WARN_ON(block_index < 0 || @@ -278,8 +286,22 @@ static void mlxsw_sp2_afk_encode_block(char *output, i= nt block_index, &block_layout->item, 0, block_value); } =20 +static void mlxsw_sp2_afk_encode_block(char *output, int block_index, + char *block) +{ + u64 block_value =3D mlxsw_sp2_afk_block_value_get(block); + + __mlxsw_sp2_afk_block_value_set(output, block_index, block_value); +} + +static void mlxsw_sp2_afk_clear_block(char *output, int block_index) +{ + __mlxsw_sp2_afk_block_value_set(output, block_index, 0); +} + const struct mlxsw_afk_ops mlxsw_sp2_afk_ops =3D { .blocks =3D mlxsw_sp2_afk_blocks, .blocks_count =3D ARRAY_SIZE(mlxsw_sp2_afk_blocks), .encode_block =3D mlxsw_sp2_afk_encode_block, + .clear_block =3D mlxsw_sp2_afk_clear_block, }; --=20 2.19.1