xref: /openbmc/linux/drivers/net/ethernet/microchip/vcap/vcap_api.c (revision 72ed5d5624af384eaf74d84915810d54486a75e2)
1 // SPDX-License-Identifier: GPL-2.0+
2 /* Microchip VCAP API
3  *
4  * Copyright (c) 2022 Microchip Technology Inc. and its subsidiaries.
5  */
6 
7 #include <linux/types.h>
8 
9 #include "vcap_api_private.h"
10 
11 static int keyfield_size_table[] = {
12 	[VCAP_FIELD_BIT]  = sizeof(struct vcap_u1_key),
13 	[VCAP_FIELD_U32]  = sizeof(struct vcap_u32_key),
14 	[VCAP_FIELD_U48]  = sizeof(struct vcap_u48_key),
15 	[VCAP_FIELD_U56]  = sizeof(struct vcap_u56_key),
16 	[VCAP_FIELD_U64]  = sizeof(struct vcap_u64_key),
17 	[VCAP_FIELD_U72]  = sizeof(struct vcap_u72_key),
18 	[VCAP_FIELD_U112] = sizeof(struct vcap_u112_key),
19 	[VCAP_FIELD_U128] = sizeof(struct vcap_u128_key),
20 };
21 
22 static int actionfield_size_table[] = {
23 	[VCAP_FIELD_BIT]  = sizeof(struct vcap_u1_action),
24 	[VCAP_FIELD_U32]  = sizeof(struct vcap_u32_action),
25 	[VCAP_FIELD_U48]  = sizeof(struct vcap_u48_action),
26 	[VCAP_FIELD_U56]  = sizeof(struct vcap_u56_action),
27 	[VCAP_FIELD_U64]  = sizeof(struct vcap_u64_action),
28 	[VCAP_FIELD_U72]  = sizeof(struct vcap_u72_action),
29 	[VCAP_FIELD_U112] = sizeof(struct vcap_u112_action),
30 	[VCAP_FIELD_U128] = sizeof(struct vcap_u128_action),
31 };
32 
33 /* Moving a rule in the VCAP address space */
34 struct vcap_rule_move {
35 	int addr; /* address to move */
36 	int offset; /* change in address */
37 	int count; /* blocksize of addresses to move */
38 };
39 
40 /* Stores the filter cookie and chain id that enabled the port */
41 struct vcap_enabled_port {
42 	struct list_head list; /* for insertion in enabled ports list */
43 	struct net_device *ndev;  /* the enabled port */
44 	unsigned long cookie; /* filter that enabled the port */
45 	int src_cid; /* source chain id */
46 	int dst_cid; /* destination chain id */
47 };
48 
49 void vcap_iter_set(struct vcap_stream_iter *itr, int sw_width,
50 		   const struct vcap_typegroup *tg, u32 offset)
51 {
52 	memset(itr, 0, sizeof(*itr));
53 	itr->offset = offset;
54 	itr->sw_width = sw_width;
55 	itr->regs_per_sw = DIV_ROUND_UP(sw_width, 32);
56 	itr->tg = tg;
57 }
58 
59 static void vcap_iter_skip_tg(struct vcap_stream_iter *itr)
60 {
61 	/* Compensate the field offset for preceding typegroups.
62 	 * A typegroup table ends with an all-zero terminator.
63 	 */
64 	while (itr->tg->width && itr->offset >= itr->tg->offset) {
65 		itr->offset += itr->tg->width;
66 		itr->tg++; /* next typegroup */
67 	}
68 }
69 
70 void vcap_iter_update(struct vcap_stream_iter *itr)
71 {
72 	int sw_idx, sw_bitpos;
73 
74 	/* Calculate the subword index and bitposition for current bit */
75 	sw_idx = itr->offset / itr->sw_width;
76 	sw_bitpos = itr->offset % itr->sw_width;
77 	/* Calculate the register index and bitposition for current bit */
78 	itr->reg_idx = (sw_idx * itr->regs_per_sw) + (sw_bitpos / 32);
79 	itr->reg_bitpos = sw_bitpos % 32;
80 }
81 
82 void vcap_iter_init(struct vcap_stream_iter *itr, int sw_width,
83 		    const struct vcap_typegroup *tg, u32 offset)
84 {
85 	vcap_iter_set(itr, sw_width, tg, offset);
86 	vcap_iter_skip_tg(itr);
87 	vcap_iter_update(itr);
88 }
89 
90 void vcap_iter_next(struct vcap_stream_iter *itr)
91 {
92 	itr->offset++;
93 	vcap_iter_skip_tg(itr);
94 	vcap_iter_update(itr);
95 }
96 
97 static void vcap_set_bit(u32 *stream, struct vcap_stream_iter *itr, bool value)
98 {
99 	u32 mask = BIT(itr->reg_bitpos);
100 	u32 *p = &stream[itr->reg_idx];
101 
102 	if (value)
103 		*p |= mask;
104 	else
105 		*p &= ~mask;
106 }
107 
108 static void vcap_encode_bit(u32 *stream, struct vcap_stream_iter *itr, bool val)
109 {
110 	/* When intersected by a type group field, stream the type group bits
111 	 * before continuing with the value bit
112 	 */
113 	while (itr->tg->width &&
114 	       itr->offset >= itr->tg->offset &&
115 	       itr->offset < itr->tg->offset + itr->tg->width) {
116 		int tg_bitpos = itr->tg->offset - itr->offset;
117 
118 		vcap_set_bit(stream, itr, (itr->tg->value >> tg_bitpos) & 0x1);
119 		itr->offset++;
120 		vcap_iter_update(itr);
121 	}
122 	vcap_set_bit(stream, itr, val);
123 }
124 
125 static void vcap_encode_field(u32 *stream, struct vcap_stream_iter *itr,
126 			      int width, const u8 *value)
127 {
128 	int idx;
129 
130 	/* Loop over the field value bits and add the value bits one by one to
131 	 * the output stream.
132 	 */
133 	for (idx = 0; idx < width; idx++) {
134 		u8 bidx = idx & GENMASK(2, 0);
135 
136 		/* Encode one field value bit */
137 		vcap_encode_bit(stream, itr, (value[idx / 8] >> bidx) & 0x1);
138 		vcap_iter_next(itr);
139 	}
140 }
141 
142 static void vcap_encode_typegroups(u32 *stream, int sw_width,
143 				   const struct vcap_typegroup *tg,
144 				   bool mask)
145 {
146 	struct vcap_stream_iter iter;
147 	int idx;
148 
149 	/* Mask bits must be set to zeros (inverted later when writing to the
150 	 * mask cache register), so that the mask typegroup bits consist of
151 	 * match-1 or match-0, or both
152 	 */
153 	vcap_iter_set(&iter, sw_width, tg, 0);
154 	while (iter.tg->width) {
155 		/* Set position to current typegroup bit */
156 		iter.offset = iter.tg->offset;
157 		vcap_iter_update(&iter);
158 		for (idx = 0; idx < iter.tg->width; idx++) {
159 			/* Iterate over current typegroup bits. Mask typegroup
160 			 * bits are always set
161 			 */
162 			if (mask)
163 				vcap_set_bit(stream, &iter, 0x1);
164 			else
165 				vcap_set_bit(stream, &iter,
166 					     (iter.tg->value >> idx) & 0x1);
167 			iter.offset++;
168 			vcap_iter_update(&iter);
169 		}
170 		iter.tg++; /* next typegroup */
171 	}
172 }
173 
174 static bool vcap_bitarray_zero(int width, u8 *value)
175 {
176 	int bytes = DIV_ROUND_UP(width, BITS_PER_BYTE);
177 	u8 total = 0, bmask = 0xff;
178 	int rwidth = width;
179 	int idx;
180 
181 	for (idx = 0; idx < bytes; ++idx, rwidth -= BITS_PER_BYTE) {
182 		if (rwidth && rwidth < BITS_PER_BYTE)
183 			bmask = (1 << rwidth) - 1;
184 		total += value[idx] & bmask;
185 	}
186 	return total == 0;
187 }
188 
189 static bool vcap_get_bit(u32 *stream, struct vcap_stream_iter *itr)
190 {
191 	u32 mask = BIT(itr->reg_bitpos);
192 	u32 *p = &stream[itr->reg_idx];
193 
194 	return !!(*p & mask);
195 }
196 
197 static void vcap_decode_field(u32 *stream, struct vcap_stream_iter *itr,
198 			      int width, u8 *value)
199 {
200 	int idx;
201 
202 	/* Loop over the field value bits and get the field bits and
203 	 * set them in the output value byte array
204 	 */
205 	for (idx = 0; idx < width; idx++) {
206 		u8 bidx = idx & 0x7;
207 
208 		/* Decode one field value bit */
209 		if (vcap_get_bit(stream, itr))
210 			*value |= 1 << bidx;
211 		vcap_iter_next(itr);
212 		if (bidx == 7)
213 			value++;
214 	}
215 }
216 
217 /* Verify that the type id in the stream matches the type id of the keyset */
218 static bool vcap_verify_keystream_keyset(struct vcap_control *vctrl,
219 					 enum vcap_type vt,
220 					 u32 *keystream,
221 					 u32 *mskstream,
222 					 enum vcap_keyfield_set keyset)
223 {
224 	const struct vcap_info *vcap = &vctrl->vcaps[vt];
225 	const struct vcap_field *typefld;
226 	const struct vcap_typegroup *tgt;
227 	const struct vcap_field *fields;
228 	struct vcap_stream_iter iter;
229 	const struct vcap_set *info;
230 	u32 value = 0;
231 	u32 mask = 0;
232 
233 	if (vcap_keyfield_count(vctrl, vt, keyset) == 0)
234 		return false;
235 
236 	info = vcap_keyfieldset(vctrl, vt, keyset);
237 	/* Check that the keyset is valid */
238 	if (!info)
239 		return false;
240 
241 	/* a type_id of value -1 means that there is no type field */
242 	if (info->type_id == (u8)-1)
243 		return true;
244 
245 	/* Get a valid typegroup for the specific keyset */
246 	tgt = vcap_keyfield_typegroup(vctrl, vt, keyset);
247 	if (!tgt)
248 		return false;
249 
250 	fields = vcap_keyfields(vctrl, vt, keyset);
251 	if (!fields)
252 		return false;
253 
254 	typefld = &fields[VCAP_KF_TYPE];
255 	vcap_iter_init(&iter, vcap->sw_width, tgt, typefld->offset);
256 	vcap_decode_field(mskstream, &iter, typefld->width, (u8 *)&mask);
257 	/* no type info if there are no mask bits */
258 	if (vcap_bitarray_zero(typefld->width, (u8 *)&mask))
259 		return false;
260 
261 	/* Get the value of the type field in the stream and compare to the
262 	 * one define in the vcap keyset
263 	 */
264 	vcap_iter_init(&iter, vcap->sw_width, tgt, typefld->offset);
265 	vcap_decode_field(keystream, &iter, typefld->width, (u8 *)&value);
266 
267 	return (value & mask) == (info->type_id & mask);
268 }
269 
270 /* Verify that the typegroup bits have the correct values */
271 static int vcap_verify_typegroups(u32 *stream, int sw_width,
272 				  const struct vcap_typegroup *tgt, bool mask,
273 				  int sw_max)
274 {
275 	struct vcap_stream_iter iter;
276 	int sw_cnt, idx;
277 
278 	vcap_iter_set(&iter, sw_width, tgt, 0);
279 	sw_cnt = 0;
280 	while (iter.tg->width) {
281 		u32 value = 0;
282 		u32 tg_value = iter.tg->value;
283 
284 		if (mask)
285 			tg_value = (1 << iter.tg->width) - 1;
286 		/* Set position to current typegroup bit */
287 		iter.offset = iter.tg->offset;
288 		vcap_iter_update(&iter);
289 		for (idx = 0; idx < iter.tg->width; idx++) {
290 			/* Decode one typegroup bit */
291 			if (vcap_get_bit(stream, &iter))
292 				value |= 1 << idx;
293 			iter.offset++;
294 			vcap_iter_update(&iter);
295 		}
296 		if (value != tg_value)
297 			return -EINVAL;
298 		iter.tg++; /* next typegroup */
299 		sw_cnt++;
300 		/* Stop checking more typegroups */
301 		if (sw_max && sw_cnt >= sw_max)
302 			break;
303 	}
304 	return 0;
305 }
306 
307 /* Find the subword width of the key typegroup that matches the stream data */
308 static int vcap_find_keystream_typegroup_sw(struct vcap_control *vctrl,
309 					    enum vcap_type vt, u32 *stream,
310 					    bool mask, int sw_max)
311 {
312 	const struct vcap_typegroup **tgt;
313 	int sw_idx, res;
314 
315 	tgt = vctrl->vcaps[vt].keyfield_set_typegroups;
316 	/* Try the longest subword match first */
317 	for (sw_idx = vctrl->vcaps[vt].sw_count; sw_idx >= 0; sw_idx--) {
318 		if (!tgt[sw_idx])
319 			continue;
320 
321 		res = vcap_verify_typegroups(stream, vctrl->vcaps[vt].sw_width,
322 					     tgt[sw_idx], mask, sw_max);
323 		if (res == 0)
324 			return sw_idx;
325 	}
326 	return -EINVAL;
327 }
328 
329 /* Verify that the typegroup information, subword count, keyset and type id
330  * are in sync and correct, return the list of matchin keysets
331  */
332 int
333 vcap_find_keystream_keysets(struct vcap_control *vctrl,
334 			    enum vcap_type vt,
335 			    u32 *keystream,
336 			    u32 *mskstream,
337 			    bool mask, int sw_max,
338 			    struct vcap_keyset_list *kslist)
339 {
340 	const struct vcap_set *keyfield_set;
341 	int sw_count, idx;
342 
343 	sw_count = vcap_find_keystream_typegroup_sw(vctrl, vt, keystream, mask,
344 						    sw_max);
345 	if (sw_count < 0)
346 		return sw_count;
347 
348 	keyfield_set = vctrl->vcaps[vt].keyfield_set;
349 	for (idx = 0; idx < vctrl->vcaps[vt].keyfield_set_size; ++idx) {
350 		if (keyfield_set[idx].sw_per_item != sw_count)
351 			continue;
352 
353 		if (vcap_verify_keystream_keyset(vctrl, vt, keystream,
354 						 mskstream, idx))
355 			vcap_keyset_list_add(kslist, idx);
356 	}
357 	if (kslist->cnt > 0)
358 		return 0;
359 	return -EINVAL;
360 }
361 EXPORT_SYMBOL_GPL(vcap_find_keystream_keysets);
362 
363 /* Read key data from a VCAP address and discover if there are any rule keysets
364  * here
365  */
366 int vcap_addr_keysets(struct vcap_control *vctrl,
367 		      struct net_device *ndev,
368 		      struct vcap_admin *admin,
369 		      int addr,
370 		      struct vcap_keyset_list *kslist)
371 {
372 	enum vcap_type vt = admin->vtype;
373 	int keyset_sw_regs, idx;
374 	u32 key = 0, mask = 0;
375 
376 	/* Read the cache at the specified address */
377 	keyset_sw_regs = DIV_ROUND_UP(vctrl->vcaps[vt].sw_width, 32);
378 	vctrl->ops->update(ndev, admin, VCAP_CMD_READ, VCAP_SEL_ALL, addr);
379 	vctrl->ops->cache_read(ndev, admin, VCAP_SEL_ENTRY, 0,
380 			       keyset_sw_regs);
381 	/* Skip uninitialized key/mask entries */
382 	for (idx = 0; idx < keyset_sw_regs; ++idx) {
383 		key |= ~admin->cache.keystream[idx];
384 		mask |= admin->cache.maskstream[idx];
385 	}
386 	if (key == 0 && mask == 0)
387 		return -EINVAL;
388 	/* Decode and locate the keysets */
389 	return vcap_find_keystream_keysets(vctrl, vt, admin->cache.keystream,
390 					   admin->cache.maskstream, false, 0,
391 					   kslist);
392 }
393 EXPORT_SYMBOL_GPL(vcap_addr_keysets);
394 
395 /* Return the list of keyfields for the keyset */
396 const struct vcap_field *vcap_keyfields(struct vcap_control *vctrl,
397 					enum vcap_type vt,
398 					enum vcap_keyfield_set keyset)
399 {
400 	/* Check that the keyset exists in the vcap keyset list */
401 	if (keyset >= vctrl->vcaps[vt].keyfield_set_size)
402 		return NULL;
403 	return vctrl->vcaps[vt].keyfield_set_map[keyset];
404 }
405 
406 /* Return the keyset information for the keyset */
407 const struct vcap_set *vcap_keyfieldset(struct vcap_control *vctrl,
408 					enum vcap_type vt,
409 					enum vcap_keyfield_set keyset)
410 {
411 	const struct vcap_set *kset;
412 
413 	/* Check that the keyset exists in the vcap keyset list */
414 	if (keyset >= vctrl->vcaps[vt].keyfield_set_size)
415 		return NULL;
416 	kset = &vctrl->vcaps[vt].keyfield_set[keyset];
417 	if (kset->sw_per_item == 0 || kset->sw_per_item > vctrl->vcaps[vt].sw_count)
418 		return NULL;
419 	return kset;
420 }
421 EXPORT_SYMBOL_GPL(vcap_keyfieldset);
422 
423 /* Return the typegroup table for the matching keyset (using subword size) */
424 const struct vcap_typegroup *
425 vcap_keyfield_typegroup(struct vcap_control *vctrl,
426 			enum vcap_type vt, enum vcap_keyfield_set keyset)
427 {
428 	const struct vcap_set *kset = vcap_keyfieldset(vctrl, vt, keyset);
429 
430 	/* Check that the keyset is valid */
431 	if (!kset)
432 		return NULL;
433 	return vctrl->vcaps[vt].keyfield_set_typegroups[kset->sw_per_item];
434 }
435 
436 /* Return the number of keyfields in the keyset */
437 int vcap_keyfield_count(struct vcap_control *vctrl,
438 			enum vcap_type vt, enum vcap_keyfield_set keyset)
439 {
440 	/* Check that the keyset exists in the vcap keyset list */
441 	if (keyset >= vctrl->vcaps[vt].keyfield_set_size)
442 		return 0;
443 	return vctrl->vcaps[vt].keyfield_set_map_size[keyset];
444 }
445 
446 static void vcap_encode_keyfield(struct vcap_rule_internal *ri,
447 				 const struct vcap_client_keyfield *kf,
448 				 const struct vcap_field *rf,
449 				 const struct vcap_typegroup *tgt)
450 {
451 	int sw_width = ri->vctrl->vcaps[ri->admin->vtype].sw_width;
452 	struct vcap_cache_data *cache = &ri->admin->cache;
453 	struct vcap_stream_iter iter;
454 	const u8 *value, *mask;
455 
456 	/* Encode the fields for the key and the mask in their respective
457 	 * streams, respecting the subword width.
458 	 */
459 	switch (kf->ctrl.type) {
460 	case VCAP_FIELD_BIT:
461 		value = &kf->data.u1.value;
462 		mask = &kf->data.u1.mask;
463 		break;
464 	case VCAP_FIELD_U32:
465 		value = (const u8 *)&kf->data.u32.value;
466 		mask = (const u8 *)&kf->data.u32.mask;
467 		break;
468 	case VCAP_FIELD_U48:
469 		value = kf->data.u48.value;
470 		mask = kf->data.u48.mask;
471 		break;
472 	case VCAP_FIELD_U56:
473 		value = kf->data.u56.value;
474 		mask = kf->data.u56.mask;
475 		break;
476 	case VCAP_FIELD_U64:
477 		value = kf->data.u64.value;
478 		mask = kf->data.u64.mask;
479 		break;
480 	case VCAP_FIELD_U72:
481 		value = kf->data.u72.value;
482 		mask = kf->data.u72.mask;
483 		break;
484 	case VCAP_FIELD_U112:
485 		value = kf->data.u112.value;
486 		mask = kf->data.u112.mask;
487 		break;
488 	case VCAP_FIELD_U128:
489 		value = kf->data.u128.value;
490 		mask = kf->data.u128.mask;
491 		break;
492 	}
493 	vcap_iter_init(&iter, sw_width, tgt, rf->offset);
494 	vcap_encode_field(cache->keystream, &iter, rf->width, value);
495 	vcap_iter_init(&iter, sw_width, tgt, rf->offset);
496 	vcap_encode_field(cache->maskstream, &iter, rf->width, mask);
497 }
498 
499 static void vcap_encode_keyfield_typegroups(struct vcap_control *vctrl,
500 					    struct vcap_rule_internal *ri,
501 					    const struct vcap_typegroup *tgt)
502 {
503 	int sw_width = vctrl->vcaps[ri->admin->vtype].sw_width;
504 	struct vcap_cache_data *cache = &ri->admin->cache;
505 
506 	/* Encode the typegroup bits for the key and the mask in their streams,
507 	 * respecting the subword width.
508 	 */
509 	vcap_encode_typegroups(cache->keystream, sw_width, tgt, false);
510 	vcap_encode_typegroups(cache->maskstream, sw_width, tgt, true);
511 }
512 
513 /* Copy data from src to dst but reverse the data in chunks of 32bits.
514  * For example if src is 00:11:22:33:44:55 where 55 is LSB the dst will
515  * have the value 22:33:44:55:00:11.
516  */
517 static void vcap_copy_to_w32be(u8 *dst, const u8 *src, int size)
518 {
519 	for (int idx = 0; idx < size; ++idx) {
520 		int first_byte_index = 0;
521 		int nidx;
522 
523 		first_byte_index = size - (((idx >> 2) + 1) << 2);
524 		if (first_byte_index < 0)
525 			first_byte_index = 0;
526 		nidx = idx + first_byte_index - (idx & ~0x3);
527 		dst[nidx] = src[idx];
528 	}
529 }
530 
531 static void
532 vcap_copy_from_client_keyfield(struct vcap_rule *rule,
533 			       struct vcap_client_keyfield *dst,
534 			       const struct vcap_client_keyfield *src)
535 {
536 	struct vcap_rule_internal *ri = to_intrule(rule);
537 	const struct vcap_client_keyfield_data *sdata;
538 	struct vcap_client_keyfield_data *ddata;
539 	int size;
540 
541 	dst->ctrl.type = src->ctrl.type;
542 	dst->ctrl.key = src->ctrl.key;
543 	INIT_LIST_HEAD(&dst->ctrl.list);
544 	sdata = &src->data;
545 	ddata = &dst->data;
546 
547 	if (!ri->admin->w32be) {
548 		memcpy(ddata, sdata, sizeof(dst->data));
549 		return;
550 	}
551 
552 	size = keyfield_size_table[dst->ctrl.type] / 2;
553 
554 	switch (dst->ctrl.type) {
555 	case VCAP_FIELD_BIT:
556 	case VCAP_FIELD_U32:
557 		memcpy(ddata, sdata, sizeof(dst->data));
558 		break;
559 	case VCAP_FIELD_U48:
560 		vcap_copy_to_w32be(ddata->u48.value, src->data.u48.value, size);
561 		vcap_copy_to_w32be(ddata->u48.mask,  src->data.u48.mask, size);
562 		break;
563 	case VCAP_FIELD_U56:
564 		vcap_copy_to_w32be(ddata->u56.value, sdata->u56.value, size);
565 		vcap_copy_to_w32be(ddata->u56.mask,  sdata->u56.mask, size);
566 		break;
567 	case VCAP_FIELD_U64:
568 		vcap_copy_to_w32be(ddata->u64.value, sdata->u64.value, size);
569 		vcap_copy_to_w32be(ddata->u64.mask,  sdata->u64.mask, size);
570 		break;
571 	case VCAP_FIELD_U72:
572 		vcap_copy_to_w32be(ddata->u72.value, sdata->u72.value, size);
573 		vcap_copy_to_w32be(ddata->u72.mask,  sdata->u72.mask, size);
574 		break;
575 	case VCAP_FIELD_U112:
576 		vcap_copy_to_w32be(ddata->u112.value, sdata->u112.value, size);
577 		vcap_copy_to_w32be(ddata->u112.mask,  sdata->u112.mask, size);
578 		break;
579 	case VCAP_FIELD_U128:
580 		vcap_copy_to_w32be(ddata->u128.value, sdata->u128.value, size);
581 		vcap_copy_to_w32be(ddata->u128.mask,  sdata->u128.mask, size);
582 		break;
583 	}
584 }
585 
586 static void
587 vcap_copy_from_client_actionfield(struct vcap_rule *rule,
588 				  struct vcap_client_actionfield *dst,
589 				  const struct vcap_client_actionfield *src)
590 {
591 	struct vcap_rule_internal *ri = to_intrule(rule);
592 	const struct vcap_client_actionfield_data *sdata;
593 	struct vcap_client_actionfield_data *ddata;
594 	int size;
595 
596 	dst->ctrl.type = src->ctrl.type;
597 	dst->ctrl.action = src->ctrl.action;
598 	INIT_LIST_HEAD(&dst->ctrl.list);
599 	sdata = &src->data;
600 	ddata = &dst->data;
601 
602 	if (!ri->admin->w32be) {
603 		memcpy(ddata, sdata, sizeof(dst->data));
604 		return;
605 	}
606 
607 	size = actionfield_size_table[dst->ctrl.type];
608 
609 	switch (dst->ctrl.type) {
610 	case VCAP_FIELD_BIT:
611 	case VCAP_FIELD_U32:
612 		memcpy(ddata, sdata, sizeof(dst->data));
613 		break;
614 	case VCAP_FIELD_U48:
615 		vcap_copy_to_w32be(ddata->u48.value, sdata->u48.value, size);
616 		break;
617 	case VCAP_FIELD_U56:
618 		vcap_copy_to_w32be(ddata->u56.value, sdata->u56.value, size);
619 		break;
620 	case VCAP_FIELD_U64:
621 		vcap_copy_to_w32be(ddata->u64.value, sdata->u64.value, size);
622 		break;
623 	case VCAP_FIELD_U72:
624 		vcap_copy_to_w32be(ddata->u72.value, sdata->u72.value, size);
625 		break;
626 	case VCAP_FIELD_U112:
627 		vcap_copy_to_w32be(ddata->u112.value, sdata->u112.value, size);
628 		break;
629 	case VCAP_FIELD_U128:
630 		vcap_copy_to_w32be(ddata->u128.value, sdata->u128.value, size);
631 		break;
632 	}
633 }
634 
635 static int vcap_encode_rule_keyset(struct vcap_rule_internal *ri)
636 {
637 	const struct vcap_client_keyfield *ckf;
638 	const struct vcap_typegroup *tg_table;
639 	struct vcap_client_keyfield tempkf;
640 	const struct vcap_field *kf_table;
641 	int keyset_size;
642 
643 	/* Get a valid set of fields for the specific keyset */
644 	kf_table = vcap_keyfields(ri->vctrl, ri->admin->vtype, ri->data.keyset);
645 	if (!kf_table) {
646 		pr_err("%s:%d: no fields available for this keyset: %d\n",
647 		       __func__, __LINE__, ri->data.keyset);
648 		return -EINVAL;
649 	}
650 	/* Get a valid typegroup for the specific keyset */
651 	tg_table = vcap_keyfield_typegroup(ri->vctrl, ri->admin->vtype,
652 					   ri->data.keyset);
653 	if (!tg_table) {
654 		pr_err("%s:%d: no typegroups available for this keyset: %d\n",
655 		       __func__, __LINE__, ri->data.keyset);
656 		return -EINVAL;
657 	}
658 	/* Get a valid size for the specific keyset */
659 	keyset_size = vcap_keyfield_count(ri->vctrl, ri->admin->vtype,
660 					  ri->data.keyset);
661 	if (keyset_size == 0) {
662 		pr_err("%s:%d: zero field count for this keyset: %d\n",
663 		       __func__, __LINE__, ri->data.keyset);
664 		return -EINVAL;
665 	}
666 	/* Iterate over the keyfields (key, mask) in the rule
667 	 * and encode these bits
668 	 */
669 	if (list_empty(&ri->data.keyfields)) {
670 		pr_err("%s:%d: no keyfields in the rule\n", __func__, __LINE__);
671 		return -EINVAL;
672 	}
673 	list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) {
674 		/* Check that the client entry exists in the keyset */
675 		if (ckf->ctrl.key >= keyset_size) {
676 			pr_err("%s:%d: key %d is not in vcap\n",
677 			       __func__, __LINE__, ckf->ctrl.key);
678 			return -EINVAL;
679 		}
680 		vcap_copy_from_client_keyfield(&ri->data, &tempkf, ckf);
681 		vcap_encode_keyfield(ri, &tempkf, &kf_table[ckf->ctrl.key],
682 				     tg_table);
683 	}
684 	/* Add typegroup bits to the key/mask bitstreams */
685 	vcap_encode_keyfield_typegroups(ri->vctrl, ri, tg_table);
686 	return 0;
687 }
688 
689 /* Return the list of actionfields for the actionset */
690 const struct vcap_field *
691 vcap_actionfields(struct vcap_control *vctrl,
692 		  enum vcap_type vt, enum vcap_actionfield_set actionset)
693 {
694 	/* Check that the actionset exists in the vcap actionset list */
695 	if (actionset >= vctrl->vcaps[vt].actionfield_set_size)
696 		return NULL;
697 	return vctrl->vcaps[vt].actionfield_set_map[actionset];
698 }
699 
700 const struct vcap_set *
701 vcap_actionfieldset(struct vcap_control *vctrl,
702 		    enum vcap_type vt, enum vcap_actionfield_set actionset)
703 {
704 	const struct vcap_set *aset;
705 
706 	/* Check that the actionset exists in the vcap actionset list */
707 	if (actionset >= vctrl->vcaps[vt].actionfield_set_size)
708 		return NULL;
709 	aset = &vctrl->vcaps[vt].actionfield_set[actionset];
710 	if (aset->sw_per_item == 0 || aset->sw_per_item > vctrl->vcaps[vt].sw_count)
711 		return NULL;
712 	return aset;
713 }
714 
715 /* Return the typegroup table for the matching actionset (using subword size) */
716 const struct vcap_typegroup *
717 vcap_actionfield_typegroup(struct vcap_control *vctrl,
718 			   enum vcap_type vt, enum vcap_actionfield_set actionset)
719 {
720 	const struct vcap_set *aset = vcap_actionfieldset(vctrl, vt, actionset);
721 
722 	/* Check that the actionset is valid */
723 	if (!aset)
724 		return NULL;
725 	return vctrl->vcaps[vt].actionfield_set_typegroups[aset->sw_per_item];
726 }
727 
728 /* Return the number of actionfields in the actionset */
729 int vcap_actionfield_count(struct vcap_control *vctrl,
730 			   enum vcap_type vt,
731 			   enum vcap_actionfield_set actionset)
732 {
733 	/* Check that the actionset exists in the vcap actionset list */
734 	if (actionset >= vctrl->vcaps[vt].actionfield_set_size)
735 		return 0;
736 	return vctrl->vcaps[vt].actionfield_set_map_size[actionset];
737 }
738 
739 static void vcap_encode_actionfield(struct vcap_rule_internal *ri,
740 				    const struct vcap_client_actionfield *af,
741 				    const struct vcap_field *rf,
742 				    const struct vcap_typegroup *tgt)
743 {
744 	int act_width = ri->vctrl->vcaps[ri->admin->vtype].act_width;
745 
746 	struct vcap_cache_data *cache = &ri->admin->cache;
747 	struct vcap_stream_iter iter;
748 	const u8 *value;
749 
750 	/* Encode the action field in the stream, respecting the subword width */
751 	switch (af->ctrl.type) {
752 	case VCAP_FIELD_BIT:
753 		value = &af->data.u1.value;
754 		break;
755 	case VCAP_FIELD_U32:
756 		value = (const u8 *)&af->data.u32.value;
757 		break;
758 	case VCAP_FIELD_U48:
759 		value = af->data.u48.value;
760 		break;
761 	case VCAP_FIELD_U56:
762 		value = af->data.u56.value;
763 		break;
764 	case VCAP_FIELD_U64:
765 		value = af->data.u64.value;
766 		break;
767 	case VCAP_FIELD_U72:
768 		value = af->data.u72.value;
769 		break;
770 	case VCAP_FIELD_U112:
771 		value = af->data.u112.value;
772 		break;
773 	case VCAP_FIELD_U128:
774 		value = af->data.u128.value;
775 		break;
776 	}
777 	vcap_iter_init(&iter, act_width, tgt, rf->offset);
778 	vcap_encode_field(cache->actionstream, &iter, rf->width, value);
779 }
780 
781 static void vcap_encode_actionfield_typegroups(struct vcap_rule_internal *ri,
782 					       const struct vcap_typegroup *tgt)
783 {
784 	int sw_width = ri->vctrl->vcaps[ri->admin->vtype].act_width;
785 	struct vcap_cache_data *cache = &ri->admin->cache;
786 
787 	/* Encode the typegroup bits for the actionstream respecting the subword
788 	 * width.
789 	 */
790 	vcap_encode_typegroups(cache->actionstream, sw_width, tgt, false);
791 }
792 
793 static int vcap_encode_rule_actionset(struct vcap_rule_internal *ri)
794 {
795 	const struct vcap_client_actionfield *caf;
796 	const struct vcap_typegroup *tg_table;
797 	struct vcap_client_actionfield tempaf;
798 	const struct vcap_field *af_table;
799 	int actionset_size;
800 
801 	/* Get a valid set of actionset fields for the specific actionset */
802 	af_table = vcap_actionfields(ri->vctrl, ri->admin->vtype,
803 				     ri->data.actionset);
804 	if (!af_table) {
805 		pr_err("%s:%d: no fields available for this actionset: %d\n",
806 		       __func__, __LINE__, ri->data.actionset);
807 		return -EINVAL;
808 	}
809 	/* Get a valid typegroup for the specific actionset */
810 	tg_table = vcap_actionfield_typegroup(ri->vctrl, ri->admin->vtype,
811 					      ri->data.actionset);
812 	if (!tg_table) {
813 		pr_err("%s:%d: no typegroups available for this actionset: %d\n",
814 		       __func__, __LINE__, ri->data.actionset);
815 		return -EINVAL;
816 	}
817 	/* Get a valid actionset size for the specific actionset */
818 	actionset_size = vcap_actionfield_count(ri->vctrl, ri->admin->vtype,
819 						ri->data.actionset);
820 	if (actionset_size == 0) {
821 		pr_err("%s:%d: zero field count for this actionset: %d\n",
822 		       __func__, __LINE__, ri->data.actionset);
823 		return -EINVAL;
824 	}
825 	/* Iterate over the actionfields in the rule
826 	 * and encode these bits
827 	 */
828 	if (list_empty(&ri->data.actionfields))
829 		pr_warn("%s:%d: no actionfields in the rule\n",
830 			__func__, __LINE__);
831 	list_for_each_entry(caf, &ri->data.actionfields, ctrl.list) {
832 		/* Check that the client action exists in the actionset */
833 		if (caf->ctrl.action >= actionset_size) {
834 			pr_err("%s:%d: action %d is not in vcap\n",
835 			       __func__, __LINE__, caf->ctrl.action);
836 			return -EINVAL;
837 		}
838 		vcap_copy_from_client_actionfield(&ri->data, &tempaf, caf);
839 		vcap_encode_actionfield(ri, &tempaf,
840 					&af_table[caf->ctrl.action], tg_table);
841 	}
842 	/* Add typegroup bits to the entry bitstreams */
843 	vcap_encode_actionfield_typegroups(ri, tg_table);
844 	return 0;
845 }
846 
847 static int vcap_encode_rule(struct vcap_rule_internal *ri)
848 {
849 	int err;
850 
851 	err = vcap_encode_rule_keyset(ri);
852 	if (err)
853 		return err;
854 	err = vcap_encode_rule_actionset(ri);
855 	if (err)
856 		return err;
857 	return 0;
858 }
859 
860 int vcap_api_check(struct vcap_control *ctrl)
861 {
862 	if (!ctrl) {
863 		pr_err("%s:%d: vcap control is missing\n", __func__, __LINE__);
864 		return -EINVAL;
865 	}
866 	if (!ctrl->ops || !ctrl->ops->validate_keyset ||
867 	    !ctrl->ops->add_default_fields || !ctrl->ops->cache_erase ||
868 	    !ctrl->ops->cache_write || !ctrl->ops->cache_read ||
869 	    !ctrl->ops->init || !ctrl->ops->update || !ctrl->ops->move ||
870 	    !ctrl->ops->port_info) {
871 		pr_err("%s:%d: client operations are missing\n",
872 		       __func__, __LINE__);
873 		return -ENOENT;
874 	}
875 	return 0;
876 }
877 
878 void vcap_erase_cache(struct vcap_rule_internal *ri)
879 {
880 	ri->vctrl->ops->cache_erase(ri->admin);
881 }
882 
883 /* Update the keyset for the rule */
884 int vcap_set_rule_set_keyset(struct vcap_rule *rule,
885 			     enum vcap_keyfield_set keyset)
886 {
887 	struct vcap_rule_internal *ri = to_intrule(rule);
888 	const struct vcap_set *kset;
889 	int sw_width;
890 
891 	kset = vcap_keyfieldset(ri->vctrl, ri->admin->vtype, keyset);
892 	/* Check that the keyset is valid */
893 	if (!kset)
894 		return -EINVAL;
895 	ri->keyset_sw = kset->sw_per_item;
896 	sw_width = ri->vctrl->vcaps[ri->admin->vtype].sw_width;
897 	ri->keyset_sw_regs = DIV_ROUND_UP(sw_width, 32);
898 	ri->data.keyset = keyset;
899 	return 0;
900 }
901 EXPORT_SYMBOL_GPL(vcap_set_rule_set_keyset);
902 
903 /* Update the actionset for the rule */
904 int vcap_set_rule_set_actionset(struct vcap_rule *rule,
905 				enum vcap_actionfield_set actionset)
906 {
907 	struct vcap_rule_internal *ri = to_intrule(rule);
908 	const struct vcap_set *aset;
909 	int act_width;
910 
911 	aset = vcap_actionfieldset(ri->vctrl, ri->admin->vtype, actionset);
912 	/* Check that the actionset is valid */
913 	if (!aset)
914 		return -EINVAL;
915 	ri->actionset_sw = aset->sw_per_item;
916 	act_width = ri->vctrl->vcaps[ri->admin->vtype].act_width;
917 	ri->actionset_sw_regs = DIV_ROUND_UP(act_width, 32);
918 	ri->data.actionset = actionset;
919 	return 0;
920 }
921 EXPORT_SYMBOL_GPL(vcap_set_rule_set_actionset);
922 
923 /* Check if a rule with this id exists */
924 static bool vcap_rule_exists(struct vcap_control *vctrl, u32 id)
925 {
926 	struct vcap_rule_internal *ri;
927 	struct vcap_admin *admin;
928 
929 	/* Look for the rule id in all vcaps */
930 	list_for_each_entry(admin, &vctrl->list, list)
931 		list_for_each_entry(ri, &admin->rules, list)
932 			if (ri->data.id == id)
933 				return true;
934 	return false;
935 }
936 
937 /* Find a rule with a provided rule id return a locked vcap */
938 static struct vcap_rule_internal *
939 vcap_get_locked_rule(struct vcap_control *vctrl, u32 id)
940 {
941 	struct vcap_rule_internal *ri;
942 	struct vcap_admin *admin;
943 
944 	/* Look for the rule id in all vcaps */
945 	list_for_each_entry(admin, &vctrl->list, list) {
946 		mutex_lock(&admin->lock);
947 		list_for_each_entry(ri, &admin->rules, list)
948 			if (ri->data.id == id)
949 				return ri;
950 		mutex_unlock(&admin->lock);
951 	}
952 	return NULL;
953 }
954 
955 /* Find a rule id with a provided cookie */
956 int vcap_lookup_rule_by_cookie(struct vcap_control *vctrl, u64 cookie)
957 {
958 	struct vcap_rule_internal *ri;
959 	struct vcap_admin *admin;
960 	int id = 0;
961 
962 	/* Look for the rule id in all vcaps */
963 	list_for_each_entry(admin, &vctrl->list, list) {
964 		mutex_lock(&admin->lock);
965 		list_for_each_entry(ri, &admin->rules, list) {
966 			if (ri->data.cookie == cookie) {
967 				id = ri->data.id;
968 				break;
969 			}
970 		}
971 		mutex_unlock(&admin->lock);
972 		if (id)
973 			return id;
974 	}
975 	return -ENOENT;
976 }
977 EXPORT_SYMBOL_GPL(vcap_lookup_rule_by_cookie);
978 
979 /* Make a copy of the rule, shallow or full */
980 static struct vcap_rule_internal *vcap_dup_rule(struct vcap_rule_internal *ri,
981 						bool full)
982 {
983 	struct vcap_client_actionfield *caf, *newcaf;
984 	struct vcap_client_keyfield *ckf, *newckf;
985 	struct vcap_rule_internal *duprule;
986 
987 	/* Allocate the client part */
988 	duprule = kzalloc(sizeof(*duprule), GFP_KERNEL);
989 	if (!duprule)
990 		return ERR_PTR(-ENOMEM);
991 	*duprule = *ri;
992 	/* Not inserted in the VCAP */
993 	INIT_LIST_HEAD(&duprule->list);
994 	/* No elements in these lists */
995 	INIT_LIST_HEAD(&duprule->data.keyfields);
996 	INIT_LIST_HEAD(&duprule->data.actionfields);
997 
998 	/* A full rule copy includes keys and actions */
999 	if (!full)
1000 		return duprule;
1001 
1002 	list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) {
1003 		newckf = kmemdup(ckf, sizeof(*newckf), GFP_KERNEL);
1004 		if (!newckf)
1005 			return ERR_PTR(-ENOMEM);
1006 		list_add_tail(&newckf->ctrl.list, &duprule->data.keyfields);
1007 	}
1008 
1009 	list_for_each_entry(caf, &ri->data.actionfields, ctrl.list) {
1010 		newcaf = kmemdup(caf, sizeof(*newcaf), GFP_KERNEL);
1011 		if (!newcaf)
1012 			return ERR_PTR(-ENOMEM);
1013 		list_add_tail(&newcaf->ctrl.list, &duprule->data.actionfields);
1014 	}
1015 
1016 	return duprule;
1017 }
1018 
1019 static void vcap_apply_width(u8 *dst, int width, int bytes)
1020 {
1021 	u8 bmask;
1022 	int idx;
1023 
1024 	for (idx = 0; idx < bytes; idx++) {
1025 		if (width > 0)
1026 			if (width < 8)
1027 				bmask = (1 << width) - 1;
1028 			else
1029 				bmask = ~0;
1030 		else
1031 			bmask = 0;
1032 		dst[idx] &= bmask;
1033 		width -= 8;
1034 	}
1035 }
1036 
1037 static void vcap_copy_from_w32be(u8 *dst, u8 *src, int size, int width)
1038 {
1039 	int idx, ridx, wstart, nidx;
1040 	int tail_bytes = (((size + 4) >> 2) << 2) - size;
1041 
1042 	for (idx = 0, ridx = size - 1; idx < size; ++idx, --ridx) {
1043 		wstart = (idx >> 2) << 2;
1044 		nidx = wstart + 3 - (idx & 0x3);
1045 		if (nidx >= size)
1046 			nidx -= tail_bytes;
1047 		dst[nidx] = src[ridx];
1048 	}
1049 
1050 	vcap_apply_width(dst, width, size);
1051 }
1052 
1053 static void vcap_copy_action_bit_field(struct vcap_u1_action *field, u8 *value)
1054 {
1055 	field->value = (*value) & 0x1;
1056 }
1057 
1058 static void vcap_copy_limited_actionfield(u8 *dstvalue, u8 *srcvalue,
1059 					  int width, int bytes)
1060 {
1061 	memcpy(dstvalue, srcvalue, bytes);
1062 	vcap_apply_width(dstvalue, width, bytes);
1063 }
1064 
1065 static void vcap_copy_to_client_actionfield(struct vcap_rule_internal *ri,
1066 					    struct vcap_client_actionfield *field,
1067 					    u8 *value, u16 width)
1068 {
1069 	int field_size = actionfield_size_table[field->ctrl.type];
1070 
1071 	if (ri->admin->w32be) {
1072 		switch (field->ctrl.type) {
1073 		case VCAP_FIELD_BIT:
1074 			vcap_copy_action_bit_field(&field->data.u1, value);
1075 			break;
1076 		case VCAP_FIELD_U32:
1077 			vcap_copy_limited_actionfield((u8 *)&field->data.u32.value,
1078 						      value,
1079 						      width, field_size);
1080 			break;
1081 		case VCAP_FIELD_U48:
1082 			vcap_copy_from_w32be(field->data.u48.value, value,
1083 					     field_size, width);
1084 			break;
1085 		case VCAP_FIELD_U56:
1086 			vcap_copy_from_w32be(field->data.u56.value, value,
1087 					     field_size, width);
1088 			break;
1089 		case VCAP_FIELD_U64:
1090 			vcap_copy_from_w32be(field->data.u64.value, value,
1091 					     field_size, width);
1092 			break;
1093 		case VCAP_FIELD_U72:
1094 			vcap_copy_from_w32be(field->data.u72.value, value,
1095 					     field_size, width);
1096 			break;
1097 		case VCAP_FIELD_U112:
1098 			vcap_copy_from_w32be(field->data.u112.value, value,
1099 					     field_size, width);
1100 			break;
1101 		case VCAP_FIELD_U128:
1102 			vcap_copy_from_w32be(field->data.u128.value, value,
1103 					     field_size, width);
1104 			break;
1105 		};
1106 	} else {
1107 		switch (field->ctrl.type) {
1108 		case VCAP_FIELD_BIT:
1109 			vcap_copy_action_bit_field(&field->data.u1, value);
1110 			break;
1111 		case VCAP_FIELD_U32:
1112 			vcap_copy_limited_actionfield((u8 *)&field->data.u32.value,
1113 						      value,
1114 						      width, field_size);
1115 			break;
1116 		case VCAP_FIELD_U48:
1117 			vcap_copy_limited_actionfield(field->data.u48.value,
1118 						      value,
1119 						      width, field_size);
1120 			break;
1121 		case VCAP_FIELD_U56:
1122 			vcap_copy_limited_actionfield(field->data.u56.value,
1123 						      value,
1124 						      width, field_size);
1125 			break;
1126 		case VCAP_FIELD_U64:
1127 			vcap_copy_limited_actionfield(field->data.u64.value,
1128 						      value,
1129 						      width, field_size);
1130 			break;
1131 		case VCAP_FIELD_U72:
1132 			vcap_copy_limited_actionfield(field->data.u72.value,
1133 						      value,
1134 						      width, field_size);
1135 			break;
1136 		case VCAP_FIELD_U112:
1137 			vcap_copy_limited_actionfield(field->data.u112.value,
1138 						      value,
1139 						      width, field_size);
1140 			break;
1141 		case VCAP_FIELD_U128:
1142 			vcap_copy_limited_actionfield(field->data.u128.value,
1143 						      value,
1144 						      width, field_size);
1145 			break;
1146 		};
1147 	}
1148 }
1149 
1150 static void vcap_copy_key_bit_field(struct vcap_u1_key *field,
1151 				    u8 *value, u8 *mask)
1152 {
1153 	field->value = (*value) & 0x1;
1154 	field->mask = (*mask) & 0x1;
1155 }
1156 
1157 static void vcap_copy_limited_keyfield(u8 *dstvalue, u8 *dstmask,
1158 				       u8 *srcvalue, u8 *srcmask,
1159 				       int width, int bytes)
1160 {
1161 	memcpy(dstvalue, srcvalue, bytes);
1162 	vcap_apply_width(dstvalue, width, bytes);
1163 	memcpy(dstmask, srcmask, bytes);
1164 	vcap_apply_width(dstmask, width, bytes);
1165 }
1166 
1167 static void vcap_copy_to_client_keyfield(struct vcap_rule_internal *ri,
1168 					 struct vcap_client_keyfield *field,
1169 					 u8 *value, u8 *mask, u16 width)
1170 {
1171 	int field_size = keyfield_size_table[field->ctrl.type] / 2;
1172 
1173 	if (ri->admin->w32be) {
1174 		switch (field->ctrl.type) {
1175 		case VCAP_FIELD_BIT:
1176 			vcap_copy_key_bit_field(&field->data.u1, value, mask);
1177 			break;
1178 		case VCAP_FIELD_U32:
1179 			vcap_copy_limited_keyfield((u8 *)&field->data.u32.value,
1180 						   (u8 *)&field->data.u32.mask,
1181 						   value, mask,
1182 						   width, field_size);
1183 			break;
1184 		case VCAP_FIELD_U48:
1185 			vcap_copy_from_w32be(field->data.u48.value, value,
1186 					     field_size, width);
1187 			vcap_copy_from_w32be(field->data.u48.mask,  mask,
1188 					     field_size, width);
1189 			break;
1190 		case VCAP_FIELD_U56:
1191 			vcap_copy_from_w32be(field->data.u56.value, value,
1192 					     field_size, width);
1193 			vcap_copy_from_w32be(field->data.u56.mask,  mask,
1194 					     field_size, width);
1195 			break;
1196 		case VCAP_FIELD_U64:
1197 			vcap_copy_from_w32be(field->data.u64.value, value,
1198 					     field_size, width);
1199 			vcap_copy_from_w32be(field->data.u64.mask,  mask,
1200 					     field_size, width);
1201 			break;
1202 		case VCAP_FIELD_U72:
1203 			vcap_copy_from_w32be(field->data.u72.value, value,
1204 					     field_size, width);
1205 			vcap_copy_from_w32be(field->data.u72.mask,  mask,
1206 					     field_size, width);
1207 			break;
1208 		case VCAP_FIELD_U112:
1209 			vcap_copy_from_w32be(field->data.u112.value, value,
1210 					     field_size, width);
1211 			vcap_copy_from_w32be(field->data.u112.mask,  mask,
1212 					     field_size, width);
1213 			break;
1214 		case VCAP_FIELD_U128:
1215 			vcap_copy_from_w32be(field->data.u128.value, value,
1216 					     field_size, width);
1217 			vcap_copy_from_w32be(field->data.u128.mask,  mask,
1218 					     field_size, width);
1219 			break;
1220 		};
1221 	} else {
1222 		switch (field->ctrl.type) {
1223 		case VCAP_FIELD_BIT:
1224 			vcap_copy_key_bit_field(&field->data.u1, value, mask);
1225 			break;
1226 		case VCAP_FIELD_U32:
1227 			vcap_copy_limited_keyfield((u8 *)&field->data.u32.value,
1228 						   (u8 *)&field->data.u32.mask,
1229 						   value, mask,
1230 						   width, field_size);
1231 			break;
1232 		case VCAP_FIELD_U48:
1233 			vcap_copy_limited_keyfield(field->data.u48.value,
1234 						   field->data.u48.mask,
1235 						   value, mask,
1236 						   width, field_size);
1237 			break;
1238 		case VCAP_FIELD_U56:
1239 			vcap_copy_limited_keyfield(field->data.u56.value,
1240 						   field->data.u56.mask,
1241 						   value, mask,
1242 						   width, field_size);
1243 			break;
1244 		case VCAP_FIELD_U64:
1245 			vcap_copy_limited_keyfield(field->data.u64.value,
1246 						   field->data.u64.mask,
1247 						   value, mask,
1248 						   width, field_size);
1249 			break;
1250 		case VCAP_FIELD_U72:
1251 			vcap_copy_limited_keyfield(field->data.u72.value,
1252 						   field->data.u72.mask,
1253 						   value, mask,
1254 						   width, field_size);
1255 			break;
1256 		case VCAP_FIELD_U112:
1257 			vcap_copy_limited_keyfield(field->data.u112.value,
1258 						   field->data.u112.mask,
1259 						   value, mask,
1260 						   width, field_size);
1261 			break;
1262 		case VCAP_FIELD_U128:
1263 			vcap_copy_limited_keyfield(field->data.u128.value,
1264 						   field->data.u128.mask,
1265 						   value, mask,
1266 						   width, field_size);
1267 			break;
1268 		};
1269 	}
1270 }
1271 
1272 static void vcap_rule_alloc_keyfield(struct vcap_rule_internal *ri,
1273 				     const struct vcap_field *keyfield,
1274 				     enum vcap_key_field key,
1275 				     u8 *value, u8 *mask)
1276 {
1277 	struct vcap_client_keyfield *field;
1278 
1279 	field = kzalloc(sizeof(*field), GFP_KERNEL);
1280 	if (!field)
1281 		return;
1282 	INIT_LIST_HEAD(&field->ctrl.list);
1283 	field->ctrl.key = key;
1284 	field->ctrl.type = keyfield->type;
1285 	vcap_copy_to_client_keyfield(ri, field, value, mask, keyfield->width);
1286 	list_add_tail(&field->ctrl.list, &ri->data.keyfields);
1287 }
1288 
1289 /* Read key data from a VCAP address and discover if there is a rule keyset
1290  * here
1291  */
1292 static bool
1293 vcap_verify_actionstream_actionset(struct vcap_control *vctrl,
1294 				   enum vcap_type vt,
1295 				   u32 *actionstream,
1296 				   enum vcap_actionfield_set actionset)
1297 {
1298 	const struct vcap_typegroup *tgt;
1299 	const struct vcap_field *fields;
1300 	const struct vcap_set *info;
1301 
1302 	if (vcap_actionfield_count(vctrl, vt, actionset) == 0)
1303 		return false;
1304 
1305 	info = vcap_actionfieldset(vctrl, vt, actionset);
1306 	/* Check that the actionset is valid */
1307 	if (!info)
1308 		return false;
1309 
1310 	/* a type_id of value -1 means that there is no type field */
1311 	if (info->type_id == (u8)-1)
1312 		return true;
1313 
1314 	/* Get a valid typegroup for the specific actionset */
1315 	tgt = vcap_actionfield_typegroup(vctrl, vt, actionset);
1316 	if (!tgt)
1317 		return false;
1318 
1319 	fields = vcap_actionfields(vctrl, vt, actionset);
1320 	if (!fields)
1321 		return false;
1322 
1323 	/* Later this will be expanded with a check of the type id */
1324 	return true;
1325 }
1326 
1327 /* Find the subword width of the action typegroup that matches the stream data
1328  */
1329 static int vcap_find_actionstream_typegroup_sw(struct vcap_control *vctrl,
1330 					       enum vcap_type vt, u32 *stream,
1331 					       int sw_max)
1332 {
1333 	const struct vcap_typegroup **tgt;
1334 	int sw_idx, res;
1335 
1336 	tgt = vctrl->vcaps[vt].actionfield_set_typegroups;
1337 	/* Try the longest subword match first */
1338 	for (sw_idx = vctrl->vcaps[vt].sw_count; sw_idx >= 0; sw_idx--) {
1339 		if (!tgt[sw_idx])
1340 			continue;
1341 		res = vcap_verify_typegroups(stream, vctrl->vcaps[vt].act_width,
1342 					     tgt[sw_idx], false, sw_max);
1343 		if (res == 0)
1344 			return sw_idx;
1345 	}
1346 	return -EINVAL;
1347 }
1348 
1349 /* Verify that the typegroup information, subword count, actionset and type id
1350  * are in sync and correct, return the actionset
1351  */
1352 static enum vcap_actionfield_set
1353 vcap_find_actionstream_actionset(struct vcap_control *vctrl,
1354 				 enum vcap_type vt,
1355 				 u32 *stream,
1356 				 int sw_max)
1357 {
1358 	const struct vcap_set *actionfield_set;
1359 	int sw_count, idx;
1360 	bool res;
1361 
1362 	sw_count = vcap_find_actionstream_typegroup_sw(vctrl, vt, stream,
1363 						       sw_max);
1364 	if (sw_count < 0)
1365 		return sw_count;
1366 
1367 	actionfield_set = vctrl->vcaps[vt].actionfield_set;
1368 	for (idx = 0; idx < vctrl->vcaps[vt].actionfield_set_size; ++idx) {
1369 		if (actionfield_set[idx].sw_per_item != sw_count)
1370 			continue;
1371 
1372 		res = vcap_verify_actionstream_actionset(vctrl, vt,
1373 							 stream, idx);
1374 		if (res)
1375 			return idx;
1376 	}
1377 	return -EINVAL;
1378 }
1379 
1380 /* Store action value in an element in a list for the client */
1381 static void vcap_rule_alloc_actionfield(struct vcap_rule_internal *ri,
1382 					const struct vcap_field *actionfield,
1383 					enum vcap_action_field action,
1384 					u8 *value)
1385 {
1386 	struct vcap_client_actionfield *field;
1387 
1388 	field = kzalloc(sizeof(*field), GFP_KERNEL);
1389 	if (!field)
1390 		return;
1391 	INIT_LIST_HEAD(&field->ctrl.list);
1392 	field->ctrl.action = action;
1393 	field->ctrl.type = actionfield->type;
1394 	vcap_copy_to_client_actionfield(ri, field, value, actionfield->width);
1395 	list_add_tail(&field->ctrl.list, &ri->data.actionfields);
1396 }
1397 
1398 static int vcap_decode_actionset(struct vcap_rule_internal *ri)
1399 {
1400 	struct vcap_control *vctrl = ri->vctrl;
1401 	struct vcap_admin *admin = ri->admin;
1402 	const struct vcap_field *actionfield;
1403 	enum vcap_actionfield_set actionset;
1404 	enum vcap_type vt = admin->vtype;
1405 	const struct vcap_typegroup *tgt;
1406 	struct vcap_stream_iter iter;
1407 	int idx, res, actfield_count;
1408 	u32 *actstream;
1409 	u8 value[16];
1410 
1411 	actstream = admin->cache.actionstream;
1412 	res = vcap_find_actionstream_actionset(vctrl, vt, actstream, 0);
1413 	if (res < 0) {
1414 		pr_err("%s:%d: could not find valid actionset: %d\n",
1415 		       __func__, __LINE__, res);
1416 		return -EINVAL;
1417 	}
1418 	actionset = res;
1419 	actfield_count = vcap_actionfield_count(vctrl, vt, actionset);
1420 	actionfield = vcap_actionfields(vctrl, vt, actionset);
1421 	tgt = vcap_actionfield_typegroup(vctrl, vt, actionset);
1422 	/* Start decoding the stream */
1423 	for (idx = 0; idx < actfield_count; ++idx) {
1424 		if (actionfield[idx].width <= 0)
1425 			continue;
1426 		/* Get the action */
1427 		memset(value, 0, DIV_ROUND_UP(actionfield[idx].width, 8));
1428 		vcap_iter_init(&iter, vctrl->vcaps[vt].act_width, tgt,
1429 			       actionfield[idx].offset);
1430 		vcap_decode_field(actstream, &iter, actionfield[idx].width,
1431 				  value);
1432 		/* Skip if no bits are set */
1433 		if (vcap_bitarray_zero(actionfield[idx].width, value))
1434 			continue;
1435 		vcap_rule_alloc_actionfield(ri, &actionfield[idx], idx, value);
1436 		/* Later the action id will also be checked */
1437 	}
1438 	return vcap_set_rule_set_actionset((struct vcap_rule *)ri, actionset);
1439 }
1440 
1441 static int vcap_decode_keyset(struct vcap_rule_internal *ri)
1442 {
1443 	struct vcap_control *vctrl = ri->vctrl;
1444 	struct vcap_stream_iter kiter, miter;
1445 	struct vcap_admin *admin = ri->admin;
1446 	enum vcap_keyfield_set keysets[10];
1447 	const struct vcap_field *keyfield;
1448 	enum vcap_type vt = admin->vtype;
1449 	const struct vcap_typegroup *tgt;
1450 	struct vcap_keyset_list matches;
1451 	enum vcap_keyfield_set keyset;
1452 	int idx, res, keyfield_count;
1453 	u32 *maskstream;
1454 	u32 *keystream;
1455 	u8 value[16];
1456 	u8 mask[16];
1457 
1458 	keystream = admin->cache.keystream;
1459 	maskstream = admin->cache.maskstream;
1460 	matches.keysets = keysets;
1461 	matches.cnt = 0;
1462 	matches.max = ARRAY_SIZE(keysets);
1463 	res = vcap_find_keystream_keysets(vctrl, vt, keystream, maskstream,
1464 					  false, 0, &matches);
1465 	if (res < 0) {
1466 		pr_err("%s:%d: could not find valid keysets: %d\n",
1467 		       __func__, __LINE__, res);
1468 		return -EINVAL;
1469 	}
1470 	keyset = matches.keysets[0];
1471 	keyfield_count = vcap_keyfield_count(vctrl, vt, keyset);
1472 	keyfield = vcap_keyfields(vctrl, vt, keyset);
1473 	tgt = vcap_keyfield_typegroup(vctrl, vt, keyset);
1474 	/* Start decoding the streams */
1475 	for (idx = 0; idx < keyfield_count; ++idx) {
1476 		if (keyfield[idx].width <= 0)
1477 			continue;
1478 		/* First get the mask */
1479 		memset(mask, 0, DIV_ROUND_UP(keyfield[idx].width, 8));
1480 		vcap_iter_init(&miter, vctrl->vcaps[vt].sw_width, tgt,
1481 			       keyfield[idx].offset);
1482 		vcap_decode_field(maskstream, &miter, keyfield[idx].width,
1483 				  mask);
1484 		/* Skip if no mask bits are set */
1485 		if (vcap_bitarray_zero(keyfield[idx].width, mask))
1486 			continue;
1487 		/* Get the key */
1488 		memset(value, 0, DIV_ROUND_UP(keyfield[idx].width, 8));
1489 		vcap_iter_init(&kiter, vctrl->vcaps[vt].sw_width, tgt,
1490 			       keyfield[idx].offset);
1491 		vcap_decode_field(keystream, &kiter, keyfield[idx].width,
1492 				  value);
1493 		vcap_rule_alloc_keyfield(ri, &keyfield[idx], idx, value, mask);
1494 	}
1495 	return vcap_set_rule_set_keyset((struct vcap_rule *)ri, keyset);
1496 }
1497 
1498 /* Read VCAP content into the VCAP cache */
1499 static int vcap_read_rule(struct vcap_rule_internal *ri)
1500 {
1501 	struct vcap_admin *admin = ri->admin;
1502 	int sw_idx, ent_idx = 0, act_idx = 0;
1503 	u32 addr = ri->addr;
1504 
1505 	if (!ri->size || !ri->keyset_sw_regs || !ri->actionset_sw_regs) {
1506 		pr_err("%s:%d: rule is empty\n", __func__, __LINE__);
1507 		return -EINVAL;
1508 	}
1509 	vcap_erase_cache(ri);
1510 	/* Use the values in the streams to read the VCAP cache */
1511 	for (sw_idx = 0; sw_idx < ri->size; sw_idx++, addr++) {
1512 		ri->vctrl->ops->update(ri->ndev, admin, VCAP_CMD_READ,
1513 				       VCAP_SEL_ALL, addr);
1514 		ri->vctrl->ops->cache_read(ri->ndev, admin,
1515 					   VCAP_SEL_ENTRY, ent_idx,
1516 					   ri->keyset_sw_regs);
1517 		ri->vctrl->ops->cache_read(ri->ndev, admin,
1518 					   VCAP_SEL_ACTION, act_idx,
1519 					   ri->actionset_sw_regs);
1520 		if (sw_idx == 0)
1521 			ri->vctrl->ops->cache_read(ri->ndev, admin,
1522 						   VCAP_SEL_COUNTER,
1523 						   ri->counter_id, 0);
1524 		ent_idx += ri->keyset_sw_regs;
1525 		act_idx += ri->actionset_sw_regs;
1526 	}
1527 	return 0;
1528 }
1529 
1530 /* Write VCAP cache content to the VCAP HW instance */
1531 static int vcap_write_rule(struct vcap_rule_internal *ri)
1532 {
1533 	struct vcap_admin *admin = ri->admin;
1534 	int sw_idx, ent_idx = 0, act_idx = 0;
1535 	u32 addr = ri->addr;
1536 
1537 	if (!ri->size || !ri->keyset_sw_regs || !ri->actionset_sw_regs) {
1538 		pr_err("%s:%d: rule is empty\n", __func__, __LINE__);
1539 		return -EINVAL;
1540 	}
1541 	/* Use the values in the streams to write the VCAP cache */
1542 	for (sw_idx = 0; sw_idx < ri->size; sw_idx++, addr++) {
1543 		ri->vctrl->ops->cache_write(ri->ndev, admin,
1544 					    VCAP_SEL_ENTRY, ent_idx,
1545 					    ri->keyset_sw_regs);
1546 		ri->vctrl->ops->cache_write(ri->ndev, admin,
1547 					    VCAP_SEL_ACTION, act_idx,
1548 					    ri->actionset_sw_regs);
1549 		ri->vctrl->ops->update(ri->ndev, admin, VCAP_CMD_WRITE,
1550 				       VCAP_SEL_ALL, addr);
1551 		ent_idx += ri->keyset_sw_regs;
1552 		act_idx += ri->actionset_sw_regs;
1553 	}
1554 	return 0;
1555 }
1556 
1557 static int vcap_write_counter(struct vcap_rule_internal *ri,
1558 			      struct vcap_counter *ctr)
1559 {
1560 	struct vcap_admin *admin = ri->admin;
1561 
1562 	admin->cache.counter = ctr->value;
1563 	admin->cache.sticky = ctr->sticky;
1564 	ri->vctrl->ops->cache_write(ri->ndev, admin, VCAP_SEL_COUNTER,
1565 				    ri->counter_id, 0);
1566 	ri->vctrl->ops->update(ri->ndev, admin, VCAP_CMD_WRITE,
1567 			       VCAP_SEL_COUNTER, ri->addr);
1568 	return 0;
1569 }
1570 
1571 /* Convert a chain id to a VCAP lookup index */
1572 int vcap_chain_id_to_lookup(struct vcap_admin *admin, int cur_cid)
1573 {
1574 	int lookup_first = admin->vinst * admin->lookups_per_instance;
1575 	int lookup_last = lookup_first + admin->lookups_per_instance;
1576 	int cid_next = admin->first_cid + VCAP_CID_LOOKUP_SIZE;
1577 	int cid = admin->first_cid;
1578 	int lookup;
1579 
1580 	for (lookup = lookup_first; lookup < lookup_last; ++lookup,
1581 	     cid += VCAP_CID_LOOKUP_SIZE, cid_next += VCAP_CID_LOOKUP_SIZE)
1582 		if (cur_cid >= cid && cur_cid < cid_next)
1583 			return lookup;
1584 	return 0;
1585 }
1586 EXPORT_SYMBOL_GPL(vcap_chain_id_to_lookup);
1587 
1588 /* Lookup a vcap instance using chain id */
1589 struct vcap_admin *vcap_find_admin(struct vcap_control *vctrl, int cid)
1590 {
1591 	struct vcap_admin *admin;
1592 
1593 	if (vcap_api_check(vctrl))
1594 		return NULL;
1595 
1596 	list_for_each_entry(admin, &vctrl->list, list) {
1597 		if (cid >= admin->first_cid && cid <= admin->last_cid)
1598 			return admin;
1599 	}
1600 	return NULL;
1601 }
1602 EXPORT_SYMBOL_GPL(vcap_find_admin);
1603 
1604 /* Is this the last admin instance ordered by chain id and direction */
1605 static bool vcap_admin_is_last(struct vcap_control *vctrl,
1606 			       struct vcap_admin *admin,
1607 			       bool ingress)
1608 {
1609 	struct vcap_admin *iter, *last = NULL;
1610 	int max_cid = 0;
1611 
1612 	list_for_each_entry(iter, &vctrl->list, list) {
1613 		if (iter->first_cid > max_cid &&
1614 		    iter->ingress == ingress) {
1615 			last = iter;
1616 			max_cid = iter->first_cid;
1617 		}
1618 	}
1619 	if (!last)
1620 		return false;
1621 
1622 	return admin == last;
1623 }
1624 
1625 /* Calculate the value used for chaining VCAP rules */
1626 int vcap_chain_offset(struct vcap_control *vctrl, int from_cid, int to_cid)
1627 {
1628 	int diff = to_cid - from_cid;
1629 
1630 	if (diff < 0) /* Wrong direction */
1631 		return diff;
1632 	to_cid %= VCAP_CID_LOOKUP_SIZE;
1633 	if (to_cid == 0)  /* Destination aligned to a lookup == no chaining */
1634 		return 0;
1635 	diff %= VCAP_CID_LOOKUP_SIZE;  /* Limit to a value within a lookup */
1636 	return diff;
1637 }
1638 EXPORT_SYMBOL_GPL(vcap_chain_offset);
1639 
1640 /* Is the next chain id in one of the following lookups
1641  * For now this does not support filters linked to other filters using
1642  * keys and actions. That will be added later.
1643  */
1644 bool vcap_is_next_lookup(struct vcap_control *vctrl, int src_cid, int dst_cid)
1645 {
1646 	struct vcap_admin *admin;
1647 	int next_cid;
1648 
1649 	if (vcap_api_check(vctrl))
1650 		return false;
1651 
1652 	/* The offset must be at least one lookup, round up */
1653 	next_cid = src_cid + VCAP_CID_LOOKUP_SIZE;
1654 	next_cid /= VCAP_CID_LOOKUP_SIZE;
1655 	next_cid *= VCAP_CID_LOOKUP_SIZE;
1656 
1657 	if (dst_cid < next_cid)
1658 		return false;
1659 
1660 	admin = vcap_find_admin(vctrl, dst_cid);
1661 	if (!admin)
1662 		return false;
1663 
1664 	return true;
1665 }
1666 EXPORT_SYMBOL_GPL(vcap_is_next_lookup);
1667 
1668 /* Check if there is room for a new rule */
1669 static int vcap_rule_space(struct vcap_admin *admin, int size)
1670 {
1671 	if (admin->last_used_addr - size < admin->first_valid_addr) {
1672 		pr_err("%s:%d: No room for rule size: %u, %u\n",
1673 		       __func__, __LINE__, size, admin->first_valid_addr);
1674 		return -ENOSPC;
1675 	}
1676 	return 0;
1677 }
1678 
1679 /* Add the keyset typefield to the list of rule keyfields */
1680 static int vcap_add_type_keyfield(struct vcap_rule *rule)
1681 {
1682 	struct vcap_rule_internal *ri = to_intrule(rule);
1683 	enum vcap_keyfield_set keyset = rule->keyset;
1684 	enum vcap_type vt = ri->admin->vtype;
1685 	const struct vcap_field *fields;
1686 	const struct vcap_set *kset;
1687 	int ret = -EINVAL;
1688 
1689 	kset = vcap_keyfieldset(ri->vctrl, vt, keyset);
1690 	if (!kset)
1691 		return ret;
1692 	if (kset->type_id == (u8)-1)  /* No type field is needed */
1693 		return 0;
1694 
1695 	fields = vcap_keyfields(ri->vctrl, vt, keyset);
1696 	if (!fields)
1697 		return -EINVAL;
1698 	if (fields[VCAP_KF_TYPE].width > 1) {
1699 		ret = vcap_rule_add_key_u32(rule, VCAP_KF_TYPE,
1700 					    kset->type_id, 0xff);
1701 	} else {
1702 		if (kset->type_id)
1703 			ret = vcap_rule_add_key_bit(rule, VCAP_KF_TYPE,
1704 						    VCAP_BIT_1);
1705 		else
1706 			ret = vcap_rule_add_key_bit(rule, VCAP_KF_TYPE,
1707 						    VCAP_BIT_0);
1708 	}
1709 	return 0;
1710 }
1711 
1712 /* Add the actionset typefield to the list of rule actionfields */
1713 static int vcap_add_type_actionfield(struct vcap_rule *rule)
1714 {
1715 	enum vcap_actionfield_set actionset = rule->actionset;
1716 	struct vcap_rule_internal *ri = to_intrule(rule);
1717 	enum vcap_type vt = ri->admin->vtype;
1718 	const struct vcap_field *fields;
1719 	const struct vcap_set *aset;
1720 	int ret = -EINVAL;
1721 
1722 	aset = vcap_actionfieldset(ri->vctrl, vt, actionset);
1723 	if (!aset)
1724 		return ret;
1725 	if (aset->type_id == (u8)-1)  /* No type field is needed */
1726 		return 0;
1727 
1728 	fields = vcap_actionfields(ri->vctrl, vt, actionset);
1729 	if (!fields)
1730 		return -EINVAL;
1731 	if (fields[VCAP_AF_TYPE].width > 1) {
1732 		ret = vcap_rule_add_action_u32(rule, VCAP_AF_TYPE,
1733 					       aset->type_id);
1734 	} else {
1735 		if (aset->type_id)
1736 			ret = vcap_rule_add_action_bit(rule, VCAP_AF_TYPE,
1737 						       VCAP_BIT_1);
1738 		else
1739 			ret = vcap_rule_add_action_bit(rule, VCAP_AF_TYPE,
1740 						       VCAP_BIT_0);
1741 	}
1742 	return ret;
1743 }
1744 
1745 /* Add a keyset to a keyset list */
1746 bool vcap_keyset_list_add(struct vcap_keyset_list *keysetlist,
1747 			  enum vcap_keyfield_set keyset)
1748 {
1749 	int idx;
1750 
1751 	if (keysetlist->cnt < keysetlist->max) {
1752 		/* Avoid duplicates */
1753 		for (idx = 0; idx < keysetlist->cnt; ++idx)
1754 			if (keysetlist->keysets[idx] == keyset)
1755 				return keysetlist->cnt < keysetlist->max;
1756 		keysetlist->keysets[keysetlist->cnt++] = keyset;
1757 	}
1758 	return keysetlist->cnt < keysetlist->max;
1759 }
1760 EXPORT_SYMBOL_GPL(vcap_keyset_list_add);
1761 
1762 /* Add a actionset to a actionset list */
1763 static bool vcap_actionset_list_add(struct vcap_actionset_list *actionsetlist,
1764 				    enum vcap_actionfield_set actionset)
1765 {
1766 	int idx;
1767 
1768 	if (actionsetlist->cnt < actionsetlist->max) {
1769 		/* Avoid duplicates */
1770 		for (idx = 0; idx < actionsetlist->cnt; ++idx)
1771 			if (actionsetlist->actionsets[idx] == actionset)
1772 				return actionsetlist->cnt < actionsetlist->max;
1773 		actionsetlist->actionsets[actionsetlist->cnt++] = actionset;
1774 	}
1775 	return actionsetlist->cnt < actionsetlist->max;
1776 }
1777 
1778 /* map keyset id to a string with the keyset name */
1779 const char *vcap_keyset_name(struct vcap_control *vctrl,
1780 			     enum vcap_keyfield_set keyset)
1781 {
1782 	return vctrl->stats->keyfield_set_names[keyset];
1783 }
1784 EXPORT_SYMBOL_GPL(vcap_keyset_name);
1785 
1786 /* map key field id to a string with the key name */
1787 const char *vcap_keyfield_name(struct vcap_control *vctrl,
1788 			       enum vcap_key_field key)
1789 {
1790 	return vctrl->stats->keyfield_names[key];
1791 }
1792 EXPORT_SYMBOL_GPL(vcap_keyfield_name);
1793 
1794 /* map actionset id to a string with the actionset name */
1795 const char *vcap_actionset_name(struct vcap_control *vctrl,
1796 				enum vcap_actionfield_set actionset)
1797 {
1798 	return vctrl->stats->actionfield_set_names[actionset];
1799 }
1800 
1801 /* map action field id to a string with the action name */
1802 const char *vcap_actionfield_name(struct vcap_control *vctrl,
1803 				  enum vcap_action_field action)
1804 {
1805 	return vctrl->stats->actionfield_names[action];
1806 }
1807 
1808 /* Return the keyfield that matches a key in a keyset */
1809 static const struct vcap_field *
1810 vcap_find_keyset_keyfield(struct vcap_control *vctrl,
1811 			  enum vcap_type vtype,
1812 			  enum vcap_keyfield_set keyset,
1813 			  enum vcap_key_field key)
1814 {
1815 	const struct vcap_field *fields;
1816 	int idx, count;
1817 
1818 	fields = vcap_keyfields(vctrl, vtype, keyset);
1819 	if (!fields)
1820 		return NULL;
1821 
1822 	/* Iterate the keyfields of the keyset */
1823 	count = vcap_keyfield_count(vctrl, vtype, keyset);
1824 	for (idx = 0; idx < count; ++idx) {
1825 		if (fields[idx].width == 0)
1826 			continue;
1827 
1828 		if (key == idx)
1829 			return &fields[idx];
1830 	}
1831 
1832 	return NULL;
1833 }
1834 
1835 /* Match a list of keys against the keysets available in a vcap type */
1836 static bool _vcap_rule_find_keysets(struct vcap_rule_internal *ri,
1837 				    struct vcap_keyset_list *matches)
1838 {
1839 	const struct vcap_client_keyfield *ckf;
1840 	int keyset, found, keycount, map_size;
1841 	const struct vcap_field **map;
1842 	enum vcap_type vtype;
1843 
1844 	vtype = ri->admin->vtype;
1845 	map = ri->vctrl->vcaps[vtype].keyfield_set_map;
1846 	map_size = ri->vctrl->vcaps[vtype].keyfield_set_size;
1847 
1848 	/* Get a count of the keyfields we want to match */
1849 	keycount = 0;
1850 	list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list)
1851 		++keycount;
1852 
1853 	matches->cnt = 0;
1854 	/* Iterate the keysets of the VCAP */
1855 	for (keyset = 0; keyset < map_size; ++keyset) {
1856 		if (!map[keyset])
1857 			continue;
1858 
1859 		/* Iterate the keys in the rule */
1860 		found = 0;
1861 		list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list)
1862 			if (vcap_find_keyset_keyfield(ri->vctrl, vtype,
1863 						      keyset, ckf->ctrl.key))
1864 				++found;
1865 
1866 		/* Save the keyset if all keyfields were found */
1867 		if (found == keycount)
1868 			if (!vcap_keyset_list_add(matches, keyset))
1869 				/* bail out when the quota is filled */
1870 				break;
1871 	}
1872 
1873 	return matches->cnt > 0;
1874 }
1875 
1876 /* Match a list of keys against the keysets available in a vcap type */
1877 bool vcap_rule_find_keysets(struct vcap_rule *rule,
1878 			    struct vcap_keyset_list *matches)
1879 {
1880 	struct vcap_rule_internal *ri = to_intrule(rule);
1881 
1882 	return _vcap_rule_find_keysets(ri, matches);
1883 }
1884 EXPORT_SYMBOL_GPL(vcap_rule_find_keysets);
1885 
1886 /* Return the actionfield that matches a action in a actionset */
1887 static const struct vcap_field *
1888 vcap_find_actionset_actionfield(struct vcap_control *vctrl,
1889 				enum vcap_type vtype,
1890 				enum vcap_actionfield_set actionset,
1891 				enum vcap_action_field action)
1892 {
1893 	const struct vcap_field *fields;
1894 	int idx, count;
1895 
1896 	fields = vcap_actionfields(vctrl, vtype, actionset);
1897 	if (!fields)
1898 		return NULL;
1899 
1900 	/* Iterate the actionfields of the actionset */
1901 	count = vcap_actionfield_count(vctrl, vtype, actionset);
1902 	for (idx = 0; idx < count; ++idx) {
1903 		if (fields[idx].width == 0)
1904 			continue;
1905 
1906 		if (action == idx)
1907 			return &fields[idx];
1908 	}
1909 
1910 	return NULL;
1911 }
1912 
1913 /* Match a list of actions against the actionsets available in a vcap type */
1914 static bool vcap_rule_find_actionsets(struct vcap_rule_internal *ri,
1915 				      struct vcap_actionset_list *matches)
1916 {
1917 	int actionset, found, actioncount, map_size;
1918 	const struct vcap_client_actionfield *ckf;
1919 	const struct vcap_field **map;
1920 	enum vcap_type vtype;
1921 
1922 	vtype = ri->admin->vtype;
1923 	map = ri->vctrl->vcaps[vtype].actionfield_set_map;
1924 	map_size = ri->vctrl->vcaps[vtype].actionfield_set_size;
1925 
1926 	/* Get a count of the actionfields we want to match */
1927 	actioncount = 0;
1928 	list_for_each_entry(ckf, &ri->data.actionfields, ctrl.list)
1929 		++actioncount;
1930 
1931 	matches->cnt = 0;
1932 	/* Iterate the actionsets of the VCAP */
1933 	for (actionset = 0; actionset < map_size; ++actionset) {
1934 		if (!map[actionset])
1935 			continue;
1936 
1937 		/* Iterate the actions in the rule */
1938 		found = 0;
1939 		list_for_each_entry(ckf, &ri->data.actionfields, ctrl.list)
1940 			if (vcap_find_actionset_actionfield(ri->vctrl, vtype,
1941 							    actionset,
1942 							    ckf->ctrl.action))
1943 				++found;
1944 
1945 		/* Save the actionset if all actionfields were found */
1946 		if (found == actioncount)
1947 			if (!vcap_actionset_list_add(matches, actionset))
1948 				/* bail out when the quota is filled */
1949 				break;
1950 	}
1951 
1952 	return matches->cnt > 0;
1953 }
1954 
1955 /* Validate a rule with respect to available port keys */
1956 int vcap_val_rule(struct vcap_rule *rule, u16 l3_proto)
1957 {
1958 	struct vcap_rule_internal *ri = to_intrule(rule);
1959 	struct vcap_keyset_list matches = {};
1960 	enum vcap_keyfield_set keysets[10];
1961 	int ret;
1962 
1963 	ret = vcap_api_check(ri->vctrl);
1964 	if (ret)
1965 		return ret;
1966 	if (!ri->admin) {
1967 		ri->data.exterr = VCAP_ERR_NO_ADMIN;
1968 		return -EINVAL;
1969 	}
1970 	if (!ri->ndev) {
1971 		ri->data.exterr = VCAP_ERR_NO_NETDEV;
1972 		return -EINVAL;
1973 	}
1974 
1975 	matches.keysets = keysets;
1976 	matches.max = ARRAY_SIZE(keysets);
1977 	if (ri->data.keyset == VCAP_KFS_NO_VALUE) {
1978 		/* Iterate over rule keyfields and select keysets that fits */
1979 		if (!_vcap_rule_find_keysets(ri, &matches)) {
1980 			ri->data.exterr = VCAP_ERR_NO_KEYSET_MATCH;
1981 			return -EINVAL;
1982 		}
1983 	} else {
1984 		/* prepare for keyset validation */
1985 		keysets[0] = ri->data.keyset;
1986 		matches.cnt = 1;
1987 	}
1988 
1989 	/* Pick a keyset that is supported in the port lookups */
1990 	ret = ri->vctrl->ops->validate_keyset(ri->ndev, ri->admin, rule,
1991 					      &matches, l3_proto);
1992 	if (ret < 0) {
1993 		pr_err("%s:%d: keyset validation failed: %d\n",
1994 		       __func__, __LINE__, ret);
1995 		ri->data.exterr = VCAP_ERR_NO_PORT_KEYSET_MATCH;
1996 		return ret;
1997 	}
1998 	/* use the keyset that is supported in the port lookups */
1999 	ret = vcap_set_rule_set_keyset(rule, ret);
2000 	if (ret < 0) {
2001 		pr_err("%s:%d: keyset was not updated: %d\n",
2002 		       __func__, __LINE__, ret);
2003 		return ret;
2004 	}
2005 	if (ri->data.actionset == VCAP_AFS_NO_VALUE) {
2006 		struct vcap_actionset_list matches = {};
2007 		enum vcap_actionfield_set actionsets[10];
2008 
2009 		matches.actionsets = actionsets;
2010 		matches.max = ARRAY_SIZE(actionsets);
2011 
2012 		/* Find an actionset that fits the rule actions */
2013 		if (!vcap_rule_find_actionsets(ri, &matches)) {
2014 			ri->data.exterr = VCAP_ERR_NO_ACTIONSET_MATCH;
2015 			return -EINVAL;
2016 		}
2017 		ret = vcap_set_rule_set_actionset(rule, actionsets[0]);
2018 		if (ret < 0) {
2019 			pr_err("%s:%d: actionset was not updated: %d\n",
2020 			       __func__, __LINE__, ret);
2021 			return ret;
2022 		}
2023 	}
2024 	vcap_add_type_keyfield(rule);
2025 	vcap_add_type_actionfield(rule);
2026 	/* Add default fields to this rule */
2027 	ri->vctrl->ops->add_default_fields(ri->ndev, ri->admin, rule);
2028 
2029 	/* Rule size is the maximum of the entry and action subword count */
2030 	ri->size = max(ri->keyset_sw, ri->actionset_sw);
2031 
2032 	/* Finally check if there is room for the rule in the VCAP */
2033 	return vcap_rule_space(ri->admin, ri->size);
2034 }
2035 EXPORT_SYMBOL_GPL(vcap_val_rule);
2036 
2037 /* Entries are sorted with increasing values of sort_key.
2038  * I.e. Lowest numerical sort_key is first in list.
2039  * In order to locate largest keys first in list we negate the key size with
2040  * (max_size - size).
2041  */
2042 static u32 vcap_sort_key(u32 max_size, u32 size, u8 user, u16 prio)
2043 {
2044 	return ((max_size - size) << 24) | (user << 16) | prio;
2045 }
2046 
2047 /* calculate the address of the next rule after this (lower address and prio) */
2048 static u32 vcap_next_rule_addr(u32 addr, struct vcap_rule_internal *ri)
2049 {
2050 	return ((addr - ri->size) /  ri->size) * ri->size;
2051 }
2052 
2053 /* Assign a unique rule id and autogenerate one if id == 0 */
2054 static u32 vcap_set_rule_id(struct vcap_rule_internal *ri)
2055 {
2056 	if (ri->data.id != 0)
2057 		return ri->data.id;
2058 
2059 	for (u32 next_id = 1; next_id < ~0; ++next_id) {
2060 		if (!vcap_rule_exists(ri->vctrl, next_id)) {
2061 			ri->data.id = next_id;
2062 			break;
2063 		}
2064 	}
2065 	return ri->data.id;
2066 }
2067 
2068 static int vcap_insert_rule(struct vcap_rule_internal *ri,
2069 			    struct vcap_rule_move *move)
2070 {
2071 	int sw_count = ri->vctrl->vcaps[ri->admin->vtype].sw_count;
2072 	struct vcap_rule_internal *duprule, *iter, *elem = NULL;
2073 	struct vcap_admin *admin = ri->admin;
2074 	u32 addr;
2075 
2076 	ri->sort_key = vcap_sort_key(sw_count, ri->size, ri->data.user,
2077 				     ri->data.priority);
2078 
2079 	/* Insert the new rule in the list of rule based on the sort key
2080 	 * If the rule needs to be  inserted between existing rules then move
2081 	 * these rules to make room for the new rule and update their start
2082 	 * address.
2083 	 */
2084 	list_for_each_entry(iter, &admin->rules, list) {
2085 		if (ri->sort_key < iter->sort_key) {
2086 			elem = iter;
2087 			break;
2088 		}
2089 	}
2090 
2091 	if (!elem) {
2092 		ri->addr = vcap_next_rule_addr(admin->last_used_addr, ri);
2093 		admin->last_used_addr = ri->addr;
2094 
2095 		/* Add a copy of the rule to the VCAP list */
2096 		duprule = vcap_dup_rule(ri, ri->state == VCAP_RS_DISABLED);
2097 		if (IS_ERR(duprule))
2098 			return PTR_ERR(duprule);
2099 
2100 		list_add_tail(&duprule->list, &admin->rules);
2101 		return 0;
2102 	}
2103 
2104 	/* Reuse the space of the current rule */
2105 	addr = elem->addr + elem->size;
2106 	ri->addr = vcap_next_rule_addr(addr, ri);
2107 	addr = ri->addr;
2108 
2109 	/* Add a copy of the rule to the VCAP list */
2110 	duprule = vcap_dup_rule(ri, ri->state == VCAP_RS_DISABLED);
2111 	if (IS_ERR(duprule))
2112 		return PTR_ERR(duprule);
2113 
2114 	/* Add before the current entry */
2115 	list_add_tail(&duprule->list, &elem->list);
2116 
2117 	/* Update the current rule */
2118 	elem->addr = vcap_next_rule_addr(addr, elem);
2119 	addr = elem->addr;
2120 
2121 	/* Update the address in the remaining rules in the list */
2122 	list_for_each_entry_continue(elem, &admin->rules, list) {
2123 		elem->addr = vcap_next_rule_addr(addr, elem);
2124 		addr = elem->addr;
2125 	}
2126 
2127 	/* Update the move info */
2128 	move->addr = admin->last_used_addr;
2129 	move->count = ri->addr - addr;
2130 	move->offset = admin->last_used_addr - addr;
2131 	admin->last_used_addr = addr;
2132 	return 0;
2133 }
2134 
2135 static void vcap_move_rules(struct vcap_rule_internal *ri,
2136 			    struct vcap_rule_move *move)
2137 {
2138 	ri->vctrl->ops->move(ri->ndev, ri->admin, move->addr,
2139 			 move->offset, move->count);
2140 }
2141 
2142 /* Check if the chain is already used to enable a VCAP lookup for this port */
2143 static bool vcap_is_chain_used(struct vcap_control *vctrl,
2144 			       struct net_device *ndev, int src_cid)
2145 {
2146 	struct vcap_enabled_port *eport;
2147 	struct vcap_admin *admin;
2148 
2149 	list_for_each_entry(admin, &vctrl->list, list)
2150 		list_for_each_entry(eport, &admin->enabled, list)
2151 			if (eport->src_cid == src_cid && eport->ndev == ndev)
2152 				return true;
2153 
2154 	return false;
2155 }
2156 
2157 /* Fetch the next chain in the enabled list for the port */
2158 static int vcap_get_next_chain(struct vcap_control *vctrl,
2159 			       struct net_device *ndev,
2160 			       int dst_cid)
2161 {
2162 	struct vcap_enabled_port *eport;
2163 	struct vcap_admin *admin;
2164 
2165 	list_for_each_entry(admin, &vctrl->list, list) {
2166 		list_for_each_entry(eport, &admin->enabled, list) {
2167 			if (eport->ndev != ndev)
2168 				continue;
2169 			if (eport->src_cid == dst_cid)
2170 				return eport->dst_cid;
2171 		}
2172 	}
2173 
2174 	return 0;
2175 }
2176 
2177 static bool vcap_path_exist(struct vcap_control *vctrl, struct net_device *ndev,
2178 			    int dst_cid)
2179 {
2180 	struct vcap_enabled_port *eport = NULL;
2181 	struct vcap_enabled_port *elem;
2182 	struct vcap_admin *admin;
2183 	int tmp;
2184 
2185 	if (dst_cid == 0) /* Chain zero is always available */
2186 		return true;
2187 
2188 	/* Find first entry that starts from chain 0*/
2189 	list_for_each_entry(admin, &vctrl->list, list) {
2190 		list_for_each_entry(elem, &admin->enabled, list) {
2191 			if (elem->src_cid == 0 && elem->ndev == ndev) {
2192 				eport = elem;
2193 				break;
2194 			}
2195 		}
2196 		if (eport)
2197 			break;
2198 	}
2199 
2200 	if (!eport)
2201 		return false;
2202 
2203 	tmp = eport->dst_cid;
2204 	while (tmp != dst_cid && tmp != 0)
2205 		tmp = vcap_get_next_chain(vctrl, ndev, tmp);
2206 
2207 	return !!tmp;
2208 }
2209 
2210 /* Internal clients can always store their rules in HW
2211  * External clients can store their rules if the chain is enabled all
2212  * the way from chain 0, otherwise the rule will be cached until
2213  * the chain is enabled.
2214  */
2215 static void vcap_rule_set_state(struct vcap_rule_internal *ri)
2216 {
2217 	if (ri->data.user <= VCAP_USER_QOS)
2218 		ri->state = VCAP_RS_PERMANENT;
2219 	else if (vcap_path_exist(ri->vctrl, ri->ndev, ri->data.vcap_chain_id))
2220 		ri->state = VCAP_RS_ENABLED;
2221 	else
2222 		ri->state = VCAP_RS_DISABLED;
2223 }
2224 
2225 /* Encode and write a validated rule to the VCAP */
2226 int vcap_add_rule(struct vcap_rule *rule)
2227 {
2228 	struct vcap_rule_internal *ri = to_intrule(rule);
2229 	struct vcap_rule_move move = {0};
2230 	struct vcap_counter ctr = {0};
2231 	int ret;
2232 
2233 	ret = vcap_api_check(ri->vctrl);
2234 	if (ret)
2235 		return ret;
2236 	/* Insert the new rule in the list of vcap rules */
2237 	mutex_lock(&ri->admin->lock);
2238 
2239 	vcap_rule_set_state(ri);
2240 	ret = vcap_insert_rule(ri, &move);
2241 	if (ret < 0) {
2242 		pr_err("%s:%d: could not insert rule in vcap list: %d\n",
2243 		       __func__, __LINE__, ret);
2244 		goto out;
2245 	}
2246 	if (move.count > 0)
2247 		vcap_move_rules(ri, &move);
2248 
2249 	if (ri->state == VCAP_RS_DISABLED) {
2250 		/* Erase the rule area */
2251 		ri->vctrl->ops->init(ri->ndev, ri->admin, ri->addr, ri->size);
2252 		goto out;
2253 	}
2254 
2255 	vcap_erase_cache(ri);
2256 	ret = vcap_encode_rule(ri);
2257 	if (ret) {
2258 		pr_err("%s:%d: rule encoding error: %d\n", __func__, __LINE__, ret);
2259 		goto out;
2260 	}
2261 
2262 	ret = vcap_write_rule(ri);
2263 	if (ret) {
2264 		pr_err("%s:%d: rule write error: %d\n", __func__, __LINE__, ret);
2265 		goto out;
2266 	}
2267 	/* Set the counter to zero */
2268 	ret = vcap_write_counter(ri, &ctr);
2269 out:
2270 	mutex_unlock(&ri->admin->lock);
2271 	return ret;
2272 }
2273 EXPORT_SYMBOL_GPL(vcap_add_rule);
2274 
2275 /* Allocate a new rule with the provided arguments */
2276 struct vcap_rule *vcap_alloc_rule(struct vcap_control *vctrl,
2277 				  struct net_device *ndev, int vcap_chain_id,
2278 				  enum vcap_user user, u16 priority,
2279 				  u32 id)
2280 {
2281 	struct vcap_rule_internal *ri;
2282 	struct vcap_admin *admin;
2283 	int err, maxsize;
2284 
2285 	err = vcap_api_check(vctrl);
2286 	if (err)
2287 		return ERR_PTR(err);
2288 	if (!ndev)
2289 		return ERR_PTR(-ENODEV);
2290 	/* Get the VCAP instance */
2291 	admin = vcap_find_admin(vctrl, vcap_chain_id);
2292 	if (!admin)
2293 		return ERR_PTR(-ENOENT);
2294 	/* Sanity check that this VCAP is supported on this platform */
2295 	if (vctrl->vcaps[admin->vtype].rows == 0)
2296 		return ERR_PTR(-EINVAL);
2297 
2298 	mutex_lock(&admin->lock);
2299 	/* Check if a rule with this id already exists */
2300 	if (vcap_rule_exists(vctrl, id)) {
2301 		err = -EINVAL;
2302 		goto out_unlock;
2303 	}
2304 
2305 	/* Check if there is room for the rule in the block(s) of the VCAP */
2306 	maxsize = vctrl->vcaps[admin->vtype].sw_count; /* worst case rule size */
2307 	if (vcap_rule_space(admin, maxsize)) {
2308 		err = -ENOSPC;
2309 		goto out_unlock;
2310 	}
2311 
2312 	/* Create a container for the rule and return it */
2313 	ri = kzalloc(sizeof(*ri), GFP_KERNEL);
2314 	if (!ri) {
2315 		err = -ENOMEM;
2316 		goto out_unlock;
2317 	}
2318 
2319 	ri->data.vcap_chain_id = vcap_chain_id;
2320 	ri->data.user = user;
2321 	ri->data.priority = priority;
2322 	ri->data.id = id;
2323 	ri->data.keyset = VCAP_KFS_NO_VALUE;
2324 	ri->data.actionset = VCAP_AFS_NO_VALUE;
2325 	INIT_LIST_HEAD(&ri->list);
2326 	INIT_LIST_HEAD(&ri->data.keyfields);
2327 	INIT_LIST_HEAD(&ri->data.actionfields);
2328 	ri->ndev = ndev;
2329 	ri->admin = admin; /* refer to the vcap instance */
2330 	ri->vctrl = vctrl; /* refer to the client */
2331 
2332 	if (vcap_set_rule_id(ri) == 0) {
2333 		err = -EINVAL;
2334 		goto out_free;
2335 	}
2336 
2337 	mutex_unlock(&admin->lock);
2338 	return (struct vcap_rule *)ri;
2339 
2340 out_free:
2341 	kfree(ri);
2342 out_unlock:
2343 	mutex_unlock(&admin->lock);
2344 	return ERR_PTR(err);
2345 
2346 }
2347 EXPORT_SYMBOL_GPL(vcap_alloc_rule);
2348 
2349 /* Free mem of a rule owned by client after the rule as been added to the VCAP */
2350 void vcap_free_rule(struct vcap_rule *rule)
2351 {
2352 	struct vcap_rule_internal *ri = to_intrule(rule);
2353 	struct vcap_client_actionfield *caf, *next_caf;
2354 	struct vcap_client_keyfield *ckf, *next_ckf;
2355 
2356 	/* Deallocate the list of keys and actions */
2357 	list_for_each_entry_safe(ckf, next_ckf, &ri->data.keyfields, ctrl.list) {
2358 		list_del(&ckf->ctrl.list);
2359 		kfree(ckf);
2360 	}
2361 	list_for_each_entry_safe(caf, next_caf, &ri->data.actionfields, ctrl.list) {
2362 		list_del(&caf->ctrl.list);
2363 		kfree(caf);
2364 	}
2365 	/* Deallocate the rule */
2366 	kfree(rule);
2367 }
2368 EXPORT_SYMBOL_GPL(vcap_free_rule);
2369 
2370 /* Decode a rule from the VCAP cache and return a copy */
2371 struct vcap_rule *vcap_decode_rule(struct vcap_rule_internal *elem)
2372 {
2373 	struct vcap_rule_internal *ri;
2374 	int err;
2375 
2376 	ri = vcap_dup_rule(elem, elem->state == VCAP_RS_DISABLED);
2377 	if (IS_ERR(ri))
2378 		return ERR_PTR(PTR_ERR(ri));
2379 
2380 	if (ri->state == VCAP_RS_DISABLED)
2381 		goto out;
2382 
2383 	err = vcap_read_rule(ri);
2384 	if (err)
2385 		return ERR_PTR(err);
2386 
2387 	err = vcap_decode_keyset(ri);
2388 	if (err)
2389 		return ERR_PTR(err);
2390 
2391 	err = vcap_decode_actionset(ri);
2392 	if (err)
2393 		return ERR_PTR(err);
2394 
2395 out:
2396 	return &ri->data;
2397 }
2398 
2399 struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id)
2400 {
2401 	struct vcap_rule_internal *elem;
2402 	struct vcap_rule *rule;
2403 	int err;
2404 
2405 	err = vcap_api_check(vctrl);
2406 	if (err)
2407 		return ERR_PTR(err);
2408 
2409 	elem = vcap_get_locked_rule(vctrl, id);
2410 	if (!elem)
2411 		return NULL;
2412 
2413 	rule = vcap_decode_rule(elem);
2414 	mutex_unlock(&elem->admin->lock);
2415 	return rule;
2416 }
2417 EXPORT_SYMBOL_GPL(vcap_get_rule);
2418 
2419 /* Update existing rule */
2420 int vcap_mod_rule(struct vcap_rule *rule)
2421 {
2422 	struct vcap_rule_internal *ri = to_intrule(rule);
2423 	struct vcap_counter ctr;
2424 	int err;
2425 
2426 	err = vcap_api_check(ri->vctrl);
2427 	if (err)
2428 		return err;
2429 
2430 	if (!vcap_get_locked_rule(ri->vctrl, ri->data.id))
2431 		return -ENOENT;
2432 
2433 	vcap_rule_set_state(ri);
2434 	if (ri->state == VCAP_RS_DISABLED)
2435 		goto out;
2436 
2437 	/* Encode the bitstreams to the VCAP cache */
2438 	vcap_erase_cache(ri);
2439 	err = vcap_encode_rule(ri);
2440 	if (err)
2441 		goto out;
2442 
2443 	err = vcap_write_rule(ri);
2444 	if (err)
2445 		goto out;
2446 
2447 	memset(&ctr, 0, sizeof(ctr));
2448 	err =  vcap_write_counter(ri, &ctr);
2449 
2450 out:
2451 	mutex_unlock(&ri->admin->lock);
2452 	return err;
2453 }
2454 EXPORT_SYMBOL_GPL(vcap_mod_rule);
2455 
2456 /* Return the alignment offset for a new rule address */
2457 static int vcap_valid_rule_move(struct vcap_rule_internal *el, int offset)
2458 {
2459 	return (el->addr + offset) % el->size;
2460 }
2461 
2462 /* Update the rule address with an offset */
2463 static void vcap_adjust_rule_addr(struct vcap_rule_internal *el, int offset)
2464 {
2465 	el->addr += offset;
2466 }
2467 
2468 /* Rules needs to be moved to fill the gap of the deleted rule */
2469 static int vcap_fill_rule_gap(struct vcap_rule_internal *ri)
2470 {
2471 	struct vcap_admin *admin = ri->admin;
2472 	struct vcap_rule_internal *elem;
2473 	struct vcap_rule_move move;
2474 	int gap = 0, offset = 0;
2475 
2476 	/* If the first rule is deleted: Move other rules to the top */
2477 	if (list_is_first(&ri->list, &admin->rules))
2478 		offset = admin->last_valid_addr + 1 - ri->addr - ri->size;
2479 
2480 	/* Locate gaps between odd size rules and adjust the move */
2481 	elem = ri;
2482 	list_for_each_entry_continue(elem, &admin->rules, list)
2483 		gap += vcap_valid_rule_move(elem, ri->size);
2484 
2485 	/* Update the address in the remaining rules in the list */
2486 	elem = ri;
2487 	list_for_each_entry_continue(elem, &admin->rules, list)
2488 		vcap_adjust_rule_addr(elem, ri->size + gap + offset);
2489 
2490 	/* Update the move info */
2491 	move.addr = admin->last_used_addr;
2492 	move.count = ri->addr - admin->last_used_addr - gap;
2493 	move.offset = -(ri->size + gap + offset);
2494 
2495 	/* Do the actual move operation */
2496 	vcap_move_rules(ri, &move);
2497 
2498 	return gap + offset;
2499 }
2500 
2501 /* Delete rule in a VCAP instance */
2502 int vcap_del_rule(struct vcap_control *vctrl, struct net_device *ndev, u32 id)
2503 {
2504 	struct vcap_rule_internal *ri, *elem;
2505 	struct vcap_admin *admin;
2506 	int gap = 0, err;
2507 
2508 	/* This will later also handle rule moving */
2509 	if (!ndev)
2510 		return -ENODEV;
2511 	err = vcap_api_check(vctrl);
2512 	if (err)
2513 		return err;
2514 	/* Look for the rule id in all vcaps */
2515 	ri = vcap_get_locked_rule(vctrl, id);
2516 	if (!ri)
2517 		return -ENOENT;
2518 
2519 	admin = ri->admin;
2520 
2521 	if (ri->addr > admin->last_used_addr)
2522 		gap = vcap_fill_rule_gap(ri);
2523 
2524 	/* Delete the rule from the list of rules and the cache */
2525 	list_del(&ri->list);
2526 	vctrl->ops->init(ndev, admin, admin->last_used_addr, ri->size + gap);
2527 	vcap_free_rule(&ri->data);
2528 
2529 	/* Update the last used address, set to default when no rules */
2530 	if (list_empty(&admin->rules)) {
2531 		admin->last_used_addr = admin->last_valid_addr + 1;
2532 	} else {
2533 		elem = list_last_entry(&admin->rules, struct vcap_rule_internal,
2534 				       list);
2535 		admin->last_used_addr = elem->addr;
2536 	}
2537 
2538 	mutex_unlock(&admin->lock);
2539 	return err;
2540 }
2541 EXPORT_SYMBOL_GPL(vcap_del_rule);
2542 
2543 /* Delete all rules in the VCAP instance */
2544 int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin)
2545 {
2546 	struct vcap_enabled_port *eport, *next_eport;
2547 	struct vcap_rule_internal *ri, *next_ri;
2548 	int ret = vcap_api_check(vctrl);
2549 
2550 	if (ret)
2551 		return ret;
2552 
2553 	mutex_lock(&admin->lock);
2554 	list_for_each_entry_safe(ri, next_ri, &admin->rules, list) {
2555 		vctrl->ops->init(ri->ndev, admin, ri->addr, ri->size);
2556 		list_del(&ri->list);
2557 		vcap_free_rule(&ri->data);
2558 	}
2559 	admin->last_used_addr = admin->last_valid_addr;
2560 
2561 	/* Remove list of enabled ports */
2562 	list_for_each_entry_safe(eport, next_eport, &admin->enabled, list) {
2563 		list_del(&eport->list);
2564 		kfree(eport);
2565 	}
2566 	mutex_unlock(&admin->lock);
2567 
2568 	return 0;
2569 }
2570 EXPORT_SYMBOL_GPL(vcap_del_rules);
2571 
2572 /* Find a client key field in a rule */
2573 static struct vcap_client_keyfield *
2574 vcap_find_keyfield(struct vcap_rule *rule, enum vcap_key_field key)
2575 {
2576 	struct vcap_rule_internal *ri = to_intrule(rule);
2577 	struct vcap_client_keyfield *ckf;
2578 
2579 	list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list)
2580 		if (ckf->ctrl.key == key)
2581 			return ckf;
2582 	return NULL;
2583 }
2584 
2585 /* Find information on a key field in a rule */
2586 const struct vcap_field *vcap_lookup_keyfield(struct vcap_rule *rule,
2587 					      enum vcap_key_field key)
2588 {
2589 	struct vcap_rule_internal *ri = to_intrule(rule);
2590 	enum vcap_keyfield_set keyset = rule->keyset;
2591 	enum vcap_type vt = ri->admin->vtype;
2592 	const struct vcap_field *fields;
2593 
2594 	if (keyset == VCAP_KFS_NO_VALUE)
2595 		return NULL;
2596 	fields = vcap_keyfields(ri->vctrl, vt, keyset);
2597 	if (!fields)
2598 		return NULL;
2599 	return &fields[key];
2600 }
2601 EXPORT_SYMBOL_GPL(vcap_lookup_keyfield);
2602 
2603 /* Check if the keyfield is already in the rule */
2604 static bool vcap_keyfield_unique(struct vcap_rule *rule,
2605 				 enum vcap_key_field key)
2606 {
2607 	struct vcap_rule_internal *ri = to_intrule(rule);
2608 	const struct vcap_client_keyfield *ckf;
2609 
2610 	list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list)
2611 		if (ckf->ctrl.key == key)
2612 			return false;
2613 	return true;
2614 }
2615 
2616 /* Check if the keyfield is in the keyset */
2617 static bool vcap_keyfield_match_keyset(struct vcap_rule *rule,
2618 				       enum vcap_key_field key)
2619 {
2620 	struct vcap_rule_internal *ri = to_intrule(rule);
2621 	enum vcap_keyfield_set keyset = rule->keyset;
2622 	enum vcap_type vt = ri->admin->vtype;
2623 	const struct vcap_field *fields;
2624 
2625 	/* the field is accepted if the rule has no keyset yet */
2626 	if (keyset == VCAP_KFS_NO_VALUE)
2627 		return true;
2628 	fields = vcap_keyfields(ri->vctrl, vt, keyset);
2629 	if (!fields)
2630 		return false;
2631 	/* if there is a width there is a way */
2632 	return fields[key].width > 0;
2633 }
2634 
2635 static int vcap_rule_add_key(struct vcap_rule *rule,
2636 			     enum vcap_key_field key,
2637 			     enum vcap_field_type ftype,
2638 			     struct vcap_client_keyfield_data *data)
2639 {
2640 	struct vcap_rule_internal *ri = to_intrule(rule);
2641 	struct vcap_client_keyfield *field;
2642 
2643 	if (!vcap_keyfield_unique(rule, key)) {
2644 		pr_warn("%s:%d: keyfield %s is already in the rule\n",
2645 			__func__, __LINE__,
2646 			vcap_keyfield_name(ri->vctrl, key));
2647 		return -EINVAL;
2648 	}
2649 
2650 	if (!vcap_keyfield_match_keyset(rule, key)) {
2651 		pr_err("%s:%d: keyfield %s does not belong in the rule keyset\n",
2652 		       __func__, __LINE__,
2653 		       vcap_keyfield_name(ri->vctrl, key));
2654 		return -EINVAL;
2655 	}
2656 
2657 	field = kzalloc(sizeof(*field), GFP_KERNEL);
2658 	if (!field)
2659 		return -ENOMEM;
2660 	memcpy(&field->data, data, sizeof(field->data));
2661 	field->ctrl.key = key;
2662 	field->ctrl.type = ftype;
2663 	list_add_tail(&field->ctrl.list, &rule->keyfields);
2664 	return 0;
2665 }
2666 
2667 static void vcap_rule_set_key_bitsize(struct vcap_u1_key *u1, enum vcap_bit val)
2668 {
2669 	switch (val) {
2670 	case VCAP_BIT_0:
2671 		u1->value = 0;
2672 		u1->mask = 1;
2673 		break;
2674 	case VCAP_BIT_1:
2675 		u1->value = 1;
2676 		u1->mask = 1;
2677 		break;
2678 	case VCAP_BIT_ANY:
2679 		u1->value = 0;
2680 		u1->mask = 0;
2681 		break;
2682 	}
2683 }
2684 
2685 /* Add a bit key with value and mask to the rule */
2686 int vcap_rule_add_key_bit(struct vcap_rule *rule, enum vcap_key_field key,
2687 			  enum vcap_bit val)
2688 {
2689 	struct vcap_client_keyfield_data data;
2690 
2691 	vcap_rule_set_key_bitsize(&data.u1, val);
2692 	return vcap_rule_add_key(rule, key, VCAP_FIELD_BIT, &data);
2693 }
2694 EXPORT_SYMBOL_GPL(vcap_rule_add_key_bit);
2695 
2696 /* Add a 32 bit key field with value and mask to the rule */
2697 int vcap_rule_add_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
2698 			  u32 value, u32 mask)
2699 {
2700 	struct vcap_client_keyfield_data data;
2701 
2702 	data.u32.value = value;
2703 	data.u32.mask = mask;
2704 	return vcap_rule_add_key(rule, key, VCAP_FIELD_U32, &data);
2705 }
2706 EXPORT_SYMBOL_GPL(vcap_rule_add_key_u32);
2707 
2708 /* Add a 48 bit key with value and mask to the rule */
2709 int vcap_rule_add_key_u48(struct vcap_rule *rule, enum vcap_key_field key,
2710 			  struct vcap_u48_key *fieldval)
2711 {
2712 	struct vcap_client_keyfield_data data;
2713 
2714 	memcpy(&data.u48, fieldval, sizeof(data.u48));
2715 	return vcap_rule_add_key(rule, key, VCAP_FIELD_U48, &data);
2716 }
2717 EXPORT_SYMBOL_GPL(vcap_rule_add_key_u48);
2718 
2719 /* Add a 72 bit key with value and mask to the rule */
2720 int vcap_rule_add_key_u72(struct vcap_rule *rule, enum vcap_key_field key,
2721 			  struct vcap_u72_key *fieldval)
2722 {
2723 	struct vcap_client_keyfield_data data;
2724 
2725 	memcpy(&data.u72, fieldval, sizeof(data.u72));
2726 	return vcap_rule_add_key(rule, key, VCAP_FIELD_U72, &data);
2727 }
2728 EXPORT_SYMBOL_GPL(vcap_rule_add_key_u72);
2729 
2730 /* Add a 128 bit key with value and mask to the rule */
2731 int vcap_rule_add_key_u128(struct vcap_rule *rule, enum vcap_key_field key,
2732 			   struct vcap_u128_key *fieldval)
2733 {
2734 	struct vcap_client_keyfield_data data;
2735 
2736 	memcpy(&data.u128, fieldval, sizeof(data.u128));
2737 	return vcap_rule_add_key(rule, key, VCAP_FIELD_U128, &data);
2738 }
2739 EXPORT_SYMBOL_GPL(vcap_rule_add_key_u128);
2740 
2741 int vcap_rule_get_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
2742 			  u32 *value, u32 *mask)
2743 {
2744 	struct vcap_client_keyfield *ckf;
2745 
2746 	ckf = vcap_find_keyfield(rule, key);
2747 	if (!ckf)
2748 		return -ENOENT;
2749 
2750 	*value = ckf->data.u32.value;
2751 	*mask = ckf->data.u32.mask;
2752 
2753 	return 0;
2754 }
2755 EXPORT_SYMBOL_GPL(vcap_rule_get_key_u32);
2756 
2757 /* Find a client action field in a rule */
2758 struct vcap_client_actionfield *
2759 vcap_find_actionfield(struct vcap_rule *rule, enum vcap_action_field act)
2760 {
2761 	struct vcap_rule_internal *ri = (struct vcap_rule_internal *)rule;
2762 	struct vcap_client_actionfield *caf;
2763 
2764 	list_for_each_entry(caf, &ri->data.actionfields, ctrl.list)
2765 		if (caf->ctrl.action == act)
2766 			return caf;
2767 	return NULL;
2768 }
2769 EXPORT_SYMBOL_GPL(vcap_find_actionfield);
2770 
2771 /* Check if the actionfield is already in the rule */
2772 static bool vcap_actionfield_unique(struct vcap_rule *rule,
2773 				    enum vcap_action_field act)
2774 {
2775 	struct vcap_rule_internal *ri = to_intrule(rule);
2776 	const struct vcap_client_actionfield *caf;
2777 
2778 	list_for_each_entry(caf, &ri->data.actionfields, ctrl.list)
2779 		if (caf->ctrl.action == act)
2780 			return false;
2781 	return true;
2782 }
2783 
2784 /* Check if the actionfield is in the actionset */
2785 static bool vcap_actionfield_match_actionset(struct vcap_rule *rule,
2786 					     enum vcap_action_field action)
2787 {
2788 	enum vcap_actionfield_set actionset = rule->actionset;
2789 	struct vcap_rule_internal *ri = to_intrule(rule);
2790 	enum vcap_type vt = ri->admin->vtype;
2791 	const struct vcap_field *fields;
2792 
2793 	/* the field is accepted if the rule has no actionset yet */
2794 	if (actionset == VCAP_AFS_NO_VALUE)
2795 		return true;
2796 	fields = vcap_actionfields(ri->vctrl, vt, actionset);
2797 	if (!fields)
2798 		return false;
2799 	/* if there is a width there is a way */
2800 	return fields[action].width > 0;
2801 }
2802 
2803 static int vcap_rule_add_action(struct vcap_rule *rule,
2804 				enum vcap_action_field action,
2805 				enum vcap_field_type ftype,
2806 				struct vcap_client_actionfield_data *data)
2807 {
2808 	struct vcap_rule_internal *ri = to_intrule(rule);
2809 	struct vcap_client_actionfield *field;
2810 
2811 	if (!vcap_actionfield_unique(rule, action)) {
2812 		pr_warn("%s:%d: actionfield %s is already in the rule\n",
2813 			__func__, __LINE__,
2814 			vcap_actionfield_name(ri->vctrl, action));
2815 		return -EINVAL;
2816 	}
2817 
2818 	if (!vcap_actionfield_match_actionset(rule, action)) {
2819 		pr_err("%s:%d: actionfield %s does not belong in the rule actionset\n",
2820 		       __func__, __LINE__,
2821 		       vcap_actionfield_name(ri->vctrl, action));
2822 		return -EINVAL;
2823 	}
2824 
2825 	field = kzalloc(sizeof(*field), GFP_KERNEL);
2826 	if (!field)
2827 		return -ENOMEM;
2828 	memcpy(&field->data, data, sizeof(field->data));
2829 	field->ctrl.action = action;
2830 	field->ctrl.type = ftype;
2831 	list_add_tail(&field->ctrl.list, &rule->actionfields);
2832 	return 0;
2833 }
2834 
2835 static void vcap_rule_set_action_bitsize(struct vcap_u1_action *u1,
2836 					 enum vcap_bit val)
2837 {
2838 	switch (val) {
2839 	case VCAP_BIT_0:
2840 		u1->value = 0;
2841 		break;
2842 	case VCAP_BIT_1:
2843 		u1->value = 1;
2844 		break;
2845 	case VCAP_BIT_ANY:
2846 		u1->value = 0;
2847 		break;
2848 	}
2849 }
2850 
2851 /* Add a bit action with value to the rule */
2852 int vcap_rule_add_action_bit(struct vcap_rule *rule,
2853 			     enum vcap_action_field action,
2854 			     enum vcap_bit val)
2855 {
2856 	struct vcap_client_actionfield_data data;
2857 
2858 	vcap_rule_set_action_bitsize(&data.u1, val);
2859 	return vcap_rule_add_action(rule, action, VCAP_FIELD_BIT, &data);
2860 }
2861 EXPORT_SYMBOL_GPL(vcap_rule_add_action_bit);
2862 
2863 /* Add a 32 bit action field with value to the rule */
2864 int vcap_rule_add_action_u32(struct vcap_rule *rule,
2865 			     enum vcap_action_field action,
2866 			     u32 value)
2867 {
2868 	struct vcap_client_actionfield_data data;
2869 
2870 	data.u32.value = value;
2871 	return vcap_rule_add_action(rule, action, VCAP_FIELD_U32, &data);
2872 }
2873 EXPORT_SYMBOL_GPL(vcap_rule_add_action_u32);
2874 
2875 static int vcap_read_counter(struct vcap_rule_internal *ri,
2876 			     struct vcap_counter *ctr)
2877 {
2878 	struct vcap_admin *admin = ri->admin;
2879 
2880 	ri->vctrl->ops->update(ri->ndev, admin, VCAP_CMD_READ, VCAP_SEL_COUNTER,
2881 			       ri->addr);
2882 	ri->vctrl->ops->cache_read(ri->ndev, admin, VCAP_SEL_COUNTER,
2883 				   ri->counter_id, 0);
2884 	ctr->value = admin->cache.counter;
2885 	ctr->sticky = admin->cache.sticky;
2886 	return 0;
2887 }
2888 
2889 /* Copy to host byte order */
2890 void vcap_netbytes_copy(u8 *dst, u8 *src, int count)
2891 {
2892 	int idx;
2893 
2894 	for (idx = 0; idx < count; ++idx, ++dst)
2895 		*dst = src[count - idx - 1];
2896 }
2897 EXPORT_SYMBOL_GPL(vcap_netbytes_copy);
2898 
2899 /* Convert validation error code into tc extact error message */
2900 void vcap_set_tc_exterr(struct flow_cls_offload *fco, struct vcap_rule *vrule)
2901 {
2902 	switch (vrule->exterr) {
2903 	case VCAP_ERR_NONE:
2904 		break;
2905 	case VCAP_ERR_NO_ADMIN:
2906 		NL_SET_ERR_MSG_MOD(fco->common.extack,
2907 				   "Missing VCAP instance");
2908 		break;
2909 	case VCAP_ERR_NO_NETDEV:
2910 		NL_SET_ERR_MSG_MOD(fco->common.extack,
2911 				   "Missing network interface");
2912 		break;
2913 	case VCAP_ERR_NO_KEYSET_MATCH:
2914 		NL_SET_ERR_MSG_MOD(fco->common.extack,
2915 				   "No keyset matched the filter keys");
2916 		break;
2917 	case VCAP_ERR_NO_ACTIONSET_MATCH:
2918 		NL_SET_ERR_MSG_MOD(fco->common.extack,
2919 				   "No actionset matched the filter actions");
2920 		break;
2921 	case VCAP_ERR_NO_PORT_KEYSET_MATCH:
2922 		NL_SET_ERR_MSG_MOD(fco->common.extack,
2923 				   "No port keyset matched the filter keys");
2924 		break;
2925 	}
2926 }
2927 EXPORT_SYMBOL_GPL(vcap_set_tc_exterr);
2928 
2929 /* Write a rule to VCAP HW to enable it */
2930 static int vcap_enable_rule(struct vcap_rule_internal *ri)
2931 {
2932 	struct vcap_client_actionfield *af, *naf;
2933 	struct vcap_client_keyfield *kf, *nkf;
2934 	int err;
2935 
2936 	vcap_erase_cache(ri);
2937 	err = vcap_encode_rule(ri);
2938 	if (err)
2939 		goto out;
2940 	err = vcap_write_rule(ri);
2941 	if (err)
2942 		goto out;
2943 
2944 	/* Deallocate the list of keys and actions */
2945 	list_for_each_entry_safe(kf, nkf, &ri->data.keyfields, ctrl.list) {
2946 		list_del(&kf->ctrl.list);
2947 		kfree(kf);
2948 	}
2949 	list_for_each_entry_safe(af, naf, &ri->data.actionfields, ctrl.list) {
2950 		list_del(&af->ctrl.list);
2951 		kfree(af);
2952 	}
2953 	ri->state = VCAP_RS_ENABLED;
2954 out:
2955 	return err;
2956 }
2957 
2958 /* Enable all disabled rules for a specific chain/port in the VCAP HW */
2959 static int vcap_enable_rules(struct vcap_control *vctrl,
2960 			     struct net_device *ndev, int chain)
2961 {
2962 	int next_chain = chain + VCAP_CID_LOOKUP_SIZE;
2963 	struct vcap_rule_internal *ri;
2964 	struct vcap_admin *admin;
2965 	int err = 0;
2966 
2967 	list_for_each_entry(admin, &vctrl->list, list) {
2968 		if (!(chain >= admin->first_cid && chain <= admin->last_cid))
2969 			continue;
2970 
2971 		/* Found the admin, now find the offloadable rules */
2972 		mutex_lock(&admin->lock);
2973 		list_for_each_entry(ri, &admin->rules, list) {
2974 			/* Is the rule in the lookup defined by the chain */
2975 			if (!(ri->data.vcap_chain_id >= chain &&
2976 			      ri->data.vcap_chain_id < next_chain)) {
2977 				continue;
2978 			}
2979 
2980 			if (ri->ndev != ndev)
2981 				continue;
2982 
2983 			if (ri->state != VCAP_RS_DISABLED)
2984 				continue;
2985 
2986 			err = vcap_enable_rule(ri);
2987 			if (err)
2988 				break;
2989 		}
2990 		mutex_unlock(&admin->lock);
2991 		if (err)
2992 			break;
2993 	}
2994 	return err;
2995 }
2996 
2997 /* Read and erase a rule from VCAP HW to disable it */
2998 static int vcap_disable_rule(struct vcap_rule_internal *ri)
2999 {
3000 	int err;
3001 
3002 	err = vcap_read_rule(ri);
3003 	if (err)
3004 		return err;
3005 	err = vcap_decode_keyset(ri);
3006 	if (err)
3007 		return err;
3008 	err = vcap_decode_actionset(ri);
3009 	if (err)
3010 		return err;
3011 
3012 	ri->state = VCAP_RS_DISABLED;
3013 	ri->vctrl->ops->init(ri->ndev, ri->admin, ri->addr, ri->size);
3014 	return 0;
3015 }
3016 
3017 /* Disable all enabled rules for a specific chain/port in the VCAP HW */
3018 static int vcap_disable_rules(struct vcap_control *vctrl,
3019 			      struct net_device *ndev, int chain)
3020 {
3021 	struct vcap_rule_internal *ri;
3022 	struct vcap_admin *admin;
3023 	int err = 0;
3024 
3025 	list_for_each_entry(admin, &vctrl->list, list) {
3026 		if (!(chain >= admin->first_cid && chain <= admin->last_cid))
3027 			continue;
3028 
3029 		/* Found the admin, now find the rules on the chain */
3030 		mutex_lock(&admin->lock);
3031 		list_for_each_entry(ri, &admin->rules, list) {
3032 			if (ri->data.vcap_chain_id != chain)
3033 				continue;
3034 
3035 			if (ri->ndev != ndev)
3036 				continue;
3037 
3038 			if (ri->state != VCAP_RS_ENABLED)
3039 				continue;
3040 
3041 			err = vcap_disable_rule(ri);
3042 			if (err)
3043 				break;
3044 		}
3045 		mutex_unlock(&admin->lock);
3046 		if (err)
3047 			break;
3048 	}
3049 	return err;
3050 }
3051 
3052 /* Check if this port is already enabled for this VCAP instance */
3053 static bool vcap_is_enabled(struct vcap_control *vctrl, struct net_device *ndev,
3054 			    int dst_cid)
3055 {
3056 	struct vcap_enabled_port *eport;
3057 	struct vcap_admin *admin;
3058 
3059 	list_for_each_entry(admin, &vctrl->list, list)
3060 		list_for_each_entry(eport, &admin->enabled, list)
3061 			if (eport->dst_cid == dst_cid && eport->ndev == ndev)
3062 				return true;
3063 
3064 	return false;
3065 }
3066 
3067 /* Enable this port and chain id in a VCAP instance */
3068 static int vcap_enable(struct vcap_control *vctrl, struct net_device *ndev,
3069 		       unsigned long cookie, int src_cid, int dst_cid)
3070 {
3071 	struct vcap_enabled_port *eport;
3072 	struct vcap_admin *admin;
3073 
3074 	if (src_cid >= dst_cid)
3075 		return -EFAULT;
3076 
3077 	admin = vcap_find_admin(vctrl, dst_cid);
3078 	if (!admin)
3079 		return -ENOENT;
3080 
3081 	eport = kzalloc(sizeof(*eport), GFP_KERNEL);
3082 	if (!eport)
3083 		return -ENOMEM;
3084 
3085 	eport->ndev = ndev;
3086 	eport->cookie = cookie;
3087 	eport->src_cid = src_cid;
3088 	eport->dst_cid = dst_cid;
3089 	mutex_lock(&admin->lock);
3090 	list_add_tail(&eport->list, &admin->enabled);
3091 	mutex_unlock(&admin->lock);
3092 
3093 	if (vcap_path_exist(vctrl, ndev, src_cid)) {
3094 		/* Enable chained lookups */
3095 		while (dst_cid) {
3096 			admin = vcap_find_admin(vctrl, dst_cid);
3097 			if (!admin)
3098 				return -ENOENT;
3099 
3100 			vcap_enable_rules(vctrl, ndev, dst_cid);
3101 			dst_cid = vcap_get_next_chain(vctrl, ndev, dst_cid);
3102 		}
3103 	}
3104 	return 0;
3105 }
3106 
3107 /* Disable this port and chain id for a VCAP instance */
3108 static int vcap_disable(struct vcap_control *vctrl, struct net_device *ndev,
3109 			unsigned long cookie)
3110 {
3111 	struct vcap_enabled_port *elem, *eport = NULL;
3112 	struct vcap_admin *found = NULL, *admin;
3113 	int dst_cid;
3114 
3115 	list_for_each_entry(admin, &vctrl->list, list) {
3116 		list_for_each_entry(elem, &admin->enabled, list) {
3117 			if (elem->cookie == cookie && elem->ndev == ndev) {
3118 				eport = elem;
3119 				found = admin;
3120 				break;
3121 			}
3122 		}
3123 		if (eport)
3124 			break;
3125 	}
3126 
3127 	if (!eport)
3128 		return -ENOENT;
3129 
3130 	/* Disable chained lookups */
3131 	dst_cid = eport->dst_cid;
3132 	while (dst_cid) {
3133 		admin = vcap_find_admin(vctrl, dst_cid);
3134 		if (!admin)
3135 			return -ENOENT;
3136 
3137 		vcap_disable_rules(vctrl, ndev, dst_cid);
3138 		dst_cid = vcap_get_next_chain(vctrl, ndev, dst_cid);
3139 	}
3140 
3141 	mutex_lock(&found->lock);
3142 	list_del(&eport->list);
3143 	mutex_unlock(&found->lock);
3144 	kfree(eport);
3145 	return 0;
3146 }
3147 
3148 /* Enable/Disable the VCAP instance lookups */
3149 int vcap_enable_lookups(struct vcap_control *vctrl, struct net_device *ndev,
3150 			int src_cid, int dst_cid, unsigned long cookie,
3151 			bool enable)
3152 {
3153 	int err;
3154 
3155 	err = vcap_api_check(vctrl);
3156 	if (err)
3157 		return err;
3158 
3159 	if (!ndev)
3160 		return -ENODEV;
3161 
3162 	/* Source and destination must be the first chain in a lookup */
3163 	if (src_cid % VCAP_CID_LOOKUP_SIZE)
3164 		return -EFAULT;
3165 	if (dst_cid % VCAP_CID_LOOKUP_SIZE)
3166 		return -EFAULT;
3167 
3168 	if (enable) {
3169 		if (vcap_is_enabled(vctrl, ndev, dst_cid))
3170 			return -EADDRINUSE;
3171 		if (vcap_is_chain_used(vctrl, ndev, src_cid))
3172 			return -EADDRNOTAVAIL;
3173 		err = vcap_enable(vctrl, ndev, cookie, src_cid, dst_cid);
3174 	} else {
3175 		err = vcap_disable(vctrl, ndev, cookie);
3176 	}
3177 
3178 	return err;
3179 }
3180 EXPORT_SYMBOL_GPL(vcap_enable_lookups);
3181 
3182 /* Is this chain id the last lookup of all VCAPs */
3183 bool vcap_is_last_chain(struct vcap_control *vctrl, int cid, bool ingress)
3184 {
3185 	struct vcap_admin *admin;
3186 	int lookup;
3187 
3188 	if (vcap_api_check(vctrl))
3189 		return false;
3190 
3191 	admin = vcap_find_admin(vctrl, cid);
3192 	if (!admin)
3193 		return false;
3194 
3195 	if (!vcap_admin_is_last(vctrl, admin, ingress))
3196 		return false;
3197 
3198 	/* This must be the last lookup in this VCAP type */
3199 	lookup = vcap_chain_id_to_lookup(admin, cid);
3200 	return lookup == admin->lookups - 1;
3201 }
3202 EXPORT_SYMBOL_GPL(vcap_is_last_chain);
3203 
3204 /* Set a rule counter id (for certain vcaps only) */
3205 void vcap_rule_set_counter_id(struct vcap_rule *rule, u32 counter_id)
3206 {
3207 	struct vcap_rule_internal *ri = to_intrule(rule);
3208 
3209 	ri->counter_id = counter_id;
3210 }
3211 EXPORT_SYMBOL_GPL(vcap_rule_set_counter_id);
3212 
3213 int vcap_rule_set_counter(struct vcap_rule *rule, struct vcap_counter *ctr)
3214 {
3215 	struct vcap_rule_internal *ri = to_intrule(rule);
3216 	int err;
3217 
3218 	err = vcap_api_check(ri->vctrl);
3219 	if (err)
3220 		return err;
3221 	if (!ctr) {
3222 		pr_err("%s:%d: counter is missing\n", __func__, __LINE__);
3223 		return -EINVAL;
3224 	}
3225 
3226 	mutex_lock(&ri->admin->lock);
3227 	err = vcap_write_counter(ri, ctr);
3228 	mutex_unlock(&ri->admin->lock);
3229 
3230 	return err;
3231 }
3232 EXPORT_SYMBOL_GPL(vcap_rule_set_counter);
3233 
3234 int vcap_rule_get_counter(struct vcap_rule *rule, struct vcap_counter *ctr)
3235 {
3236 	struct vcap_rule_internal *ri = to_intrule(rule);
3237 	int err;
3238 
3239 	err = vcap_api_check(ri->vctrl);
3240 	if (err)
3241 		return err;
3242 	if (!ctr) {
3243 		pr_err("%s:%d: counter is missing\n", __func__, __LINE__);
3244 		return -EINVAL;
3245 	}
3246 
3247 	mutex_lock(&ri->admin->lock);
3248 	err = vcap_read_counter(ri, ctr);
3249 	mutex_unlock(&ri->admin->lock);
3250 
3251 	return err;
3252 }
3253 EXPORT_SYMBOL_GPL(vcap_rule_get_counter);
3254 
3255 /* Get a copy of a client key field */
3256 static int vcap_rule_get_key(struct vcap_rule *rule,
3257 			     enum vcap_key_field key,
3258 			     struct vcap_client_keyfield *ckf)
3259 {
3260 	struct vcap_client_keyfield *field;
3261 
3262 	field = vcap_find_keyfield(rule, key);
3263 	if (!field)
3264 		return -EINVAL;
3265 	memcpy(ckf, field, sizeof(*ckf));
3266 	INIT_LIST_HEAD(&ckf->ctrl.list);
3267 	return 0;
3268 }
3269 
3270 /* Find a keyset having the same size as the provided rule, where the keyset
3271  * does not have a type id.
3272  */
3273 static int vcap_rule_get_untyped_keyset(struct vcap_rule_internal *ri,
3274 					struct vcap_keyset_list *matches)
3275 {
3276 	struct vcap_control *vctrl = ri->vctrl;
3277 	enum vcap_type vt = ri->admin->vtype;
3278 	const struct vcap_set *keyfield_set;
3279 	int idx;
3280 
3281 	keyfield_set = vctrl->vcaps[vt].keyfield_set;
3282 	for (idx = 0; idx < vctrl->vcaps[vt].keyfield_set_size; ++idx) {
3283 		if (keyfield_set[idx].sw_per_item == ri->keyset_sw &&
3284 		    keyfield_set[idx].type_id == (u8)-1) {
3285 			vcap_keyset_list_add(matches, idx);
3286 			return 0;
3287 		}
3288 	}
3289 	return -EINVAL;
3290 }
3291 
3292 /* Get the keysets that matches the rule key type/mask */
3293 int vcap_rule_get_keysets(struct vcap_rule_internal *ri,
3294 			  struct vcap_keyset_list *matches)
3295 {
3296 	struct vcap_control *vctrl = ri->vctrl;
3297 	enum vcap_type vt = ri->admin->vtype;
3298 	const struct vcap_set *keyfield_set;
3299 	struct vcap_client_keyfield kf = {};
3300 	u32 value, mask;
3301 	int err, idx;
3302 
3303 	err = vcap_rule_get_key(&ri->data, VCAP_KF_TYPE, &kf);
3304 	if (err)
3305 		return vcap_rule_get_untyped_keyset(ri, matches);
3306 
3307 	if (kf.ctrl.type == VCAP_FIELD_BIT) {
3308 		value = kf.data.u1.value;
3309 		mask = kf.data.u1.mask;
3310 	} else if (kf.ctrl.type == VCAP_FIELD_U32) {
3311 		value = kf.data.u32.value;
3312 		mask = kf.data.u32.mask;
3313 	} else {
3314 		return -EINVAL;
3315 	}
3316 
3317 	keyfield_set = vctrl->vcaps[vt].keyfield_set;
3318 	for (idx = 0; idx < vctrl->vcaps[vt].keyfield_set_size; ++idx) {
3319 		if (keyfield_set[idx].sw_per_item != ri->keyset_sw)
3320 			continue;
3321 
3322 		if (keyfield_set[idx].type_id == (u8)-1) {
3323 			vcap_keyset_list_add(matches, idx);
3324 			continue;
3325 		}
3326 
3327 		if ((keyfield_set[idx].type_id & mask) == value)
3328 			vcap_keyset_list_add(matches, idx);
3329 	}
3330 	if (matches->cnt > 0)
3331 		return 0;
3332 
3333 	return -EINVAL;
3334 }
3335 
3336 /* Collect packet counts from all rules with the same cookie */
3337 int vcap_get_rule_count_by_cookie(struct vcap_control *vctrl,
3338 				  struct vcap_counter *ctr, u64 cookie)
3339 {
3340 	struct vcap_rule_internal *ri;
3341 	struct vcap_counter temp = {};
3342 	struct vcap_admin *admin;
3343 	int err;
3344 
3345 	err = vcap_api_check(vctrl);
3346 	if (err)
3347 		return err;
3348 
3349 	/* Iterate all rules in each VCAP instance */
3350 	list_for_each_entry(admin, &vctrl->list, list) {
3351 		mutex_lock(&admin->lock);
3352 		list_for_each_entry(ri, &admin->rules, list) {
3353 			if (ri->data.cookie != cookie)
3354 				continue;
3355 
3356 			err = vcap_read_counter(ri, &temp);
3357 			if (err)
3358 				goto unlock;
3359 			ctr->value += temp.value;
3360 
3361 			/* Reset the rule counter */
3362 			temp.value = 0;
3363 			temp.sticky = 0;
3364 			err = vcap_write_counter(ri, &temp);
3365 			if (err)
3366 				goto unlock;
3367 		}
3368 		mutex_unlock(&admin->lock);
3369 	}
3370 	return err;
3371 
3372 unlock:
3373 	mutex_unlock(&admin->lock);
3374 	return err;
3375 }
3376 EXPORT_SYMBOL_GPL(vcap_get_rule_count_by_cookie);
3377 
3378 static int vcap_rule_mod_key(struct vcap_rule *rule,
3379 			     enum vcap_key_field key,
3380 			     enum vcap_field_type ftype,
3381 			     struct vcap_client_keyfield_data *data)
3382 {
3383 	struct vcap_client_keyfield *field;
3384 
3385 	field = vcap_find_keyfield(rule, key);
3386 	if (!field)
3387 		return vcap_rule_add_key(rule, key, ftype, data);
3388 	memcpy(&field->data, data, sizeof(field->data));
3389 	return 0;
3390 }
3391 
3392 /* Modify a 32 bit key field with value and mask in the rule */
3393 int vcap_rule_mod_key_u32(struct vcap_rule *rule, enum vcap_key_field key,
3394 			  u32 value, u32 mask)
3395 {
3396 	struct vcap_client_keyfield_data data;
3397 
3398 	data.u32.value = value;
3399 	data.u32.mask = mask;
3400 	return vcap_rule_mod_key(rule, key, VCAP_FIELD_U32, &data);
3401 }
3402 EXPORT_SYMBOL_GPL(vcap_rule_mod_key_u32);
3403 
3404 static int vcap_rule_mod_action(struct vcap_rule *rule,
3405 				enum vcap_action_field action,
3406 				enum vcap_field_type ftype,
3407 				struct vcap_client_actionfield_data *data)
3408 {
3409 	struct vcap_client_actionfield *field;
3410 
3411 	field = vcap_find_actionfield(rule, action);
3412 	if (!field)
3413 		return vcap_rule_add_action(rule, action, ftype, data);
3414 	memcpy(&field->data, data, sizeof(field->data));
3415 	return 0;
3416 }
3417 
3418 /* Modify a 32 bit action field with value in the rule */
3419 int vcap_rule_mod_action_u32(struct vcap_rule *rule,
3420 			     enum vcap_action_field action,
3421 			     u32 value)
3422 {
3423 	struct vcap_client_actionfield_data data;
3424 
3425 	data.u32.value = value;
3426 	return vcap_rule_mod_action(rule, action, VCAP_FIELD_U32, &data);
3427 }
3428 EXPORT_SYMBOL_GPL(vcap_rule_mod_action_u32);
3429 
3430 /* Drop keys in a keylist and any keys that are not supported by the keyset */
3431 int vcap_filter_rule_keys(struct vcap_rule *rule,
3432 			  enum vcap_key_field keylist[], int length,
3433 			  bool drop_unsupported)
3434 {
3435 	struct vcap_rule_internal *ri = to_intrule(rule);
3436 	struct vcap_client_keyfield *ckf, *next_ckf;
3437 	const struct vcap_field *fields;
3438 	enum vcap_key_field key;
3439 	int err = 0;
3440 	int idx;
3441 
3442 	if (length > 0) {
3443 		err = -EEXIST;
3444 		list_for_each_entry_safe(ckf, next_ckf,
3445 					 &ri->data.keyfields, ctrl.list) {
3446 			key = ckf->ctrl.key;
3447 			for (idx = 0; idx < length; ++idx)
3448 				if (key == keylist[idx]) {
3449 					list_del(&ckf->ctrl.list);
3450 					kfree(ckf);
3451 					idx++;
3452 					err = 0;
3453 				}
3454 		}
3455 	}
3456 	if (drop_unsupported) {
3457 		err = -EEXIST;
3458 		fields = vcap_keyfields(ri->vctrl, ri->admin->vtype,
3459 					rule->keyset);
3460 		if (!fields)
3461 			return err;
3462 		list_for_each_entry_safe(ckf, next_ckf,
3463 					 &ri->data.keyfields, ctrl.list) {
3464 			key = ckf->ctrl.key;
3465 			if (fields[key].width == 0) {
3466 				list_del(&ckf->ctrl.list);
3467 				kfree(ckf);
3468 				err = 0;
3469 			}
3470 		}
3471 	}
3472 	return err;
3473 }
3474 EXPORT_SYMBOL_GPL(vcap_filter_rule_keys);
3475 
3476 /* Make a full copy of an existing rule with a new rule id */
3477 struct vcap_rule *vcap_copy_rule(struct vcap_rule *erule)
3478 {
3479 	struct vcap_rule_internal *ri = to_intrule(erule);
3480 	struct vcap_client_actionfield *caf;
3481 	struct vcap_client_keyfield *ckf;
3482 	struct vcap_rule *rule;
3483 	int err;
3484 
3485 	err = vcap_api_check(ri->vctrl);
3486 	if (err)
3487 		return ERR_PTR(err);
3488 
3489 	rule = vcap_alloc_rule(ri->vctrl, ri->ndev, ri->data.vcap_chain_id,
3490 			       ri->data.user, ri->data.priority, 0);
3491 	if (IS_ERR(rule))
3492 		return rule;
3493 
3494 	list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) {
3495 		/* Add a key duplicate in the new rule */
3496 		err = vcap_rule_add_key(rule,
3497 					ckf->ctrl.key,
3498 					ckf->ctrl.type,
3499 					&ckf->data);
3500 		if (err)
3501 			goto err;
3502 	}
3503 
3504 	list_for_each_entry(caf, &ri->data.actionfields, ctrl.list) {
3505 		/* Add a action duplicate in the new rule */
3506 		err = vcap_rule_add_action(rule,
3507 					   caf->ctrl.action,
3508 					   caf->ctrl.type,
3509 					   &caf->data);
3510 		if (err)
3511 			goto err;
3512 	}
3513 	return rule;
3514 err:
3515 	vcap_free_rule(rule);
3516 	return ERR_PTR(err);
3517 }
3518 EXPORT_SYMBOL_GPL(vcap_copy_rule);
3519 
3520 #ifdef CONFIG_VCAP_KUNIT_TEST
3521 #include "vcap_api_kunit.c"
3522 #endif
3523