Home Explore Blog Models CI



nixpkgs

1st chunk of `nixos/modules/services/hardware/display.md`
59a8bacdb267080294029bde69ff6f739548d8be3105eb5a000000010000095a
# Customizing display configuration {#module-hardware-display}

This section describes how to customize display configuration using:
- kernel modes
- EDID files

Example situations it can help you with:
- display controllers (external hardware) not advertising EDID at all,
- misbehaving graphics drivers,
- loading custom display configuration before the Display Manager is running,

## Forcing display modes {#module-hardware-display-modes}

In case of very wrong monitor controller and/or video driver combination you can
[force the display to be enabled](https://mjmwired.net/kernel/Documentation/fb/modedb.txt#41)
and skip some driver-side checks by adding `video=<OUTPUT>:e` to `boot.kernelParams`.
This is exactly the case with [`amdgpu` drivers](https://gitlab.freedesktop.org/drm/amd/-/issues/615#note_1987392)

```nix
{
  # force enabled output to skip `amdgpu` checks
  hardware.display.outputs."DP-1".mode = "e";
  # completely disable output no matter what is connected to it
  hardware.display.outputs."VGA-2".mode = "d";

  /*
    equals
    boot.kernelParams = [ "video=DP-1:e" "video=VGA-2:d" ];
  */
}
```

## Crafting custom EDID files {#module-hardware-display-edid-custom}

To make custom EDID binaries discoverable you should first create a derivation storing them at
`$out/lib/firmware/edid/` and secondly add that derivation to `hardware.display.edid.packages` NixOS option:

```nix
{
  hardware.display.edid.packages = [
    (pkgs.runCommand "edid-custom" { } ''
      mkdir -p $out/lib/firmware/edid
      base64 -d > "$out/lib/firmware/edid/custom1.bin" <<'EOF'
      <insert your base64 encoded EDID file here `base64 < /sys/class/drm/card0-.../edid`>
      EOF
      base64 -d > "$out/lib/firmware/edid/custom2.bin" <<'EOF'
      <insert your base64 encoded EDID file here `base64 < /sys/class/drm/card1-.../edid`>
      EOF
    '')
  ];
}
```

There are 2 options significantly easing preparation of EDID files:
- `hardware.display.edid.linuxhw`
- `hardware.display.edid.modelines`

## Assigning EDID files to displays {#module-hardware-display-edid-assign}

To assign available custom EDID binaries to your monitor (video output) use `hardware.display.outputs."<NAME>".edid` option.
Under the hood it adds `drm.edid_firmware` entry to `boot.kernelParams` NixOS option for each configured output:

```nix
{
  hardware.display.outputs."VGA-1".edid = "custom1.bin";

Title: Customizing Display Configuration with Kernel Modes and EDID
Summary
This section details how to customize display configurations, addressing issues like missing EDID or misbehaving graphics drivers. It covers forcing display modes using kernel parameters (e.g., `video=<OUTPUT>:e`) to enable or disable specific outputs, and crafting custom EDID files. Custom EDID binaries are made discoverable by creating a derivation that stores them and adding it to `hardware.display.edid.packages`. Finally, it explains how to assign these custom EDID files to specific display outputs using the `hardware.display.outputs."<NAME>".edid` option, which translates to `drm.edid_firmware` kernel parameters.