From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 97882A04DB; Tue, 11 Aug 2020 17:30:39 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A34D61C020; Tue, 11 Aug 2020 17:30:38 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 45CA6F04 for ; Tue, 11 Aug 2020 17:30:36 +0200 (CEST) IronPort-SDR: s6BfhlSqcSiM0gANpiW33Cs/72Pmu5goP+3fg74nnuHK+j0ZDTgXMWmG6vC+yZYCk8MxM2+1Ha dWAHW3jefOYw== X-IronPort-AV: E=McAfee;i="6000,8403,9710"; a="171796240" X-IronPort-AV: E=Sophos;i="5.76,300,1592895600"; d="scan'208";a="171796240" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Aug 2020 08:30:35 -0700 IronPort-SDR: 6jicOKbAAtYyXckPOqsdobCcK92q7fFRBc/WhmEPzL/e73JIbE+gXpEJpYW8g8IqaGxSyXfRZm YK2kZHKVsjGA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,300,1592895600"; d="scan'208";a="277591057" Received: from npg-dpdk-haiyue-3.sh.intel.com ([10.67.118.248]) by fmsmga008.fm.intel.com with ESMTP; 11 Aug 2020 08:30:34 -0700 From: Haiyue Wang To: dev@dpdk.org, qiming.yang@intel.com, qi.z.zhang@intel.com Cc: junfeng.guo@intel.com, Haiyue Wang Date: Tue, 11 Aug 2020 23:20:44 +0800 Message-Id: <20200811152044.462128-1-haiyue.wang@intel.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v1] net/ice: optimize the Rx metadata hardware check X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" Only check the hardware support when the user specifies the 'proto_xtr' feature. And not require all the types need to be support in hardware, so that if new protocol extraction type is introduced, just check it as needed. Also the ice Rx metadata can also support protocol offset metadata, not only the protocol fields, so optimize the check by opcode type. Signed-off-by: Haiyue Wang --- drivers/net/ice/ice_ethdev.c | 66 ++++++++++++++++++++++-------------- drivers/net/ice/ice_ethdev.h | 1 + 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index 8d435e889..d67390f29 100644 --- a/drivers/net/ice/ice_ethdev.c +++ b/drivers/net/ice/ice_ethdev.c @@ -47,6 +47,8 @@ struct proto_xtr_ol_flag { bool required; }; +static bool ice_proto_xtr_hw_support[PROTO_XTR_MAX]; + static struct proto_xtr_ol_flag ice_proto_xtr_ol_flag_params[] = { [PROTO_XTR_VLAN] = { .param = { .name = "ice_dynflag_proto_xtr_vlan" }, @@ -536,25 +538,36 @@ handle_proto_xtr_arg(__rte_unused const char *key, const char *value, return 0; } -static bool -ice_proto_xtr_support(struct ice_hw *hw) +static void +ice_check_proto_xtr_support(struct ice_hw *hw) { #define FLX_REG(val, fld, idx) \ (((val) & GLFLXP_RXDID_FLX_WRD_##idx##_##fld##_M) >> \ GLFLXP_RXDID_FLX_WRD_##idx##_##fld##_S) static struct { uint32_t rxdid; - uint16_t protid_0; - uint16_t protid_1; + uint8_t opcode; + uint8_t protid_0; + uint8_t protid_1; } xtr_sets[] = { - { ICE_RXDID_COMMS_AUX_VLAN, ICE_PROT_EVLAN_O, ICE_PROT_VLAN_O }, - { ICE_RXDID_COMMS_AUX_IPV4, ICE_PROT_IPV4_OF_OR_S, - ICE_PROT_IPV4_OF_OR_S }, - { ICE_RXDID_COMMS_AUX_IPV6, ICE_PROT_IPV6_OF_OR_S, - ICE_PROT_IPV6_OF_OR_S }, - { ICE_RXDID_COMMS_AUX_IPV6_FLOW, ICE_PROT_IPV6_OF_OR_S, - ICE_PROT_IPV6_OF_OR_S }, - { ICE_RXDID_COMMS_AUX_TCP, ICE_PROT_TCP_IL, ICE_PROT_ID_INVAL }, + [PROTO_XTR_VLAN] = { ICE_RXDID_COMMS_AUX_VLAN, + ICE_RX_OPC_EXTRACT, + ICE_PROT_EVLAN_O, ICE_PROT_VLAN_O}, + [PROTO_XTR_IPV4] = { ICE_RXDID_COMMS_AUX_IPV4, + ICE_RX_OPC_EXTRACT, + ICE_PROT_IPV4_OF_OR_S, + ICE_PROT_IPV4_OF_OR_S }, + [PROTO_XTR_IPV6] = { ICE_RXDID_COMMS_AUX_IPV6, + ICE_RX_OPC_EXTRACT, + ICE_PROT_IPV6_OF_OR_S, + ICE_PROT_IPV6_OF_OR_S }, + [PROTO_XTR_IPV6_FLOW] = { ICE_RXDID_COMMS_AUX_IPV6_FLOW, + ICE_RX_OPC_EXTRACT, + ICE_PROT_IPV6_OF_OR_S, + ICE_PROT_IPV6_OF_OR_S }, + [PROTO_XTR_TCP] = { ICE_RXDID_COMMS_AUX_TCP, + ICE_RX_OPC_EXTRACT, + ICE_PROT_TCP_IL, ICE_PROT_ID_INVAL }, }; uint32_t i; @@ -565,21 +578,19 @@ ice_proto_xtr_support(struct ice_hw *hw) if (xtr_sets[i].protid_0 != ICE_PROT_ID_INVAL) { v = ICE_READ_REG(hw, GLFLXP_RXDID_FLX_WRD_4(rxdid)); - if (FLX_REG(v, PROT_MDID, 4) != xtr_sets[i].protid_0 || - FLX_REG(v, RXDID_OPCODE, 4) != ICE_RX_OPC_EXTRACT) - return false; + if (FLX_REG(v, PROT_MDID, 4) == xtr_sets[i].protid_0 && + FLX_REG(v, RXDID_OPCODE, 4) == xtr_sets[i].opcode) + ice_proto_xtr_hw_support[i] = true; } if (xtr_sets[i].protid_1 != ICE_PROT_ID_INVAL) { v = ICE_READ_REG(hw, GLFLXP_RXDID_FLX_WRD_5(rxdid)); - if (FLX_REG(v, PROT_MDID, 5) != xtr_sets[i].protid_1 || - FLX_REG(v, RXDID_OPCODE, 5) != ICE_RX_OPC_EXTRACT) - return false; + if (FLX_REG(v, PROT_MDID, 5) == xtr_sets[i].protid_1 && + FLX_REG(v, RXDID_OPCODE, 5) == xtr_sets[i].opcode) + ice_proto_xtr_hw_support[i] = true; } } - - return true; } static int @@ -1416,11 +1427,6 @@ ice_init_proto_xtr(struct rte_eth_dev *dev) int offset; uint16_t i; - if (!ice_proto_xtr_support(hw)) { - PMD_DRV_LOG(NOTICE, "Protocol extraction is not supported"); - return; - } - pf->proto_xtr = rte_zmalloc(NULL, pf->lan_nb_qps, 0); if (unlikely(pf->proto_xtr == NULL)) { PMD_DRV_LOG(ERR, "No memory for setting up protocol extraction table"); @@ -1443,6 +1449,8 @@ ice_init_proto_xtr(struct rte_eth_dev *dev) if (likely(!proto_xtr_enable)) return; + ice_check_proto_xtr_support(hw); + offset = rte_mbuf_dynfield_register(&ice_proto_xtr_metadata_param); if (unlikely(offset == -1)) { PMD_DRV_LOG(ERR, @@ -1462,6 +1470,14 @@ ice_init_proto_xtr(struct rte_eth_dev *dev) if (!ol_flag->required) continue; + if (!ice_proto_xtr_hw_support[i]) { + PMD_DRV_LOG(ERR, + "Protocol extraction type %u is not supported in hardware", + i); + rte_net_ice_dynfield_proto_xtr_metadata_offs = -1; + break; + } + offset = rte_mbuf_dynflag_register(&ol_flag->param); if (unlikely(offset == -1)) { PMD_DRV_LOG(ERR, diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index 393dfeab1..06b9b8683 100644 --- a/drivers/net/ice/ice_ethdev.h +++ b/drivers/net/ice/ice_ethdev.h @@ -262,6 +262,7 @@ enum proto_xtr_type { PROTO_XTR_IPV6, PROTO_XTR_IPV6_FLOW, PROTO_XTR_TCP, + PROTO_XTR_MAX /* The last one */ }; enum ice_fdir_tunnel_type { -- 2.28.0