Skip to content

Commit

Permalink
packages: add NVIDIA tesla 470 driver
Browse files Browse the repository at this point in the history
This commit adds the NVIDIA tesla 470 driver. The drivers are
subpackages of `kmod-5.10-nvidia`, since we don't want to have a spec
file per driver type per driver version. The spec file for
`kmod-5.10-nvidia` holds the drivers that are compatible with the 5.10
kernel. New spec files should be added for newer kernel and driver
versions.

The `kmod-5.10-nvidia` package provides a tmpfilesd conf file to create
the lib modules directory where the kernel modules will be created.

Each subpackage installs the libraries and binaries underneath
`%{_cross_bindir}/nvidia/<type>` and `%{_cross_libdir}/nvidia/<type>`
respectively to prevent collisions while building the subpackages.
Kernel module objects are installed in
`%{_cross_datadir}/nvidia/<type>/modules`, so that `driverdog` can
compile them at runtime.

Each subpackage provides a drop-in configuration file for containerd,
that sets the `NVIDIA_PATH` environment variable. This environment
variable must be set to the directory that contains the NVIDIA userland
tools, which will be mounted on the containers by `libnvidia-container`.
The environment variable is set for containerd, since
`libnvidia-container` is called by the runtime to set up the containers.

Signed-off-by: Arnaldo Garcia Rincon <agarrcia@amazon.com>
  • Loading branch information
arnaldo2792 committed Jan 24, 2022
1 parent ad7be21 commit 116efb1
Show file tree
Hide file tree
Showing 11 changed files with 276 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -11,3 +11,4 @@
/roles
/Licenses.toml
/licenses
*.run
24 changes: 24 additions & 0 deletions packages/kmod-5.10-nvidia/Cargo.toml
@@ -0,0 +1,24 @@
[package]
name = "kmod-5_10-nvidia"
version = "0.1.0"
edition = "2018"
publish = false
build = "build.rs"

[lib]
path = "pkg.rs"

[package.metadata.build-package]
package-name = "kmod-5.10-nvidia"

[[package.metadata.build-package.external-files]]
url = "https://us.download.nvidia.com/tesla/470.82.01/NVIDIA-Linux-x86_64-470.82.01.run"
sha512 = "86eac5e2d4fae5525a9332b77da58c0c12e76a35db023a2b14de7d9615b20ba4850a04fa189189c0dcf712f1f343fee98b954aaa6e9b83a959de3c3b8259c7c2"

[[package.metadata.build-package.external-files]]
url = "https://us.download.nvidia.com/tesla/470.82.01/NVIDIA-Linux-aarch64-470.82.01.run"
sha512 = "62c4adf6fa3c3474c3a09c08ed8056d4e9d00a90effa3851add10d6b2603c23f9986c32ace2e1b2ed7b735779430d634856a06e93af41431db439dfc79503cd8"

[build-dependencies]
glibc = { path = "../glibc" }
kernel-5_10 = { path = "../kernel-5.10" }
9 changes: 9 additions & 0 deletions packages/kmod-5.10-nvidia/build.rs
@@ -0,0 +1,9 @@
use std::process::{exit, Command};

fn main() -> Result<(), std::io::Error> {
let ret = Command::new("buildsys").arg("build-package").status()?;
if !ret.success() {
exit(1);
}
Ok(())
}
215 changes: 215 additions & 0 deletions packages/kmod-5.10-nvidia/kmod-5.10-nvidia.spec
@@ -0,0 +1,215 @@
%global nvidia_tesla_470_version 470.82.01
%global spdx_id %(bottlerocket-license-tool -l %{_builddir}/Licenses.toml spdx-id nvidia)
%global license_file %(bottlerocket-license-tool -l %{_builddir}/Licenses.toml path nvidia -p ./licenses)

Name: %{_cross_os}kmod-5.10-nvidia
Version: 1.0.0
Release: 1%{?dist}
Summary: NVIDIA drivers for the 5.10 kernel
# We use these licences because we only ship our own software in the main package,
# each subpackage includes the LICENSE file provided by the Licenses.toml file
License: Apache-2.0 OR MIT
URL: http://www.nvidia.com/

# NVIDIA .run scripts from 0 to 199
Source0: https://us.download.nvidia.com/tesla/%{nvidia_tesla_470_version}/NVIDIA-Linux-x86_64-%{nvidia_tesla_470_version}.run
Source1: https://us.download.nvidia.com/tesla/%{nvidia_tesla_470_version}/NVIDIA-Linux-aarch64-%{nvidia_tesla_470_version}.run

