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

rvu_npc_fs.c (43317B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Marvell RVU Admin Function driver
      3 *
      4 * Copyright (C) 2020 Marvell.
      5 */
      6
      7#include <linux/bitfield.h>
      8
      9#include "rvu_struct.h"
     10#include "rvu_reg.h"
     11#include "rvu.h"
     12#include "npc.h"
     13
     14#define NPC_BYTESM		GENMASK_ULL(19, 16)
     15#define NPC_HDR_OFFSET		GENMASK_ULL(15, 8)
     16#define NPC_KEY_OFFSET		GENMASK_ULL(5, 0)
     17#define NPC_LDATA_EN		BIT_ULL(7)
     18
     19static const char * const npc_flow_names[] = {
     20	[NPC_DMAC]	= "dmac",
     21	[NPC_SMAC]	= "smac",
     22	[NPC_ETYPE]	= "ether type",
     23	[NPC_VLAN_ETYPE_CTAG] = "vlan ether type ctag",
     24	[NPC_VLAN_ETYPE_STAG] = "vlan ether type stag",
     25	[NPC_OUTER_VID]	= "outer vlan id",
     26	[NPC_TOS]	= "tos",
     27	[NPC_SIP_IPV4]	= "ipv4 source ip",
     28	[NPC_DIP_IPV4]	= "ipv4 destination ip",
     29	[NPC_SIP_IPV6]	= "ipv6 source ip",
     30	[NPC_DIP_IPV6]	= "ipv6 destination ip",
     31	[NPC_IPPROTO_TCP] = "ip proto tcp",
     32	[NPC_IPPROTO_UDP] = "ip proto udp",
     33	[NPC_IPPROTO_SCTP] = "ip proto sctp",
     34	[NPC_IPPROTO_ICMP] = "ip proto icmp",
     35	[NPC_IPPROTO_ICMP6] = "ip proto icmp6",
     36	[NPC_IPPROTO_AH] = "ip proto AH",
     37	[NPC_IPPROTO_ESP] = "ip proto ESP",
     38	[NPC_SPORT_TCP]	= "tcp source port",
     39	[NPC_DPORT_TCP]	= "tcp destination port",
     40	[NPC_SPORT_UDP]	= "udp source port",
     41	[NPC_DPORT_UDP]	= "udp destination port",
     42	[NPC_SPORT_SCTP] = "sctp source port",
     43	[NPC_DPORT_SCTP] = "sctp destination port",
     44	[NPC_UNKNOWN]	= "unknown",
     45};
     46
     47const char *npc_get_field_name(u8 hdr)
     48{
     49	if (hdr >= ARRAY_SIZE(npc_flow_names))
     50		return npc_flow_names[NPC_UNKNOWN];
     51
     52	return npc_flow_names[hdr];
     53}
     54
     55/* Compute keyword masks and figure out the number of keywords a field
     56 * spans in the key.
     57 */
     58static void npc_set_kw_masks(struct npc_mcam *mcam, u8 type,
     59			     u8 nr_bits, int start_kwi, int offset, u8 intf)
     60{
     61	struct npc_key_field *field = &mcam->rx_key_fields[type];
     62	u8 bits_in_kw;
     63	int max_kwi;
     64
     65	if (mcam->banks_per_entry == 1)
     66		max_kwi = 1; /* NPC_MCAM_KEY_X1 */
     67	else if (mcam->banks_per_entry == 2)
     68		max_kwi = 3; /* NPC_MCAM_KEY_X2 */
     69	else
     70		max_kwi = 6; /* NPC_MCAM_KEY_X4 */
     71
     72	if (is_npc_intf_tx(intf))
     73		field = &mcam->tx_key_fields[type];
     74
     75	if (offset + nr_bits <= 64) {
     76		/* one KW only */
     77		if (start_kwi > max_kwi)
     78			return;
     79		field->kw_mask[start_kwi] |= GENMASK_ULL(nr_bits - 1, 0)
     80					     << offset;
     81		field->nr_kws = 1;
     82	} else if (offset + nr_bits > 64 &&
     83		   offset + nr_bits <= 128) {
     84		/* two KWs */
     85		if (start_kwi + 1 > max_kwi)
     86			return;
     87		/* first KW mask */
     88		bits_in_kw = 64 - offset;
     89		field->kw_mask[start_kwi] |= GENMASK_ULL(bits_in_kw - 1, 0)
     90					     << offset;
     91		/* second KW mask i.e. mask for rest of bits */
     92		bits_in_kw = nr_bits + offset - 64;
     93		field->kw_mask[start_kwi + 1] |= GENMASK_ULL(bits_in_kw - 1, 0);
     94		field->nr_kws = 2;
     95	} else {
     96		/* three KWs */
     97		if (start_kwi + 2 > max_kwi)
     98			return;
     99		/* first KW mask */
    100		bits_in_kw = 64 - offset;
    101		field->kw_mask[start_kwi] |= GENMASK_ULL(bits_in_kw - 1, 0)
    102					     << offset;
    103		/* second KW mask */
    104		field->kw_mask[start_kwi + 1] = ~0ULL;
    105		/* third KW mask i.e. mask for rest of bits */
    106		bits_in_kw = nr_bits + offset - 128;
    107		field->kw_mask[start_kwi + 2] |= GENMASK_ULL(bits_in_kw - 1, 0);
    108		field->nr_kws = 3;
    109	}
    110}
    111
    112/* Helper function to figure out whether field exists in the key */
    113static bool npc_is_field_present(struct rvu *rvu, enum key_fields type, u8 intf)
    114{
    115	struct npc_mcam *mcam = &rvu->hw->mcam;
    116	struct npc_key_field *input;
    117
    118	input  = &mcam->rx_key_fields[type];
    119	if (is_npc_intf_tx(intf))
    120		input  = &mcam->tx_key_fields[type];
    121
    122	return input->nr_kws > 0;
    123}
    124
    125static bool npc_is_same(struct npc_key_field *input,
    126			struct npc_key_field *field)
    127{
    128	return memcmp(&input->layer_mdata, &field->layer_mdata,
    129		     sizeof(struct npc_layer_mdata)) == 0;
    130}
    131
    132static void npc_set_layer_mdata(struct npc_mcam *mcam, enum key_fields type,
    133				u64 cfg, u8 lid, u8 lt, u8 intf)
    134{
    135	struct npc_key_field *input = &mcam->rx_key_fields[type];
    136
    137	if (is_npc_intf_tx(intf))
    138		input = &mcam->tx_key_fields[type];
    139
    140	input->layer_mdata.hdr = FIELD_GET(NPC_HDR_OFFSET, cfg);
    141	input->layer_mdata.key = FIELD_GET(NPC_KEY_OFFSET, cfg);
    142	input->layer_mdata.len = FIELD_GET(NPC_BYTESM, cfg) + 1;
    143	input->layer_mdata.ltype = lt;
    144	input->layer_mdata.lid = lid;
    145}
    146
    147static bool npc_check_overlap_fields(struct npc_key_field *input1,
    148				     struct npc_key_field *input2)
    149{
    150	int kwi;
    151
    152	/* Fields with same layer id and different ltypes are mutually
    153	 * exclusive hence they can be overlapped
    154	 */
    155	if (input1->layer_mdata.lid == input2->layer_mdata.lid &&
    156	    input1->layer_mdata.ltype != input2->layer_mdata.ltype)
    157		return false;
    158
    159	for (kwi = 0; kwi < NPC_MAX_KWS_IN_KEY; kwi++) {
    160		if (input1->kw_mask[kwi] & input2->kw_mask[kwi])
    161			return true;
    162	}
    163
    164	return false;
    165}
    166
    167/* Helper function to check whether given field overlaps with any other fields
    168 * in the key. Due to limitations on key size and the key extraction profile in
    169 * use higher layers can overwrite lower layer's header fields. Hence overlap
    170 * needs to be checked.
    171 */
    172static bool npc_check_overlap(struct rvu *rvu, int blkaddr,
    173			      enum key_fields type, u8 start_lid, u8 intf)
    174{
    175	struct npc_mcam *mcam = &rvu->hw->mcam;
    176	struct npc_key_field *dummy, *input;
    177	int start_kwi, offset;
    178	u8 nr_bits, lid, lt, ld;
    179	u64 cfg;
    180
    181	dummy = &mcam->rx_key_fields[NPC_UNKNOWN];
    182	input = &mcam->rx_key_fields[type];
    183
    184	if (is_npc_intf_tx(intf)) {
    185		dummy = &mcam->tx_key_fields[NPC_UNKNOWN];
    186		input = &mcam->tx_key_fields[type];
    187	}
    188
    189	for (lid = start_lid; lid < NPC_MAX_LID; lid++) {
    190		for (lt = 0; lt < NPC_MAX_LT; lt++) {
    191			for (ld = 0; ld < NPC_MAX_LD; ld++) {
    192				cfg = rvu_read64(rvu, blkaddr,
    193						 NPC_AF_INTFX_LIDX_LTX_LDX_CFG
    194						 (intf, lid, lt, ld));
    195				if (!FIELD_GET(NPC_LDATA_EN, cfg))
    196					continue;
    197				memset(dummy, 0, sizeof(struct npc_key_field));
    198				npc_set_layer_mdata(mcam, NPC_UNKNOWN, cfg,
    199						    lid, lt, intf);
    200				/* exclude input */
    201				if (npc_is_same(input, dummy))
    202					continue;
    203				start_kwi = dummy->layer_mdata.key / 8;
    204				offset = (dummy->layer_mdata.key * 8) % 64;
    205				nr_bits = dummy->layer_mdata.len * 8;
    206				/* form KW masks */
    207				npc_set_kw_masks(mcam, NPC_UNKNOWN, nr_bits,
    208						 start_kwi, offset, intf);
    209				/* check any input field bits falls in any
    210				 * other field bits.
    211				 */
    212				if (npc_check_overlap_fields(dummy, input))
    213					return true;
    214			}
    215		}
    216	}
    217
    218	return false;
    219}
    220
    221static bool npc_check_field(struct rvu *rvu, int blkaddr, enum key_fields type,
    222			    u8 intf)
    223{
    224	if (!npc_is_field_present(rvu, type, intf) ||
    225	    npc_check_overlap(rvu, blkaddr, type, 0, intf))
    226		return false;
    227	return true;
    228}
    229
    230static void npc_scan_parse_result(struct npc_mcam *mcam, u8 bit_number,
    231				  u8 key_nibble, u8 intf)
    232{
    233	u8 offset = (key_nibble * 4) % 64; /* offset within key word */
    234	u8 kwi = (key_nibble * 4) / 64; /* which word in key */
    235	u8 nr_bits = 4; /* bits in a nibble */
    236	u8 type;
    237
    238	switch (bit_number) {
    239	case 0 ... 2:
    240		type = NPC_CHAN;
    241		break;
    242	case 3:
    243		type = NPC_ERRLEV;
    244		break;
    245	case 4 ... 5:
    246		type = NPC_ERRCODE;
    247		break;
    248	case 6:
    249		type = NPC_LXMB;
    250		break;
    251	/* check for LTYPE only as of now */
    252	case 9:
    253		type = NPC_LA;
    254		break;
    255	case 12:
    256		type = NPC_LB;
    257		break;
    258	case 15:
    259		type = NPC_LC;
    260		break;
    261	case 18:
    262		type = NPC_LD;
    263		break;
    264	case 21:
    265		type = NPC_LE;
    266		break;
    267	case 24:
    268		type = NPC_LF;
    269		break;
    270	case 27:
    271		type = NPC_LG;
    272		break;
    273	case 30:
    274		type = NPC_LH;
    275		break;
    276	default:
    277		return;
    278	}
    279	npc_set_kw_masks(mcam, type, nr_bits, kwi, offset, intf);
    280}
    281
    282static void npc_handle_multi_layer_fields(struct rvu *rvu, int blkaddr, u8 intf)
    283{
    284	struct npc_mcam *mcam = &rvu->hw->mcam;
    285	struct npc_key_field *key_fields;
    286	/* Ether type can come from three layers
    287	 * (ethernet, single tagged, double tagged)
    288	 */
    289	struct npc_key_field *etype_ether;
    290	struct npc_key_field *etype_tag1;
    291	struct npc_key_field *etype_tag2;
    292	/* Outer VLAN TCI can come from two layers
    293	 * (single tagged, double tagged)
    294	 */
    295	struct npc_key_field *vlan_tag1;
    296	struct npc_key_field *vlan_tag2;
    297	u64 *features;
    298	u8 start_lid;
    299	int i;
    300
    301	key_fields = mcam->rx_key_fields;
    302	features = &mcam->rx_features;
    303
    304	if (is_npc_intf_tx(intf)) {
    305		key_fields = mcam->tx_key_fields;
    306		features = &mcam->tx_features;
    307	}
    308
    309	/* Handle header fields which can come from multiple layers like
    310	 * etype, outer vlan tci. These fields should have same position in
    311	 * the key otherwise to install a mcam rule more than one entry is
    312	 * needed which complicates mcam space management.
    313	 */
    314	etype_ether = &key_fields[NPC_ETYPE_ETHER];
    315	etype_tag1 = &key_fields[NPC_ETYPE_TAG1];
    316	etype_tag2 = &key_fields[NPC_ETYPE_TAG2];
    317	vlan_tag1 = &key_fields[NPC_VLAN_TAG1];
    318	vlan_tag2 = &key_fields[NPC_VLAN_TAG2];
    319
    320	/* if key profile programmed does not extract Ethertype at all */
    321	if (!etype_ether->nr_kws && !etype_tag1->nr_kws && !etype_tag2->nr_kws)
    322		goto vlan_tci;
    323
    324	/* if key profile programmed extracts Ethertype from one layer */
    325	if (etype_ether->nr_kws && !etype_tag1->nr_kws && !etype_tag2->nr_kws)
    326		key_fields[NPC_ETYPE] = *etype_ether;
    327	if (!etype_ether->nr_kws && etype_tag1->nr_kws && !etype_tag2->nr_kws)
    328		key_fields[NPC_ETYPE] = *etype_tag1;
    329	if (!etype_ether->nr_kws && !etype_tag1->nr_kws && etype_tag2->nr_kws)
    330		key_fields[NPC_ETYPE] = *etype_tag2;
    331
    332	/* if key profile programmed extracts Ethertype from multiple layers */
    333	if (etype_ether->nr_kws && etype_tag1->nr_kws) {
    334		for (i = 0; i < NPC_MAX_KWS_IN_KEY; i++) {
    335			if (etype_ether->kw_mask[i] != etype_tag1->kw_mask[i])
    336				goto vlan_tci;
    337		}
    338		key_fields[NPC_ETYPE] = *etype_tag1;
    339	}
    340	if (etype_ether->nr_kws && etype_tag2->nr_kws) {
    341		for (i = 0; i < NPC_MAX_KWS_IN_KEY; i++) {
    342			if (etype_ether->kw_mask[i] != etype_tag2->kw_mask[i])
    343				goto vlan_tci;
    344		}
    345		key_fields[NPC_ETYPE] = *etype_tag2;
    346	}
    347	if (etype_tag1->nr_kws && etype_tag2->nr_kws) {
    348		for (i = 0; i < NPC_MAX_KWS_IN_KEY; i++) {
    349			if (etype_tag1->kw_mask[i] != etype_tag2->kw_mask[i])
    350				goto vlan_tci;
    351		}
    352		key_fields[NPC_ETYPE] = *etype_tag2;
    353	}
    354
    355	/* check none of higher layers overwrite Ethertype */
    356	start_lid = key_fields[NPC_ETYPE].layer_mdata.lid + 1;
    357	if (npc_check_overlap(rvu, blkaddr, NPC_ETYPE, start_lid, intf))
    358		goto vlan_tci;
    359	*features |= BIT_ULL(NPC_ETYPE);
    360vlan_tci:
    361	/* if key profile does not extract outer vlan tci at all */
    362	if (!vlan_tag1->nr_kws && !vlan_tag2->nr_kws)
    363		goto done;
    364
    365	/* if key profile extracts outer vlan tci from one layer */
    366	if (vlan_tag1->nr_kws && !vlan_tag2->nr_kws)
    367		key_fields[NPC_OUTER_VID] = *vlan_tag1;
    368	if (!vlan_tag1->nr_kws && vlan_tag2->nr_kws)
    369		key_fields[NPC_OUTER_VID] = *vlan_tag2;
    370
    371	/* if key profile extracts outer vlan tci from multiple layers */
    372	if (vlan_tag1->nr_kws && vlan_tag2->nr_kws) {
    373		for (i = 0; i < NPC_MAX_KWS_IN_KEY; i++) {
    374			if (vlan_tag1->kw_mask[i] != vlan_tag2->kw_mask[i])
    375				goto done;
    376		}
    377		key_fields[NPC_OUTER_VID] = *vlan_tag2;
    378	}
    379	/* check none of higher layers overwrite outer vlan tci */
    380	start_lid = key_fields[NPC_OUTER_VID].layer_mdata.lid + 1;
    381	if (npc_check_overlap(rvu, blkaddr, NPC_OUTER_VID, start_lid, intf))
    382		goto done;
    383	*features |= BIT_ULL(NPC_OUTER_VID);
    384done:
    385	return;
    386}
    387
    388static void npc_scan_ldata(struct rvu *rvu, int blkaddr, u8 lid,
    389			   u8 lt, u64 cfg, u8 intf)
    390{
    391	struct npc_mcam *mcam = &rvu->hw->mcam;
    392	u8 hdr, key, nr_bytes, bit_offset;
    393	u8 la_ltype, la_start;
    394	/* starting KW index and starting bit position */
    395	int start_kwi, offset;
    396
    397	nr_bytes = FIELD_GET(NPC_BYTESM, cfg) + 1;
    398	hdr = FIELD_GET(NPC_HDR_OFFSET, cfg);
    399	key = FIELD_GET(NPC_KEY_OFFSET, cfg);
    400	start_kwi = key / 8;
    401	offset = (key * 8) % 64;
    402
    403	/* For Tx, Layer A has NIX_INST_HDR_S(64 bytes) preceding
    404	 * ethernet header.
    405	 */
    406	if (is_npc_intf_tx(intf)) {
    407		la_ltype = NPC_LT_LA_IH_NIX_ETHER;
    408		la_start = 8;
    409	} else {
    410		la_ltype = NPC_LT_LA_ETHER;
    411		la_start = 0;
    412	}
    413
    414#define NPC_SCAN_HDR(name, hlid, hlt, hstart, hlen)			       \
    415do {									       \
    416	if (lid == (hlid) && lt == (hlt)) {				       \
    417		if ((hstart) >= hdr &&					       \
    418		    ((hstart) + (hlen)) <= (hdr + nr_bytes)) {	               \
    419			bit_offset = (hdr + nr_bytes - (hstart) - (hlen)) * 8; \
    420			npc_set_layer_mdata(mcam, (name), cfg, lid, lt, intf); \
    421			npc_set_kw_masks(mcam, (name), (hlen) * 8,	       \
    422					 start_kwi, offset + bit_offset, intf);\
    423		}							       \
    424	}								       \
    425} while (0)
    426
    427	/* List LID, LTYPE, start offset from layer and length(in bytes) of
    428	 * packet header fields below.
    429	 * Example: Source IP is 4 bytes and starts at 12th byte of IP header
    430	 */
    431	NPC_SCAN_HDR(NPC_TOS, NPC_LID_LC, NPC_LT_LC_IP, 1, 1);
    432	NPC_SCAN_HDR(NPC_SIP_IPV4, NPC_LID_LC, NPC_LT_LC_IP, 12, 4);
    433	NPC_SCAN_HDR(NPC_DIP_IPV4, NPC_LID_LC, NPC_LT_LC_IP, 16, 4);
    434	NPC_SCAN_HDR(NPC_SIP_IPV6, NPC_LID_LC, NPC_LT_LC_IP6, 8, 16);
    435	NPC_SCAN_HDR(NPC_DIP_IPV6, NPC_LID_LC, NPC_LT_LC_IP6, 24, 16);
    436	NPC_SCAN_HDR(NPC_SPORT_UDP, NPC_LID_LD, NPC_LT_LD_UDP, 0, 2);
    437	NPC_SCAN_HDR(NPC_DPORT_UDP, NPC_LID_LD, NPC_LT_LD_UDP, 2, 2);
    438	NPC_SCAN_HDR(NPC_SPORT_TCP, NPC_LID_LD, NPC_LT_LD_TCP, 0, 2);
    439	NPC_SCAN_HDR(NPC_DPORT_TCP, NPC_LID_LD, NPC_LT_LD_TCP, 2, 2);
    440	NPC_SCAN_HDR(NPC_SPORT_SCTP, NPC_LID_LD, NPC_LT_LD_SCTP, 0, 2);
    441	NPC_SCAN_HDR(NPC_DPORT_SCTP, NPC_LID_LD, NPC_LT_LD_SCTP, 2, 2);
    442	NPC_SCAN_HDR(NPC_ETYPE_ETHER, NPC_LID_LA, NPC_LT_LA_ETHER, 12, 2);
    443	NPC_SCAN_HDR(NPC_ETYPE_TAG1, NPC_LID_LB, NPC_LT_LB_CTAG, 4, 2);
    444	NPC_SCAN_HDR(NPC_ETYPE_TAG2, NPC_LID_LB, NPC_LT_LB_STAG_QINQ, 8, 2);
    445	NPC_SCAN_HDR(NPC_VLAN_TAG1, NPC_LID_LB, NPC_LT_LB_CTAG, 2, 2);
    446	NPC_SCAN_HDR(NPC_VLAN_TAG2, NPC_LID_LB, NPC_LT_LB_STAG_QINQ, 2, 2);
    447	NPC_SCAN_HDR(NPC_DMAC, NPC_LID_LA, la_ltype, la_start, 6);
    448	NPC_SCAN_HDR(NPC_SMAC, NPC_LID_LA, la_ltype, la_start, 6);
    449	/* PF_FUNC is 2 bytes at 0th byte of NPC_LT_LA_IH_NIX_ETHER */
    450	NPC_SCAN_HDR(NPC_PF_FUNC, NPC_LID_LA, NPC_LT_LA_IH_NIX_ETHER, 0, 2);
    451}
    452
    453static void npc_set_features(struct rvu *rvu, int blkaddr, u8 intf)
    454{
    455	struct npc_mcam *mcam = &rvu->hw->mcam;
    456	u64 *features = &mcam->rx_features;
    457	u64 tcp_udp_sctp;
    458	int hdr;
    459
    460	if (is_npc_intf_tx(intf))
    461		features = &mcam->tx_features;
    462
    463	for (hdr = NPC_DMAC; hdr < NPC_HEADER_FIELDS_MAX; hdr++) {
    464		if (npc_check_field(rvu, blkaddr, hdr, intf))
    465			*features |= BIT_ULL(hdr);
    466	}
    467
    468	tcp_udp_sctp = BIT_ULL(NPC_SPORT_TCP) | BIT_ULL(NPC_SPORT_UDP) |
    469		       BIT_ULL(NPC_DPORT_TCP) | BIT_ULL(NPC_DPORT_UDP) |
    470		       BIT_ULL(NPC_SPORT_SCTP) | BIT_ULL(NPC_DPORT_SCTP);
    471
    472	/* for tcp/udp/sctp corresponding layer type should be in the key */
    473	if (*features & tcp_udp_sctp) {
    474		if (!npc_check_field(rvu, blkaddr, NPC_LD, intf))
    475			*features &= ~tcp_udp_sctp;
    476		else
    477			*features |= BIT_ULL(NPC_IPPROTO_TCP) |
    478				     BIT_ULL(NPC_IPPROTO_UDP) |
    479				     BIT_ULL(NPC_IPPROTO_SCTP);
    480	}
    481
    482	/* for AH/ICMP/ICMPv6/, check if corresponding layer type is present in the key */
    483	if (npc_check_field(rvu, blkaddr, NPC_LD, intf)) {
    484		*features |= BIT_ULL(NPC_IPPROTO_AH);
    485		*features |= BIT_ULL(NPC_IPPROTO_ICMP);
    486		*features |= BIT_ULL(NPC_IPPROTO_ICMP6);
    487	}
    488
    489	/* for ESP, check if corresponding layer type is present in the key */
    490	if (npc_check_field(rvu, blkaddr, NPC_LE, intf))
    491		*features |= BIT_ULL(NPC_IPPROTO_ESP);
    492
    493	/* for vlan corresponding layer type should be in the key */
    494	if (*features & BIT_ULL(NPC_OUTER_VID))
    495		if (!npc_check_field(rvu, blkaddr, NPC_LB, intf))
    496			*features &= ~BIT_ULL(NPC_OUTER_VID);
    497
    498	/* for vlan ethertypes corresponding layer type should be in the key */
    499	if (npc_check_field(rvu, blkaddr, NPC_LB, intf))
    500		*features |= BIT_ULL(NPC_VLAN_ETYPE_CTAG) |
    501			     BIT_ULL(NPC_VLAN_ETYPE_STAG);
    502}
    503
    504/* Scan key extraction profile and record how fields of our interest
    505 * fill the key structure. Also verify Channel and DMAC exists in
    506 * key and not overwritten by other header fields.
    507 */
    508static int npc_scan_kex(struct rvu *rvu, int blkaddr, u8 intf)
    509{
    510	struct npc_mcam *mcam = &rvu->hw->mcam;
    511	u8 lid, lt, ld, bitnr;
    512	u8 key_nibble = 0;
    513	u64 cfg;
    514
    515	/* Scan and note how parse result is going to be in key.
    516	 * A bit set in PARSE_NIBBLE_ENA corresponds to a nibble from
    517	 * parse result in the key. The enabled nibbles from parse result
    518	 * will be concatenated in key.
    519	 */
    520	cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(intf));
    521	cfg &= NPC_PARSE_NIBBLE;
    522	for_each_set_bit(bitnr, (unsigned long *)&cfg, 31) {
    523		npc_scan_parse_result(mcam, bitnr, key_nibble, intf);
    524		key_nibble++;
    525	}
    526
    527	/* Scan and note how layer data is going to be in key */
    528	for (lid = 0; lid < NPC_MAX_LID; lid++) {
    529		for (lt = 0; lt < NPC_MAX_LT; lt++) {
    530			for (ld = 0; ld < NPC_MAX_LD; ld++) {
    531				cfg = rvu_read64(rvu, blkaddr,
    532						 NPC_AF_INTFX_LIDX_LTX_LDX_CFG
    533						 (intf, lid, lt, ld));
    534				if (!FIELD_GET(NPC_LDATA_EN, cfg))
    535					continue;
    536				npc_scan_ldata(rvu, blkaddr, lid, lt, cfg,
    537					       intf);
    538			}
    539		}
    540	}
    541
    542	return 0;
    543}
    544
    545static int npc_scan_verify_kex(struct rvu *rvu, int blkaddr)
    546{
    547	int err;
    548
    549	err = npc_scan_kex(rvu, blkaddr, NIX_INTF_RX);
    550	if (err)
    551		return err;
    552
    553	err = npc_scan_kex(rvu, blkaddr, NIX_INTF_TX);
    554	if (err)
    555		return err;
    556
    557	/* Channel is mandatory */
    558	if (!npc_is_field_present(rvu, NPC_CHAN, NIX_INTF_RX)) {
    559		dev_err(rvu->dev, "Channel not present in Key\n");
    560		return -EINVAL;
    561	}
    562	/* check that none of the fields overwrite channel */
    563	if (npc_check_overlap(rvu, blkaddr, NPC_CHAN, 0, NIX_INTF_RX)) {
    564		dev_err(rvu->dev, "Channel cannot be overwritten\n");
    565		return -EINVAL;
    566	}
    567	/* DMAC should be present in key for unicast filter to work */
    568	if (!npc_is_field_present(rvu, NPC_DMAC, NIX_INTF_RX)) {
    569		dev_err(rvu->dev, "DMAC not present in Key\n");
    570		return -EINVAL;
    571	}
    572	/* check that none of the fields overwrite DMAC */
    573	if (npc_check_overlap(rvu, blkaddr, NPC_DMAC, 0, NIX_INTF_RX)) {
    574		dev_err(rvu->dev, "DMAC cannot be overwritten\n");
    575		return -EINVAL;
    576	}
    577
    578	npc_set_features(rvu, blkaddr, NIX_INTF_TX);
    579	npc_set_features(rvu, blkaddr, NIX_INTF_RX);
    580	npc_handle_multi_layer_fields(rvu, blkaddr, NIX_INTF_TX);
    581	npc_handle_multi_layer_fields(rvu, blkaddr, NIX_INTF_RX);
    582
    583	return 0;
    584}
    585
    586int npc_flow_steering_init(struct rvu *rvu, int blkaddr)
    587{
    588	struct npc_mcam *mcam = &rvu->hw->mcam;
    589
    590	INIT_LIST_HEAD(&mcam->mcam_rules);
    591
    592	return npc_scan_verify_kex(rvu, blkaddr);
    593}
    594
    595static int npc_check_unsupported_flows(struct rvu *rvu, u64 features, u8 intf)
    596{
    597	struct npc_mcam *mcam = &rvu->hw->mcam;
    598	u64 *mcam_features = &mcam->rx_features;
    599	u64 unsupported;
    600	u8 bit;
    601
    602	if (is_npc_intf_tx(intf))
    603		mcam_features = &mcam->tx_features;
    604
    605	unsupported = (*mcam_features ^ features) & ~(*mcam_features);
    606	if (unsupported) {
    607		dev_info(rvu->dev, "Unsupported flow(s):\n");
    608		for_each_set_bit(bit, (unsigned long *)&unsupported, 64)
    609			dev_info(rvu->dev, "%s ", npc_get_field_name(bit));
    610		return -EOPNOTSUPP;
    611	}
    612
    613	return 0;
    614}
    615
    616/* npc_update_entry - Based on the masks generated during
    617 * the key scanning, updates the given entry with value and
    618 * masks for the field of interest. Maximum 16 bytes of a packet
    619 * header can be extracted by HW hence lo and hi are sufficient.
    620 * When field bytes are less than or equal to 8 then hi should be
    621 * 0 for value and mask.
    622 *
    623 * If exact match of value is required then mask should be all 1's.
    624 * If any bits in mask are 0 then corresponding bits in value are
    625 * dont care.
    626 */
    627static void npc_update_entry(struct rvu *rvu, enum key_fields type,
    628			     struct mcam_entry *entry, u64 val_lo,
    629			     u64 val_hi, u64 mask_lo, u64 mask_hi, u8 intf)
    630{
    631	struct npc_mcam *mcam = &rvu->hw->mcam;
    632	struct mcam_entry dummy = { {0} };
    633	struct npc_key_field *field;
    634	u64 kw1, kw2, kw3;
    635	u8 shift;
    636	int i;
    637
    638	field = &mcam->rx_key_fields[type];
    639	if (is_npc_intf_tx(intf))
    640		field = &mcam->tx_key_fields[type];
    641
    642	if (!field->nr_kws)
    643		return;
    644
    645	for (i = 0; i < NPC_MAX_KWS_IN_KEY; i++) {
    646		if (!field->kw_mask[i])
    647			continue;
    648		/* place key value in kw[x] */
    649		shift = __ffs64(field->kw_mask[i]);
    650		/* update entry value */
    651		kw1 = (val_lo << shift) & field->kw_mask[i];
    652		dummy.kw[i] = kw1;
    653		/* update entry mask */
    654		kw1 = (mask_lo << shift) & field->kw_mask[i];
    655		dummy.kw_mask[i] = kw1;
    656
    657		if (field->nr_kws == 1)
    658			break;
    659		/* place remaining bits of key value in kw[x + 1] */
    660		if (field->nr_kws == 2) {
    661			/* update entry value */
    662			kw2 = shift ? val_lo >> (64 - shift) : 0;
    663			kw2 |= (val_hi << shift);
    664			kw2 &= field->kw_mask[i + 1];
    665			dummy.kw[i + 1] = kw2;
    666			/* update entry mask */
    667			kw2 = shift ? mask_lo >> (64 - shift) : 0;
    668			kw2 |= (mask_hi << shift);
    669			kw2 &= field->kw_mask[i + 1];
    670			dummy.kw_mask[i + 1] = kw2;
    671			break;
    672		}
    673		/* place remaining bits of key value in kw[x + 1], kw[x + 2] */
    674		if (field->nr_kws == 3) {
    675			/* update entry value */
    676			kw2 = shift ? val_lo >> (64 - shift) : 0;
    677			kw2 |= (val_hi << shift);
    678			kw2 &= field->kw_mask[i + 1];
    679			kw3 = shift ? val_hi >> (64 - shift) : 0;
    680			kw3 &= field->kw_mask[i + 2];
    681			dummy.kw[i + 1] = kw2;
    682			dummy.kw[i + 2] = kw3;
    683			/* update entry mask */
    684			kw2 = shift ? mask_lo >> (64 - shift) : 0;
    685			kw2 |= (mask_hi << shift);
    686			kw2 &= field->kw_mask[i + 1];
    687			kw3 = shift ? mask_hi >> (64 - shift) : 0;
    688			kw3 &= field->kw_mask[i + 2];
    689			dummy.kw_mask[i + 1] = kw2;
    690			dummy.kw_mask[i + 2] = kw3;
    691			break;
    692		}
    693	}
    694	/* dummy is ready with values and masks for given key
    695	 * field now clear and update input entry with those
    696	 */
    697	for (i = 0; i < NPC_MAX_KWS_IN_KEY; i++) {
    698		if (!field->kw_mask[i])
    699			continue;
    700		entry->kw[i] &= ~field->kw_mask[i];
    701		entry->kw_mask[i] &= ~field->kw_mask[i];
    702
    703		entry->kw[i] |= dummy.kw[i];
    704		entry->kw_mask[i] |= dummy.kw_mask[i];
    705	}
    706}
    707
    708#define IPV6_WORDS     4
    709
    710static void npc_update_ipv6_flow(struct rvu *rvu, struct mcam_entry *entry,
    711				 u64 features, struct flow_msg *pkt,
    712				 struct flow_msg *mask,
    713				 struct rvu_npc_mcam_rule *output, u8 intf)
    714{
    715	u32 src_ip[IPV6_WORDS], src_ip_mask[IPV6_WORDS];
    716	u32 dst_ip[IPV6_WORDS], dst_ip_mask[IPV6_WORDS];
    717	struct flow_msg *opkt = &output->packet;
    718	struct flow_msg *omask = &output->mask;
    719	u64 mask_lo, mask_hi;
    720	u64 val_lo, val_hi;
    721
    722	/* For an ipv6 address fe80::2c68:63ff:fe5e:2d0a the packet
    723	 * values to be programmed in MCAM should as below:
    724	 * val_high: 0xfe80000000000000
    725	 * val_low: 0x2c6863fffe5e2d0a
    726	 */
    727	if (features & BIT_ULL(NPC_SIP_IPV6)) {
    728		be32_to_cpu_array(src_ip_mask, mask->ip6src, IPV6_WORDS);
    729		be32_to_cpu_array(src_ip, pkt->ip6src, IPV6_WORDS);
    730
    731		mask_hi = (u64)src_ip_mask[0] << 32 | src_ip_mask[1];
    732		mask_lo = (u64)src_ip_mask[2] << 32 | src_ip_mask[3];
    733		val_hi = (u64)src_ip[0] << 32 | src_ip[1];
    734		val_lo = (u64)src_ip[2] << 32 | src_ip[3];
    735
    736		npc_update_entry(rvu, NPC_SIP_IPV6, entry, val_lo, val_hi,
    737				 mask_lo, mask_hi, intf);
    738		memcpy(opkt->ip6src, pkt->ip6src, sizeof(opkt->ip6src));
    739		memcpy(omask->ip6src, mask->ip6src, sizeof(omask->ip6src));
    740	}
    741	if (features & BIT_ULL(NPC_DIP_IPV6)) {
    742		be32_to_cpu_array(dst_ip_mask, mask->ip6dst, IPV6_WORDS);
    743		be32_to_cpu_array(dst_ip, pkt->ip6dst, IPV6_WORDS);
    744
    745		mask_hi = (u64)dst_ip_mask[0] << 32 | dst_ip_mask[1];
    746		mask_lo = (u64)dst_ip_mask[2] << 32 | dst_ip_mask[3];
    747		val_hi = (u64)dst_ip[0] << 32 | dst_ip[1];
    748		val_lo = (u64)dst_ip[2] << 32 | dst_ip[3];
    749
    750		npc_update_entry(rvu, NPC_DIP_IPV6, entry, val_lo, val_hi,
    751				 mask_lo, mask_hi, intf);
    752		memcpy(opkt->ip6dst, pkt->ip6dst, sizeof(opkt->ip6dst));
    753		memcpy(omask->ip6dst, mask->ip6dst, sizeof(omask->ip6dst));
    754	}
    755}
    756
    757static void npc_update_vlan_features(struct rvu *rvu, struct mcam_entry *entry,
    758				     u64 features, u8 intf)
    759{
    760	bool ctag = !!(features & BIT_ULL(NPC_VLAN_ETYPE_CTAG));
    761	bool stag = !!(features & BIT_ULL(NPC_VLAN_ETYPE_STAG));
    762	bool vid = !!(features & BIT_ULL(NPC_OUTER_VID));
    763
    764	/* If only VLAN id is given then always match outer VLAN id */
    765	if (vid && !ctag && !stag) {
    766		npc_update_entry(rvu, NPC_LB, entry,
    767				 NPC_LT_LB_STAG_QINQ | NPC_LT_LB_CTAG, 0,
    768				 NPC_LT_LB_STAG_QINQ & NPC_LT_LB_CTAG, 0, intf);
    769		return;
    770	}
    771	if (ctag)
    772		npc_update_entry(rvu, NPC_LB, entry, NPC_LT_LB_CTAG, 0,
    773				 ~0ULL, 0, intf);
    774	if (stag)
    775		npc_update_entry(rvu, NPC_LB, entry, NPC_LT_LB_STAG_QINQ, 0,
    776				 ~0ULL, 0, intf);
    777}
    778
    779static void npc_update_flow(struct rvu *rvu, struct mcam_entry *entry,
    780			    u64 features, struct flow_msg *pkt,
    781			    struct flow_msg *mask,
    782			    struct rvu_npc_mcam_rule *output, u8 intf)
    783{
    784	u64 dmac_mask = ether_addr_to_u64(mask->dmac);
    785	u64 smac_mask = ether_addr_to_u64(mask->smac);
    786	u64 dmac_val = ether_addr_to_u64(pkt->dmac);
    787	u64 smac_val = ether_addr_to_u64(pkt->smac);
    788	struct flow_msg *opkt = &output->packet;
    789	struct flow_msg *omask = &output->mask;
    790
    791	if (!features)
    792		return;
    793
    794	/* For tcp/udp/sctp LTYPE should be present in entry */
    795	if (features & BIT_ULL(NPC_IPPROTO_TCP))
    796		npc_update_entry(rvu, NPC_LD, entry, NPC_LT_LD_TCP,
    797				 0, ~0ULL, 0, intf);
    798	if (features & BIT_ULL(NPC_IPPROTO_UDP))
    799		npc_update_entry(rvu, NPC_LD, entry, NPC_LT_LD_UDP,
    800				 0, ~0ULL, 0, intf);
    801	if (features & BIT_ULL(NPC_IPPROTO_SCTP))
    802		npc_update_entry(rvu, NPC_LD, entry, NPC_LT_LD_SCTP,
    803				 0, ~0ULL, 0, intf);
    804	if (features & BIT_ULL(NPC_IPPROTO_ICMP))
    805		npc_update_entry(rvu, NPC_LD, entry, NPC_LT_LD_ICMP,
    806				 0, ~0ULL, 0, intf);
    807	if (features & BIT_ULL(NPC_IPPROTO_ICMP6))
    808		npc_update_entry(rvu, NPC_LD, entry, NPC_LT_LD_ICMP6,
    809				 0, ~0ULL, 0, intf);
    810
    811	/* For AH, LTYPE should be present in entry */
    812	if (features & BIT_ULL(NPC_IPPROTO_AH))
    813		npc_update_entry(rvu, NPC_LD, entry, NPC_LT_LD_AH,
    814				 0, ~0ULL, 0, intf);
    815	/* For ESP, LTYPE should be present in entry */
    816	if (features & BIT_ULL(NPC_IPPROTO_ESP))
    817		npc_update_entry(rvu, NPC_LE, entry, NPC_LT_LE_ESP,
    818				 0, ~0ULL, 0, intf);
    819
    820#define NPC_WRITE_FLOW(field, member, val_lo, val_hi, mask_lo, mask_hi)	      \
    821do {									      \
    822	if (features & BIT_ULL((field))) {				      \
    823		npc_update_entry(rvu, (field), entry, (val_lo), (val_hi),     \
    824				 (mask_lo), (mask_hi), intf);		      \
    825		memcpy(&opkt->member, &pkt->member, sizeof(pkt->member));     \
    826		memcpy(&omask->member, &mask->member, sizeof(mask->member));  \
    827	}								      \
    828} while (0)
    829
    830	NPC_WRITE_FLOW(NPC_DMAC, dmac, dmac_val, 0, dmac_mask, 0);
    831	NPC_WRITE_FLOW(NPC_SMAC, smac, smac_val, 0, smac_mask, 0);
    832	NPC_WRITE_FLOW(NPC_ETYPE, etype, ntohs(pkt->etype), 0,
    833		       ntohs(mask->etype), 0);
    834	NPC_WRITE_FLOW(NPC_TOS, tos, pkt->tos, 0, mask->tos, 0);
    835	NPC_WRITE_FLOW(NPC_SIP_IPV4, ip4src, ntohl(pkt->ip4src), 0,
    836		       ntohl(mask->ip4src), 0);
    837	NPC_WRITE_FLOW(NPC_DIP_IPV4, ip4dst, ntohl(pkt->ip4dst), 0,
    838		       ntohl(mask->ip4dst), 0);
    839	NPC_WRITE_FLOW(NPC_SPORT_TCP, sport, ntohs(pkt->sport), 0,
    840		       ntohs(mask->sport), 0);
    841	NPC_WRITE_FLOW(NPC_SPORT_UDP, sport, ntohs(pkt->sport), 0,
    842		       ntohs(mask->sport), 0);
    843	NPC_WRITE_FLOW(NPC_DPORT_TCP, dport, ntohs(pkt->dport), 0,
    844		       ntohs(mask->dport), 0);
    845	NPC_WRITE_FLOW(NPC_DPORT_UDP, dport, ntohs(pkt->dport), 0,
    846		       ntohs(mask->dport), 0);
    847	NPC_WRITE_FLOW(NPC_SPORT_SCTP, sport, ntohs(pkt->sport), 0,
    848		       ntohs(mask->sport), 0);
    849	NPC_WRITE_FLOW(NPC_DPORT_SCTP, dport, ntohs(pkt->dport), 0,
    850		       ntohs(mask->dport), 0);
    851
    852	NPC_WRITE_FLOW(NPC_OUTER_VID, vlan_tci, ntohs(pkt->vlan_tci), 0,
    853		       ntohs(mask->vlan_tci), 0);
    854
    855	npc_update_ipv6_flow(rvu, entry, features, pkt, mask, output, intf);
    856	npc_update_vlan_features(rvu, entry, features, intf);
    857}
    858
    859static struct rvu_npc_mcam_rule *rvu_mcam_find_rule(struct npc_mcam *mcam,
    860						    u16 entry)
    861{
    862	struct rvu_npc_mcam_rule *iter;
    863
    864	mutex_lock(&mcam->lock);
    865	list_for_each_entry(iter, &mcam->mcam_rules, list) {
    866		if (iter->entry == entry) {
    867			mutex_unlock(&mcam->lock);
    868			return iter;
    869		}
    870	}
    871	mutex_unlock(&mcam->lock);
    872
    873	return NULL;
    874}
    875
    876static void rvu_mcam_add_rule(struct npc_mcam *mcam,
    877			      struct rvu_npc_mcam_rule *rule)
    878{
    879	struct list_head *head = &mcam->mcam_rules;
    880	struct rvu_npc_mcam_rule *iter;
    881
    882	mutex_lock(&mcam->lock);
    883	list_for_each_entry(iter, &mcam->mcam_rules, list) {
    884		if (iter->entry > rule->entry)
    885			break;
    886		head = &iter->list;
    887	}
    888
    889	list_add(&rule->list, head);
    890	mutex_unlock(&mcam->lock);
    891}
    892
    893static void rvu_mcam_remove_counter_from_rule(struct rvu *rvu, u16 pcifunc,
    894					      struct rvu_npc_mcam_rule *rule)
    895{
    896	struct npc_mcam_oper_counter_req free_req = { 0 };
    897	struct msg_rsp free_rsp;
    898
    899	if (!rule->has_cntr)
    900		return;
    901
    902	free_req.hdr.pcifunc = pcifunc;
    903	free_req.cntr = rule->cntr;
    904
    905	rvu_mbox_handler_npc_mcam_free_counter(rvu, &free_req, &free_rsp);
    906	rule->has_cntr = false;
    907}
    908
    909static void rvu_mcam_add_counter_to_rule(struct rvu *rvu, u16 pcifunc,
    910					 struct rvu_npc_mcam_rule *rule,
    911					 struct npc_install_flow_rsp *rsp)
    912{
    913	struct npc_mcam_alloc_counter_req cntr_req = { 0 };
    914	struct npc_mcam_alloc_counter_rsp cntr_rsp = { 0 };
    915	int err;
    916
    917	cntr_req.hdr.pcifunc = pcifunc;
    918	cntr_req.contig = true;
    919	cntr_req.count = 1;
    920
    921	/* we try to allocate a counter to track the stats of this
    922	 * rule. If counter could not be allocated then proceed
    923	 * without counter because counters are limited than entries.
    924	 */
    925	err = rvu_mbox_handler_npc_mcam_alloc_counter(rvu, &cntr_req,
    926						      &cntr_rsp);
    927	if (!err && cntr_rsp.count) {
    928		rule->cntr = cntr_rsp.cntr;
    929		rule->has_cntr = true;
    930		rsp->counter = rule->cntr;
    931	} else {
    932		rsp->counter = err;
    933	}
    934}
    935
    936static void npc_update_rx_entry(struct rvu *rvu, struct rvu_pfvf *pfvf,
    937				struct mcam_entry *entry,
    938				struct npc_install_flow_req *req,
    939				u16 target, bool pf_set_vfs_mac)
    940{
    941	struct rvu_switch *rswitch = &rvu->rswitch;
    942	struct nix_rx_action action;
    943
    944	if (rswitch->mode == DEVLINK_ESWITCH_MODE_SWITCHDEV && pf_set_vfs_mac)
    945		req->chan_mask = 0x0; /* Do not care channel */
    946
    947	npc_update_entry(rvu, NPC_CHAN, entry, req->channel, 0, req->chan_mask,
    948			 0, NIX_INTF_RX);
    949
    950	*(u64 *)&action = 0x00;
    951	action.pf_func = target;
    952	action.op = req->op;
    953	action.index = req->index;
    954	action.match_id = req->match_id;
    955	action.flow_key_alg = req->flow_key_alg;
    956
    957	if (req->op == NIX_RX_ACTION_DEFAULT && pfvf->def_ucast_rule)
    958		action = pfvf->def_ucast_rule->rx_action;
    959
    960	entry->action = *(u64 *)&action;
    961
    962	/* VTAG0 starts at 0th byte of LID_B.
    963	 * VTAG1 starts at 4th byte of LID_B.
    964	 */
    965	entry->vtag_action = FIELD_PREP(RX_VTAG0_VALID_BIT, req->vtag0_valid) |
    966			     FIELD_PREP(RX_VTAG0_TYPE_MASK, req->vtag0_type) |
    967			     FIELD_PREP(RX_VTAG0_LID_MASK, NPC_LID_LB) |
    968			     FIELD_PREP(RX_VTAG0_RELPTR_MASK, 0) |
    969			     FIELD_PREP(RX_VTAG1_VALID_BIT, req->vtag1_valid) |
    970			     FIELD_PREP(RX_VTAG1_TYPE_MASK, req->vtag1_type) |
    971			     FIELD_PREP(RX_VTAG1_LID_MASK, NPC_LID_LB) |
    972			     FIELD_PREP(RX_VTAG1_RELPTR_MASK, 4);
    973}
    974
    975static void npc_update_tx_entry(struct rvu *rvu, struct rvu_pfvf *pfvf,
    976				struct mcam_entry *entry,
    977				struct npc_install_flow_req *req, u16 target)
    978{
    979	struct nix_tx_action action;
    980	u64 mask = ~0ULL;
    981
    982	/* If AF is installing then do not care about
    983	 * PF_FUNC in Send Descriptor
    984	 */
    985	if (is_pffunc_af(req->hdr.pcifunc))
    986		mask = 0;
    987
    988	npc_update_entry(rvu, NPC_PF_FUNC, entry, (__force u16)htons(target),
    989			 0, mask, 0, NIX_INTF_TX);
    990
    991	*(u64 *)&action = 0x00;
    992	action.op = req->op;
    993	action.index = req->index;
    994	action.match_id = req->match_id;
    995
    996	entry->action = *(u64 *)&action;
    997
    998	/* VTAG0 starts at 0th byte of LID_B.
    999	 * VTAG1 starts at 4th byte of LID_B.
   1000	 */
   1001	entry->vtag_action = FIELD_PREP(TX_VTAG0_DEF_MASK, req->vtag0_def) |
   1002			     FIELD_PREP(TX_VTAG0_OP_MASK, req->vtag0_op) |
   1003			     FIELD_PREP(TX_VTAG0_LID_MASK, NPC_LID_LA) |
   1004			     FIELD_PREP(TX_VTAG0_RELPTR_MASK, 20) |
   1005			     FIELD_PREP(TX_VTAG1_DEF_MASK, req->vtag1_def) |
   1006			     FIELD_PREP(TX_VTAG1_OP_MASK, req->vtag1_op) |
   1007			     FIELD_PREP(TX_VTAG1_LID_MASK, NPC_LID_LA) |
   1008			     FIELD_PREP(TX_VTAG1_RELPTR_MASK, 24);
   1009}
   1010
   1011static int npc_install_flow(struct rvu *rvu, int blkaddr, u16 target,
   1012			    int nixlf, struct rvu_pfvf *pfvf,
   1013			    struct npc_install_flow_req *req,
   1014			    struct npc_install_flow_rsp *rsp, bool enable,
   1015			    bool pf_set_vfs_mac)
   1016{
   1017	struct rvu_npc_mcam_rule *def_ucast_rule = pfvf->def_ucast_rule;
   1018	u64 features, installed_features, missing_features = 0;
   1019	struct npc_mcam_write_entry_req write_req = { 0 };
   1020	struct npc_mcam *mcam = &rvu->hw->mcam;
   1021	struct rvu_npc_mcam_rule dummy = { 0 };
   1022	struct rvu_npc_mcam_rule *rule;
   1023	u16 owner = req->hdr.pcifunc;
   1024	struct msg_rsp write_rsp;
   1025	struct mcam_entry *entry;
   1026	int entry_index, err;
   1027	bool new = false;
   1028
   1029	installed_features = req->features;
   1030	features = req->features;
   1031	entry = &write_req.entry_data;
   1032	entry_index = req->entry;
   1033
   1034	npc_update_flow(rvu, entry, features, &req->packet, &req->mask, &dummy,
   1035			req->intf);
   1036
   1037	if (is_npc_intf_rx(req->intf))
   1038		npc_update_rx_entry(rvu, pfvf, entry, req, target, pf_set_vfs_mac);
   1039	else
   1040		npc_update_tx_entry(rvu, pfvf, entry, req, target);
   1041
   1042	/* Default unicast rules do not exist for TX */
   1043	if (is_npc_intf_tx(req->intf))
   1044		goto find_rule;
   1045
   1046	if (req->default_rule) {
   1047		entry_index = npc_get_nixlf_mcam_index(mcam, target, nixlf,
   1048						       NIXLF_UCAST_ENTRY);
   1049		enable = is_mcam_entry_enabled(rvu, mcam, blkaddr, entry_index);
   1050	}
   1051
   1052	/* update mcam entry with default unicast rule attributes */
   1053	if (def_ucast_rule && (req->default_rule && req->append)) {
   1054		missing_features = (def_ucast_rule->features ^ features) &
   1055					def_ucast_rule->features;
   1056		if (missing_features)
   1057			npc_update_flow(rvu, entry, missing_features,
   1058					&def_ucast_rule->packet,
   1059					&def_ucast_rule->mask,
   1060					&dummy, req->intf);
   1061		installed_features = req->features | missing_features;
   1062	}
   1063
   1064find_rule:
   1065	rule = rvu_mcam_find_rule(mcam, entry_index);
   1066	if (!rule) {
   1067		rule = kzalloc(sizeof(*rule), GFP_KERNEL);
   1068		if (!rule)
   1069			return -ENOMEM;
   1070		new = true;
   1071	}
   1072
   1073	/* allocate new counter if rule has no counter */
   1074	if (!req->default_rule && req->set_cntr && !rule->has_cntr)
   1075		rvu_mcam_add_counter_to_rule(rvu, owner, rule, rsp);
   1076
   1077	/* if user wants to delete an existing counter for a rule then
   1078	 * free the counter
   1079	 */
   1080	if (!req->set_cntr && rule->has_cntr)
   1081		rvu_mcam_remove_counter_from_rule(rvu, owner, rule);
   1082
   1083	write_req.hdr.pcifunc = owner;
   1084
   1085	/* AF owns the default rules so change the owner just to relax
   1086	 * the checks in rvu_mbox_handler_npc_mcam_write_entry
   1087	 */
   1088	if (req->default_rule)
   1089		write_req.hdr.pcifunc = 0;
   1090
   1091	write_req.entry = entry_index;
   1092	write_req.intf = req->intf;
   1093	write_req.enable_entry = (u8)enable;
   1094	/* if counter is available then clear and use it */
   1095	if (req->set_cntr && rule->has_cntr) {
   1096		rvu_write64(rvu, blkaddr, NPC_AF_MATCH_STATX(rule->cntr), 0x00);
   1097		write_req.set_cntr = 1;
   1098		write_req.cntr = rule->cntr;
   1099	}
   1100
   1101	/* update rule */
   1102	memcpy(&rule->packet, &dummy.packet, sizeof(rule->packet));
   1103	memcpy(&rule->mask, &dummy.mask, sizeof(rule->mask));
   1104	rule->entry = entry_index;
   1105	memcpy(&rule->rx_action, &entry->action, sizeof(struct nix_rx_action));
   1106	if (is_npc_intf_tx(req->intf))
   1107		memcpy(&rule->tx_action, &entry->action,
   1108		       sizeof(struct nix_tx_action));
   1109	rule->vtag_action = entry->vtag_action;
   1110	rule->features = installed_features;
   1111	rule->default_rule = req->default_rule;
   1112	rule->owner = owner;
   1113	rule->enable = enable;
   1114	rule->chan_mask = write_req.entry_data.kw_mask[0] & NPC_KEX_CHAN_MASK;
   1115	rule->chan = write_req.entry_data.kw[0] & NPC_KEX_CHAN_MASK;
   1116	rule->chan &= rule->chan_mask;
   1117	if (is_npc_intf_tx(req->intf))
   1118		rule->intf = pfvf->nix_tx_intf;
   1119	else
   1120		rule->intf = pfvf->nix_rx_intf;
   1121
   1122	if (new)
   1123		rvu_mcam_add_rule(mcam, rule);
   1124	if (req->default_rule)
   1125		pfvf->def_ucast_rule = rule;
   1126
   1127	/* write to mcam entry registers */
   1128	err = rvu_mbox_handler_npc_mcam_write_entry(rvu, &write_req,
   1129						    &write_rsp);
   1130	if (err) {
   1131		rvu_mcam_remove_counter_from_rule(rvu, owner, rule);
   1132		if (new) {
   1133			list_del(&rule->list);
   1134			kfree(rule);
   1135		}
   1136		return err;
   1137	}
   1138
   1139	/* VF's MAC address is being changed via PF  */
   1140	if (pf_set_vfs_mac) {
   1141		ether_addr_copy(pfvf->default_mac, req->packet.dmac);
   1142		ether_addr_copy(pfvf->mac_addr, req->packet.dmac);
   1143		set_bit(PF_SET_VF_MAC, &pfvf->flags);
   1144	}
   1145
   1146	if (test_bit(PF_SET_VF_CFG, &pfvf->flags) &&
   1147	    req->vtag0_type == NIX_AF_LFX_RX_VTAG_TYPE7)
   1148		rule->vfvlan_cfg = true;
   1149
   1150	if (is_npc_intf_rx(req->intf) && req->match_id &&
   1151	    (req->op == NIX_RX_ACTIONOP_UCAST || req->op == NIX_RX_ACTIONOP_RSS))
   1152		return rvu_nix_setup_ratelimit_aggr(rvu, req->hdr.pcifunc,
   1153					     req->index, req->match_id);
   1154
   1155	return 0;
   1156}
   1157
   1158int rvu_mbox_handler_npc_install_flow(struct rvu *rvu,
   1159				      struct npc_install_flow_req *req,
   1160				      struct npc_install_flow_rsp *rsp)
   1161{
   1162	bool from_vf = !!(req->hdr.pcifunc & RVU_PFVF_FUNC_MASK);
   1163	struct rvu_switch *rswitch = &rvu->rswitch;
   1164	int blkaddr, nixlf, err;
   1165	struct rvu_pfvf *pfvf;
   1166	bool pf_set_vfs_mac = false;
   1167	bool enable = true;
   1168	u16 target;
   1169
   1170	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
   1171	if (blkaddr < 0) {
   1172		dev_err(rvu->dev, "%s: NPC block not implemented\n", __func__);
   1173		return NPC_MCAM_INVALID_REQ;
   1174	}
   1175
   1176	if (!is_npc_interface_valid(rvu, req->intf))
   1177		return NPC_FLOW_INTF_INVALID;
   1178
   1179	if (from_vf && req->default_rule)
   1180		return NPC_FLOW_VF_PERM_DENIED;
   1181
   1182	/* Each PF/VF info is maintained in struct rvu_pfvf.
   1183	 * rvu_pfvf for the target PF/VF needs to be retrieved
   1184	 * hence modify pcifunc accordingly.
   1185	 */
   1186
   1187	/* AF installing for a PF/VF */
   1188	if (!req->hdr.pcifunc)
   1189		target = req->vf;
   1190	/* PF installing for its VF */
   1191	else if (!from_vf && req->vf) {
   1192		target = (req->hdr.pcifunc & ~RVU_PFVF_FUNC_MASK) | req->vf;
   1193		pf_set_vfs_mac = req->default_rule &&
   1194				(req->features & BIT_ULL(NPC_DMAC));
   1195	}
   1196	/* msg received from PF/VF */
   1197	else
   1198		target = req->hdr.pcifunc;
   1199
   1200	/* ignore chan_mask in case pf func is not AF, revisit later */
   1201	if (!is_pffunc_af(req->hdr.pcifunc))
   1202		req->chan_mask = 0xFFF;
   1203
   1204	err = npc_check_unsupported_flows(rvu, req->features, req->intf);
   1205	if (err)
   1206		return NPC_FLOW_NOT_SUPPORTED;
   1207
   1208	pfvf = rvu_get_pfvf(rvu, target);
   1209
   1210	/* PF installing for its VF */
   1211	if (req->hdr.pcifunc && !from_vf && req->vf)
   1212		set_bit(PF_SET_VF_CFG, &pfvf->flags);
   1213
   1214	/* update req destination mac addr */
   1215	if ((req->features & BIT_ULL(NPC_DMAC)) && is_npc_intf_rx(req->intf) &&
   1216	    is_zero_ether_addr(req->packet.dmac)) {
   1217		ether_addr_copy(req->packet.dmac, pfvf->mac_addr);
   1218		eth_broadcast_addr((u8 *)&req->mask.dmac);
   1219	}
   1220
   1221	/* Proceed if NIXLF is attached or not for TX rules */
   1222	err = nix_get_nixlf(rvu, target, &nixlf, NULL);
   1223	if (err && is_npc_intf_rx(req->intf) && !pf_set_vfs_mac)
   1224		return NPC_FLOW_NO_NIXLF;
   1225
   1226	/* don't enable rule when nixlf not attached or initialized */
   1227	if (!(is_nixlf_attached(rvu, target) &&
   1228	      test_bit(NIXLF_INITIALIZED, &pfvf->flags)))
   1229		enable = false;
   1230
   1231	/* Packets reaching NPC in Tx path implies that a
   1232	 * NIXLF is properly setup and transmitting.
   1233	 * Hence rules can be enabled for Tx.
   1234	 */
   1235	if (is_npc_intf_tx(req->intf))
   1236		enable = true;
   1237
   1238	/* Do not allow requests from uninitialized VFs */
   1239	if (from_vf && !enable)
   1240		return NPC_FLOW_VF_NOT_INIT;
   1241
   1242	/* PF sets VF mac & VF NIXLF is not attached, update the mac addr */
   1243	if (pf_set_vfs_mac && !enable) {
   1244		ether_addr_copy(pfvf->default_mac, req->packet.dmac);
   1245		ether_addr_copy(pfvf->mac_addr, req->packet.dmac);
   1246		set_bit(PF_SET_VF_MAC, &pfvf->flags);
   1247		return 0;
   1248	}
   1249
   1250	mutex_lock(&rswitch->switch_lock);
   1251	err = npc_install_flow(rvu, blkaddr, target, nixlf, pfvf,
   1252			       req, rsp, enable, pf_set_vfs_mac);
   1253	mutex_unlock(&rswitch->switch_lock);
   1254
   1255	return err;
   1256}
   1257
   1258static int npc_delete_flow(struct rvu *rvu, struct rvu_npc_mcam_rule *rule,
   1259			   u16 pcifunc)
   1260{
   1261	struct npc_mcam_ena_dis_entry_req dis_req = { 0 };
   1262	struct msg_rsp dis_rsp;
   1263
   1264	if (rule->default_rule)
   1265		return 0;
   1266
   1267	if (rule->has_cntr)
   1268		rvu_mcam_remove_counter_from_rule(rvu, pcifunc, rule);
   1269
   1270	dis_req.hdr.pcifunc = pcifunc;
   1271	dis_req.entry = rule->entry;
   1272
   1273	list_del(&rule->list);
   1274	kfree(rule);
   1275
   1276	return rvu_mbox_handler_npc_mcam_dis_entry(rvu, &dis_req, &dis_rsp);
   1277}
   1278
   1279int rvu_mbox_handler_npc_delete_flow(struct rvu *rvu,
   1280				     struct npc_delete_flow_req *req,
   1281				     struct msg_rsp *rsp)
   1282{
   1283	struct npc_mcam *mcam = &rvu->hw->mcam;
   1284	struct rvu_npc_mcam_rule *iter, *tmp;
   1285	u16 pcifunc = req->hdr.pcifunc;
   1286	struct list_head del_list;
   1287
   1288	INIT_LIST_HEAD(&del_list);
   1289
   1290	mutex_lock(&mcam->lock);
   1291	list_for_each_entry_safe(iter, tmp, &mcam->mcam_rules, list) {
   1292		if (iter->owner == pcifunc) {
   1293			/* All rules */
   1294			if (req->all) {
   1295				list_move_tail(&iter->list, &del_list);
   1296			/* Range of rules */
   1297			} else if (req->end && iter->entry >= req->start &&
   1298				   iter->entry <= req->end) {
   1299				list_move_tail(&iter->list, &del_list);
   1300			/* single rule */
   1301			} else if (req->entry == iter->entry) {
   1302				list_move_tail(&iter->list, &del_list);
   1303				break;
   1304			}
   1305		}
   1306	}
   1307	mutex_unlock(&mcam->lock);
   1308
   1309	list_for_each_entry_safe(iter, tmp, &del_list, list) {
   1310		u16 entry = iter->entry;
   1311
   1312		/* clear the mcam entry target pcifunc */
   1313		mcam->entry2target_pffunc[entry] = 0x0;
   1314		if (npc_delete_flow(rvu, iter, pcifunc))
   1315			dev_err(rvu->dev, "rule deletion failed for entry:%u",
   1316				entry);
   1317	}
   1318
   1319	return 0;
   1320}
   1321
   1322static int npc_update_dmac_value(struct rvu *rvu, int npcblkaddr,
   1323				 struct rvu_npc_mcam_rule *rule,
   1324				 struct rvu_pfvf *pfvf)
   1325{
   1326	struct npc_mcam_write_entry_req write_req = { 0 };
   1327	struct mcam_entry *entry = &write_req.entry_data;
   1328	struct npc_mcam *mcam = &rvu->hw->mcam;
   1329	struct msg_rsp rsp;
   1330	u8 intf, enable;
   1331	int err;
   1332
   1333	ether_addr_copy(rule->packet.dmac, pfvf->mac_addr);
   1334
   1335	npc_read_mcam_entry(rvu, mcam, npcblkaddr, rule->entry,
   1336			    entry, &intf,  &enable);
   1337
   1338	npc_update_entry(rvu, NPC_DMAC, entry,
   1339			 ether_addr_to_u64(pfvf->mac_addr), 0,
   1340			 0xffffffffffffull, 0, intf);
   1341
   1342	write_req.hdr.pcifunc = rule->owner;
   1343	write_req.entry = rule->entry;
   1344	write_req.intf = pfvf->nix_rx_intf;
   1345
   1346	mutex_unlock(&mcam->lock);
   1347	err = rvu_mbox_handler_npc_mcam_write_entry(rvu, &write_req, &rsp);
   1348	mutex_lock(&mcam->lock);
   1349
   1350	return err;
   1351}
   1352
   1353void npc_mcam_enable_flows(struct rvu *rvu, u16 target)
   1354{
   1355	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, target);
   1356	struct rvu_npc_mcam_rule *def_ucast_rule;
   1357	struct npc_mcam *mcam = &rvu->hw->mcam;
   1358	struct rvu_npc_mcam_rule *rule;
   1359	int blkaddr, bank, index;
   1360	u64 def_action;
   1361
   1362	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
   1363	if (blkaddr < 0)
   1364		return;
   1365
   1366	def_ucast_rule = pfvf->def_ucast_rule;
   1367
   1368	mutex_lock(&mcam->lock);
   1369	list_for_each_entry(rule, &mcam->mcam_rules, list) {
   1370		if (is_npc_intf_rx(rule->intf) &&
   1371		    rule->rx_action.pf_func == target && !rule->enable) {
   1372			if (rule->default_rule) {
   1373				npc_enable_mcam_entry(rvu, mcam, blkaddr,
   1374						      rule->entry, true);
   1375				rule->enable = true;
   1376				continue;
   1377			}
   1378
   1379			if (rule->vfvlan_cfg)
   1380				npc_update_dmac_value(rvu, blkaddr, rule, pfvf);
   1381
   1382			if (rule->rx_action.op == NIX_RX_ACTION_DEFAULT) {
   1383				if (!def_ucast_rule)
   1384					continue;
   1385				/* Use default unicast entry action */
   1386				rule->rx_action = def_ucast_rule->rx_action;
   1387				def_action = *(u64 *)&def_ucast_rule->rx_action;
   1388				bank = npc_get_bank(mcam, rule->entry);
   1389				rvu_write64(rvu, blkaddr,
   1390					    NPC_AF_MCAMEX_BANKX_ACTION
   1391					    (rule->entry, bank), def_action);
   1392			}
   1393
   1394			npc_enable_mcam_entry(rvu, mcam, blkaddr,
   1395					      rule->entry, true);
   1396			rule->enable = true;
   1397		}
   1398	}
   1399
   1400	/* Enable MCAM entries installed by PF with target as VF pcifunc */
   1401	for (index = 0; index < mcam->bmap_entries; index++) {
   1402		if (mcam->entry2target_pffunc[index] == target)
   1403			npc_enable_mcam_entry(rvu, mcam, blkaddr,
   1404					      index, true);
   1405	}
   1406	mutex_unlock(&mcam->lock);
   1407}
   1408
   1409void npc_mcam_disable_flows(struct rvu *rvu, u16 target)
   1410{
   1411	struct npc_mcam *mcam = &rvu->hw->mcam;
   1412	int blkaddr, index;
   1413
   1414	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
   1415	if (blkaddr < 0)
   1416		return;
   1417
   1418	mutex_lock(&mcam->lock);
   1419	/* Disable MCAM entries installed by PF with target as VF pcifunc */
   1420	for (index = 0; index < mcam->bmap_entries; index++) {
   1421		if (mcam->entry2target_pffunc[index] == target)
   1422			npc_enable_mcam_entry(rvu, mcam, blkaddr,
   1423					      index, false);
   1424	}
   1425	mutex_unlock(&mcam->lock);
   1426}