From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 78D32A034F; Wed, 24 Feb 2021 13:44:42 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 88044160881; Wed, 24 Feb 2021 13:43:34 +0100 (CET) Received: from inva021.nxp.com (inva021.nxp.com [92.121.34.21]) by mails.dpdk.org (Postfix) with ESMTP id AE6F0160837 for ; Wed, 24 Feb 2021 13:43:25 +0100 (CET) Received: from inva021.nxp.com (localhost [127.0.0.1]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 82DFB2005A5; Wed, 24 Feb 2021 13:43:25 +0100 (CET) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 31302200597; Wed, 24 Feb 2021 13:43:23 +0100 (CET) Received: from bf-netperf1.ap.freescale.net (bf-netperf1.ap.freescale.net [10.232.133.63]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id 1D04D4032C; Wed, 24 Feb 2021 13:43:20 +0100 (CET) From: Hemant Agrawal To: dev@dpdk.org Cc: ferruh.yigit@intel.com, Akhil Goyal Date: Wed, 24 Feb 2021 18:12:58 +0530 Message-Id: <20210224124311.29799-11-hemant.agrawal@nxp.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210224124311.29799-1-hemant.agrawal@nxp.com> References: <20210211141620.12482-1-hemant.agrawal@nxp.com> <20210224124311.29799-1-hemant.agrawal@nxp.com> X-Virus-Scanned: ClamAV using ClamSMTP Subject: [dpdk-dev] [PATCH v3 10/23] net/dpaa2: add support for raw pattern in dpdmux 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 Sender: "dev" From: Akhil Goyal Added support for flow raw pattern and check that the call for dpdmux_set_custom_key() which should be called only once for a particular DPDMUX as all previous rules will be erased with this call. Hence calling it for the first time only. Signed-off-by: Akhil Goyal Acked-by: Hemant Agrawal --- drivers/net/dpaa2/dpaa2_mux.c | 39 ++++++++++++++++++++++----- drivers/net/dpaa2/mc/dpdmux.c | 3 ++- drivers/net/dpaa2/mc/fsl_dpdmux.h | 12 +++++++-- drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h | 4 +-- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/drivers/net/dpaa2/dpaa2_mux.c b/drivers/net/dpaa2/dpaa2_mux.c index b397d333d6..b669a16fc1 100644 --- a/drivers/net/dpaa2/dpaa2_mux.c +++ b/drivers/net/dpaa2/dpaa2_mux.c @@ -66,6 +66,7 @@ rte_pmd_dpaa2_mux_flow_create(uint32_t dpdmux_id, void *key_iova, *mask_iova, *key_cfg_iova = NULL; uint8_t key_size = 0; int ret; + static int i; /* Find the DPDMUX from dpdmux_id in our list */ dpdmux_dev = get_dpdmux_from_id(dpdmux_id); @@ -154,6 +155,23 @@ rte_pmd_dpaa2_mux_flow_create(uint32_t dpdmux_id, } break; + case RTE_FLOW_ITEM_TYPE_RAW: + { + const struct rte_flow_item_raw *spec; + + spec = (const struct rte_flow_item_raw *)pattern[0]->spec; + kg_cfg.extracts[0].extract.from_data.offset = spec->offset; + kg_cfg.extracts[0].extract.from_data.size = spec->length; + kg_cfg.extracts[0].type = DPKG_EXTRACT_FROM_DATA; + kg_cfg.num_extracts = 1; + memcpy((void *)key_iova, (const void *)spec->pattern, + spec->length); + memcpy(mask_iova, pattern[0]->mask, spec->length); + + key_size = spec->length; + } + break; + default: DPAA2_PMD_ERR("Not supported pattern type: %d", pattern[0]->type); @@ -166,20 +184,27 @@ rte_pmd_dpaa2_mux_flow_create(uint32_t dpdmux_id, goto creation_error; } - ret = dpdmux_set_custom_key(&dpdmux_dev->dpdmux, CMD_PRI_LOW, - dpdmux_dev->token, - (uint64_t)(DPAA2_VADDR_TO_IOVA(key_cfg_iova))); - if (ret) { - DPAA2_PMD_ERR("dpdmux_set_custom_key failed: err(%d)", ret); - goto creation_error; + /* Multiple rules with same DPKG extracts (kg_cfg.extracts) like same + * offset and length values in raw is supported right now. Different + * values of kg_cfg may not work. + */ + if (i == 0) { + ret = dpdmux_set_custom_key(&dpdmux_dev->dpdmux, CMD_PRI_LOW, + dpdmux_dev->token, + (uint64_t)(DPAA2_VADDR_TO_IOVA(key_cfg_iova))); + if (ret) { + DPAA2_PMD_ERR("dpdmux_set_custom_key failed: err(%d)", + ret); + goto creation_error; + } } - /* As now our key extract parameters are set, let us configure * the rule. */ flow->rule.key_iova = (uint64_t)(DPAA2_VADDR_TO_IOVA(key_iova)); flow->rule.mask_iova = (uint64_t)(DPAA2_VADDR_TO_IOVA(mask_iova)); flow->rule.key_size = key_size; + flow->rule.entry_index = i++; vf_conf = (const struct rte_flow_action_vf *)(actions[0]->conf); if (vf_conf->id == 0 || vf_conf->id > dpdmux_dev->num_ifs) { diff --git a/drivers/net/dpaa2/mc/dpdmux.c b/drivers/net/dpaa2/mc/dpdmux.c index 63f1ec7d30..67d37ed4cd 100644 --- a/drivers/net/dpaa2/mc/dpdmux.c +++ b/drivers/net/dpaa2/mc/dpdmux.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) * * Copyright 2013-2016 Freescale Semiconductor Inc. - * Copyright 2018-2019 NXP + * Copyright 2018-2021 NXP * */ #include @@ -852,6 +852,7 @@ int dpdmux_add_custom_cls_entry(struct fsl_mc_io *mc_io, cmd_params = (struct dpdmux_cmd_add_custom_cls_entry *)cmd.params; cmd_params->key_size = rule->key_size; + cmd_params->entry_index = rule->entry_index; cmd_params->dest_if = cpu_to_le16(action->dest_if); cmd_params->key_iova = cpu_to_le64(rule->key_iova); cmd_params->mask_iova = cpu_to_le64(rule->mask_iova); diff --git a/drivers/net/dpaa2/mc/fsl_dpdmux.h b/drivers/net/dpaa2/mc/fsl_dpdmux.h index accd1ef5c1..2f167ee00c 100644 --- a/drivers/net/dpaa2/mc/fsl_dpdmux.h +++ b/drivers/net/dpaa2/mc/fsl_dpdmux.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) * * Copyright 2013-2016 Freescale Semiconductor Inc. - * Copyright 2018-2019 NXP + * Copyright 2018-2021 NXP * */ #ifndef __FSL_DPDMUX_H @@ -367,15 +367,23 @@ int dpdmux_set_custom_key(struct fsl_mc_io *mc_io, * struct dpdmux_rule_cfg - Custom classification rule. * * @key_iova: DMA address of buffer storing the look-up value - * @mask_iova: DMA address of the mask used for TCAM classification + * @mask_iova: DMA address of the mask used for TCAM classification. This + * parameter is used only if dpdmux was created using option + * DPDMUX_OPT_CLS_MASK_SUPPORT. * @key_size: size, in bytes, of the look-up value. This must match the size * of the look-up key defined using dpdmux_set_custom_key, otherwise the * entry will never be hit + * @entry_index: rule index into the table. This parameter is used only when + * dpdmux object was created using option DPDMUX_OPT_CLS_MASK_SUPPORT. In + * this case the rule is masking and the current frame may be a hit for + * multiple rules. This parameter determines the order in which the rules + * will be checked (smaller entry_index first). */ struct dpdmux_rule_cfg { uint64_t key_iova; uint64_t mask_iova; uint8_t key_size; + uint16_t entry_index; }; /** diff --git a/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h b/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h index a60b2ebe3c..b6b8c38c41 100644 --- a/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h +++ b/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) * * Copyright 2013-2016 Freescale Semiconductor Inc. - * Copyright 2018-2019 NXP + * Copyright 2018-2021 NXP * */ #ifndef _FSL_DPDMUX_CMD_H @@ -204,7 +204,7 @@ struct dpdmux_set_custom_key { struct dpdmux_cmd_add_custom_cls_entry { uint8_t pad[3]; uint8_t key_size; - uint16_t pad1; + uint16_t entry_index; uint16_t dest_if; uint64_t key_iova; uint64_t mask_iova; -- 2.17.1