at 24.11-pre 1.9 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 7 enabled = elem "displaylink" config.services.xserver.videoDrivers; 8 9 evdi = config.boot.kernelPackages.evdi; 10 11 displaylink = pkgs.displaylink.override { 12 inherit evdi; 13 }; 14 15in 16 17{ 18 19 config = mkIf enabled { 20 21 boot.extraModulePackages = [ evdi ]; 22 boot.kernelModules = [ "evdi" ]; 23 24 environment.etc."X11/xorg.conf.d/40-displaylink.conf".text = '' 25 Section "OutputClass" 26 Identifier "DisplayLink" 27 MatchDriver "evdi" 28 Driver "modesetting" 29 Option "TearFree" "true" 30 Option "AccelMethod" "none" 31 EndSection 32 ''; 33 34 # make the device available 35 services.xserver.displayManager.sessionCommands = '' 36 ${lib.getBin pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 1 0 37 ''; 38 39 # Those are taken from displaylink-installer.sh and from Arch Linux AUR package. 40 41 services.udev.packages = [ displaylink ]; 42 43 powerManagement.powerDownCommands = '' 44 #flush any bytes in pipe 45 while read -n 1 -t 1 SUSPEND_RESULT < /tmp/PmMessagesPort_out; do : ; done; 46 47 #suspend DisplayLinkManager 48 echo "S" > /tmp/PmMessagesPort_in 49 50 #wait until suspend of DisplayLinkManager finish 51 if [ -f /tmp/PmMessagesPort_out ]; then 52 #wait until suspend of DisplayLinkManager finish 53 read -n 1 -t 10 SUSPEND_RESULT < /tmp/PmMessagesPort_out 54 fi 55 ''; 56 57 powerManagement.resumeCommands = '' 58 #resume DisplayLinkManager 59 echo "R" > /tmp/PmMessagesPort_in 60 ''; 61 62 systemd.services.dlm = { 63 description = "DisplayLink Manager Service"; 64 after = [ "display-manager.service" ]; 65 conflicts = [ "getty@tty7.service" ]; 66 67 serviceConfig = { 68 ExecStart = "${displaylink}/bin/DisplayLinkManager"; 69 Restart = "always"; 70 RestartSec = 5; 71 LogsDirectory = "displaylink"; 72 }; 73 }; 74 75 }; 76 77}