From 89d5aa4dd290c91897583283e0257ad3d1f0a464 Mon Sep 17 00:00:00 2001 From: Peter Simons Date: Mon, 6 Feb 2012 19:14:42 +0000 Subject: [PATCH] nixos support for nvidia optimus currently, only support for fully disabling nvidia is provided, which is helpful for saving power/heat. In the future, this should be extended so we can choose: - nvidia only (choose between nouveau/nvidia driver) - IGP only - Hybrid (choose between nouveau/nvidia driver, use the "bumblebee" package/daemon) svn path=/nixos/trunk/; revision=32085 --- modules/module-list.nix | 1 + modules/services/hardware/nvidia-optimus.nix | 40 ++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 modules/services/hardware/nvidia-optimus.nix diff --git a/modules/module-list.nix b/modules/module-list.nix index 2a4829f4186..15af4017886 100644 --- a/modules/module-list.nix +++ b/modules/module-list.nix @@ -70,6 +70,7 @@ ./services/hardware/acpid.nix ./services/hardware/bluetooth.nix ./services/hardware/hal.nix + ./services/hardware/nvidia-optimus.nix ./services/hardware/pcscd.nix ./services/hardware/sane.nix ./services/hardware/udev.nix diff --git a/modules/services/hardware/nvidia-optimus.nix b/modules/services/hardware/nvidia-optimus.nix new file mode 100644 index 00000000000..0ba4b2327e1 --- /dev/null +++ b/modules/services/hardware/nvidia-optimus.nix @@ -0,0 +1,40 @@ +{pkgs, config, ...}: + +let kernel = config.boot.kernelPackages; +in + +{ + + ###### interface + + options = { + + hardware.nvidiaOptimus.disable = pkgs.lib.mkOption { + default = false; + type = pkgs.lib.types.bool; + description = '' + completely disable the nvidia gfx chip (saves power / heat) and just use IGP + ''; + }; + + }; + + + ###### implementation + + config = pkgs.lib.mkIf config.hardware.nvidiaOptimus.disable { + boot.blacklistedKernelModules = ["nouveau" "nvidia" "nvidiafb"]; + boot.kernelModules = [ "bbswitch" ]; + boot.extraModulePackages = [ kernel.bbswitch ]; + + jobs.bbswitch = { + name = "bbswitch"; + description = "turn off nvidia card"; + startOn = "stopped udevtrigger"; + exec = "discrete_vga_poweroff"; + path = [kernel.bbswitch]; + task = true; + }; + }; + +}