From 6d14e4fa24d95055fac5776faa8f96d1372755fc Mon Sep 17 00:00:00 2001 From: blahai Date: Mon, 17 Feb 2025 20:55:18 +0200 Subject: [PATCH] add hardware modules --- modules/nixos/default.nix | 4 +- modules/nixos/hardware/cpu/amd.nix | 17 ++++++ modules/nixos/hardware/cpu/default.nix | 18 +++++++ modules/nixos/hardware/default.nix | 7 +++ modules/nixos/hardware/firmware.nix | 2 + modules/nixos/hardware/gpu/amd.nix | 24 +++++++++ modules/nixos/hardware/gpu/default.nix | 19 +++++++ modules/nixos/hardware/gpu/novideo.nix | 75 ++++++++++++++++++++++++++ 8 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 modules/nixos/hardware/cpu/amd.nix create mode 100644 modules/nixos/hardware/cpu/default.nix create mode 100644 modules/nixos/hardware/default.nix create mode 100644 modules/nixos/hardware/firmware.nix create mode 100644 modules/nixos/hardware/gpu/amd.nix create mode 100644 modules/nixos/hardware/gpu/default.nix create mode 100644 modules/nixos/hardware/gpu/novideo.nix diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index e6abbfe..bafbeed 100644 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -1,6 +1,8 @@ { imports = [ - ./remote-modules.nix ./boot + ./hardware + + ./remote-modules.nix ]; } diff --git a/modules/nixos/hardware/cpu/amd.nix b/modules/nixos/hardware/cpu/amd.nix new file mode 100644 index 0000000..6417600 --- /dev/null +++ b/modules/nixos/hardware/cpu/amd.nix @@ -0,0 +1,17 @@ +{ + config, + lib, + ... +}: let + inherit (config.olympus) device; + inherit (lib.modules) mkIf; +in { + config = mkIf (device.cpu == "amd" || device.cpu == "vm-amd") { + hardware.cpu.amd.updateMicrocode = true; + + boot.kernelModules = [ + "kvm-amd" + "amd-pstate" + ]; + }; +} diff --git a/modules/nixos/hardware/cpu/default.nix b/modules/nixos/hardware/cpu/default.nix new file mode 100644 index 0000000..a26726f --- /dev/null +++ b/modules/nixos/hardware/cpu/default.nix @@ -0,0 +1,18 @@ +{lib, ...}: let + inherit (lib) mkOption types; +in { + imports = [ + ./amd.nix + ]; + + options.olympus.device.cpu = mkOption { + type = types.nullOr ( + types.enum [ + "amd" + "vm-amd" + ] + ); + default = null; + description = "CPU brand"; + }; +} diff --git a/modules/nixos/hardware/default.nix b/modules/nixos/hardware/default.nix new file mode 100644 index 0000000..eb0e03c --- /dev/null +++ b/modules/nixos/hardware/default.nix @@ -0,0 +1,7 @@ +{ + imports = [ + ./cpu + ./gpu + ./firmware.nix + ]; +} diff --git a/modules/nixos/hardware/firmware.nix b/modules/nixos/hardware/firmware.nix new file mode 100644 index 0000000..77c8bcb --- /dev/null +++ b/modules/nixos/hardware/firmware.nix @@ -0,0 +1,2 @@ +# Basically needed for every system here to work +{hardware.enableRedistributableFirmware = true;} diff --git a/modules/nixos/hardware/gpu/amd.nix b/modules/nixos/hardware/gpu/amd.nix new file mode 100644 index 0000000..b96a894 --- /dev/null +++ b/modules/nixos/hardware/gpu/amd.nix @@ -0,0 +1,24 @@ +{ + lib, + pkgs, + config, + ... +}: let + inherit (lib.modules) mkIf; + inherit (config.olympus) device; +in { + config = mkIf (device.gpu == "amd") { + services.xserver.videoDrivers = ["amdgpu"]; + + boot = { + kernelModules = ["amdgpu"]; + initrd.kernelModules = ["amdgpu"]; + }; + + # enables AMDVLK & OpenCL support + hardware.graphics.extraPackages = [ + pkgs.rocmPackages.clr + pkgs.rocmPackages.clr.icd + ]; + }; +} diff --git a/modules/nixos/hardware/gpu/default.nix b/modules/nixos/hardware/gpu/default.nix new file mode 100644 index 0000000..a9d0d3a --- /dev/null +++ b/modules/nixos/hardware/gpu/default.nix @@ -0,0 +1,19 @@ +{lib, ...}: let + inherit (lib) mkOption types; +in { + imports = [ + ./amd.nix + ./novideo.nix + ]; + + options.olympus.device.gpu = mkOption { + type = types.nullOr ( + types.enum [ + "amd" + "nvidia" + ] + ); + default = null; + description = "GPU brand"; + }; +} diff --git a/modules/nixos/hardware/gpu/novideo.nix b/modules/nixos/hardware/gpu/novideo.nix new file mode 100644 index 0000000..cb30d3c --- /dev/null +++ b/modules/nixos/hardware/gpu/novideo.nix @@ -0,0 +1,75 @@ +{ + lib, + pkgs, + config, + ... +}: let + inherit (config.olympus) device; + inherit (lib.modules) mkIf mkMerge mkDefault; +in { + config = mkIf (device.gpu == "nvidia") { + # nvidia drivers kinda are unfree software + nixpkgs.config.allowUnfree = true; + + services.xserver = mkMerge [ + {videoDrivers = ["nvidia"];} + ]; + + boot = { + # blacklist nouveau module as otherwise it conflicts with nvidia drm + blacklistedKernelModules = ["nouveau"]; + + # Enables the Nvidia's experimental framebuffer device + # fix for the imaginary monitor that does not exist + kernelParams = ["nvidia_drm.fbdev=1"]; + }; + + environment = { + sessionVariables = mkMerge [ + { + LIBVA_DRIVER_NAME = "nvidia"; + WLR_DRM_DEVICES = mkDefault "/dev/dri/card1"; + } + ]; + + systemPackages = builtins.attrValues { + inherit (pkgs.nvtopPackages) nvidia; + + inherit + (pkgs) + # mesa + mesa + # vulkan + vulkan-tools + vulkan-loader + vulkan-validation-layers + vulkan-extension-layer + # libva + libva + libva-utils + ; + }; + }; + + hardware = { + nvidia = { + package = mkDefault config.boot.kernelPackages.nvidiaPackages.beta; + + powerManagement = { + enable = mkDefault true; + finegrained = mkDefault false; + }; + + open = false; # dont use the open drivers by default + nvidiaSettings = false; # adds nvidia-settings to pkgs, so useless on nixos + nvidiaPersistenced = true; + # forceFullCompositionPipeline = true; + }; + + graphics = { + extraPackages = [pkgs.nvidia-vaapi-driver]; + extraPackages32 = [pkgs.pkgsi686Linux.nvidia-vaapi-driver]; + }; + }; + }; +}