From dd296c65a146dfda762958275ea78d6c04197469 Mon Sep 17 00:00:00 2001 From: ahuston-0 Date: Tue, 2 Apr 2024 18:30:11 -0400 Subject: [PATCH] Add fingerprint acpi rules & pre-6.9 power patches Signed-off-by: ahuston-0 --- .../alice/systems/artemision/fingerprint.nix | 19 ++++ users/alice/systems/artemision/hardware.nix | 15 +++ .../kernel-patches/panel_power_savings.patch | 100 ++++++++++++++++++ .../kernel-patches/respect_abmlevel.patch | 86 +++++++++++++++ 4 files changed, 220 insertions(+) create mode 100644 users/alice/systems/artemision/kernel-patches/panel_power_savings.patch create mode 100644 users/alice/systems/artemision/kernel-patches/respect_abmlevel.patch diff --git a/users/alice/systems/artemision/fingerprint.nix b/users/alice/systems/artemision/fingerprint.nix index 1391756..93a771a 100644 --- a/users/alice/systems/artemision/fingerprint.nix +++ b/users/alice/systems/artemision/fingerprint.nix @@ -38,4 +38,23 @@ security.pam.services.runuser-l.rules.auth.fprintd.order = 11501; security.pam.services.groupmod.rules.auth.fprintd.order = 11501; security.pam.services.runuser.rules.auth.fprintd.order = 11501; + + # to auto-flip to password when the laptop lid is closed (ie. docked) + services.acpid = { + enable = true; + lidEventCommands = '' + export PATH=$PATH:/run/current-system/sw/bin + + if grep -Fq closed /proc/acpi/button/lid/LID0/state; then + ${pkgs.systemd}/bin/systemctl stop fprintd.service + ${pkgs.coreutils}/bin/ln -s /dev/null /run/systemd/transient/fprintd.service + ${pkgs.systemd}/bin/systemctl daemon-reload + else + ${pkgs.coreutils}/bin/rm -f /run/systemd/transient/fprintd.service + ${pkgs.systemd}/bin/systemctl daemon-reload + ${pkgs.systemd}/bin/systemctlstart fprintd.service + fi + ''; + }; + } diff --git a/users/alice/systems/artemision/hardware.nix b/users/alice/systems/artemision/hardware.nix index 50d28e4..a806ef9 100644 --- a/users/alice/systems/artemision/hardware.nix +++ b/users/alice/systems/artemision/hardware.nix @@ -26,6 +26,21 @@ ]; boot.kernelModules = [ "kvm-amd" ]; boot.extraModulePackages = [ ]; + boot.kernelParams = [ + "amdgpu.sg_display=0" + "amdgpu.graphics_sg=0" + "amdgpu.abmlevel=3" + ]; + boot.kernelPatches = lib.mkIf (lib.versionOlder pkgs.linux.version "6.9") [ + { + name = "add panel_power_savings sysfs entry to eDP connectors"; + patch = ./kernel-patches/panel_power_savings.patch; + } + { + name = "respect the abmlevel module parameter value if it is set"; + patch = ./kernel-patches/respect_abmlevel.patch; + } + ]; fileSystems."/" = { device = "/dev/disk/by-uuid/f3c11d62-37f4-495e-b668-1ff49e0d3a47"; diff --git a/users/alice/systems/artemision/kernel-patches/panel_power_savings.patch b/users/alice/systems/artemision/kernel-patches/panel_power_savings.patch new file mode 100644 index 0000000..528cfc0 --- /dev/null +++ b/users/alice/systems/artemision/kernel-patches/panel_power_savings.patch @@ -0,0 +1,100 @@ +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index 3c826a9a593ed88c5ec4e6e6c2dd448812199e8c..5fe8dc6536966ce0bc9017dbec5445833b80ae92 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -6437,10 +6437,81 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector, + return ret; + } + ++/** ++ * DOC: panel power savings ++ * ++ * The display manager allows you to set your desired **panel power savings** ++ * level (between 0-4, with 0 representing off), e.g. using the following:: ++ * ++ * # echo 3 > /sys/class/drm/card0-eDP-1/amdgpu/panel_power_savings ++ * ++ * Modifying this value can have implications on color accuracy, so tread ++ * carefully. ++ */ ++ ++static ssize_t panel_power_savings_show(struct device *device, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct drm_connector *connector = dev_get_drvdata(device); ++ struct drm_device *dev = connector->dev; ++ u8 val; ++ ++ drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); ++ val = to_dm_connector_state(connector->state)->abm_level == ++ ABM_LEVEL_IMMEDIATE_DISABLE ? 0 : ++ to_dm_connector_state(connector->state)->abm_level; ++ drm_modeset_unlock(&dev->mode_config.connection_mutex); ++ ++ return sysfs_emit(buf, "%u\n", val); ++} ++ ++static ssize_t panel_power_savings_store(struct device *device, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct drm_connector *connector = dev_get_drvdata(device); ++ struct drm_device *dev = connector->dev; ++ long val; ++ int ret; ++ ++ ret = kstrtol(buf, 0, &val); ++ ++ if (ret) ++ return ret; ++ ++ if (val < 0 || val > 4) ++ return -EINVAL; ++ ++ drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); ++ to_dm_connector_state(connector->state)->abm_level = val ?: ++ ABM_LEVEL_IMMEDIATE_DISABLE; ++ drm_modeset_unlock(&dev->mode_config.connection_mutex); ++ ++ drm_kms_helper_hotplug_event(dev); ++ ++ return count; ++} ++ ++static DEVICE_ATTR_RW(panel_power_savings); ++ ++static struct attribute *amdgpu_attrs[] = { ++ &dev_attr_panel_power_savings.attr, ++ NULL ++}; ++ ++static const struct attribute_group amdgpu_group = { ++ .name = "amdgpu", ++ .attrs = amdgpu_attrs ++}; ++ + static void amdgpu_dm_connector_unregister(struct drm_connector *connector) + { + struct amdgpu_dm_connector *amdgpu_dm_connector = to_amdgpu_dm_connector(connector); + ++ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) ++ sysfs_remove_group(&connector->kdev->kobj, &amdgpu_group); ++ + drm_dp_aux_unregister(&amdgpu_dm_connector->dm_dp_aux.aux); + } + +@@ -6542,6 +6613,13 @@ amdgpu_dm_connector_late_register(struct drm_connector *connector) + to_amdgpu_dm_connector(connector); + int r; + ++ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { ++ r = sysfs_create_group(&connector->kdev->kobj, ++ &amdgpu_group); ++ if (r) ++ return r; ++ } ++ + amdgpu_dm_register_backlight_device(amdgpu_dm_connector); + + if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) || diff --git a/users/alice/systems/artemision/kernel-patches/respect_abmlevel.patch b/users/alice/systems/artemision/kernel-patches/respect_abmlevel.patch new file mode 100644 index 0000000..8f1d1e5 --- /dev/null +++ b/users/alice/systems/artemision/kernel-patches/respect_abmlevel.patch @@ -0,0 +1,86 @@ +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 1291b8eb9dffa3cfa0209d26e9fa3271eb8973cc..f5c8187e0d5829399463933719c0b0cd51cfce89 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -196,7 +196,7 @@ extern int amdgpu_smu_pptable_id; + extern uint amdgpu_dc_feature_mask; + extern uint amdgpu_dc_debug_mask; + extern uint amdgpu_dc_visual_confirm; +-extern uint amdgpu_dm_abm_level; ++extern int amdgpu_dm_abm_level; + extern int amdgpu_backlight; + extern int amdgpu_damage_clips; + extern struct amdgpu_mgpu_info mgpu_info; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +index 6ef7f22c1152c163f106cac24954ec2550595401..af7fae7907d71ed9efb771f50acdf483b4230113 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +@@ -849,12 +849,13 @@ module_param_named(visualconfirm, amdgpu_dc_visual_confirm, uint, 0444); + * the ABM algorithm, with 1 being the least reduction and 4 being the most + * reduction. + * +- * Defaults to 0, or disabled. Userspace can still override this level later +- * after boot. ++ * Defaults to -1, or disabled. Userspace can only override this level after ++ * boot if it's set to auto. + */ +-uint amdgpu_dm_abm_level; +-MODULE_PARM_DESC(abmlevel, "ABM level (0 = off (default), 1-4 = backlight reduction level) "); +-module_param_named(abmlevel, amdgpu_dm_abm_level, uint, 0444); ++int amdgpu_dm_abm_level = -1; ++MODULE_PARM_DESC(abmlevel, ++ "ABM level (0 = off, 1-4 = backlight reduction level, -1 auto (default))"); ++module_param_named(abmlevel, amdgpu_dm_abm_level, int, 0444); + + int amdgpu_backlight = -1; + MODULE_PARM_DESC(backlight, "Backlight control (0 = pwm, 1 = aux, -1 auto (default))"); +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index ede6469c80afb2a399a40c427e8cfecb194bd089..367868ad20d7783e09028713b468f38c24d7a20d 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -6512,7 +6512,8 @@ static void amdgpu_dm_connector_unregister(struct drm_connector *connector) + { + struct amdgpu_dm_connector *amdgpu_dm_connector = to_amdgpu_dm_connector(connector); + +- if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) ++ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP && ++ amdgpu_dm_abm_level < 0) + sysfs_remove_group(&connector->kdev->kobj, &amdgpu_group); + + drm_dp_aux_unregister(&amdgpu_dm_connector->dm_dp_aux.aux); +@@ -6576,9 +6577,12 @@ void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector) + state->vcpi_slots = 0; + state->pbn = 0; + +- if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) +- state->abm_level = amdgpu_dm_abm_level ?: +- ABM_LEVEL_IMMEDIATE_DISABLE; ++ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { ++ if (amdgpu_dm_abm_level <= 0) ++ state->abm_level = ABM_LEVEL_IMMEDIATE_DISABLE; ++ else ++ state->abm_level = amdgpu_dm_abm_level; ++ } + + __drm_atomic_helper_connector_reset(connector, &state->base); + } +@@ -6616,7 +6620,8 @@ amdgpu_dm_connector_late_register(struct drm_connector *connector) + to_amdgpu_dm_connector(connector); + int r; + +- if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { ++ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP && ++ amdgpu_dm_abm_level < 0) { + r = sysfs_create_group(&connector->kdev->kobj, + &amdgpu_group); + if (r) +@@ -7646,7 +7651,8 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, + aconnector->base.state->max_requested_bpc = aconnector->base.state->max_bpc; + + if (connector_type == DRM_MODE_CONNECTOR_eDP && +- (dc_is_dmcu_initialized(adev->dm.dc) || adev->dm.dc->ctx->dmub_srv)) { ++ (dc_is_dmcu_initialized(adev->dm.dc) || ++ adev->dm.dc->ctx->dmub_srv) && amdgpu_dm_abm_level < 0) { + drm_object_attach_property(&aconnector->base.base, + adev->mode_info.abm_level_property, 0); + }