# Common NVIDIA conf files from 200 to 299
Source200: nvidia-tmpfiles.conf.in
Source202: nvidia-dependencies-modules-load.conf

# NVIDIA tesla conf files from 300 to 399
Source300: nvidia-tesla-tmpfiles.conf.in
Source301: nvidia-tesla-build-config.toml.in
Source302: nvidia-tesla-path.env.in
Source303: nvidia-ld.so.conf.in

BuildRequires: %{_cross_os}glibc-devel
BuildRequires: %{_cross_os}kernel-5.10-archive

%description
%{summary}.

%package tesla-470
Summary: NVIDIA 470 Tesla driver
Version: %{nvidia_tesla_470_version}
License: %{spdx_id}
Requires: %{name}

%description tesla-470
%{summary}

%prep
# Extract nvidia sources with `-x`, otherwise the script will try to install
# the driver in the current run
sh %{_sourcedir}/NVIDIA-Linux-%{_cross_arch}-%{nvidia_tesla_470_version}.run -x

%global kernel_sources %{_builddir}/kernel-devel
tar -xf %{_cross_datadir}/bottlerocket/kernel-devel.tar.xz

%build
pushd NVIDIA-Linux-%{_cross_arch}-%{nvidia_tesla_470_version}/kernel

# This recipe was based in the NVIDIA yum/dnf specs:
# https://github.com/NVIDIA/yum-packaging-precompiled-kmod

# We set IGNORE_CC_MISMATCH even though we are using the same compiler used to compile the kernel, if
# we don't set this flag the compilation fails
make %{?_smp_mflags} ARCH=%{_cross_karch} IGNORE_CC_MISMATCH=1 SYSSRC=%{kernel_sources} CC=%{_cross_target}-gcc LD=%{_cross_target}-ld

%{_cross_target}-strip -g --strip-unneeded nvidia/nv-interface.o
%{_cross_target}-strip -g --strip-unneeded nvidia-uvm.o
%{_cross_target}-strip -g --strip-unneeded nvidia-drm.o
%{_cross_target}-strip -g --strip-unneeded nvidia-peermem/nvidia-peermem.o
%{_cross_target}-strip -g --strip-unneeded nvidia-modeset/nv-modeset-interface.o

# We delete these files since we just stripped the input .o files above, and
# will be build at runtime in the host
rm nvidia{,-modeset,-peermem}.o

# Delete the .ko files created in make command, just to be safe that we
# don't include any linked module in the base image
rm nvidia{,-modeset,-peermem,-drm}.ko

popd

%install
install -d %{buildroot}%{_cross_libexecdir}
install -d %{buildroot}%{_cross_libdir}
install -d %{buildroot}%{_cross_tmpfilesdir}
install -d %{buildroot}%{_cross_unitdir}
install -d %{buildroot}%{_cross_factorydir}%{_cross_sysconfdir}/{drivers,ld.so.conf.d}

KERNEL_VERSION=$(cat %{kernel_sources}/include/config/kernel.release)
sed -e "s|__KERNEL_VERSION__|${KERNEL_VERSION}|" %{S:200} > nvidia.conf
install -p -m 0644 nvidia.conf %{buildroot}%{_cross_tmpfilesdir}

# Install modules-load.d drop-in to autoload required kernel modules
install -d %{buildroot}%{_cross_libdir}/modules-load.d
install -p -m 0644 %{S:202} %{buildroot}%{_cross_libdir}/modules-load.d/nvidia-dependencies.conf

# Begin NVIDIA tesla 470
pushd NVIDIA-Linux-%{_cross_arch}-%{nvidia_tesla_470_version}
# We install bins and libs in a versioned directory to prevent collisions with future drivers versions
install -d %{buildroot}%{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}
install -d %{buildroot}%{_cross_libdir}/nvidia/tesla/%{nvidia_tesla_470_version}/
install -d %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d
install -d %{buildroot}%{_cross_factorydir}/nvidia/tesla/%{nvidia_tesla_470_version}

