diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst index ae975d19ad3..0c29e9fb6cc 100644 --- a/doc/guides/nics/ice.rst +++ b/doc/guides/nics/ice.rst @@ -80,6 +80,36 @@ are listed in the Tested Platforms section of the Release Notes for each release | 24.03 | 1.13.7 | 1.3.35 | 1.3.45 | 1.3.13 | 4.4 | +-----------+---------------+-----------------+-----------+--------------+-----------+ +Dynamic Device Personalization (DDP) package loading +---------------------------------------------------- + +The Intel E810 requires a programmable pipeline package +be downloaded by the driver to support normal operations. +The E810 has limited functionality built in to allow PXE boot and other use cases, +but for DPDK use the driver must download a package file during the driver initialization stage. + +The default DDP package file name is ``ice.pkg``. +For a specific NIC, the DDP package supposed to be loaded can have a filename: +``ice-xxxxxx.pkg``, where 'xxxxxx' is the 64-bit PCIe Device Serial Number of the NIC. +For example, if the NIC's device serial number is 00-CC-BB-FF-FF-AA-05-68, +the device-specific DDP package filename is ``ice-00ccbbffffaa0568.pkg`` (in hex and all low case). +A symbolic link to the DDP package file is also ok. +The same package file is used by both the kernel driver and the ICE PMD. +For more information, please review the README file from +`IntelĀ® Ethernet 800 Series Dynamic Device Personalization (DDP) for Telecommunication (Comms) Package +`_. + +ICE PMD supports using a customized DDP search path. +The driver will read the search path from +``/sys/module/firmware_class/parameters/path`` as a ``CUSTOMIZED_PATH``. +During initialization, the driver searches in the following paths in order: +``CUSTOMIZED_PATH``, ``/lib/firmware/updates/intel/ice/ddp`` and ``/lib/firmware/intel/ice/ddp``. +The device-specific DDP package has a higher loading priority than default DDP package, ``ice.pkg``. + +.. note:: + + Windows support: DDP packages are not supported on Windows. + Configuration ------------- @@ -487,32 +517,3 @@ Usage:: In "brief" mode, all scheduling nodes in the tree are displayed. In "detail" mode, each node's configuration parameters are also displayed. - -Limitations or Known issues ---------------------------- - -The Intel E810 requires a programmable pipeline package be downloaded -by the driver to support normal operations. The E810 has a limited -functionality built in to allow PXE boot and other use cases, but the -driver must download a package file during the driver initialization -stage. - -The default DDP package file name is ice.pkg. For a specific NIC, the -DDP package supposed to be loaded can have a filename: ice-xxxxxx.pkg, -where 'xxxxxx' is the 64-bit PCIe Device Serial Number of the NIC. For -example, if the NIC's device serial number is 00-CC-BB-FF-FF-AA-05-68, -the device-specific DDP package filename is ice-00ccbbffffaa0568.pkg -(in hex and all low case). During initialization, the driver searches -in the following paths in order: /lib/firmware/updates/intel/ice/ddp -and /lib/firmware/intel/ice/ddp. The corresponding device-specific DDP -package will be downloaded first if the file exists. If not, then the -driver tries to load the default package. The type of loaded package -is stored in ``ice_adapter->active_pkg_type``. - -A symbolic link to the DDP package file is also ok. The same package -file is used by both the kernel driver and the DPDK PMD. - - .. Note:: - - Windows support: The DDP package is not supported on Windows so, - loading of the package is disabled on Windows. diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index 001e918145c..61bff016be6 100644 --- a/drivers/net/ice/ice_ethdev.c +++ b/drivers/net/ice/ice_ethdev.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -1873,21 +1874,60 @@ ice_load_pkg_type(struct ice_hw *hw) return package_type; } +static int ice_read_customized_path(char *pkg_file, uint16_t buff_len) +{ + int fp, n; + + fp = open(ICE_PKG_FILE_CUSTOMIZED_PATH, O_RDONLY); + if (fp < 0) { + PMD_INIT_LOG(INFO, "Failed to read CUSTOMIZED_PATH"); + return -EIO; + } + + n = read(fp, pkg_file, buff_len - 1); + if (n == 0) { + close(fp); + return -EIO; + } + + if (pkg_file[n - 1] == '\n') + n--; + + pkg_file[n] = '\0'; + + close(fp); + return 0; +} + int ice_load_pkg(struct ice_adapter *adapter, bool use_dsn, uint64_t dsn) { struct ice_hw *hw = &adapter->hw; char pkg_file[ICE_MAX_PKG_FILENAME_SIZE]; + char customized_path[ICE_MAX_PKG_FILENAME_SIZE]; char opt_ddp_filename[ICE_MAX_PKG_FILENAME_SIZE]; void *buf; size_t bufsz; int err; - if (!use_dsn) - goto no_dsn; - memset(opt_ddp_filename, 0, ICE_MAX_PKG_FILENAME_SIZE); snprintf(opt_ddp_filename, ICE_MAX_PKG_FILENAME_SIZE, "ice-%016" PRIx64 ".pkg", dsn); + + if (ice_read_customized_path(customized_path, ICE_MAX_PKG_FILENAME_SIZE) == 0) { + if (use_dsn) { + snprintf(pkg_file, RTE_DIM(pkg_file), "%s/%s", + customized_path, opt_ddp_filename); + if (rte_firmware_read(pkg_file, &buf, &bufsz) == 0) + goto load_fw; + } + snprintf(pkg_file, RTE_DIM(pkg_file), "%s/%s", customized_path, "ice.pkg"); + if (rte_firmware_read(pkg_file, &buf, &bufsz) == 0) + goto load_fw; + } + + if (!use_dsn) + goto no_dsn; + strncpy(pkg_file, ICE_PKG_FILE_SEARCH_PATH_UPDATES, ICE_MAX_PKG_FILENAME_SIZE); strcat(pkg_file, opt_ddp_filename); diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index 3ea9f37dc8b..8b644ed7008 100644 --- a/drivers/net/ice/ice_ethdev.h +++ b/drivers/net/ice/ice_ethdev.h @@ -51,6 +51,7 @@ #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_PKG_FILE_CUSTOMIZED_PATH "/sys/module/firmware_class/parameters/path" #define ICE_MAX_PKG_FILENAME_SIZE 256 #define MAX_ACL_NORMAL_ENTRIES 256