From patchwork Mon Aug 26 10:50:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zhang X-Patchwork-Id: 57900 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9749D1BFDD; Mon, 26 Aug 2019 12:48:38 +0200 (CEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 49B321BFB6 for ; Mon, 26 Aug 2019 12:48:33 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Aug 2019 03:48:32 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,431,1559545200"; d="scan'208";a="182402071" Received: from dpdk51.sh.intel.com ([10.67.110.245]) by orsmga003.jf.intel.com with ESMTP; 26 Aug 2019 03:48:31 -0700 From: Qi Zhang To: wenzhuo.lu@intel.com, qiming.yang@intel.com Cc: dev@dpdk.org, xiaolong.ye@intel.com, Qi Zhang , Junfeng Guo , Haiyue Wang , Paul M Stillwell Jr Date: Mon, 26 Aug 2019 18:50:06 +0800 Message-Id: <20190826105105.19121-5-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20190826105105.19121-1-qi.z.zhang@intel.com> References: <20190826105105.19121-1-qi.z.zhang@intel.com> Subject: [dpdk-dev] [PATCH 04/63] net/ice/base: add support to init RXDID descs fields 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" Add new switch cases to init RXDID descs MD fields. Signed-off-by: Junfeng Guo Signed-off-by: Haiyue Wang Signed-off-by: Paul M Stillwell Jr Signed-off-by: Qi Zhang --- drivers/net/ice/base/ice_common.c | 91 ++++++++++++++++++++++++++++++++++++ drivers/net/ice/base/ice_lan_tx_rx.h | 6 +++ 2 files changed, 97 insertions(+) diff --git a/drivers/net/ice/base/ice_common.c b/drivers/net/ice/base/ice_common.c index 4968808fa..58dd01ea1 100644 --- a/drivers/net/ice/base/ice_common.c +++ b/drivers/net/ice/base/ice_common.c @@ -19,6 +19,16 @@ (((mdid) << GLFLXP_RXDID_FLX_WRD_##idx##_PROT_MDID_S) & \ GLFLXP_RXDID_FLX_WRD_##idx##_PROT_MDID_M)) +#define ICE_PROG_FLEX_ENTRY_EXTRACT(hw, rxdid, protid, off, idx) \ + wr32((hw), GLFLXP_RXDID_FLX_WRD_##idx(rxdid), \ + ((ICE_RX_OPC_EXTRACT << \ + GLFLXP_RXDID_FLX_WRD_##idx##_RXDID_OPCODE_S) & \ + GLFLXP_RXDID_FLX_WRD_##idx##_RXDID_OPCODE_M) | \ + (((protid) << GLFLXP_RXDID_FLX_WRD_##idx##_PROT_MDID_S) & \ + GLFLXP_RXDID_FLX_WRD_##idx##_PROT_MDID_M) | \ + (((off) << GLFLXP_RXDID_FLX_WRD_##idx##_EXTRACTION_OFFSET_S) & \ + GLFLXP_RXDID_FLX_WRD_##idx##_EXTRACTION_OFFSET_M)) + #define ICE_PROG_FLG_ENTRY(hw, rxdid, flg_0, flg_1, flg_2, flg_3, idx) \ wr32((hw), GLFLXP_RXDID_FLAGS(rxdid, idx), \ (((flg_0) << GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_S) & \ @@ -412,6 +422,8 @@ static void ice_init_flex_flags(struct ice_hw *hw, enum ice_rxdid prof_id) */ static void ice_init_flex_flds(struct ice_hw *hw, enum ice_rxdid prof_id) { + enum ice_prot_id protid_0, protid_1; + u16 offset_0, offset_1; enum ice_flex_mdid mdid; switch (prof_id) { @@ -428,7 +440,80 @@ static void ice_init_flex_flds(struct ice_hw *hw, enum ice_rxdid prof_id) ice_init_flex_flags(hw, prof_id); break; + case ICE_RXDID_COMMS_GENERIC: + case ICE_RXDID_COMMS_AUX_VLAN: + case ICE_RXDID_COMMS_AUX_IPV4: + case ICE_RXDID_COMMS_AUX_IPV6: + case ICE_RXDID_COMMS_AUX_IPV6_FLOW: + case ICE_RXDID_COMMS_AUX_TCP: + ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_MDID_RX_HASH_LOW, 0); + ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_MDID_RX_HASH_HIGH, 1); + ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_MDID_FLOW_ID_LOWER, 2); + ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_MDID_FLOW_ID_HIGH, 3); + + if (prof_id == ICE_RXDID_COMMS_AUX_VLAN) { + /* FlexiMD.4: VLAN1 - single or EVLAN (first for QinQ). + * FlexiMD.5: VLAN2 - C-VLAN (second for QinQ). + */ + protid_0 = ICE_PROT_EVLAN_O; + offset_0 = 0; + protid_1 = ICE_PROT_VLAN_O; + offset_1 = 0; + } else if (prof_id == ICE_RXDID_COMMS_AUX_IPV4) { + /* FlexiMD.4: IPHDR1 - IPv4 header word 4, "TTL" and + * "Protocol" fields. + * FlexiMD.5: IPHDR0 - IPv4 header word 0, "Ver", + * "Hdr Len" and "Type of Service" fields. + */ + protid_0 = ICE_PROT_IPV4_OF_OR_S; + offset_0 = 8; + protid_1 = ICE_PROT_IPV4_OF_OR_S; + offset_1 = 0; + } else if (prof_id == ICE_RXDID_COMMS_AUX_IPV6) { + /* FlexiMD.4: IPHDR1 - IPv6 header word 3, + * "Next Header" and "Hop Limit" fields. + * FlexiMD.5: IPHDR0 - IPv6 header word 0, + * "Ver", "Traffic class" and high 4 bits of + * "Flow Label" fields. + */ + protid_0 = ICE_PROT_IPV6_OF_OR_S; + offset_0 = 6; + protid_1 = ICE_PROT_IPV6_OF_OR_S; + offset_1 = 0; + } else if (prof_id == ICE_RXDID_COMMS_AUX_IPV6_FLOW) { + /* FlexiMD.4: IPHDR1 - IPv6 header word 1, + * 16 low bits of the "Flow Label" field. + * FlexiMD.5: IPHDR0 - IPv6 header word 0, + * "Ver", "Traffic class" and high 4 bits + * of "Flow Label" fields. + */ + protid_0 = ICE_PROT_IPV6_OF_OR_S; + offset_0 = 2; + protid_1 = ICE_PROT_IPV6_OF_OR_S; + offset_1 = 0; + } else if (prof_id == ICE_RXDID_COMMS_AUX_TCP) { + /* FlexiMD.4: TCPHDR - TCP header word 6, + * "Data Offset" and "Flags" fields. + * FlexiMD.5: Reserved + */ + protid_0 = ICE_PROT_TCP_IL; + offset_0 = 12; + protid_1 = ICE_PROT_ID_INVAL; + offset_1 = 0; + } else { + protid_0 = ICE_PROT_ID_INVAL; + offset_0 = 0; + protid_1 = ICE_PROT_ID_INVAL; + offset_1 = 0; + } + ICE_PROG_FLEX_ENTRY_EXTRACT(hw, prof_id, + protid_0, offset_0, 4); + ICE_PROG_FLEX_ENTRY_EXTRACT(hw, prof_id, + protid_1, offset_1, 5); + + ice_init_flex_flags(hw, prof_id); + break; default: ice_debug(hw, ICE_DBG_INIT, "Field init for profile ID %d not supported\n", @@ -1001,6 +1086,12 @@ enum ice_status ice_init_hw(struct ice_hw *hw) ice_init_flex_flds(hw, ICE_RXDID_FLEX_NIC); ice_init_flex_flds(hw, ICE_RXDID_FLEX_NIC_2); + ice_init_flex_flds(hw, ICE_RXDID_COMMS_GENERIC); + ice_init_flex_flds(hw, ICE_RXDID_COMMS_AUX_VLAN); + ice_init_flex_flds(hw, ICE_RXDID_COMMS_AUX_IPV4); + ice_init_flex_flds(hw, ICE_RXDID_COMMS_AUX_IPV6); + ice_init_flex_flds(hw, ICE_RXDID_COMMS_AUX_IPV6_FLOW); + ice_init_flex_flds(hw, ICE_RXDID_COMMS_AUX_TCP); /* Obtain counter base index which would be used by flow director */ status = ice_alloc_fd_res_cntr(hw, &hw->fd_ctr_base); if (status) diff --git a/drivers/net/ice/base/ice_lan_tx_rx.h b/drivers/net/ice/base/ice_lan_tx_rx.h index 02c54e818..2cba6bc1e 100644 --- a/drivers/net/ice/base/ice_lan_tx_rx.h +++ b/drivers/net/ice/base/ice_lan_tx_rx.h @@ -606,6 +606,12 @@ enum ice_rxdid { ICE_RXDID_FLEX_NIC = 2, ICE_RXDID_FLEX_NIC_2 = 6, ICE_RXDID_HW = 7, + ICE_RXDID_COMMS_GENERIC = 16, + ICE_RXDID_COMMS_AUX_VLAN = 17, + ICE_RXDID_COMMS_AUX_IPV4 = 18, + ICE_RXDID_COMMS_AUX_IPV6 = 19, + ICE_RXDID_COMMS_AUX_IPV6_FLOW = 20, + ICE_RXDID_COMMS_AUX_TCP = 21, ICE_RXDID_LAST = 63, };