sed -e 's|__NVIDIA_VERSION__|%{nvidia_tesla_470_version}|' %{S:300} > nvidia-tesla-%{nvidia_tesla_470_version}.conf
install -m 0644 nvidia-tesla-%{nvidia_tesla_470_version}.conf %{buildroot}%{_cross_tmpfilesdir}/
sed -e 's|__NVIDIA_MODULES__|%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/|' %{S:301} > \
nvidia-tesla-%{nvidia_tesla_470_version}.toml
install -m 0644 nvidia-tesla-%{nvidia_tesla_470_version}.toml %{buildroot}%{_cross_factorydir}%{_cross_sysconfdir}/drivers
# Install nvidia-path environment file, will be used as a drop-in for containerd.service since
# libnvidia-container locates and mounts helper binaries into the containers from either
# `PATH` or `NVIDIA_PATH`
sed -e 's|__NVIDIA_BINDIR__|%{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}|' %{S:302} > nvidia-path.env
install -m 0644 nvidia-path.env %{buildroot}%{_cross_factorydir}/nvidia/tesla/%{nvidia_tesla_470_version}
# We need to add `_cross_libdir/nvidia_tesla_470_version` to the paths loaded by the ldconfig service
# because libnvidia-container uses the `ldcache` file created by the service, to locate and mount the
# libraries into the containers
sed -e 's|__LIBDIR__|%{_cross_libdir}|' %{S:303} | sed -e 's|__NVIDIA_VERSION__|%{nvidia_tesla_470_version}|' \
> nvidia-tesla-%{nvidia_tesla_470_version}.conf
install -m 0644 nvidia-tesla-%{nvidia_tesla_470_version}.conf %{buildroot}%{_cross_factorydir}%{_cross_sysconfdir}/ld.so.conf.d/

# driver
install kernel/nvidia.mod.o %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d
install kernel/nvidia/nv-interface.o %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d
install kernel/nvidia/nv-kernel.o_binary %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nv-kernel.o

# uvm
install kernel/nvidia-uvm.mod.o %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d
install kernel/nvidia-uvm.o %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d

# modeset
install kernel/nvidia-modeset.mod.o %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d
install kernel/nvidia-modeset/nv-modeset-interface.o %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d
install kernel/nvidia-modeset/nv-modeset-kernel.o %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d

# peermem
install kernel/nvidia-peermem.mod.o %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d
install kernel/nvidia-peermem/nvidia-peermem.o %{buildroot}%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d

# drm
install kernel/nvidia-drm.mod.o %{buildroot}/%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d
install kernel/nvidia-drm.o %{buildroot}/%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d

install -m 755 nvidia-smi %{buildroot}%{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}
install -m 755 nvidia-debugdump %{buildroot}%{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}
install -m 755 nvidia-cuda-mps-control %{buildroot}%{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}
install -m 755 nvidia-cuda-mps-server %{buildroot}%{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}
%if "%{_cross_arch}" == "x86_64"
install -m 755 nvidia-ngx-updater %{buildroot}%{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}
%endif

# TODO: add remaining libraries
# misc
# Add libnvidia-ml.so for testing purposes
install -m755 libnvidia-ml.so.%{nvidia_tesla_470_version} %{buildroot}%{_cross_libdir}/nvidia/tesla/%{nvidia_tesla_470_version}

ln -s libnvidia-ml.so.%{nvidia_tesla_470_version} %{buildroot}%{_cross_libdir}/nvidia/tesla/%{nvidia_tesla_470_version}/libnvidia-ml.so.1

popd

%files
%{_cross_attribution_file}
%dir %{_cross_libexecdir}/nvidia
%dir %{_cross_libdir}/nvidia
%dir %{_cross_datadir}/nvidia
%dir %{_cross_libdir}/modules-load.d
%dir %{_cross_factorydir}%{_cross_sysconfdir}/drivers
%{_cross_tmpfilesdir}/nvidia.conf
%{_cross_libdir}/systemd/system/
%{_cross_libdir}/modules-load.d/nvidia-dependencies.conf

