Jump to content

Displaylink: Difference between revisions

From NixOS Wiki
imported>Lillecarl
xorg configuration added, required for me to get displaylink working on 21.05
Add dlm service
 
(21 intermediate revisions by 12 users not shown)
Line 1: Line 1:
===DisplayLink monitors===
===DisplayLink monitors===
In order to use Displaylink monitors over USB, such as the ASUS MB16AC, the displaylink driver needs to be installed:
In order to use DisplayLink monitors over USB, such as the ASUS MB16AC, the DisplayLink driver needs to be installed.


{{bc|<nowiki>$ services.xserver.videoDrivers = [ "displaylink" "modesetting" ];</nowiki>}}
Since these drivers depend on binary unfree blobs, you will need to first add it to your Nix store.


Since these drivers depend on binary unfree blobs, you will need to first add it to your nix-store. Go to https://www.displaylink.com/downloads/ubuntu to get the appropriate driver version and note the download URL you get after accepting the EULA. Then (example):
Run <code>nix-shell -p displaylink --arg config '{ allowUnfree = true; }'</code> to get the '''instructions and follow them'''.


{{bc|<nowiki>
When you try to use <code>pkgs.displaylink</code> in your nixos system, you will get the same instructions printed to the stderr, follow those to prefetch the driver. Once the blob is in the Nix store you can add the package<syntaxhighlight lang="nix">
$ nix-prefetch-url --name displaylink.zip http://assets.displaylink.com/live/downloads/software/f1369_DisplayLink%20USB%20Graphics%20Software%20for%20Ubuntu%205.2.zip\?AWSAccessKeyId\=AKIAJHGQWPVXWHEDJUEA\&Expires\=1579838008\&Signature\=4UidRIwBYLZPHSf2EkcyLFKb%2B8o%3D
environment.systemPackages = with pkgs; [
</nowiki>}}
displaylink
];
</syntaxhighlight>Then add the videoDrivers:<syntaxhighlight lang="nixos">services.xserver.videoDrivers = [ "displaylink" "modesetting" ];</syntaxhighlight>The module <code>nixos/modules/hardware/video/displaylink.nix</code> should also work for wlroots compositors.


Before the monitor can be used by {{ic|xrandr}}, you will need to run the following command, which can be added to e.g. your {{ic|~/.xprofile}} (this is not necessary since NixOS 20.03):
At last - at least on Gnome using wayland you also have to enable ` dml`  service<syntaxhighlight lang="nix">
 
systemd.services.dlm.wantedBy = [ "multi-user.target" ];
{{bc|<nowiki>$ xrandr --setprovideroutputsource 1 0</nowiki>}}
</syntaxhighlight>


====Connecting a second external monitor====
====Connecting a second external monitor====
Line 21: Line 23:
'';</syntaxhighlight>
'';</syntaxhighlight>


====xorg configuration====
==Sway==
After some experimentation at work getting our Dell D6000 docks to work i had to create an xorg configuration file as follows
Identify which card has the render device, <code>evdi</code> is the DisplayLink interface, so it's not <code>card0</code>, but <code>card1</code>.


<syntaxhighlight lang="nix">environment.etc."X11/xorg.conf.d/20-evdi.conf" = {
<syntaxhighlight lang="console">
  enable = true;
$ ls -l /dev/dri/by-path
  text = ''
lrwxrwxrwx - root  2 Nov 13:38 pci-0000:00:02.0-card -> ../card1
    Section "OutputClass"
lrwxrwxrwx - root  2 Nov 13:38 pci-0000:00:02.0-render -> ../renderD128
      Identifier "DisplayLink"
lrwxrwxrwx - root  2 Nov 13:38 platform-evdi.0-card -> ../card0
      MatchDriver "evdi"
</syntaxhighlight>
      Driver "modesetting"
      Option "AccelMethod" "none"
    EndSection
  '';
};</syntaxhighlight>


