1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries. |
3 | * Microchip VCAP API |
4 | */ |
5 | |
6 | #ifndef __VCAP_API_PRIVATE__ |
7 | #define __VCAP_API_PRIVATE__ |
8 | |
9 | #include <linux/types.h> |
10 | |
11 | #include "vcap_api.h" |
12 | #include "vcap_api_client.h" |
13 | |
14 | #define to_intrule(rule) container_of((rule), struct vcap_rule_internal, data) |
15 | |
16 | enum vcap_rule_state { |
17 | VCAP_RS_PERMANENT, /* the rule is always stored in HW */ |
18 | VCAP_RS_ENABLED, /* enabled in HW but can be disabled */ |
19 | VCAP_RS_DISABLED, /* disabled (stored in SW) and can be enabled */ |
20 | }; |
21 | |
22 | /* Private VCAP API rule data */ |
23 | struct vcap_rule_internal { |
24 | struct vcap_rule data; /* provided by the client */ |
25 | struct list_head list; /* the vcap admin list of rules */ |
26 | struct vcap_admin *admin; /* vcap hw instance */ |
27 | struct net_device *ndev; /* the interface that the rule applies to */ |
28 | struct vcap_control *vctrl; /* the client control */ |
29 | u32 sort_key; /* defines the position in the VCAP */ |
30 | int keyset_sw; /* subwords in a keyset */ |
31 | int actionset_sw; /* subwords in an actionset */ |
32 | int keyset_sw_regs; /* registers in a subword in an keyset */ |
33 | int actionset_sw_regs; /* registers in a subword in an actionset */ |
34 | int size; /* the size of the rule: max(entry, action) */ |
35 | u32 addr; /* address in the VCAP at insertion */ |
36 | u32 counter_id; /* counter id (if a dedicated counter is available) */ |
37 | struct vcap_counter counter; /* last read counter value */ |
38 | enum vcap_rule_state state; /* rule storage state */ |
39 | }; |
40 | |
41 | /* Bit iterator for the VCAP cache streams */ |
42 | struct vcap_stream_iter { |
43 | u32 offset; /* bit offset from the stream start */ |
44 | u32 sw_width; /* subword width in bits */ |
45 | u32 regs_per_sw; /* registers per subword */ |
46 | u32 reg_idx; /* current register index */ |
47 | u32 reg_bitpos; /* bit offset in current register */ |
48 | const struct vcap_typegroup *tg; /* current typegroup */ |
49 | }; |
50 | |
51 | /* Check that the control has a valid set of callbacks */ |
52 | int vcap_api_check(struct vcap_control *ctrl); |
53 | /* Erase the VCAP cache area used or encoding and decoding */ |
54 | void vcap_erase_cache(struct vcap_rule_internal *ri); |
55 | |
56 | /* Iterator functionality */ |
57 | |
58 | void vcap_iter_init(struct vcap_stream_iter *itr, int sw_width, |
59 | const struct vcap_typegroup *tg, u32 offset); |
60 | void vcap_iter_next(struct vcap_stream_iter *itr); |
61 | void vcap_iter_set(struct vcap_stream_iter *itr, int sw_width, |
62 | const struct vcap_typegroup *tg, u32 offset); |
63 | void vcap_iter_update(struct vcap_stream_iter *itr); |
64 | |
65 | /* Keyset and keyfield functionality */ |
66 | |
67 | /* Return the number of keyfields in the keyset */ |
68 | int vcap_keyfield_count(struct vcap_control *vctrl, |
69 | enum vcap_type vt, enum vcap_keyfield_set keyset); |
70 | /* Return the typegroup table for the matching keyset (using subword size) */ |
71 | const struct vcap_typegroup * |
72 | vcap_keyfield_typegroup(struct vcap_control *vctrl, |
73 | enum vcap_type vt, enum vcap_keyfield_set keyset); |
74 | /* Return the list of keyfields for the keyset */ |
75 | const struct vcap_field *vcap_keyfields(struct vcap_control *vctrl, |
76 | enum vcap_type vt, |
77 | enum vcap_keyfield_set keyset); |
78 | |
79 | /* Actionset and actionfield functionality */ |
80 | |
81 | /* Return the actionset information for the actionset */ |
82 | const struct vcap_set * |
83 | vcap_actionfieldset(struct vcap_control *vctrl, |
84 | enum vcap_type vt, enum vcap_actionfield_set actionset); |
85 | /* Return the number of actionfields in the actionset */ |
86 | int vcap_actionfield_count(struct vcap_control *vctrl, |
87 | enum vcap_type vt, |
88 | enum vcap_actionfield_set actionset); |
89 | /* Return the typegroup table for the matching actionset (using subword size) */ |
90 | const struct vcap_typegroup * |
91 | vcap_actionfield_typegroup(struct vcap_control *vctrl, enum vcap_type vt, |
92 | enum vcap_actionfield_set actionset); |
93 | /* Return the list of actionfields for the actionset */ |
94 | const struct vcap_field * |
95 | vcap_actionfields(struct vcap_control *vctrl, |
96 | enum vcap_type vt, enum vcap_actionfield_set actionset); |
97 | /* Map actionset id to a string with the actionset name */ |
98 | const char *vcap_actionset_name(struct vcap_control *vctrl, |
99 | enum vcap_actionfield_set actionset); |
100 | /* Map key field id to a string with the key name */ |
101 | const char *vcap_actionfield_name(struct vcap_control *vctrl, |
102 | enum vcap_action_field action); |
103 | |
104 | /* Read key data from a VCAP address and discover if there are any rule keysets |
105 | * here |
106 | */ |
107 | int vcap_addr_keysets(struct vcap_control *vctrl, struct net_device *ndev, |
108 | struct vcap_admin *admin, int addr, |
109 | struct vcap_keyset_list *kslist); |
110 | |
111 | /* Verify that the typegroup information, subword count, keyset and type id |
112 | * are in sync and correct, return the list of matchin keysets |
113 | */ |
114 | int vcap_find_keystream_keysets(struct vcap_control *vctrl, enum vcap_type vt, |
115 | u32 *keystream, u32 *mskstream, bool mask, |
116 | int sw_max, struct vcap_keyset_list *kslist); |
117 | |
118 | /* Get the keysets that matches the rule key type/mask */ |
119 | int vcap_rule_get_keysets(struct vcap_rule_internal *ri, |
120 | struct vcap_keyset_list *matches); |
121 | /* Decode a rule from the VCAP cache and return a copy */ |
122 | struct vcap_rule *vcap_decode_rule(struct vcap_rule_internal *elem); |
123 | |
124 | #endif /* __VCAP_API_PRIVATE__ */ |
125 | |