%files tesla-470
%license %{license_file}
%dir %{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}
%dir %{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}
%dir %{_cross_libdir}/nvidia/tesla/%{nvidia_tesla_470_version}
%dir %{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d
%dir %{_cross_factorydir}/nvidia/tesla/%{nvidia_tesla_470_version}

# Binaries
%{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}/nvidia-debugdump
%{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}/nvidia-smi

# Libraries
%{_cross_libdir}/nvidia/tesla/%{nvidia_tesla_470_version}/libnvidia-ml.so.1
%{_cross_libdir}/nvidia/tesla/%{nvidia_tesla_470_version}/libnvidia-ml.so.%{nvidia_tesla_470_version}

# Configuration files
%{_cross_factorydir}%{_cross_sysconfdir}/drivers/nvidia-tesla-%{nvidia_tesla_470_version}.toml
%{_cross_factorydir}%{_cross_sysconfdir}/ld.so.conf.d/nvidia-tesla-%{nvidia_tesla_470_version}.conf
%{_cross_factorydir}/nvidia/tesla/%{nvidia_tesla_470_version}/nvidia-path.env

# driver
%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nvidia.mod.o
%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nv-interface.o
%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nv-kernel.o

# uvm
%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nvidia-uvm.mod.o
%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nvidia-uvm.o

# modeset
%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nv-modeset-interface.o
%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nv-modeset-kernel.o
%{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nvidia-modeset.mod.o

# tmpfiles
%{_cross_tmpfilesdir}/nvidia-tesla-%{nvidia_tesla_470_version}.conf

# Neither nvidia-peermem nor nvidia-drm are included in driver container images, we exclude them
# for now, and we will add them if requested
%exclude %{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nvidia-peermem.mod.o
%exclude %{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nvidia-peermem.o
%exclude %{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nvidia-drm.mod.o
%exclude %{_cross_datadir}/nvidia/tesla/%{nvidia_tesla_470_version}/module-objects.d/nvidia-drm.o
%exclude %{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}/nvidia-cuda-mps-control
%exclude %{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}/nvidia-cuda-mps-server
%if "%{_cross_arch}" == "x86_64"
%exclude %{_cross_libexecdir}/nvidia/tesla/bin/%{nvidia_tesla_470_version}/nvidia-ngx-updater
%endif
@@ -0,0 +1,2 @@
i2c_core
ipmi_msghandler
1 change: 1 addition & 0 deletions packages/kmod-5.10-nvidia/nvidia-ld.so.conf.in
@@ -0,0 +1 @@
__LIBDIR__/nvidia/tesla/__NVIDIA_VERSION__/
18 changes: 18 additions & 0 deletions packages/kmod-5.10-nvidia/nvidia-tesla-build-config.toml.in
@@ -0,0 +1,18 @@
[nvidia-tesla]
lib-modules-path = "kernel/drivers/extra/video/nvidia/tesla"
objects-source = "__NVIDIA_MODULES__"

[nvidia-tesla.object-files."nvidia.o"]
link-objects = ["nv-interface.o", "nv-kernel.o"]

[nvidia-tesla.kernel-modules."nvidia.ko"]
link-objects = ["nvidia.o", "nvidia.mod.o"]

[nvidia-tesla.object-files."nvidia-modeset.o"]
link-objects = ["nv-modeset-interface.o", "nv-modeset-kernel.o"]

[nvidia-tesla.kernel-modules."nvidia-modeset.ko"]
link-objects = ["nvidia-modeset.o", "nvidia-modeset.mod.o"]

[nvidia-tesla.kernel-modules."nvidia-uvm.ko"]
link-objects = ["nvidia-uvm.o", "nvidia-uvm.mod.o"]
1 change: 1 addition & 0 deletions packages/kmod-5.10-nvidia/nvidia-tesla-path.env.in
@@ -0,0 +1 @@
NVIDIA_PATH=__NVIDIA_BINDIR__
3 changes: 3 additions & 0 deletions packages/kmod-5.10-nvidia/nvidia-tesla-tmpfiles.conf.in
@@ -0,0 +1,3 @@
C /etc/drivers/nvidia-tesla-__NVIDIA_VERSION__.toml
C /etc/containerd/nvidia.env - - - - /usr/share/factory/nvidia/tesla/__NVIDIA_VERSION__/nvidia-path.env
C /etc/ld.so.conf.d/nvidia-tesla-__NVIDIA_VERSION__.conf
1 change: 1 addition & 0 deletions packages/kmod-5.10-nvidia/nvidia-tmpfiles.conf.in
@@ -0,0 +1 @@
D /lib/modules/__KERNEL_VERSION__/kernel/drivers/extra/video/nvidia/tesla 0755 root root -
1 change: 1 addition & 0 deletions packages/kmod-5.10-nvidia/pkg.rs
@@ -0,0 +1 @@
// not used

0 comments on commit 116efb1

Please sign in to comment.