xref: /openbmc/linux/drivers/net/ethernet/apm/xgene/xgene_enet_cle.h (revision 58e16d792a6a8c6b750f637a4649967fcac853dc)
1*1ccea77eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
276f94a9cSIyappan Subramanian /* Applied Micro X-Gene SoC Ethernet Classifier structures
376f94a9cSIyappan Subramanian  *
476f94a9cSIyappan Subramanian  * Copyright (c) 2016, Applied Micro Circuits Corporation
576f94a9cSIyappan Subramanian  * Authors: Khuong Dinh <kdinh@apm.com>
676f94a9cSIyappan Subramanian  *          Tanmay Inamdar <tinamdar@apm.com>
776f94a9cSIyappan Subramanian  *          Iyappan Subramanian <isubramanian@apm.com>
876f94a9cSIyappan Subramanian  */
976f94a9cSIyappan Subramanian 
1076f94a9cSIyappan Subramanian #ifndef __XGENE_ENET_CLE_H__
1176f94a9cSIyappan Subramanian #define __XGENE_ENET_CLE_H__
1276f94a9cSIyappan Subramanian 
1376f94a9cSIyappan Subramanian #include <linux/io.h>
1476f94a9cSIyappan Subramanian #include <linux/random.h>
1576f94a9cSIyappan Subramanian 
1676f94a9cSIyappan Subramanian /* Register offsets */
1776f94a9cSIyappan Subramanian #define INDADDR			0x04
1876f94a9cSIyappan Subramanian #define INDCMD			0x08
1976f94a9cSIyappan Subramanian #define INDCMD_STATUS		0x0c
2076f94a9cSIyappan Subramanian #define DATA_RAM0		0x10
2176f94a9cSIyappan Subramanian #define SNPTR0			0x0100
2276f94a9cSIyappan Subramanian #define SPPTR0			0x0104
2376f94a9cSIyappan Subramanian #define DFCLSRESDBPTR0		0x0108
2476f94a9cSIyappan Subramanian #define DFCLSRESDB00		0x010c
25fc4262d2SIyappan Subramanian #define RSS_CTRL0		0x0000013c
2676f94a9cSIyappan Subramanian 
2776f94a9cSIyappan Subramanian #define CLE_CMD_TO		10	/* ms */
2876f94a9cSIyappan Subramanian #define CLE_PKTRAM_SIZE		256	/* bytes */
2976f94a9cSIyappan Subramanian #define CLE_PORT_OFFSET		0x200
3076f94a9cSIyappan Subramanian #define CLE_DRAM_REGS		17
3176f94a9cSIyappan Subramanian 
3276f94a9cSIyappan Subramanian #define CLE_DN_TYPE_LEN		2
3376f94a9cSIyappan Subramanian #define CLE_DN_TYPE_POS		0
3476f94a9cSIyappan Subramanian #define CLE_DN_LASTN_LEN	1
3576f94a9cSIyappan Subramanian #define CLE_DN_LASTN_POS	2
3676f94a9cSIyappan Subramanian #define CLE_DN_HLS_LEN		1
3776f94a9cSIyappan Subramanian #define CLE_DN_HLS_POS		3
3876f94a9cSIyappan Subramanian #define CLE_DN_EXT_LEN		2
3976f94a9cSIyappan Subramanian #define	CLE_DN_EXT_POS		4
4076f94a9cSIyappan Subramanian #define CLE_DN_BSTOR_LEN	2
4176f94a9cSIyappan Subramanian #define CLE_DN_BSTOR_POS	6
4276f94a9cSIyappan Subramanian #define CLE_DN_SBSTOR_LEN	2
4376f94a9cSIyappan Subramanian #define CLE_DN_SBSTOR_POS	8
4476f94a9cSIyappan Subramanian #define CLE_DN_RPTR_LEN		12
4576f94a9cSIyappan Subramanian #define CLE_DN_RPTR_POS		12
4676f94a9cSIyappan Subramanian 
4776f94a9cSIyappan Subramanian #define CLE_BR_VALID_LEN	1
4876f94a9cSIyappan Subramanian #define CLE_BR_VALID_POS	0
4976f94a9cSIyappan Subramanian #define CLE_BR_NPPTR_LEN	9
5076f94a9cSIyappan Subramanian #define CLE_BR_NPPTR_POS	1
5176f94a9cSIyappan Subramanian #define CLE_BR_JB_LEN		1
5276f94a9cSIyappan Subramanian #define CLE_BR_JB_POS		10
5376f94a9cSIyappan Subramanian #define CLE_BR_JR_LEN		1
5476f94a9cSIyappan Subramanian #define CLE_BR_JR_POS		11
5576f94a9cSIyappan Subramanian #define CLE_BR_OP_LEN		3
5676f94a9cSIyappan Subramanian #define CLE_BR_OP_POS		12
5776f94a9cSIyappan Subramanian #define CLE_BR_NNODE_LEN	9
5876f94a9cSIyappan Subramanian #define CLE_BR_NNODE_POS	15
5976f94a9cSIyappan Subramanian #define CLE_BR_NBR_LEN		5
6076f94a9cSIyappan Subramanian #define CLE_BR_NBR_POS		24
6176f94a9cSIyappan Subramanian 
6276f94a9cSIyappan Subramanian #define CLE_BR_DATA_LEN		16
6376f94a9cSIyappan Subramanian #define CLE_BR_DATA_POS		0
6476f94a9cSIyappan Subramanian #define CLE_BR_MASK_LEN		16
6576f94a9cSIyappan Subramanian #define CLE_BR_MASK_POS		16
6676f94a9cSIyappan Subramanian 
6776f94a9cSIyappan Subramanian #define CLE_KN_PRIO_POS		0
6876f94a9cSIyappan Subramanian #define CLE_KN_PRIO_LEN		3
6976f94a9cSIyappan Subramanian #define CLE_KN_RPTR_POS		3
7076f94a9cSIyappan Subramanian #define CLE_KN_RPTR_LEN		10
7176f94a9cSIyappan Subramanian #define CLE_TYPE_POS		0
7276f94a9cSIyappan Subramanian #define CLE_TYPE_LEN		2
7376f94a9cSIyappan Subramanian 
74b30cfd24SIyappan Subramanian #define CLE_DROP_POS		28
75b30cfd24SIyappan Subramanian #define CLE_DROP_LEN		1
7676f94a9cSIyappan Subramanian #define CLE_DSTQIDL_POS		25
7776f94a9cSIyappan Subramanian #define CLE_DSTQIDL_LEN		7
7876f94a9cSIyappan Subramanian #define CLE_DSTQIDH_POS		0
7976f94a9cSIyappan Subramanian #define CLE_DSTQIDH_LEN		5
8076f94a9cSIyappan Subramanian #define CLE_FPSEL_POS		21
8176f94a9cSIyappan Subramanian #define CLE_FPSEL_LEN		4
82d6d48969SIyappan Subramanian #define CLE_NFPSEL_POS		17
83d6d48969SIyappan Subramanian #define CLE_NFPSEL_LEN		4
8476f94a9cSIyappan Subramanian #define CLE_PRIORITY_POS	5
8576f94a9cSIyappan Subramanian #define CLE_PRIORITY_LEN	3
8676f94a9cSIyappan Subramanian 
8776f94a9cSIyappan Subramanian #define JMP_ABS			0
8876f94a9cSIyappan Subramanian #define JMP_REL			1
8976f94a9cSIyappan Subramanian #define JMP_FW			0
9076f94a9cSIyappan Subramanian #define JMP_BW			1
9176f94a9cSIyappan Subramanian 
9276f94a9cSIyappan Subramanian enum xgene_cle_ptree_nodes {
9376f94a9cSIyappan Subramanian 	PKT_TYPE_NODE,
94fc4262d2SIyappan Subramanian 	PKT_PROT_NODE,
95fc4262d2SIyappan Subramanian 	RSS_IPV4_TCP_NODE,
96fc4262d2SIyappan Subramanian 	RSS_IPV4_UDP_NODE,
97a809701fSIyappan Subramanian 	RSS_IPV4_OTHERS_NODE,
9876f94a9cSIyappan Subramanian 	LAST_NODE,
9976f94a9cSIyappan Subramanian 	MAX_NODES
10076f94a9cSIyappan Subramanian };
10176f94a9cSIyappan Subramanian 
10276f94a9cSIyappan Subramanian enum xgene_cle_byte_store {
10376f94a9cSIyappan Subramanian 	NO_BYTE,
10476f94a9cSIyappan Subramanian 	FIRST_BYTE,
10576f94a9cSIyappan Subramanian 	SECOND_BYTE,
10676f94a9cSIyappan Subramanian 	BOTH_BYTES
10776f94a9cSIyappan Subramanian };
10876f94a9cSIyappan Subramanian 
10976f94a9cSIyappan Subramanian /* Preclassification operation types */
11076f94a9cSIyappan Subramanian enum xgene_cle_node_type {
11176f94a9cSIyappan Subramanian 	INV,
11276f94a9cSIyappan Subramanian 	KN,
11376f94a9cSIyappan Subramanian 	EWDN,
11476f94a9cSIyappan Subramanian 	RES_NODE
11576f94a9cSIyappan Subramanian };
11676f94a9cSIyappan Subramanian 
11776f94a9cSIyappan Subramanian /* Preclassification operation types */
11876f94a9cSIyappan Subramanian enum xgene_cle_op_type {
11976f94a9cSIyappan Subramanian 	EQT,
12076f94a9cSIyappan Subramanian 	NEQT,
12176f94a9cSIyappan Subramanian 	LTEQT,
12276f94a9cSIyappan Subramanian 	GTEQT,
12376f94a9cSIyappan Subramanian 	AND,
12476f94a9cSIyappan Subramanian 	NAND
12576f94a9cSIyappan Subramanian };
12676f94a9cSIyappan Subramanian 
12776f94a9cSIyappan Subramanian enum xgene_cle_parser {
12876f94a9cSIyappan Subramanian 	PARSER0,
12976f94a9cSIyappan Subramanian 	PARSER1,
13076f94a9cSIyappan Subramanian 	PARSER2,
13176f94a9cSIyappan Subramanian 	PARSER_ALL
13276f94a9cSIyappan Subramanian };
13376f94a9cSIyappan Subramanian 
13476f94a9cSIyappan Subramanian #define XGENE_CLE_DRAM(type)	(((type) & 0xf) << 28)
13576f94a9cSIyappan Subramanian enum xgene_cle_dram_type {
13676f94a9cSIyappan Subramanian 	PKT_RAM,
137fc4262d2SIyappan Subramanian 	RSS_IDT,
138fc4262d2SIyappan Subramanian 	RSS_IPV4_HASH_SKEY,
13976f94a9cSIyappan Subramanian 	PTREE_RAM = 0xc,
14076f94a9cSIyappan Subramanian 	AVL_RAM,
14176f94a9cSIyappan Subramanian 	DB_RAM
14276f94a9cSIyappan Subramanian };
14376f94a9cSIyappan Subramanian 
14476f94a9cSIyappan Subramanian enum xgene_cle_cmd_type {
14576f94a9cSIyappan Subramanian 	CLE_CMD_WR = 1,
14676f94a9cSIyappan Subramanian 	CLE_CMD_RD = 2,
14776f94a9cSIyappan Subramanian 	CLE_CMD_AVL_ADD = 8,
14876f94a9cSIyappan Subramanian 	CLE_CMD_AVL_DEL = 16,
14976f94a9cSIyappan Subramanian 	CLE_CMD_AVL_SRCH = 32
15076f94a9cSIyappan Subramanian };
15176f94a9cSIyappan Subramanian 
152fc4262d2SIyappan Subramanian enum xgene_cle_ipv4_rss_hashtype {
153fc4262d2SIyappan Subramanian 	RSS_IPV4_8B,
154fc4262d2SIyappan Subramanian 	RSS_IPV4_12B,
155fc4262d2SIyappan Subramanian };
156fc4262d2SIyappan Subramanian 
157fc4262d2SIyappan Subramanian enum xgene_cle_prot_type {
158fc4262d2SIyappan Subramanian 	XGENE_CLE_TCP,
159fc4262d2SIyappan Subramanian 	XGENE_CLE_UDP,
160fc4262d2SIyappan Subramanian 	XGENE_CLE_ESP,
161fc4262d2SIyappan Subramanian 	XGENE_CLE_OTHER
162fc4262d2SIyappan Subramanian };
163fc4262d2SIyappan Subramanian 
164fc4262d2SIyappan Subramanian enum xgene_cle_prot_version {
165fc4262d2SIyappan Subramanian 	XGENE_CLE_IPV4,
166fc4262d2SIyappan Subramanian };
167fc4262d2SIyappan Subramanian 
16876f94a9cSIyappan Subramanian enum xgene_cle_ptree_dbptrs {
16976f94a9cSIyappan Subramanian 	DB_RES_DROP,
17076f94a9cSIyappan Subramanian 	DB_RES_DEF,
17176f94a9cSIyappan Subramanian 	DB_RES_ACCEPT,
17276f94a9cSIyappan Subramanian 	DB_MAX_PTRS
17376f94a9cSIyappan Subramanian };
17476f94a9cSIyappan Subramanian 
175fc4262d2SIyappan Subramanian /* RSS sideband signal info */
176fc4262d2SIyappan Subramanian #define SB_IPFRAG_POS	0
177fc4262d2SIyappan Subramanian #define SB_IPFRAG_LEN	1
178fc4262d2SIyappan Subramanian #define SB_IPPROT_POS	1
179fc4262d2SIyappan Subramanian #define SB_IPPROT_LEN	2
180fc4262d2SIyappan Subramanian #define SB_IPVER_POS	3
181fc4262d2SIyappan Subramanian #define SB_IPVER_LEN	1
182fc4262d2SIyappan Subramanian #define SB_HDRLEN_POS	4
183fc4262d2SIyappan Subramanian #define SB_HDRLEN_LEN	12
184fc4262d2SIyappan Subramanian 
185fc4262d2SIyappan Subramanian /* RSS indirection table */
186fc4262d2SIyappan Subramanian #define XGENE_CLE_IDT_ENTRIES	128
187fc4262d2SIyappan Subramanian #define IDT_DSTQID_POS		0
188fc4262d2SIyappan Subramanian #define IDT_DSTQID_LEN		12
189fc4262d2SIyappan Subramanian #define IDT_FPSEL_POS		12
19029b4eafbSIyappan Subramanian #define IDT_FPSEL_LEN		5
19129b4eafbSIyappan Subramanian #define IDT_NFPSEL_POS		17
19229b4eafbSIyappan Subramanian #define IDT_NFPSEL_LEN		5
19329b4eafbSIyappan Subramanian #define IDT_FPSEL1_POS		12
19429b4eafbSIyappan Subramanian #define IDT_FPSEL1_LEN		4
19529b4eafbSIyappan Subramanian #define IDT_NFPSEL1_POS		16
19629b4eafbSIyappan Subramanian #define IDT_NFPSEL1_LEN		4
197fc4262d2SIyappan Subramanian 
19876f94a9cSIyappan Subramanian struct xgene_cle_ptree_branch {
19976f94a9cSIyappan Subramanian 	bool valid;
20076f94a9cSIyappan Subramanian 	u16 next_packet_pointer;
20176f94a9cSIyappan Subramanian 	bool jump_bw;
20276f94a9cSIyappan Subramanian 	bool jump_rel;
20376f94a9cSIyappan Subramanian 	u8 operation;
20476f94a9cSIyappan Subramanian 	u16 next_node;
20576f94a9cSIyappan Subramanian 	u8 next_branch;
20676f94a9cSIyappan Subramanian 	u16 data;
20776f94a9cSIyappan Subramanian 	u16 mask;
20876f94a9cSIyappan Subramanian };
20976f94a9cSIyappan Subramanian 
21076f94a9cSIyappan Subramanian struct xgene_cle_ptree_ewdn {
21176f94a9cSIyappan Subramanian 	u8 node_type;
21276f94a9cSIyappan Subramanian 	bool last_node;
21376f94a9cSIyappan Subramanian 	bool hdr_len_store;
21476f94a9cSIyappan Subramanian 	u8 hdr_extn;
21576f94a9cSIyappan Subramanian 	u8 byte_store;
21676f94a9cSIyappan Subramanian 	u8 search_byte_store;
21776f94a9cSIyappan Subramanian 	u16 result_pointer;
21876f94a9cSIyappan Subramanian 	u8 num_branches;
21976f94a9cSIyappan Subramanian 	struct xgene_cle_ptree_branch branch[6];
22076f94a9cSIyappan Subramanian };
22176f94a9cSIyappan Subramanian 
22276f94a9cSIyappan Subramanian struct xgene_cle_ptree_key {
22376f94a9cSIyappan Subramanian 	u8 priority;
22476f94a9cSIyappan Subramanian 	u16 result_pointer;
22576f94a9cSIyappan Subramanian };
22676f94a9cSIyappan Subramanian 
22776f94a9cSIyappan Subramanian struct xgene_cle_ptree_kn {
22876f94a9cSIyappan Subramanian 	u8 node_type;
22976f94a9cSIyappan Subramanian 	u8 num_keys;
23076f94a9cSIyappan Subramanian 	struct xgene_cle_ptree_key key[32];
23176f94a9cSIyappan Subramanian };
23276f94a9cSIyappan Subramanian 
23376f94a9cSIyappan Subramanian struct xgene_cle_dbptr {
23476f94a9cSIyappan Subramanian 	u8 split_boundary;
23576f94a9cSIyappan Subramanian 	u8 mirror_nxtfpsel;
23676f94a9cSIyappan Subramanian 	u8 mirror_fpsel;
23776f94a9cSIyappan Subramanian 	u16 mirror_dstqid;
23876f94a9cSIyappan Subramanian 	u8 drop;
23976f94a9cSIyappan Subramanian 	u8 mirror;
24076f94a9cSIyappan Subramanian 	u8 hdr_data_split;
24176f94a9cSIyappan Subramanian 	u64 hopinfomsbs;
24276f94a9cSIyappan Subramanian 	u8 DR;
24376f94a9cSIyappan Subramanian 	u8 HR;
24476f94a9cSIyappan Subramanian 	u64 hopinfomlsbs;
24576f94a9cSIyappan Subramanian 	u16 h0enq_num;
24676f94a9cSIyappan Subramanian 	u8 h0fpsel;
24776f94a9cSIyappan Subramanian 	u8 nxtfpsel;
24876f94a9cSIyappan Subramanian 	u8 fpsel;
24976f94a9cSIyappan Subramanian 	u16 dstqid;
25076f94a9cSIyappan Subramanian 	u8 cle_priority;
25176f94a9cSIyappan Subramanian 	u8 cle_flowgroup;
25276f94a9cSIyappan Subramanian 	u8 cle_perflow;
25376f94a9cSIyappan Subramanian 	u8 cle_insert_timestamp;
25476f94a9cSIyappan Subramanian 	u8 stash;
25576f94a9cSIyappan Subramanian 	u8 in;
25676f94a9cSIyappan Subramanian 	u8 perprioen;
25776f94a9cSIyappan Subramanian 	u8 perflowgroupen;
25876f94a9cSIyappan Subramanian 	u8 perflowen;
25976f94a9cSIyappan Subramanian 	u8 selhash;
26076f94a9cSIyappan Subramanian 	u8 selhdrext;
26176f94a9cSIyappan Subramanian 	u8 mirror_nxtfpsel_msb;
26276f94a9cSIyappan Subramanian 	u8 mirror_fpsel_msb;
26376f94a9cSIyappan Subramanian 	u8 hfpsel_msb;
26476f94a9cSIyappan Subramanian 	u8 nxtfpsel_msb;
26576f94a9cSIyappan Subramanian 	u8 fpsel_msb;
26676f94a9cSIyappan Subramanian };
26776f94a9cSIyappan Subramanian 
26876f94a9cSIyappan Subramanian struct xgene_cle_ptree {
26976f94a9cSIyappan Subramanian 	struct xgene_cle_ptree_kn *kn;
27076f94a9cSIyappan Subramanian 	struct xgene_cle_dbptr *dbptr;
27176f94a9cSIyappan Subramanian 	u32 num_kn;
27276f94a9cSIyappan Subramanian 	u32 num_dbptr;
27376f94a9cSIyappan Subramanian 	u32 start_node;
27476f94a9cSIyappan Subramanian 	u32 start_pkt;
27576f94a9cSIyappan Subramanian 	u32 start_dbptr;
27676f94a9cSIyappan Subramanian };
27776f94a9cSIyappan Subramanian 
27876f94a9cSIyappan Subramanian struct xgene_enet_cle {
27976f94a9cSIyappan Subramanian 	void __iomem *base;
28076f94a9cSIyappan Subramanian 	struct xgene_cle_ptree ptree;
28176f94a9cSIyappan Subramanian 	enum xgene_cle_parser active_parser;
28276f94a9cSIyappan Subramanian 	u32 parsers;
28376f94a9cSIyappan Subramanian 	u32 max_nodes;
28476f94a9cSIyappan Subramanian 	u32 max_dbptrs;
28576f94a9cSIyappan Subramanian 	u32 jump_bytes;
28676f94a9cSIyappan Subramanian };
28776f94a9cSIyappan Subramanian 
288b555a3d1SJulia Lawall extern const struct xgene_cle_ops xgene_cle3in_ops;
28976f94a9cSIyappan Subramanian 
29076f94a9cSIyappan Subramanian #endif /* __XGENE_ENET_CLE_H__ */
291