123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- /* Applied Micro X-Gene SoC Ethernet Classifier structures
- *
- * Copyright (c) 2016, Applied Micro Circuits Corporation
- * Authors: Khuong Dinh <kdinh@apm.com>
- * Tanmay Inamdar <tinamdar@apm.com>
- * Iyappan Subramanian <isubramanian@apm.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- #ifndef __XGENE_ENET_CLE_H__
- #define __XGENE_ENET_CLE_H__
- #include <linux/io.h>
- #include <linux/random.h>
- /* Register offsets */
- #define INDADDR 0x04
- #define INDCMD 0x08
- #define INDCMD_STATUS 0x0c
- #define DATA_RAM0 0x10
- #define SNPTR0 0x0100
- #define SPPTR0 0x0104
- #define DFCLSRESDBPTR0 0x0108
- #define DFCLSRESDB00 0x010c
- #define RSS_CTRL0 0x0000013c
- #define CLE_CMD_TO 10 /* ms */
- #define CLE_PKTRAM_SIZE 256 /* bytes */
- #define CLE_PORT_OFFSET 0x200
- #define CLE_DRAM_REGS 17
- #define CLE_DN_TYPE_LEN 2
- #define CLE_DN_TYPE_POS 0
- #define CLE_DN_LASTN_LEN 1
- #define CLE_DN_LASTN_POS 2
- #define CLE_DN_HLS_LEN 1
- #define CLE_DN_HLS_POS 3
- #define CLE_DN_EXT_LEN 2
- #define CLE_DN_EXT_POS 4
- #define CLE_DN_BSTOR_LEN 2
- #define CLE_DN_BSTOR_POS 6
- #define CLE_DN_SBSTOR_LEN 2
- #define CLE_DN_SBSTOR_POS 8
- #define CLE_DN_RPTR_LEN 12
- #define CLE_DN_RPTR_POS 12
- #define CLE_BR_VALID_LEN 1
- #define CLE_BR_VALID_POS 0
- #define CLE_BR_NPPTR_LEN 9
- #define CLE_BR_NPPTR_POS 1
- #define CLE_BR_JB_LEN 1
- #define CLE_BR_JB_POS 10
- #define CLE_BR_JR_LEN 1
- #define CLE_BR_JR_POS 11
- #define CLE_BR_OP_LEN 3
- #define CLE_BR_OP_POS 12
- #define CLE_BR_NNODE_LEN 9
- #define CLE_BR_NNODE_POS 15
- #define CLE_BR_NBR_LEN 5
- #define CLE_BR_NBR_POS 24
- #define CLE_BR_DATA_LEN 16
- #define CLE_BR_DATA_POS 0
- #define CLE_BR_MASK_LEN 16
- #define CLE_BR_MASK_POS 16
- #define CLE_KN_PRIO_POS 0
- #define CLE_KN_PRIO_LEN 3
- #define CLE_KN_RPTR_POS 3
- #define CLE_KN_RPTR_LEN 10
- #define CLE_TYPE_POS 0
- #define CLE_TYPE_LEN 2
- #define CLE_DROP_POS 28
- #define CLE_DROP_LEN 1
- #define CLE_DSTQIDL_POS 25
- #define CLE_DSTQIDL_LEN 7
- #define CLE_DSTQIDH_POS 0
- #define CLE_DSTQIDH_LEN 5
- #define CLE_FPSEL_POS 21
- #define CLE_FPSEL_LEN 4
- #define CLE_NFPSEL_POS 17
- #define CLE_NFPSEL_LEN 4
- #define CLE_PRIORITY_POS 5
- #define CLE_PRIORITY_LEN 3
- #define JMP_ABS 0
- #define JMP_REL 1
- #define JMP_FW 0
- #define JMP_BW 1
- enum xgene_cle_ptree_nodes {
- PKT_TYPE_NODE,
- PKT_PROT_NODE,
- RSS_IPV4_TCP_NODE,
- RSS_IPV4_UDP_NODE,
- RSS_IPV4_OTHERS_NODE,
- LAST_NODE,
- MAX_NODES
- };
- enum xgene_cle_byte_store {
- NO_BYTE,
- FIRST_BYTE,
- SECOND_BYTE,
- BOTH_BYTES
- };
- /* Preclassification operation types */
- enum xgene_cle_node_type {
- INV,
- KN,
- EWDN,
- RES_NODE
- };
- /* Preclassification operation types */
- enum xgene_cle_op_type {
- EQT,
- NEQT,
- LTEQT,
- GTEQT,
- AND,
- NAND
- };
- enum xgene_cle_parser {
- PARSER0,
- PARSER1,
- PARSER2,
- PARSER_ALL
- };
- #define XGENE_CLE_DRAM(type) (((type) & 0xf) << 28)
- enum xgene_cle_dram_type {
- PKT_RAM,
- RSS_IDT,
- RSS_IPV4_HASH_SKEY,
- PTREE_RAM = 0xc,
- AVL_RAM,
- DB_RAM
- };
- enum xgene_cle_cmd_type {
- CLE_CMD_WR = 1,
- CLE_CMD_RD = 2,
- CLE_CMD_AVL_ADD = 8,
- CLE_CMD_AVL_DEL = 16,
- CLE_CMD_AVL_SRCH = 32
- };
- enum xgene_cle_ipv4_rss_hashtype {
- RSS_IPV4_8B,
- RSS_IPV4_12B,
- };
- enum xgene_cle_prot_type {
- XGENE_CLE_TCP,
- XGENE_CLE_UDP,
- XGENE_CLE_ESP,
- XGENE_CLE_OTHER
- };
- enum xgene_cle_prot_version {
- XGENE_CLE_IPV4,
- };
- enum xgene_cle_ptree_dbptrs {
- DB_RES_DROP,
- DB_RES_DEF,
- DB_RES_ACCEPT,
- DB_MAX_PTRS
- };
- /* RSS sideband signal info */
- #define SB_IPFRAG_POS 0
- #define SB_IPFRAG_LEN 1
- #define SB_IPPROT_POS 1
- #define SB_IPPROT_LEN 2
- #define SB_IPVER_POS 3
- #define SB_IPVER_LEN 1
- #define SB_HDRLEN_POS 4
- #define SB_HDRLEN_LEN 12
- /* RSS indirection table */
- #define XGENE_CLE_IDT_ENTRIES 128
- #define IDT_DSTQID_POS 0
- #define IDT_DSTQID_LEN 12
- #define IDT_FPSEL_POS 12
- #define IDT_FPSEL_LEN 5
- #define IDT_NFPSEL_POS 17
- #define IDT_NFPSEL_LEN 5
- #define IDT_FPSEL1_POS 12
- #define IDT_FPSEL1_LEN 4
- #define IDT_NFPSEL1_POS 16
- #define IDT_NFPSEL1_LEN 4
- struct xgene_cle_ptree_branch {
- bool valid;
- u16 next_packet_pointer;
- bool jump_bw;
- bool jump_rel;
- u8 operation;
- u16 next_node;
- u8 next_branch;
- u16 data;
- u16 mask;
- };
- struct xgene_cle_ptree_ewdn {
- u8 node_type;
- bool last_node;
- bool hdr_len_store;
- u8 hdr_extn;
- u8 byte_store;
- u8 search_byte_store;
- u16 result_pointer;
- u8 num_branches;
- struct xgene_cle_ptree_branch branch[6];
- };
- struct xgene_cle_ptree_key {
- u8 priority;
- u16 result_pointer;
- };
- struct xgene_cle_ptree_kn {
- u8 node_type;
- u8 num_keys;
- struct xgene_cle_ptree_key key[32];
- };
- struct xgene_cle_dbptr {
- u8 split_boundary;
- u8 mirror_nxtfpsel;
- u8 mirror_fpsel;
- u16 mirror_dstqid;
- u8 drop;
- u8 mirror;
- u8 hdr_data_split;
- u64 hopinfomsbs;
- u8 DR;
- u8 HR;
- u64 hopinfomlsbs;
- u16 h0enq_num;
- u8 h0fpsel;
- u8 nxtfpsel;
- u8 fpsel;
- u16 dstqid;
- u8 cle_priority;
- u8 cle_flowgroup;
- u8 cle_perflow;
- u8 cle_insert_timestamp;
- u8 stash;
- u8 in;
- u8 perprioen;
- u8 perflowgroupen;
- u8 perflowen;
- u8 selhash;
- u8 selhdrext;
- u8 mirror_nxtfpsel_msb;
- u8 mirror_fpsel_msb;
- u8 hfpsel_msb;
- u8 nxtfpsel_msb;
- u8 fpsel_msb;
- };
- struct xgene_cle_ptree {
- struct xgene_cle_ptree_kn *kn;
- struct xgene_cle_dbptr *dbptr;
- u32 num_kn;
- u32 num_dbptr;
- u32 start_node;
- u32 start_pkt;
- u32 start_dbptr;
- };
- struct xgene_enet_cle {
- void __iomem *base;
- struct xgene_cle_ptree ptree;
- enum xgene_cle_parser active_parser;
- u32 parsers;
- u32 max_nodes;
- u32 max_dbptrs;
- u32 jump_bytes;
- };
- extern const struct xgene_cle_ops xgene_cle3in_ops;
- #endif /* __XGENE_ENET_CLE_H__ */
|