diff options
Diffstat (limited to 'modules.d/slx-drm/hooks/s3-activate-nvidia-drivers.sh')
-rwxr-xr-x | modules.d/slx-drm/hooks/s3-activate-nvidia-drivers.sh | 42 |
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 +: |