Displaylink: Difference between revisions

imported>Artturin
This shouldn't be needed because adding modesetting to videoDrivers already does it Undo revision 6965 by Lillecarl (talk)
Sandro (talk | contribs)
 
(25 intermediate revisions by 14 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'''.


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">
environment.systemPackages = with pkgs; [
displaylink
];
</syntaxhighlight>Then add the videoDrivers:<syntaxhighlight lang="nix">services.xserver.videoDrivers = [ "displaylink" "modesetting" ];</syntaxhighlight>The module <code>nixos/modules/hardware/video/displaylink.nix</code> should also work for wlroots compositors.
====<big>Xserver</big>====
=====Connecting a second external monitor=====
In order to add a second external monitor you can add the following to your configuration:
<syntaxhighlight lang="nix">services.xserver.displayManager.sessionCommands = ''
    ${lib.getBin pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 2 0
'';</syntaxhighlight>
[[Category:Video]]
====Wayland====
At first add displayLink driver to nix store as above described.
=====evdi module=====
You probably will need the `evdi` module
<syntaxhighlight lang="nix">
boot = {
  extraModulePackages = [ config.boot.kernelPackages.evdi ];
  initrd = {
    # List of modules that are always loaded by the initrd.
    kernelModules = [
      "evdi"
    ];
  };
};
</syntaxhighlight>
====='''Gnome Wayland'''=====
Install displayLink package
<syntaxhighlight lang="nix">
environment.systemPackages = with pkgs; [
  displaylink
];
</syntaxhighlight>
Define videoDrivers
{{bc|<nowiki>
{{bc|<nowiki>
$ 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
services.xserver.videoDrivers = [ "displaylink" ];
</nowiki>}}
</nowiki>}}


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):
Add dlm service
<syntaxhighlight lang="nix">
systemd.services.dlm.wantedBy = [ "multi-user.target" ];
</syntaxhighlight>
====='''KDE Plasma'''=====
 
Apparently KDE Plasma (Wayland) requires a slight different approach.
 
Esnure you properly enabled wayland session
 
<syntaxhighlight lang="nix">
environment.variables = {
  KWIN_DRM_PREFER_COLOR_DEPTH = "24";
};
 
services = {
  desktopManager.plasma6 = {
    enable = true;
  };
  displayManager = {
    sddm = {
      enable = true;
      wayland.enable = true;
    };
    defaultSession = "plasma";
  };
 
};
</syntaxhighlight>
 
Install displayLink package
 
<syntaxhighlight lang="nix">
environment.systemPackages = with pkgs; [
  displaylink
];
</syntaxhighlight>
 
Instead of dlm setup display-link server as follows:
 
<syntaxhighlight lang="nix">
systemd.services.displaylink-server = {
  enable = true;
  requires = [ "systemd-udevd.service" ];
  after = [ "systemd-udevd.service" ];
  wantedBy = [ "multi-user.target" ];
  serviceConfig = {
    Type = "simple";
    ExecStart = "${pkgs.displaylink}/bin/DisplayLinkManager";
    User = "root";
    Group = "root";
    Restart = "on-failure";
    RestartSec = 5; # Wait 5 seconds before restarting
  };
};
</syntaxhighlight>
 
==Sway==
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="console">
$ 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
</syntaxhighlight>
 
<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 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.
 
 
[https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/1823#note_2146862 Source]
 
== Troubleshooting ==
 
=== Suspend blocked by <code>pre-sleep.service</code> ===
As of NixOS 25.05, installing <code>pkgs.displaylink</code> inserts some directives into the script referenced by <code>pre-sleep.service</code>. If suspending does not work and causes the reboot and poweroff buttons to stop working, it may be a symptom of [[Power Management#Suspend blocked by pre-sleep.service|suspend being blocked by pre-sleep.service]].
 
The script in question:<syntaxhighlight lang="bash" line="1">
#!/nix/store/cfqbabpc7xwg8akbcchqbq3cai6qq2vs-bash-5.2p37/bin/bash
set -e
 
#flush any bytes in pipe
while read -n 1 -t 1 SUSPEND_RESULT < /tmp/PmMessagesPort_out; do : ; done;
 
#suspend DisplayLinkManager
echo "S" > /tmp/PmMessagesPort_in
 
#wait until suspend of DisplayLinkManager finish
if [ -f /tmp/PmMessagesPort_out ]; then
  #wait until suspend of DisplayLinkManager finish
  read -n 1 -t 10 SUSPEND_RESULT < /tmp/PmMessagesPort_out
fi


{{bc|<nowiki>$ xrandr --setprovideroutputsource 1 0</nowiki>}}
</syntaxhighlight>Because of a stray <code>/tmp/PmMessagesPort_out</code> caused by an unclean shutdown, the suspend action was blocked by this script trying to flush the port. A myriad of solutions can be used to unblock the script and restore suspend:


====Connecting a second external monitor====
* Start <code>dlm.service</code> so that DisplayLinkManager can clear the ports and unblock the script
In order to add a second external monitor you can add the following to your configuration:
* Use <code>sudo DisplayLinkManager</code> to clear the ports and unblock the script


<syntaxhighlight lang="nix">services.xserver.displayManager.sessionCommands = ''
Untested solutions:
    ${lib.getBin pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 2 0
'';</syntaxhighlight>


====Status of the package====
* Removing the file
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}}.
* Killing the script


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