From b1582825dda721e4feeeec782b34bf9af9f7f5f3 Mon Sep 17 00:00:00 2001 From: mexisme Date: Mon, 5 Dec 2022 12:41:54 +1300 Subject: [PATCH 1/4] Support for the Dell XPS 13, 9300 model --- dell/xps/13-9300/README.wiki | 20 ++++++++++++++++++++ dell/xps/13-9300/default.nix | 29 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 dell/xps/13-9300/README.wiki create mode 100644 dell/xps/13-9300/default.nix diff --git a/dell/xps/13-9300/README.wiki b/dell/xps/13-9300/README.wiki new file mode 100644 index 0000000..f92ae27 --- /dev/null +++ b/dell/xps/13-9300/README.wiki @@ -0,0 +1,20 @@ += Dell XPS 13 9300 = + +== Firmware upgrades == + +Note that this device is supported by [https://fwupd.org/ fwupd]. +To perform firmware upgrades just activate the service + + +services.fwupd.enable = true; + + +Then use fwupdmgr to perform updates. + +== Battery drain when sleeping == + +The laptop uses the S2 sleep mode by default instead of S3, which leads to +draining a lot of battery during sleep. + +See https://wiki.archlinux.org/index.php/Dell_XPS_13_(9300)#Power_Management +and https://bugzilla.kernel.org/show_bug.cgi?id=199689#c3 for reference diff --git a/dell/xps/13-9300/default.nix b/dell/xps/13-9300/default.nix new file mode 100644 index 0000000..6ec94ea --- /dev/null +++ b/dell/xps/13-9300/default.nix @@ -0,0 +1,29 @@ +{ config, lib, ... }: + +let + inherit (lib) mkDefault; + +in { + imports = [ + ../../../common/cpu/intel + ../../../common/gpu/intel.nix + ../../../common/pc/laptop + ../../../common/pc/laptop/acpi_call.nix + ../../../common/pc/ssd + ]; + + # Force S3 sleep mode. See README.wiki for details. + boot.kernelParams = [ "mem_sleep_default=deep" ]; + + # Touchpad goes over i2c, and the psmouse module interferes with it + boot.blacklistedKernelModules = [ "psmouse" ]; + + # Includes the Wi-Fi and Bluetooth firmware for the QCA6390. + hardware.enableRedistributableFirmware = mkDefault true; + + # Allows for updating firmware via `fwupdmgr`. + services.fwupd.enable = mkDefault true; + + # This will save you money and possibly your life! + services.thermald.enable = mkDefault true; +} From 97900e1e7eb3257a037ce5cfc3544787295685d9 Mon Sep 17 00:00:00 2001 From: mexisme Date: Mon, 5 Dec 2022 13:26:28 +1300 Subject: [PATCH 2/4] Support reloading i2c-designware module(s) after resuming --- dell/xps/13-9300/default.nix | 4 ++ .../sleep-resume/i2c-designware/default.nix | 42 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 dell/xps/sleep-resume/i2c-designware/default.nix diff --git a/dell/xps/13-9300/default.nix b/dell/xps/13-9300/default.nix index 6ec94ea..9c379ae 100644 --- a/dell/xps/13-9300/default.nix +++ b/dell/xps/13-9300/default.nix @@ -10,6 +10,7 @@ in { ../../../common/pc/laptop ../../../common/pc/laptop/acpi_call.nix ../../../common/pc/ssd + ../sleep-resume/i2c-designware ]; # Force S3 sleep mode. See README.wiki for details. @@ -26,4 +27,7 @@ in { # This will save you money and possibly your life! services.thermald.enable = mkDefault true; + + # Reloads i2c-designware module after suspend + services.sleep-resume.i2c-designware.enable = mkDefault true; } diff --git a/dell/xps/sleep-resume/i2c-designware/default.nix b/dell/xps/sleep-resume/i2c-designware/default.nix new file mode 100644 index 0000000..55be549 --- /dev/null +++ b/dell/xps/sleep-resume/i2c-designware/default.nix @@ -0,0 +1,42 @@ +{ config, lib, pkgs, ... }: + +let + inherit (lib) mkIf mkOption types; + + reloadDesignware = pkgs.writeShellApplication { + name = "reload-i2c-designware.sh"; + runtimeInputs = [ pkgs.kmod ]; + text = '' + # Reload the i2c Designware driver after resuming from sleep. + + # Wait up-to 0.5 second for each module to be unloaded: + # (It should never take this long) + modprobe -r --wait 500 i2c_designware_platform + modprobe -r --wait 500 i2c_designware_core + modprobe -r --wait 500 i2c_hid_acpi + modprobe -r --wait 500 i2c_hid + + # Should reload the module dependencies automatically: + modprobe i2c_designware_platform + ''; + }; + + cfg = config.services.sleep-resume.i2c-designware; +in { + options = { + services.sleep-resume.i2c-designware = { + enable = mkOption { + default = false; + type = types.bool; + description = "Reload the i2c_designware driver after resuming from sleep."; + }; + }; + }; + + config = mkIf cfg.enable { + powerManagement.resumeCommands = "${reloadDesignware}/bin/reload-i2c-designware.sh"; + }; +} + + + From 0cee376703b8e53d9538c2786211dbcd5396c48b Mon Sep 17 00:00:00 2001 From: mexisme Date: Fri, 30 Dec 2022 13:37:26 +1300 Subject: [PATCH 3/4] Support reloading btusb module after resuming --- dell/xps/sleep-resume/bluetooth/default.nix | 40 +++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 dell/xps/sleep-resume/bluetooth/default.nix diff --git a/dell/xps/sleep-resume/bluetooth/default.nix b/dell/xps/sleep-resume/bluetooth/default.nix new file mode 100644 index 0000000..e23e9c6 --- /dev/null +++ b/dell/xps/sleep-resume/bluetooth/default.nix @@ -0,0 +1,40 @@ +{config, lib, pkgs, ...}: + +let + inherit (lib) mkIf mkOption types; + + reloadBtusb = pkgs.writeShellApplication { + name = "reload-btusb.sh"; + runtimeInputs = [ + pkgs.coreutils + pkgs.kmod + ]; + text = '' + # Reload Bluetooth after resuming from sleep. + + # Wait up-to 0.5 second for the module to be unloaded: + # (It should never take this long) + modprobe -r --wait 500 btusb + + # "btusb" sometimes seems to need a little bit of time to settle after unloading: + sleep 0.2 + modprobe btusb + ''; + }; + + cfg = config.services.sleep-resume.bluetooth; +in { + options = { + services.sleep-resume.bluetooth = { + enable = mkOption { + default = false; + type = types.bool; + description = "Reload Bluetooth after resuming from sleep"; + }; + }; + }; + + config = mkIf cfg.enable { + powerManagement.resumeCommands = "${reloadBtusb}/bin/reload-btusb.sh"; + }; +} From ed291da4ab7e14ef3cff9c94a23247fa3cd7e7ae Mon Sep 17 00:00:00 2001 From: mexisme Date: Mon, 5 Dec 2022 12:43:29 +1300 Subject: [PATCH 4/4] Update flake.nix and root README.md --- README.md | 1 + flake.nix | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index fa388d1..ee044bd 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,7 @@ See code for all available configurations. | [Dell Poweredge R7515](dell/poweredge/r7515) | `` | | [Dell Precision 5530](dell/precision/5530) | `` | | [Dell XPS 13 7390](dell/xps/13-7390) | `` | +| [Dell XPS 13 9300](dell/xps/13-9300) | `` | | [Dell XPS 13 9310](dell/xps/13-9310) | `` | | [Dell XPS 13 9343](dell/xps/13-9343) | `` | | [Dell XPS 13 9350](dell/xps/13-9350) | `` | diff --git a/flake.nix b/flake.nix index 387ffbb..0a006c9 100644 --- a/flake.nix +++ b/flake.nix @@ -33,6 +33,7 @@ dell-poweredge-r7515 = import ./dell/poweredge/r7515; dell-precision-5530 = import ./dell/precision/5530; dell-xps-13-7390 = import ./dell/xps/13-7390; + dell-xps-13-9300 = import ./dell/xps/13-9300; dell-xps-13-9310 = import ./dell/xps/13-9310; dell-xps-13-9343 = import ./dell/xps/13-9343; dell-xps-13-9350 = import ./dell/xps/13-9350;