From 5aa4c65254a07c9809598ba01d1a0056e78a455a Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Thu, 1 Oct 2026 13:07:07 +0200 Subject: [PATCH] fix: NVIDIA fix checks the edit and the generated boot entries for every boot loader (limine.conf, systemd-boot entries, grub.cfg) --- lib/nvidia.sh | 23 ++++++++++++++++++++--- tests/nvidia-test.sh | 9 +++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/nvidia.sh b/lib/nvidia.sh index ad0b89e..947652f 100644 --- a/lib/nvidia.sh +++ b/lib/nvidia.sh @@ -69,6 +69,20 @@ nvidia_rebuild_boot() { esac } +nvidia_boot_has_params() { + # 0 when the generated boot entries carry the parameters (or can't be + # checked): limine.conf, systemd-boot's entries, grub.cfg. + local target + case "$1" in + */limine) target="${NVIDIA_LIMINE_CONF:-/boot/limine.conf}" ;; + */sdboot-manage.conf) target="${NVIDIA_SDBOOT_DIR:-/boot/loader/entries}" ;; + */grub) target="${NVIDIA_GRUB_CFG:-/boot/grub/grub.cfg}" ;; + *) return 0 ;; + esac + sudo test -e "$target" || return 0 + sudo grep -rqs 'nvidia-drm.modeset=1' "$target" +} + nvidia_enable() { nvidia_present || return 0 local f changed=0 p; f="$(nvidia_boot_file)" @@ -86,6 +100,10 @@ nvidia_enable() { */grub) sudo sed -i -E "s/^(GRUB_CMDLINE_LINUX_DEFAULT=\"[^\"]*)\"/\1 $NVIDIA_PARAMS\"/" "$f" ;; esac + if ! grep -q "nvidia-drm.fbdev=1" "$f"; then + err "Couldn't add the NVIDIA parameters to $f (no kernel command line setting in it): add '$NVIDIA_PARAMS' yourself." + return 1 + fi changed=1 fi fi @@ -98,9 +116,8 @@ nvidia_enable() { fi if [[ $changed == 1 ]]; then nvidia_rebuild_boot || { err "Rebuilding the boot entries failed."; return 1; } - if [[ "$f" == */limine && -f "${NVIDIA_LIMINE_CONF:-/boot/limine.conf}" ]] && - ! grep -q 'nvidia-drm.modeset=1' "${NVIDIA_LIMINE_CONF:-/boot/limine.conf}"; then - err "The boot entries don't have the NVIDIA parameters: the initramfs build failed (see above)." + if ! nvidia_boot_has_params "$f"; then + err "The boot entries don't have the NVIDIA parameters: the initramfs or boot entry build failed (see above)." return 1 fi ok "NVIDIA gaming mode fix applied; it takes effect after a reboot." diff --git a/tests/nvidia-test.sh b/tests/nvidia-test.sh index ff35623..d908b04 100644 --- a/tests/nvidia-test.sh +++ b/tests/nvidia-test.sh @@ -21,6 +21,7 @@ echo 0x2c02 > "$T/drm/card1/device/device" NVIDIA_DRM_DIR="$T/drm" mkdir -p "$T/mods/6.1.0-cachyos/kernel"; : > "$T/mods/6.1.0-cachyos/kernel/nvidia-drm.ko.zst" NVIDIA_MODULES_DIR="$T/mods" +NVIDIA_LIMINE_CONF="$T/none/limine.conf"; NVIDIA_SDBOOT_DIR="$T/none/entries"; NVIDIA_GRUB_CFG="$T/none/grub.cfg" # not generated here: not checked FAKE_DRIVER=1; check "finds the NVIDIA card as card1 beside an iGPU" nvidia_present FAKE_DRIVER=0; check "skips when the driver isn't installed" '! nvidia_present' @@ -50,6 +51,14 @@ mkdir -p "$T/mods/6.6.0-lts/kernel"; F="$T/sdboot-manage.conf"; printf 'LINUX_OP nvidia_boot_file() { echo "$F"; }; rm -f "$NVIDIA_INITRAMFS_CONF"; REBUILDS=0; nvidia_enable check "kernel without nvidia modules: no drop-in, parameters set" '[[ ! -f "$NVIDIA_INITRAMFS_CONF" ]] && grep -q "nvidia-drm.fbdev=1" "$F"' rm -rf "$T/mods/6.6.0-lts" +# Generated boot entries without the parameters (the initramfs build failed): an error. +printf 'linux /vmlinuz root=/dev/sda1\n' > "$T/grub.cfg"; NVIDIA_GRUB_CFG="$T/grub.cfg" +F="$T/grub"; printf 'GRUB_CMDLINE_LINUX_DEFAULT="quiet"\n' > "$F"; nvidia_boot_file() { echo "$F"; }; rm -f "$NVIDIA_INITRAMFS_CONF" +check "boot entries without the parameters: error" '! nvidia_enable >/dev/null' +NVIDIA_GRUB_CFG="$T/none/grub.cfg" +# A config file without the setting to edit: an error, not "applied". +F="$T/sdboot-manage.conf"; printf '#LINUX_OPTIONS=""\n' > "$F"; nvidia_boot_file() { echo "$F"; }; REBUILDS=0 +check "no setting to edit: error, nothing rebuilt" '! nvidia_enable >/dev/null && [[ $REBUILDS == 0 ]]' FAKE_DRIVER=0; printf 'LINUX_OPTIONS="quiet"\n' > "$T/sdboot"; F="$T/sdboot"; REBUILDS=0; nvidia_enable check "no NVIDIA driver: nothing touched" '[[ "$(cat "$F")" == "LINUX_OPTIONS=\"quiet\"" && $REBUILDS == 0 ]]' exit $fail