xref: /linux/drivers/net/ethernet/microchip/vcap/vcap_api_client.h (revision 621cde16e49b3ecf7d59a8106a20aaebfb4a59a9)
1c9da1ac1SSteen Hegelund /* SPDX-License-Identifier: GPL-2.0+ */
2c9da1ac1SSteen Hegelund /* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries.
3c9da1ac1SSteen Hegelund  * Microchip VCAP API
4c9da1ac1SSteen Hegelund  */
5c9da1ac1SSteen Hegelund 
6c9da1ac1SSteen Hegelund #ifndef __VCAP_API_CLIENT__
7c9da1ac1SSteen Hegelund #define __VCAP_API_CLIENT__
8c9da1ac1SSteen Hegelund 
9c9da1ac1SSteen Hegelund #include <linux/types.h>
10c9da1ac1SSteen Hegelund #include <linux/list.h>
11c9da1ac1SSteen Hegelund #include <linux/netdevice.h>
12c9da1ac1SSteen Hegelund #include <net/flow_offload.h>
13c9da1ac1SSteen Hegelund 
14c9da1ac1SSteen Hegelund #include "vcap_api.h"
15c9da1ac1SSteen Hegelund 
16c9da1ac1SSteen Hegelund /* Client supplied VCAP rule key control part */
17c9da1ac1SSteen Hegelund struct vcap_client_keyfield_ctrl {
18c9da1ac1SSteen Hegelund 	struct list_head list;  /* For insertion into a rule */
19c9da1ac1SSteen Hegelund 	enum vcap_key_field key;
20c9da1ac1SSteen Hegelund 	enum vcap_field_type type;
21c9da1ac1SSteen Hegelund };
22c9da1ac1SSteen Hegelund 
23c9da1ac1SSteen Hegelund struct vcap_u1_key {
24c9da1ac1SSteen Hegelund 	u8 value;
25c9da1ac1SSteen Hegelund 	u8 mask;
26c9da1ac1SSteen Hegelund };
27c9da1ac1SSteen Hegelund 
28c9da1ac1SSteen Hegelund struct vcap_u32_key {
29c9da1ac1SSteen Hegelund 	u32 value;
30c9da1ac1SSteen Hegelund 	u32 mask;
31c9da1ac1SSteen Hegelund };
32c9da1ac1SSteen Hegelund 
33c9da1ac1SSteen Hegelund struct vcap_u48_key {
34c9da1ac1SSteen Hegelund 	u8 value[6];
35c9da1ac1SSteen Hegelund 	u8 mask[6];
36c9da1ac1SSteen Hegelund };
37c9da1ac1SSteen Hegelund 
38c9da1ac1SSteen Hegelund struct vcap_u56_key {
39c9da1ac1SSteen Hegelund 	u8 value[7];
40c9da1ac1SSteen Hegelund 	u8 mask[7];
41c9da1ac1SSteen Hegelund };
42c9da1ac1SSteen Hegelund 
43c9da1ac1SSteen Hegelund struct vcap_u64_key {
44c9da1ac1SSteen Hegelund 	u8 value[8];
45c9da1ac1SSteen Hegelund 	u8 mask[8];
46c9da1ac1SSteen Hegelund };
47c9da1ac1SSteen Hegelund 
48c9da1ac1SSteen Hegelund struct vcap_u72_key {
49c9da1ac1SSteen Hegelund 	u8 value[9];
50c9da1ac1SSteen Hegelund 	u8 mask[9];
51c9da1ac1SSteen Hegelund };
52c9da1ac1SSteen Hegelund 
53c9da1ac1SSteen Hegelund struct vcap_u112_key {
54c9da1ac1SSteen Hegelund 	u8 value[14];
55c9da1ac1SSteen Hegelund 	u8 mask[14];
56c9da1ac1SSteen Hegelund };
57c9da1ac1SSteen Hegelund 
58c9da1ac1SSteen Hegelund struct vcap_u128_key {
59c9da1ac1SSteen Hegelund 	u8 value[16];
60c9da1ac1SSteen Hegelund 	u8 mask[16];
61c9da1ac1SSteen Hegelund };
62c9da1ac1SSteen Hegelund 
63c9da1ac1SSteen Hegelund /* Client supplied VCAP rule field data */
64c9da1ac1SSteen Hegelund struct vcap_client_keyfield_data {
65c9da1ac1SSteen Hegelund 	union {
66c9da1ac1SSteen Hegelund 		struct vcap_u1_key u1;
67c9da1ac1SSteen Hegelund 		struct vcap_u32_key u32;
68c9da1ac1SSteen Hegelund 		struct vcap_u48_key u48;
69c9da1ac1SSteen Hegelund 		struct vcap_u56_key u56;
70c9da1ac1SSteen Hegelund 		struct vcap_u64_key u64;
71c9da1ac1SSteen Hegelund 		struct vcap_u72_key u72;
72c9da1ac1SSteen Hegelund 		struct vcap_u112_key u112;
73c9da1ac1SSteen Hegelund 		struct vcap_u128_key u128;
74c9da1ac1SSteen Hegelund 	};
75c9da1ac1SSteen Hegelund };
76c9da1ac1SSteen Hegelund 
77c9da1ac1SSteen Hegelund /* Client supplied VCAP rule key (value, mask) */
78c9da1ac1SSteen Hegelund struct vcap_client_keyfield {
79c9da1ac1SSteen Hegelund 	struct vcap_client_keyfield_ctrl ctrl;
80c9da1ac1SSteen Hegelund 	struct vcap_client_keyfield_data data;
81c9da1ac1SSteen Hegelund };
82c9da1ac1SSteen Hegelund 
83c9da1ac1SSteen Hegelund /* Client supplied VCAP rule action control part */
84c9da1ac1SSteen Hegelund struct vcap_client_actionfield_ctrl {
85c9da1ac1SSteen Hegelund 	struct list_head list;  /* For insertion into a rule */
86c9da1ac1SSteen Hegelund 	enum vcap_action_field action;
87c9da1ac1SSteen Hegelund 	enum vcap_field_type type;
88c9da1ac1SSteen Hegelund };
89c9da1ac1SSteen Hegelund 
90c9da1ac1SSteen Hegelund struct vcap_u1_action {
91c9da1ac1SSteen Hegelund 	u8 value;
92c9da1ac1SSteen Hegelund };
93c9da1ac1SSteen Hegelund 
94c9da1ac1SSteen Hegelund struct vcap_u32_action {
95c9da1ac1SSteen Hegelund 	u32 value;
96c9da1ac1SSteen Hegelund };
97c9da1ac1SSteen Hegelund 
98c9da1ac1SSteen Hegelund struct vcap_u48_action {
99c9da1ac1SSteen Hegelund 	u8 value[6];
100c9da1ac1SSteen Hegelund };
101c9da1ac1SSteen Hegelund 
102c9da1ac1SSteen Hegelund struct vcap_u56_action {
103c9da1ac1SSteen Hegelund 	u8 value[7];
104c9da1ac1SSteen Hegelund };
105c9da1ac1SSteen Hegelund 
106c9da1ac1SSteen Hegelund struct vcap_u64_action {
107c9da1ac1SSteen Hegelund 	u8 value[8];
108c9da1ac1SSteen Hegelund };
109c9da1ac1SSteen Hegelund 
110c9da1ac1SSteen Hegelund struct vcap_u72_action {
111c9da1ac1SSteen Hegelund 	u8 value[9];
112c9da1ac1SSteen Hegelund };
113c9da1ac1SSteen Hegelund 
114c9da1ac1SSteen Hegelund struct vcap_u112_action {
115c9da1ac1SSteen Hegelund 	u8 value[14];
116c9da1ac1SSteen Hegelund };
117c9da1ac1SSteen Hegelund 
118c9da1ac1SSteen Hegelund struct vcap_u128_action {
119c9da1ac1SSteen Hegelund 	u8 value[16];
120c9da1ac1SSteen Hegelund };
121c9da1ac1SSteen Hegelund 
122c9da1ac1SSteen Hegelund struct vcap_client_actionfield_data {
123c9da1ac1SSteen Hegelund 	union {
124c9da1ac1SSteen Hegelund 		struct vcap_u1_action u1;
125c9da1ac1SSteen Hegelund 		struct vcap_u32_action u32;
126c9da1ac1SSteen Hegelund 		struct vcap_u48_action u48;
127c9da1ac1SSteen Hegelund 		struct vcap_u56_action u56;
128c9da1ac1SSteen Hegelund 		struct vcap_u64_action u64;
129c9da1ac1SSteen Hegelund 		struct vcap_u72_action u72;
130c9da1ac1SSteen Hegelund 		struct vcap_u112_action u112;
131c9da1ac1SSteen Hegelund 		struct vcap_u128_action u128;
132c9da1ac1SSteen Hegelund 	};
133c9da1ac1SSteen Hegelund };
134c9da1ac1SSteen Hegelund 
135c9da1ac1SSteen Hegelund struct vcap_client_actionfield {
136c9da1ac1SSteen Hegelund 	struct vcap_client_actionfield_ctrl ctrl;
137c9da1ac1SSteen Hegelund 	struct vcap_client_actionfield_data data;
138c9da1ac1SSteen Hegelund };
139c9da1ac1SSteen Hegelund 
140c9da1ac1SSteen Hegelund enum vcap_bit {
141c9da1ac1SSteen Hegelund 	VCAP_BIT_ANY,
142c9da1ac1SSteen Hegelund 	VCAP_BIT_0,
143c9da1ac1SSteen Hegelund 	VCAP_BIT_1
144c9da1ac1SSteen Hegelund };
145c9da1ac1SSteen Hegelund 
146f13230a4SSteen Hegelund struct vcap_counter {
147f13230a4SSteen Hegelund 	u32 value;
148f13230a4SSteen Hegelund 	bool sticky;
149f13230a4SSteen Hegelund };
150f13230a4SSteen Hegelund 
151cfd9e7b7SSteen Hegelund /* Enable/Disable the VCAP instance lookups */
15267456717SSteen Hegelund int vcap_enable_lookups(struct vcap_control *vctrl, struct net_device *ndev,
153cfd9e7b7SSteen Hegelund 			int from_cid, int to_cid, unsigned long cookie,
154cfd9e7b7SSteen Hegelund 			bool enable);
15567456717SSteen Hegelund 
156c9da1ac1SSteen Hegelund /* VCAP rule operations */
157c9da1ac1SSteen Hegelund /* Allocate a rule and fill in the basic information */
158c9da1ac1SSteen Hegelund struct vcap_rule *vcap_alloc_rule(struct vcap_control *vctrl,
159c9da1ac1SSteen Hegelund 				  struct net_device *ndev,
160c9da1ac1SSteen Hegelund 				  int vcap_chain_id,
161c9da1ac1SSteen Hegelund 				  enum vcap_user user,
162c9da1ac1SSteen Hegelund 				  u16 priority,
163c9da1ac1SSteen Hegelund 				  u32 id);
164c9da1ac1SSteen Hegelund /* Free mem of a rule owned by client */
165c9da1ac1SSteen Hegelund void vcap_free_rule(struct vcap_rule *rule);
166c9da1ac1SSteen Hegelund /* Validate a rule before adding it to the VCAP */
167c9da1ac1SSteen Hegelund int vcap_val_rule(struct vcap_rule *rule, u16 l3_proto);
168c9da1ac1SSteen Hegelund /* Add rule to a VCAP instance */
169c9da1ac1SSteen Hegelund int vcap_add_rule(struct vcap_rule *rule);
170c9da1ac1SSteen Hegelund /* Delete rule in a VCAP instance */
171c9da1ac1SSteen Hegelund int vcap_del_rule(struct vcap_control *vctrl, struct net_device *ndev, u32 id);
172465a38a2SSteen Hegelund /* Make a full copy of an existing rule with a new rule id */
173465a38a2SSteen Hegelund struct vcap_rule *vcap_copy_rule(struct vcap_rule *rule);
174610c32b2SHoratiu Vultur /* Get rule from a VCAP instance */
175610c32b2SHoratiu Vultur struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id);
1762662b3f9SHoratiu Vultur /* Update existing rule */
1772662b3f9SHoratiu Vultur int vcap_mod_rule(struct vcap_rule *rule);
178c9da1ac1SSteen Hegelund 
179c9da1ac1SSteen Hegelund /* Update the keyset for the rule */
180c9da1ac1SSteen Hegelund int vcap_set_rule_set_keyset(struct vcap_rule *rule,
181c9da1ac1SSteen Hegelund 			     enum vcap_keyfield_set keyset);
182c9da1ac1SSteen Hegelund /* Update the actionset for the rule */
183c9da1ac1SSteen Hegelund int vcap_set_rule_set_actionset(struct vcap_rule *rule,
184c9da1ac1SSteen Hegelund 				enum vcap_actionfield_set actionset);
185f13230a4SSteen Hegelund /* Set a rule counter id (for certain VCAPs only) */
186f13230a4SSteen Hegelund void vcap_rule_set_counter_id(struct vcap_rule *rule, u32 counter_id);
187c9da1ac1SSteen Hegelund 
188c9da1ac1SSteen Hegelund /* VCAP rule field operations */
189c9da1ac1SSteen Hegelund int vcap_rule_add_key_bit(struct vcap_rule *rule, enum vcap_key_field key,
190c9da1ac1SSteen Hegelund 			  enum vcap_bit val);
191c9da1ac1SSteen Hegelund int vcap_rule_add_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
192c9da1ac1SSteen Hegelund 			  u32 value, u32 mask);
193c9da1ac1SSteen Hegelund int vcap_rule_add_key_u48(struct vcap_rule *rule, enum vcap_key_field key,
194c9da1ac1SSteen Hegelund 			  struct vcap_u48_key *fieldval);
19546be056eSSteen Hegelund int vcap_rule_add_key_u72(struct vcap_rule *rule, enum vcap_key_field key,
19646be056eSSteen Hegelund 			  struct vcap_u72_key *fieldval);
197d6c2964dSSteen Hegelund int vcap_rule_add_key_u128(struct vcap_rule *rule, enum vcap_key_field key,
198d6c2964dSSteen Hegelund 			   struct vcap_u128_key *fieldval);
199c9da1ac1SSteen Hegelund int vcap_rule_add_action_bit(struct vcap_rule *rule,
200c9da1ac1SSteen Hegelund 			     enum vcap_action_field action, enum vcap_bit val);
201c9da1ac1SSteen Hegelund int vcap_rule_add_action_u32(struct vcap_rule *rule,
202c9da1ac1SSteen Hegelund 			     enum vcap_action_field action, u32 value);
20348ba00daSDaniel Machon int vcap_rule_add_action_u72(struct vcap_rule *rule, enum vcap_action_field action,
20448ba00daSDaniel Machon 			     struct vcap_u72_action *fieldval);
205c9da1ac1SSteen Hegelund 
206bfcb94aaSSteen Hegelund /* Get number of rules in a vcap instance lookup chain id range */
207bfcb94aaSSteen Hegelund int vcap_admin_rule_count(struct vcap_admin *admin, int cid);
208bfcb94aaSSteen Hegelund 
209f13230a4SSteen Hegelund /* VCAP rule counter operations */
21027d293ccSSteen Hegelund int vcap_get_rule_count_by_cookie(struct vcap_control *vctrl,
21127d293ccSSteen Hegelund 				  struct vcap_counter *ctr, u64 cookie);
212f13230a4SSteen Hegelund int vcap_rule_set_counter(struct vcap_rule *rule, struct vcap_counter *ctr);
213f13230a4SSteen Hegelund int vcap_rule_get_counter(struct vcap_rule *rule, struct vcap_counter *ctr);
214f13230a4SSteen Hegelund 
215c9da1ac1SSteen Hegelund /* VCAP lookup operations */
2167de1dcadSSteen Hegelund /* Convert a chain id to a VCAP lookup index */
2177de1dcadSSteen Hegelund int vcap_chain_id_to_lookup(struct vcap_admin *admin, int cur_cid);
218c9da1ac1SSteen Hegelund /* Lookup a vcap instance using chain id */
219c9da1ac1SSteen Hegelund struct vcap_admin *vcap_find_admin(struct vcap_control *vctrl, int cid);
22046be056eSSteen Hegelund /* Find information on a key field in a rule */
22146be056eSSteen Hegelund const struct vcap_field *vcap_lookup_keyfield(struct vcap_rule *rule,
22246be056eSSteen Hegelund 					      enum vcap_key_field key);
223c9da1ac1SSteen Hegelund /* Find a rule id with a provided cookie */
224c9da1ac1SSteen Hegelund int vcap_lookup_rule_by_cookie(struct vcap_control *vctrl, u64 cookie);
22588bd9ea7SSteen Hegelund /* Calculate the value used for chaining VCAP rules */
22688bd9ea7SSteen Hegelund int vcap_chain_offset(struct vcap_control *vctrl, int from_cid, int to_cid);
227392d0ab0SSteen Hegelund /* Is the next chain id in the following lookup, possible in another VCAP */
228392d0ab0SSteen Hegelund bool vcap_is_next_lookup(struct vcap_control *vctrl, int cur_cid, int next_cid);
229784c3067SSteen Hegelund /* Is this chain id the last lookup of all VCAPs */
230e7e3f514SSteen Hegelund bool vcap_is_last_chain(struct vcap_control *vctrl, int cid, bool ingress);
231465a38a2SSteen Hegelund /* Match a list of keys against the keysets available in a vcap type */
232465a38a2SSteen Hegelund bool vcap_rule_find_keysets(struct vcap_rule *rule,
233465a38a2SSteen Hegelund 			    struct vcap_keyset_list *matches);
234465a38a2SSteen Hegelund /* Return the keyset information for the keyset */
235465a38a2SSteen Hegelund const struct vcap_set *vcap_keyfieldset(struct vcap_control *vctrl,
236465a38a2SSteen Hegelund 					enum vcap_type vt,
237465a38a2SSteen Hegelund 					enum vcap_keyfield_set keyset);
238c9da1ac1SSteen Hegelund /* Copy to host byte order */
239c9da1ac1SSteen Hegelund void vcap_netbytes_copy(u8 *dst, u8 *src, int count);
240c9da1ac1SSteen Hegelund 
241*d896a374SSimon Horman /* Convert validation error code into tc extack error message */
242c9da1ac1SSteen Hegelund void vcap_set_tc_exterr(struct flow_cls_offload *fco, struct vcap_rule *vrule);
243c9da1ac1SSteen Hegelund 
2448e10490bSSteen Hegelund /* Cleanup a VCAP instance */
2458e10490bSSteen Hegelund int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin);
2468e10490bSSteen Hegelund 
247abc4010dSSteen Hegelund /* Add a keyset to a keyset list */
248abc4010dSSteen Hegelund bool vcap_keyset_list_add(struct vcap_keyset_list *keysetlist,
249abc4010dSSteen Hegelund 			  enum vcap_keyfield_set keyset);
250465a38a2SSteen Hegelund /* Drop keys in a keylist and any keys that are not supported by the keyset */
251465a38a2SSteen Hegelund int vcap_filter_rule_keys(struct vcap_rule *rule,
252465a38a2SSteen Hegelund 			  enum vcap_key_field keylist[], int length,
253465a38a2SSteen Hegelund 			  bool drop_unsupported);
254abc4010dSSteen Hegelund 
255abc4010dSSteen Hegelund /* map keyset id to a string with the keyset name */
256abc4010dSSteen Hegelund const char *vcap_keyset_name(struct vcap_control *vctrl,
257abc4010dSSteen Hegelund 			     enum vcap_keyfield_set keyset);
258abc4010dSSteen Hegelund /* map key field id to a string with the key name */
259abc4010dSSteen Hegelund const char *vcap_keyfield_name(struct vcap_control *vctrl,
260abc4010dSSteen Hegelund 			       enum vcap_key_field key);
261abc4010dSSteen Hegelund 
262465a38a2SSteen Hegelund /* Modify a 32 bit key field with value and mask in the rule */
263465a38a2SSteen Hegelund int vcap_rule_mod_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
264465a38a2SSteen Hegelund 			  u32 value, u32 mask);
265465a38a2SSteen Hegelund /* Modify a 32 bit action field with value in the rule */
266465a38a2SSteen Hegelund int vcap_rule_mod_action_u32(struct vcap_rule *rule,
267465a38a2SSteen Hegelund 			     enum vcap_action_field action,
268465a38a2SSteen Hegelund 			     u32 value);
269465a38a2SSteen Hegelund 
2706009b61fSHoratiu Vultur /* Get a 32 bit key field value and mask from the rule */
2716009b61fSHoratiu Vultur int vcap_rule_get_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
2726009b61fSHoratiu Vultur 			  u32 *value, u32 *mask);
2736ebf182bSDaniel Machon 
274bfcb94aaSSteen Hegelund /* Remove a key field with value and mask in the rule */
275bfcb94aaSSteen Hegelund int vcap_rule_rem_key(struct vcap_rule *rule, enum vcap_key_field key);
276bfcb94aaSSteen Hegelund 
277bfcb94aaSSteen Hegelund /* Select the keyset from the list that results in the smallest rule size */
278bfcb94aaSSteen Hegelund enum vcap_keyfield_set
279bfcb94aaSSteen Hegelund vcap_select_min_rule_keyset(struct vcap_control *vctrl, enum vcap_type vtype,
280bfcb94aaSSteen Hegelund 			    struct vcap_keyset_list *kslist);
281bfcb94aaSSteen Hegelund 
2826ebf182bSDaniel Machon struct vcap_client_actionfield *
2836ebf182bSDaniel Machon vcap_find_actionfield(struct vcap_rule *rule, enum vcap_action_field act);
284c9da1ac1SSteen Hegelund #endif /* __VCAP_API_CLIENT__ */
285