From a9d78bb714e37f950ad0ce1e82e8b456bb72325a Mon Sep 17 00:00:00 2001 From: Eric Joyner Date: Mon, 28 Oct 2024 15:48:47 -0700 Subject: [PATCH] ice_ddp: Update to 1.3.41.0 Primarily adds support for E830 devices, unlocking all of their functionality. As well, update the README and remove the non-FreeBSD sections from it. Signed-off-by: Eric Joyner Sponsored by: Intel Corporation (cherry picked from commit f9a039060e834e89e0b2de1e8a442d78bd5c083d) --- sys/conf/files.amd64 | 6 +- sys/conf/files.arm64 | 6 +- sys/conf/files.powerpc | 6 +- sys/contrib/dev/ice/README | 394 +++++++----------- .../{ice-1.3.36.0.pkg => ice-1.3.41.0.pkg} | Bin 692776 -> 1352580 bytes sys/modules/ice_ddp/Makefile | 2 +- 6 files changed, 165 insertions(+), 249 deletions(-) rename sys/contrib/dev/ice/{ice-1.3.36.0.pkg => ice-1.3.41.0.pkg} (50%) diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64 index 58946eb3c66..80ebc2ab676 100644 --- a/sys/conf/files.amd64 +++ b/sys/conf/files.amd64 @@ -193,7 +193,7 @@ dev/ice/irdma_di_if.m optional ice pci \ dev/ice/ice_ddp_common.c optional ice pci \ compile-with "${NORMAL_C} -I$S/dev/ice" ice_ddp.c optional ice_ddp \ - compile-with "${AWK} -f $S/tools/fw_stub.awk ice_ddp.fw:ice_ddp:0x01032400 -mice_ddp -c${.TARGET}" \ + compile-with "${AWK} -f $S/tools/fw_stub.awk ice_ddp.fw:ice_ddp:0x01032900 -mice_ddp -c${.TARGET}" \ no-ctfconvert no-implicit-rule before-depend local \ clean "ice_ddp.c" ice_ddp.fwo optional ice_ddp \ @@ -202,8 +202,8 @@ ice_ddp.fwo optional ice_ddp \ no-implicit-rule \ clean "ice_ddp.fwo" ice_ddp.fw optional ice_ddp \ - dependency "$S/contrib/dev/ice/ice-1.3.36.0.pkg" \ - compile-with "${CP} $S/contrib/dev/ice/ice-1.3.36.0.pkg ice_ddp.fw" \ + dependency "$S/contrib/dev/ice/ice-1.3.41.0.pkg" \ + compile-with "${CP} $S/contrib/dev/ice/ice-1.3.41.0.pkg ice_ddp.fw" \ no-obj no-implicit-rule \ clean "ice_ddp.fw" dev/ioat/ioat.c optional ioat pci diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64 index 0fefcca97c6..563a8e93c3a 100644 --- a/sys/conf/files.arm64 +++ b/sys/conf/files.arm64 @@ -322,7 +322,7 @@ dev/ice/irdma_di_if.m optional ice pci \ dev/ice/ice_ddp_common.c optional ice pci \ compile-with "${NORMAL_C} -I$S/dev/ice" ice_ddp.c optional ice_ddp \ - compile-with "${AWK} -f $S/tools/fw_stub.awk ice_ddp.fw:ice_ddp:0x01032400 -mice_ddp -c${.TARGET}" \ + compile-with "${AWK} -f $S/tools/fw_stub.awk ice_ddp.fw:ice_ddp:0x01032900 -mice_ddp -c${.TARGET}" \ no-ctfconvert no-implicit-rule before-depend local \ clean "ice_ddp.c" ice_ddp.fwo optional ice_ddp \ @@ -331,8 +331,8 @@ ice_ddp.fwo optional ice_ddp \ no-implicit-rule \ clean "ice_ddp.fwo" ice_ddp.fw optional ice_ddp \ - dependency "$S/contrib/dev/ice/ice-1.3.36.0.pkg" \ - compile-with "${CP} $S/contrib/dev/ice/ice-1.3.36.0.pkg ice_ddp.fw" \ + dependency "$S/contrib/dev/ice/ice-1.3.41.0.pkg" \ + compile-with "${CP} $S/contrib/dev/ice/ice-1.3.41.0.pkg ice_ddp.fw" \ no-obj no-implicit-rule \ clean "ice_ddp.fw" diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc index 1a0388884ee..6d44d9114e2 100644 --- a/sys/conf/files.powerpc +++ b/sys/conf/files.powerpc @@ -95,7 +95,7 @@ dev/ice/irdma_di_if.m optional ice pci powerpc64 | ice pci powerpc64le \ dev/ice/ice_ddp_common.c optional ice pci powerpc64 | ice pci powerpc64le \ compile-with "${NORMAL_C} -I$S/dev/ice" ice_ddp.c optional ice_ddp powerpc64 | ice pci powerpc64le \ - compile-with "${AWK} -f $S/tools/fw_stub.awk ice_ddp.fw:ice_ddp:0x01032400 -mice_ddp -c${.TARGET}" \ + compile-with "${AWK} -f $S/tools/fw_stub.awk ice_ddp.fw:ice_ddp:0x01032900 -mice_ddp -c${.TARGET}" \ no-ctfconvert no-implicit-rule before-depend local \ clean "ice_ddp.c" ice_ddp.fwo optional ice_ddp powerpc64 | ice pci powerpc64le \ @@ -104,8 +104,8 @@ ice_ddp.fwo optional ice_ddp powerpc64 | ice pci powerpc64le \ no-implicit-rule \ clean "ice_ddp.fwo" ice_ddp.fw optional ice_ddp powerpc64 | ice pci powerpc64le \ - dependency "$S/contrib/dev/ice/ice-1.3.36.0.pkg" \ - compile-with "${CP} $S/contrib/dev/ice/ice-1.3.36.0.pkg ice_ddp.fw" \ + dependency "$S/contrib/dev/ice/ice-1.3.41.0.pkg" \ + compile-with "${CP} $S/contrib/dev/ice/ice-1.3.41.0.pkg ice_ddp.fw" \ no-obj no-implicit-rule \ clean "ice_ddp.fw" dev/ixl/if_ixl.c optional ixl pci powerpc64 \ diff --git a/sys/contrib/dev/ice/README b/sys/contrib/dev/ice/README index e2ce84d72e7..c0840ecb499 100644 --- a/sys/contrib/dev/ice/README +++ b/sys/contrib/dev/ice/README @@ -1,285 +1,201 @@ OS Default Dynamic Device Personalization (DDP) Package -====================================================================== -May 12, 2022 +******************************************************* + +August 09, 2024 Contents -======== -- Overview -- Supported Operating Systems -- Safe Mode -- Notes -- Installation -- Troubleshooting -- Legal +^^^^^^^^ + +* OS Default Dynamic Device Personalization (DDP) Package + + * Overview + + * Supported Operating Systems + + * Contents of This Package + + * Related Documentation + + * Notes + + * Installation + + * Troubleshooting + + * Legal / Disclaimers Overview ======== -Devices based on the Intel(R) Ethernet 800 Series require a Dynamic Device -Personalization (DDP) package file to enable advanced features (such as dynamic -tunneling, Intel(R) Ethernet Flow Director, RSS, and ADQ). -DDP allows you to change the packet processing pipeline of a device by applying -a profile package to the device at runtime. Profiles can be used to, for -example, add support for new protocols, change existing protocols, or change -default settings. DDP profiles can also be rolled back without rebooting the -system. +Devices based on the Intel(R) Ethernet 800 Series require a Dynamic +Device Personalization (DDP) package file to enable advanced features +(such as dynamic tunneling, Intel(R) Ethernet Flow Director, RSS, and +ADQ). -The DDP package loads during device initialization or driver runtime, depending -on the operating system. The driver checks to see if the DDP package is present -and compatible. If this file exists, the driver will load it into the device. -If the DDP package file is missing or incompatible with the driver, the driver -will go into Safe Mode where it will use the configuration contained in the -device's NVM. Refer to the Intel(R) Ethernet Adapters and Devices User Guide -for more information on Safe Mode. +DDP allows you to change the packet processing pipeline of a device by +applying a profile package to the device at runtime. Profiles can be +used to, for example, add support for new protocols, change existing +protocols, or change default settings. DDP profiles can also be rolled +back without rebooting the system. -A general-purpose, default DDP package is automatically installed with all -supported Intel Ethernet 800 Series drivers on supported operating systems. -Additional DDP packages are available to address needs for specific market -segments or targeted solutions. +The DDP package loads during device initialization or driver runtime, +depending on the operating system. The driver checks to see if the DDP +package is present and compatible. If this file exists, the driver +will load it into the device. If the DDP package file is missing or +incompatible with the driver, the driver will go into Safe Mode where +it will use the configuration contained in the device's NVM. + +Safe Mode disables advanced and performance features, and supports +only basic traffic and minimal functionality, such as updating the NVM +or downloading a new driver or DDP package. + +Refer to the Intel(R) Ethernet Adapters and Devices User Guide for +more details on DDP and Safe Mode. + +A general-purpose, default DDP package is automatically installed with +all supported Intel Ethernet 800 Series drivers on supported operating +systems. Additional DDP packages are available to address needs for +specific market segments or targeted solutions. The default DDP package supports the following: -- MAC -- EtherType -- VLAN -- IPv4 -- IPv6 -- TCP -- ARP -- UDP -- SCTP -- ICMP -- ICMPv6 -- CTRL -- LLDP -- VXLAN-GPE -- VXLAN (non-GPE) -- Geneve -- GRE -- NVGRE -- RoCEv2 -- MPLS (up to 5 consecutive MPLS labels in the outermost Layer 2 header group) + +* MAC + +* EtherType + +* VLAN + +* IPv4 + +* IPv6 + +* TCP + +* ARP + +* UDP + +* SCTP + +* ICMP + +* ICMPv6 + +* CTRL + +* LLDP + +* VXLAN-GPE + +* VXLAN (non-GPE) + +* Geneve + +* GRE + +* NVGRE + +* RoCEv2 + +* MPLS (up to 5 consecutive MPLS labels in the outermost Layer 2 + header group) Supported Operating Systems =========================== + This DDP package is supported on the following operating systems: -- Microsoft* Windows Server* -- Linux* -- FreeBSD* -- VMware* ESXi* -Refer to the Intel(R) Ethernet Adapters and Devices User Guide for currently -supported versions of these operating systems. +* Microsoft* Windows Server* + +* Linux* + +* FreeBSD* + +* VMware* ESXi* + +Refer to the Intel(R) Ethernet Adapters and Devices User Guide for +currently supported versions of these operating systems. -Safe Mode -========= -Safe Mode disables advanced and performance features, and supports only basic -traffic and minimal functionality, such as updating the NVM or downloading a -new driver or DDP package. +Related Documentation +===================== -Refer to the Intel(R) Ethernet Adapters and Devices User Guide for more details -on DDP and Safe Mode. +See the "Intel(R) Ethernet Adapters and Devices User Guide" for +additional information on features: + +* https://cdrdv2.intel.com/v1/dl/getContent/705831/ + +Additionally, a detailed technology guide is available for this DDP +package: + +* https://cdrdv2.intel.com/v1/dl/getContent/617015 Notes ===== -- In Linux, FreeBSD, and Windows, you cannot update the DDP package if any PF -drivers are already loaded. To overwrite a package, unload all PFs and then -reload the driver with the new package. -- In ESXi, use esxcli to load and unload DDP packages for specific market -segments during driver runtime. - -- In FreeBSD and Windows, you can only use one DDP package per driver, even if -you have more than one device installed that uses the driver. +* In Linux, FreeBSD, and Windows, you cannot update the DDP package if + any PF drivers are already loaded. To overwrite a package, unload + all PFs and then reload the driver with the new package. -- In Linux, FreeBSD, and Windows, only the first loaded PF per device can -download a package for that device. In ESXi, you can load different DDP -packages for different PFs associated with a device. +* In FreeBSD and Windows, you can only use one DDP package per driver, + even if you have more than one device installed that uses the + driver. -- If you are using DPDK, see the DPDK documentation at https://www.dpdk.org/ -for installation instructions and more information. +* In Linux, FreeBSD, and Windows, only the first loaded PF per device + can download a package for that device. In ESXi, you can load + different DDP packages for different PFs associated with a device. - -Installation -============ - -Microsoft Windows ------------------ -TO INSTALL THE OS DEFAULT DDP PACKAGE: - -The default DDP package is installed as part of the driver binary. You don't -need to take additional steps to install the DDP package file. - - -FreeBSD -------- -TO INSTALL THE OS DEFAULT DDP PACKAGE: - -The FreeBSD driver automatically installs the default DDP package file during -driver installation. See the base driver README for general installation and -building instructions. - -The DDP package loads during device initialization. The driver looks for the -ice_ddp module and checks that it contains a valid DDP package file. - -NOTE: It's important to do 'make install' during initial ice driver -installation so that the driver loads the DDP package automatically. - - -Linux ------ -TO INSTALL THE OS DEFAULT DDP PACKAGE: - -The Linux driver automatically installs the default DDP package file during -driver installation. Read the base driver README for general installation and -building instructions. - -The DDP package loads during device initialization. The driver looks for -intel/ice/ddp/ice.pkg in your firmware root (typically /lib/firmware/ or -/lib/firmware/updates/) and checks that it contains a valid DDP package file. -The ice.pkg file is a symbolic link to the default DDP package file installed -by the linux-firmware software package or the out-of-tree driver installation. - - -TO INSTALL A DDP PACKAGE FOR SPECIFIC MARKET SEGMENTS: - -You can install specific DDP package files for different physical devices in -the same system. To install a specific DDP package: - -1. Download the DDP package file (ice-x.x.x.x.zip) you want for your device. In -addition to licensing information and this README, this zip file contains the -following files: - ice-x.x.x.x.pkg - ice.pkg - -NOTE: The ice.pkg file is a Linux symbolic link file pointing to -ice-x.x.x.x.pkg (in the same path). - -2. Rename the ice-x.x.x.x.pkg file as ice-xxxxxxxxxxxxxxxx.pkg, where -'xxxxxxxxxxxxxxxx' is the unique 64-bit PCI Express device serial number (in -hex) of the device you want the package downloaded on. The filename must -include the complete serial number (including leading zeros) and be all -lowercase. For example, if the 64-bit serial number is b887a3ffffca0568, then -the file name would be ice-b887a3ffffca0568.pkg. - -To find the serial number from the PCI bus address, you can use the following -command: - -# lspci -vv -s af:00.0 | grep -i Serial -Capabilities: [150 v1] Device Serial Number b8-87-a3-ff-ff-ca-05-68 - -You can use the following command to format the serial number without the -dashes: - -# lspci -vv -s af:00.0 | grep -i Serial | awk '{print $7}' | sed s/-//g -b887a3ffffca0568 - -3. Copy the renamed DDP package file to /lib/firmware/updates/intel/ice/ddp/. -If the directory does not yet exist, create it before copying the file. - -4. Unload all of the PFs on the device. - -5. Reload the driver with the new package. - -NOTE: The presence of a device-specific DDP package file overrides the loading -of the default DDP package file. - - -ESX ---- -TO INSTALL THE OS DEFAULT DDP PACKAGE: - -The default DDP package is installed as part of the driver binary. You don't -need to take additional steps to install the DDP package file. - -TO INSTALL A DDP PACKAGE FOR SPECIFIC MARKET SEGMENTS: - -You must first install the Intel(R) ESXCLI Plug-In for Managing Intel(R) -Ethernet Network Adapters to be able to install and load market-specific DDP -packages. Download it from: -https://www.intel.com/content/www/us/en/download/19380/intel-esxcli-plug-in-for- -managing-intel-ethernet-network-adapters.html - -NOTE: ESXi support for DDP packages for specific market segments requires the -following: -- OS: ESXi 6.7 or higher -- Driver: icen 1.9.1.x or higher -- Tool: intnet 1.8.3.x or higher - -To install and load this DDP package: - -1. Download and install the esxcli plug-in from the URL above. - -2. Download the DDP package. - -3. Copy the DDP package file to the following location: /store/intel/icen/ddp/. - If the directory does not yet exist, create it before copying the file. - -4. From the command prompt, run the following command to load the DDP package: - - # esxcli intnet ddp load -n -p -f - - Where: - = the name of the NIC - = the name of the DDP package to load - -f = forces the package to load - - NOTE: This operation will cause the driver to reset. - -5. Wait for the load result status. - - -To list all active DDP packages for all virtual NICs, run the following: - -# esxcli intnet ddp list - -To unload (roll back) a DDP package, run the following: - -# esxcli intnet ddp rollback -n -f - -NOTE: This operation will cause the driver to reset. +* If you are using DPDK, see the DPDK documentation at + https://www.dpdk.org/ for installation instructions and more + information. Troubleshooting =============== -Microsoft Windows ------------------ -If you encounter issues with the DDP package file, download the latest driver. FreeBSD ------- -If you encounter issues with the DDP package file, you may need to download an -updated driver or ice_ddp module. See the log messages for more information. -Linux ------ -If you encounter issues with the DDP package file, you may need to download an -updated driver or DDP package file. Refer to the log messages for more -information. - -ESX ---- -If you encounter issues with the DDP package file, download the latest driver. +If you encounter issues with the DDP package file, you may need to +download an updated driver or ice_ddp module. See the log messages for +more information. Legal / Disclaimers =================== -Copyright (c) 2019 - 2022, Intel Corporation. -Intel and the Intel logo are trademarks of Intel Corporation or its -subsidiaries in the U.S. and/or other countries. +Copyright (c) 2019 - 2024, Intel Corporation. -*Other names and brands may be claimed as the property of others. +Intel technologies may require enabled hardware, software or service +activation. -This software and the related documents are Intel copyrighted materials, and -your use of them is governed by the express license under which they were -provided to you ("License"). Unless the License provides otherwise, you may not -use, modify, copy, publish, distribute, disclose or transmit this software or -the related documents without Intel's prior written permission. -This software and the related documents are provided as is, with no express or -implied warranties, other than those that are expressly stated in the License. +No product or component can be absolutely secure. + +Your costs and results may vary. + +Intel, the Intel logo, and other Intel marks are trademarks of Intel +Corporation or its subsidiaries. Other names and brands may be +claimed as the property of others. + +Performance varies by use, configuration, and other factors. Learn +more at https://www.Intel.com/PerformanceIndex. + +The products described may contain design defects or errors known as +errata which may cause the product to deviate from published +specifications. Current characterized errata are available on request. + +This software and the related documents are Intel copyrighted +materials, and your use of them is governed by the express license +under which they were provided to you ("License"). Unless the License +provides otherwise, you may not use, modify, copy, publish, +distribute, disclose or transmit this software or the related +documents without Intel's prior written permission. + +This software and the related documents are provided as is, with no +express or implied warranties, other than those that are expressly +stated in the License. diff --git a/sys/contrib/dev/ice/ice-1.3.36.0.pkg b/sys/contrib/dev/ice/ice-1.3.41.0.pkg similarity index 50% rename from sys/contrib/dev/ice/ice-1.3.36.0.pkg rename to sys/contrib/dev/ice/ice-1.3.41.0.pkg index ce5dbf41f55750742ecc12ffca896f790240753a..71e75a5d78365ae4a23bef57776e835e5009bc29 100644 GIT binary patch delta 10238 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 O0t!8OB7wn@_5T3IQadXE delta 1433 zcmZoU9<*YKmOLW^0|OfnD*$l`5Z?e|4?_lq9f=GK9}2l9YU?wqOpMlLOqtjj#$sf| z#V}c#(Ug+~sEQegYo{x2Vb-6%Ac~7+au1^dGY|Xo&FdL+8SBeL*bZ@|C^}@lUHf~Y z&0*gA`gZxXZ|+Q)_NGib_{{Xq&67)J?pGDu=aF=JF3W_vv!Bf0-T2L1xjOxzvC|7t z4X&ReUAv#=9^`MAx~f`w=T>Aq44A5N38=3Z6yEnOqSg6L$30G;?{Jn30IY_3fr3)%(P)_-D@PX z*?tB8{E6G|T=fipb<^ta3C^;Avx|N|e-ayX{k*7frnt+lMVGc3f4S{+^1u5!qg+p5 z=%9eKt#aWDB|mc7vxsc34^%t1OX}14H@l|&;$UEVay@tRJ5WgGY<5`oghwIMu)os& zyFm)??!e0~y)EtcUae%TY~0mV;2wI_%=HKR<~@Qe3RvUdkDcl z;w_EV53QCSJA`hz*mt{%es}h2c-Q=KON<`>>Tj(3x&NK7U(jInIF9M`*R#(}mu&W$ z*}bU$pt!`0f+UtT_l+3Y)b80Rb9VU7crCHEKD}fHr_ySRqzkHkNlxkyS^s<1Hyt?h z)R61SvCE>%KIR@z70TpoSfM(HnXOTpUGKtAh6|yeDoS4^M)DLonk_q9H`STxc=U1Z znk%!Lb5#;dwI;6jZVKu6w$uLXjPn=NoVI?-ye?27R~7EHBKEst+rFQbs~fMKWV8J5 z=OpsE@k6~0yU(5g{VMM)-#Yy{RtqmJzkK}U-F(5-if5f0+9&5uzTWG+_DV(ISJ%zU zTTga=KYi`<_w6=IHtX6&g!!H0jx&#T6TG$4!sVQQifG%?SxJliju$Lh===2$^NsW2 z`U(Bn9j>2$`tFz^DP)t`Wzwwh`DAKH!NSg6n>bkKB^WHwbzPETi;@b!oRcPpl+vG^ zHUDu(`}5tTn6S&