Linux Audio

Check our new training course

Loading...
  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
 16enum 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 */
 23struct 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 */
 42struct 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 */
 52int vcap_api_check(struct vcap_control *ctrl);
 53/* Erase the VCAP cache area used or encoding and decoding */
 54void vcap_erase_cache(struct vcap_rule_internal *ri);
 55
 56/* Iterator functionality */
 57
 58void vcap_iter_init(struct vcap_stream_iter *itr, int sw_width,
 59		    const struct vcap_typegroup *tg, u32 offset);
 60void vcap_iter_next(struct vcap_stream_iter *itr);
 61void vcap_iter_set(struct vcap_stream_iter *itr, int sw_width,
 62		   const struct vcap_typegroup *tg, u32 offset);
 63void vcap_iter_update(struct vcap_stream_iter *itr);
 64
 65/* Keyset and keyfield functionality */
 66
 67/* Return the number of keyfields in the keyset */
 68int 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) */
 71const struct vcap_typegroup *
 72vcap_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 */
 75const 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 */
 82const struct vcap_set *
 83vcap_actionfieldset(struct vcap_control *vctrl,
 84		    enum vcap_type vt, enum vcap_actionfield_set actionset);
 85/* Return the number of actionfields in the actionset */
 86int 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) */
 90const struct vcap_typegroup *
 91vcap_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 */
 94const struct vcap_field *
 95vcap_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 */
 98const 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 */
101const 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 */
107int 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 */
114int 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 */
119int 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 */
122struct vcap_rule *vcap_decode_rule(struct vcap_rule_internal *elem);
123
124#endif /* __VCAP_API_PRIVATE__ */