about summary refs log tree commit diff
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2016-02-26 03:18:37 +0100
committerProfpatsch <mail@profpatsch.de>2016-02-26 03:18:37 +0100
commit4b435f20075d73cfcea7c7a9c2ebebb86015c818 (patch)
treef842bbe57c87ac3f5a93d63af752b7cd2d21418e
parent3cbe26730d6e7b64040979d512afe46f90ed33ab (diff)
parentf3f4e855600a10cc1ae7275f9ecf302160430b6a (diff)
Merge remote-tracking branch 'origin/master'
-rw-r--r--machines/aszlig/arilou.nix4
-rw-r--r--machines/aszlig/dnyarri-kconf.nix62
-rw-r--r--machines/aszlig/dnyarri.nix2
-rw-r--r--machines/aszlig/kzerza.nix8
-rw-r--r--machines/aszlig/managed/haenk.nix95
-rw-r--r--machines/aszlig/managed/notsure.nix3
-rw-r--r--machines/aszlig/managed/tyree.nix9
-rw-r--r--machines/aszlig/mmrnmhrm-kconf.nix47
-rw-r--r--machines/aszlig/mmrnmhrm.nix7
-rw-r--r--machines/aszlig/tishtushi.nix8
-rw-r--r--machines/default.nix1
-rw-r--r--machines/labnet/labtop.nix44
-rw-r--r--machines/profpatsch/katara.nix2
-rw-r--r--machines/sternenseemann/fliewatuet.nix2
-rw-r--r--machines/sternenseemann/schnurrkadse.nix14
-rw-r--r--modules/hardware/t100ha/default.nix60
-rw-r--r--modules/hardware/t100ha/drm-fixes.patch1019
-rw-r--r--modules/hardware/thinkpad.nix (renamed from modules/system/thinkpad.nix)6
-rw-r--r--modules/module-list.nix2
-rw-r--r--modules/user/aszlig/profiles/workstation/default.nix7
-rw-r--r--modules/user/aszlig/system/kernel.nix6
-rw-r--r--pkgs/games/steam/starbound.nix38
-rw-r--r--pkgs/nixops/default.nix4
23 files changed, 1214 insertions, 236 deletions
diff --git a/machines/aszlig/arilou.nix b/machines/aszlig/arilou.nix
index b9a1c87d..469d6de9 100644
--- a/machines/aszlig/arilou.nix
+++ b/machines/aszlig/arilou.nix
@@ -25,7 +25,7 @@ in {
 
   fileSystems."/".device = "/dev/disk/by-uuid/${rootUUID}";
   fileSystems."/".fsType = "btrfs";
-  fileSystems."/".options = concatStringsSep "," [
+  fileSystems."/".options = [
     "ssd"
     "space_cache"
     "compress-force=zlib"
@@ -34,7 +34,7 @@ in {
 
   fileSystems."/tmp".device = "none";
   fileSystems."/tmp".fsType = "tmpfs";
-  fileSystems."/tmp".options = "nosuid,nodev,relatime";
+  fileSystems."/tmp".options = [ "nosuid" "nodev" "relatime" ];
 
   swapDevices = singleton {
     device = "/dev/disk/by-uuid/${swapUUID}";
diff --git a/machines/aszlig/dnyarri-kconf.nix b/machines/aszlig/dnyarri-kconf.nix
index a34f9871..614a7888 100644
--- a/machines/aszlig/dnyarri-kconf.nix
+++ b/machines/aszlig/dnyarri-kconf.nix
@@ -8,8 +8,11 @@
   "CONFIG_ARCH_DEFCONFIG" = "arch/x86/configs/x86_64_defconfig";
   "CONFIG_LOCKDEP_SUPPORT" = "y";
   "CONFIG_STACKTRACE_SUPPORT" = "y";
-  "CONFIG_HAVE_LATENCYTOP_SUPPORT" = "y";
   "CONFIG_MMU" = "y";
+  "CONFIG_ARCH_MMAP_RND_BITS_MIN" = "28";
+  "CONFIG_ARCH_MMAP_RND_BITS_MAX" = "32";
+  "CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN" = "8";
+  "CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX" = "16";
   "CONFIG_NEED_DMA_MAP_STATE" = "y";
   "CONFIG_NEED_SG_DMA_LENGTH" = "y";
   "CONFIG_GENERIC_ISA_DMA" = "y";
@@ -101,15 +104,15 @@
   "CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH" = "y";
   "CONFIG_ARCH_SUPPORTS_INT128" = "y";
   "CONFIG_CGROUPS" = "y";
-  "CONFIG_CGROUP_FREEZER" = "y";
-  "CONFIG_CGROUP_PIDS" = "y";
-  "CONFIG_CGROUP_DEVICE" = "y";
-  "CONFIG_CPUSETS" = "y";
-  "CONFIG_CGROUP_CPUACCT" = "y";
+  "CONFIG_BLK_CGROUP" = "y";
   "CONFIG_CGROUP_SCHED" = "y";
   "CONFIG_FAIR_GROUP_SCHED" = "y";
   "CONFIG_CFS_BANDWIDTH" = "y";
-  "CONFIG_BLK_CGROUP" = "y";
+  "CONFIG_CGROUP_PIDS" = "y";
+  "CONFIG_CGROUP_FREEZER" = "y";
+  "CONFIG_CPUSETS" = "y";
+  "CONFIG_CGROUP_DEVICE" = "y";
+  "CONFIG_CGROUP_CPUACCT" = "y";
   "CONFIG_NAMESPACES" = "y";
   "CONFIG_UTS_NS" = "y";
   "CONFIG_IPC_NS" = "y";
@@ -169,7 +172,6 @@
   "CONFIG_HAVE_OPTPROBES" = "y";
   "CONFIG_HAVE_KPROBES_ON_FTRACE" = "y";
   "CONFIG_HAVE_ARCH_TRACEHOOK" = "y";
-  "CONFIG_HAVE_DMA_ATTRS" = "y";
   "CONFIG_HAVE_DMA_CONTIGUOUS" = "y";
   "CONFIG_GENERIC_SMP_IDLE_THREAD" = "y";
   "CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT" = "y";
@@ -202,6 +204,10 @@
   "CONFIG_MODULES_USE_ELF_RELA" = "y";
   "CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK" = "y";
   "CONFIG_ARCH_HAS_ELF_RANDOMIZE" = "y";
+  "CONFIG_HAVE_ARCH_MMAP_RND_BITS" = "y";
+  "CONFIG_ARCH_MMAP_RND_BITS" = "28";
+  "CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS" = "y";
+  "CONFIG_ARCH_MMAP_RND_COMPAT_BITS" = "8";
   "CONFIG_HAVE_COPY_THREAD_TLS" = "y";
   "CONFIG_OLD_SIGSUSPEND3" = "y";
   "CONFIG_COMPAT_OLD_SIGACTION" = "y";
@@ -215,7 +221,6 @@
   "CONFIG_MODULE_FORCE_UNLOAD" = "y";
   "CONFIG_MODVERSIONS" = "y";
   "CONFIG_MODULES_TREE_LOOKUP" = "y";
-  "CONFIG_STOP_MACHINE" = "y";
   "CONFIG_BLOCK" = "y";
   "CONFIG_BLK_DEV_BSG" = "y";
   "CONFIG_BLK_DEV_INTEGRITY" = "y";
@@ -246,6 +251,7 @@
   "CONFIG_ZONE_DMA" = "y";
   "CONFIG_SMP" = "y";
   "CONFIG_X86_FEATURE_NAMES" = "y";
+  "CONFIG_X86_FAST_FEATURE_TESTS" = "y";
   "CONFIG_IOSF_MBI" = "m";
   "CONFIG_X86_SUPPORTS_MEMORY_FAILURE" = "y";
   "CONFIG_SCHED_OMIT_FRAME_POINTER" = "y";
@@ -412,6 +418,7 @@
   "CONFIG_PMC_ATOM" = "y";
   "CONFIG_NET" = "y";
   "CONFIG_NET_INGRESS" = "y";
+  "CONFIG_NET_EGRESS" = "y";
   "CONFIG_PACKET" = "y";
   "CONFIG_PACKET_DIAG" = "m";
   "CONFIG_UNIX" = "y";
@@ -504,6 +511,9 @@
   "CONFIG_NFT_REJECT" = "m";
   "CONFIG_NFT_REJECT_INET" = "m";
   "CONFIG_NFT_COMPAT" = "m";
+  "CONFIG_NF_DUP_NETDEV" = "m";
+  "CONFIG_NFT_DUP_NETDEV" = "m";
+  "CONFIG_NFT_FWD_NETDEV" = "m";
   "CONFIG_NETFILTER_XTABLES" = "m";
   "CONFIG_NETFILTER_XT_MARK" = "m";
   "CONFIG_NETFILTER_XT_CONNMARK" = "m";
@@ -752,6 +762,7 @@
   "CONFIG_RPS" = "y";
   "CONFIG_RFS_ACCEL" = "y";
   "CONFIG_XPS" = "y";
+  "CONFIG_SOCK_CGROUP_DATA" = "y";
   "CONFIG_CGROUP_NET_CLASSID" = "y";
   "CONFIG_NET_RX_BUSY_POLL" = "y";
   "CONFIG_BQL" = "y";
@@ -805,6 +816,7 @@
   "CONFIG_DM_UEVENT" = "y";
   "CONFIG_DM_FLAKEY" = "m";
   "CONFIG_DM_VERITY" = "m";
+  "CONFIG_DM_VERITY_FEC" = "y";
   "CONFIG_DM_LOG_WRITES" = "m";
   "CONFIG_NETDEVICES" = "y";
   "CONFIG_NET_CORE" = "y";
@@ -849,6 +861,10 @@
   "CONFIG_INPUT_KEYBOARD" = "y";
   "CONFIG_KEYBOARD_ATKBD" = "y";
   "CONFIG_INPUT_MOUSE" = "y";
+  "CONFIG_INPUT_JOYSTICK" = "y";
+  "CONFIG_JOYSTICK_XPAD" = "y";
+  "CONFIG_JOYSTICK_XPAD_FF" = "y";
+  "CONFIG_JOYSTICK_XPAD_LEDS" = "y";
   "CONFIG_INPUT_MISC" = "y";
   "CONFIG_INPUT_UINPUT" = "m";
   "CONFIG_SERIO" = "y";
@@ -900,6 +916,7 @@
   "CONFIG_INTEL_PCH_THERMAL" = "m";
   "CONFIG_SSB_POSSIBLE" = "y";
   "CONFIG_BCMA_POSSIBLE" = "y";
+  "CONFIG_MFD_CORE" = "m";
   "CONFIG_MEDIA_SUPPORT" = "y";
   "CONFIG_MEDIA_CAMERA_SUPPORT" = "y";
   "CONFIG_VIDEO_DEV" = "y";
@@ -975,6 +992,7 @@
   "CONFIG_DRM_BRIDGE" = "y";
   "CONFIG_FB" = "y";
   "CONFIG_FB_CMDLINE" = "y";
+  "CONFIG_FB_NOTIFY" = "y";
   "CONFIG_FB_CFB_FILLRECT" = "y";
   "CONFIG_FB_CFB_COPYAREA" = "y";
   "CONFIG_FB_CFB_IMAGEBLIT" = "y";
@@ -1040,18 +1058,7 @@
   "CONFIG_HID_BATTERY_STRENGTH" = "y";
   "CONFIG_UHID" = "m";
   "CONFIG_HID_GENERIC" = "y";
-  "CONFIG_HID_A4TECH" = "y";
-  "CONFIG_HID_APPLE" = "y";
-  "CONFIG_HID_BELKIN" = "y";
-  "CONFIG_HID_CHERRY" = "y";
-  "CONFIG_HID_CHICONY" = "y";
-  "CONFIG_HID_CYPRESS" = "y";
-  "CONFIG_HID_EZKEY" = "y";
-  "CONFIG_HID_GEMBIRD" = "m";
-  "CONFIG_HID_KENSINGTON" = "y";
-  "CONFIG_HID_LOGITECH" = "y";
   "CONFIG_HID_MICROSOFT" = "y";
-  "CONFIG_HID_MONTEREY" = "y";
   "CONFIG_HID_PANTHERLORD" = "y";
   "CONFIG_PANTHERLORD_FF" = "y";
   "CONFIG_HID_SONY" = "m";
@@ -1059,7 +1066,10 @@
   "CONFIG_HID_GREENASIA" = "y";
   "CONFIG_GREENASIA_FF" = "y";
   "CONFIG_HID_WACOM" = "m";
+  "CONFIG_HID_SENSOR_HUB" = "m";
+  "CONFIG_HID_SENSOR_CUSTOM_SENSOR" = "m";
   "CONFIG_USB_HID" = "y";
+  "CONFIG_HID_PID" = "y";
   "CONFIG_USB_HIDDEV" = "y";
   "CONFIG_I2C_HID" = "m";
   "CONFIG_USB_OHCI_LITTLE_ENDIAN" = "y";
@@ -1133,6 +1143,7 @@
   "CONFIG_USB_SERIAL_METRO" = "m";
   "CONFIG_USB_SERIAL_MOS7720" = "m";
   "CONFIG_USB_SERIAL_MOS7840" = "m";
+  "CONFIG_USB_SERIAL_MXUPORT11" = "m";
   "CONFIG_USB_SERIAL_MXUPORT" = "m";
   "CONFIG_USB_SERIAL_NAVMAN" = "m";
   "CONFIG_USB_SERIAL_PL2303" = "m";
@@ -1157,8 +1168,9 @@
   "CONFIG_USB_SERIAL_DEBUG" = "m";
   "CONFIG_USB_EZUSB_FX2" = "m";
   "CONFIG_NEW_LEDS" = "y";
-  "CONFIG_LEDS_CLASS" = "m";
-  "CONFIG_LEDS_CLASS_FLASH" = "m";
+  "CONFIG_LEDS_CLASS" = "y";
+  "CONFIG_LEDS_CLASS_FLASH" = "y";
+  "CONFIG_LEDS_TRIGGERS" = "y";
   "CONFIG_EDAC_ATOMIC_SCRUB" = "y";
   "CONFIG_EDAC_SUPPORT" = "y";
   "CONFIG_RTC_LIB" = "y";
@@ -1175,7 +1187,7 @@
   "CONFIG_CLKEVT_I8253" = "y";
   "CONFIG_I8253_LOCK" = "y";
   "CONFIG_CLKBLD_I8253" = "y";
-  "CONFIG_EXTCON" = "m";
+  "CONFIG_ARM_GIC_MAX_NR" = "1";
   "CONFIG_RAS" = "y";
   "CONFIG_FIRMWARE_MEMMAP" = "y";
   "CONFIG_DMIID" = "y";
@@ -1331,7 +1343,10 @@
   "CONFIG_TEST_HEXDUMP" = "m";
   "CONFIG_MEMTEST" = "y";
   "CONFIG_HAVE_ARCH_KGDB" = "y";
+  "CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL" = "y";
+  "CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED" = "y";
   "CONFIG_STRICT_DEVMEM" = "y";
+  "CONFIG_IO_STRICT_DEVMEM" = "y";
   "CONFIG_X86_VERBOSE_BOOTUP" = "y";
   "CONFIG_EARLY_PRINTK" = "y";
   "CONFIG_DOUBLEFAULT" = "y";
@@ -1566,6 +1581,7 @@
   "CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE" = "y";
   "CONFIG_CLZ_TAB" = "y";
   "CONFIG_CORDIC" = "y";
+  "CONFIG_IRQ_POLL" = "y";
   "CONFIG_MPILIB" = "y";
   "CONFIG_OID_REGISTRY" = "y";
   "CONFIG_FONT_SUPPORT" = "y";
diff --git a/machines/aszlig/dnyarri.nix b/machines/aszlig/dnyarri.nix
index 5192e955..a041486e 100644
--- a/machines/aszlig/dnyarri.nix
+++ b/machines/aszlig/dnyarri.nix
@@ -109,7 +109,7 @@ with lib;
   # TODO: Try to avoid this, but as there is only a single user using audio on
   # this machine, it's okay for now. But remember that this will break heavily,
   # should there be another user accessing the audio devices.
-  users.extraUsers.aszlig.extraGroups = [ "audio" "vboxusers" ];
+  users.users.aszlig.extraGroups = [ "audio" "vboxusers" ];
 
   services.synergy.client.enable = true;
   services.synergy.client.serverAddress = "mmrnmhrm";
diff --git a/machines/aszlig/kzerza.nix b/machines/aszlig/kzerza.nix
index b90b05d2..41b380b9 100644
--- a/machines/aszlig/kzerza.nix
+++ b/machines/aszlig/kzerza.nix
@@ -24,7 +24,7 @@ in {
 
   fileSystems."/".device = "/dev/disk/by-uuid/${rootUUID}";
   fileSystems."/".fsType = "btrfs";
-  fileSystems."/".options = concatStringsSep "," [
+  fileSystems."/".options = [
     "ssd"
     "space_cache"
     "compress-force=zlib"
@@ -38,10 +38,10 @@ in {
 
   fileSystems."/tmp".device = "none";
   fileSystems."/tmp".fsType = "tmpfs";
-  fileSystems."/tmp".options = "nosuid,nodev,relatime";
+  fileSystems."/tmp".options = [ "nosuid" "nodev" "relatime" ];
 
-  users.extraGroups.grandpa.gid = 666;
-  users.extraUsers.grandpa = {
+  users.groups.grandpa.gid = 666;
+  users.users.grandpa = {
     uid = 666;
     description = "GrandPA User";
     group = "grandpa";
diff --git a/machines/aszlig/managed/haenk.nix b/machines/aszlig/managed/haenk.nix
deleted file mode 100644
index 75730ff4..00000000
--- a/machines/aszlig/managed/haenk.nix
+++ /dev/null
@@ -1,95 +0,0 @@
-{ config, pkgs, lib, ... }:
-
-{
-  boot.initrd.availableKernelModules = [
-    "pata_sis" "ohci_pci" "ehci_pci" "firewire_ohci" "sd_mod" "sr_mod"
-  ];
-  boot.kernelPackages = pkgs.linuxPackages_latest;
-  boot.loader.grub = {
-    enable = true;
-    version = 2;
-    device = "/dev/disk/by-id/ata-FUJITSU_MHV2080AH_NT61T782VR71";
-  };
-
-  environment.systemPackages = with pkgs; [
-    cdparanoia chromium figlet gajim gimp htop inkscape kde5.oxygen-icons5
-    libreoffice mosh mpv pciutils skype vlc vuizvui.greybird-xfce-theme
-    vuizvui.tomahawk wget youtubeDL
-  ];
-
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/df1cab2d-cbca-4fc5-af6a-c0580c4db1b7";
-    fsType = "btrfs";
-  };
-
-  swapDevices = lib.singleton {
-    device = "/dev/disk/by-uuid/b5ea0ae8-20c6-43dd-ad97-6d8c783dac02";
-  };
-
-  hardware = {
-    cpu.amd.updateMicrocode = true;
-
-    firmware = lib.singleton (pkgs.runCommand "ipw2x00-firmware" {} ''
-      mkdir -p "$out/lib/firmware"
-      cp "${pkgs.fetchgit rec {
-        name = "ipw2x00-20151227";
-        url = "git://anonscm.debian.org/kernel/firmware-nonfree.git";
-        rev = "e4147b94a856dfe7d4dac11b5da7d9e96b3c2e95";
-        sha256 = "18kymqzhlppj520n6vkq5666qgryz3prym1pxn3sqv34yvav7agi";
-      }}"/debian/config/ipw2x00/*.fw "$out/lib/firmware/"
-    '');
-
-    pulseaudio.enable = true;
-  };
-
-  i18n.consoleKeyMap = "de";
-  i18n.defaultLocale = "en_US.UTF-8";
-
-  networking.hostName = "haenk";
-  networking.firewall.enable = false;
-  networking.wireless.enable = true;
-  networking.useNetworkd = true;
-  networking.enableIntel2200BGFirmware = true;
-
-  nix.maxJobs = 1;
-  nix.useChroot = true;
-  nix.extraOptions = ''
-    auto-optimise-store = true
-  '';
-
-  nixpkgs.config = {
-    allowUnfree = true;
-    pulseaudio = true;
-    chromium.enablePepperFlash = true;
-
-    packageOverrides = opkgs: {
-      # This is because the driver for the NV44M GPU doesn't like LLVM 3.7
-      mesa_noglu = opkgs.mesa_noglu.override {
-        llvmPackages = opkgs.llvmPackages_36;
-      };
-    };
-  };
-
-  services.openssh.enable = true;
-  services.tlp.enable = true;
-  services.ntp.extraFlags = [ "-G" ];
-
-  services.xserver.enable = true;
-  services.xserver.layout = "de";
-  services.xserver.xkbOptions = "eurosign:e";
-  services.xserver.displayManager.auto.enable = true;
-  services.xserver.displayManager.auto.user = "bla";
-  services.xserver.desktopManager.xfce.enable = true;
-  services.xserver.synaptics.enable = true;
-  services.xserver.wacom.enable = true;
-
-  time.timeZone = "Europe/Berlin";
-
-  users.extraUsers.bla = {
-    isNormalUser = true;
-    uid = 1000;
-    extraGroups = [ "video" "wheel" ];
-  };
-
-  vuizvui.user.aszlig.programs.vim.enable = true;
-}
diff --git a/machines/aszlig/managed/notsure.nix b/machines/aszlig/managed/notsure.nix
index 1b807e35..3d222970 100644
--- a/machines/aszlig/managed/notsure.nix
+++ b/machines/aszlig/managed/notsure.nix
@@ -15,7 +15,7 @@ in {
   fileSystems."/" = {
     label = "root";
     fsType = "btrfs";
-    options = "rw,space_cache,relatime";
+    options = [ "space_cache" "relatime" ];
   };
 
   hardware = {
@@ -86,4 +86,5 @@ in {
   time.timeZone = "Europe/Berlin";
 
   vuizvui.user.aszlig.programs.vim.enable = true;
+  vuizvui.enableGlobalNixpkgsConfig = true;
 }
diff --git a/machines/aszlig/managed/tyree.nix b/machines/aszlig/managed/tyree.nix
index fead2ef3..6e02e54f 100644
--- a/machines/aszlig/managed/tyree.nix
+++ b/machines/aszlig/managed/tyree.nix
@@ -17,7 +17,7 @@
 
   fileSystems."/".label = "tyree-root";
   fileSystems."/".fsType = "btrfs";
-  fileSystems."/".options = lib.concatStringsSep "," [
+  fileSystems."/".options = [
     "compress=lzo"
     "discard"
     "noatime"
@@ -37,7 +37,9 @@
 
   networking.hostName = "tyree";
   networking.firewall.enable = false;
-  networking.wireless.enable = true;
+  networking.wireless.enable = false;
+  networking.enableRTL8192cFirmware = true;
+  networking.networkmanager.enable = true;
   networking.useNetworkd = true;
 
   nix.maxJobs = 4;
@@ -63,12 +65,11 @@
   services.xserver.displayManager.auto.enable = true;
   services.xserver.displayManager.auto.user = "bla";
   services.xserver.desktopManager.kde5.enable = true;
-  services.xserver.synaptics.enable = true;
   services.xserver.wacom.enable = true;
 
   time.timeZone = "Europe/Berlin";
 
-  users.extraUsers.bla = {
+  users.users.bla = {
     isNormalUser = true;
     uid = 1000;
     extraGroups = [ "video" "wheel" ];
diff --git a/machines/aszlig/mmrnmhrm-kconf.nix b/machines/aszlig/mmrnmhrm-kconf.nix
index 17c5cc7e..539f0346 100644
--- a/machines/aszlig/mmrnmhrm-kconf.nix
+++ b/machines/aszlig/mmrnmhrm-kconf.nix
@@ -8,8 +8,11 @@
   "CONFIG_ARCH_DEFCONFIG" = "arch/x86/configs/x86_64_defconfig";
   "CONFIG_LOCKDEP_SUPPORT" = "y";
   "CONFIG_STACKTRACE_SUPPORT" = "y";
-  "CONFIG_HAVE_LATENCYTOP_SUPPORT" = "y";
   "CONFIG_MMU" = "y";
+  "CONFIG_ARCH_MMAP_RND_BITS_MIN" = "28";
+  "CONFIG_ARCH_MMAP_RND_BITS_MAX" = "32";
+  "CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN" = "8";
+  "CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX" = "16";
   "CONFIG_NEED_DMA_MAP_STATE" = "y";
   "CONFIG_NEED_SG_DMA_LENGTH" = "y";
   "CONFIG_GENERIC_ISA_DMA" = "y";
@@ -100,22 +103,21 @@
   "CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH" = "y";
   "CONFIG_ARCH_SUPPORTS_INT128" = "y";
   "CONFIG_CGROUPS" = "y";
-  "CONFIG_CGROUP_FREEZER" = "y";
-  "CONFIG_CGROUP_PIDS" = "y";
-  "CONFIG_CGROUP_DEVICE" = "y";
-  "CONFIG_CPUSETS" = "y";
-  "CONFIG_CGROUP_CPUACCT" = "y";
   "CONFIG_PAGE_COUNTER" = "y";
   "CONFIG_MEMCG" = "y";
   "CONFIG_MEMCG_SWAP" = "y";
   "CONFIG_MEMCG_SWAP_ENABLED" = "y";
-  "CONFIG_MEMCG_KMEM" = "y";
-  "CONFIG_CGROUP_PERF" = "y";
+  "CONFIG_BLK_CGROUP" = "y";
+  "CONFIG_CGROUP_WRITEBACK" = "y";
   "CONFIG_CGROUP_SCHED" = "y";
   "CONFIG_FAIR_GROUP_SCHED" = "y";
   "CONFIG_CFS_BANDWIDTH" = "y";
-  "CONFIG_BLK_CGROUP" = "y";
-  "CONFIG_CGROUP_WRITEBACK" = "y";
+  "CONFIG_CGROUP_PIDS" = "y";
+  "CONFIG_CGROUP_FREEZER" = "y";
+  "CONFIG_CPUSETS" = "y";
+  "CONFIG_CGROUP_DEVICE" = "y";
+  "CONFIG_CGROUP_CPUACCT" = "y";
+  "CONFIG_CGROUP_PERF" = "y";
   "CONFIG_NAMESPACES" = "y";
   "CONFIG_UTS_NS" = "y";
   "CONFIG_IPC_NS" = "y";
@@ -175,7 +177,6 @@
   "CONFIG_HAVE_OPTPROBES" = "y";
   "CONFIG_HAVE_KPROBES_ON_FTRACE" = "y";
   "CONFIG_HAVE_ARCH_TRACEHOOK" = "y";
-  "CONFIG_HAVE_DMA_ATTRS" = "y";
   "CONFIG_HAVE_DMA_CONTIGUOUS" = "y";
   "CONFIG_GENERIC_SMP_IDLE_THREAD" = "y";
   "CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT" = "y";
@@ -208,6 +209,10 @@
   "CONFIG_MODULES_USE_ELF_RELA" = "y";
   "CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK" = "y";
   "CONFIG_ARCH_HAS_ELF_RANDOMIZE" = "y";
+  "CONFIG_HAVE_ARCH_MMAP_RND_BITS" = "y";
+  "CONFIG_ARCH_MMAP_RND_BITS" = "28";
+  "CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS" = "y";
+  "CONFIG_ARCH_MMAP_RND_COMPAT_BITS" = "8";
   "CONFIG_HAVE_COPY_THREAD_TLS" = "y";
   "CONFIG_OLD_SIGSUSPEND3" = "y";
   "CONFIG_COMPAT_OLD_SIGACTION" = "y";
@@ -221,7 +226,6 @@
   "CONFIG_MODULE_FORCE_UNLOAD" = "y";
   "CONFIG_MODVERSIONS" = "y";
   "CONFIG_MODULES_TREE_LOOKUP" = "y";
-  "CONFIG_STOP_MACHINE" = "y";
   "CONFIG_BLOCK" = "y";
   "CONFIG_BLK_DEV_BSG" = "y";
   "CONFIG_BLK_DEV_INTEGRITY" = "y";
@@ -252,6 +256,7 @@
   "CONFIG_ZONE_DMA" = "y";
   "CONFIG_SMP" = "y";
   "CONFIG_X86_FEATURE_NAMES" = "y";
+  "CONFIG_X86_FAST_FEATURE_TESTS" = "y";
   "CONFIG_X86_SUPPORTS_MEMORY_FAILURE" = "y";
   "CONFIG_SCHED_OMIT_FRAME_POINTER" = "y";
   "CONFIG_NO_BOOTMEM" = "y";
@@ -416,6 +421,7 @@
   "CONFIG_PMC_ATOM" = "y";
   "CONFIG_NET" = "y";
   "CONFIG_NET_INGRESS" = "y";
+  "CONFIG_NET_EGRESS" = "y";
   "CONFIG_PACKET" = "y";
   "CONFIG_PACKET_DIAG" = "m";
   "CONFIG_UNIX" = "y";
@@ -438,7 +444,6 @@
   "CONFIG_DEFAULT_TCP_CONG" = "cubic";
   "CONFIG_IPV6" = "y";
   "CONFIG_IPV6_ROUTER_PREF" = "y";
-  "CONFIG_IPV6_ILA" = "m";
   "CONFIG_INET6_TUNNEL" = "m";
   "CONFIG_IPV6_SIT" = "m";
   "CONFIG_IPV6_NDISC_NODETYPE" = "y";
@@ -512,6 +517,7 @@
   "CONFIG_RPS" = "y";
   "CONFIG_RFS_ACCEL" = "y";
   "CONFIG_XPS" = "y";
+  "CONFIG_SOCK_CGROUP_DATA" = "y";
   "CONFIG_CGROUP_NET_CLASSID" = "y";
   "CONFIG_NET_RX_BUSY_POLL" = "y";
   "CONFIG_BQL" = "y";
@@ -589,8 +595,11 @@
   "CONFIG_INPUT_JOYDEV" = "y";
   "CONFIG_INPUT_EVDEV" = "y";
   "CONFIG_INPUT_KEYBOARD" = "y";
-  "CONFIG_KEYBOARD_ATKBD" = "y";
   "CONFIG_INPUT_MOUSE" = "y";
+  "CONFIG_INPUT_JOYSTICK" = "y";
+  "CONFIG_JOYSTICK_XPAD" = "y";
+  "CONFIG_JOYSTICK_XPAD_FF" = "y";
+  "CONFIG_JOYSTICK_XPAD_LEDS" = "y";
   "CONFIG_INPUT_TABLET" = "y";
   "CONFIG_SERIO" = "y";
   "CONFIG_ARCH_MIGHT_HAVE_PC_SERIO" = "y";
@@ -675,6 +684,7 @@
   "CONFIG_DRM_BRIDGE" = "y";
   "CONFIG_FB" = "y";
   "CONFIG_FB_CMDLINE" = "y";
+  "CONFIG_FB_NOTIFY" = "y";
   "CONFIG_FB_CFB_FILLRECT" = "y";
   "CONFIG_FB_CFB_COPYAREA" = "y";
   "CONFIG_FB_CFB_IMAGEBLIT" = "y";
@@ -737,8 +747,11 @@
   "CONFIG_HIDRAW" = "y";
   "CONFIG_UHID" = "m";
   "CONFIG_HID_GENERIC" = "y";
+  "CONFIG_HID_MICROSOFT" = "m";
   "CONFIG_HID_GREENASIA" = "y";
   "CONFIG_GREENASIA_FF" = "y";
+  "CONFIG_HID_SENSOR_HUB" = "m";
+  "CONFIG_HID_SENSOR_CUSTOM_SENSOR" = "m";
   "CONFIG_USB_HID" = "y";
   "CONFIG_USB_HIDDEV" = "y";
   "CONFIG_I2C_HID" = "m";
@@ -806,6 +819,7 @@
   "CONFIG_USB_SERIAL_METRO" = "m";
   "CONFIG_USB_SERIAL_MOS7720" = "m";
   "CONFIG_USB_SERIAL_MOS7840" = "m";
+  "CONFIG_USB_SERIAL_MXUPORT11" = "m";
   "CONFIG_USB_SERIAL_MXUPORT" = "m";
   "CONFIG_USB_SERIAL_NAVMAN" = "m";
   "CONFIG_USB_SERIAL_PL2303" = "m";
@@ -860,6 +874,7 @@
   "CONFIG_CLKEVT_I8253" = "y";
   "CONFIG_I8253_LOCK" = "y";
   "CONFIG_CLKBLD_I8253" = "y";
+  "CONFIG_ARM_GIC_MAX_NR" = "1";
   "CONFIG_RAS" = "y";
   "CONFIG_LIBNVDIMM" = "m";
   "CONFIG_ND_BLK" = "m";
@@ -1029,7 +1044,10 @@
   "CONFIG_TEST_HEXDUMP" = "m";
   "CONFIG_MEMTEST" = "y";
   "CONFIG_HAVE_ARCH_KGDB" = "y";
+  "CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL" = "y";
+  "CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED" = "y";
   "CONFIG_STRICT_DEVMEM" = "y";
+  "CONFIG_IO_STRICT_DEVMEM" = "y";
   "CONFIG_X86_VERBOSE_BOOTUP" = "y";
   "CONFIG_EARLY_PRINTK" = "y";
   "CONFIG_DOUBLEFAULT" = "y";
@@ -1261,6 +1279,7 @@
   "CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE" = "y";
   "CONFIG_CLZ_TAB" = "y";
   "CONFIG_CORDIC" = "y";
+  "CONFIG_IRQ_POLL" = "y";
   "CONFIG_MPILIB" = "m";
   "CONFIG_OID_REGISTRY" = "y";
   "CONFIG_FONT_SUPPORT" = "y";
diff --git a/machines/aszlig/mmrnmhrm.nix b/machines/aszlig/mmrnmhrm.nix
index 49826d9b..b9d422e6 100644
--- a/machines/aszlig/mmrnmhrm.nix
+++ b/machines/aszlig/mmrnmhrm.nix
@@ -23,12 +23,7 @@ with lib;
     "/" = {
       label = "root";
       fsType = "btrfs";
-      options = concatStringsSep "," [
-        "autodefrag"
-        "space_cache"
-        "compress=lzo"
-        "noatime"
-      ];
+      options = [ "autodefrag" "space_cache" "compress=lzo" "noatime" ];
     };
   };
 
diff --git a/machines/aszlig/tishtushi.nix b/machines/aszlig/tishtushi.nix
index a3f281f4..3232d222 100644
--- a/machines/aszlig/tishtushi.nix
+++ b/machines/aszlig/tishtushi.nix
@@ -40,17 +40,13 @@ in {
   fileSystems."/" = {
     device = "/dev/disk/by-uuid/${rootUUID}";
     fsType = "btrfs";
-    options = concatStringsSep "," [
-      "space_cache" "compress=zlib" "noatime"
-    ];
+    options = [ "space_cache" "compress=zlib" "noatime" ];
   };
 
   fileSystems."/nix/store" = {
     device = "/dev/disk/by-uuid/${storeUUID}";
     fsType = "btrfs";
-    options = concatStringsSep "," [
-      "ssd" "compress-force=zlib" "noatime"
-    ];
+    options = [ "ssd" "compress-force=zlib" "noatime" ];
   };
 
   swapDevices = singleton {
diff --git a/machines/default.nix b/machines/default.nix
index 7c0ed379..d15bd7eb 100644
--- a/machines/default.nix
+++ b/machines/default.nix
@@ -10,7 +10,6 @@ in {
     kzerza    = callMachine ./aszlig/kzerza.nix {};
     tishtushi = callMachine ./aszlig/tishtushi.nix {};
     managed = {
-      haenk   = callMachine ./aszlig/managed/haenk.nix {};
       notsure = callMachine ./aszlig/managed/notsure.nix {};
       tyree   = callMachine ./aszlig/managed/tyree.nix {};
     };
diff --git a/machines/labnet/labtop.nix b/machines/labnet/labtop.nix
index 65e3723d..a206f93c 100644
--- a/machines/labnet/labtop.nix
+++ b/machines/labnet/labtop.nix
@@ -1,28 +1,6 @@
 { pkgs, lib, ... }:
 
 let
-  greybird = pkgs.stdenv.mkDerivation {
-    name = "greybird-xfce-theme";
-
-    src = pkgs.fetchFromGitHub {
-      repo = "Greybird";
-      owner = "shimmerproject";
-      rev = "61ec18d22780aa87998381599c941e0cf4f7bfb5";
-      sha256 = "03h8hba4lfp337a4drylcplrbggry9gz8dq1f3gjy25fhqkgvq05";
-    };
-
-    phases = [ "unpackPhase" "installPhase" ];
-
-    installPhase = ''
-      mkdir -p "$out/share/themes/Greybird" \
-               "$out/share/themes/Greybird-compact/xfwm4"
-      cp -vrt "$out/share/themes/Greybird" \
-        gtk-* metacity-1 unity xfce-notify-4.0 xfwm4
-      cp -vrt "$out/share/themes/Greybird-compact/xfwm4" \
-        xfwm4_compact/*
-    '';
-  };
-
   modulesPath = "${import ../../nixpkgs-path.nix}/nixos/modules";
 
 in {
@@ -48,6 +26,8 @@ in {
 
   vuizvui.hardware.thinkpad.enable = true;
 
+  hardware.trackpoint.enable = false;
+
   environment.systemPackages = with pkgs; [
     #repetierhost <- TODO
     ack
@@ -62,7 +42,6 @@ in {
     gimp
     git
     gmpc
-    vuizvui.greybird-xfce-theme
     inkscape
     ino
     (libreoffice.overrideDerivation (lib.const { doCheck = false; }))
@@ -85,21 +64,12 @@ in {
 
     displayManager.auto.enable = true;
     displayManager.auto.user = "openlab";
-    desktopManager.xfce.enable = true;
-    # synaptics.enable = true;
-    # synaptics.minSpeed = "0.5";
-    # synaptics.accelFactor = "0.01";
+    desktopManager.gnome3.enable = true;
+    synaptics.enable = true;
+    synaptics.minSpeed = "0.5";
+    synaptics.accelFactor = "0.01";
   };
 
-
-  # hardware.trackpoint = {
-  #   enable = true;
-  #   emulateWheel = true;
-  #   sensitivity = 130;
-  #   speed = 350;
-  # };
-
-
   services.openssh.enable = true;
 
   networking.networkmanager.enable = true;
@@ -114,7 +84,7 @@ in {
   nix.maxJobs = 2;
 
   users.mutableUsers = false;
-  users.extraUsers.openlab = {
+  users.users.openlab = {
     uid = 1000;
     isNormalUser = true;
     password = "openlab";
diff --git a/machines/profpatsch/katara.nix b/machines/profpatsch/katara.nix
index 98074e41..73f0430c 100644
--- a/machines/profpatsch/katara.nix
+++ b/machines/profpatsch/katara.nix
@@ -299,7 +299,7 @@ in {
 
     # Nobody wants mutable state. :)
     users.mutableUsers = false;
-    users.extraUsers =
+    users.users =
       let authKeys = ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJhthfk38lzDvoI7lPqRneI0yBpZEhLDGRBpcXzpPSu+V0YlgrDix5fHhBl+EKfw4aeQNvQNuAky3pDtX+BDK1b7idbz9ZMCExy2a1kBKDVJz/onLSQxiiZMuHlAljVj9iU4uoTOxX3vB85Ok9aZtMP1rByRIWR9e81/km4HdfZTCjFVRLWfvo0s29H7l0fnbG9bb2E6kydlvjnXJnZFXX+KUM16X11lK53ilPdPJdm87VtxeSKZ7GOiBz6q7FHzEd2Zc3CnzgupQiXGSblXrlN22IY3IWfm5S/8RTeQbMLVoH0TncgCeenXH7FU/sXD79ypqQV/WaVVDYMOirsnh/ philip@nyx"];
       in {
         philip = rec {
diff --git a/machines/sternenseemann/fliewatuet.nix b/machines/sternenseemann/fliewatuet.nix
index 6c8994ee..94d84287 100644
--- a/machines/sternenseemann/fliewatuet.nix
+++ b/machines/sternenseemann/fliewatuet.nix
@@ -256,7 +256,7 @@ in {
   programs.fish.enable = true;
 
   users.mutableUsers = false;
-  users.extraUsers.lukas = {
+  users.users.lukas = {
     isNormalUser = true;
     uid = 1000;
     home = "/home/lukas";
diff --git a/machines/sternenseemann/schnurrkadse.nix b/machines/sternenseemann/schnurrkadse.nix
index e1bf9f63..fc38373f 100644
--- a/machines/sternenseemann/schnurrkadse.nix
+++ b/machines/sternenseemann/schnurrkadse.nix
@@ -16,8 +16,16 @@
     ];
 
   nix.maxJobs = 1;
-  networking.enableIntel2200BGFirmware = true;
-  hardware.enableAllFirmware = true;
+  hardware.firmware = let myfirmware = pkgs.firmwareLinuxNonfree.overrideDerivation
+    (old: {
+      name = "myfirmware";
+      src = pkgs.fetchFromGitHub {
+        owner = "wkennington";
+        repo = "linux-firmware";
+        rev = "2016-01-26";
+        sha256="07hv4kgbsxndhm1va6k6scy083886aap3naq1l4jdz7dnph4ir02";
+      };
+    }); in [ myfirmware ];
 
   hardware.trackpoint = {
     enable = true;
@@ -96,7 +104,7 @@
 
   programs.fish.enable = true;
 
-  users.extraUsers.lukas = {
+  users.users.lukas = {
     isNormalUser = true;
     uid = 1000;
     shell = "/run/current-system/sw/bin/fish";
diff --git a/modules/hardware/t100ha/default.nix b/modules/hardware/t100ha/default.nix
index d5f2138e..c55a1acc 100644
--- a/modules/hardware/t100ha/default.nix
+++ b/modules/hardware/t100ha/default.nix
@@ -8,13 +8,61 @@ in {
   options.vuizvui.hardware.t100ha.enable = lib.mkEnableOption desc;
 
   config = lib.mkIf cfg.enable {
-    # Needed for booting from MMC:
-    boot.initrd.availableKernelModules = [
-      "xhci_pci" "sdhci_acpi" "mmc_block"
-    ];
-    # It's a CherryTrail SoC, so we want to have the latest and greatest:
-    boot.kernelPackages = pkgs.linuxPackages_latest;
+    # It's a CherryTrail SoC, so we want to have the latest and greatest with a
+    # few additional patches:
+    boot.kernelPackages = let
+      nixpkgs = import ../../../nixpkgs-path.nix;
+      mkKernel = import "${nixpkgs}/pkgs/os-specific/linux/kernel/generic.nix";
+      t100haKernel = mkKernel rec {
+        version = "4.5-rc5";
+        modDirVersion = "4.5.0-rc5";
+        extraMeta.branch = "4.5";
+
+        src = pkgs.fetchurl {
+          url = "mirror://kernel/linux/kernel/v4.x/testing/"
+              + "linux-${version}.tar.xz";
+          sha256 = "06qlypnrlkckxhf3clq6l2d3kps7rwfw811sxapjbnhzjd75fcx8";
+        };
+
+        kernelPatches = lib.singleton {
+          name = "drm-fixes.patch";
+          patch = ./drm-fixes.patch;
+        };
+
+        extraConfig = ''
+          MMC y
+          MMC_BLOCK y
+          MMC_SDHCI y
+          MMC_SDHCI_ACPI y
+          PINCTRL_CHERRYVIEW y
+        '';
+
+        features.iwlwifi = true;
+        features.efiBootStub = true;
+        features.needsCifsUtils = true;
+        features.canDisableNetfilterConntrackHelpers = true;
+        features.netfilterRPFilter = true;
+
+        inherit (pkgs) stdenv perl buildLinux;
+      };
+      self = pkgs.linuxPackagesFor t100haKernel self;
+    in self;
+
     # By default the console is rotated by 90 degrees to the right.
     boot.kernelParams = [ "fbcon=rotate:3" ];
+    services.xserver.deviceSection = ''
+      Option "monitor-DSI1" "Monitor[0]"
+    '';
+    services.xserver.monitorSection = ''
+      Option "Rotate" "left"
+    '';
+    services.xserver.videoDriver = "intel";
+
+    # The touch screen needs to be rotated as well:
+    services.xserver.inputClassSections = lib.singleton ''
+      Identifier "touchscreen"
+      MatchProduct "SIS0457"
+      Option "TransformationMatrix" "0 -1 1 1 0 0 0 0 1"
+    '';
   };
 }
diff --git a/modules/hardware/t100ha/drm-fixes.patch b/modules/hardware/t100ha/drm-fixes.patch
new file mode 100644
index 00000000..2aceb0dc
--- /dev/null
+++ b/modules/hardware/t100ha/drm-fixes.patch
@@ -0,0 +1,1019 @@
+diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
+index 0fc38bb..cf39ed3 100644
+--- a/drivers/gpu/drm/i915/i915_debugfs.c
++++ b/drivers/gpu/drm/i915/i915_debugfs.c
+@@ -825,8 +825,11 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
+ 		}
+ 
+ 		for_each_pipe(dev_priv, pipe) {
+-			if (!intel_display_power_is_enabled(dev_priv,
+-						POWER_DOMAIN_PIPE(pipe))) {
++			enum intel_display_power_domain power_domain;
++
++			power_domain = POWER_DOMAIN_PIPE(pipe);
++			if (!intel_display_power_get_if_enabled(dev_priv,
++								power_domain)) {
+ 				seq_printf(m, "Pipe %c power disabled\n",
+ 					   pipe_name(pipe));
+ 				continue;
+@@ -840,6 +843,8 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
+ 			seq_printf(m, "Pipe %c IER:\t%08x\n",
+ 				   pipe_name(pipe),
+ 				   I915_READ(GEN8_DE_PIPE_IER(pipe)));
++
++			intel_display_power_put(dev_priv, power_domain);
+ 		}
+ 
+ 		seq_printf(m, "Display Engine port interrupt mask:\t%08x\n",
+@@ -3985,6 +3990,7 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
+ 	struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe];
+ 	struct intel_crtc *crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev,
+ 									pipe));
++	enum intel_display_power_domain power_domain;
+ 	u32 val = 0; /* shut up gcc */
+ 	int ret;
+ 
+@@ -3995,7 +4001,8 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
+ 	if (pipe_crc->source && source)
+ 		return -EINVAL;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PIPE(pipe))) {
++	power_domain = POWER_DOMAIN_PIPE(pipe);
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) {
+ 		DRM_DEBUG_KMS("Trying to capture CRC while pipe is off\n");
+ 		return -EIO;
+ 	}
+@@ -4012,7 +4019,7 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
+ 		ret = ivb_pipe_crc_ctl_reg(dev, pipe, &source, &val);
+ 
+ 	if (ret != 0)
+-		return ret;
++		goto out;
+ 
+ 	/* none -> real source transition */
+ 	if (source) {
+@@ -4024,8 +4031,10 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
+ 		entries = kcalloc(INTEL_PIPE_CRC_ENTRIES_NR,
+ 				  sizeof(pipe_crc->entries[0]),
+ 				  GFP_KERNEL);
+-		if (!entries)
+-			return -ENOMEM;
++		if (!entries) {
++			ret = -ENOMEM;
++			goto out;
++		}
+ 
+ 		/*
+ 		 * When IPS gets enabled, the pipe CRC changes. Since IPS gets
+@@ -4081,7 +4090,12 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
+ 		hsw_enable_ips(crtc);
+ 	}
+ 
+-	return 0;
++	ret = 0;
++
++out:
++	intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ /*
+diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
+index e7cd311..b0847b9 100644
+--- a/drivers/gpu/drm/i915/i915_drv.h
++++ b/drivers/gpu/drm/i915/i915_drv.h
+@@ -751,6 +751,7 @@ struct intel_csr {
+ 	uint32_t mmio_count;
+ 	i915_reg_t mmioaddr[8];
+ 	uint32_t mmiodata[8];
++	uint32_t dc_state;
+ };
+ 
+ #define DEV_INFO_FOR_EACH_FLAG(func, sep) \
+diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
+index 9c89df1..a7b4a524 100644
+--- a/drivers/gpu/drm/i915/intel_crt.c
++++ b/drivers/gpu/drm/i915/intel_crt.c
+@@ -71,22 +71,29 @@ static bool intel_crt_get_hw_state(struct intel_encoder *encoder,
+ 	struct intel_crt *crt = intel_encoder_to_crt(encoder);
+ 	enum intel_display_power_domain power_domain;
+ 	u32 tmp;
++	bool ret;
+ 
+ 	power_domain = intel_display_port_power_domain(encoder);
+-	if (!intel_display_power_is_enabled(dev_priv, power_domain))
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
+ 
++	ret = false;
++
+ 	tmp = I915_READ(crt->adpa_reg);
+ 
+ 	if (!(tmp & ADPA_DAC_ENABLE))
+-		return false;
++		goto out;
+ 
+ 	if (HAS_PCH_CPT(dev))
+ 		*pipe = PORT_TO_PIPE_CPT(tmp);
+ 	else
+ 		*pipe = PORT_TO_PIPE(tmp);
+ 
+-	return true;
++	ret = true;
++out:
++	intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ static unsigned int intel_crt_get_flags(struct intel_encoder *encoder)
+diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c
+index 9bb63a8..647d85e 100644
+--- a/drivers/gpu/drm/i915/intel_csr.c
++++ b/drivers/gpu/drm/i915/intel_csr.c
+@@ -240,6 +240,8 @@ void intel_csr_load_program(struct drm_i915_private *dev_priv)
+ 		I915_WRITE(dev_priv->csr.mmioaddr[i],
+ 			   dev_priv->csr.mmiodata[i]);
+ 	}
++
++	dev_priv->csr.dc_state = 0;
+ }
+ 
+ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
+diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
+index 54a165b..0f3df2c 100644
+--- a/drivers/gpu/drm/i915/intel_ddi.c
++++ b/drivers/gpu/drm/i915/intel_ddi.c
+@@ -1969,13 +1969,16 @@ bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
+ 	enum transcoder cpu_transcoder;
+ 	enum intel_display_power_domain power_domain;
+ 	uint32_t tmp;
++	bool ret;
+ 
+ 	power_domain = intel_display_port_power_domain(intel_encoder);
+-	if (!intel_display_power_is_enabled(dev_priv, power_domain))
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
+ 
+-	if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
+-		return false;
++	if (!intel_encoder->get_hw_state(intel_encoder, &pipe)) {
++		ret = false;
++		goto out;
++	}
+ 
+ 	if (port == PORT_A)
+ 		cpu_transcoder = TRANSCODER_EDP;
+@@ -1987,23 +1990,33 @@ bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
+ 	switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
+ 	case TRANS_DDI_MODE_SELECT_HDMI:
+ 	case TRANS_DDI_MODE_SELECT_DVI:
+-		return (type == DRM_MODE_CONNECTOR_HDMIA);
++		ret = type == DRM_MODE_CONNECTOR_HDMIA;
++		break;
+ 
+ 	case TRANS_DDI_MODE_SELECT_DP_SST:
+-		if (type == DRM_MODE_CONNECTOR_eDP)
+-			return true;
+-		return (type == DRM_MODE_CONNECTOR_DisplayPort);
++		ret = type == DRM_MODE_CONNECTOR_eDP ||
++		      type == DRM_MODE_CONNECTOR_DisplayPort;
++		break;
++
+ 	case TRANS_DDI_MODE_SELECT_DP_MST:
+ 		/* if the transcoder is in MST state then
+ 		 * connector isn't connected */
+-		return false;
++		ret = false;
++		break;
+ 
+ 	case TRANS_DDI_MODE_SELECT_FDI:
+-		return (type == DRM_MODE_CONNECTOR_VGA);
++		ret = type == DRM_MODE_CONNECTOR_VGA;
++		break;
+ 
+ 	default:
+-		return false;
++		ret = false;
++		break;
+ 	}
++
++out:
++	intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
+@@ -2015,15 +2028,18 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
+ 	enum intel_display_power_domain power_domain;
+ 	u32 tmp;
+ 	int i;
++	bool ret;
+ 
+ 	power_domain = intel_display_port_power_domain(encoder);
+-	if (!intel_display_power_is_enabled(dev_priv, power_domain))
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
+ 
++	ret = false;
++
+ 	tmp = I915_READ(DDI_BUF_CTL(port));
+ 
+ 	if (!(tmp & DDI_BUF_CTL_ENABLE))
+-		return false;
++		goto out;
+ 
+ 	if (port == PORT_A) {
+ 		tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
+@@ -2041,25 +2057,32 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
+ 			break;
+ 		}
+ 
+-		return true;
+-	} else {
+-		for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
+-			tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
++		ret = true;
+ 
+-			if ((tmp & TRANS_DDI_PORT_MASK)
+-			    == TRANS_DDI_SELECT_PORT(port)) {
+-				if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == TRANS_DDI_MODE_SELECT_DP_MST)
+-					return false;
++		goto out;
++	}
+ 
+-				*pipe = i;
+-				return true;
+-			}
++	for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
++		tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
++
++		if ((tmp & TRANS_DDI_PORT_MASK) == TRANS_DDI_SELECT_PORT(port)) {
++			if ((tmp & TRANS_DDI_MODE_SELECT_MASK) ==
++			    TRANS_DDI_MODE_SELECT_DP_MST)
++				goto out;
++
++			*pipe = i;
++			ret = true;
++
++			goto out;
+ 		}
+ 	}
+ 
+ 	DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
+ 
+-	return false;
++out:
++	intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
+@@ -2508,12 +2531,14 @@ static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
+ {
+ 	uint32_t val;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
++	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+ 		return false;
+ 
+ 	val = I915_READ(WRPLL_CTL(pll->id));
+ 	hw_state->wrpll = val;
+ 
++	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
++
+ 	return val & WRPLL_PLL_ENABLE;
+ }
+ 
+@@ -2523,12 +2548,14 @@ static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
+ {
+ 	uint32_t val;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
++	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+ 		return false;
+ 
+ 	val = I915_READ(SPLL_CTL);
+ 	hw_state->spll = val;
+ 
++	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
++
+ 	return val & SPLL_PLL_ENABLE;
+ }
+ 
+@@ -2645,16 +2672,19 @@ static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
+ 	uint32_t val;
+ 	unsigned int dpll;
+ 	const struct skl_dpll_regs *regs = skl_dpll_regs;
++	bool ret;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
++	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+ 		return false;
+ 
++	ret = false;
++
+ 	/* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
+ 	dpll = pll->id + 1;
+ 
+ 	val = I915_READ(regs[pll->id].ctl);
+ 	if (!(val & LCPLL_PLL_ENABLE))
+-		return false;
++		goto out;
+ 
+ 	val = I915_READ(DPLL_CTRL1);
+ 	hw_state->ctrl1 = (val >> (dpll * 6)) & 0x3f;
+@@ -2664,8 +2694,12 @@ static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
+ 		hw_state->cfgcr1 = I915_READ(regs[pll->id].cfgcr1);
+ 		hw_state->cfgcr2 = I915_READ(regs[pll->id].cfgcr2);
+ 	}
++	ret = true;
+ 
+-	return true;
++out:
++	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
++
++	return ret;
+ }
+ 
+ static void skl_shared_dplls_init(struct drm_i915_private *dev_priv)
+@@ -2932,13 +2966,16 @@ static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
+ {
+ 	enum port port = (enum port)pll->id;	/* 1:1 port->PLL mapping */
+ 	uint32_t val;
++	bool ret;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
++	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+ 		return false;
+ 
++	ret = false;
++
+ 	val = I915_READ(BXT_PORT_PLL_ENABLE(port));
+ 	if (!(val & PORT_PLL_ENABLE))
+-		return false;
++		goto out;
+ 
+ 	hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(port));
+ 	hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
+@@ -2985,7 +3022,12 @@ static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
+ 				 I915_READ(BXT_PORT_PCS_DW12_LN23(port)));
+ 	hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
+ 
+-	return true;
++	ret = true;
++
++out:
++	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
++
++	return ret;
+ }
+ 
+ static void bxt_shared_dplls_init(struct drm_i915_private *dev_priv)
+@@ -3120,11 +3162,15 @@ bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
+ {
+ 	u32 temp;
+ 
+-	if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
++	if (intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
+ 		temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
++
++		intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
++
+ 		if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
+ 			return true;
+ 	}
++
+ 	return false;
+ }
+ 
+diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
+index 5feb657..46947ff 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -1351,18 +1351,21 @@ void assert_pipe(struct drm_i915_private *dev_priv,
+ 	bool cur_state;
+ 	enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
+ 								      pipe);
++	enum intel_display_power_domain power_domain;
+ 
+ 	/* if we need the pipe quirk it must be always on */
+ 	if ((pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE) ||
+ 	    (pipe == PIPE_B && dev_priv->quirks & QUIRK_PIPEB_FORCE))
+ 		state = true;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv,
+-				POWER_DOMAIN_TRANSCODER(cpu_transcoder))) {
+-		cur_state = false;
+-	} else {
++	power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
++	if (intel_display_power_get_if_enabled(dev_priv, power_domain)) {
+ 		u32 val = I915_READ(PIPECONF(cpu_transcoder));
+ 		cur_state = !!(val & PIPECONF_ENABLE);
++
++		intel_display_power_put(dev_priv, power_domain);
++	} else {
++		cur_state = false;
+ 	}
+ 
+ 	I915_STATE_WARN(cur_state != state,
+@@ -8171,18 +8174,22 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
+ {
+ 	struct drm_device *dev = crtc->base.dev;
+ 	struct drm_i915_private *dev_priv = dev->dev_private;
++	enum intel_display_power_domain power_domain;
+ 	uint32_t tmp;
++	bool ret;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv,
+-					    POWER_DOMAIN_PIPE(crtc->pipe)))
++	power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
+ 
+ 	pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
+ 	pipe_config->shared_dpll = DPLL_ID_PRIVATE;
+ 
++	ret = false;
++
+ 	tmp = I915_READ(PIPECONF(crtc->pipe));
+ 	if (!(tmp & PIPECONF_ENABLE))
+-		return false;
++		goto out;
+ 
+ 	if (IS_G4X(dev) || IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+ 		switch (tmp & PIPECONF_BPC_MASK) {
+@@ -8262,7 +8269,12 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
+ 	pipe_config->base.adjusted_mode.crtc_clock =
+ 		pipe_config->port_clock / pipe_config->pixel_multiplier;
+ 
+-	return true;
++	ret = true;
++
++out:
++	intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ static void ironlake_init_pch_refclk(struct drm_device *dev)
+@@ -9366,18 +9378,21 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
+ {
+ 	struct drm_device *dev = crtc->base.dev;
+ 	struct drm_i915_private *dev_priv = dev->dev_private;
++	enum intel_display_power_domain power_domain;
+ 	uint32_t tmp;
++	bool ret;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv,
+-					    POWER_DOMAIN_PIPE(crtc->pipe)))
++	power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
+ 
+ 	pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
+ 	pipe_config->shared_dpll = DPLL_ID_PRIVATE;
+ 
++	ret = false;
+ 	tmp = I915_READ(PIPECONF(crtc->pipe));
+ 	if (!(tmp & PIPECONF_ENABLE))
+-		return false;
++		goto out;
+ 
+ 	switch (tmp & PIPECONF_BPC_MASK) {
+ 	case PIPECONF_6BPC:
+@@ -9440,7 +9455,12 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
+ 
+ 	ironlake_get_pfit_config(crtc, pipe_config);
+ 
+-	return true;
++	ret = true;
++
++out:
++	intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
+@@ -9950,12 +9970,17 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
+ {
+ 	struct drm_device *dev = crtc->base.dev;
+ 	struct drm_i915_private *dev_priv = dev->dev_private;
+-	enum intel_display_power_domain pfit_domain;
++	enum intel_display_power_domain power_domain;
++	unsigned long power_domain_mask;
+ 	uint32_t tmp;
++	bool ret;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv,
+-					 POWER_DOMAIN_PIPE(crtc->pipe)))
++	power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
++	power_domain_mask = BIT(power_domain);
++
++	ret = false;
+ 
+ 	pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
+ 	pipe_config->shared_dpll = DPLL_ID_PRIVATE;
+@@ -9982,13 +10007,14 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
+ 			pipe_config->cpu_transcoder = TRANSCODER_EDP;
+ 	}
+ 
+-	if (!intel_display_power_is_enabled(dev_priv,
+-			POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder)))
+-		return false;
++	power_domain = POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder);
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
++		goto out;
++	power_domain_mask |= BIT(power_domain);
+ 
+ 	tmp = I915_READ(PIPECONF(pipe_config->cpu_transcoder));
+ 	if (!(tmp & PIPECONF_ENABLE))
+-		return false;
++		goto out;
+ 
+ 	haswell_get_ddi_port_state(crtc, pipe_config);
+ 
+@@ -9998,14 +10024,14 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
+ 		skl_init_scalers(dev, crtc, pipe_config);
+ 	}
+ 
+-	pfit_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
+-
+ 	if (INTEL_INFO(dev)->gen >= 9) {
+ 		pipe_config->scaler_state.scaler_id = -1;
+ 		pipe_config->scaler_state.scaler_users &= ~(1 << SKL_CRTC_INDEX);
+ 	}
+ 
+-	if (intel_display_power_is_enabled(dev_priv, pfit_domain)) {
++	power_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
++	if (intel_display_power_get_if_enabled(dev_priv, power_domain)) {
++		power_domain_mask |= BIT(power_domain);
+ 		if (INTEL_INFO(dev)->gen >= 9)
+ 			skylake_get_pfit_config(crtc, pipe_config);
+ 		else
+@@ -10023,7 +10049,13 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
+ 		pipe_config->pixel_multiplier = 1;
+ 	}
+ 
+-	return true;
++	ret = true;
++
++out:
++	for_each_power_domain(power_domain, power_domain_mask)
++		intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ static void i845_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
+@@ -13630,7 +13662,7 @@ static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
+ {
+ 	uint32_t val;
+ 
+-	if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
++	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+ 		return false;
+ 
+ 	val = I915_READ(PCH_DPLL(pll->id));
+@@ -13638,6 +13670,8 @@ static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
+ 	hw_state->fp0 = I915_READ(PCH_FP0(pll->id));
+ 	hw_state->fp1 = I915_READ(PCH_FP1(pll->id));
+ 
++	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
++
+ 	return val & DPLL_VCO_ENABLE;
+ }
+ 
+@@ -15568,10 +15602,12 @@ void i915_redisable_vga(struct drm_device *dev)
+ 	 * level, just check if the power well is enabled instead of trying to
+ 	 * follow the "don't touch the power well if we don't need it" policy
+ 	 * the rest of the driver uses. */
+-	if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_VGA))
++	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_VGA))
+ 		return;
+ 
+ 	i915_redisable_vga_power_on(dev);
++
++	intel_display_power_put(dev_priv, POWER_DOMAIN_VGA);
+ }
+ 
+ static bool primary_get_hw_state(struct intel_plane *plane)
+diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
+index 1bbd67b..1d8de43 100644
+--- a/drivers/gpu/drm/i915/intel_dp.c
++++ b/drivers/gpu/drm/i915/intel_dp.c
+@@ -2362,15 +2362,18 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
+ 	struct drm_i915_private *dev_priv = dev->dev_private;
+ 	enum intel_display_power_domain power_domain;
+ 	u32 tmp;
++	bool ret;
+ 
+ 	power_domain = intel_display_port_power_domain(encoder);
+-	if (!intel_display_power_is_enabled(dev_priv, power_domain))
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
+ 
++	ret = false;
++
+ 	tmp = I915_READ(intel_dp->output_reg);
+ 
+ 	if (!(tmp & DP_PORT_EN))
+-		return false;
++		goto out;
+ 
+ 	if (IS_GEN7(dev) && port == PORT_A) {
+ 		*pipe = PORT_TO_PIPE_CPT(tmp);
+@@ -2381,7 +2384,9 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
+ 			u32 trans_dp = I915_READ(TRANS_DP_CTL(p));
+ 			if (TRANS_DP_PIPE_TO_PORT(trans_dp) == port) {
+ 				*pipe = p;
+-				return true;
++				ret = true;
++
++				goto out;
+ 			}
+ 		}
+ 
+@@ -2393,7 +2398,12 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
+ 		*pipe = PORT_TO_PIPE(tmp);
+ 	}
+ 
+-	return true;
++	ret = true;
++
++out:
++	intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ static void intel_dp_get_config(struct intel_encoder *encoder,
+diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
+index ea54158..df7f3cb 100644
+--- a/drivers/gpu/drm/i915/intel_drv.h
++++ b/drivers/gpu/drm/i915/intel_drv.h
+@@ -1428,6 +1428,8 @@ bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
+ 				      enum intel_display_power_domain domain);
+ void intel_display_power_get(struct drm_i915_private *dev_priv,
+ 			     enum intel_display_power_domain domain);
++bool intel_display_power_get_if_enabled(struct drm_i915_private *dev_priv,
++					enum intel_display_power_domain domain);
+ void intel_display_power_put(struct drm_i915_private *dev_priv,
+ 			     enum intel_display_power_domain domain);
+ 
+@@ -1514,6 +1516,7 @@ enable_rpm_wakeref_asserts(struct drm_i915_private *dev_priv)
+ 	enable_rpm_wakeref_asserts(dev_priv)
+ 
+ void intel_runtime_pm_get(struct drm_i915_private *dev_priv);
++bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *dev_priv);
+ void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv);
+ void intel_runtime_pm_put(struct drm_i915_private *dev_priv);
+ 
+diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
+index 44742fa..0193c62a 100644
+--- a/drivers/gpu/drm/i915/intel_dsi.c
++++ b/drivers/gpu/drm/i915/intel_dsi.c
+@@ -664,13 +664,16 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
+ 	struct drm_device *dev = encoder->base.dev;
+ 	enum intel_display_power_domain power_domain;
+ 	enum port port;
++	bool ret;
+ 
+ 	DRM_DEBUG_KMS("\n");
+ 
+ 	power_domain = intel_display_port_power_domain(encoder);
+-	if (!intel_display_power_is_enabled(dev_priv, power_domain))
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
+ 
++	ret = false;
++
+ 	/* XXX: this only works for one DSI output */
+ 	for_each_dsi_port(port, intel_dsi->ports) {
+ 		i915_reg_t ctrl_reg = IS_BROXTON(dev) ?
+@@ -691,12 +694,16 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
+ 		if (dpi_enabled || (func & CMD_MODE_DATA_WIDTH_MASK)) {
+ 			if (I915_READ(MIPI_DEVICE_READY(port)) & DEVICE_READY) {
+ 				*pipe = port == PORT_A ? PIPE_A : PIPE_B;
+-				return true;
++				ret = true;
++
++				goto out;
+ 			}
+ 		}
+ 	}
++out:
++	intel_display_power_put(dev_priv, power_domain);
+ 
+-	return false;
++	return ret;
+ }
+ 
+ static void intel_dsi_get_config(struct intel_encoder *encoder,
+diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
+index 4a77639..cb5d1b1 100644
+--- a/drivers/gpu/drm/i915/intel_hdmi.c
++++ b/drivers/gpu/drm/i915/intel_hdmi.c
+@@ -880,15 +880,18 @@ static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
+ 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
+ 	enum intel_display_power_domain power_domain;
+ 	u32 tmp;
++	bool ret;
+ 
+ 	power_domain = intel_display_port_power_domain(encoder);
+-	if (!intel_display_power_is_enabled(dev_priv, power_domain))
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
+ 
++	ret = false;
++
+ 	tmp = I915_READ(intel_hdmi->hdmi_reg);
+ 
+ 	if (!(tmp & SDVO_ENABLE))
+-		return false;
++		goto out;
+ 
+ 	if (HAS_PCH_CPT(dev))
+ 		*pipe = PORT_TO_PIPE_CPT(tmp);
+@@ -897,7 +900,12 @@ static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
+ 	else
+ 		*pipe = PORT_TO_PIPE(tmp);
+ 
+-	return true;
++	ret = true;
++
++out:
++	intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ static void intel_hdmi_get_config(struct intel_encoder *encoder,
+diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
+index 0da0240..bc04d8d 100644
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -75,22 +75,30 @@ static bool intel_lvds_get_hw_state(struct intel_encoder *encoder,
+ 	struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
+ 	enum intel_display_power_domain power_domain;
+ 	u32 tmp;
++	bool ret;
+ 
+ 	power_domain = intel_display_port_power_domain(encoder);
+-	if (!intel_display_power_is_enabled(dev_priv, power_domain))
++	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 		return false;
+ 
++	ret = false;
++
+ 	tmp = I915_READ(lvds_encoder->reg);
+ 
+ 	if (!(tmp & LVDS_PORT_EN))
+-		return false;
++		goto out;
+ 
+ 	if (HAS_PCH_CPT(dev))
+ 		*pipe = PORT_TO_PIPE_CPT(tmp);
+ 	else
+ 		*pipe = PORT_TO_PIPE(tmp);
+ 
+-	return true;
++	ret = true;
++
++out:
++	intel_display_power_put(dev_priv, power_domain);
++
++	return ret;
+ }
+ 
+ static void intel_lvds_get_config(struct intel_encoder *encoder,
+diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
+index a234687..b28c29f 100644
+--- a/drivers/gpu/drm/i915/intel_pm.c
++++ b/drivers/gpu/drm/i915/intel_pm.c
+@@ -2829,7 +2829,10 @@ void skl_ddb_get_hw_state(struct drm_i915_private *dev_priv,
+ 	memset(ddb, 0, sizeof(*ddb));
+ 
+ 	for_each_pipe(dev_priv, pipe) {
+-		if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PIPE(pipe)))
++		enum intel_display_power_domain power_domain;
++
++		power_domain = POWER_DOMAIN_PIPE(pipe);
++		if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+ 			continue;
+ 
+ 		for_each_plane(dev_priv, pipe, plane) {
+@@ -2841,6 +2844,8 @@ void skl_ddb_get_hw_state(struct drm_i915_private *dev_priv,
+ 		val = I915_READ(CUR_BUF_CFG(pipe));
+ 		skl_ddb_entry_init_from_hw(&ddb->plane[pipe][PLANE_CURSOR],
+ 					   val);
++
++		intel_display_power_put(dev_priv, power_domain);
+ 	}
+ }
+ 
+diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
+index ddbdbff..678ed34 100644
+--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
++++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
+@@ -470,6 +470,43 @@ static void gen9_set_dc_state_debugmask_memory_up(
+ 	}
+ }
+ 
++static void gen9_write_dc_state(struct drm_i915_private *dev_priv,
++				u32 state)
++{
++	int rewrites = 0;
++	int rereads = 0;
++	u32 v;
++
++	I915_WRITE(DC_STATE_EN, state);
++
++	/* It has been observed that disabling the dc6 state sometimes
++	 * doesn't stick and dmc keeps returning old value. Make sure
++	 * the write really sticks enough times and also force rewrite until
++	 * we are confident that state is exactly what we want.
++	 */
++	do  {
++		v = I915_READ(DC_STATE_EN);
++
++		if (v != state) {
++			I915_WRITE(DC_STATE_EN, state);
++			rewrites++;
++			rereads = 0;
++		} else if (rereads++ > 5) {
++			break;
++		}
++
++	} while (rewrites < 100);
++
++	if (v != state)
++		DRM_ERROR("Writing dc state to 0x%x failed, now 0x%x\n",
++			  state, v);
++
++	/* Most of the times we need one retry, avoid spam */
++	if (rewrites > 1)
++		DRM_DEBUG_KMS("Rewrote dc state to 0x%x %d times\n",
++			      state, rewrites);
++}
++
+ static void gen9_set_dc_state(struct drm_i915_private *dev_priv, uint32_t state)
+ {
+ 	uint32_t val;
+@@ -494,10 +531,18 @@ static void gen9_set_dc_state(struct drm_i915_private *dev_priv, uint32_t state)
+ 	val = I915_READ(DC_STATE_EN);
+ 	DRM_DEBUG_KMS("Setting DC state from %02x to %02x\n",
+ 		      val & mask, state);
++
++	/* Check if DMC is ignoring our DC state requests */
++	if ((val & mask) != dev_priv->csr.dc_state)
++		DRM_ERROR("DC state mismatch (0x%x -> 0x%x)\n",
++			  dev_priv->csr.dc_state, val & mask);
++
+ 	val &= ~mask;
+ 	val |= state;
+-	I915_WRITE(DC_STATE_EN, val);
+-	POSTING_READ(DC_STATE_EN);
++
++	gen9_write_dc_state(dev_priv, val);
++
++	dev_priv->csr.dc_state = val & mask;
+ }
+ 
+ void bxt_enable_dc9(struct drm_i915_private *dev_priv)
+@@ -1442,6 +1487,22 @@ static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv,
+ 	chv_set_pipe_power_well(dev_priv, power_well, false);
+ }
+ 
++static void
++__intel_display_power_get_domain(struct drm_i915_private *dev_priv,
++				 enum intel_display_power_domain domain)
++{
++	struct i915_power_domains *power_domains = &dev_priv->power_domains;
++	struct i915_power_well *power_well;
++	int i;
++
++	for_each_power_well(i, power_well, BIT(domain), power_domains) {
++		if (!power_well->count++)
++			intel_power_well_enable(dev_priv, power_well);
++	}
++
++	power_domains->domain_use_count[domain]++;
++}
++
+ /**
+  * intel_display_power_get - grab a power domain reference
+  * @dev_priv: i915 device instance
+@@ -1457,24 +1518,53 @@ static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv,
+ void intel_display_power_get(struct drm_i915_private *dev_priv,
+ 			     enum intel_display_power_domain domain)
+ {
+-	struct i915_power_domains *power_domains;
+-	struct i915_power_well *power_well;
+-	int i;
++	struct i915_power_domains *power_domains = &dev_priv->power_domains;
+ 
+ 	intel_runtime_pm_get(dev_priv);
+ 
+-	power_domains = &dev_priv->power_domains;
++	mutex_lock(&power_domains->lock);
++
++	__intel_display_power_get_domain(dev_priv, domain);
++
++	mutex_unlock(&power_domains->lock);
++}
++
++/**
++ * intel_display_power_get_if_enabled - grab a reference for an enabled display power domain
++ * @dev_priv: i915 device instance
++ * @domain: power domain to reference
++ *
++ * This function grabs a power domain reference for @domain and ensures that the
++ * power domain and all its parents are powered up. Therefore users should only
++ * grab a reference to the innermost power domain they need.
++ *
++ * Any power domain reference obtained by this function must have a symmetric
++ * call to intel_display_power_put() to release the reference again.
++ */
++bool intel_display_power_get_if_enabled(struct drm_i915_private *dev_priv,
++					enum intel_display_power_domain domain)
++{
++	struct i915_power_domains *power_domains = &dev_priv->power_domains;
++	bool is_enabled;
++
++	if (!intel_runtime_pm_get_if_in_use(dev_priv))
++		return false;
+ 
+ 	mutex_lock(&power_domains->lock);
+ 
+-	for_each_power_well(i, power_well, BIT(domain), power_domains) {
+-		if (!power_well->count++)
+-			intel_power_well_enable(dev_priv, power_well);
++	if (__intel_display_power_is_enabled(dev_priv, domain)) {
++		__intel_display_power_get_domain(dev_priv, domain);
++		is_enabled = true;
++	} else {
++		is_enabled = false;
+ 	}
+ 
+-	power_domains->domain_use_count[domain]++;
+-
+ 	mutex_unlock(&power_domains->lock);
++
++	if (!is_enabled)
++		intel_runtime_pm_put(dev_priv);
++
++	return is_enabled;
+ }
+ 
+ /**
+@@ -2246,6 +2336,43 @@ void intel_runtime_pm_get(struct drm_i915_private *dev_priv)
+ }
+ 
+ /**
++ * intel_runtime_pm_get_if_in_use - grab a runtime pm reference if device in use
++ * @dev_priv: i915 device instance
++ *
++ * This function grabs a device-level runtime pm reference if the device is
++ * already in use and ensures that it is powered up.
++ *
++ * Any runtime pm reference obtained by this function must have a symmetric
++ * call to intel_runtime_pm_put() to release the reference again.
++ */
++bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *dev_priv)
++{
++	struct drm_device *dev = dev_priv->dev;
++	struct device *device = &dev->pdev->dev;
++	int ret;
++
++	if (!IS_ENABLED(CONFIG_PM))
++		return true;
++
++	ret = pm_runtime_get_if_in_use(device);
++
++	/*
++	 * In cases runtime PM is disabled by the RPM core and we get an
++	 * -EINVAL return value we are not supposed to call this function,
++	 * since the power state is undefined. This applies atm to the
++	 * late/early system suspend/resume handlers.
++	 */
++	WARN_ON_ONCE(ret < 0);
++	if (ret <= 0)
++		return false;
++
++	atomic_inc(&dev_priv->pm.wakeref_count);
++	assert_rpm_wakelock_held(dev_priv);
++
++	return true;
++}
++
++/**
+  * intel_runtime_pm_get_noresume - grab a runtime pm reference
+  * @dev_priv: i915 device instance
+  *
diff --git a/modules/system/thinkpad.nix b/modules/hardware/thinkpad.nix
index 025ce760..ba55c80b 100644
--- a/modules/system/thinkpad.nix
+++ b/modules/hardware/thinkpad.nix
@@ -16,9 +16,9 @@ in
     environment.systemPackages = [ pkgs.acpi ];
 
     # for wifi
-    hardware.enableAllFirmware = true;
+    hardware.enableAllFirmware = mkDefault true;
 
-    hardware.trackpoint = {
+    hardware.trackpoint = mkDefault {
       enable = true;
       emulateWheel = true;
       speed = 250;
@@ -26,6 +26,6 @@ in
     };
 
     # TLP Linux Advanced Power Management
-    services.tlp.enable = true;
+    services.tlp.enable = mkDefault true;
   };
 }
diff --git a/modules/module-list.nix b/modules/module-list.nix
index a606acb3..a0672259 100644
--- a/modules/module-list.nix
+++ b/modules/module-list.nix
@@ -1,12 +1,12 @@
 [
   ./hardware/gamecontroller.nix
   ./hardware/t100ha
+  ./hardware/thinkpad.nix
   ./profiles/common.nix
   ./profiles/tests.nix
   ./services/multipath-vpn.nix
   ./services/postfix
   ./system/iso.nix
-  ./system/thinkpad.nix
   ./user/aszlig/profiles/base.nix
   ./user/aszlig/profiles/workstation
   ./user/aszlig/programs/gajim
diff --git a/modules/user/aszlig/profiles/workstation/default.nix b/modules/user/aszlig/profiles/workstation/default.nix
index 2e0d8a40..01eaaeaf 100644
--- a/modules/user/aszlig/profiles/workstation/default.nix
+++ b/modules/user/aszlig/profiles/workstation/default.nix
@@ -165,14 +165,11 @@ in {
 
     virtualisation.virtualbox.host.enable = true;
 
-    users.extraUsers.aszlig = {
+    users.users.aszlig = {
       uid = 1000;
+      isNormalUser = true;
       description = "aszlig";
-      group = "users";
       extraGroups = [ "wheel" "video" ];
-      home = "/home/aszlig";
-      useDefaultShell = true;
-      createHome = true;
     };
   };
 }
diff --git a/modules/user/aszlig/system/kernel.nix b/modules/user/aszlig/system/kernel.nix
index b1f666e4..39128817 100644
--- a/modules/user/aszlig/system/kernel.nix
+++ b/modules/user/aszlig/system/kernel.nix
@@ -18,11 +18,11 @@ let
   in pkgs.writeText "generated.kconf" (mkConf exprs + "\n");
 
   mainlineKernel = {
-    version = "4.4.0-rc8";
+    version = "4.5.0-rc5";
     src = pkgs.fetchgit {
       url = git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git;
-      rev = "02006f7a7a715af10974a30b7ad8e6ee340f954c";
-      sha256 = "1m08bjbizh2w04l17rq0mkmrayfrhrrsbymaawlr5mi2gvv9rmca";
+      rev = "81f70ba233d5f660e1ea5fe23260ee323af5d53a";
+      sha256 = "0zr5fq85plb3mpbwz6rczy4478p0rp6mgd0p9bza7wi2ny2xw87a";
     };
   };
 
diff --git a/pkgs/games/steam/starbound.nix b/pkgs/games/steam/starbound.nix
index ba63fcfa..0dab7cf2 100644
--- a/pkgs/games/steam/starbound.nix
+++ b/pkgs/games/steam/starbound.nix
@@ -33,30 +33,34 @@ let
             else if stdenv.system == "x86_64-cygwin" then "win64"
             else throw "Unsupported system ${stdenv.system} for Starbound";
 
-  upstream = let
-    attrs = if flavor == "stable" then {
-      name = "starbound";
-      appId = 211820;
-      depotId = 211821;
-      manifestId = 1842730272313189605;
-      sha256 = "0qppfn56c778wsg38hi6sxgi3rl9nv72h9rmmxybi1vzpf3p49py";
-    } else if flavor == "unstable" then {
-      name = "starbound-unstable";
-      appId = 367540;
-      depotId = 367541;
-      manifestId = 6970641909803280413;
-      sha256 = "0qppfn56c778wsg38hi6sxgi3rl9nv72h9rmmxybi1vzpf3p49py";
-    } else throw "Unsupported flavor, use either `stable' or `unstable'.";
-  in fetchSteam (attrs // {
+  upstreamInfo = if flavor == "stable" then {
+    name = "starbound";
+    version = "20151216";
+    appId = 211820;
+    depotId = 211821;
+    manifestId = 1842730272313189605;
+    sha256 = "0qppfn56c778wsg38hi6sxgi3rl9nv72h9rmmxybi1vzpf3p49py";
+  } else if flavor == "unstable" then {
+    name = "starbound-unstable";
+    version = "20160223";
+    appId = 367540;
+    depotId = 367541;
+    manifestId = 6970641909803280413;
+    sha256 = "0qppfn56c778wsg38hi6sxgi3rl9nv72h9rmmxybi1vzpf3p49py";
+  } else throw "Unsupported flavor, use either `stable' or `unstable'.";
+
+  upstream = fetchSteam {
+    inherit (upstreamInfo) name appId depotId manifestId sha256;
     fileList = [
       "^(?:assets|tiled)/"
       ( "^${binpath}(?:/Starbound\\.app/Contents/MacOS)?"
       + "/(?:[a-zA-Z0-9_-]+(?:\\.exe)?|sbboot\\.config)$")
     ];
-  });
+  };
 
 in stdenv.mkDerivation {
-  name = "${upstream.name}-20160208";
+  name = "${upstreamInfo.name}-${upstreamInfo.version}";
+  inherit (upstreamInfo) version;
 
   unpackPhase = ":";
 
diff --git a/pkgs/nixops/default.nix b/pkgs/nixops/default.nix
index af16b56c..e1dddb72 100644
--- a/pkgs/nixops/default.nix
+++ b/pkgs/nixops/default.nix
@@ -1,8 +1,8 @@
 { stdenv, fetchFromGitHub, fetchpatch, git }:
 
 let
-  rev = "9076dbc722a4125b2a08d4b49d94b2073b71578f";
-  sha256 = "05zc12spjk9pcspqq88wz3k4rgqy8bsxy28ysjw752959b95ys1z";
+  rev = "b66db0aa1c2bea64fe821ff67d51555c85943572";
+  sha256 = "15wwhah9ghwn7w3nq0jj0vqyz2al76w3vwfnl4aklbffmj2jbzwy";
 
   master = stdenv.mkDerivation rec {
     name = "nixops-upstream-patched";