mlxsw: spectrum: acl: Don't encode the key again in mlxsw_sp_acl_atcam_12kb_lkey_id_get()
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 <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3bc6f3858a
commit
b1ce60e621
@ -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 = block_start; i <= block_end; i++)
|
||||
mlxsw_afk->ops->clear_block(key, i);
|
||||
}
|
||||
EXPORT_SYMBOL(mlxsw_afk_clear);
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
#endif
|
||||
|
@ -14,8 +14,8 @@
|
||||
#include "spectrum_acl_tcam.h"
|
||||
#include "core_acl_flex_keys.h"
|
||||
|
||||
#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
|
||||
|
||||
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_acl_atcam_region *aregion
|
||||
|
||||
static struct mlxsw_sp_acl_atcam_lkey_id *
|
||||
mlxsw_sp_acl_atcam_generic_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)
|
||||
{
|
||||
struct mlxsw_sp_acl_atcam_region_generic *region_generic;
|
||||
|
||||
@ -220,8 +219,7 @@ mlxsw_sp_acl_atcam_lkey_id_destroy(struct mlxsw_sp_acl_atcam_region *aregion,
|
||||
|
||||
static struct mlxsw_sp_acl_atcam_lkey_id *
|
||||
mlxsw_sp_acl_atcam_12kb_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)
|
||||
{
|
||||
struct mlxsw_sp_acl_atcam_region_12kb *region_12kb = aregion->priv;
|
||||
struct mlxsw_sp_acl_tcam_region *region = aregion->region;
|
||||
@ -230,9 +228,10 @@ mlxsw_sp_acl_atcam_12kb_lkey_id_get(struct mlxsw_sp_acl_atcam_region *aregion,
|
||||
struct mlxsw_afk *afk = mlxsw_sp_acl_afk(mlxsw_sp->acl);
|
||||
struct mlxsw_sp_acl_atcam_lkey_id *lkey_id;
|
||||
|
||||
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 = erp_id;
|
||||
lkey_id = 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;
|
||||
|
||||
lkey_id = aregion->ops->lkey_id_get(aregion, rulei, erp_id);
|
||||
lkey_id = 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 = lkey_id;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
static void mlxsw_sp1_afk_clear_block(char *output, int block_index)
|
||||
{
|
||||
unsigned int offset = block_index * MLXSW_SP1_AFK_KEY_BLOCK_SIZE;
|
||||
char *output_indexed = output + offset;
|
||||
|
||||
memset(output_indexed, 0, MLXSW_SP1_AFK_KEY_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
const struct mlxsw_afk_ops mlxsw_sp1_afk_ops = {
|
||||
.blocks = mlxsw_sp1_afk_blocks,
|
||||
.blocks_count = ARRAY_SIZE(mlxsw_sp1_afk_blocks),
|
||||
.encode_block = mlxsw_sp1_afk_encode_block,
|
||||
.clear_block = mlxsw_sp1_afk_clear_block,
|
||||
};
|
||||
|
||||
static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_0[] = {
|
||||
@ -263,10 +272,9 @@ static const struct mlxsw_sp2_afk_block_layout mlxsw_sp2_afk_blocks_layout[] = {
|
||||
MLXSW_SP2_AFK_BLOCK_LAYOUT(block11, 0x00, 12),
|
||||
};
|
||||
|
||||
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 = mlxsw_sp2_afk_block_value_get(block);
|
||||
const struct mlxsw_sp2_afk_block_layout *block_layout;
|
||||
|
||||
if (WARN_ON(block_index < 0 ||
|
||||
@ -278,8 +286,22 @@ static void mlxsw_sp2_afk_encode_block(char *output, int block_index,
|
||||
&block_layout->item, 0, block_value);
|
||||
}
|
||||
|
||||
static void mlxsw_sp2_afk_encode_block(char *output, int block_index,
|
||||
char *block)
|
||||
{
|
||||
u64 block_value = 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 = {
|
||||
.blocks = mlxsw_sp2_afk_blocks,
|
||||
.blocks_count = ARRAY_SIZE(mlxsw_sp2_afk_blocks),
|
||||
.encode_block = mlxsw_sp2_afk_encode_block,
|
||||
.clear_block = mlxsw_sp2_afk_clear_block,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user