Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/* Applied Micro X-Gene SoC Ethernet Classifier structures
  3 *
  4 * Copyright (c) 2016, Applied Micro Circuits Corporation
  5 * Authors: Khuong Dinh <kdinh@apm.com>
  6 *          Tanmay Inamdar <tinamdar@apm.com>
  7 *          Iyappan Subramanian <isubramanian@apm.com>
  8 */
  9
 10#ifndef __XGENE_ENET_CLE_H__
 11#define __XGENE_ENET_CLE_H__
 12
 13#include <linux/io.h>
 14#include <linux/random.h>
 15
 16/* Register offsets */
 17#define INDADDR			0x04
 18#define INDCMD			0x08
 19#define INDCMD_STATUS		0x0c
 20#define DATA_RAM0		0x10
 21#define SNPTR0			0x0100
 22#define SPPTR0			0x0104
 23#define DFCLSRESDBPTR0		0x0108
 24#define DFCLSRESDB00		0x010c
 25#define RSS_CTRL0		0x0000013c
 26
 27#define CLE_CMD_TO		10	/* ms */
 28#define CLE_PKTRAM_SIZE		256	/* bytes */
 29#define CLE_PORT_OFFSET		0x200
 30#define CLE_DRAM_REGS		17
 31
 32#define CLE_DN_TYPE_LEN		2
 33#define CLE_DN_TYPE_POS		0
 34#define CLE_DN_LASTN_LEN	1
 35#define CLE_DN_LASTN_POS	2
 36#define CLE_DN_HLS_LEN		1
 37#define CLE_DN_HLS_POS		3
 38#define CLE_DN_EXT_LEN		2
 39#define	CLE_DN_EXT_POS		4
 40#define CLE_DN_BSTOR_LEN	2
 41#define CLE_DN_BSTOR_POS	6
 42#define CLE_DN_SBSTOR_LEN	2
 43#define CLE_DN_SBSTOR_POS	8
 44#define CLE_DN_RPTR_LEN		12
 45#define CLE_DN_RPTR_POS		12
 46
 47#define CLE_BR_VALID_LEN	1
 48#define CLE_BR_VALID_POS	0
 49#define CLE_BR_NPPTR_LEN	9
 50#define CLE_BR_NPPTR_POS	1
 51#define CLE_BR_JB_LEN		1
 52#define CLE_BR_JB_POS		10
 53#define CLE_BR_JR_LEN		1
 54#define CLE_BR_JR_POS		11
 55#define CLE_BR_OP_LEN		3
 56#define CLE_BR_OP_POS		12
 57#define CLE_BR_NNODE_LEN	9
 58#define CLE_BR_NNODE_POS	15
 59#define CLE_BR_NBR_LEN		5
 60#define CLE_BR_NBR_POS		24
 61
 62#define CLE_BR_DATA_LEN		16
 63#define CLE_BR_DATA_POS		0
 64#define CLE_BR_MASK_LEN		16
 65#define CLE_BR_MASK_POS		16
 66
 67#define CLE_KN_PRIO_POS		0
 68#define CLE_KN_PRIO_LEN		3
 69#define CLE_KN_RPTR_POS		3
 70#define CLE_KN_RPTR_LEN		10
 71#define CLE_TYPE_POS		0
 72#define CLE_TYPE_LEN		2
 73
 74#define CLE_DROP_POS		28
 75#define CLE_DROP_LEN		1
 76#define CLE_DSTQIDL_POS		25
 77#define CLE_DSTQIDL_LEN		7
 78#define CLE_DSTQIDH_POS		0
 79#define CLE_DSTQIDH_LEN		5
 80#define CLE_FPSEL_POS		21
 81#define CLE_FPSEL_LEN		4
 82#define CLE_NFPSEL_POS		17
 83#define CLE_NFPSEL_LEN		4
 84#define CLE_PRIORITY_POS	5
 85#define CLE_PRIORITY_LEN	3
 86
 87#define JMP_ABS			0
 88#define JMP_REL			1
 89#define JMP_FW			0
 90#define JMP_BW			1
 91
 92enum xgene_cle_ptree_nodes {
 93	PKT_TYPE_NODE,
 94	PKT_PROT_NODE,
 95	RSS_IPV4_TCP_NODE,
 96	RSS_IPV4_UDP_NODE,
 97	RSS_IPV4_OTHERS_NODE,
 98	LAST_NODE,
 99	MAX_NODES
100};
101
102enum xgene_cle_byte_store {
103	NO_BYTE,
104	FIRST_BYTE,
105	SECOND_BYTE,
106	BOTH_BYTES
107};
108
109/* Preclassification operation types */
110enum xgene_cle_node_type {
111	INV,
112	KN,
113	EWDN,
114	RES_NODE
115};
116
117/* Preclassification operation types */
118enum xgene_cle_op_type {
119	EQT,
120	NEQT,
121	LTEQT,
122	GTEQT,
123	AND,
124	NAND
125};
126
127enum xgene_cle_parser {
128	PARSER0,
129	PARSER1,
130	PARSER2,
131	PARSER_ALL
132};
133
134#define XGENE_CLE_DRAM(type)	(((type) & 0xf) << 28)
135enum xgene_cle_dram_type {
136	PKT_RAM,
137	RSS_IDT,
138	RSS_IPV4_HASH_SKEY,
139	PTREE_RAM = 0xc,
140	AVL_RAM,
141	DB_RAM
142};
143
144enum xgene_cle_cmd_type {
145	CLE_CMD_WR = 1,
146	CLE_CMD_RD = 2,
147	CLE_CMD_AVL_ADD = 8,
148	CLE_CMD_AVL_DEL = 16,
149	CLE_CMD_AVL_SRCH = 32
150};
151
152enum xgene_cle_ipv4_rss_hashtype {
153	RSS_IPV4_8B,
154	RSS_IPV4_12B,
155};
156
157enum xgene_cle_prot_type {
158	XGENE_CLE_TCP,
159	XGENE_CLE_UDP,
160	XGENE_CLE_ESP,
161	XGENE_CLE_OTHER
162};
163
164enum xgene_cle_prot_version {
165	XGENE_CLE_IPV4,
166};
167
168enum xgene_cle_ptree_dbptrs {
169	DB_RES_DROP,
170	DB_RES_DEF,
171	DB_RES_ACCEPT,
172	DB_MAX_PTRS
173};
174
175/* RSS sideband signal info */
176#define SB_IPFRAG_POS	0
177#define SB_IPFRAG_LEN	1
178#define SB_IPPROT_POS	1
179#define SB_IPPROT_LEN	2
180#define SB_IPVER_POS	3
181#define SB_IPVER_LEN	1
182#define SB_HDRLEN_POS	4
183#define SB_HDRLEN_LEN	12
184
185/* RSS indirection table */
186#define XGENE_CLE_IDT_ENTRIES	128
187#define IDT_DSTQID_POS		0
188#define IDT_DSTQID_LEN		12
189#define IDT_FPSEL_POS		12
190#define IDT_FPSEL_LEN		5
191#define IDT_NFPSEL_POS		17
192#define IDT_NFPSEL_LEN		5
193#define IDT_FPSEL1_POS		12
194#define IDT_FPSEL1_LEN		4
195#define IDT_NFPSEL1_POS		16
196#define IDT_NFPSEL1_LEN		4
197
198struct xgene_cle_ptree_branch {
199	bool valid;
200	u16 next_packet_pointer;
201	bool jump_bw;
202	bool jump_rel;
203	u8 operation;
204	u16 next_node;
205	u8 next_branch;
206	u16 data;
207	u16 mask;
208};
209
210struct xgene_cle_ptree_ewdn {
211	u8 node_type;
212	bool last_node;
213	bool hdr_len_store;
214	u8 hdr_extn;
215	u8 byte_store;
216	u8 search_byte_store;
217	u16 result_pointer;
218	u8 num_branches;
219	struct xgene_cle_ptree_branch branch[6];
220};
221
222struct xgene_cle_ptree_key {
223	u8 priority;
224	u16 result_pointer;
225};
226
227struct xgene_cle_ptree_kn {
228	u8 node_type;
229	u8 num_keys;
230	struct xgene_cle_ptree_key key[32];
231};
232
233struct xgene_cle_dbptr {
234	u8 split_boundary;
235	u8 mirror_nxtfpsel;
236	u8 mirror_fpsel;
237	u16 mirror_dstqid;
238	u8 drop;
239	u8 mirror;
240	u8 hdr_data_split;
241	u64 hopinfomsbs;
242	u8 DR;
243	u8 HR;
244	u64 hopinfomlsbs;
245	u16 h0enq_num;
246	u8 h0fpsel;
247	u8 nxtfpsel;
248	u8 fpsel;
249	u16 dstqid;
250	u8 cle_priority;
251	u8 cle_flowgroup;
252	u8 cle_perflow;
253	u8 cle_insert_timestamp;
254	u8 stash;
255	u8 in;
256	u8 perprioen;
257	u8 perflowgroupen;
258	u8 perflowen;
259	u8 selhash;
260	u8 selhdrext;
261	u8 mirror_nxtfpsel_msb;
262	u8 mirror_fpsel_msb;
263	u8 hfpsel_msb;
264	u8 nxtfpsel_msb;
265	u8 fpsel_msb;
266};
267
268struct xgene_cle_ptree {
269	struct xgene_cle_ptree_kn *kn;
270	struct xgene_cle_dbptr *dbptr;
271	u32 num_kn;
272	u32 num_dbptr;
273	u32 start_node;
274	u32 start_pkt;
275	u32 start_dbptr;
276};
277
278struct xgene_enet_cle {
279	void __iomem *base;
280	struct xgene_cle_ptree ptree;
281	enum xgene_cle_parser active_parser;
282	u32 parsers;
283	u32 max_nodes;
284	u32 max_dbptrs;
285	u32 jump_bytes;
286};
287
288extern const struct xgene_cle_ops xgene_cle3in_ops;
289
290#endif /* __XGENE_ENET_CLE_H__ */