brintos

brintos / linux-shallow public Read only

0
0
Text · 6.5 KiB · 57a0932 Raw
240 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/* Marvell RVU Admin Function driver3 *4 * Copyright (C) 2022 Marvell.5 *6 */7 8#ifndef __RVU_NPC_HASH_H9#define __RVU_NPC_HASH_H10 11#define RVU_NPC_HASH_SECRET_KEY0 0xa9d5af4c9fbc76b112#define RVU_NPC_HASH_SECRET_KEY1 0xa9d5af4c9fbc87b413#define RVU_NPC_HASH_SECRET_KEY2 0x5954c9e714 15#define NPC_MAX_HASH 216#define NPC_MAX_HASH_MASK 217 18#define KEX_LD_CFG_USE_HASH(use_hash, bytesm1, hdr_ofs, ena, flags_ena, key_ofs) \19			    ((use_hash) << 20 | ((bytesm1) << 16) | ((hdr_ofs) << 8) | \20			     ((ena) << 7) | ((flags_ena) << 6) | ((key_ofs) & 0x3F))21#define KEX_LD_CFG_HASH(hdr_ofs, bytesm1, lt_en, lid_en, lid, ltype_match, ltype_mask)	\22			(((hdr_ofs) << 32) | ((bytesm1) << 16) | \23			 ((lt_en) << 12) | ((lid_en) << 11) | ((lid) << 8) | \24			 ((ltype_match) << 4) | ((ltype_mask) & 0xF))25 26#define SET_KEX_LD_HASH(intf, ld, cfg) \27	rvu_write64(rvu, blkaddr,	\28		    NPC_AF_INTFX_HASHX_CFG(intf, ld), cfg)29 30#define SET_KEX_LD_HASH_MASK(intf, ld, mask_idx, cfg) \31	rvu_write64(rvu, blkaddr,	\32		    NPC_AF_INTFX_HASHX_MASKX(intf, ld, mask_idx), cfg)33 34#define GET_KEX_LD_HASH_CTRL(intf, ld)	\35	rvu_read64(rvu, blkaddr, NPC_AF_INTFX_HASHX_RESULT_CTRL(intf, ld))36 37#define GET_KEX_LD_HASH_MASK(intf, ld, mask_idx)	\38	rvu_read64(rvu, blkaddr, NPC_AF_INTFX_HASHX_MASKX(intf, ld, mask_idx))39 40#define SET_KEX_LD_HASH_CTRL(intf, ld, cfg) \41	rvu_write64(rvu, blkaddr,	\42		    NPC_AF_INTFX_HASHX_RESULT_CTRL(intf, ld), cfg)43 44struct npc_mcam_kex_hash {45	/* NPC_AF_INTF(0..1)_LID(0..7)_LT(0..15)_LD(0..1)_CFG */46	bool lid_lt_ld_hash_en[NPC_MAX_INTF][NPC_MAX_LID][NPC_MAX_LT][NPC_MAX_LD];47	/* NPC_AF_INTF(0..1)_HASH(0..1)_CFG */48	u64 hash[NPC_MAX_INTF][NPC_MAX_HASH];49	/* NPC_AF_INTF(0..1)_HASH(0..1)_MASK(0..1) */50	u64 hash_mask[NPC_MAX_INTF][NPC_MAX_HASH][NPC_MAX_HASH_MASK];51	/* NPC_AF_INTF(0..1)_HASH(0..1)_RESULT_CTRL */52	u64 hash_ctrl[NPC_MAX_INTF][NPC_MAX_HASH];53} __packed;54 55void npc_update_field_hash(struct rvu *rvu, u8 intf,56			   struct mcam_entry *entry,57			   int blkaddr,58			   u64 features,59			   struct flow_msg *pkt,60			   struct flow_msg *mask,61			   struct flow_msg *opkt,62			   struct flow_msg *omask);63void npc_config_secret_key(struct rvu *rvu, int blkaddr);64void npc_program_mkex_hash(struct rvu *rvu, int blkaddr);65u32 npc_field_hash_calc(u64 *ldata, struct npc_get_field_hash_info_rsp rsp,66			u8 intf, u8 hash_idx);67 68static struct npc_mcam_kex_hash npc_mkex_hash_default __maybe_unused = {69	.lid_lt_ld_hash_en = {70	[NIX_INTF_RX] = {71		[NPC_LID_LC] = {72			[NPC_LT_LC_IP6] = {73				false,74				false,75			},76		},77	},78 79	[NIX_INTF_TX] = {80		[NPC_LID_LC] = {81			[NPC_LT_LC_IP6] = {82				false,83				false,84			},85		},86	},87	},88 89	.hash = {90	[NIX_INTF_RX] = {91		KEX_LD_CFG_HASH(0x8ULL, 0xf, 0x1, 0x1, NPC_LID_LC, NPC_LT_LC_IP6, 0xf),92		KEX_LD_CFG_HASH(0x18ULL, 0xf, 0x1, 0x1, NPC_LID_LC, NPC_LT_LC_IP6, 0xf),93	},94 95	[NIX_INTF_TX] = {96		KEX_LD_CFG_HASH(0x8ULL, 0xf, 0x1, 0x1, NPC_LID_LC, NPC_LT_LC_IP6, 0xf),97		KEX_LD_CFG_HASH(0x18ULL, 0xf, 0x1, 0x1, NPC_LID_LC, NPC_LT_LC_IP6, 0xf),98	},99	},100 101	.hash_mask = {102	[NIX_INTF_RX] = {103		[0] = {104			GENMASK_ULL(63, 0),105			GENMASK_ULL(63, 0),106		},107		[1] = {108			GENMASK_ULL(63, 0),109			GENMASK_ULL(63, 0),110		},111	},112 113	[NIX_INTF_TX] = {114		[0] = {115			GENMASK_ULL(63, 0),116			GENMASK_ULL(63, 0),117		},118		[1] = {119			GENMASK_ULL(63, 0),120			GENMASK_ULL(63, 0),121		},122	},123	},124 125	.hash_ctrl = {126	[NIX_INTF_RX] = {127		[0] = GENMASK_ULL(63, 32), /* MSB 32 bit is mask and LSB 32 bit is offset. */128		[1] = GENMASK_ULL(63, 32), /* MSB 32 bit is mask and LSB 32 bit is offset. */129	},130 131	[NIX_INTF_TX] = {132		[0] = GENMASK_ULL(63, 32), /* MSB 32 bit is mask and LSB 32 bit is offset. */133		[1] = GENMASK_ULL(63, 32), /* MSB 32 bit is mask and LSB 32 bit is offset. */134	},135	},136};137 138/* If exact match table support is enabled, enable drop rules */139#define NPC_MCAM_DROP_RULE_MAX 30140#define NPC_MCAM_SDP_DROP_RULE_IDX 0141 142#define RVU_PFFUNC(pf, func)	\143	((((pf) & RVU_PFVF_PF_MASK) << RVU_PFVF_PF_SHIFT) | \144	(((func) & RVU_PFVF_FUNC_MASK) << RVU_PFVF_FUNC_SHIFT))145 146enum npc_exact_opc_type {147	NPC_EXACT_OPC_MEM,148	NPC_EXACT_OPC_CAM,149};150 151struct npc_exact_table_entry {152	struct list_head list;153	struct list_head glist;154	u32 seq_id;	/* Sequence number of entry */155	u32 index;	/* Mem table or cam table index */156	u32 mcam_idx;157		/* Mcam index. This is valid only if "cmd" field is false */158	enum npc_exact_opc_type opc_type;159	u16 chan;160	u16 pcifunc;161	u8 ways;162	u8 mac[ETH_ALEN];163	u8 ctype;164	u8 cgx_id;165	u8 lmac_id;166	bool cmd;	/* Is added by ethtool command ? */167};168 169struct npc_exact_table {170	struct mutex lock;	/* entries update lock */171	unsigned long *id_bmap;172	int num_drop_rules;173	u32 tot_ids;174	u16 cnt_cmd_rules[NPC_MCAM_DROP_RULE_MAX];175	u16 counter_idx[NPC_MCAM_DROP_RULE_MAX];176	bool promisc_mode[NPC_MCAM_DROP_RULE_MAX];177	struct {178		int ways;179		int depth;180		unsigned long *bmap;181		u64 mask;	// Masks before hash calculation.182		u16 hash_mask;	// 11 bits for hash mask183		u16 hash_offset; // 11 bits offset184	} mem_table;185 186	struct {187		int depth;188		unsigned long *bmap;189	} cam_table;190 191	struct {192		bool valid;193		u16 chan_val;194		u16 chan_mask;195		u16 pcifunc;196		u8 drop_rule_idx;197	} drop_rule_map[NPC_MCAM_DROP_RULE_MAX];198 199#define NPC_EXACT_TBL_MAX_WAYS 4200 201	struct list_head lhead_mem_tbl_entry[NPC_EXACT_TBL_MAX_WAYS];202	int mem_tbl_entry_cnt;203 204	struct list_head lhead_cam_tbl_entry;205	int cam_tbl_entry_cnt;206 207	struct list_head lhead_gbl;208};209 210bool rvu_npc_exact_has_match_table(struct rvu *rvu);211u32 rvu_npc_exact_get_max_entries(struct rvu *rvu);212int rvu_npc_exact_init(struct rvu *rvu);213int rvu_npc_exact_mac_addr_reset(struct rvu *rvu, struct cgx_mac_addr_reset_req *req,214				 struct msg_rsp *rsp);215 216int rvu_npc_exact_mac_addr_update(struct rvu *rvu,217				  struct cgx_mac_addr_update_req *req,218				  struct cgx_mac_addr_update_rsp *rsp);219 220int rvu_npc_exact_mac_addr_add(struct rvu *rvu,221			       struct cgx_mac_addr_add_req *req,222			       struct cgx_mac_addr_add_rsp *rsp);223 224int rvu_npc_exact_mac_addr_del(struct rvu *rvu,225			       struct cgx_mac_addr_del_req *req,226			       struct msg_rsp *rsp);227 228int rvu_npc_exact_mac_addr_set(struct rvu *rvu, struct cgx_mac_addr_set_or_get *req,229			       struct cgx_mac_addr_set_or_get *rsp);230 231void rvu_npc_exact_reset(struct rvu *rvu, u16 pcifunc);232 233bool rvu_npc_exact_can_disable_feature(struct rvu *rvu);234void rvu_npc_exact_disable_feature(struct rvu *rvu);235void rvu_npc_exact_reset(struct rvu *rvu, u16 pcifunc);236u16 rvu_npc_exact_drop_rule_to_pcifunc(struct rvu *rvu, u32 drop_rule_idx);237int rvu_npc_exact_promisc_disable(struct rvu *rvu, u16 pcifunc);238int rvu_npc_exact_promisc_enable(struct rvu *rvu, u16 pcifunc);239#endif /* RVU_NPC_HASH_H */240