Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a5995cc8 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

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: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c17d2083
Loading
Loading
Loading
Loading
+6 −43
Original line number Diff line number Diff line
@@ -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);
	}
}
+4 −1
Original line number Diff line number Diff line
@@ -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);

+2 −1
Original line number Diff line number Diff line
@@ -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);
+41 −0
Original line number Diff line number Diff line
@@ -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,
};