brintos

brintos / linux-shallow public Read only

0
0
Text · 8.5 KiB · 6069ad9 Raw
281 lines · c
1/* SPDX-License-Identifier: BSD-3-Clause */2/* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries.3 * Microchip VCAP API4 */5 6#ifndef __VCAP_API__7#define __VCAP_API__8 9#include <linux/types.h>10#include <linux/list.h>11#include <linux/netdevice.h>12 13/* Use the generated API model */14#include "vcap_ag_api.h"15 16#define VCAP_CID_LOOKUP_SIZE          100000 /* Chains in a lookup */17#define VCAP_CID_INGRESS_L0          1000000 /* Ingress Stage 1 Lookup 0 */18#define VCAP_CID_INGRESS_L1          1100000 /* Ingress Stage 1 Lookup 1 */19#define VCAP_CID_INGRESS_L2          1200000 /* Ingress Stage 1 Lookup 2 */20#define VCAP_CID_INGRESS_L3          1300000 /* Ingress Stage 1 Lookup 3 */21#define VCAP_CID_INGRESS_L4          1400000 /* Ingress Stage 1 Lookup 4 */22#define VCAP_CID_INGRESS_L5          1500000 /* Ingress Stage 1 Lookup 5 */23 24#define VCAP_CID_PREROUTING_IPV6     3000000 /* Prerouting Stage */25#define VCAP_CID_PREROUTING          6000000 /* Prerouting Stage */26 27#define VCAP_CID_INGRESS_STAGE2_L0   8000000 /* Ingress Stage 2 Lookup 0 */28#define VCAP_CID_INGRESS_STAGE2_L1   8100000 /* Ingress Stage 2 Lookup 1 */29#define VCAP_CID_INGRESS_STAGE2_L2   8200000 /* Ingress Stage 2 Lookup 2 */30#define VCAP_CID_INGRESS_STAGE2_L3   8300000 /* Ingress Stage 2 Lookup 3 */31 32#define VCAP_CID_EGRESS_L0           10000000 /* Egress Lookup 0 */33#define VCAP_CID_EGRESS_L1           10100000 /* Egress Lookup 1 */34 35#define VCAP_CID_EGRESS_STAGE2_L0    20000000 /* Egress Stage 2 Lookup 0 */36#define VCAP_CID_EGRESS_STAGE2_L1    20100000 /* Egress Stage 2 Lookup 1 */37 38/* Known users of the VCAP API */39enum vcap_user {40	VCAP_USER_PTP,41	VCAP_USER_MRP,42	VCAP_USER_CFM,43	VCAP_USER_VLAN,44	VCAP_USER_QOS,45	VCAP_USER_VCAP_UTIL,46	VCAP_USER_TC,47	VCAP_USER_TC_EXTRA,48 49	/* add new users above here */50 51	/* used to define VCAP_USER_MAX below */52	__VCAP_USER_AFTER_LAST,53	VCAP_USER_MAX = __VCAP_USER_AFTER_LAST - 1,54};55 56/* VCAP information used for displaying data */57struct vcap_statistics {58	char *name;59	int count;60	const char * const *keyfield_set_names;61	const char * const *actionfield_set_names;62	const char * const *keyfield_names;63	const char * const *actionfield_names;64};65 66/* VCAP key/action field type, position and width */67struct vcap_field {68	u16 type;69	u16 width;70	u16 offset;71};72 73/* VCAP keyset or actionset type and width */74struct vcap_set {75	u8 type_id;76	u8 sw_per_item;77	u8 sw_cnt;78};79 80/* VCAP typegroup position and bitvalue */81struct vcap_typegroup {82	u16 offset;83	u16 width;84	u16 value;85};86 87/* VCAP model data */88struct vcap_info {89	char *name; /* user-friendly name */90	u16 rows; /* number of row in instance */91	u16 sw_count; /* maximum subwords used per rule */92	u16 sw_width; /* bits per subword in a keyset */93	u16 sticky_width; /* sticky bits per rule */94	u16 act_width;  /* bits per subword in an actionset */95	u16 default_cnt; /* number of default rules */96	u16 require_cnt_dis; /* not used */97	u16 version; /* vcap rtl version */98	const struct vcap_set *keyfield_set; /* keysets */99	int keyfield_set_size; /* number of keysets */100	const struct vcap_set *actionfield_set; /* actionsets */101	int actionfield_set_size; /* number of actionsets */102	/* map of keys per keyset */103	const struct vcap_field **keyfield_set_map;104	/* number of entries in the above map */105	int *keyfield_set_map_size;106	/* map of actions per actionset */107	const struct vcap_field **actionfield_set_map;108	/* number of entries in the above map */109	int *actionfield_set_map_size;110	/* map of keyset typegroups per subword size */111	const struct vcap_typegroup **keyfield_set_typegroups;112	/* map of actionset typegroups per subword size */113	const struct vcap_typegroup **actionfield_set_typegroups;114};115 116enum vcap_field_type {117	VCAP_FIELD_BIT,118	VCAP_FIELD_U32,119	VCAP_FIELD_U48,120	VCAP_FIELD_U56,121	VCAP_FIELD_U64,122	VCAP_FIELD_U72,123	VCAP_FIELD_U112,124	VCAP_FIELD_U128,125};126 127/* VCAP rule data towards the VCAP cache */128struct vcap_cache_data {129	u32 *keystream;130	u32 *maskstream;131	u32 *actionstream;132	u32 counter;133	bool sticky;134};135 136/* Selects which part of the rule must be updated */137enum vcap_selection {138	VCAP_SEL_ENTRY = 0x01,139	VCAP_SEL_ACTION = 0x02,140	VCAP_SEL_COUNTER = 0x04,141	VCAP_SEL_ALL = 0xff,142};143 144/* Commands towards the VCAP cache */145enum vcap_command {146	VCAP_CMD_WRITE = 0,147	VCAP_CMD_READ = 1,148	VCAP_CMD_MOVE_DOWN = 2,149	VCAP_CMD_MOVE_UP = 3,150	VCAP_CMD_INITIALIZE = 4,151};152 153enum vcap_rule_error {154	VCAP_ERR_NONE = 0,  /* No known error */155	VCAP_ERR_NO_ADMIN,  /* No admin instance */156	VCAP_ERR_NO_NETDEV,  /* No netdev instance */157	VCAP_ERR_NO_KEYSET_MATCH, /* No keyset matched the rule keys */158	VCAP_ERR_NO_ACTIONSET_MATCH, /* No actionset matched the rule actions */159	VCAP_ERR_NO_PORT_KEYSET_MATCH, /* No port keyset matched the rule keys */160};161 162/* Administration of each VCAP instance */163struct vcap_admin {164	struct list_head list; /* for insertion in vcap_control */165	struct list_head rules; /* list of rules */166	struct list_head enabled; /* list of enabled ports */167	struct mutex lock; /* control access to rules */168	enum vcap_type vtype;  /* type of vcap */169	int vinst; /* instance number within the same type */170	int first_cid; /* first chain id in this vcap */171	int last_cid; /* last chain id in this vcap */172	int tgt_inst; /* hardware instance number */173	int lookups; /* number of lookups in this vcap type */174	int lookups_per_instance; /* number of lookups in this instance */175	int last_valid_addr; /* top of address range to be used */176	int first_valid_addr; /* bottom of address range to be used */177	int last_used_addr;  /* address of lowest added rule */178	bool w32be; /* vcap uses "32bit-word big-endian" encoding */179	bool ingress; /* chain traffic direction */180	struct vcap_cache_data cache; /* encoded rule data */181};182 183/* Client supplied VCAP rule data */184struct vcap_rule {185	int vcap_chain_id; /* chain used for this rule */186	enum vcap_user user; /* rule owner */187	u16 priority;188	u32 id;  /* vcap rule id, must be unique, 0 will auto-generate a value */189	u64 cookie;  /* used by the client to identify the rule */190	struct list_head keyfields;  /* list of vcap_client_keyfield */191	struct list_head actionfields;  /* list of vcap_client_actionfield */192	enum vcap_keyfield_set keyset; /* keyset used: may be derived from fields */193	enum vcap_actionfield_set actionset; /* actionset used: may be derived from fields */194	enum vcap_rule_error exterr; /* extended error - used by TC */195	u64 client; /* space for client defined data */196};197 198/* List of keysets */199struct vcap_keyset_list {200	int max; /* size of the keyset list */201	int cnt; /* count of keysets actually in the list */202	enum vcap_keyfield_set *keysets; /* the list of keysets */203};204 205/* List of actionsets */206struct vcap_actionset_list {207	int max; /* size of the actionset list */208	int cnt; /* count of actionsets actually in the list */209	enum vcap_actionfield_set *actionsets; /* the list of actionsets */210};211 212/* Client output printf-like function with destination */213struct vcap_output_print {214	__printf(2, 3)215	void (*prf)(void *out, const char *fmt, ...);216	void *dst;217};218 219/* Client supplied VCAP callback operations */220struct vcap_operations {221	/* validate port keyset operation */222	enum vcap_keyfield_set (*validate_keyset)223		(struct net_device *ndev,224		 struct vcap_admin *admin,225		 struct vcap_rule *rule,226		 struct vcap_keyset_list *kslist,227		 u16 l3_proto);228	/* add default rule fields for the selected keyset operations */229	void (*add_default_fields)230		(struct net_device *ndev,231		 struct vcap_admin *admin,232		 struct vcap_rule *rule);233	/* cache operations */234	void (*cache_erase)235		(struct vcap_admin *admin);236	void (*cache_write)237		(struct net_device *ndev,238		 struct vcap_admin *admin,239		 enum vcap_selection sel,240		 u32 idx, u32 count);241	void (*cache_read)242		(struct net_device *ndev,243		 struct vcap_admin *admin,244		 enum vcap_selection sel,245		 u32 idx,246		 u32 count);247	/* block operations */248	void (*init)249		(struct net_device *ndev,250		 struct vcap_admin *admin,251		 u32 addr,252		 u32 count);253	void (*update)254		(struct net_device *ndev,255		 struct vcap_admin *admin,256		 enum vcap_command cmd,257		 enum vcap_selection sel,258		 u32 addr);259	void (*move)260		(struct net_device *ndev,261		 struct vcap_admin *admin,262		 u32 addr,263		 int offset,264		 int count);265	/* informational */266	int (*port_info)267		(struct net_device *ndev,268		 struct vcap_admin *admin,269		 struct vcap_output_print *out);270};271 272/* VCAP API Client control interface */273struct vcap_control {274	const struct vcap_operations *ops;  /* client supplied operations */275	const struct vcap_info *vcaps; /* client supplied vcap models */276	const struct vcap_statistics *stats; /* client supplied vcap stats */277	struct list_head list; /* list of vcap instances */278};279 280#endif /* __VCAP_API__ */281