summaryrefslogtreecommitdiffstats
path: root/modules.d/slx-drm/hooks/s3-activate-nvidia-drivers.sh
diff options
context:
space:
mode:
Diffstat (limited to 'modules.d/slx-drm/hooks/s3-activate-nvidia-drivers.sh')
-rwxr-xr-xmodules.d/slx-drm/hooks/s3-activate-nvidia-drivers.sh42
1 files changed, 42 insertions, 0 deletions
diff --git a/modules.d/slx-drm/hooks/s3-activate-nvidia-drivers.sh b/modules.d/slx-drm/hooks/s3-activate-nvidia-drivers.sh
new file mode 100755
index 00000000..00c2334a
--- /dev/null
+++ b/modules.d/slx-drm/hooks/s3-activate-nvidia-drivers.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+type emergency_shell >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+detect_nvidia_cards() {
+ # hard check on nvidia graphic cards
+ local cards="$( lspci -n | grep -o ' 03..: 10de:....' | awk '{print $2}' )"
+ if ! [ -d "/drm.cfg.d" ] && [ -n "$cards" ]; then
+ warn "Failed to find '/drm.cfg.d', but have nvidia cards - will try nouveau."
+ return 1
+ fi
+ for card in $cards; do
+ local driver="$(awk '$1 = /'"$card"'/ {print $2; exit}' /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
+ warn "'$driver_target' exists, will not overwrite!"
+ return 1
+ fi
+ # all good, move it over
+ if ! mv "$driver_dir" "$driver_target" 2>&1; then
+ warn "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
+ warn "Failed to run depmod, udev won't see the nvidia modules."
+ return 1
+ fi
+ # blacklist nouveau
+ echo 'blacklist nouveau' > "/lib/modprobe.d/disable-nouveau.conf"
+ info "Initialized nvidia drivers."
+ return 0
+ done
+}
+
+detect_nvidia_cards
+: