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 AFB76A0613 for ; Thu, 29 Aug 2019 20:08:11 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 411801DFE5; Thu, 29 Aug 2019 20:08:10 +0200 (CEST) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id F32E11D427 for ; Thu, 29 Aug 2019 20:08:08 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Aug 2019 11:08:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,444,1559545200"; d="scan'208";a="210632906" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by fmsmga002.fm.intel.com with ESMTP; 29 Aug 2019 11:08:07 -0700 Received: from fmsmsx119.amr.corp.intel.com (10.18.124.207) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 29 Aug 2019 11:08:07 -0700 Received: from fmsmsx120.amr.corp.intel.com ([169.254.15.122]) by FMSMSX119.amr.corp.intel.com ([169.254.14.98]) with mapi id 14.03.0439.000; Thu, 29 Aug 2019 11:08:06 -0700 From: "Stillwell Jr, Paul M" To: "Xu, Ting" , "dev@dpdk.org" CC: "Lu, Wenzhuo" , "Yang, Qiming" , "Zhang, Qi Z" Thread-Topic: [dpdk-dev] [PATCH v1] net/ice: support device-specific DDP package loading Thread-Index: AQHVXjGCBm9V02b+uUm4zcKfWqbamacSa+lQ Date: Thu, 29 Aug 2019 18:08:06 +0000 Message-ID: References: <20190829131758.12648-1-ting.xu@intel.com> In-Reply-To: <20190829131758.12648-1-ting.xu@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYzAyNGM4ODItYWJlOS00ODQyLWFhM2EtNjk2Mzk0MDI0ZGFkIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiZ0t2bkduR0RZUDc1eStzVTZNb1hQUFNIV1JHdlNpUEc2QU4zb2x0UHlYWVFIT1hUaXZocktvN0srRml2T1wvdDEifQ== dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.1.200.106] 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: 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 packa= ge > loading >=20 > This patch adds the feature that supports loading DDP package according t= o > the device serial number. Prior to loading the default DDP package (ice.p= kg), > the driver will check for the presence of a device-specific DDP package w= ith > 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 w= ill > 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= . >=20 > 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(-) >=20 > 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 { }; >=20 > #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 >=20 > int ice_logtype_init; > int ice_logtype_driver; > @@ -1265,15 +1273,134 @@ ice_pf_setup(struct ice_pf *pf) > return 0; > } >=20 > +/* 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; > + The above search order is not correct. You should search the updates path f= irst and then the default path. That is the order that the kernel interface= s search them. > + 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", Activated =3D> Active > + 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); >=20 > 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); > + How does active_pkg_type get used? What is the purpose? > 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) >=20 > +/* DDP package type */ > +enum ice_pkg_type { > + ICE_PKG_TYPE_UNKNOWN, > + ICE_PKG_TYPE_OS_DEFAULT, > + ICE_PKG_TYPE_COMMS, > +}; > + > struct ice_adapter; >=20 > /** > @@ -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 */ > }; >=20 > struct ice_vsi_vlan_pvid_info { > -- > 2.17.1