{ config, lib, pkgs, ... }: let fetchurl = pkgs.fetchurl; fetchpatch = pkgs.fetchpatch; commit = "821d8f0685ebad0fa2c05c7080f45eafb28ad08c"; mkPatch = name: sha256: { name = name; patch = fetchpatch { name = name + ".patch"; url = "https://raw.githubusercontent.com/linux-surface/linux-surface/${commit}/patches/5.13/${name}.patch"; sha256 = sha256; }; }; cfg = config.ptw.hardware.surface; in { options.ptw.hardware.surface = { enable = lib.mkEnableOption "Enable support for the Microsoft Surface Pro 6"; }; config = lib.mkIf cfg.enable { environment.etc = { "ipts.conf".text = '' [Config] BlockOnPalm = true ''; "thermald/thermal-cpu-cdev-order.xml".source = fetchurl { url = "https://raw.githubusercontent.com/linux-surface/linux-surface/${commit}/contrib/thermald/surface_pro_5/thermal-conf.xml.auto.mobile"; sha256 = "1wsrgad6k4haw4m0jjcjxhmj4742kcb3q8rmfpclbw0czm8384al"; }; }; powerManagement = { enable = true; cpuFreqGovernor = "powersave"; }; hardware.video.hidpi.enable = true; systemd.services.iptsd = { description = "Userspace daemon for Intel Precise Touch & Stylus"; wantedBy = [ "multi-user.target" ]; wants = [ "dev-ipts-15.device" ]; after = [ "dev-ipts-15.device" ]; serviceConfig = { Type = "simple"; ExecStart = "${pkgs.iptsd}/bin/iptsd"; }; }; environment.systemPackages = with pkgs; [ iptsd surface-control ]; services = { udev.packages = with pkgs; [ iptsd surface-control ]; thermald = { enable = true; configFile = fetchurl { url = "https://raw.githubusercontent.com/linux-surface/linux-surface/${commit}/contrib/thermald/thermal-conf.xml"; sha256 = "1xj70n9agy41906jgm4yjmsx58i7pzsizpvv3rkzq78k95qjfmc9"; }; }; }; boot = { kernelPackages = pkgs.linuxPackages_5_14; kernelPatches = [ (mkPatch "0001-surface3-oemb" "0ji3glnbaiy10kzi2zi80278vyf0pp23s7dqx8pwirbqxi6pygnp") (mkPatch "0002-mwifiex" "0d7jpfiyb74i5fm2gdhwa5bi9kd7ff4mb75yss0lvidga10r9hmp") (mkPatch "0003-ath10k" "0a6iwdw5wkjd24bnz32msncr1am2db36x6qpf652rx12czia8ndj") (mkPatch "0004-ipts" "0ib7bnh4xanz5cakr50nirshhzn3rb29x9kq4m0snp38fhyaa8dv") (mkPatch "0005-surface-sam" "19yjxgznhv65g1v6dcv6fklahi2inmf7gllbzmh6k98r3531kzjg") (mkPatch "0006-surface-sam-over-hid" "0np7zf8328yxy9xzbipqjw014kzy0kmm67c046fmgmvniibixvs7") (mkPatch "0007-surface-gpe" "164hhw0jh800qxmwiahw4hdsprghm760i8c6pwq89mh440wkfxnk") (mkPatch "0008-surface-button" "0w03azjlhwdz9isjc5swlpimj48zx7jgjws6ws8xxlb37vbg4lq6") (mkPatch "0009-surface-typecover" "0s2i13x780zmwbksv4rk1lryrv6n6mvc49ljn3zdy4d9yy10x272") (mkPatch "0010-cameras" "0vwz609vbrracc8qm1jzm471ls4imqlilf3hh2whsb2w2npmd0kf") (mkPatch "0011-amd-gpio" "09xjc0fl9vccz1nks6v62359digrk92svr75qz9zcvfmpyxg18z7") # TODO: Maybe drop { name = "surface-config"; patch = null; # Options from https://github.com/linux-surface/linux-surface/blob/master/configs/surface-5.13.config extraConfig = '' # # Surface Aggregator Module # SURFACE_AGGREGATOR m SURFACE_AGGREGATOR_ERROR_INJECTION n SURFACE_AGGREGATOR_BUS y SURFACE_AGGREGATOR_CDEV m SURFACE_AGGREGATOR_REGISTRY m SURFACE_ACPI_NOTIFY m SURFACE_DTX m SURFACE_PLATFORM_PROFILE m SURFACE_HID m SURFACE_KBD m BATTERY_SURFACE m CHARGER_SURFACE m # # Surface Hotplug # SURFACE_HOTPLUG m # # IPTS touchscreen # # This only enables the user interface for IPTS data. # For the touchscreen to work, you need to install iptsd. # MISC_IPTS m # # Cameras: IPU3 # #VIDEO_IPU3_IMGU m VIDEO_IPU3_CIO2 m CIO2_BRIDGE y #INTEL_SKL_INT3472 m # # Cameras: Sensor drivers # #VIDEO_OV5693 m VIDEO_OV8865 m # # ALS Sensor for Surface Book 3, Surface Laptop 3, Surface Pro 7 # APDS9960 m # # Other Drivers # INPUT_SOC_BUTTON_ARRAY m SURFACE_3_BUTTON m SURFACE_3_POWER_OPREGION m SURFACE_PRO3_BUTTON m SURFACE_GPE m SURFACE_BOOK1_DGPU_SWITCH m # # Other # # Prevent a non-fatal "kernel oops" at boot crashing udev # (https://github.com/linux-surface/linux-surface/issues/61#issuecomment-579298172) PINCTRL_INTEL y PINCTRL_SUNRISEPOINT y # Required for reading battery data # (https://github.com/linux-surface/surface-aggregator-module/wiki/Testing-and-Installing) SERIAL_DEV_BUS y SERIAL_DEV_CTRL_TTYPORT y MFD_INTEL_LPSS_PCI y INTEL_IDMA64 y ''; } ]; }; }; }