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