From 654d249454a7e5c51c683a6bd453cae2711ade56 Mon Sep 17 00:00:00 2001 From: Steven Webster Date: Mon, 1 Jun 2020 16:09:35 -0400 Subject: [PATCH] Add support for igb_uio kernel module Currently, the forward error correction (FEC) device on an Intel N3000 FPGA card requires the use of the igb_uio driver for use with DPDK applications. This commit adds support for the igb_uio module by building DPDK 20.05 and extracting the enabled driver into the kernel modules. In addition, DPDK's devbind script is installed in the system at /usr/share/starlingx/scripts/dpdk-devbind.py to assist in binding the driver to a device. It is not possible to use the existing (older) version of this script shipped with openvswitch as it does not support acceleration devices such as the FEC. Story: 2006740 Task: 39946 Change-Id: I838a6dacaaa79fcbce22884f42aa141435964b1d Signed-off-by: Steven Webster --- centos_iso_image.inc | 4 + centos_pkg_dirs | 1 + centos_pkg_dirs_rt | 1 + centos_tarball-dl.lst | 1 + .../intel-igb_uio/centos/build_srpm.data | 4 + .../intel-igb_uio/centos/igb_uio-kmod.spec | 145 ++++++++++++++++++ .../intel-igb_uio/files/modules-load.conf | 1 + 7 files changed, 157 insertions(+) create mode 100644 kernel-modules/intel-igb_uio/centos/build_srpm.data create mode 100644 kernel-modules/intel-igb_uio/centos/igb_uio-kmod.spec create mode 100644 kernel-modules/intel-igb_uio/files/modules-load.conf diff --git a/centos_iso_image.inc b/centos_iso_image.inc index 3554858b..9fb36652 100644 --- a/centos_iso_image.inc +++ b/centos_iso_image.inc @@ -34,6 +34,10 @@ kmod-ixgbevf-rt kmod-ixgbe kmod-ixgbe-rt +# igb_uio-kmod +kmod-igb_uio +kmod-igb_uio-rt + # drbd-kernel kmod-drbd kmod-drbd-rt diff --git a/centos_pkg_dirs b/centos_pkg_dirs index 1ead5f7b..f96c1e55 100644 --- a/centos_pkg_dirs +++ b/centos_pkg_dirs @@ -4,6 +4,7 @@ kernel-modules/intel-iavf kernel-modules/intel-i40e kernel-modules/intel-ixgbevf kernel-modules/intel-ixgbe +kernel-modules/intel-igb_uio kernel-modules/qat17 kernel-modules/drbd kernel-modules/intel-opae-fpga diff --git a/centos_pkg_dirs_rt b/centos_pkg_dirs_rt index 6e3f6525..7ce28f00 100644 --- a/centos_pkg_dirs_rt +++ b/centos_pkg_dirs_rt @@ -5,6 +5,7 @@ kernel-modules/intel-iavf kernel-modules/intel-i40e kernel-modules/intel-ixgbevf kernel-modules/intel-ixgbe +kernel-modules/intel-igb_uio kernel-modules/qat17 kernel-modules/drbd kernel-modules/intel-opae-fpga diff --git a/centos_tarball-dl.lst b/centos_tarball-dl.lst index 8bce25ce..59954757 100644 --- a/centos_tarball-dl.lst +++ b/centos_tarball-dl.lst @@ -4,6 +4,7 @@ i40e-2.10.19.82.tar.gz#i40e-2.10.19.82#https://sourceforge.net/projects/e1000/fi iavf-3.7.61.20.tar.gz#iavf-3.7.61.20#https://sourceforge.net/projects/e1000/files/iavf%20stable/3.7.61.20/iavf-3.7.61.20.tar.gz/download#http## ixgbe-5.6.5.tar.gz#ixgbe-5.6.5#https://sourceforge.net/projects/e1000/files/ixgbe%20stable/5.6.5/ixgbe-5.6.5.tar.gz/download#http## ixgbevf-4.6.3.tar.gz#ixgbevf-4.6.3#https://sourceforge.net/projects/e1000/files/ixgbevf%20stable/4.6.3/ixgbevf-4.6.3.tar.gz/download#http## +dpdk-20.05.tar.gz#dpdk-20.05#https://fast.dpdk.org/rel/dpdk-20.05.tar.gz#http## opae-intel-fpga-driver-2.0.1.tar.gz#opae-intel-fpga-driver-2.0.1#https://github.com/OPAE/opae-sdk/releases/download/1.3.6-4/opae-intel-fpga-driver-2.0.1.tar.gz#http## !qat1.7.l.4.5.0-00034.tar.gz#quickassist#https://01.org/sites/default/files/downloads/qat1.7.l.4.5.0-00034.tar.gz#http_script##post-dl-script/qat1.7.sh !kernel-rt-4.18.0-147.3.1.rt24.96.el8_1.src.rpm#kernel-rt#https://git.centos.org/rpms/kernel-rt#http_script#327ec52423c67051249291f131ec7f6fff44a828#post-dl-script/kernel-rt.sh diff --git a/kernel-modules/intel-igb_uio/centos/build_srpm.data b/kernel-modules/intel-igb_uio/centos/build_srpm.data new file mode 100644 index 00000000..7818f209 --- /dev/null +++ b/kernel-modules/intel-igb_uio/centos/build_srpm.data @@ -0,0 +1,4 @@ +COPY_LIST=" \ + $PKG_BASE/files/* \ + $STX_BASE/downloads/dpdk-20.05.tar.gz" +TIS_PATCH_VER=1 \ No newline at end of file diff --git a/kernel-modules/intel-igb_uio/centos/igb_uio-kmod.spec b/kernel-modules/intel-igb_uio/centos/igb_uio-kmod.spec new file mode 100644 index 00000000..9fb3a165 --- /dev/null +++ b/kernel-modules/intel-igb_uio/centos/igb_uio-kmod.spec @@ -0,0 +1,145 @@ +%if "%{?_tis_build_type}" == "rt" +%define bt_ext -rt +%else +%undefine bt_ext +%endif + +# Define the kmod package name here. +%define kmod_name igb_uio + +Name: %{kmod_name}-kmod%{?bt_ext} +Version: 20.05 +Release: 0%{?_tis_dist}.%{tis_patch_ver} +Group: System Environment/Kernel +License: GPLv2 +Summary: %{kmod_name} kernel module(s) +URL: http://www.intel.com/ + +BuildRequires: kernel%{?bt_ext}-devel, redhat-rpm-config, perl, openssl +BuildRequires: elfutils-libelf-devel +BuildRequires: gcc +BuildRequires: glibc-headers +BuildRequires: numactl-devel +BuildRequires: libmnl-devel +ExclusiveArch: x86_64 + +# Get the kernel headers version installed, not based on uname. +%define KERNEL_VERSION %(rpm -q kernel%{?bt_ext}-devel | sort --version-sort | tail -1 | sed 's/kernel%{?bt_ext}-devel-//') +%define DPDK_TARGET_MACHINE default +%define STAGING_KERNEL_DIR /usr/src/kernels/%{KERNEL_VERSION}/ +%define DPDK_EXTRA_CFLAGS "-fPIC -g -msse4.2" +%define DPDK_TARGET x86_64-native-linuxapp-gcc + +%define EXTRA_OEMAKE prefix= \\\ +TARGET_LDFLAGS= \\\ +TARGET_CFLAGS= \\\ +RTE_KERNELDIR=%{STAGING_KERNEL_DIR} \\\ +EXTRA_CFLAGS=%{DPDK_EXTRA_CFLAGS} \\\ +RTE_TARGET=%{DPDK_TARGET} \\\ +GCC_MAJOR_VERSION="%(gcc -dumpversion | cut -f1 -d.)" \\\ +GCC_MINOR_VERSION="%(gcc -dumpversion | cut -f2 -d.)" + +# Sources. +Source0: dpdk-%{version}.tar.gz + +%define kversion %(rpm -q kernel%{?bt_ext}-devel | sort --version-sort | tail -1 | sed 's/kernel%{?bt_ext}-devel-//') + +%package -n kmod-igb_uio%{?bt_ext} +Summary: igb_uio kernel module(s) +Group: System Environment/Kernel +%global _use_internal_dependency_generator 0 +Provides: kernel-modules >= %{kversion} +Provides: igb_uio-kmod = %{?epoch:%{epoch}:}%{version}-%{release} +Requires(post): /usr/sbin/depmod +Requires(postun): /usr/sbin/depmod + +%description -n kmod-igb_uio%{?bt_ext} +This package provides the igb_uio kernel module(s) built +for the Linux kernel using the %{_target_cpu} family of processors. + +%post -n kmod-igb_uio%{?bt_ext} +echo "Working. This may take some time ..." +if [ -e "/boot/System.map-%{kversion}" ]; then + /usr/sbin/depmod -aeF "/boot/System.map-%{kversion}" "%{kversion}" > /dev/null || : +fi +modules=( $(find /lib/modules/%{kversion}/extra/igb_uio | grep '\.ko$') ) +if [ -x "/sbin/weak-modules" ]; then + printf '%s\n' "${modules[@]}" | /sbin/weak-modules --add-modules +fi +echo "Done." + +%preun -n kmod-igb_uio%{?bt_ext} +rpm -ql kmod-igb_uio%{?bt_ext}-%{version}-%{release}.x86_64 | grep '\.ko$' > /var/run/rpm-kmod-igb_uio%{?bt_ext}-modules + +%postun -n kmod-igb_uio%{?bt_ext} +echo "Working. This may take some time ..." +if [ -e "/boot/System.map-%{kversion}" ]; then + /usr/sbin/depmod -aeF "/boot/System.map-%{kversion}" "%{kversion}" > /dev/null || : +fi +modules=( $(cat /var/run/rpm-kmod-igb_uio%{?bt_ext}-modules) ) +rm /var/run/rpm-kmod-igb_uio%{?bt_ext}-modules +if [ -x "/sbin/weak-modules" ]; then + printf '%s\n' "${modules[@]}" | /sbin/weak-modules --remove-modules +fi +echo "Done." + +%files -n kmod-igb_uio%{?bt_ext} +%defattr(644,root,root,755) +/lib/modules/%{kversion}/ +%config(noreplace)/etc/depmod.d/kmod-igb_uio.conf +%doc /usr/share/doc/kmod-igb_uio-%{version}/ +%defattr(755,root,root,755) +%{_datadir}/starlingx/scripts/dpdk-devbind.py +%exclude %{_datadir}/starlingx/scripts/*.py[oc] + +# Disable the building of the debug package(s). +%define debug_package %{nil} + +%description +This package provides the %{kmod_name} kernel module(s). +It is built to depend upon the specific ABI provided by a range of releases +of the same variant of the Linux kernel and not on any one specific build. + +%prep +%autosetup -p 1 -n dpdk-%{version} +echo "override %{kmod_name} * weak-updates/%{kmod_name}" > kmod-%{kmod_name}.conf + +%build +make T=%{DPDK_TARGET} config + +# This line changes default compiler flags from native to proper value +sed -i 's/"native"/"%{DPDK_TARGET_MACHINE}"/' build/.config +sed -i 's/CONFIG_RTE_EAL_IGB_UIO=n/CONFIG_RTE_EAL_IGB_UIO=y/' build/.config + +make %{?_smp_mflags} %{EXTRA_OEMAKE} +ls build/kmod/ + +%install +find . -name *.ko +%{__install} -d %{buildroot}/lib/modules/%{kversion}/extra/%{kmod_name}/ +%{__install} build/kmod/%{kmod_name}.ko %{buildroot}/lib/modules/%{kversion}/extra/%{kmod_name}/ +%{__install} -d %{buildroot}%{_sysconfdir}/depmod.d/ +%{__install} kmod-%{kmod_name}.conf %{buildroot}%{_sysconfdir}/depmod.d/ +%{__install} -d %{buildroot}%{_defaultdocdir}/kmod-%{kmod_name}-%{version}/ +%{__install} license/gpl-2.0.txt %{buildroot}%{_defaultdocdir}/kmod-%{kmod_name}-%{version}/ +%{__install} -d %{buildroot}%{_datadir}/starlingx/scripts +%{__install} -m755 usertools/dpdk-devbind.py %{buildroot}%{_datadir}/starlingx/scripts/dpdk-devbind.py + +# Strip the modules(s). +find %{buildroot} -type f -name \*.ko -exec %{__strip} --strip-debug \{\} \; + +# Always Sign the modules(s). +# If the module signing keys are not defined, define them here. +%{!?privkey: %define privkey /usr/src/kernels/%{kversion}/signing_key.pem} +%{!?pubkey: %define pubkey /usr/src/kernels/%{kversion}/signing_key.x509} +for module in $(find %{buildroot} -type f -name \*.ko); +do /usr/src/kernels/%{kversion}/scripts/sign-file \ + sha256 %{privkey} %{pubkey} $module; +done + +%clean +%{__rm} -rf %{buildroot} + +%changelog +* Wed Jun 03 2020 Steven Webster - 20.05-1 +- Initial RPM package, based on Starlingx iavf-kmod. \ No newline at end of file diff --git a/kernel-modules/intel-igb_uio/files/modules-load.conf b/kernel-modules/intel-igb_uio/files/modules-load.conf new file mode 100644 index 00000000..ed00839e --- /dev/null +++ b/kernel-modules/intel-igb_uio/files/modules-load.conf @@ -0,0 +1 @@ +igb-uio \ No newline at end of file