Taken from arch wiki (https://wiki.archlinux.org/title/DisplayLink#Configuring_X_Server)
<syntaxhighlight lang="nix">
environment.variables = {   
  WLR_EVDI_RENDER_DEVICE = "/dev/dri/card1";                                                                                                 
};
nixpkgs.overlays = [
  (final: prev: {   
    wlroots_0_17 = prev.wlroots_0_17.overrideAttrs (old: { # you may need to use 0_18
      patches = (old.patches or [ ]) ++ [
        (prev.fetchpatch {
          url = "https://gitlab.freedesktop.org/wlroots/wlroots/uploads/bd115aa120d20f2c99084951589abf9c/DisplayLink_v2.patch";
              hash = "sha256-vWQc2e8a5/YZaaHe+BxfAR/Ni8HOs2sPJ8Nt9pfxqiE=";
            })     
          ];
        });
      })
];
services.xserver.videoDrivers = [ "displaylink" ];
systemd.services.dlm.wantedBy = [ "multi-user.target" ];
</syntaxhighlight>


Note that modesetting is the modern Intel iGPU driver, read further into the Arch wiki if you're experiencing issues.
Note as of [https://github.com/NixOS/nixpkgs/pull/351752 2024-10-30] nixos-unstable sway uses <code>wlroots_0_18</code>. The patch above applies correctly but you will need to invoke sway with the <code>--unsupported-gpu</code> flag.


evdi is automatically pulled in as a dependency from the displaylink package, you might need to add it to boot.kernelModules.


====Status of the package====
[https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/1823#note_2146862 Source]
As of right now (2020-01-24), the package in the {{ic|nixos}} stable channel is out of date, so you may need to override it from {{ic|nixpkgs}}.


Since '''NixOS 20.03''' this package is working out of the box again.
[[Category:Video]]
[[Category:Video]]

Latest revision as of 18:42, 11 April 2025

DisplayLink monitors

In order to use DisplayLink monitors over USB, such as the ASUS MB16AC, the DisplayLink driver needs to be installed.

Since these drivers depend on binary unfree blobs, you will need to first add it to your Nix store.

Run nix-shell -p displaylink --arg config '{ allowUnfree = true; }' to get the instructions and follow them.

When you try to use pkgs.displaylink in your nixos system, you will get the same instructions printed to the stderr, follow those to prefetch the driver. Once the blob is in the Nix store you can add the package

environment.systemPackages = with pkgs; [
 displaylink
];

Then add the videoDrivers:

services.xserver.videoDrivers = [ "displaylink" "modesetting" ];

The module nixos/modules/hardware/video/displaylink.nix should also work for wlroots compositors. At last - at least on Gnome using wayland you also have to enable ` dml` service

systemd.services.dlm.wantedBy = [ "multi-user.target" ];

Connecting a second external monitor

In order to add a second external monitor you can add the following to your configuration:

services.xserver.displayManager.sessionCommands = ''
    ${lib.getBin pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 2 0
'';

Sway

Identify which card has the render device, evdi is the DisplayLink interface, so it's not card0, but card1.

$ ls -l /dev/dri/by-path
lrwxrwxrwx - root  2 Nov 13:38 pci-0000:00:02.0-card -> ../card1
lrwxrwxrwx - root  2 Nov 13:38 pci-0000:00:02.0-render -> ../renderD128
lrwxrwxrwx - root  2 Nov 13:38 platform-evdi.0-card -> ../card0
environment.variables = {    
  WLR_EVDI_RENDER_DEVICE = "/dev/dri/card1";                                                                                                   
};
nixpkgs.overlays = [
  (final: prev: {    
    wlroots_0_17 = prev.wlroots_0_17.overrideAttrs (old: { # you may need to use 0_18
      patches = (old.patches or [ ]) ++ [
        (prev.fetchpatch {
          url = "https://gitlab.freedesktop.org/wlroots/wlroots/uploads/bd115aa120d20f2c99084951589abf9c/DisplayLink_v2.patch";
              hash = "sha256-vWQc2e8a5/YZaaHe+BxfAR/Ni8HOs2sPJ8Nt9pfxqiE=";
            })       
          ];
        });
      })
];
services.xserver.videoDrivers = [ "displaylink" ];
systemd.services.dlm.wantedBy = [ "multi-user.target" ];

Note as of 2024-10-30 nixos-unstable sway uses wlroots_0_18. The patch above applies correctly but you will need to invoke sway with the --unsupported-gpu flag.


Source