summaryrefslogtreecommitdiffstats
path: root/builder
diff options
context:
space:
mode:
authorJonathan Bauer2019-08-05 16:48:43 +0200
committerJonathan Bauer2019-08-05 16:48:43 +0200
commit70af22a0a0ea592a4d8eaa4860aa94f866842f87 (patch)
treedaf4b78867e0b14ca5df6cfcb93da78071b37b8e /builder
parentformatting round 1 (diff)
downloadsystemd-init-70af22a0a0ea592a4d8eaa4860aa94f866842f87.tar.gz
systemd-init-70af22a0a0ea592a4d8eaa4860aa94f866842f87.tar.xz
systemd-init-70af22a0a0ea592a4d8eaa4860aa94f866842f87.zip
[slx-drm] support for multiple nvidia versions
Diffstat (limited to 'builder')
-rw-r--r--builder/modules.d/slx-drm/data/nvidia-nouveau-fallback.conf2
-rw-r--r--builder/modules.d/slx-drm/hooks/activate-nvidia-drivers.sh37
-rw-r--r--builder/modules.d/slx-drm/hooks/copy-nvidia-drivers.sh28
-rwxr-xr-xbuilder/modules.d/slx-drm/module-setup.sh4
4 files changed, 67 insertions, 4 deletions
diff --git a/builder/modules.d/slx-drm/data/nvidia-nouveau-fallback.conf b/builder/modules.d/slx-drm/data/nvidia-nouveau-fallback.conf
deleted file mode 100644
index 76b0793f..00000000
--- a/builder/modules.d/slx-drm/data/nvidia-nouveau-fallback.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-install nouveau [ -e /sys/module/nvidia ] || { /sbin/modprobe --ignore-install nvidia || /sbin/modprobe --ignore-install nouveau $CMDLINE_OPTS ; }
-install nvidia /sbin/modprobe --ignore-install nvidia $CMDLINE_OPTS || /sbin/modprobe --ignore-install nouveau
diff --git a/builder/modules.d/slx-drm/hooks/activate-nvidia-drivers.sh b/builder/modules.d/slx-drm/hooks/activate-nvidia-drivers.sh
new file mode 100644
index 00000000..ae6c3e26
--- /dev/null
+++ b/builder/modules.d/slx-drm/hooks/activate-nvidia-drivers.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+detect_nvidia_cards() {
+ # hard check on nvidia graphic cards
+ local cards="$(lspci | grep 'Class 0300: 10de:' | awk '{print $4}')"
+ if ! [ -d "/drm.cfg.d" ] && [ -n $cards]; then
+ echo "Failed"
+ return 1
+ fi
+ for card in $cards; do
+ local driver="$(awk '$1 = /'"$card"'/ {print $2}' /drm.cfg.d/*)"
+ [ -z "$driver" ] && continue
+ driver="${driver//@/}"
+ driver="${driver//-/\/}"
+ local driver_dir="/lib/modules/${driver}"
+ [ -d "$driver_dir" ] || continue
+ local driver_target="/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/nvidia"
+ if [ -d "$driver_target" ]; then
+ echo "'$driver_target' exists, will overwrite!"
+ rm -rf -- "$driver_target"
+ fi
+ # all good, move it over
+ if ! mv "$driver_dir" "$driver_target" 2>&1; then
+ echo "Failed to move '$driver_dir' to '$driver_target'."
+ return 1
+ fi
+ # finally run depmod to make it visible to udev
+ if ! depmod -a 2>&1 ; then
+ echo "Failed to run depmod, udev won't see the nvidia modules."
+ return 1
+ fi
+ return 0
+ done
+}
+
+detect_nvidia_cards
+:
diff --git a/builder/modules.d/slx-drm/hooks/copy-nvidia-drivers.sh b/builder/modules.d/slx-drm/hooks/copy-nvidia-drivers.sh
new file mode 100644
index 00000000..9442db57
--- /dev/null
+++ b/builder/modules.d/slx-drm/hooks/copy-nvidia-drivers.sh
@@ -0,0 +1,28 @@
+#!/bin/ash
+#
+# This script checks whether the nvidia kernel module was loaded by udev
+# and copies the kernel modules over to stage4 and disables nouveau
+
+type emergency_shell >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+copy_nvidia_modules() {
+ local nvidia_moddir="/lib/modules/\$(uname -r)/kernel/drivers/gpu/drm/nvidia"
+ if [ -d "${NEWROOT}/${nvidia_moddir}" ]; then
+ warn "Stage4 contains nvidia driver which would be overwritten - skipping."
+ return 1
+ fi
+ if ! ( cp -r "$nvidia_moddir" "${NEWROOT}/${nvidia_moddir}" \
+ && depmod -a -b "$NEWROOT" ); then
+ warn "Failed to copy/depmod nvidia modules to stage4."
+ return 1
+ fi
+ # nouveau driver would needlessly load, prevent that
+ mkdir -p "${NEWROOT}/etc/modprobe.d" # cause why not
+ echo "blacklist nouveau" > "${NEWROOT}/etc/modprobe.d/disable-nouveau.conf"
+ return 0
+}
+
+if lsmod | grep -q nvidia; then
+ copy_nvidia_modules
+fi
+: # fake success
diff --git a/builder/modules.d/slx-drm/module-setup.sh b/builder/modules.d/slx-drm/module-setup.sh
index 8530b2d0..5637e8c1 100755
--- a/builder/modules.d/slx-drm/module-setup.sh
+++ b/builder/modules.d/slx-drm/module-setup.sh
@@ -11,6 +11,6 @@ installkernel() {
instmods acpi_ipmi
}
install() {
- mkdir -p "$initdir/etc/modprobe.d"
- cp "$moddir/data/nvidia-nouveau-fallback.conf" "$initdir/etc/modprobe.d"
+ inst_hook pre-udev 10 "${moddir}/hooks/activate-nvidia-drivers.sh"
+ inst_hook pre-pivot 50 "${moddir}/hooks/copy-nvidia-drivers.sh"
}