cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mvpp2_prs.h (11966B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Header Parser definitions for Marvell PPv2 Network Controller
      4 *
      5 * Copyright (C) 2014 Marvell
      6 *
      7 * Marcin Wojtas <mw@semihalf.com>
      8 */
      9#ifndef _MVPP2_PRS_H_
     10#define _MVPP2_PRS_H_
     11
     12#include <linux/kernel.h>
     13#include <linux/netdevice.h>
     14#include <linux/platform_device.h>
     15
     16#include "mvpp2.h"
     17
     18/* Parser constants */
     19#define MVPP2_PRS_TCAM_SRAM_SIZE	256
     20#define MVPP2_PRS_TCAM_WORDS		6
     21#define MVPP2_PRS_SRAM_WORDS		4
     22#define MVPP2_PRS_FLOW_ID_SIZE		64
     23#define MVPP2_PRS_FLOW_ID_MASK		0x3f
     24#define MVPP2_PRS_TCAM_ENTRY_INVALID	1
     25#define MVPP2_PRS_TCAM_DSA_TAGGED_BIT	BIT(5)
     26#define MVPP2_PRS_IPV4_HEAD		0x40
     27#define MVPP2_PRS_IPV4_HEAD_MASK	0xf0
     28#define MVPP2_PRS_IPV4_MC		0xe0
     29#define MVPP2_PRS_IPV4_MC_MASK		0xf0
     30#define MVPP2_PRS_IPV4_BC_MASK		0xff
     31#define MVPP2_PRS_IPV4_IHL_MIN		0x5
     32#define MVPP2_PRS_IPV4_IHL_MAX		0xf
     33#define MVPP2_PRS_IPV4_IHL_MASK		0xf
     34#define MVPP2_PRS_IPV6_MC		0xff
     35#define MVPP2_PRS_IPV6_MC_MASK		0xff
     36#define MVPP2_PRS_IPV6_HOP_MASK		0xff
     37#define MVPP2_PRS_TCAM_PROTO_MASK	0xff
     38#define MVPP2_PRS_TCAM_PROTO_MASK_L	0x3f
     39#define MVPP2_PRS_DBL_VLANS_MAX		100
     40#define MVPP2_PRS_CAST_MASK		BIT(0)
     41#define MVPP2_PRS_MCAST_VAL		BIT(0)
     42#define MVPP2_PRS_UCAST_VAL		0x0
     43
     44/* Tcam structure:
     45 * - lookup ID - 4 bits
     46 * - port ID - 1 byte
     47 * - additional information - 1 byte
     48 * - header data - 8 bytes
     49 * The fields are represented by MVPP2_PRS_TCAM_DATA_REG(5)->(0).
     50 */
     51#define MVPP2_PRS_AI_BITS			8
     52#define MVPP2_PRS_AI_MASK			0xff
     53#define MVPP2_PRS_PORT_MASK			0xff
     54#define MVPP2_PRS_LU_MASK			0xf
     55
     56/* TCAM entries in registers are accessed using 16 data bits + 16 enable bits */
     57#define MVPP2_PRS_BYTE_TO_WORD(byte)	((byte) / 2)
     58#define MVPP2_PRS_BYTE_IN_WORD(byte)	((byte) % 2)
     59
     60#define MVPP2_PRS_TCAM_EN(data)		((data) << 16)
     61#define MVPP2_PRS_TCAM_AI_WORD		4
     62#define MVPP2_PRS_TCAM_AI(ai)		(ai)
     63#define MVPP2_PRS_TCAM_AI_EN(ai)	MVPP2_PRS_TCAM_EN(MVPP2_PRS_TCAM_AI(ai))
     64#define MVPP2_PRS_TCAM_PORT_WORD	4
     65#define MVPP2_PRS_TCAM_PORT(p)		((p) << 8)
     66#define MVPP2_PRS_TCAM_PORT_EN(p)	MVPP2_PRS_TCAM_EN(MVPP2_PRS_TCAM_PORT(p))
     67#define MVPP2_PRS_TCAM_LU_WORD		5
     68#define MVPP2_PRS_TCAM_LU(lu)		(lu)
     69#define MVPP2_PRS_TCAM_LU_EN(lu)	MVPP2_PRS_TCAM_EN(MVPP2_PRS_TCAM_LU(lu))
     70#define MVPP2_PRS_TCAM_INV_WORD		5
     71
     72#define MVPP2_PRS_VID_TCAM_BYTE         2
     73
     74/* TCAM range for unicast and multicast filtering. We have 25 entries per port,
     75 * with 4 dedicated to UC filtering and the rest to multicast filtering.
     76 * Additionnally we reserve one entry for the broadcast address, and one for
     77 * each port's own address.
     78 */
     79#define MVPP2_PRS_MAC_UC_MC_FILT_MAX	25
     80#define MVPP2_PRS_MAC_RANGE_SIZE	80
     81
     82/* Number of entries per port dedicated to UC and MC filtering */
     83#define MVPP2_PRS_MAC_UC_FILT_MAX	4
     84#define MVPP2_PRS_MAC_MC_FILT_MAX	(MVPP2_PRS_MAC_UC_MC_FILT_MAX - \
     85					 MVPP2_PRS_MAC_UC_FILT_MAX)
     86
     87/* There is a TCAM range reserved for VLAN filtering entries, range size is 33
     88 * 10 VLAN ID filter entries per port
     89 * 1 default VLAN filter entry per port
     90 * It is assumed that there are 3 ports for filter, not including loopback port
     91 */
     92#define MVPP2_PRS_VLAN_FILT_MAX		11
     93#define MVPP2_PRS_VLAN_FILT_RANGE_SIZE	33
     94
     95#define MVPP2_PRS_VLAN_FILT_MAX_ENTRY   (MVPP2_PRS_VLAN_FILT_MAX - 2)
     96#define MVPP2_PRS_VLAN_FILT_DFLT_ENTRY  (MVPP2_PRS_VLAN_FILT_MAX - 1)
     97
     98/* Tcam entries ID */
     99#define MVPP2_PE_DROP_ALL		0
    100#define MVPP2_PE_FIRST_FREE_TID		1
    101
    102/* MAC filtering range */
    103#define MVPP2_PE_MAC_RANGE_END		(MVPP2_PE_VID_FILT_RANGE_START - 1)
    104#define MVPP2_PE_MAC_RANGE_START	(MVPP2_PE_MAC_RANGE_END - \
    105						MVPP2_PRS_MAC_RANGE_SIZE + 1)
    106/* VLAN filtering range */
    107#define MVPP2_PE_VID_FILT_RANGE_END     (MVPP2_PRS_TCAM_SRAM_SIZE - 32)
    108#define MVPP2_PE_VID_FILT_RANGE_START   (MVPP2_PE_VID_FILT_RANGE_END - \
    109					 MVPP2_PRS_VLAN_FILT_RANGE_SIZE + 1)
    110#define MVPP2_PE_LAST_FREE_TID          (MVPP2_PE_MAC_RANGE_START - 1)
    111#define MVPP2_PE_MH_SKIP_PRS		(MVPP2_PRS_TCAM_SRAM_SIZE - 31)
    112#define MVPP2_PE_IP6_EXT_PROTO_UN	(MVPP2_PRS_TCAM_SRAM_SIZE - 30)
    113#define MVPP2_PE_IP6_ADDR_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 29)
    114#define MVPP2_PE_IP4_ADDR_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 28)
    115#define MVPP2_PE_LAST_DEFAULT_FLOW	(MVPP2_PRS_TCAM_SRAM_SIZE - 27)
    116#define MVPP2_PE_FIRST_DEFAULT_FLOW	(MVPP2_PRS_TCAM_SRAM_SIZE - 22)
    117#define MVPP2_PE_EDSA_TAGGED		(MVPP2_PRS_TCAM_SRAM_SIZE - 21)
    118#define MVPP2_PE_EDSA_UNTAGGED		(MVPP2_PRS_TCAM_SRAM_SIZE - 20)
    119#define MVPP2_PE_DSA_TAGGED		(MVPP2_PRS_TCAM_SRAM_SIZE - 19)
    120#define MVPP2_PE_DSA_UNTAGGED		(MVPP2_PRS_TCAM_SRAM_SIZE - 18)
    121#define MVPP2_PE_ETYPE_EDSA_TAGGED	(MVPP2_PRS_TCAM_SRAM_SIZE - 17)
    122#define MVPP2_PE_ETYPE_EDSA_UNTAGGED	(MVPP2_PRS_TCAM_SRAM_SIZE - 16)
    123#define MVPP2_PE_ETYPE_DSA_TAGGED	(MVPP2_PRS_TCAM_SRAM_SIZE - 15)
    124#define MVPP2_PE_ETYPE_DSA_UNTAGGED	(MVPP2_PRS_TCAM_SRAM_SIZE - 14)
    125#define MVPP2_PE_MH_DEFAULT		(MVPP2_PRS_TCAM_SRAM_SIZE - 13)
    126#define MVPP2_PE_DSA_DEFAULT		(MVPP2_PRS_TCAM_SRAM_SIZE - 12)
    127#define MVPP2_PE_IP6_PROTO_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 11)
    128#define MVPP2_PE_IP4_PROTO_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 10)
    129#define MVPP2_PE_ETH_TYPE_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 9)
    130#define MVPP2_PE_VID_FLTR_DEFAULT	(MVPP2_PRS_TCAM_SRAM_SIZE - 8)
    131#define MVPP2_PE_VID_EDSA_FLTR_DEFAULT	(MVPP2_PRS_TCAM_SRAM_SIZE - 7)
    132#define MVPP2_PE_VLAN_DBL		(MVPP2_PRS_TCAM_SRAM_SIZE - 6)
    133#define MVPP2_PE_VLAN_NONE		(MVPP2_PRS_TCAM_SRAM_SIZE - 5)
    134#define MVPP2_PE_FC_DROP		(MVPP2_PRS_TCAM_SRAM_SIZE - 4)
    135#define MVPP2_PE_MAC_MC_PROMISCUOUS	(MVPP2_PRS_TCAM_SRAM_SIZE - 3)
    136#define MVPP2_PE_MAC_UC_PROMISCUOUS	(MVPP2_PRS_TCAM_SRAM_SIZE - 2)
    137#define MVPP2_PE_MAC_NON_PROMISCUOUS	(MVPP2_PRS_TCAM_SRAM_SIZE - 1)
    138
    139#define MVPP2_PRS_VID_PORT_FIRST(port)	(MVPP2_PE_VID_FILT_RANGE_START + \
    140					 ((port) * MVPP2_PRS_VLAN_FILT_MAX))
    141#define MVPP2_PRS_VID_PORT_LAST(port)	(MVPP2_PRS_VID_PORT_FIRST(port) \
    142					 + MVPP2_PRS_VLAN_FILT_MAX_ENTRY)
    143/* Index of default vid filter for given port */
    144#define MVPP2_PRS_VID_PORT_DFLT(port)	(MVPP2_PRS_VID_PORT_FIRST(port) \
    145					 + MVPP2_PRS_VLAN_FILT_DFLT_ENTRY)
    146
    147/* Sram structure
    148 * The fields are represented by MVPP2_PRS_TCAM_DATA_REG(3)->(0).
    149 */
    150#define MVPP2_PRS_SRAM_RI_OFFS			0
    151#define MVPP2_PRS_SRAM_RI_WORD			0
    152#define MVPP2_PRS_SRAM_RI_CTRL_OFFS		32
    153#define MVPP2_PRS_SRAM_RI_CTRL_WORD		1
    154#define MVPP2_PRS_SRAM_RI_CTRL_BITS		32
    155#define MVPP2_PRS_SRAM_SHIFT_OFFS		64
    156#define MVPP2_PRS_SRAM_SHIFT_SIGN_BIT		72
    157#define MVPP2_PRS_SRAM_SHIFT_MASK		0xff
    158#define MVPP2_PRS_SRAM_UDF_OFFS			73
    159#define MVPP2_PRS_SRAM_UDF_BITS			8
    160#define MVPP2_PRS_SRAM_UDF_MASK			0xff
    161#define MVPP2_PRS_SRAM_UDF_SIGN_BIT		81
    162#define MVPP2_PRS_SRAM_UDF_TYPE_OFFS		82
    163#define MVPP2_PRS_SRAM_UDF_TYPE_MASK		0x7
    164#define MVPP2_PRS_SRAM_UDF_TYPE_L3		1
    165#define MVPP2_PRS_SRAM_UDF_TYPE_L4		4
    166#define MVPP2_PRS_SRAM_OP_SEL_SHIFT_OFFS	85
    167#define MVPP2_PRS_SRAM_OP_SEL_SHIFT_MASK	0x3
    168#define MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD		1
    169#define MVPP2_PRS_SRAM_OP_SEL_SHIFT_IP4_ADD	2
    170#define MVPP2_PRS_SRAM_OP_SEL_SHIFT_IP6_ADD	3
    171#define MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS		87
    172#define MVPP2_PRS_SRAM_OP_SEL_UDF_BITS		2
    173#define MVPP2_PRS_SRAM_OP_SEL_UDF_MASK		0x3
    174#define MVPP2_PRS_SRAM_OP_SEL_UDF_ADD		0
    175#define MVPP2_PRS_SRAM_OP_SEL_UDF_IP4_ADD	2
    176#define MVPP2_PRS_SRAM_OP_SEL_UDF_IP6_ADD	3
    177#define MVPP2_PRS_SRAM_OP_SEL_BASE_OFFS		89
    178#define MVPP2_PRS_SRAM_AI_OFFS			90
    179#define MVPP2_PRS_SRAM_AI_CTRL_OFFS		98
    180#define MVPP2_PRS_SRAM_AI_CTRL_BITS		8
    181#define MVPP2_PRS_SRAM_AI_MASK			0xff
    182#define MVPP2_PRS_SRAM_NEXT_LU_OFFS		106
    183#define MVPP2_PRS_SRAM_NEXT_LU_MASK		0xf
    184#define MVPP2_PRS_SRAM_LU_DONE_BIT		110
    185#define MVPP2_PRS_SRAM_LU_GEN_BIT		111
    186
    187/* Sram result info bits assignment */
    188#define MVPP2_PRS_RI_MAC_ME_MASK		0x1
    189#define MVPP2_PRS_RI_DSA_MASK			0x2
    190#define MVPP2_PRS_RI_VLAN_MASK			(BIT(2) | BIT(3))
    191#define MVPP2_PRS_RI_VLAN_NONE			0x0
    192#define MVPP2_PRS_RI_VLAN_SINGLE		BIT(2)
    193#define MVPP2_PRS_RI_VLAN_DOUBLE		BIT(3)
    194#define MVPP2_PRS_RI_VLAN_TRIPLE		(BIT(2) | BIT(3))
    195#define MVPP2_PRS_RI_CPU_CODE_MASK		0x70
    196#define MVPP2_PRS_RI_CPU_CODE_RX_SPEC		BIT(4)
    197#define MVPP2_PRS_RI_L2_CAST_MASK		(BIT(9) | BIT(10))
    198#define MVPP2_PRS_RI_L2_UCAST			0x0
    199#define MVPP2_PRS_RI_L2_MCAST			BIT(9)
    200#define MVPP2_PRS_RI_L2_BCAST			BIT(10)
    201#define MVPP2_PRS_RI_PPPOE_MASK			0x800
    202#define MVPP2_PRS_RI_L3_PROTO_MASK		(BIT(12) | BIT(13) | BIT(14))
    203#define MVPP2_PRS_RI_L3_UN			0x0
    204#define MVPP2_PRS_RI_L3_IP4			BIT(12)
    205#define MVPP2_PRS_RI_L3_IP4_OPT			BIT(13)
    206#define MVPP2_PRS_RI_L3_IP4_OTHER		(BIT(12) | BIT(13))
    207#define MVPP2_PRS_RI_L3_IP6			BIT(14)
    208#define MVPP2_PRS_RI_L3_IP6_EXT			(BIT(12) | BIT(14))
    209#define MVPP2_PRS_RI_L3_ARP			(BIT(13) | BIT(14))
    210#define MVPP2_PRS_RI_L3_ADDR_MASK		(BIT(15) | BIT(16))
    211#define MVPP2_PRS_RI_L3_UCAST			0x0
    212#define MVPP2_PRS_RI_L3_MCAST			BIT(15)
    213#define MVPP2_PRS_RI_L3_BCAST			(BIT(15) | BIT(16))
    214#define MVPP2_PRS_RI_IP_FRAG_MASK		0x20000
    215#define MVPP2_PRS_RI_IP_FRAG_TRUE		BIT(17)
    216#define MVPP2_PRS_RI_UDF3_MASK			0x300000
    217#define MVPP2_PRS_RI_UDF3_RX_SPECIAL		BIT(21)
    218#define MVPP2_PRS_RI_L4_PROTO_MASK		0x1c00000
    219#define MVPP2_PRS_RI_L4_TCP			BIT(22)
    220#define MVPP2_PRS_RI_L4_UDP			BIT(23)
    221#define MVPP2_PRS_RI_L4_OTHER			(BIT(22) | BIT(23))
    222#define MVPP2_PRS_RI_UDF7_MASK			0x60000000
    223#define MVPP2_PRS_RI_UDF7_IP6_LITE		BIT(29)
    224#define MVPP2_PRS_RI_DROP_MASK			0x80000000
    225
    226#define MVPP2_PRS_IP_MASK			(MVPP2_PRS_RI_L3_PROTO_MASK | \
    227						MVPP2_PRS_RI_IP_FRAG_MASK | \
    228						MVPP2_PRS_RI_L4_PROTO_MASK)
    229
    230/* Sram additional info bits assignment */
    231#define MVPP2_PRS_IPV4_DIP_AI_BIT		BIT(0)
    232#define MVPP2_PRS_IPV6_NO_EXT_AI_BIT		BIT(0)
    233#define MVPP2_PRS_IPV6_EXT_AI_BIT		BIT(1)
    234#define MVPP2_PRS_IPV6_EXT_AH_AI_BIT		BIT(2)
    235#define MVPP2_PRS_IPV6_EXT_AH_LEN_AI_BIT	BIT(3)
    236#define MVPP2_PRS_IPV6_EXT_AH_L4_AI_BIT		BIT(4)
    237#define MVPP2_PRS_SINGLE_VLAN_AI		0
    238#define MVPP2_PRS_DBL_VLAN_AI_BIT		BIT(7)
    239#define MVPP2_PRS_EDSA_VID_AI_BIT		BIT(0)
    240
    241/* DSA/EDSA type */
    242#define MVPP2_PRS_TAGGED		true
    243#define MVPP2_PRS_UNTAGGED		false
    244#define MVPP2_PRS_EDSA			true
    245#define MVPP2_PRS_DSA			false
    246
    247/* MAC entries, shadow udf */
    248enum mvpp2_prs_udf {
    249	MVPP2_PRS_UDF_MAC_DEF,
    250	MVPP2_PRS_UDF_MAC_RANGE,
    251	MVPP2_PRS_UDF_L2_DEF,
    252	MVPP2_PRS_UDF_L2_DEF_COPY,
    253	MVPP2_PRS_UDF_L2_USER,
    254};
    255
    256/* Lookup ID */
    257enum mvpp2_prs_lookup {
    258	MVPP2_PRS_LU_MH,
    259	MVPP2_PRS_LU_MAC,
    260	MVPP2_PRS_LU_DSA,
    261	MVPP2_PRS_LU_VLAN,
    262	MVPP2_PRS_LU_VID,
    263	MVPP2_PRS_LU_L2,
    264	MVPP2_PRS_LU_PPPOE,
    265	MVPP2_PRS_LU_IP4,
    266	MVPP2_PRS_LU_IP6,
    267	MVPP2_PRS_LU_FLOWS,
    268	MVPP2_PRS_LU_LAST,
    269};
    270
    271struct mvpp2_prs_entry {
    272	u32 index;
    273	u32 tcam[MVPP2_PRS_TCAM_WORDS];
    274	u32 sram[MVPP2_PRS_SRAM_WORDS];
    275};
    276
    277struct mvpp2_prs_result_info {
    278	u32 ri;
    279	u32 ri_mask;
    280};
    281
    282struct mvpp2_prs_shadow {
    283	bool valid;
    284	bool finish;
    285
    286	/* Lookup ID */
    287	int lu;
    288
    289	/* User defined offset */
    290	int udf;
    291
    292	/* Result info */
    293	u32 ri;
    294	u32 ri_mask;
    295};
    296
    297int mvpp2_prs_default_init(struct platform_device *pdev, struct mvpp2 *priv);
    298
    299int mvpp2_prs_init_from_hw(struct mvpp2 *priv, struct mvpp2_prs_entry *pe,
    300			   int tid);
    301
    302unsigned int mvpp2_prs_tcam_port_map_get(struct mvpp2_prs_entry *pe);
    303
    304void mvpp2_prs_tcam_data_byte_get(struct mvpp2_prs_entry *pe,
    305				  unsigned int offs, unsigned char *byte,
    306				  unsigned char *enable);
    307
    308int mvpp2_prs_mac_da_accept(struct mvpp2_port *port, const u8 *da, bool add);
    309
    310int mvpp2_prs_tag_mode_set(struct mvpp2 *priv, int port, int type);
    311
    312int mvpp2_prs_add_flow(struct mvpp2 *priv, int flow, u32 ri, u32 ri_mask);
    313
    314int mvpp2_prs_def_flow(struct mvpp2_port *port);
    315
    316void mvpp2_prs_vid_enable_filtering(struct mvpp2_port *port);
    317
    318void mvpp2_prs_vid_disable_filtering(struct mvpp2_port *port);
    319
    320int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid);
    321
    322void mvpp2_prs_vid_entry_remove(struct mvpp2_port *port, u16 vid);
    323
    324void mvpp2_prs_vid_remove_all(struct mvpp2_port *port);
    325
    326void mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port,
    327			       enum mvpp2_prs_l2_cast l2_cast, bool add);
    328
    329void mvpp2_prs_mac_del_all(struct mvpp2_port *port);
    330
    331int mvpp2_prs_update_mac_da(struct net_device *dev, const u8 *da);
    332
    333int mvpp2_prs_hits(struct mvpp2 *priv, int index);
    334
    335#endif