summaryrefslogtreecommitdiffstats
path: root/nixos
diff options
context:
space:
mode:
authorSvein Ove Aas <svein@google.com>2020-10-14 15:24:48 +0100
committerDmitry Kalinkin <dmitry.kalinkin@gmail.com>2021-01-29 12:55:51 -0500
commit6021ab7820998ada6594ae0ad7808eaf6eeb3e3b (patch)
tree92dc5399f6328a1ac9ea44f64b080f26f0c4febc /nixos
parentd25c7c1450201c4c78d43f4153fe6b1eccf4383d (diff)
nvidia: Add AMD APU option for Prime
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/hardware/video/nvidia.nix39
1 files changed, 31 insertions, 8 deletions
diff --git a/nixos/modules/hardware/video/nvidia.nix b/nixos/modules/hardware/video/nvidia.nix
index d1cf7d05c1b8..f8efced53645 100644
--- a/nixos/modules/hardware/video/nvidia.nix
+++ b/nixos/modules/hardware/video/nvidia.nix
@@ -96,6 +96,16 @@ in
'';
};
+ hardware.nvidia.prime.amdgpuBusId = mkOption {
+ type = types.str;
+ default = "";
+ example = "PCI:4:0:0";
+ description = ''
+ Bus ID of the AMD APU. You can find it using lspci; for example if lspci
+ shows the AMD APU at "04:00.0", set this option to "PCI:4:0:0".
+ '';
+ };
+
hardware.nvidia.prime.sync.enable = mkOption {
type = types.bool;
default = false;
@@ -153,7 +163,10 @@ in
};
};
- config = mkIf enabled {
+ config = let
+ igpuDriver = if pCfg.intelBusId != "" then "modesetting" else "amdgpu";
+ igpuBusId = if pCfg.intelBusId != "" then pCfg.intelBusId else pCfg.amdgpuBusId;
+ in mkIf enabled {
assertions = [
{
assertion = with config.services.xserver.displayManager; gdm.nvidiaWayland -> cfg.modesetting.enable;
@@ -161,7 +174,13 @@ in
}
{
- assertion = primeEnabled -> pCfg.nvidiaBusId != "" && pCfg.intelBusId != "";
+ assertion = primeEnabled -> pCfg.intelBusId == "" || pCfg.amdgpuBusId == "";
+ message = ''
+ You cannot configure both an Intel iGPU and an AMD APU. Pick the one corresponding to your processor.
+ '';
+ }
+ {
+ assertion = primeEnabled -> pCfg.nvidiaBusId != "" && (pCfg.intelBusId != "" || pCfg.amdgpuBusId != "");
message = ''
When NVIDIA PRIME is enabled, the GPU bus IDs must configured.
'';
@@ -183,18 +202,22 @@ in
# "nvidia" driver, in order to allow the X server to start without any outputs.
# - Add a separate Device section for the Intel GPU, using the "modesetting"
# driver and with the configured BusID.
+ # - OR add a separate Device section for the AMD APU, using the "amdgpu"
+ # driver and with the configures BusID.
# - Reference that Device section from the ServerLayout section as an inactive
# device.
# - Configure the display manager to run specific `xrandr` commands which will
- # configure/enable displays connected to the Intel GPU.
+ # configure/enable displays connected to the Intel iGPU / AMD APU.
services.xserver.useGlamor = mkDefault offloadCfg.enable;
- services.xserver.drivers = optional primeEnabled {
- name = "modesetting";
+ services.xserver.drivers = let
+ in optional primeEnabled {
+ name = igpuDriver;
display = offloadCfg.enable;
+ modules = optional (igpuDriver == "amdgpu") [ pkgs.xorg.xf86videoamdgpu ];
deviceSection = ''
- BusID "${pCfg.intelBusId}"
+ BusID "${igpuBusId}"
${optionalString syncCfg.enable ''Option "AccelMethod" "none"''}
'';
} ++ singleton {
@@ -214,14 +237,14 @@ in
};
services.xserver.serverLayoutSection = optionalString syncCfg.enable ''
- Inactive "Device-modesetting[0]"
+ Inactive "Device-${igpuDriver}[0]"
'' + optionalString offloadCfg.enable ''
Option "AllowNVIDIAGPUScreens"
'';
services.xserver.displayManager.setupCommands = optionalString syncCfg.enable ''
# Added by nvidia configuration module for Optimus/PRIME.
- ${pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource modesetting NVIDIA-0
+ ${pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource ${igpuDriver} NVIDIA-0
${pkgs.xorg.xrandr}/bin/xrandr --auto
'';