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 A1DE1A2EDB for ; Fri, 6 Sep 2019 16:19:01 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 82DCD1F35E; Fri, 6 Sep 2019 16:19:00 +0200 (CEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 0BF521F35D for ; Fri, 6 Sep 2019 16:18:58 +0200 (CEST) X-Amp-Result: UNSCANNABLE X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Sep 2019 07:18:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,473,1559545200"; d="scan'208";a="184550313" Received: from yexl-server.sh.intel.com (HELO localhost) ([10.67.117.5]) by fmsmga007.fm.intel.com with ESMTP; 06 Sep 2019 07:18:56 -0700 Date: Fri, 6 Sep 2019 22:16:55 +0800 From: Ye Xiaolong To: Ting Xu Cc: dev@dpdk.org, qi.z.zhang@intel.com Message-ID: <20190906141655.GP70700@intel.com> References: <6c47d7e03e43713756e746b3c459798283b13993.1567694027.git.ting.xu@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6c47d7e03e43713756e746b3c459798283b13993.1567694027.git.ting.xu@intel.com> User-Agent: Mutt/1.9.4 (2018-02-28) Subject: Re: [dpdk-dev] [PATCH v5] net/ice: support device-specific DDP package loading 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" On 09/06, Ting Xu wrote: >This patch adds the feature that supports loading DDP package >according to the device serial number. Prior to loading the >default DDP package (ice.pkg), the driver will check for the >presence of a device-specific DDP package with the name containing >64-bit PCIe Device Serial Number (ice-xxxxxxxxxxxxxxxx.pkg) >during initialization. Users can use "lspci -vs" to get the device >serial number. >The pkg search path are /lib/firmware/updates/intel/ice/ddp/ >and /lib/firmware/intel/ice/ddp/. If the package exists, >the driver will download it to the device instead of the default >one. The loaded package type (OS default and COMMS) will be >stored in ice_adapter->active_pkg_type. The package version is >stored in ice_hw->active_pkg_ver. > >Signed-off-by: Ting Xu > >--- >v5: optimize the operation when dsn is not found. >v4: correct the commit message format. >v3: fix compile error; modify to change the pkg loading order. >v2: modify codes according to the comments. >--- > drivers/net/ice/ice_ethdev.c | 136 ++++++++++++++++++++++++++++++++++- > drivers/net/ice/ice_ethdev.h | 8 +++ > 2 files changed, 142 insertions(+), 2 deletions(-) > >diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c >index 686d6f00f..2de3b6450 100644 >--- a/drivers/net/ice/ice_ethdev.c >+++ b/drivers/net/ice/ice_ethdev.c >@@ -28,7 +28,16 @@ static const char * const ice_valid_args[] = { > }; > > #define ICE_DFLT_OUTER_TAG_TYPE ICE_AQ_VSI_OUTER_TAG_VLAN_9100 >-#define ICE_DFLT_PKG_FILE "/lib/firmware/intel/ice/ddp/ice.pkg" >+ >+/* DDP package search path */ >+#define ICE_PKG_FILE_DEFAULT "/lib/firmware/intel/ice/ddp/ice.pkg" >+#define ICE_PKG_FILE_UPDATES "/lib/firmware/updates/intel/ice/ddp/ice.pkg" >+#define ICE_PKG_FILE_SEARCH_PATH_DEFAULT "/lib/firmware/intel/ice/ddp/" >+#define ICE_PKG_FILE_SEARCH_PATH_UPDATES "/lib/firmware/updates/intel/ice/ddp/" >+ >+#define ICE_OS_DEFAULT_PKG_NAME "ICE OS Default Package" >+#define ICE_COMMS_PKG_NAME "ICE COMMS Package" >+#define ICE_MAX_PKG_FILENAME_SIZE 256 > > int ice_logtype_init; > int ice_logtype_driver; >@@ -1265,15 +1274,134 @@ ice_pf_setup(struct ice_pf *pf) > return 0; > } > >+/* PCIe configuration space setting */ >+#define PCI_CFG_SPACE_SIZE 256 >+#define PCI_CFG_SPACE_EXP_SIZE 4096 >+#define PCI_EXT_CAP_ID(header) (int)((header) & 0x0000ffff) >+#define PCI_EXT_CAP_NEXT(header) (((header) >> 20) & 0xffc) >+#define PCI_EXT_CAP_ID_DSN 0x03 >+ >+static int >+ice_pci_find_next_ext_capability(struct rte_pci_device *dev, int cap) >+{ >+ uint32_t header; >+ int ttl; >+ int pos = PCI_CFG_SPACE_SIZE; >+ >+ /* minimum 8 bytes per capability */ >+ ttl = (PCI_CFG_SPACE_EXP_SIZE - PCI_CFG_SPACE_SIZE) / 8; >+ >+ if (rte_pci_read_config(dev, &header, 4, pos) < 0) { >+ PMD_INIT_LOG(ERR, "ice error reading extended capabilities\n"); >+ return -1; >+ } >+ >+ /* >+ * If we have no capabilities, this is indicated by cap ID, >+ * cap version and next pointer all being 0. >+ */ >+ if (header == 0) >+ return 0; >+ >+ while (ttl-- > 0) { >+ if (PCI_EXT_CAP_ID(header) == cap) >+ return pos; >+ >+ pos = PCI_EXT_CAP_NEXT(header); >+ >+ if (pos < PCI_CFG_SPACE_SIZE) >+ break; >+ >+ if (rte_pci_read_config(dev, &header, 4, pos) < 0) { >+ PMD_INIT_LOG(ERR, "ice error reading extended capabilities\n"); >+ return -1; >+ } >+ } >+ >+ return 0; >+} >+ >+/* Extract device serial number from PCIe Configuration Space and >+ * determine the pkg file path according to the DSN. >+ */ DPDK prefers multi-line comments format like: /* * Multi-line comments look like this. Make them real sentences. Fill * them so they look like real paragraphs. */ >+static int >+ice_pkg_file_search_path(struct rte_pci_device *pci_dev, char *pkg_file) >+{ >+ int pos; >+ char opt_ddp_filename[ICE_MAX_PKG_FILENAME_SIZE]; >+ uint32_t dword; >+ uint32_t dsn_low, dsn_high; >+ memset(opt_ddp_filename, 0, ICE_MAX_PKG_FILENAME_SIZE); >+ >+ pos = ice_pci_find_next_ext_capability(pci_dev, PCI_EXT_CAP_ID_DSN); >+ >+ if (pos) { >+ rte_pci_read_config(pci_dev, &dword, 4, pos + 4); >+ dsn_low = dword; >+ rte_pci_read_config(pci_dev, &dword, 4, pos + 8); >+ dsn_high = dword; >+ snprintf(opt_ddp_filename, ICE_MAX_PKG_FILENAME_SIZE, >+ "ice-%08x%08x.pkg", dsn_high, dsn_low); >+ } else { >+ PMD_INIT_LOG(INFO, "Failed to read device serial number\n"); >+ goto fail_dsn; >+ } >+ >+ strncpy(pkg_file, ICE_PKG_FILE_SEARCH_PATH_UPDATES, >+ ICE_MAX_PKG_FILENAME_SIZE); >+ if (!access(strcat(pkg_file, opt_ddp_filename), 0)) >+ return 0; >+ >+ strncpy(pkg_file, ICE_PKG_FILE_SEARCH_PATH_DEFAULT, >+ ICE_MAX_PKG_FILENAME_SIZE); >+ if (!access(strcat(pkg_file, opt_ddp_filename), 0)) >+ return 0; >+ >+fail_dsn: >+ strncpy(pkg_file, ICE_PKG_FILE_UPDATES, ICE_MAX_PKG_FILENAME_SIZE); >+ if (!access(pkg_file, 0)) >+ return 0; >+ strncpy(pkg_file, ICE_PKG_FILE_DEFAULT, ICE_MAX_PKG_FILENAME_SIZE); >+ return 0; >+} >+ >+static enum ice_pkg_type >+ice_get_pkg_type(struct ice_hw *hw) >+{ >+ enum ice_pkg_type package_type; >+ >+ /* store the activated package type (OS default or Comms) */ >+ if (!strncmp((char *)hw->active_pkg_name, ICE_OS_DEFAULT_PKG_NAME, >+ ICE_PKG_NAME_SIZE)) >+ package_type = ICE_PKG_TYPE_OS_DEFAULT; >+ else if (!strncmp((char *)hw->active_pkg_name, ICE_COMMS_PKG_NAME, >+ ICE_PKG_NAME_SIZE)) >+ package_type = ICE_PKG_TYPE_COMMS; >+ else >+ package_type = ICE_PKG_TYPE_UNKNOWN; >+ >+ PMD_INIT_LOG(INFO, "Active package is: %d.%d.%d.%d, %s\n", >+ hw->active_pkg_ver.major, hw->active_pkg_ver.minor, >+ hw->active_pkg_ver.update, hw->active_pkg_ver.draft, >+ hw->active_pkg_name); >+ >+ return package_type; >+} >+ > static int ice_load_pkg(struct rte_eth_dev *dev) > { > struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private); >- const char *pkg_file = ICE_DFLT_PKG_FILE; >+ char pkg_file[ICE_MAX_PKG_FILENAME_SIZE]; > int err; > uint8_t *buf; > int buf_len; > FILE *file; > struct stat fstat; >+ struct rte_pci_device *pci_dev = RTE_DEV_TO_PCI(dev->device); >+ struct ice_adapter *ad = >+ ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); >+ >+ ice_pkg_file_search_path(pci_dev, pkg_file); > > file = fopen(pkg_file, "rb"); > if (!file) { >@@ -1313,6 +1441,10 @@ static int ice_load_pkg(struct rte_eth_dev *dev) > PMD_INIT_LOG(ERR, "ice_copy_and_init_hw failed: %d\n", err); > goto fail_exit; > } >+ >+ /* store the loaded pkg type info */ >+ ad->active_pkg_type = ice_get_pkg_type(hw); >+ > err = ice_init_hw_tbls(hw); > if (err) { > PMD_INIT_LOG(ERR, "ice_init_hw_tbls failed: %d\n", err); >diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h >index 5063960a8..d1d07641d 100644 >--- a/drivers/net/ice/ice_ethdev.h >+++ b/drivers/net/ice/ice_ethdev.h >@@ -124,6 +124,13 @@ > #define ICE_ETH_OVERHEAD \ > (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + ICE_VLAN_TAG_SIZE * 2) > >+/* DDP package type */ >+enum ice_pkg_type { >+ ICE_PKG_TYPE_UNKNOWN, >+ ICE_PKG_TYPE_OS_DEFAULT, >+ ICE_PKG_TYPE_COMMS, >+}; >+ > struct ice_adapter; > > /** >@@ -296,6 +303,7 @@ struct ice_adapter { > uint32_t ptype_tbl[ICE_MAX_PKT_TYPE] __rte_cache_min_aligned; > bool is_safe_mode; > struct ice_devargs devargs; >+ enum ice_pkg_type active_pkg_type; /* loaded ddp package type */ > }; > > struct ice_vsi_vlan_pvid_info { >-- >2.17.1 >