xref: /linux/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h (revision c771600c6af14749609b49565ffb4cac2959710d)
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