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 5F3EAA04FF; Wed, 27 Apr 2022 12:46:39 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F4037410DC; Wed, 27 Apr 2022 12:46:38 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mails.dpdk.org (Postfix) with ESMTP id 660D940E78 for ; Wed, 27 Apr 2022 12:46:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651056396; x=1682592396; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=KRXKbNgC9e4tG2e7feGsgkZpg0nz1KEnoDfyokHlWGk=; b=XVLavv8LThvGmsVnEzDVT5BlKDjbziCB631NnYGyg0ve8KbgvGIo6CCI +XpF5drqZebfHYApmZP8J36UFpt5pMTqPEjGLM/CJXCYzxzhvA0Mv5T+Y +4fY90tJpifuTBPiuDyFXT84IXXXTdTXRD0cWeBEctVjxfNaRwYz7ONxP tPUqmPftoFZV+AEy67sR8Xm4CV/eNWMV65eRAmK8uL35w1uM1ntC+96cI kIiDRONzWP+pY7LWguWwjUupSzv7qzKfGq11qBIwifodxA4u5wHBupa9R zKm/UtYaNcEafV8Hz9GjqFe/xfqdp3nFornzx9cooeReYIR36ekCsJOIU A==; X-IronPort-AV: E=McAfee;i="6400,9594,10329"; a="245811428" X-IronPort-AV: E=Sophos;i="5.90,292,1643702400"; d="scan'208";a="245811428" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Apr 2022 03:46:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,292,1643702400"; d="scan'208";a="617450474" Received: from fmsmsx604.amr.corp.intel.com ([10.18.126.84]) by fmsmga008.fm.intel.com with ESMTP; 27 Apr 2022 03:46:35 -0700 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.27; Wed, 27 Apr 2022 03:46:35 -0700 Received: from fmsmsx612.amr.corp.intel.com (10.18.126.92) by fmsmsx611.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.27; Wed, 27 Apr 2022 03:46:34 -0700 Received: from fmsmsx612.amr.corp.intel.com ([10.18.126.92]) by fmsmsx612.amr.corp.intel.com ([10.18.126.92]) with mapi id 15.01.2308.027; Wed, 27 Apr 2022 03:46:34 -0700 From: "Zhang, Qi Z" To: "Liu, KevinX" , "dev@dpdk.org" CC: "Yang, Qiming" , "Yang, SteveX" , Alvin Zhang Subject: RE: [PATCH v6 12/12] net/ice: support DCF new VLAN capabilities Thread-Topic: [PATCH v6 12/12] net/ice: support DCF new VLAN capabilities Thread-Index: AQHYWh+9tyWdqPBfFki4J2JwiREGAa0Dk5fQ Date: Wed, 27 Apr 2022 10:46:34 +0000 Message-ID: References: <20220421111403.1334288-1-kevinx.liu@intel.com> <20220427181301.1414196-1-kevinx.liu@intel.com> <20220427181301.1414196-13-kevinx.liu@intel.com> In-Reply-To: <20220427181301.1414196-13-kevinx.liu@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-reaction: no-action dlp-version: 11.6.401.20 dlp-product: dlpe-windows x-originating-ip: [10.239.127.36] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 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 > -----Original Message----- > From: Liu, KevinX > Sent: Thursday, April 28, 2022 2:13 AM > To: dev@dpdk.org > Cc: Yang, Qiming ; Zhang, Qi Z > ; Yang, SteveX ; Alvin Zhang > ; Liu, KevinX > Subject: [PATCH v6 12/12] net/ice: support DCF new VLAN capabilities >=20 > From: Alvin Zhang >=20 > The new VLAN virtchnl opcodes introduce new capabilities like VLAN filter= ing, > stripping and insertion. >=20 > The DCF needs to query the VLAN capabilities based on current device > configuration firstly. >=20 > DCF is able to configure inner VLAN filter when port VLAN is enabled base= on > negotiation; and DCF is able to configure outer VLAN (0x8100) if port VLA= N is > disabled to be compatible with legacy mode. >=20 > When port VLAN is updated by DCF, the DCF needs to reset to query the new > VLAN capabilities. >=20 > Signed-off-by: Alvin Zhang > Signed-off-by: Kevin Liu > --- > doc/guides/rel_notes/release_22_07.rst | 1 + > drivers/net/ice/ice_dcf.c | 27 ++++ > drivers/net/ice/ice_dcf.h | 1 + > drivers/net/ice/ice_dcf_ethdev.c | 171 ++++++++++++++++++++++--- > 4 files changed, 183 insertions(+), 17 deletions(-) >=20 > diff --git a/doc/guides/rel_notes/release_22_07.rst > b/doc/guides/rel_notes/release_22_07.rst > index 004a6d3343..7c932a7c8a 100644 > --- a/doc/guides/rel_notes/release_22_07.rst > +++ b/doc/guides/rel_notes/release_22_07.rst > @@ -73,6 +73,7 @@ New Features > * Added add extended stats. > * Added support queue information getting. > * Added implement power management. > + * Added support DCF new VLAN capabilities. This feature is not exposed to user, no need release note update. >=20 > Removed Items > ------------- > diff --git a/drivers/net/ice/ice_dcf.c b/drivers/net/ice/ice_dcf.c index > 55ae68c456..885d58c0f4 100644 > --- a/drivers/net/ice/ice_dcf.c > +++ b/drivers/net/ice/ice_dcf.c > @@ -587,6 +587,29 @@ ice_dcf_get_supported_rxdid(struct ice_dcf_hw *hw) > return 0; > } >=20 > +static int > +dcf_get_vlan_offload_caps_v2(struct ice_dcf_hw *hw) { > + struct virtchnl_vlan_caps vlan_v2_caps; > + struct dcf_virtchnl_cmd args; > + int ret; > + > + memset(&args, 0, sizeof(args)); > + args.v_op =3D VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS; > + args.rsp_msgbuf =3D (uint8_t *)&vlan_v2_caps; > + args.rsp_buflen =3D sizeof(vlan_v2_caps); > + > + ret =3D ice_dcf_execute_virtchnl_cmd(hw, &args); > + if (ret) { > + PMD_DRV_LOG(ERR, > + "Failed to execute command of > VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS"); > + return ret; > + } > + > + rte_memcpy(&hw->vlan_v2_caps, &vlan_v2_caps, > sizeof(vlan_v2_caps)); > + return 0; > +} > + > int > ice_dcf_init_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw) { @= @ - > 701,6 +724,10 @@ ice_dcf_init_hw(struct rte_eth_dev *eth_dev, struct > ice_dcf_hw *hw) > rte_intr_enable(pci_dev->intr_handle); > ice_dcf_enable_irq0(hw); >=20 > + if ((hw->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) > && > + dcf_get_vlan_offload_caps_v2(hw)) > + goto err_rss; > + > return 0; >=20 > err_rss: > diff --git a/drivers/net/ice/ice_dcf.h b/drivers/net/ice/ice_dcf.h index > 44a61404c3..7f42ebabe9 100644 > --- a/drivers/net/ice/ice_dcf.h > +++ b/drivers/net/ice/ice_dcf.h > @@ -129,6 +129,7 @@ struct ice_dcf_hw { > uint16_t nb_msix; > uint16_t rxq_map[16]; > struct virtchnl_eth_stats eth_stats_offset; > + struct virtchnl_vlan_caps vlan_v2_caps; >=20 > /* Link status */ > bool link_up; > diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_e= thdev.c > index 236c0395e0..8005eb2ab8 100644 > --- a/drivers/net/ice/ice_dcf_ethdev.c > +++ b/drivers/net/ice/ice_dcf_ethdev.c > @@ -1050,6 +1050,46 @@ dcf_dev_set_default_mac_addr(struct > rte_eth_dev *dev, > return 0; > } >=20 > +static int > +dcf_add_del_vlan_v2(struct ice_dcf_hw *hw, uint16_t vlanid, bool add) { > + struct virtchnl_vlan_supported_caps *supported_caps =3D > + &hw->vlan_v2_caps.filtering.filtering_support; > + struct virtchnl_vlan *vlan_setting; > + struct virtchnl_vlan_filter_list_v2 vlan_filter; > + struct dcf_virtchnl_cmd args; > + uint32_t filtering_caps; > + int err; > + > + if (supported_caps->outer) { > + filtering_caps =3D supported_caps->outer; > + vlan_setting =3D &vlan_filter.filters[0].outer; > + } else { > + filtering_caps =3D supported_caps->inner; > + vlan_setting =3D &vlan_filter.filters[0].inner; > + } > + > + if (!(filtering_caps & VIRTCHNL_VLAN_ETHERTYPE_8100)) > + return -ENOTSUP; > + > + memset(&vlan_filter, 0, sizeof(vlan_filter)); > + vlan_filter.vport_id =3D hw->vsi_res->vsi_id; > + vlan_filter.num_elements =3D 1; > + vlan_setting->tpid =3D RTE_ETHER_TYPE_VLAN; > + vlan_setting->tci =3D vlanid; > + > + memset(&args, 0, sizeof(args)); > + args.v_op =3D add ? VIRTCHNL_OP_ADD_VLAN_V2 : > VIRTCHNL_OP_DEL_VLAN_V2; > + args.req_msg =3D (uint8_t *)&vlan_filter; > + args.req_msglen =3D sizeof(vlan_filter); > + err =3D ice_dcf_execute_virtchnl_cmd(hw, &args); > + if (err) > + PMD_DRV_LOG(ERR, "fail to execute command %s", > + add ? "OP_ADD_VLAN_V2" : "OP_DEL_VLAN_V2"); > + > + return err; > +} > + > static int > dcf_add_del_vlan(struct ice_dcf_hw *hw, uint16_t vlanid, bool add) { @@= - > 1076,6 +1116,116 @@ dcf_add_del_vlan(struct ice_dcf_hw *hw, uint16_t > vlanid, bool add) > return err; > } >=20 > +static int > +dcf_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int > +on) { > + struct ice_dcf_adapter *adapter =3D dev->data->dev_private; > + struct ice_dcf_hw *hw =3D &adapter->real_hw; > + int err; > + > + if (hw->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) { > + err =3D dcf_add_del_vlan_v2(hw, vlan_id, on); > + if (err) > + return -EIO; > + return 0; > + } > + > + if (!(hw->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN)) > + return -ENOTSUP; > + > + err =3D dcf_add_del_vlan(hw, vlan_id, on); > + if (err) > + return -EIO; > + return 0; > +} > + > +static void > +dcf_iterate_vlan_filters_v2(struct rte_eth_dev *dev, bool enable) { > + struct rte_vlan_filter_conf *vfc =3D &dev->data->vlan_filter_conf; > + struct ice_dcf_adapter *adapter =3D dev->data->dev_private; > + struct ice_dcf_hw *hw =3D &adapter->real_hw; > + uint32_t i, j; > + uint64_t ids; > + > + for (i =3D 0; i < RTE_DIM(vfc->ids); i++) { > + if (vfc->ids[i] =3D=3D 0) > + continue; > + > + ids =3D vfc->ids[i]; > + for (j =3D 0; ids !=3D 0 && j < 64; j++, ids >>=3D 1) { > + if (ids & 1) > + dcf_add_del_vlan_v2(hw, 64 * i + j, enable); > + } > + } > +} > + > +static int > +dcf_config_vlan_strip_v2(struct ice_dcf_hw *hw, bool enable) { > + struct virtchnl_vlan_supported_caps *stripping_caps =3D > + &hw->vlan_v2_caps.offloads.stripping_support; > + struct virtchnl_vlan_setting vlan_strip; > + struct dcf_virtchnl_cmd args; > + uint32_t *ethertype; > + int ret; > + > + if ((stripping_caps->outer & VIRTCHNL_VLAN_ETHERTYPE_8100) && > + (stripping_caps->outer & VIRTCHNL_VLAN_TOGGLE)) > + ethertype =3D &vlan_strip.outer_ethertype_setting; > + else if ((stripping_caps->inner & VIRTCHNL_VLAN_ETHERTYPE_8100) > && > + (stripping_caps->inner & VIRTCHNL_VLAN_TOGGLE)) > + ethertype =3D &vlan_strip.inner_ethertype_setting; > + else > + return -ENOTSUP; > + > + memset(&vlan_strip, 0, sizeof(vlan_strip)); > + vlan_strip.vport_id =3D hw->vsi_res->vsi_id; > + *ethertype =3D VIRTCHNL_VLAN_ETHERTYPE_8100; > + > + memset(&args, 0, sizeof(args)); > + args.v_op =3D enable ? VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2 : > + VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2; > + args.req_msg =3D (uint8_t *)&vlan_strip; > + args.req_msglen =3D sizeof(vlan_strip); > + ret =3D ice_dcf_execute_virtchnl_cmd(hw, &args); > + if (ret) > + PMD_DRV_LOG(ERR, "fail to execute command %s", > + enable ? > "VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2" : > + > "VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2"); > + > + return ret; > +} > + > +static int > +dcf_dev_vlan_offload_set_v2(struct rte_eth_dev *dev, int mask) { > + struct rte_eth_rxmode *rxmode =3D &dev->data->dev_conf.rxmode; > + struct ice_dcf_adapter *adapter =3D dev->data->dev_private; > + struct ice_dcf_hw *hw =3D &adapter->real_hw; > + bool enable; > + int err; > + > + if (mask & RTE_ETH_VLAN_FILTER_MASK) { > + enable =3D !!(rxmode->offloads & > RTE_ETH_RX_OFFLOAD_VLAN_FILTER); > + > + dcf_iterate_vlan_filters_v2(dev, enable); > + } > + > + if (mask & RTE_ETH_VLAN_STRIP_MASK) { > + enable =3D !!(rxmode->offloads & > RTE_ETH_RX_OFFLOAD_VLAN_STRIP); > + > + err =3D dcf_config_vlan_strip_v2(hw, enable); > + /* If not support, the stripping is already disabled by PF */ > + if (err =3D=3D -ENOTSUP && !enable) > + err =3D 0; > + if (err) > + return -EIO; > + } > + > + return 0; > +} > + > static int > dcf_enable_vlan_strip(struct ice_dcf_hw *hw) { @@ -1108,30 +1258,17 @@ > dcf_disable_vlan_strip(struct ice_dcf_hw *hw) > return ret; > } >=20 > -static int > -dcf_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int o= n) -{ > - struct ice_dcf_adapter *adapter =3D dev->data->dev_private; > - struct ice_dcf_hw *hw =3D &adapter->real_hw; > - int err; > - > - if (!(hw->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN)) > - return -ENOTSUP; > - > - err =3D dcf_add_del_vlan(hw, vlan_id, on); > - if (err) > - return -EIO; > - return 0; > -} > - > static int > dcf_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) { > + struct rte_eth_conf *dev_conf =3D &dev->data->dev_conf; > struct ice_dcf_adapter *adapter =3D dev->data->dev_private; > struct ice_dcf_hw *hw =3D &adapter->real_hw; > - struct rte_eth_conf *dev_conf =3D &dev->data->dev_conf; > int err; >=20 > + if (hw->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) > + return dcf_dev_vlan_offload_set_v2(dev, mask); > + > if (!(hw->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN)) > return -ENOTSUP; >=20 > -- > 2.33.1