diff --git a/pkgbuild/mhwd-biglinux.install b/pkgbuild/mhwd-biglinux.install index a057170..3daec8f 100644 --- a/pkgbuild/mhwd-biglinux.install +++ b/pkgbuild/mhwd-biglinux.install @@ -1,7 +1,9 @@ post_install() { systemctl enable nvidia-manager-verify + systemctl enable mhwd-nvidia-hybrid-live } pre_remove() { systemctl disable nvidia-manager-verify + systemctl disable mhwd-nvidia-hybrid-live } diff --git a/usr/bin/biglinux-gpu-manager b/usr/bin/biglinux-gpu-manager index da4b089..95cc6fe 100755 --- a/usr/bin/biglinux-gpu-manager +++ b/usr/bin/biglinux-gpu-manager @@ -40,90 +40,106 @@ if echo "$devices" | grep -qiEw "VGA.*(AMD|ATI)"; then fi function removeModesetGrub { - if grep -q '.modeset=' /etc/default/grub; then - bbv_change_variable remove "/etc/default/grub" "GRUB_CMDLINE_LINUX_DEFAULT" "nvidia-drm.modeset" - bbv_change_variable remove "/etc/default/grub" "GRUB_CMDLINE_LINUX_DEFAULT" "i915.modeset" - bbv_change_variable remove "/etc/default/grub" "GRUB_CMDLINE_LINUX_DEFAULT" "nouveau.modeset" - bbv_change_variable remove "/etc/default/grub" "GRUB_CMDLINE_LINUX_DEFAULT" "radeon.modeset" - bbv_change_variable remove "/etc/default/grub" "GRUB_CMDLINE_LINUX_DEFAULT" "amdgpu.modeset" + if [[ -f /etc/default/grub ]] && grep -q '.modeset=' /etc/default/grub; then + sed -i 's/ *nvidia-drm\.modeset=[0-9]*//g' /etc/default/grub + sed -i 's/ *i915\.modeset=[0-9]*//g' /etc/default/grub + sed -i 's/ *nouveau\.modeset=[0-9]*//g' /etc/default/grub + sed -i 's/ *radeon\.modeset=[0-9]*//g' /etc/default/grub + sed -i 's/ *amdgpu\.modeset=[0-9]*//g' /etc/default/grub updateGrub=true echo 'Remove modeset in grub' fi } function addBlacklistNouveauGrub { + if [[ ! -f /etc/default/grub ]]; then + return + fi if ! grep -q 'rd.driver.blacklist=nouveau' /etc/default/grub; then - bbv_change_variable add "/etc/default/grub" "GRUB_CMDLINE_LINUX_DEFAULT" "rd.driver.blacklist=nouveau" + sed -i 's/\(GRUB_CMDLINE_LINUX_DEFAULT="[^"]*\)/\1 rd.driver.blacklist=nouveau/' /etc/default/grub updateGrub=true fi if ! grep -q 'modprobe.blacklist=nouveau' /etc/default/grub; then - bbv_change_variable add "/etc/default/grub" "GRUB_CMDLINE_LINUX_DEFAULT" "modprobe.blacklist=nouveau" + sed -i 's/\(GRUB_CMDLINE_LINUX_DEFAULT="[^"]*\)/\1 modprobe.blacklist=nouveau/' /etc/default/grub updateGrub=true fi } function removeBlacklistNouveauGrub { - + if [[ ! -f /etc/default/grub ]]; then + return + fi if grep -q 'rd.driver.blacklist=nouveau' /etc/default/grub; then - bbv_change_variable remove "/etc/default/grub" "GRUB_CMDLINE_LINUX_DEFAULT" "rd.driver.blacklist=nouveau" + sed -i 's/ *rd\.driver\.blacklist=nouveau//g' /etc/default/grub updateGrub=true fi - if ! grep -q 'modprobe.blacklist=nouveau' /etc/default/grub; then - bbv_change_variable remove "/etc/default/grub" "GRUB_CMDLINE_LINUX_DEFAULT" "modprobe.blacklist=nouveau" + if grep -q 'modprobe.blacklist=nouveau' /etc/default/grub; then + sed -i 's/ *modprobe\.blacklist=nouveau//g' /etc/default/grub updateGrub=true fi } function useIntelDriverInXorgForIntel { - if grep -q 'Driver "modesetting"' /usr/share/X11/xorg.conf.d/10-intel-nvidia-drm-outputclass.conf; then - sed -i 's|Driver "modesetting"|Driver "intel"|g' /usr/share/X11/xorg.conf.d/10-intel-nvidia-drm-outputclass.conf + local xorg_conf="/usr/share/X11/xorg.conf.d/10-intel-nvidia-drm-outputclass.conf" + if [[ -f "$xorg_conf" ]] && grep -q 'Driver "modesetting"' "$xorg_conf"; then + sed -i 's|Driver "modesetting"|Driver "intel"|g' "$xorg_conf" fi } function useModesettingDriverInXorgForIntel { - if grep -q 'Driver "intel"' /usr/share/X11/xorg.conf.d/10-intel-nvidia-drm-outputclass.conf; then - sed -i 's|Driver "intel"|Driver "modesetting"|g' /usr/share/X11/xorg.conf.d/10-intel-nvidia-drm-outputclass.conf + local xorg_conf="/usr/share/X11/xorg.conf.d/10-intel-nvidia-drm-outputclass.conf" + if [[ -f "$xorg_conf" ]] && grep -q 'Driver "intel"' "$xorg_conf"; then + sed -i 's|Driver "intel"|Driver "modesetting"|g' "$xorg_conf" fi } function initcpioEnableModesetNvidia { - if grep -q 'options *nvidia-drm *modeset=' /etc/modprobe.d/nvidia.conf; then - if grep '.*#.*options *nvidia-drm modeset=' /etc/modprobe.d/nvidia.conf; then - echo 'options nvidia-drm modeset=1' >> /etc/modprobe.d/nvidia.conf + local nvidia_conf="/etc/modprobe.d/nvidia.conf" + if [[ -f "$nvidia_conf" ]] && grep -q 'options *nvidia-drm *modeset=' "$nvidia_conf"; then + if grep -q '.*#.*options *nvidia-drm modeset=' "$nvidia_conf"; then + echo 'options nvidia-drm modeset=1' >> "$nvidia_conf" else - sed -i 's|nvidia-drm *modeset=[01]|nvidia-drm modeset=1|g' /etc/modprobe.d/nvidia.conf + sed -i 's|nvidia-drm *modeset=[01]|nvidia-drm modeset=1|g' "$nvidia_conf" fi else - echo 'options nvidia-drm modeset=1' >> /etc/modprobe.d/nvidia.conf + mkdir -p /etc/modprobe.d + echo 'options nvidia-drm modeset=1' >> "$nvidia_conf" fi } function initcpioDisableModesetNvidia { - if grep -q 'options *nvidia-drm *modeset=' /etc/modprobe.d/nvidia.conf; then - if grep '.*#.*options *nvidia-drm modeset=' /etc/modprobe.d/nvidia.conf; then - echo 'options nvidia-drm modeset=0' >> /etc/modprobe.d/nvidia.conf + local nvidia_conf="/etc/modprobe.d/nvidia.conf" + if [[ -f "$nvidia_conf" ]] && grep -q 'options *nvidia-drm *modeset=' "$nvidia_conf"; then + if grep -q '.*#.*options *nvidia-drm modeset=' "$nvidia_conf"; then + echo 'options nvidia-drm modeset=0' >> "$nvidia_conf" else - sed -i 's|nvidia-drm *modeset=[01]|nvidia-drm modeset=0|g' /etc/modprobe.d/nvidia.conf + sed -i 's|nvidia-drm *modeset=[01]|nvidia-drm modeset=0|g' "$nvidia_conf" fi else - echo 'options nvidia-drm modeset=0' >> /etc/modprobe.d/nvidia.conf + mkdir -p /etc/modprobe.d + echo 'options nvidia-drm modeset=0' >> "$nvidia_conf" fi } function initcpioEnablePageAttributeTable { - if grep -q 'options NVreg_UsePageAttributeTable=' /etc/modprobe.d/nvidia.conf; then - if grep '.*#.*options *NVreg_UsePageAttributeTable=' /etc/modprobe.d/nvidia.conf; then - echo 'options nvidia NVreg_UsePageAttributeTable=1 NVreg_InitializeSystemMemoryAllocations=0' >> /etc/modprobe.d/nvidia.conf + local nvidia_conf="/etc/modprobe.d/nvidia.conf" + mkdir -p /etc/modprobe.d + if [[ -f "$nvidia_conf" ]] && grep -q 'options NVreg_UsePageAttributeTable=' "$nvidia_conf"; then + if grep -q '.*#.*options *NVreg_UsePageAttributeTable=' "$nvidia_conf"; then + echo 'options nvidia NVreg_UsePageAttributeTable=1 NVreg_InitializeSystemMemoryAllocations=0' >> "$nvidia_conf" else - sed -i 's|NVreg_UsePageAttributeTable=[01]|NVreg_UsePageAttributeTable=1|g;s|NVreg_InitializeSystemMemoryAllocations=[01]|NVreg_InitializeSystemMemoryAllocations=0|g' /etc/modprobe.d/nvidia.conf + sed -i 's|NVreg_UsePageAttributeTable=[01]|NVreg_UsePageAttributeTable=1|g;s|NVreg_InitializeSystemMemoryAllocations=[01]|NVreg_InitializeSystemMemoryAllocations=0|g' "$nvidia_conf" fi else - echo 'options nvidia NVreg_UsePageAttributeTable=1 NVreg_InitializeSystemMemoryAllocations=0' >> /etc/modprobe.d/nvidia.conf + echo 'options nvidia NVreg_UsePageAttributeTable=1 NVreg_InitializeSystemMemoryAllocations=0' >> "$nvidia_conf" fi } function initcpioRemovePageAttributeTable { - sed 's|.*options nvidia NVreg_UsePageAttributeTable=[01] NVreg_InitializeSystemMemoryAllocations=[01].*||g' /etc/modprobe.d/nvidia.conf + local nvidia_conf="/etc/modprobe.d/nvidia.conf" + if [[ -f "$nvidia_conf" ]]; then + sed -i 's|.*options nvidia NVreg_UsePageAttributeTable=[01] NVreg_InitializeSystemMemoryAllocations=[01].*||g' "$nvidia_conf" + fi } function enableSwitcheroo { @@ -136,24 +152,52 @@ function enableSwitcheroo { } function autoInstallDriver { - mhwd -a pci nonfree 0300 + if command -v mhwd >/dev/null 2>&1; then + mhwd -a pci nonfree 0300 || echo 'mhwd auto-install failed' >&2 + else + echo 'mhwd not available' >&2 + fi } -function addInSddm { -xrandrNvidiaId=$(xrandr --listproviders | grep -i nvidia | sed -r 's/.*providers: ([0-9]*) .*/\1/') -if [[ $xrandrNvidiaId = 1 ]]; then - xrandrIntelId=0 -elif [[ $xrandrNvidiaId = 0 ]]; then - xrandrIntelId=1 -fi +function addInDisplayManager { + # Get xrandr provider IDs (may fail if no display is available) + local xrandrNvidiaId + xrandrNvidiaId=$(xrandr --listproviders 2>/dev/null | grep -i nvidia | sed -r 's/.*providers: ([0-9]*) .*/\1/' || true) -if [[ "$useGpu" = "Intel" ]]; then - commandToAddInSddm=$(echo "xrandr --setprovideroutputsource $xrandrIntelId $xrandrNvidiaId") -elif [[ "$useGpu" = "Nvidia" ]]; then - commandToAddInSddm=$(echo "xrandr --setprovideroutputsource $xrandrNvidiaId $xrandrIntelId") -fi - sed -i 's|.*xrandr *--setprovideroutputsource.*||g' /usr/share/sddm/scripts/Xsetup - echo "$commandToAddInSddm" >> /usr/share/sddm/scripts/Xsetup + if [[ -z "$xrandrNvidiaId" ]]; then + echo 'xrandr providers not available (no display), skipping DM configuration' >&2 + return + fi + + local xrandrIntelId + if [[ "$xrandrNvidiaId" = 1 ]]; then + xrandrIntelId=0 + elif [[ "$xrandrNvidiaId" = 0 ]]; then + xrandrIntelId=1 + else + return + fi + + local commandToAdd + if [[ "$useGpu" = "Intel" ]]; then + commandToAdd="xrandr --setprovideroutputsource $xrandrIntelId $xrandrNvidiaId" + elif [[ "$useGpu" = "Nvidia" ]]; then + commandToAdd="xrandr --setprovideroutputsource $xrandrNvidiaId $xrandrIntelId" + fi + + # SDDM + if [[ -f /usr/share/sddm/scripts/Xsetup ]]; then + sed -i 's|.*xrandr *--setprovideroutputsource.*||g' /usr/share/sddm/scripts/Xsetup + echo "$commandToAdd" >> /usr/share/sddm/scripts/Xsetup + fi + + # LightDM + if [[ -f /etc/lightdm/lightdm.conf ]]; then + mkdir -p /etc/lightdm + echo "#!/bin/bash" > /etc/lightdm/display_setup.sh + echo "$commandToAdd" >> /etc/lightdm/display_setup.sh + chmod +x /etc/lightdm/display_setup.sh + fi } function installIntelXorgPkg { @@ -176,7 +220,7 @@ if [[ $gpuIntel && $gpuNvidia && -z $biglinuxGpuMode || $gpuIntel && $gpuNvidia addBlacklistNouveauGrub useIntelDriverInXorgForIntel enableSwitcheroo - useGpu=Intel addInSddm + useGpu=Intel addInDisplayManager if $updateGrub; then update-grub fi @@ -195,7 +239,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-2" ]]; then addBlacklistNouveauGrub useIntelDriverInXorgForIntel enableSwitcheroo - useGpu=Intel addInSddm + useGpu=Intel addInDisplayManager if $updateGrub; then update-grub fi @@ -213,7 +257,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-3" ]]; then addBlacklistNouveauGrub useModesettingDriverInXorgForIntel enableSwitcheroo - useGpu=Intel addInSddm + useGpu=Intel addInDisplayManager if $updateGrub; then update-grub fi @@ -231,7 +275,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-4" ]]; then addBlacklistNouveauGrub useModesettingDriverInXorgForIntel enableSwitcheroo - useGpu=Intel addInSddm + useGpu=Intel addInDisplayManager if $updateGrub; then update-grub fi @@ -249,7 +293,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-5" ]]; then addBlacklistNouveauGrub useModesettingDriverInXorgForIntel enableSwitcheroo - useGpu=Intel addInSddm + useGpu=Intel addInDisplayManager if $updateGrub; then update-grub fi @@ -267,7 +311,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-6" ]]; then addBlacklistNouveauGrub useModesettingDriverInXorgForIntel enableSwitcheroo - useGpu=Intel addInSddm + useGpu=Intel addInDisplayManager if $updateGrub; then update-grub fi @@ -286,7 +330,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-7" ]]; then installIntelXorgPkg useIntelDriverInXorgForIntel enableSwitcheroo - useGpu=Intel addInSddm + useGpu=Intel addInDisplayManager if $updateGrub; then update-grub fi @@ -305,7 +349,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-8" ]]; then installIntelXorgPkg useIntelDriverInXorgForIntel enableSwitcheroo - useGpu=Intel addInSddm + useGpu=Intel addInDisplayManager if $updateGrub; then update-grub fi @@ -329,7 +373,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-9" ]]; then addBlacklistNouveauGrub useIntelDriverInXorgForIntel enableSwitcheroo - useGpu=Nvidia addInSddm + useGpu=Nvidia addInDisplayManager if $updateGrub; then update-grub fi @@ -348,7 +392,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-10" ]]; then addBlacklistNouveauGrub useIntelDriverInXorgForIntel enableSwitcheroo - useGpu=Nvidia addInSddm + useGpu=Nvidia addInDisplayManager if $updateGrub; then update-grub fi @@ -366,7 +410,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-11" ]]; then addBlacklistNouveauGrub useModesettingDriverInXorgForIntel enableSwitcheroo - useGpu=Nvidia addInSddm + useGpu=Nvidia addInDisplayManager if $updateGrub; then update-grub fi @@ -384,7 +428,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-12" ]]; then addBlacklistNouveauGrub useModesettingDriverInXorgForIntel enableSwitcheroo - useGpu=Nvidia addInSddm + useGpu=Nvidia addInDisplayManager if $updateGrub; then update-grub fi @@ -402,7 +446,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-13" ]]; then addBlacklistNouveauGrub useModesettingDriverInXorgForIntel enableSwitcheroo - useGpu=Nvidia addInSddm + useGpu=Nvidia addInDisplayManager if $updateGrub; then update-grub fi @@ -420,7 +464,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-14" ]]; then addBlacklistNouveauGrub useModesettingDriverInXorgForIntel enableSwitcheroo - useGpu=Nvidia addInSddm + useGpu=Nvidia addInDisplayManager if $updateGrub; then update-grub fi @@ -439,7 +483,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-15" ]]; then installIntelXorgPkg useIntelDriverInXorgForIntel enableSwitcheroo - useGpu=Nvidia addInSddm + useGpu=Nvidia addInDisplayManager if $updateGrub; then update-grub fi @@ -458,7 +502,7 @@ elif [[ $gpuIntel && $gpuNvidia && "$1" = "mode-16" ]]; then installIntelXorgPkg useIntelDriverInXorgForIntel enableSwitcheroo - useGpu=Nvidia addInSddm + useGpu=Nvidia addInDisplayManager if $updateGrub; then update-grub fi diff --git a/usr/bin/mhwd-nvidia-hybrid-live b/usr/bin/mhwd-nvidia-hybrid-live new file mode 100755 index 0000000..74b67dd --- /dev/null +++ b/usr/bin/mhwd-nvidia-hybrid-live @@ -0,0 +1,119 @@ +#!/usr/bin/env bash +set -euo pipefail + +#------------------------------------------------------------------------------- +# mhwd-nvidia-hybrid-live +# Configure NVIDIA hybrid GPU (Intel/NVIDIA) in live boot environment +# Part of mhwd-biglinux package +#------------------------------------------------------------------------------- + +LOG_TAG="mhwd-nvidia-hybrid-live" + +log_info() { + echo "${LOG_TAG}: $1" +} + +log_error() { + echo "${LOG_TAG}: ERROR: $1" >&2 +} + +# Only run in live mode +if [[ ! -e /livefs-pkgs.txt ]]; then + log_info "Not in live mode, exiting" + exit 0 +fi + +# Detect GPUs +vga_list=$(lspci 2>/dev/null | grep -iE "VGA|3D|Display" || true) + +has_intel=false +has_nvidia=false + +if echo "$vga_list" | grep -qi intel; then + has_intel=true +fi + +if echo "$vga_list" | grep -qi nvidia; then + has_nvidia=true +fi + +# Only proceed for hybrid Intel/NVIDIA systems +if ! $has_intel || ! $has_nvidia; then + log_info "Not a hybrid Intel/NVIDIA system, exiting" + exit 0 +fi + +log_info "Hybrid Intel/NVIDIA GPU detected" +log_info "Intel: $(echo "$vga_list" | grep -i intel)" +log_info "NVIDIA: $(echo "$vga_list" | grep -i nvidia)" + +# Check if nvidia module is already loaded +if lsmod | grep -q '^nvidia '; then + log_info "NVIDIA module already loaded, skipping installation" +else + # Install hybrid driver via mhwd if available + if command -v mhwd >/dev/null 2>&1; then + # Check if a hybrid intel-nvidia configuration is available + if mhwd -la 2>/dev/null | grep -q 'hybrid-intel-nvidia.*prime'; then + log_info "Installing NVIDIA hybrid driver via mhwd" + if mhwd -a pci nonfree 0300 2>&1; then + log_info "NVIDIA hybrid driver installed successfully via mhwd" + else + log_error "mhwd auto-install failed, trying manual modprobe" + modprobe nvidia-drm 2>/dev/null || true + modprobe nvidia-modeset 2>/dev/null || true + modprobe nvidia-uvm 2>/dev/null || true + fi + else + log_info "No hybrid-intel-nvidia-prime config available in mhwd" + modprobe nvidia-drm 2>/dev/null || true + fi + else + log_info "mhwd not available, trying manual modprobe" + modprobe nvidia-drm 2>/dev/null || true + fi +fi + +# Ensure modprobe configuration exists +if [[ ! -f /etc/modprobe.d/nvidia.conf ]]; then + echo "options nvidia-drm modeset=1" > /etc/modprobe.d/nvidia.conf + log_info "Created /etc/modprobe.d/nvidia.conf with modeset=1" +fi + +# Fix DRI device permissions for live session +if [[ -e /dev/dri/renderD128 ]]; then + chmod 666 /dev/dri/renderD* 2>/dev/null || true + log_info "Fixed DRI device permissions" +fi + +# Enable and start switcheroo-control +if command -v switcherooctl >/dev/null 2>&1 || [[ -f /usr/lib/systemd/system/switcheroo-control.service ]]; then + if ! systemctl -q is-active switcheroo-control 2>/dev/null; then + systemctl enable --now switcheroo-control 2>/dev/null || true + log_info "switcheroo-control enabled and started" + fi +fi + +# Create drirc for performance +if [[ ! -f /etc/drirc ]]; then + cat > /etc/drirc <<'DRIRC' + + + + +DRIRC + log_info "Created /etc/drirc" +fi + +# Verify result +if lsmod | grep -q '^nvidia '; then + log_info "SUCCESS: NVIDIA module is loaded" + if command -v nvidia-smi >/dev/null 2>&1; then + log_info "nvidia-smi available: $(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null || echo 'query failed')" + fi +else + log_info "WARNING: NVIDIA module could not be loaded. System will use nouveau/modesetting" +fi + +exit 0 diff --git a/usr/bin/mhwd-verify-hybrid-boot b/usr/bin/mhwd-verify-hybrid-boot index 65ade14..d4a961b 100755 --- a/usr/bin/mhwd-verify-hybrid-boot +++ b/usr/bin/mhwd-verify-hybrid-boot @@ -1,61 +1,47 @@ #!/usr/bin/env bash #------------------------------------------------------------------------------- -# Fix video device permission in live mode, added in 2026/01/28 to fix nvidia proprietary driver +# mhwd-verify-hybrid-boot +# Verify and configure hybrid GPU setup during boot +# Part of mhwd-biglinux package #------------------------------------------------------------------------------- -if [ -e "/livefs-pkgs.txt" ]; then - sudo chmod 666 /dev/dri/renderD* + +# Fix video device permission in live mode +if [[ -e /livefs-pkgs.txt ]]; then + chmod 666 /dev/dri/renderD* 2>/dev/null || true fi -# verify if switcheroo is enabled -if ! systemctl -q is-enabled switcheroo-control; then - vgaList=$(lspci | grep -iE "VGA|3D|Display") - if [[ $(echo $vgaList | grep -i nvidia) ]] && [[ $(echo "$vgaList" | wc -l) > 1 ]]; then - if grep 'bignvidia=1' /proc/cmdline; then - biglinux-gpu-manager mode-1 - elif grep 'bignvidia=2' /proc/cmdline; then - biglinux-gpu-manager mode-2 - elif grep 'bignvidia=3' /proc/cmdline; then - biglinux-gpu-manager mode-3 - elif grep 'bignvidia=4' /proc/cmdline; then - biglinux-gpu-manager mode-4 - elif grep 'bignvidia=5' /proc/cmdline; then - biglinux-gpu-manager mode-5 - elif grep 'bignvidia=6' /proc/cmdline; then - biglinux-gpu-manager mode-6 - elif grep 'bignvidia=7' /proc/cmdline; then - biglinux-gpu-manager mode-7 - elif grep 'bignvidia=8' /proc/cmdline; then - biglinux-gpu-manager mode-8 - elif grep 'bignvidia=9' /proc/cmdline; then - biglinux-gpu-manager mode-9 - elif grep 'bignvidia=10' /proc/cmdline; then - biglinux-gpu-manager mode-10 - elif grep 'bignvidia=11' /proc/cmdline; then - biglinux-gpu-manager mode-11 - elif grep 'bignvidia=12' /proc/cmdline; then - biglinux-gpu-manager mode-12 - elif grep 'bignvidia=13' /proc/cmdline; then - biglinux-gpu-manager mode-13 - elif grep 'bignvidia=14' /proc/cmdline; then - biglinux-gpu-manager mode-14 - elif grep 'bignvidia=15' /proc/cmdline; then - biglinux-gpu-manager mode-15 - elif grep 'bignvidia=16' /proc/cmdline; then - biglinux-gpu-manager mode-16 +# Verify if switcheroo is enabled +if ! systemctl -q is-enabled switcheroo-control 2>/dev/null; then + vgaList=$(lspci 2>/dev/null | grep -iE "VGA|3D|Display" || true) + vgaCount=$(echo "$vgaList" | wc -l) + + if echo "$vgaList" | grep -qi nvidia && [[ "$vgaCount" -gt 1 ]]; then + # Parse bignvidia= mode from kernel cmdline + bignvidia_mode="" + if grep -qoP 'bignvidia=\K[0-9]+' /proc/cmdline 2>/dev/null; then + bignvidia_mode=$(grep -oP 'bignvidia=\K[0-9]+' /proc/cmdline) + fi + + if [[ -n "$bignvidia_mode" ]] && [[ "$bignvidia_mode" -ge 1 ]] && [[ "$bignvidia_mode" -le 16 ]]; then + biglinux-gpu-manager "mode-${bignvidia_mode}" else biglinux-gpu-manager fi - systemctl enable --now switcheroo-control - echo ' + systemctl enable --now switcheroo-control 2>/dev/null || true + + if [[ ! -f /etc/drirc ]]; then + cat > /etc/drirc <<'DRIRC' + - ' > /etc/drirc - -# elif grep -Eiq '(VGA|3d).*(radeon|amd|ati)' <(lspci); then - elif [[ $(echo $vgaList | grep -Ei '(VGA|3D|Display).*(radeon|amd|ati)') ]] && [[ $(echo "$vgaList" | wc -l) > 1 ]]; then - systemctl enable --now switcheroo-control + +DRIRC + fi + + elif echo "$vgaList" | grep -Eiq '(VGA|3D|Display).*(radeon|amd|ati)' && [[ "$vgaCount" -gt 1 ]]; then + systemctl enable --now switcheroo-control 2>/dev/null || true fi fi diff --git a/usr/lib/systemd/system/mhwd-nvidia-hybrid-live.service b/usr/lib/systemd/system/mhwd-nvidia-hybrid-live.service new file mode 100644 index 0000000..9e7ae68 --- /dev/null +++ b/usr/lib/systemd/system/mhwd-nvidia-hybrid-live.service @@ -0,0 +1,13 @@ +[Unit] +Description=Configure NVIDIA Hybrid GPU in Live Mode +ConditionPathExists=/livefs-pkgs.txt +Before=display-manager.service gdm.service sddm.service lightdm.service +After=systemd-modules-load.service systemd-udevd.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/bin/mhwd-nvidia-hybrid-live + +[Install] +WantedBy=graphical.target