| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /* SPDX-License-Identifier: GPL-2.0+ */
- /* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries.
- * Microchip VCAP API
- */
- #ifndef __VCAP_API_PRIVATE__
- #define __VCAP_API_PRIVATE__
- #include <linux/types.h>
- #include "vcap_api.h"
- #include "vcap_api_client.h"
- #define to_intrule(rule) container_of((rule), struct vcap_rule_internal, data)
- enum vcap_rule_state {
- VCAP_RS_PERMANENT, /* the rule is always stored in HW */
- VCAP_RS_ENABLED, /* enabled in HW but can be disabled */
- VCAP_RS_DISABLED, /* disabled (stored in SW) and can be enabled */
- };
- /* Private VCAP API rule data */
- struct vcap_rule_internal {
- struct vcap_rule data; /* provided by the client */
- struct list_head list; /* the vcap admin list of rules */
- struct vcap_admin *admin; /* vcap hw instance */
- struct net_device *ndev; /* the interface that the rule applies to */
- struct vcap_control *vctrl; /* the client control */
- u32 sort_key; /* defines the position in the VCAP */
- int keyset_sw; /* subwords in a keyset */
- int actionset_sw; /* subwords in an actionset */
- int keyset_sw_regs; /* registers in a subword in an keyset */
- int actionset_sw_regs; /* registers in a subword in an actionset */
- int size; /* the size of the rule: max(entry, action) */
- u32 addr; /* address in the VCAP at insertion */
- u32 counter_id; /* counter id (if a dedicated counter is available) */
- struct vcap_counter counter; /* last read counter value */
- enum vcap_rule_state state; /* rule storage state */
- };
- /* Bit iterator for the VCAP cache streams */
- struct vcap_stream_iter {
- u32 offset; /* bit offset from the stream start */
- u32 sw_width; /* subword width in bits */
- u32 regs_per_sw; /* registers per subword */
- u32 reg_idx; /* current register index */
- u32 reg_bitpos; /* bit offset in current register */
- const struct vcap_typegroup *tg; /* current typegroup */
- };
- /* Check that the control has a valid set of callbacks */
- int vcap_api_check(struct vcap_control *ctrl);
- /* Erase the VCAP cache area used or encoding and decoding */
- void vcap_erase_cache(struct vcap_rule_internal *ri);
- /* Iterator functionality */
- void vcap_iter_init(struct vcap_stream_iter *itr, int sw_width,
- const struct vcap_typegroup *tg, u32 offset);
- void vcap_iter_next(struct vcap_stream_iter *itr);
- void vcap_iter_set(struct vcap_stream_iter *itr, int sw_width,
- const struct vcap_typegroup *tg, u32 offset);
- void vcap_iter_update(struct vcap_stream_iter *itr);
- /* Keyset and keyfield functionality */
- /* Return the number of keyfields in the keyset */
- int vcap_keyfield_count(struct vcap_control *vctrl,
- enum vcap_type vt, enum vcap_keyfield_set keyset);
- /* Return the typegroup table for the matching keyset (using subword size) */
- const struct vcap_typegroup *
- vcap_keyfield_typegroup(struct vcap_control *vctrl,
- enum vcap_type vt, enum vcap_keyfield_set keyset);
- /* Return the list of keyfields for the keyset */
- const struct vcap_field *vcap_keyfields(struct vcap_control *vctrl,
- enum vcap_type vt,
- enum vcap_keyfield_set keyset);
- /* Actionset and actionfield functionality */
- /* Return the actionset information for the actionset */
- const struct vcap_set *
- vcap_actionfieldset(struct vcap_control *vctrl,
- enum vcap_type vt, enum vcap_actionfield_set actionset);
- /* Return the number of actionfields in the actionset */
- int vcap_actionfield_count(struct vcap_control *vctrl,
- enum vcap_type vt,
- enum vcap_actionfield_set actionset);
- /* Return the typegroup table for the matching actionset (using subword size) */
- const struct vcap_typegroup *
- vcap_actionfield_typegroup(struct vcap_control *vctrl, enum vcap_type vt,
- enum vcap_actionfield_set actionset);
- /* Return the list of actionfields for the actionset */
- const struct vcap_field *
- vcap_actionfields(struct vcap_control *vctrl,
- enum vcap_type vt, enum vcap_actionfield_set actionset);
- /* Map actionset id to a string with the actionset name */
- const char *vcap_actionset_name(struct vcap_control *vctrl,
- enum vcap_actionfield_set actionset);
- /* Map key field id to a string with the key name */
- const char *vcap_actionfield_name(struct vcap_control *vctrl,
- enum vcap_action_field action);
- /* Read key data from a VCAP address and discover if there are any rule keysets
- * here
- */
- int vcap_addr_keysets(struct vcap_control *vctrl, struct net_device *ndev,
- struct vcap_admin *admin, int addr,
- struct vcap_keyset_list *kslist);
- /* Verify that the typegroup information, subword count, keyset and type id
- * are in sync and correct, return the list of matching keysets
- */
- int vcap_find_keystream_keysets(struct vcap_control *vctrl, enum vcap_type vt,
- u32 *keystream, u32 *mskstream, bool mask,
- int sw_max, struct vcap_keyset_list *kslist);
- /* Get the keysets that matches the rule key type/mask */
- int vcap_rule_get_keysets(struct vcap_rule_internal *ri,
- struct vcap_keyset_list *matches);
- /* Decode a rule from the VCAP cache and return a copy */
- struct vcap_rule *vcap_decode_rule(struct vcap_rule_internal *elem);
- #endif /* __VCAP_API_PRIVATE__ */
|