From patchwork Mon Feb 28 04:53:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Satheesh Paul Antonysamy X-Patchwork-Id: 108387 X-Patchwork-Delegate: jerinj@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C7A09A0350; Mon, 28 Feb 2022 05:53:39 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A1F994068C; Mon, 28 Feb 2022 05:53:39 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 2CAF94068A for ; Mon, 28 Feb 2022 05:53:38 +0100 (CET) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 21S24KGJ006742 for ; Sun, 27 Feb 2022 20:53:37 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=3sTElVhVIObHGbIfhkdFOsIP6+vOCE0Q6MTeKW17gwM=; b=YzMibUbKEgnPROcnugHThx/vQdxj/b8CX/mr4ck5jlk3wMb5jLxQxfqUUAK3vbI+76DM YLBRklHEn7jUe2rEMkInVO557cmTj4MfNzfYcKNwiIJJSeoXA9uLroMkLNwJYvO+ARx1 GYVqBXl4G8FVeMR6kDAEoyrscHpUpqGnTZtP8kmI3aT7QgP4bAkydq/0Sl+Ir1fi/ckV lowHht9Qwjqlzu7lTH8yz7h+fhhkbBbSmtHTE716ymmvNQrVefJjb/Y4nWovuiONyyCX JQQx+pOXXlC8ejIC3XgWo+t1cE8DWHvLhW/HRNZn/hElnI5URdzggxXupSqIE2tATLAe Ag== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3egn96rf88-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Sun, 27 Feb 2022 20:53:37 -0800 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 27 Feb 2022 20:53:35 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.18 via Frontend Transport; Sun, 27 Feb 2022 20:53:35 -0800 Received: from localhost.localdomain (unknown [10.28.34.33]) by maili.marvell.com (Postfix) with ESMTP id 32DB33F7118; Sun, 27 Feb 2022 20:53:32 -0800 (PST) From: To: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao CC: , Satheesh Paul Subject: [dpdk-dev] [PATCH 1/2] common/cnxk: support for CPT second pass flow rules Date: Mon, 28 Feb 2022 10:23:21 +0530 Message-ID: <20220228045322.1841812-1-psatheesh@marvell.com> X-Mailer: git-send-email 2.25.4 MIME-Version: 1.0 X-Proofpoint-GUID: DLFTM8t3CogieE95EOPfkZTutDgnk700 X-Proofpoint-ORIG-GUID: DLFTM8t3CogieE95EOPfkZTutDgnk700 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.64.514 definitions=2022-02-28_01,2022-02-26_01,2022-02-23_01 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Satheesh Paul Added support to create flow rules to match packets from CPT(second pass packets). With this change, ingress rules will be created with bits 10 and 11 of channel field in the MCAM ignored by default. For rules specific to second pass packets, the CPT channel bits will be set in the MCAM. Signed-off-by: Satheesh Paul --- drivers/common/cnxk/hw/nix.h | 7 +++- drivers/common/cnxk/roc_npc.c | 9 +++-- drivers/common/cnxk/roc_npc.h | 1 + drivers/common/cnxk/roc_npc_mcam.c | 60 ++++++++++++++++++++--------- drivers/common/cnxk/roc_npc_parse.c | 14 +++++++ drivers/common/cnxk/roc_npc_priv.h | 2 + 6 files changed, 69 insertions(+), 24 deletions(-) diff --git a/drivers/common/cnxk/hw/nix.h b/drivers/common/cnxk/hw/nix.h index 1cc0c8dfb8..5863e358e0 100644 --- a/drivers/common/cnxk/hw/nix.h +++ b/drivers/common/cnxk/hw/nix.h @@ -830,7 +830,7 @@ #define NIX_CHAN_LBKX_CHX(a, b) \ (0x000ull | ((uint64_t)(a) << 8) | (uint64_t)(b)) #define NIX_CHAN_CPT_CH_END (0x4ffull) /* [CN10K, .) */ -#define NIX_CHAN_CPT_CH_START (0x400ull) /* [CN10K, .) */ +#define NIX_CHAN_CPT_CH_START (0x800ull) /* [CN10K, .) */ #define NIX_CHAN_R4 (0x400ull) /* [CN9K, CN10K) */ #define NIX_CHAN_R5 (0x500ull) #define NIX_CHAN_R6 (0x600ull) @@ -843,6 +843,11 @@ #define NIX_CHAN_RPMX_LMACX_CHX(a, b, c) \ (0x800ull | ((uint64_t)(a) << 8) | ((uint64_t)(b) << 4) | (uint64_t)(c)) +/* The mask is to extract lower 10-bits of channel number + * which CPT will pass to X2P. + */ +#define NIX_CHAN_CPT_X2P_MASK (0x3ffull) + #define NIX_INTF_SDP (0x4ull) #define NIX_INTF_CGX0 (0x0ull) /* [CN9K, CN10K) */ #define NIX_INTF_CGX1 (0x1ull) /* [CN9K, CN10K) */ diff --git a/drivers/common/cnxk/roc_npc.c b/drivers/common/cnxk/roc_npc.c index fc88fd58bc..51e36f141f 100644 --- a/drivers/common/cnxk/roc_npc.c +++ b/drivers/common/cnxk/roc_npc.c @@ -570,10 +570,11 @@ npc_parse_pattern(struct npc *npc, const struct roc_npc_item_info pattern[], struct roc_npc_flow *flow, struct npc_parse_state *pst) { npc_parse_stage_func_t parse_stage_funcs[] = { - npc_parse_meta_items, npc_parse_pre_l2, npc_parse_cpt_hdr, - npc_parse_higig2_hdr, npc_parse_la, npc_parse_lb, - npc_parse_lc, npc_parse_ld, npc_parse_le, - npc_parse_lf, npc_parse_lg, npc_parse_lh, + npc_parse_meta_items, npc_parse_mark_item, npc_parse_pre_l2, + npc_parse_cpt_hdr, npc_parse_higig2_hdr, npc_parse_la, + npc_parse_lb, npc_parse_lc, npc_parse_ld, + npc_parse_le, npc_parse_lf, npc_parse_lg, + npc_parse_lh, }; uint8_t layer = 0; int key_offset; diff --git a/drivers/common/cnxk/roc_npc.h b/drivers/common/cnxk/roc_npc.h index 6204139396..aecea37b3d 100644 --- a/drivers/common/cnxk/roc_npc.h +++ b/drivers/common/cnxk/roc_npc.h @@ -37,6 +37,7 @@ enum roc_npc_item_type { ROC_NPC_ITEM_TYPE_L3_CUSTOM, ROC_NPC_ITEM_TYPE_QINQ, ROC_NPC_ITEM_TYPE_RAW, + ROC_NPC_ITEM_TYPE_MARK, ROC_NPC_ITEM_TYPE_END, }; diff --git a/drivers/common/cnxk/roc_npc_mcam.c b/drivers/common/cnxk/roc_npc_mcam.c index 9c5ff5e60a..3447b59344 100644 --- a/drivers/common/cnxk/roc_npc_mcam.c +++ b/drivers/common/cnxk/roc_npc_mcam.c @@ -497,6 +497,38 @@ npc_mcam_fetch_kex_cfg(struct npc *npc) return rc; } +static void +npc_mcam_set_channel(struct roc_npc_flow *flow, + struct npc_mcam_write_entry_req *req, uint16_t channel, + uint16_t chan_mask, bool is_second_pass) +{ + uint16_t chan = 0, mask = 0; + + req->entry_data.kw[0] &= ~(GENMASK(11, 0)); + req->entry_data.kw_mask[0] &= ~(GENMASK(11, 0)); + flow->mcam_data[0] &= ~(GENMASK(11, 0)); + flow->mcam_mask[0] &= ~(GENMASK(11, 0)); + + if (is_second_pass) { + chan = (channel | NIX_CHAN_CPT_CH_START); + mask = (chan_mask | NIX_CHAN_CPT_CH_START); + } else { + /* + * Clear bits 10 & 11 corresponding to CPT + * channel. By default, rules should match + * both first pass packets and second pass + * packets from CPT. + */ + chan = (channel & NIX_CHAN_CPT_X2P_MASK); + mask = (chan_mask & NIX_CHAN_CPT_X2P_MASK); + } + + req->entry_data.kw[0] |= (uint64_t)chan; + req->entry_data.kw_mask[0] |= (uint64_t)mask; + flow->mcam_data[0] |= (uint64_t)chan; + flow->mcam_mask[0] |= (uint64_t)mask; +} + int npc_mcam_alloc_and_write(struct npc *npc, struct roc_npc_flow *flow, struct npc_parse_state *pst) @@ -564,32 +596,22 @@ npc_mcam_alloc_and_write(struct npc *npc, struct roc_npc_flow *flow, if (flow->nix_intf == NIX_INTF_RX) { if (inl_dev && inl_dev->is_multi_channel && (flow->npc_action & NIX_RX_ACTIONOP_UCAST_IPSEC)) { - req->entry_data.kw[0] |= (uint64_t)inl_dev->channel; - req->entry_data.kw_mask[0] |= - (uint64_t)inl_dev->chan_mask; pf_func = nix_inl_dev_pffunc_get(); req->entry_data.action &= ~(GENMASK(19, 4)); req->entry_data.action |= (uint64_t)pf_func << 4; - flow->npc_action &= ~(GENMASK(19, 4)); flow->npc_action |= (uint64_t)pf_func << 4; - flow->mcam_data[0] |= (uint64_t)inl_dev->channel; - flow->mcam_mask[0] |= (uint64_t)inl_dev->chan_mask; + + npc_mcam_set_channel(flow, req, inl_dev->channel, + inl_dev->chan_mask, false); } else if (npc->is_sdp_link) { - req->entry_data.kw[0] &= ~(GENMASK(11, 0)); - req->entry_data.kw_mask[0] &= ~(GENMASK(11, 0)); - req->entry_data.kw[0] |= (uint64_t)npc->sdp_channel; - req->entry_data.kw_mask[0] |= - (uint64_t)npc->sdp_channel_mask; - flow->mcam_data[0] &= ~(GENMASK(11, 0)); - flow->mcam_mask[0] &= ~(GENMASK(11, 0)); - flow->mcam_data[0] |= (uint64_t)npc->sdp_channel; - flow->mcam_mask[0] |= (uint64_t)npc->sdp_channel_mask; + npc_mcam_set_channel(flow, req, npc->sdp_channel, + npc->sdp_channel_mask, + pst->is_second_pass_rule); } else { - req->entry_data.kw[0] |= (uint64_t)npc->channel; - req->entry_data.kw_mask[0] |= (BIT_ULL(12) - 1); - flow->mcam_data[0] |= (uint64_t)npc->channel; - flow->mcam_mask[0] |= (BIT_ULL(12) - 1); + npc_mcam_set_channel(flow, req, npc->channel, + (BIT_ULL(12) - 1), + pst->is_second_pass_rule); } } else { uint16_t pf_func = (flow->npc_action >> 4) & 0xffff; diff --git a/drivers/common/cnxk/roc_npc_parse.c b/drivers/common/cnxk/roc_npc_parse.c index b849326a19..364a846963 100644 --- a/drivers/common/cnxk/roc_npc_parse.c +++ b/drivers/common/cnxk/roc_npc_parse.c @@ -21,6 +21,20 @@ npc_parse_meta_items(struct npc_parse_state *pst) return 0; } +int +npc_parse_mark_item(struct npc_parse_state *pst) +{ + if (pst->pattern->type == ROC_NPC_ITEM_TYPE_MARK) { + if (pst->flow->nix_intf != NIX_INTF_RX) + return -EINVAL; + + pst->is_second_pass_rule = true; + pst->pattern++; + } + + return 0; +} + static int npc_flow_raw_item_prepare(const struct roc_npc_flow_item_raw *raw_spec, const struct roc_npc_flow_item_raw *raw_mask, diff --git a/drivers/common/cnxk/roc_npc_priv.h b/drivers/common/cnxk/roc_npc_priv.h index e78d96e876..78d6ee844d 100644 --- a/drivers/common/cnxk/roc_npc_priv.h +++ b/drivers/common/cnxk/roc_npc_priv.h @@ -189,6 +189,7 @@ struct npc_parse_state { /* adjust ltype in MCAM to match at least one vlan */ bool set_vlan_ltype_mask; bool set_ipv6ext_ltype_mask; + bool is_second_pass_rule; }; enum npc_kpu_parser_flag { @@ -421,6 +422,7 @@ void npc_get_hw_supp_mask(struct npc_parse_state *pst, int npc_parse_item_basic(const struct roc_npc_item_info *item, struct npc_parse_item_info *info); int npc_parse_meta_items(struct npc_parse_state *pst); +int npc_parse_mark_item(struct npc_parse_state *pst); int npc_parse_pre_l2(struct npc_parse_state *pst); int npc_parse_higig2_hdr(struct npc_parse_state *pst); int npc_parse_cpt_hdr(struct npc_parse_state *pst);