diff --git a/asus/zephyrus/ga402x/amdgpu/default.nix b/asus/zephyrus/ga402x/amdgpu/default.nix new file mode 100644 index 0000000..17103c5 --- /dev/null +++ b/asus/zephyrus/ga402x/amdgpu/default.nix @@ -0,0 +1,58 @@ +{ config, + lib, + pkgs, + ... +}: + +let + inherit (lib) mkDefault mkEnableOption mkIf mkMerge; + cfg = config.hardware.asus.zephyrus.ga402x; + +in { + imports = [ + ../shared.nix + ]; + + options.hardware.asus.zephyrus.ga402x.amdgpu = { + recovery.enable = (mkEnableOption "Enable amdgpu.gpu_recovery kernel boot param") // { default = false; }; + sg_display.enable = (mkEnableOption "Enable amdgpu.gpu_recovery kernel boot param") // { default = true; }; + psr.enable = (mkEnableOption "Enable amdgpu.dcdebugmask=0x10 kernel boot param") // { default = true; }; + }; + + config = mkMerge [ + { + # AMD RX680 + services.xserver.videoDrivers = mkDefault [ "amdgpu" ]; + + hardware = { + amdgpu.loadInInitrd = true; + opengl.extraPackages = with pkgs; [ + vaapiVdpau + libvdpau-va-gl + ]; + }; + } + + (mkIf cfg.amdgpu.recovery.enable { + # Hopefully fixes for where the kernel sometimes hangs when suspending or hibernating + # (Though, I'm very suspicious of the Mediatek Wifi...) + boot.kernelParams = [ + "amdgpu.gpu_recovery=1" + ]; + }) + + (mkIf (!cfg.amdgpu.sg_display.enable) { + # Can help solve flickering/glitching display issues since Scatter/Gather code was reenabled + boot.kernelParams = [ + "amdgpu.sg_display=0" + ]; + }) + + (mkIf (!cfg.amdgpu.psr.enable) { + # Can help solve flickering/glitching display issues since Scatter/Gather code was reenabled + boot.kernelParams = [ + "amdgpu.dcdebugmask=0x10" + ]; + }) + ]; +} diff --git a/asus/zephyrus/ga402x/default.nix b/asus/zephyrus/ga402x/default.nix new file mode 100644 index 0000000..7e49eb6 --- /dev/null +++ b/asus/zephyrus/ga402x/default.nix @@ -0,0 +1,15 @@ +## When using from a Flake, you can access these via imports of the attr key, e.g: +# +# imports = [ +# nixos-hardware.nixosModules.asus-zephyrus-ga402x.amdgpu +# ]; +# +## or: +# imports = [ +# nixos-hardware.nixosModules.asus-zephyrus-ga402x.nvidia +# ]; + +{ + amdgpu = import ./amdgpu; + nvidia = import ./nvidia; +} diff --git a/asus/zephyrus/ga402x/nvidia/default.nix b/asus/zephyrus/ga402x/nvidia/default.nix new file mode 100644 index 0000000..7a1a8c3 --- /dev/null +++ b/asus/zephyrus/ga402x/nvidia/default.nix @@ -0,0 +1,55 @@ +{ lib, + pkgs, + ... +}: + +let + inherit (lib) mkDefault; + +in { + imports = [ + ../shared.nix + ## "prime.nix" loads this, aleady: + # ../../../common/gpu/nvidia + ../../../../common/gpu/nvidia/prime.nix + ]; + + # NVIDIA GeForce RTX 4060 Mobile + + boot = { + blacklistedKernelModules = [ "nouveau" ]; + }; + + # Also in nvidia/default.nix + services.xserver.videoDrivers = mkDefault [ "nvidia" ]; + + hardware = { + ## Enable the Nvidia card, as well as Prime and Offload: + amdgpu.loadInInitrd = true; + opengl.extraPackages = with pkgs; [ + # Also in nvidia/default.nix + vaapiVdpau + libvdpau-va-gl + ]; + + nvidia = { + modesetting.enable = true; + nvidiaSettings = true; + + prime = { + offload = { + enable = true; + enableOffloadCmd = true; + }; + amdgpuBusId = "PCI:101:0:0"; + nvidiaBusId = "PCI:1:0:0"; + }; + + powerManagement = { + # This is unreliable on the 4060; works a few times, then hangs: + # enable = true; + # finegrained = true + }; + }; + }; +} diff --git a/asus/zephyrus/ga402x/shared.nix b/asus/zephyrus/ga402x/shared.nix new file mode 100644 index 0000000..5049d6e --- /dev/null +++ b/asus/zephyrus/ga402x/shared.nix @@ -0,0 +1,76 @@ +{ config, + pkgs, + lib, + ... +}: + +let + inherit (lib) mkDefault mkIf mkMerge version versionOlder; +in { + + imports = [ + ../../../common/cpu/amd + # Better power-savings from AMD PState: + ../../../common/cpu/amd/pstate.nix + ../../../common/gpu/amd + ../../../common/pc/laptop + ../../../common/pc/laptop/acpi_call.nix + ../../../common/pc/ssd + ]; + + config = mkMerge [ + { + # Configure basic system settings: + boot = { + kernelModules = [ "kvm-amd" ]; + kernelParams = [ + "mem_sleep_default=deep" + "pcie_aspm.policy=powersupersave" + ]; + }; + + services = { + asusd = { + enable = mkDefault true; + enableUserService = mkDefault true; + }; + + supergfxd.enable = true; + + udev = { + extraHwdb = '' + # Fixes mic mute button + evdev:name:*:dmi:bvn*:bvr*:bd*:svnASUS*:pn*:* + KEYBOARD_KEY_ff31007c=f20 + ''; + extraRules = '' + # Disable auto-suspend for the ASUS N-KEY Device, i.e. USB Keyboard + # Otherwise, it will tend to take 1-2 key-presses to wake-up after suspending + ACTION=="add", SUBSYSTEM=="usb", TEST=="power/autosuspend", ATTR{idVendor}=="0b05", ATTR{idProduct}=="19b6", ATTR{power/autosuspend}="-1" + ''; + }; + }; + } + + (mkIf (versionOlder version "23.11") { + # See https://asus-linux.org/wiki/nixos/ for info about some problems + # detecting the dGPU: + systemd.services.supergfxd.path = [ pkgs.pciutils ]; + }) + + (mkIf (config.networking.wireless.iwd.enable && config.networking.wireless.scanOnLowSignal) { + # Meditek doesn't seem to be quite sensitive enough on the default roaming settings: + # https://wiki.archlinux.org/title/Wpa_supplicant#Roaming + # https://wiki.archlinux.org/title/Iwd#iwd_keeps_roaming + # + # But NixOS doesn't have the tweaks for IWD, yet. + networking.wireless.iwd.settings = { + General = { + RoamThreshold = -75; + RoamThreshold5G = -80; + RoamRetryInterval = 20; + }; + }; + }) + ]; +}