mlxsw: spectrum_acl: Move block items encoding into Spectrum op
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>
This commit is contained in:
parent
c17d20838e
commit
a5995cc801
|
@ -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,9 +430,9 @@ void mlxsw_afk_encode(struct mlxsw_afk_key_info *key_info,
|
|||
&block_index);
|
||||
if (!elinst)
|
||||
continue;
|
||||
mlxsw_afk_encode_one(elinst, block_index,
|
||||
mlxsw_afk->ops->encode_one(elinst, block_index,
|
||||
values->storage.key, key);
|
||||
mlxsw_afk_encode_one(elinst, block_index,
|
||||
mlxsw_afk->ops->encode_one(elinst, block_index,
|
||||
values->storage.mask, mask);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue