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 D37CAA0613 for ; Fri, 30 Aug 2019 00:05:22 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 483AA1E4E8; Fri, 30 Aug 2019 00:05:21 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id 67ABD1E4E0 for ; Fri, 30 Aug 2019 00:05:18 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Aug 2019 15:05:16 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,445,1559545200"; d="scan'208";a="265123537" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga001.jf.intel.com with ESMTP; 29 Aug 2019 15:05:16 -0700 Received: from fmsmsx603.amr.corp.intel.com (10.18.126.83) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 29 Aug 2019 15:05:15 -0700 Received: from fmsmsx603.amr.corp.intel.com (10.18.126.83) by fmsmsx603.amr.corp.intel.com (10.18.126.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 29 Aug 2019 15:05:15 -0700 Received: from shsmsx102.ccr.corp.intel.com (10.239.4.154) by fmsmsx603.amr.corp.intel.com (10.18.126.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.1713.5 via Frontend Transport; Thu, 29 Aug 2019 15:05:15 -0700 Received: from shsmsx105.ccr.corp.intel.com ([169.254.11.15]) by shsmsx102.ccr.corp.intel.com ([169.254.2.19]) with mapi id 14.03.0439.000; Fri, 30 Aug 2019 06:05:13 +0800 From: "Zhang, Qi Z" To: "Stillwell Jr, Paul M" , "Xu, Ting" , "dev@dpdk.org" CC: "Lu, Wenzhuo" , "Yang, Qiming" Thread-Topic: [dpdk-dev] [PATCH v1] net/ice: support device-specific DDP package loading Thread-Index: AQHVXpS2c8ZbbG+PzUemYlEQv2o8/6cSrRng Date: Thu, 29 Aug 2019 22:05:12 +0000 Message-ID: <039ED4275CED7440929022BC67E7061153D864DD@SHSMSX105.ccr.corp.intel.com> References: <20190829131758.12648-1-ting.xu@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYzAyNGM4ODItYWJlOS00ODQyLWFhM2EtNjk2Mzk0MDI0ZGFkIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiZ0t2bkduR0RZUDc1eStzVTZNb1hQUFNIV1JHdlNpUEc2QU4zb2x0UHlYWVFIT1hUaXZocktvN0srRml2T1wvdDEifQ== x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v1] 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" > -----Original Message----- > From: Stillwell Jr, Paul M > Sent: Friday, August 30, 2019 2:08 AM > To: Xu, Ting ; dev@dpdk.org > Cc: Lu, Wenzhuo ; Yang, Qiming > ; Zhang, Qi Z > Subject: RE: [dpdk-dev] [PATCH v1] net/ice: support device-specific DDP > package loading >=20 > > -----Original Message----- > > From: dev On Behalf Of Ting Xu > > Sent: Thursday, August 29, 2019 6:18 AM > > To: dev@dpdk.org > > Cc: Lu, Wenzhuo ; Yang, Qiming > > ; Zhang, Qi Z > > Subject: [dpdk-dev] [PATCH v1] net/ice: support device-specific DDP > > package loading > > > > 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/intel/ice/ddp/ and > > /lib/firmware/updates/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 > > --- > > drivers/net/ice/ice_ethdev.c | 132 > > ++++++++++++++++++++++++++++++++++- > > drivers/net/ice/ice_ethdev.h | 8 +++ > > 2 files changed, 139 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/net/ice/ice_ethdev.c > > b/drivers/net/ice/ice_ethdev.c index 686d6f00f..92eafdd1f 100644 > > --- a/drivers/net/ice/ice_ethdev.c > > +++ b/drivers/net/ice/ice_ethdev.c > > @@ -28,7 +28,15 @@ static const char * const ice_valid_args[] =3D { }; > > > > #define ICE_DFLT_OUTER_TAG_TYPE > ICE_AQ_VSI_OUTER_TAG_VLAN_9100 > > + > > +/* DDP package search path */ > > #define ICE_DFLT_PKG_FILE "/lib/firmware/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 +1273,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 =3D PCI_CFG_SPACE_SIZE; > > + > > + /* minimum 8 bytes per capability */ > > + ttl =3D (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 =3D=3D 0) > > + return 0; > > + > > + while (ttl-- > 0) { > > + if (PCI_EXT_CAP_ID(header) =3D=3D cap) > > + return pos; > > + > > + pos =3D 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. > > + */ > > +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; > > + > > + pos =3D 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 =3D dword; > > + rte_pci_read_config(pci_dev, &dword, 4, pos + 8); > > + dsn_high =3D 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"); > > + strncpy(pkg_file, ICE_DFLT_PKG_FILE, > > ICE_MAX_PKG_FILENAME_SIZE); > > + > > + return 0; > > + } > > + > > + strncpy(pkg_file, ICE_PKG_FILE_SEARCH_PATH_DEFAULT, > > + ICE_MAX_PKG_FILENAME_SIZE); > > + if (!access(strncat(pkg_file, opt_ddp_filename, > > + ICE_MAX_PKG_FILENAME_SIZE), 0)) > > + return 0; > > + > > + strncpy(pkg_file, ICE_PKG_FILE_SEARCH_PATH_UPDATES, > > + ICE_MAX_PKG_FILENAME_SIZE); > > + if (!access(strncat(pkg_file, opt_ddp_filename, > > + ICE_MAX_PKG_FILENAME_SIZE), 0)) > > + return 0; > > + >=20 > The above search order is not correct. You should search the updates path > first and then the default path. That is the order that the kernel interf= aces > search them. >=20 > > + strncpy(pkg_file, ICE_DFLT_PKG_FILE, > > 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 =3D ICE_PKG_TYPE_OS_DEFAULT; > > + else if (!strncmp((char *)hw->active_pkg_name, > > ICE_COMMS_PKG_NAME, > > + ICE_PKG_NAME_SIZE)) > > + package_type =3D ICE_PKG_TYPE_COMMS; > > + else > > + package_type =3D ICE_PKG_TYPE_UNKNOWN; > > + > > + PMD_INIT_LOG(INFO, "Activated package is: %d.%d.%d.%d, %s\n", >=20 > Activated =3D> Active >=20 > > + 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 =3D ICE_DEV_PRIVATE_TO_HW(dev->data- > > >dev_private); > > - const char *pkg_file =3D 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 =3D RTE_DEV_TO_PCI(dev->device); > > + struct ice_adapter *ad =3D > > + ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > > + > > + ice_pkg_file_search_path(pci_dev, pkg_file); > > > > file =3D fopen(pkg_file, "rb"); > > if (!file) { > > @@ -1313,6 +1440,9 @@ 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; > > } > > + > > + ad->active_pkg_type =3D ice_get_pkg_type(hw); > > + >=20 > How does active_pkg_type get used? What is the purpose? It will be used in following patches. Basically we need this flag to expose package corresponding device capabili= ty at runtime for example rte_flow, supported ptype ... >=20 > > err =3D 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