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 A8043A0564; Mon, 16 Mar 2020 05:53:05 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0EA252BF9; Mon, 16 Mar 2020 05:53:05 +0100 (CET) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 7F224CF3 for ; Mon, 16 Mar 2020 05:53:03 +0100 (CET) IronPort-SDR: pgZBIFmGTCQOOw/1G9n+mC+yUqupTzI7Y+Rw5F9kuqpeVbPicF7dWwt4vgLiM5D6fWvg/Fvkhi jfhsOVSs1mlA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Mar 2020 21:53:01 -0700 IronPort-SDR: JQZSOKwOIcLscBJq5EQ4OSaZ3x5dWJsfHpSzStPz/54vJIqNgT2Zis+k2UFCNU4VOSbfHEAkNw TaZpMOKU0dgQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,559,1574150400"; d="scan'208";a="323382730" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga001.jf.intel.com with ESMTP; 15 Mar 2020 21:52:58 -0700 Received: from shsmsx603.ccr.corp.intel.com (10.109.6.143) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sun, 15 Mar 2020 21:52:58 -0700 Received: from shsmsx603.ccr.corp.intel.com (10.109.6.143) by SHSMSX603.ccr.corp.intel.com (10.109.6.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Mon, 16 Mar 2020 12:52:55 +0800 Received: from shsmsx603.ccr.corp.intel.com ([10.109.6.143]) by SHSMSX603.ccr.corp.intel.com ([10.109.6.143]) with mapi id 15.01.1713.004; Mon, 16 Mar 2020 12:52:55 +0800 From: "Wang, Haiyue" To: "Ye, Xiaolong" CC: "dev@dpdk.org" , "Zhang, Qi Z" , "Yang, Qiming" , "Xing, Beilei" , "Zhao1, Wei" Thread-Topic: [PATCH v2 6/7] net/ice: handle the PF initialization by DCF Thread-Index: AQHV9qlWDm6OeMNETEaOBw+KJU8oq6hFp1mAgAUIfDA= Date: Mon, 16 Mar 2020 04:52:55 +0000 Message-ID: References: <20200309141437.11800-1-haiyue.wang@intel.com> <20200310065029.40966-1-haiyue.wang@intel.com> <20200310065029.40966-7-haiyue.wang@intel.com> <20200313075959.GA49768@intel.com> In-Reply-To: <20200313075959.GA49768@intel.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.2.0.6 x-originating-ip: [10.239.127.36] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v2 6/7] net/ice: handle the PF initialization by 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" > -----Original Message----- > From: Ye, Xiaolong > Sent: Friday, March 13, 2020 16:00 > To: Wang, Haiyue > Cc: dev@dpdk.org; Zhang, Qi Z ; Yang, Qiming ; Xing, > Beilei ; Zhao1, Wei > Subject: Re: [PATCH v2 6/7] net/ice: handle the PF initialization by DCF >=20 > On 03/10, Haiyue Wang wrote: > >The DCF (Device Config Function) works at the user PF level, it can't > >access the real PF hardware directly. So it will proxy the PF's AdminQ > >command through DCF's mailbox. > > > >And the DCF is mainly used to control the flow setting of other VFs, so > >it only needs to initialize some core functions about the flow . > > > >Signed-off-by: Haiyue Wang > >--- > > drivers/net/ice/Makefile | 1 + > > drivers/net/ice/ice_dcf.c | 7 +- > > drivers/net/ice/ice_dcf.h | 3 + > > drivers/net/ice/ice_dcf_ethdev.c | 10 +- > > drivers/net/ice/ice_dcf_ethdev.h | 11 +- > > drivers/net/ice/ice_dcf_parent.c | 263 +++++++++++++++++++++++++++++++ > > drivers/net/ice/meson.build | 3 +- > > 7 files changed, 292 insertions(+), 6 deletions(-) > > create mode 100644 drivers/net/ice/ice_dcf_parent.c > > > >diff --git a/drivers/net/ice/Makefile b/drivers/net/ice/Makefile > >index f493c9ed7..3ecc72219 100644 > >--- a/drivers/net/ice/Makefile > >+++ b/drivers/net/ice/Makefile > >@@ -88,6 +88,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) +=3D ice_generic_flo= w.c > > > > SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) +=3D ice_dcf.c > > SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) +=3D ice_dcf_ethdev.c > >+SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) +=3D ice_dcf_parent.c > > > > # install this header file > > SYMLINK-$(CONFIG_RTE_LIBRTE_ICE_PMD)-include :=3D rte_pmd_ice.h > >diff --git a/drivers/net/ice/ice_dcf.c b/drivers/net/ice/ice_dcf.c > >index 24ed31f35..480c449f5 100644 > >--- a/drivers/net/ice/ice_dcf.c > >+++ b/drivers/net/ice/ice_dcf.c > >@@ -124,8 +124,13 @@ ice_dcf_aq_cmd_handle(struct ice_dcf_hw *hw, struct= iavf_arq_event_info *info) > > } > > > > v_op =3D rte_le_to_cpu_32(info->desc.cookie_high); > >- if (unlikely(v_op =3D=3D VIRTCHNL_OP_EVENT)) > >+ if (unlikely(v_op =3D=3D VIRTCHNL_OP_EVENT)) { >=20 > Is this unlikely really needed? >=20 Looks like 'unlikely' a little abuse. Will remove it in v3 ;-0 > >+ if (hw->vc_event_msg_cb !=3D NULL) > >+ hw->vc_event_msg_cb(hw, > >+ info->msg_buf, > >+ info->msg_len); > > return; > >+ } > > > > v_ret =3D rte_le_to_cpu_32(info->desc.cookie_low); > > > >diff --git a/drivers/net/ice/ice_dcf.h b/drivers/net/ice/ice_dcf.h > >index 99bd53b02..ecd6303a0 100644 > >--- a/drivers/net/ice/ice_dcf.h > >+++ b/drivers/net/ice/ice_dcf.h > >@@ -36,6 +36,9 @@ struct ice_dcf_hw { > > rte_spinlock_t vc_cmd_send_lock; > > rte_spinlock_t vc_cmd_queue_lock; > > TAILQ_HEAD(, dcf_virtchnl_cmd) vc_cmd_queue; > >+ void (*vc_event_msg_cb)(struct ice_dcf_hw *dcf_hw, > >+ uint8_t *msg, uint16_t msglen); > >+ > > uint8_t *arq_buf; > > > > struct virtchnl_version_info virtchnl_version; > >diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_= ethdev.c > >index 23f82a487..af94caeff 100644 > >--- a/drivers/net/ice/ice_dcf_ethdev.c > >+++ b/drivers/net/ice/ice_dcf_ethdev.c > >@@ -145,8 +145,8 @@ ice_dcf_dev_close(struct rte_eth_dev *dev) > > dev->dev_ops =3D NULL; > > dev->rx_pkt_burst =3D NULL; > > dev->tx_pkt_burst =3D NULL; > >- dev->data->mac_addrs =3D NULL; > > > >+ ice_dcf_uninit_parent_adapter(dev); > > ice_dcf_uninit_hw(dev, &adapter->real_hw); > > } > > > >@@ -225,13 +225,17 @@ ice_dcf_dev_init(struct rte_eth_dev *eth_dev) > > > > eth_dev->data->dev_flags |=3D RTE_ETH_DEV_CLOSE_REMOVE; > > > >+ adapter->real_hw.vc_event_msg_cb =3D ice_dcf_handle_pf_event_msg; > > if (ice_dcf_init_hw(eth_dev, &adapter->real_hw) !=3D 0) { > > PMD_INIT_LOG(ERR, "Failed to init DCF hardware"); > > return -1; > > } > > > >- rte_eth_random_addr(adapter->mac_addr.addr_bytes); > >- eth_dev->data->mac_addrs =3D &adapter->mac_addr; > >+ if (ice_dcf_init_parent_adapter(eth_dev) !=3D 0) { > >+ PMD_INIT_LOG(ERR, "Failed to init DCF parent adapter"); > >+ ice_dcf_uninit_hw(eth_dev, &adapter->real_hw); > >+ return -1; > >+ } > > > > return 0; > > } > >diff --git a/drivers/net/ice/ice_dcf_ethdev.h b/drivers/net/ice/ice_dcf_= ethdev.h > >index 0c34a0095..e60e808d8 100644 > >--- a/drivers/net/ice/ice_dcf_ethdev.h > >+++ b/drivers/net/ice/ice_dcf_ethdev.h > >@@ -5,6 +5,9 @@ > > #ifndef _ICE_DCF_ETHDEV_H_ > > #define _ICE_DCF_ETHDEV_H_ > > > >+#include "base/ice_common.h" > >+#include "base/ice_adminq_cmd.h" > >+ > > #include "ice_ethdev.h" > > #include "ice_dcf.h" > > > >@@ -15,10 +18,16 @@ struct ice_dcf_queue { > > }; > > > > struct ice_dcf_adapter { > >+ struct ice_adapter parent; /* Must be first */ > >+ > > struct ice_dcf_hw real_hw; > >- struct rte_ether_addr mac_addr; >=20 > This one isn't needed at the first place. >=20 > > struct ice_dcf_queue rxqs[ICE_DCF_MAX_RINGS]; > > struct ice_dcf_queue txqs[ICE_DCF_MAX_RINGS]; > > }; > > > >+void ice_dcf_handle_pf_event_msg(struct ice_dcf_hw *dcf_hw, > >+ uint8_t *msg, uint16_t msglen); > >+int ice_dcf_init_parent_adapter(struct rte_eth_dev *eth_dev); > >+void ice_dcf_uninit_parent_adapter(struct rte_eth_dev *eth_dev); > >+ > > #endif /* _ICE_DCF_ETHDEV_H_ */ > >diff --git a/drivers/net/ice/ice_dcf_parent.c b/drivers/net/ice/ice_dcf_= parent.c > >new file mode 100644 > >index 000000000..4c3bb68b1 > >--- /dev/null > >+++ b/drivers/net/ice/ice_dcf_parent.c > >@@ -0,0 +1,263 @@ > >+/* SPDX-License-Identifier: BSD-3-Clause > >+ * Copyright(c) 2020 Intel Corporation > >+ */ > >+#include > >+#include > >+#include > >+ > >+#include "ice_dcf_ethdev.h" > >+ > >+void > >+ice_dcf_handle_pf_event_msg(__rte_unused struct ice_dcf_hw *dcf_hw, > >+ uint8_t *msg, uint16_t msglen) > >+{ > >+ struct virtchnl_pf_event *pf_msg =3D (struct virtchnl_pf_event *)msg; > >+ > >+ if (msglen < sizeof(struct virtchnl_pf_event)) { > >+ PMD_DRV_LOG(DEBUG, "Invalid event message length : %u", msglen); > >+ return; > >+ } > >+ > >+ switch (pf_msg->event) { > >+ case VIRTCHNL_EVENT_RESET_IMPENDING: > >+ PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_RESET_IMPENDING event"); > >+ break; > >+ case VIRTCHNL_EVENT_LINK_CHANGE: > >+ PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_LINK_CHANGE event"); > >+ break; > >+ case VIRTCHNL_EVENT_PF_DRIVER_CLOSE: > >+ PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_PF_DRIVER_CLOSE event"); > >+ break; > >+ default: > >+ PMD_DRV_LOG(ERR, "Unknown event received %u", pf_msg->event); > >+ break; > >+ } > >+} > >+ > >+static int > >+ice_dcf_init_parent_hw(struct ice_hw *hw) > >+{ > >+ struct ice_aqc_get_phy_caps_data *pcaps; > >+ enum ice_status status; > >+ > >+ status =3D ice_aq_get_fw_ver(hw, NULL); > >+ if (status) > >+ return status; > >+ > >+ status =3D ice_get_caps(hw); > >+ if (status) > >+ return status; > >+ > >+ hw->port_info =3D (struct ice_port_info *) > >+ ice_malloc(hw, sizeof(*hw->port_info)); > >+ if (!hw->port_info) > >+ return ICE_ERR_NO_MEMORY; > >+ > >+ /* set the back pointer to HW */ > >+ hw->port_info->hw =3D hw; > >+ > >+ /* Initialize port_info struct with switch configuration data */ > >+ status =3D ice_get_initial_sw_cfg(hw); > >+ if (status) > >+ goto err_unroll_alloc; > >+ > >+ pcaps =3D (struct ice_aqc_get_phy_caps_data *) > >+ ice_malloc(hw, sizeof(*pcaps)); > >+ if (!pcaps) { > >+ status =3D ICE_ERR_NO_MEMORY; > >+ goto err_unroll_alloc; > >+ } > >+ > >+ /* Initialize port_info struct with PHY capabilities */ > >+ status =3D ice_aq_get_phy_caps(hw->port_info, false, > >+ ICE_AQC_REPORT_TOPO_CAP, pcaps, NULL); > >+ ice_free(hw, pcaps); > >+ if (status) > >+ goto err_unroll_alloc; > >+ > >+ /* Initialize port_info struct with link information */ > >+ status =3D ice_aq_get_link_info(hw->port_info, false, NULL, NULL); > >+ if (status) > >+ goto err_unroll_alloc; > >+ > >+ status =3D ice_init_fltr_mgmt_struct(hw); > >+ if (status) > >+ goto err_unroll_alloc; > >+ > >+ status =3D ice_init_hw_tbls(hw); > >+ if (status) > >+ goto err_unroll_fltr_mgmt_struct; > >+ > >+ PMD_INIT_LOG(INFO, > >+ "firmware %d.%d.%d api %d.%d.%d build 0x%08x", > >+ hw->fw_maj_ver, hw->fw_min_ver, hw->fw_patch, > >+ hw->api_maj_ver, hw->api_min_ver, hw->api_patch, > >+ hw->fw_build); > >+ > >+ return ICE_SUCCESS; > >+ > >+err_unroll_fltr_mgmt_struct: > >+ ice_cleanup_fltr_mgmt_struct(hw); > >+err_unroll_alloc: > >+ ice_free(hw, hw->port_info); > >+ hw->port_info =3D NULL; > >+ > >+ return status; > >+} > >+ > >+static void ice_dcf_uninit_parent_hw(struct ice_hw *hw) > >+{ > >+ ice_cleanup_fltr_mgmt_struct(hw); > >+ > >+ ice_free_seg(hw); > >+ ice_free_hw_tbls(hw); > >+ > >+ ice_free(hw, hw->port_info); > >+ hw->port_info =3D NULL; > >+ > >+ ice_clear_all_vsi_ctx(hw); > >+} > >+ > >+static int > >+ice_dcf_request_pkg_name(struct ice_hw *hw, char *pkg_name) > >+{ > >+ struct ice_dcf_adapter *dcf_adapter =3D > >+ container_of(hw, struct ice_dcf_adapter, parent.hw); > >+ > >+ /* TODO: check with DSN firstly by iAVF */ > >+ PMD_INIT_LOG(DEBUG, > >+ "DCF VSI_ID =3D %u", > >+ dcf_adapter->real_hw.vsi_id); > >+ > >+ snprintf(pkg_name, > >+ ICE_MAX_PKG_FILENAME_SIZE, "%s", ICE_PKG_FILE_UPDATES); > >+ if (!access(pkg_name, 0)) > >+ return 0; > >+ > >+ snprintf(pkg_name, > >+ ICE_MAX_PKG_FILENAME_SIZE, "%s", ICE_PKG_FILE_DEFAULT); > >+ if (!access(pkg_name, 0)) > >+ return 0; > >+ > >+ return -1; > >+} > >+ > >+static int > >+ice_dcf_load_pkg(struct ice_hw *hw) > >+{ > >+ char pkg_name[ICE_MAX_PKG_FILENAME_SIZE]; > >+ uint8_t *pkg_buf; > >+ uint32_t buf_len; > >+ struct stat st; > >+ FILE *fp; > >+ int err; > >+ > >+ if (ice_dcf_request_pkg_name(hw, pkg_name)) { > >+ PMD_INIT_LOG(ERR, "failed to locate the package file"); >=20 > s/failed/Failed >=20 Fixed in v3. > >+ return -ENOENT; > >+ } > >+ > >+ PMD_INIT_LOG(DEBUG, "DDP package name: %s", pkg_name); > >+ > >+ err =3D stat(pkg_name, &st); > >+ if (err) { > >+ PMD_INIT_LOG(ERR, "failed to get file status"); >=20 > s/failed/Failed >=20 Fixed in v3. > >+ return err; > >+ } > >+ > >+ buf_len =3D st.st_size; > >+ pkg_buf =3D rte_malloc(NULL, buf_len, 0); > >+ if (!pkg_buf) { > >+ PMD_INIT_LOG(ERR, "failed to allocate buffer of size %u for package", > >+ buf_len); > >+ return -1; > >+ } > >+ > >+ fp =3D fopen(pkg_name, "rb"); > >+ if (!fp) { > >+ PMD_INIT_LOG(ERR, "failed to open file: %s", pkg_name); > >+ err =3D -1; > >+ goto ret; > >+ } > >+ > >+ err =3D fread(pkg_buf, buf_len, 1, fp); > >+ fclose(fp); > >+ if (err !=3D 1) { > >+ PMD_INIT_LOG(ERR, "failed to read package data"); > >+ err =3D -1; > >+ goto ret; > >+ } > >+ > >+ err =3D ice_copy_and_init_pkg(hw, pkg_buf, buf_len); > >+ if (err) > >+ PMD_INIT_LOG(ERR, "ice_copy_and_init_hw failed: %d", err); > >+ > >+ret: > >+ rte_free(pkg_buf); > >+ return err; > >+} > >+ > >+int > >+ice_dcf_init_parent_adapter(struct rte_eth_dev *eth_dev) > >+{ > >+ struct ice_dcf_adapter *adapter =3D eth_dev->data->dev_private; > >+ struct ice_adapter *parent_adapter =3D &adapter->parent; > >+ struct ice_hw *parent_hw =3D &parent_adapter->hw; > >+ struct ice_dcf_hw *hw =3D &adapter->real_hw; > >+ const struct rte_ether_addr *mac; > >+ int err; > >+ > >+ parent_adapter->eth_dev =3D eth_dev; > >+ parent_adapter->pf.adapter =3D parent_adapter; > >+ parent_adapter->pf.dev_data =3D eth_dev->data; > >+ parent_hw->back =3D parent_adapter; > >+ parent_hw->mac_type =3D ICE_MAC_GENERIC; > >+ parent_hw->vendor_id =3D ICE_INTEL_VENDOR_ID; > >+ > >+ ice_init_lock(&parent_hw->adminq.sq_lock); > >+ ice_init_lock(&parent_hw->adminq.rq_lock); > >+ parent_hw->aq_send_cmd_fn =3D ice_dcf_send_aq_cmd; > >+ parent_hw->aq_send_cmd_param =3D &adapter->real_hw; > >+ parent_hw->dcf_enabled =3D true; > >+ > >+ err =3D ice_dcf_init_parent_hw(parent_hw); > >+ if (err) { > >+ PMD_INIT_LOG(ERR, "failed to init the DCF parent hardware with error = %d", > >+ err); > >+ return err; > >+ } > >+ > >+ err =3D ice_dcf_load_pkg(parent_hw); > >+ if (err) { > >+ PMD_INIT_LOG(ERR, "failed to load package with error %d", > >+ err); > >+ goto uninit_hw; > >+ } > >+ parent_adapter->active_pkg_type =3D ice_load_pkg_type(parent_hw); > >+ > >+ mac =3D (const struct rte_ether_addr *)hw->avf.mac.addr; > >+ if (rte_is_valid_assigned_ether_addr(mac)) > >+ rte_ether_addr_copy(mac, &parent_adapter->pf.dev_addr); > >+ else > >+ rte_eth_random_addr(parent_adapter->pf.dev_addr.addr_bytes); > >+ > >+ eth_dev->data->mac_addrs =3D &parent_adapter->pf.dev_addr; > >+ > >+ return 0; > >+ > >+uninit_hw: > >+ ice_dcf_uninit_parent_hw(parent_hw); > >+ return err; > >+} > >+ > >+void > >+ice_dcf_uninit_parent_adapter(struct rte_eth_dev *eth_dev) > >+{ > >+ struct ice_dcf_adapter *adapter =3D eth_dev->data->dev_private; > >+ struct ice_adapter *parent_adapter =3D &adapter->parent; > >+ struct ice_hw *parent_hw =3D &parent_adapter->hw; > >+ > >+ eth_dev->data->mac_addrs =3D NULL; > >+ > >+ ice_dcf_uninit_parent_hw(parent_hw); > >+} > >diff --git a/drivers/net/ice/meson.build b/drivers/net/ice/meson.build > >index 0ba9668d1..7e9037f3b 100644 > >--- a/drivers/net/ice/meson.build > >+++ b/drivers/net/ice/meson.build > >@@ -38,6 +38,7 @@ if arch_subdir =3D=3D 'x86' > > endif > > > > sources +=3D files('ice_dcf.c', > >- 'ice_dcf_ethdev.c') > >+ 'ice_dcf_ethdev.c', > >+ 'ice_dcf_parent.c') > > > > install_headers('rte_pmd_ice.h') > >-- > >2.25.1 > >