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);
|
EXPORT_SYMBOL(mlxsw_afk_values_add_buf);
|
||||||
|
|
||||||
static void mlxsw_afk_encode_u32(const struct mlxsw_item *storage_item,
|
void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
|
||||||
const struct mlxsw_item *output_item,
|
struct mlxsw_afk_key_info *key_info,
|
||||||
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,
|
|
||||||
struct mlxsw_afk_element_values *values,
|
struct mlxsw_afk_element_values *values,
|
||||||
char *key, char *mask)
|
char *key, char *mask)
|
||||||
{
|
{
|
||||||
|
@ -467,10 +430,10 @@ void mlxsw_afk_encode(struct mlxsw_afk_key_info *key_info,
|
||||||
&block_index);
|
&block_index);
|
||||||
if (!elinst)
|
if (!elinst)
|
||||||
continue;
|
continue;
|
||||||
mlxsw_afk_encode_one(elinst, block_index,
|
mlxsw_afk->ops->encode_one(elinst, block_index,
|
||||||
values->storage.key, key);
|
values->storage.key, key);
|
||||||
mlxsw_afk_encode_one(elinst, block_index,
|
mlxsw_afk->ops->encode_one(elinst, block_index,
|
||||||
values->storage.mask, mask);
|
values->storage.mask, mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(mlxsw_afk_encode);
|
EXPORT_SYMBOL(mlxsw_afk_encode);
|
||||||
|
|
|
@ -219,6 +219,8 @@ struct mlxsw_afk;
|
||||||
struct mlxsw_afk_ops {
|
struct mlxsw_afk_ops {
|
||||||
const struct mlxsw_afk_block *blocks;
|
const struct mlxsw_afk_block *blocks;
|
||||||
unsigned int blocks_count;
|
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,
|
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,
|
enum mlxsw_afk_element element,
|
||||||
const char *key_value, const char *mask_value,
|
const char *key_value, const char *mask_value,
|
||||||
unsigned int len);
|
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,
|
struct mlxsw_afk_element_values *values,
|
||||||
char *key, char *mask);
|
char *key, char *mask);
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@ mlxsw_sp_acl_ctcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp,
|
||||||
unsigned int offset,
|
unsigned int offset,
|
||||||
struct mlxsw_sp_acl_rule_info *rulei)
|
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 ptce2_pl[MLXSW_REG_PTCE2_LEN];
|
||||||
char *act_set;
|
char *act_set;
|
||||||
char *mask;
|
char *mask;
|
||||||
|
@ -82,7 +83,7 @@ mlxsw_sp_acl_ctcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp,
|
||||||
region->tcam_region_info, offset);
|
region->tcam_region_info, offset);
|
||||||
key = mlxsw_reg_ptce2_flex_key_blocks_data(ptce2_pl);
|
key = mlxsw_reg_ptce2_flex_key_blocks_data(ptce2_pl);
|
||||||
mask = mlxsw_reg_ptce2_mask_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 */
|
/* Only the first action set belongs here, the rest is in KVD */
|
||||||
act_set = mlxsw_afa_block_first_set(rulei->act_block);
|
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),
|
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 = {
|
const struct mlxsw_afk_ops mlxsw_sp1_afk_ops = {
|
||||||
.blocks = mlxsw_sp1_afk_blocks,
|
.blocks = mlxsw_sp1_afk_blocks,
|
||||||
.blocks_count = ARRAY_SIZE(mlxsw_sp1_afk_blocks),
|
.blocks_count = ARRAY_SIZE(mlxsw_sp1_afk_blocks),
|
||||||
|
.encode_one = mlxsw_sp1_afk_encode_one,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue