19948a064SJiri Pirko /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
29948a064SJiri Pirko /* Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved */
364eccd00SJiri Pirko
464eccd00SJiri Pirko #ifndef _MLXSW_SPECTRUM_ACL_TCAM_H
564eccd00SJiri Pirko #define _MLXSW_SPECTRUM_ACL_TCAM_H
664eccd00SJiri Pirko
764eccd00SJiri Pirko #include <linux/list.h>
864eccd00SJiri Pirko #include <linux/parman.h>
9627f9c1bSIdo Schimmel #include <linux/idr.h>
1064eccd00SJiri Pirko
1164eccd00SJiri Pirko #include "reg.h"
1264eccd00SJiri Pirko #include "spectrum.h"
1364eccd00SJiri Pirko #include "core_acl_flex_keys.h"
1464eccd00SJiri Pirko
15bab5c1cfSJiri Pirko struct mlxsw_sp_acl_tcam {
16627f9c1bSIdo Schimmel struct ida used_regions;
17bab5c1cfSJiri Pirko unsigned int max_regions;
18627f9c1bSIdo Schimmel struct ida used_groups;
19bab5c1cfSJiri Pirko unsigned int max_groups;
20bab5c1cfSJiri Pirko unsigned int max_group_size;
217b0f62eeSJiri Pirko struct mutex lock; /* guards vregion list */
22e5e7962eSJiri Pirko struct list_head vregion_list;
23e5e7962eSJiri Pirko u32 vregion_rehash_intrvl; /* ms */
24e99f8e7fSGustavo A. R. Silva unsigned long priv[];
25bab5c1cfSJiri Pirko /* priv has to be always the last item */
26bab5c1cfSJiri Pirko };
27bab5c1cfSJiri Pirko
28bab5c1cfSJiri Pirko size_t mlxsw_sp_acl_tcam_priv_size(struct mlxsw_sp *mlxsw_sp);
29bab5c1cfSJiri Pirko int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp,
30bab5c1cfSJiri Pirko struct mlxsw_sp_acl_tcam *tcam);
31bab5c1cfSJiri Pirko void mlxsw_sp_acl_tcam_fini(struct mlxsw_sp *mlxsw_sp,
32bab5c1cfSJiri Pirko struct mlxsw_sp_acl_tcam *tcam);
33ea8b2e28SJiri Pirko int mlxsw_sp_acl_tcam_priority_get(struct mlxsw_sp *mlxsw_sp,
34ea8b2e28SJiri Pirko struct mlxsw_sp_acl_rule_info *rulei,
35ea8b2e28SJiri Pirko u32 *priority, bool fillup_priority);
36bab5c1cfSJiri Pirko
37bab5c1cfSJiri Pirko struct mlxsw_sp_acl_profile_ops {
38bab5c1cfSJiri Pirko size_t ruleset_priv_size;
39bab5c1cfSJiri Pirko int (*ruleset_add)(struct mlxsw_sp *mlxsw_sp,
40e2f2a1fdSJiri Pirko struct mlxsw_sp_acl_tcam *tcam, void *ruleset_priv,
41593bb843SJiri Pirko struct mlxsw_afk_element_usage *tmplt_elusage,
42593bb843SJiri Pirko unsigned int *p_min_prio, unsigned int *p_max_prio);
43bab5c1cfSJiri Pirko void (*ruleset_del)(struct mlxsw_sp *mlxsw_sp, void *ruleset_priv);
44bab5c1cfSJiri Pirko int (*ruleset_bind)(struct mlxsw_sp *mlxsw_sp, void *ruleset_priv,
45bab5c1cfSJiri Pirko struct mlxsw_sp_port *mlxsw_sp_port,
46bab5c1cfSJiri Pirko bool ingress);
47bab5c1cfSJiri Pirko void (*ruleset_unbind)(struct mlxsw_sp *mlxsw_sp, void *ruleset_priv,
48bab5c1cfSJiri Pirko struct mlxsw_sp_port *mlxsw_sp_port,
49bab5c1cfSJiri Pirko bool ingress);
50bab5c1cfSJiri Pirko u16 (*ruleset_group_id)(void *ruleset_priv);
51c4c2dc54SJiri Pirko size_t rule_priv_size;
52bab5c1cfSJiri Pirko int (*rule_add)(struct mlxsw_sp *mlxsw_sp,
53bab5c1cfSJiri Pirko void *ruleset_priv, void *rule_priv,
54bab5c1cfSJiri Pirko struct mlxsw_sp_acl_rule_info *rulei);
55bab5c1cfSJiri Pirko void (*rule_del)(struct mlxsw_sp *mlxsw_sp, void *rule_priv);
5642d704e0SJiri Pirko int (*rule_action_replace)(struct mlxsw_sp *mlxsw_sp, void *rule_priv,
572507a64cSNir Dotan struct mlxsw_sp_acl_rule_info *rulei);
58bab5c1cfSJiri Pirko int (*rule_activity_get)(struct mlxsw_sp *mlxsw_sp, void *rule_priv,
59bab5c1cfSJiri Pirko bool *activity);
60bab5c1cfSJiri Pirko };
61bab5c1cfSJiri Pirko
62bab5c1cfSJiri Pirko const struct mlxsw_sp_acl_profile_ops *
63bab5c1cfSJiri Pirko mlxsw_sp_acl_tcam_profile_ops(struct mlxsw_sp *mlxsw_sp,
64bab5c1cfSJiri Pirko enum mlxsw_sp_acl_profile profile);
6564eccd00SJiri Pirko
6664eccd00SJiri Pirko #define MLXSW_SP_ACL_TCAM_REGION_BASE_COUNT 16
6764eccd00SJiri Pirko #define MLXSW_SP_ACL_TCAM_REGION_RESIZE_STEP 16
6864eccd00SJiri Pirko
6964eccd00SJiri Pirko #define MLXSW_SP_ACL_TCAM_CATCHALL_PRIO (~0U)
7064eccd00SJiri Pirko
71f465261aSIdo Schimmel #define MLXSW_SP_ACL_TCAM_MASK_LEN \
72f465261aSIdo Schimmel (MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN * BITS_PER_BYTE)
73f465261aSIdo Schimmel
7464eccd00SJiri Pirko struct mlxsw_sp_acl_tcam_group;
750f54236dSJiri Pirko struct mlxsw_sp_acl_tcam_vregion;
7664eccd00SJiri Pirko
7764eccd00SJiri Pirko struct mlxsw_sp_acl_tcam_region {
780f54236dSJiri Pirko struct mlxsw_sp_acl_tcam_vregion *vregion;
792802aadfSJiri Pirko struct mlxsw_sp_acl_tcam_group *group;
802802aadfSJiri Pirko struct list_head list; /* Member of a TCAM group */
8164eccd00SJiri Pirko enum mlxsw_reg_ptar_key_type key_type;
8264eccd00SJiri Pirko u16 id; /* ACL ID and region ID - they are same */
8364eccd00SJiri Pirko char tcam_region_info[MLXSW_REG_PXXX_TCAM_REGION_INFO_LEN];
8464eccd00SJiri Pirko struct mlxsw_afk_key_info *key_info;
8564eccd00SJiri Pirko struct mlxsw_sp *mlxsw_sp;
86e99f8e7fSGustavo A. R. Silva unsigned long priv[];
8764eccd00SJiri Pirko /* priv has to be always the last item */
8864eccd00SJiri Pirko };
8964eccd00SJiri Pirko
9064eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_region {
9164eccd00SJiri Pirko struct parman *parman;
92a0a777b9SIdo Schimmel const struct mlxsw_sp_acl_ctcam_region_ops *ops;
9364eccd00SJiri Pirko struct mlxsw_sp_acl_tcam_region *region;
9464eccd00SJiri Pirko };
9564eccd00SJiri Pirko
9664eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_chunk {
9764eccd00SJiri Pirko struct parman_prio parman_prio;
9864eccd00SJiri Pirko };
9964eccd00SJiri Pirko
10064eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_entry {
10164eccd00SJiri Pirko struct parman_item parman_item;
10264eccd00SJiri Pirko };
10364eccd00SJiri Pirko
104a0a777b9SIdo Schimmel struct mlxsw_sp_acl_ctcam_region_ops {
105a0a777b9SIdo Schimmel int (*entry_insert)(struct mlxsw_sp_acl_ctcam_region *cregion,
106a0a777b9SIdo Schimmel struct mlxsw_sp_acl_ctcam_entry *centry,
107a0a777b9SIdo Schimmel const char *mask);
108a0a777b9SIdo Schimmel void (*entry_remove)(struct mlxsw_sp_acl_ctcam_region *cregion,
109a0a777b9SIdo Schimmel struct mlxsw_sp_acl_ctcam_entry *centry);
110a0a777b9SIdo Schimmel };
111a0a777b9SIdo Schimmel
112a0a777b9SIdo Schimmel int
113a0a777b9SIdo Schimmel mlxsw_sp_acl_ctcam_region_init(struct mlxsw_sp *mlxsw_sp,
11464eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_region *cregion,
115a0a777b9SIdo Schimmel struct mlxsw_sp_acl_tcam_region *region,
116a0a777b9SIdo Schimmel const struct mlxsw_sp_acl_ctcam_region_ops *ops);
11764eccd00SJiri Pirko void mlxsw_sp_acl_ctcam_region_fini(struct mlxsw_sp_acl_ctcam_region *cregion);
11864eccd00SJiri Pirko void mlxsw_sp_acl_ctcam_chunk_init(struct mlxsw_sp_acl_ctcam_region *cregion,
11964eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_chunk *cchunk,
12064eccd00SJiri Pirko unsigned int priority);
12164eccd00SJiri Pirko void mlxsw_sp_acl_ctcam_chunk_fini(struct mlxsw_sp_acl_ctcam_chunk *cchunk);
12264eccd00SJiri Pirko int mlxsw_sp_acl_ctcam_entry_add(struct mlxsw_sp *mlxsw_sp,
12364eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_region *cregion,
12464eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_chunk *cchunk,
12564eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_entry *centry,
126ea8b2e28SJiri Pirko struct mlxsw_sp_acl_rule_info *rulei,
127ea8b2e28SJiri Pirko bool fillup_priority);
12864eccd00SJiri Pirko void mlxsw_sp_acl_ctcam_entry_del(struct mlxsw_sp *mlxsw_sp,
12964eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_region *cregion,
13064eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_chunk *cchunk,
13164eccd00SJiri Pirko struct mlxsw_sp_acl_ctcam_entry *centry);
1322507a64cSNir Dotan int mlxsw_sp_acl_ctcam_entry_action_replace(struct mlxsw_sp *mlxsw_sp,
1332507a64cSNir Dotan struct mlxsw_sp_acl_ctcam_region *cregion,
1342507a64cSNir Dotan struct mlxsw_sp_acl_ctcam_entry *centry,
1352507a64cSNir Dotan struct mlxsw_sp_acl_rule_info *rulei);
13664eccd00SJiri Pirko static inline unsigned int
mlxsw_sp_acl_ctcam_entry_offset(struct mlxsw_sp_acl_ctcam_entry * centry)13764eccd00SJiri Pirko mlxsw_sp_acl_ctcam_entry_offset(struct mlxsw_sp_acl_ctcam_entry *centry)
13864eccd00SJiri Pirko {
13964eccd00SJiri Pirko return centry->parman_item.index;
14064eccd00SJiri Pirko }
14164eccd00SJiri Pirko
142f465261aSIdo Schimmel enum mlxsw_sp_acl_atcam_region_type {
143f465261aSIdo Schimmel MLXSW_SP_ACL_ATCAM_REGION_TYPE_2KB,
144f465261aSIdo Schimmel MLXSW_SP_ACL_ATCAM_REGION_TYPE_4KB,
145f465261aSIdo Schimmel MLXSW_SP_ACL_ATCAM_REGION_TYPE_8KB,
146f465261aSIdo Schimmel MLXSW_SP_ACL_ATCAM_REGION_TYPE_12KB,
147f465261aSIdo Schimmel __MLXSW_SP_ACL_ATCAM_REGION_TYPE_MAX,
148f465261aSIdo Schimmel };
149f465261aSIdo Schimmel
150f465261aSIdo Schimmel #define MLXSW_SP_ACL_ATCAM_REGION_TYPE_MAX \
151f465261aSIdo Schimmel (__MLXSW_SP_ACL_ATCAM_REGION_TYPE_MAX - 1)
152f465261aSIdo Schimmel
153f465261aSIdo Schimmel struct mlxsw_sp_acl_atcam {
154f465261aSIdo Schimmel struct mlxsw_sp_acl_erp_core *erp_core;
155f465261aSIdo Schimmel };
156f465261aSIdo Schimmel
157f465261aSIdo Schimmel struct mlxsw_sp_acl_atcam_region {
158a8758b67SIdo Schimmel struct rhashtable entries_ht; /* A-TCAM only */
159135fd957SNir Dotan struct list_head entries_list; /* A-TCAM only */
16057e56d36SIdo Schimmel struct mlxsw_sp_acl_ctcam_region cregion;
161a8758b67SIdo Schimmel const struct mlxsw_sp_acl_atcam_region_ops *ops;
162f465261aSIdo Schimmel struct mlxsw_sp_acl_tcam_region *region;
163f465261aSIdo Schimmel struct mlxsw_sp_acl_atcam *atcam;
164f465261aSIdo Schimmel enum mlxsw_sp_acl_atcam_region_type type;
165f465261aSIdo Schimmel struct mlxsw_sp_acl_erp_table *erp_table;
166a8758b67SIdo Schimmel void *priv;
167a8758b67SIdo Schimmel };
168a8758b67SIdo Schimmel
169a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_entry_ht_key {
17075d8d7a6SIdo Schimmel char enc_key[MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN]; /* Encoded key, minus
17175d8d7a6SIdo Schimmel * delta bits.
172c22291f7SJiri Pirko */
173a8758b67SIdo Schimmel u8 erp_id;
174a8758b67SIdo Schimmel };
175a8758b67SIdo Schimmel
176a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_chunk {
177a8758b67SIdo Schimmel struct mlxsw_sp_acl_ctcam_chunk cchunk;
178a8758b67SIdo Schimmel };
179a8758b67SIdo Schimmel
180a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_entry {
181a8758b67SIdo Schimmel struct rhash_head ht_node;
182135fd957SNir Dotan struct list_head list; /* Member in entries_list */
183a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_entry_ht_key ht_key;
184c22291f7SJiri Pirko struct {
185c22291f7SJiri Pirko u16 start;
186c22291f7SJiri Pirko u8 mask;
187c22291f7SJiri Pirko u8 value;
188c22291f7SJiri Pirko } delta_info;
189a8758b67SIdo Schimmel struct mlxsw_sp_acl_ctcam_entry centry;
190a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_lkey_id *lkey_id;
191c71abd7dSJiri Pirko struct mlxsw_sp_acl_erp_mask *erp_mask;
192f465261aSIdo Schimmel };
193f465261aSIdo Schimmel
194a0a777b9SIdo Schimmel static inline struct mlxsw_sp_acl_atcam_region *
mlxsw_sp_acl_tcam_cregion_aregion(struct mlxsw_sp_acl_ctcam_region * cregion)195a0a777b9SIdo Schimmel mlxsw_sp_acl_tcam_cregion_aregion(struct mlxsw_sp_acl_ctcam_region *cregion)
196a0a777b9SIdo Schimmel {
197a0a777b9SIdo Schimmel return container_of(cregion, struct mlxsw_sp_acl_atcam_region, cregion);
198a0a777b9SIdo Schimmel }
199a0a777b9SIdo Schimmel
200a0a777b9SIdo Schimmel static inline struct mlxsw_sp_acl_atcam_entry *
mlxsw_sp_acl_tcam_centry_aentry(struct mlxsw_sp_acl_ctcam_entry * centry)201a0a777b9SIdo Schimmel mlxsw_sp_acl_tcam_centry_aentry(struct mlxsw_sp_acl_ctcam_entry *centry)
202a0a777b9SIdo Schimmel {
203a0a777b9SIdo Schimmel return container_of(centry, struct mlxsw_sp_acl_atcam_entry, centry);
204a0a777b9SIdo Schimmel }
205a0a777b9SIdo Schimmel
2069912e6b8SJiri Pirko int mlxsw_sp_acl_atcam_region_associate(struct mlxsw_sp *mlxsw_sp,
2079912e6b8SJiri Pirko u16 region_id);
208a0a777b9SIdo Schimmel int
209a0a777b9SIdo Schimmel mlxsw_sp_acl_atcam_region_init(struct mlxsw_sp *mlxsw_sp,
210f58df510SIdo Schimmel struct mlxsw_sp_acl_atcam *atcam,
21157e56d36SIdo Schimmel struct mlxsw_sp_acl_atcam_region *aregion,
212a0a777b9SIdo Schimmel struct mlxsw_sp_acl_tcam_region *region,
213a339bf8aSJiri Pirko void *hints_priv,
214a0a777b9SIdo Schimmel const struct mlxsw_sp_acl_ctcam_region_ops *ops);
21557e56d36SIdo Schimmel void mlxsw_sp_acl_atcam_region_fini(struct mlxsw_sp_acl_atcam_region *aregion);
216a8758b67SIdo Schimmel void mlxsw_sp_acl_atcam_chunk_init(struct mlxsw_sp_acl_atcam_region *aregion,
217a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_chunk *achunk,
218a8758b67SIdo Schimmel unsigned int priority);
219a8758b67SIdo Schimmel void mlxsw_sp_acl_atcam_chunk_fini(struct mlxsw_sp_acl_atcam_chunk *achunk);
220a8758b67SIdo Schimmel int mlxsw_sp_acl_atcam_entry_add(struct mlxsw_sp *mlxsw_sp,
221a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_region *aregion,
222a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_chunk *achunk,
223a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_entry *aentry,
224a8758b67SIdo Schimmel struct mlxsw_sp_acl_rule_info *rulei);
225a8758b67SIdo Schimmel void mlxsw_sp_acl_atcam_entry_del(struct mlxsw_sp *mlxsw_sp,
226a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_region *aregion,
227a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_chunk *achunk,
228a8758b67SIdo Schimmel struct mlxsw_sp_acl_atcam_entry *aentry);
2292507a64cSNir Dotan int mlxsw_sp_acl_atcam_entry_action_replace(struct mlxsw_sp *mlxsw_sp,
2302507a64cSNir Dotan struct mlxsw_sp_acl_atcam_region *aregion,
2312507a64cSNir Dotan struct mlxsw_sp_acl_atcam_entry *aentry,
2322507a64cSNir Dotan struct mlxsw_sp_acl_rule_info *rulei);
233174c0adbSIdo Schimmel int mlxsw_sp_acl_atcam_init(struct mlxsw_sp *mlxsw_sp,
234174c0adbSIdo Schimmel struct mlxsw_sp_acl_atcam *atcam);
235174c0adbSIdo Schimmel void mlxsw_sp_acl_atcam_fini(struct mlxsw_sp *mlxsw_sp,
236174c0adbSIdo Schimmel struct mlxsw_sp_acl_atcam *atcam);
23729a2102aSJiri Pirko void *
23829a2102aSJiri Pirko mlxsw_sp_acl_atcam_rehash_hints_get(struct mlxsw_sp_acl_atcam_region *aregion);
23929a2102aSJiri Pirko void mlxsw_sp_acl_atcam_rehash_hints_put(void *hints_priv);
2409912e6b8SJiri Pirko
241c22291f7SJiri Pirko struct mlxsw_sp_acl_erp_delta;
242c22291f7SJiri Pirko
243c22291f7SJiri Pirko u16 mlxsw_sp_acl_erp_delta_start(const struct mlxsw_sp_acl_erp_delta *delta);
244c22291f7SJiri Pirko u8 mlxsw_sp_acl_erp_delta_mask(const struct mlxsw_sp_acl_erp_delta *delta);
245c22291f7SJiri Pirko u8 mlxsw_sp_acl_erp_delta_value(const struct mlxsw_sp_acl_erp_delta *delta,
246c22291f7SJiri Pirko const char *enc_key);
247c22291f7SJiri Pirko void mlxsw_sp_acl_erp_delta_clear(const struct mlxsw_sp_acl_erp_delta *delta,
248c22291f7SJiri Pirko const char *enc_key);
249c22291f7SJiri Pirko
250c71abd7dSJiri Pirko struct mlxsw_sp_acl_erp_mask;
251f465261aSIdo Schimmel
252c71abd7dSJiri Pirko bool
253c71abd7dSJiri Pirko mlxsw_sp_acl_erp_mask_is_ctcam(const struct mlxsw_sp_acl_erp_mask *erp_mask);
254c71abd7dSJiri Pirko u8 mlxsw_sp_acl_erp_mask_erp_id(const struct mlxsw_sp_acl_erp_mask *erp_mask);
255c22291f7SJiri Pirko const struct mlxsw_sp_acl_erp_delta *
256c22291f7SJiri Pirko mlxsw_sp_acl_erp_delta(const struct mlxsw_sp_acl_erp_mask *erp_mask);
257c71abd7dSJiri Pirko struct mlxsw_sp_acl_erp_mask *
258c71abd7dSJiri Pirko mlxsw_sp_acl_erp_mask_get(struct mlxsw_sp_acl_atcam_region *aregion,
259b17b113eSIdo Schimmel const char *mask, bool ctcam);
260c71abd7dSJiri Pirko void mlxsw_sp_acl_erp_mask_put(struct mlxsw_sp_acl_atcam_region *aregion,
261c71abd7dSJiri Pirko struct mlxsw_sp_acl_erp_mask *erp_mask);
262f5a2852eSNir Dotan int mlxsw_sp_acl_erp_bf_insert(struct mlxsw_sp *mlxsw_sp,
263f5a2852eSNir Dotan struct mlxsw_sp_acl_atcam_region *aregion,
264f5a2852eSNir Dotan struct mlxsw_sp_acl_erp_mask *erp_mask,
265f5a2852eSNir Dotan struct mlxsw_sp_acl_atcam_entry *aentry);
266f5a2852eSNir Dotan void mlxsw_sp_acl_erp_bf_remove(struct mlxsw_sp *mlxsw_sp,
267f5a2852eSNir Dotan struct mlxsw_sp_acl_atcam_region *aregion,
268f5a2852eSNir Dotan struct mlxsw_sp_acl_erp_mask *erp_mask,
269f5a2852eSNir Dotan struct mlxsw_sp_acl_atcam_entry *aentry);
27029a2102aSJiri Pirko void *
27129a2102aSJiri Pirko mlxsw_sp_acl_erp_rehash_hints_get(struct mlxsw_sp_acl_atcam_region *aregion);
27229a2102aSJiri Pirko void mlxsw_sp_acl_erp_rehash_hints_put(void *hints_priv);
273a339bf8aSJiri Pirko int mlxsw_sp_acl_erp_region_init(struct mlxsw_sp_acl_atcam_region *aregion,
274a339bf8aSJiri Pirko void *hints_priv);
275f465261aSIdo Schimmel void mlxsw_sp_acl_erp_region_fini(struct mlxsw_sp_acl_atcam_region *aregion);
276f465261aSIdo Schimmel int mlxsw_sp_acl_erps_init(struct mlxsw_sp *mlxsw_sp,
277f465261aSIdo Schimmel struct mlxsw_sp_acl_atcam *atcam);
278f465261aSIdo Schimmel void mlxsw_sp_acl_erps_fini(struct mlxsw_sp *mlxsw_sp,
279f465261aSIdo Schimmel struct mlxsw_sp_acl_atcam *atcam);
280f465261aSIdo Schimmel
2810487cfbaSNir Dotan struct mlxsw_sp_acl_bf;
2820487cfbaSNir Dotan
28358723d2fSAmit Cohen struct mlxsw_sp_acl_bf_ops {
28458723d2fSAmit Cohen unsigned int (*index_get)(struct mlxsw_sp_acl_bf *bf,
28558723d2fSAmit Cohen struct mlxsw_sp_acl_atcam_region *aregion,
28658723d2fSAmit Cohen struct mlxsw_sp_acl_atcam_entry *aentry);
28758723d2fSAmit Cohen };
28858723d2fSAmit Cohen
2897585cacdSNir Dotan int
2907585cacdSNir Dotan mlxsw_sp_acl_bf_entry_add(struct mlxsw_sp *mlxsw_sp,
2917585cacdSNir Dotan struct mlxsw_sp_acl_bf *bf,
2927585cacdSNir Dotan struct mlxsw_sp_acl_atcam_region *aregion,
2937585cacdSNir Dotan unsigned int erp_bank,
2947585cacdSNir Dotan struct mlxsw_sp_acl_atcam_entry *aentry);
2957585cacdSNir Dotan void
2967585cacdSNir Dotan mlxsw_sp_acl_bf_entry_del(struct mlxsw_sp *mlxsw_sp,
2977585cacdSNir Dotan struct mlxsw_sp_acl_bf *bf,
2987585cacdSNir Dotan struct mlxsw_sp_acl_atcam_region *aregion,
2997585cacdSNir Dotan unsigned int erp_bank,
3007585cacdSNir Dotan struct mlxsw_sp_acl_atcam_entry *aentry);
3010487cfbaSNir Dotan struct mlxsw_sp_acl_bf *
3020487cfbaSNir Dotan mlxsw_sp_acl_bf_init(struct mlxsw_sp *mlxsw_sp, unsigned int num_erp_banks);
3030487cfbaSNir Dotan void mlxsw_sp_acl_bf_fini(struct mlxsw_sp_acl_bf *bf);
3040487cfbaSNir Dotan
30564eccd00SJiri Pirko #endif
306