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 E38A8A0562; Fri, 3 Apr 2020 07:07:33 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id BDE5A1BF54; Fri, 3 Apr 2020 07:07:33 +0200 (CEST) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id 549941BF31 for ; Fri, 3 Apr 2020 07:07:32 +0200 (CEST) IronPort-SDR: //Gt7i8rUktxBv32DWhHpuYx+1d86l7rb4BX5WUlksc27eLi0wd/BT7iXYlUx0kC8EDJN+6ls3 Avx2CRjBMeFg== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Apr 2020 22:07:31 -0700 IronPort-SDR: 8JnCwLUg3+UFRADrYkYsv1EYlnMPo/jxq5n2WqJScQfpNmgSS+xL9eeeDF4fdG37zv8/7HSX5p YwGBbTXhfaDw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,338,1580803200"; d="scan'208";a="451178751" Received: from unknown (HELO localhost.localdomain.bj.intel.com) ([172.16.182.123]) by fmsmga006.fm.intel.com with ESMTP; 02 Apr 2020 22:07:29 -0700 From: Wei Zhao To: dev@dpdk.org Cc: qi.z.zhang@intel.com, nannan.lu@intel.com, qi.fu@intel.com, yuan.peng@intel.com, Wei Zhao Date: Fri, 3 Apr 2020 12:45:57 +0800 Message-Id: <20200403044609.27512-2-wei.zhao1@intel.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20200403044609.27512-1-wei.zhao1@intel.com> References: <20200403024353.24681-1-wei.zhao1@intel.com> <20200403044609.27512-1-wei.zhao1@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v4 01/13] net/ice: enable switch flow on DCF 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" DCF on CVL is a control plane VF which take the responsibility to configure all the PF/global resources, this patch add support DCF on to program forward rule to direct packetS to VFs. Signed-off-by: Wei Zhao --- doc/guides/rel_notes/release_20_05.rst | 2 +- drivers/net/ice/ice_dcf_ethdev.c | 10 +++++-- drivers/net/ice/ice_dcf_parent.c | 8 ++++++ drivers/net/ice/ice_fdir_filter.c | 6 ++++ drivers/net/ice/ice_hash.c | 6 ++++ drivers/net/ice/ice_switch_filter.c | 39 +++++++++++++++++++++++++- 6 files changed, 67 insertions(+), 4 deletions(-) diff --git a/doc/guides/rel_notes/release_20_05.rst b/doc/guides/rel_notes/release_20_05.rst index 9bc647284..bde7e47fb 100644 --- a/doc/guides/rel_notes/release_20_05.rst +++ b/doc/guides/rel_notes/release_20_05.rst @@ -68,7 +68,7 @@ New Features Updated the Intel ice driver with new features and improvements, including: * Added support for DCF (Device Config Function) feature. - + * Added switch filter support for intel DCF. Removed Items ------------- diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c index af94caeff..e5ba1a61f 100644 --- a/drivers/net/ice/ice_dcf_ethdev.c +++ b/drivers/net/ice/ice_dcf_ethdev.c @@ -115,8 +115,8 @@ ice_dcf_dev_allmulticast_disable(__rte_unused struct rte_eth_dev *dev) static int ice_dcf_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, - __rte_unused enum rte_filter_op filter_op, - __rte_unused void *arg) + enum rte_filter_op filter_op, + void *arg) { int ret = 0; @@ -124,6 +124,12 @@ ice_dcf_dev_filter_ctrl(struct rte_eth_dev *dev, return -EINVAL; switch (filter_type) { + case RTE_ETH_FILTER_GENERIC: + if (filter_op != RTE_ETH_FILTER_GET) + return -EINVAL; + *(const void **)arg = &ice_flow_ops; + break; + default: PMD_DRV_LOG(WARNING, "Filter type (%d) not supported", filter_type); diff --git a/drivers/net/ice/ice_dcf_parent.c b/drivers/net/ice/ice_dcf_parent.c index ff08292a1..37f0e2be2 100644 --- a/drivers/net/ice/ice_dcf_parent.c +++ b/drivers/net/ice/ice_dcf_parent.c @@ -9,6 +9,7 @@ #include #include "ice_dcf_ethdev.h" +#include "ice_generic_flow.h" #define ICE_DCF_VSI_UPDATE_SERVICE_INTERVAL 100000 /* us */ static rte_spinlock_t vsi_update_lock = RTE_SPINLOCK_INITIALIZER; @@ -321,6 +322,12 @@ ice_dcf_init_parent_adapter(struct rte_eth_dev *eth_dev) } parent_adapter->active_pkg_type = ice_load_pkg_type(parent_hw); + err = ice_flow_init(parent_adapter); + if (err) { + PMD_INIT_LOG(ERR, "Failed to initialize flow"); + goto uninit_hw; + } + ice_dcf_update_vf_vsi_map(parent_hw, hw->num_vfs, hw->vf_vsi_map); mac = (const struct rte_ether_addr *)hw->avf.mac.addr; @@ -347,5 +354,6 @@ ice_dcf_uninit_parent_adapter(struct rte_eth_dev *eth_dev) eth_dev->data->mac_addrs = NULL; + ice_flow_uninit(parent_adapter); ice_dcf_uninit_parent_hw(parent_hw); } diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c index a082a13df..1a85d6cc1 100644 --- a/drivers/net/ice/ice_fdir_filter.c +++ b/drivers/net/ice/ice_fdir_filter.c @@ -1061,6 +1061,9 @@ ice_fdir_init(struct ice_adapter *ad) struct ice_flow_parser *parser; int ret; + if (ad->hw.dcf_enabled) + return 0; + ret = ice_fdir_setup(pf); if (ret) return ret; @@ -1081,6 +1084,9 @@ ice_fdir_uninit(struct ice_adapter *ad) struct ice_pf *pf = &ad->pf; struct ice_flow_parser *parser; + if (ad->hw.dcf_enabled) + return; + if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS) parser = &ice_fdir_parser_comms; else diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c index 0fdd4d68d..72c8ddc9a 100644 --- a/drivers/net/ice/ice_hash.c +++ b/drivers/net/ice/ice_hash.c @@ -243,6 +243,9 @@ ice_hash_init(struct ice_adapter *ad) { struct ice_flow_parser *parser = NULL; + if (ad->hw.dcf_enabled) + return 0; + if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT) parser = &ice_hash_parser_os; else if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS) @@ -565,6 +568,9 @@ ice_hash_destroy(struct ice_adapter *ad, static void ice_hash_uninit(struct ice_adapter *ad) { + if (ad->hw.dcf_enabled) + return; + if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT) ice_unregister_parser(&ice_hash_parser_os, ad); else if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS) diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c index 66dc158ef..4db8f1471 100644 --- a/drivers/net/ice/ice_switch_filter.c +++ b/drivers/net/ice/ice_switch_filter.c @@ -913,6 +913,39 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], return 0; } +static int +ice_switch_parse_dcf_action(const struct rte_flow_action *actions, + struct rte_flow_error *error, + struct ice_adv_rule_info *rule_info) +{ + const struct rte_flow_action_vf *act_vf; + const struct rte_flow_action *action; + enum rte_flow_action_type action_type; + + for (action = actions; action->type != + RTE_FLOW_ACTION_TYPE_END; action++) { + action_type = action->type; + switch (action_type) { + case RTE_FLOW_ACTION_TYPE_VF: + rule_info->sw_act.fltr_act = ICE_FWD_TO_VSI; + act_vf = action->conf; + rule_info->sw_act.vsi_handle = act_vf->id; + break; + default: + rte_flow_error_set(error, + EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, + actions, + "Invalid action type or queue number"); + return -rte_errno; + } + } + + rule_info->sw_act.src = rule_info->sw_act.vsi_handle; + rule_info->rx = 1; + rule_info->priority = 5; + + return 0; +} static int ice_switch_parse_action(struct ice_pf *pf, @@ -1081,7 +1114,11 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, goto error; } - ret = ice_switch_parse_action(pf, actions, error, &rule_info); + if (ad->hw.dcf_enabled) + ret = ice_switch_parse_dcf_action(actions, error, &rule_info); + else + ret = ice_switch_parse_action(pf, actions, error, &rule_info); + if (ret) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_HANDLE, NULL, -- 2.19.1