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 2AE28A09E9; Mon, 14 Dec 2020 08:23:17 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7304FC9AE; Mon, 14 Dec 2020 08:22:08 +0100 (CET) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id D6F56C872 for ; Mon, 14 Dec 2020 08:22:01 +0100 (CET) IronPort-SDR: H0eOfRyhrTF8dncXj7v4mGLSgzxxfrWXVNQTvryYDc0dMJESz6GmezRdK/AKFZeerSvws4Qhw5 iHKJYvwtpP7w== X-IronPort-AV: E=McAfee;i="6000,8403,9834"; a="174778606" X-IronPort-AV: E=Sophos;i="5.78,417,1599548400"; d="scan'208";a="174778606" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Dec 2020 23:21:57 -0800 IronPort-SDR: RW9Ki6JnlYvpAre6p2suIiQgv7sQxQsj+mRxtf+Tdi5PdULdD02NqvNXAqlap0IVDEDnXmWvEL j75QkC8Pukgw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,417,1599548400"; d="scan'208";a="367173534" Received: from npg-dpdk-haiyue-3.sh.intel.com ([10.67.118.190]) by orsmga008.jf.intel.com with ESMTP; 13 Dec 2020 23:21:54 -0800 From: Haiyue Wang To: dev@dpdk.org Cc: qiming.yang@intel.com, jingjing.wu@intel.com, qi.z.zhang@intel.com, Haiyue Wang , Beilei Xing Date: Mon, 14 Dec 2020 15:07:07 +0800 Message-Id: <20201214070707.98564-5-haiyue.wang@intel.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201214070707.98564-1-haiyue.wang@intel.com> References: <20201214070707.98564-1-haiyue.wang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v1 5/5] net/iavf: support new VLAN virtchnl opcodes 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" The new VLAN virtchnl opcodes introduce rich capabilities setting like outer/inner different TPIDs. Signed-off-by: Haiyue Wang --- drivers/net/iavf/iavf.h | 6 ++ drivers/net/iavf/iavf_ethdev.c | 46 +++++++++++ drivers/net/iavf/iavf_vchnl.c | 147 +++++++++++++++++++++++++++++++++ 3 files changed, 199 insertions(+) diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index 6d5912d8c..c57ad6175 100644 --- a/drivers/net/iavf/iavf.h +++ b/drivers/net/iavf/iavf.h @@ -132,6 +132,7 @@ struct iavf_info { struct virtchnl_version_info virtchnl_version; struct virtchnl_vf_resource *vf_res; /* VF resource */ struct virtchnl_vsi_resource *vsi_res; /* LAN VSI */ + struct virtchnl_vlan_caps vlan_v2_caps; uint64_t supported_rxdid; uint8_t *proto_xtr; /* proto xtr type for all queues */ volatile enum virtchnl_ops pend_cmd; /* pending command not finished */ @@ -288,7 +289,9 @@ int iavf_check_api_version(struct iavf_adapter *adapter); int iavf_get_vf_resource(struct iavf_adapter *adapter); void iavf_handle_virtchnl_msg(struct rte_eth_dev *dev); int iavf_enable_vlan_strip(struct iavf_adapter *adapter); +int iavf_enable_vlan_strip_v2(struct iavf_adapter *adapter); int iavf_disable_vlan_strip(struct iavf_adapter *adapter); +int iavf_disable_vlan_strip_v2(struct iavf_adapter *adapter); int iavf_switch_queue(struct iavf_adapter *adapter, uint16_t qid, bool rx, bool on); int iavf_switch_queue_lv(struct iavf_adapter *adapter, uint16_t qid, @@ -302,6 +305,7 @@ int iavf_configure_rss_key(struct iavf_adapter *adapter); int iavf_configure_queues(struct iavf_adapter *adapter, uint16_t num_queue_pairs, uint16_t index); int iavf_get_supported_rxdid(struct iavf_adapter *adapter); +int iavf_get_vlan_offload_caps_v2(struct iavf_adapter *adapter); int iavf_config_irq_map(struct iavf_adapter *adapter); int iavf_config_irq_map_lv(struct iavf_adapter *adapter, uint16_t num, uint16_t index); @@ -315,6 +319,8 @@ int iavf_config_promisc(struct iavf_adapter *adapter, bool enable_unicast, int iavf_add_del_eth_addr(struct iavf_adapter *adapter, struct rte_ether_addr *addr, bool add); int iavf_add_del_vlan(struct iavf_adapter *adapter, uint16_t vlanid, bool add); +int iavf_add_del_vlan_v2(struct iavf_adapter *adapter, uint16_t vlanid, + bool add); int iavf_fdir_add(struct iavf_adapter *adapter, struct iavf_fdir_conf *filter); int iavf_fdir_del(struct iavf_adapter *adapter, struct iavf_fdir_conf *filter); int iavf_fdir_check(struct iavf_adapter *adapter, diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 0fd06e4b4..4d946013c 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -384,6 +384,14 @@ iavf_dev_configure(struct rte_eth_dev *dev) vf->max_rss_qregion = IAVF_MAX_NUM_QUEUES_DFLT; } + /* Vlan stripping setting v2 */ + if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) { + if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP) + iavf_enable_vlan_strip_v2(ad); + else + iavf_disable_vlan_strip_v2(ad); + } + /* Vlan stripping setting */ if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN) { if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP) @@ -992,6 +1000,13 @@ iavf_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); int err; + if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) { + err = iavf_add_del_vlan_v2(adapter, vlan_id, on); + if (err) + return -EIO; + return 0; + } + if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN)) return -ENOTSUP; @@ -1001,6 +1016,27 @@ iavf_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) return 0; } +static int +iavf_dev_vlan_offload_set_v2(struct rte_eth_dev *dev, int mask) +{ + struct iavf_adapter *adapter = + IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); + struct rte_eth_conf *dev_conf = &dev->data->dev_conf; + int err; + + if (mask & ETH_VLAN_STRIP_MASK) { + if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP) + err = iavf_enable_vlan_strip_v2(adapter); + else + err = iavf_disable_vlan_strip_v2(adapter); + + if (err) + return -EIO; + } + + return 0; +} + static int iavf_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) { @@ -1010,6 +1046,9 @@ iavf_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) struct rte_eth_conf *dev_conf = &dev->data->dev_conf; int err; + if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) + return iavf_dev_vlan_offload_set_v2(dev, mask); + if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN)) return -ENOTSUP; @@ -1861,6 +1900,13 @@ iavf_init_vf(struct rte_eth_dev *dev) } } + if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) { + if (iavf_get_vlan_offload_caps_v2(adapter) != 0) { + PMD_INIT_LOG(ERR, "failed to do get VLAN offload v2 capabilities"); + goto err_rss; + } + } + iavf_init_proto_xtr(dev); return 0; diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index 3f949c9e3..6b571924f 100644 --- a/drivers/net/iavf/iavf_vchnl.c +++ b/drivers/net/iavf/iavf_vchnl.c @@ -174,6 +174,7 @@ iavf_execute_vf_cmd(struct iavf_adapter *adapter, struct iavf_cmd_info *args) case VIRTCHNL_OP_VERSION: case VIRTCHNL_OP_GET_VF_RESOURCES: case VIRTCHNL_OP_GET_SUPPORTED_RXDIDS: + case VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS: /* for init virtchnl ops, need to poll the response */ do { result = iavf_read_msg_from_pf(adapter, args->out_size, @@ -366,6 +367,45 @@ iavf_enable_vlan_strip(struct iavf_adapter *adapter) return ret; } +int +iavf_enable_vlan_strip_v2(struct iavf_adapter *adapter) +{ + struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); + struct virtchnl_vlan_offload_caps *offload_caps; + struct virtchnl_vlan_strip vlan_strip; + struct iavf_cmd_info args; + bool outer; + int ret; + + offload_caps = &vf->vlan_v2_caps.offloads; + if (offload_caps->outer_stripping & VIRTCHNL_VLAN_ETHERTYPE_8100) + outer = true; + else if (offload_caps->inner_stripping & VIRTCHNL_VLAN_ETHERTYPE_8100) + outer = false; + else + return -ENOTSUP; + + memset(&vlan_strip, 0, sizeof(vlan_strip)); + vlan_strip.vsi_id = vf->vsi_res->vsi_id; + if (outer) + vlan_strip.outer_ethertype_setting = + VIRTCHNL_VLAN_ETHERTYPE_8100; + else + vlan_strip.inner_ethertype_setting = + VIRTCHNL_VLAN_ETHERTYPE_8100; + + args.ops = VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2; + args.in_args = (uint8_t *)&vlan_strip; + args.in_args_size = sizeof(vlan_strip); + args.out_buffer = vf->aq_resp; + args.out_size = IAVF_AQ_BUF_SZ; + ret = iavf_execute_vf_cmd(adapter, &args); + if (ret) + PMD_DRV_LOG(ERR, "fail to execute command VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2"); + + return ret; +} + int iavf_disable_vlan_strip(struct iavf_adapter *adapter) { @@ -387,6 +427,45 @@ iavf_disable_vlan_strip(struct iavf_adapter *adapter) return ret; } +int +iavf_disable_vlan_strip_v2(struct iavf_adapter *adapter) +{ + struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); + struct virtchnl_vlan_offload_caps *offload_caps; + struct virtchnl_vlan_strip vlan_strip; + struct iavf_cmd_info args; + bool outer; + int ret; + + offload_caps = &vf->vlan_v2_caps.offloads; + if (offload_caps->outer_stripping & VIRTCHNL_VLAN_ETHERTYPE_8100) + outer = true; + else if (offload_caps->inner_stripping & VIRTCHNL_VLAN_ETHERTYPE_8100) + outer = false; + else + return -ENOTSUP; + + memset(&vlan_strip, 0, sizeof(vlan_strip)); + vlan_strip.vsi_id = vf->vsi_res->vsi_id; + if (outer) + vlan_strip.outer_ethertype_setting = + VIRTCHNL_VLAN_ETHERTYPE_8100; + else + vlan_strip.inner_ethertype_setting = + VIRTCHNL_VLAN_ETHERTYPE_8100; + + args.ops = VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2; + args.in_args = (uint8_t *)&vlan_strip; + args.in_args_size = sizeof(vlan_strip); + args.out_buffer = vf->aq_resp; + args.out_size = IAVF_AQ_BUF_SZ; + ret = iavf_execute_vf_cmd(adapter, &args); + if (ret) + PMD_DRV_LOG(ERR, "fail to execute command VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2"); + + return ret; +} + #define VIRTCHNL_VERSION_MAJOR_START 1 #define VIRTCHNL_VERSION_MINOR_START 1 @@ -459,6 +538,7 @@ iavf_get_vf_resource(struct iavf_adapter *adapter) VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF | VIRTCHNL_VF_OFFLOAD_REQ_QUEUES | VIRTCHNL_VF_OFFLOAD_CRC | + VIRTCHNL_VF_OFFLOAD_VLAN_V2 | VIRTCHNL_VF_LARGE_NUM_QPAIRS; args.in_args = (uint8_t *)∩︀ @@ -522,6 +602,31 @@ iavf_get_supported_rxdid(struct iavf_adapter *adapter) return 0; } +int +iavf_get_vlan_offload_caps_v2(struct iavf_adapter *adapter) +{ + struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); + struct iavf_cmd_info args; + int ret; + + args.ops = VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS; + args.in_args = NULL; + args.in_args_size = 0; + args.out_buffer = vf->aq_resp; + args.out_size = IAVF_AQ_BUF_SZ; + + ret = iavf_execute_vf_cmd(adapter, &args); + if (ret) { + PMD_DRV_LOG(ERR, + "Failed to execute command of VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS"); + return ret; + } + + rte_memcpy(&vf->vlan_v2_caps, vf->aq_resp, sizeof(vf->vlan_v2_caps)); + + return 0; +} + int iavf_enable_queues(struct iavf_adapter *adapter) { @@ -1165,6 +1270,48 @@ iavf_add_del_vlan(struct iavf_adapter *adapter, uint16_t vlanid, bool add) return err; } +int +iavf_add_del_vlan_v2(struct iavf_adapter *adapter, uint16_t vlanid, bool add) +{ + struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); + struct virtchnl_vlan_filtering_caps *filtering_caps; + struct virtchnl_vlan_filter_list_v2 vlan_list; + struct iavf_cmd_info args; + bool outer; + int err; + + filtering_caps = &vf->vlan_v2_caps.filtering; + if (filtering_caps->outer & VIRTCHNL_VLAN_ETHERTYPE_8100) + outer = true; + else if (filtering_caps->inner & VIRTCHNL_VLAN_ETHERTYPE_8100) + outer = false; + else + return -ENOTSUP; + + memset(&vlan_list, 0, sizeof(vlan_list)); + vlan_list.num_elements = 1; + + if (outer) { + vlan_list.filters[0].outer.tci = vlanid; + vlan_list.filters[0].outer.tpid = RTE_ETHER_TYPE_VLAN; + } else { + vlan_list.filters[0].inner.tci = vlanid; + vlan_list.filters[0].inner.tpid = RTE_ETHER_TYPE_VLAN; + } + + args.ops = add ? VIRTCHNL_OP_ADD_VLAN_V2 : VIRTCHNL_OP_DEL_VLAN_V2; + args.in_args = (uint8_t *)&vlan_list; + args.in_args_size = sizeof(vlan_list); + args.out_buffer = vf->aq_resp; + args.out_size = IAVF_AQ_BUF_SZ; + err = iavf_execute_vf_cmd(adapter, &args); + if (err) + PMD_DRV_LOG(ERR, "fail to execute command %s", + add ? "OP_ADD_VLAN_V2" : "OP_DEL_VLAN_V2"); + + return err; +} + int iavf_fdir_add(struct iavf_adapter *adapter, struct iavf_fdir_conf *filter) -- 2.29.2