Lines Matching refs:mlxsw_afk

52 struct mlxsw_afk {
60 static bool mlxsw_afk_blocks_check(struct mlxsw_afk *mlxsw_afk)
65 for (i = 0; i < mlxsw_afk->blocks_count; i++) {
66 const struct mlxsw_afk_block *block = &mlxsw_afk->blocks[i];
84 struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks,
87 struct mlxsw_afk *mlxsw_afk;
89 mlxsw_afk = kzalloc(sizeof(*mlxsw_afk), GFP_KERNEL);
90 if (!mlxsw_afk)
92 INIT_LIST_HEAD(&mlxsw_afk->key_info_list);
93 mlxsw_afk->max_blocks = max_blocks;
94 mlxsw_afk->ops = ops;
95 mlxsw_afk->blocks = ops->blocks;
96 mlxsw_afk->blocks_count = ops->blocks_count;
97 WARN_ON(!mlxsw_afk_blocks_check(mlxsw_afk));
98 return mlxsw_afk;
102 void mlxsw_afk_destroy(struct mlxsw_afk *mlxsw_afk)
104 WARN_ON(!list_empty(&mlxsw_afk->key_info_list));
105 kfree(mlxsw_afk);
128 mlxsw_afk_key_info_find(struct mlxsw_afk *mlxsw_afk,
133 list_for_each_entry(key_info, &mlxsw_afk->key_info_list, list) {
146 static void mlxsw_afk_picker_count_hits(struct mlxsw_afk *mlxsw_afk,
153 for (i = 0; i < mlxsw_afk->blocks_count; i++) {
154 const struct mlxsw_afk_block *block = &mlxsw_afk->blocks[i];
168 static void mlxsw_afk_picker_subtract_hits(struct mlxsw_afk *mlxsw_afk,
179 for (i = 0; i < mlxsw_afk->blocks_count; i++) {
187 static int mlxsw_afk_picker_most_hits_get(struct mlxsw_afk *mlxsw_afk,
194 for (i = 0; i < mlxsw_afk->blocks_count; i++) {
203 static int mlxsw_afk_picker_key_info_add(struct mlxsw_afk *mlxsw_afk,
210 if (key_info->blocks_count == mlxsw_afk->max_blocks)
220 &mlxsw_afk->blocks[block_index];
225 static int mlxsw_afk_keys_fill(struct mlxsw_afk *mlxsw_afk,
233 for_each_set_bit(i, chosen_blocks_bm, mlxsw_afk->blocks_count) {
234 if (!mlxsw_afk->blocks[i].high_entropy)
237 err = mlxsw_afk_picker_key_info_add(mlxsw_afk, picker, i,
245 for_each_set_bit(i, chosen_blocks_bm, mlxsw_afk->blocks_count) {
246 err = mlxsw_afk_picker_key_info_add(mlxsw_afk, picker, i,
255 static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk,
265 picker = kcalloc(mlxsw_afk->blocks_count, sizeof(*picker), GFP_KERNEL);
269 chosen_blocks_bm = bitmap_zalloc(mlxsw_afk->blocks_count, GFP_KERNEL);
289 mlxsw_afk_picker_count_hits(mlxsw_afk, picker, element);
294 block_index = mlxsw_afk_picker_most_hits_get(mlxsw_afk, picker);
309 mlxsw_afk_picker_subtract_hits(mlxsw_afk, picker, block_index);
314 err = mlxsw_afk_keys_fill(mlxsw_afk, chosen_blocks_bm, picker,
324 mlxsw_afk_key_info_create(struct mlxsw_afk *mlxsw_afk,
330 key_info = kzalloc(struct_size(key_info, blocks, mlxsw_afk->max_blocks),
334 err = mlxsw_afk_picker(mlxsw_afk, key_info, elusage);
337 list_add(&key_info->list, &mlxsw_afk->key_info_list);
353 mlxsw_afk_key_info_get(struct mlxsw_afk *mlxsw_afk,
358 key_info = mlxsw_afk_key_info_find(mlxsw_afk, elusage);
363 return mlxsw_afk_key_info_create(mlxsw_afk, elusage);
516 void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
547 mlxsw_afk->ops->encode_block(key, i, block_key);
548 mlxsw_afk->ops->encode_block(mask, i, block_mask);
553 void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key,
559 mlxsw_afk->ops->clear_block(key, i);