Does anyone else loose their brightness controls after suspending/resuming since this update (KDE Plasma, NVIDIA, Kernel 6.18)?
The controls reappear when rebooting -or- when toggling Control hardware brightness with DCC/CI in KDE’s display configuration off and on again (but when choosing the latter, the currently set brightness will become the new 100%).
It is probably due to the powerdevil service in the background crashing. It should be fixed when you receive your next update to ddcutil, which in Stable and Testing branches is currently v2.2.7.
Instead of rebooting or opening System Settings, the following command should bring the brightness controls back if they disappeared after waking up your system:
Thank you! This seems to work nicely and also restores the usable brightness range.
In this context, I noticed a couple of journal entries related to KDE’s powerdevil:
org_kde_powerdevil[2525]: open() EACCES failure, recently resumed from sleep: false
org_kde_powerdevil[2525]: User ACL is not RW
org_kde_powerdevil[2525]: Current user not in group i2c
org_kde_powerdevil[2525]: Current user has group i2c perms on /dev/i2c-4
org_kde_powerdevil[2525]: EACCES retry_ct=1: Sleeping for 100 milliseconds
org_kde_powerdevil[2525]: Open failed for /dev/i2c-4, errno=EACCES(-13): Permission denied in file i2c_bus_core.c near line 433
org_kde_powerdevil[2525]: open() failed with 1 EACCES errors, total retry ms = 100
org_kde_powerdevil[2525]: Open failed for /dev/i2c-5, errno=EACCES(-13): Permission denied in file i2c_bus_core.c near line 433
org_kde_powerdevil[2525]: dw_watch_display_connections
org_kde_powerdevil[2525]: invoke_process_screen_change_event
org_kde_powerdevil[2525]: process_screen_change_event
org_kde_powerdevil[2525]: i2c_edid_exists
org_kde_powerdevil[2525]: i2c_open_bus
org_kde_powerdevil[2525]: i2c_open_bus_basic
org_kde_powerdevil[2525]: Open failed for /dev/i2c-5, errno=EACCES(-13): Permission denied in file i2c_bus_core.c near line 433
org_kde_powerdevil[2525]: Elapsed time since start of program execution: 2015.318794 seconds
org_kde_powerdevil[2525]: Time since last resume from sleep: 2015.221 seconds = 2015221 millisec (2015221214715nanosec)
org_kde_powerdevil[2525]: recently_returned_from_sleep() returned false
org_kde_powerdevil[2525]: uid: 1000=user, euid: 1000=user, gid: 1000=user, egid: 1000=user
org_kde_powerdevil[2525]: Checking for group i2c...
org_kde_powerdevil[2525]: Group i2c exists
org_kde_powerdevil[2525]: WARNING: Current user user is NOT a member of group i2c
org_kde_powerdevil[2525]: Permissions for /dev/i2c-5:
org_kde_powerdevil[2525]: file owner: 0=root, file group: 971=i2c
org_kde_powerdevil[2525]: access(/dev/i2c-5) failed, errno=13
org_kde_powerdevil[2525]: faccessat(0,/dev/i2c-5,R_OK|W_OK, AT_EADCESS) failed, errno=13
org_kde_powerdevil[2525]: Using command getfacl:
org_kde_powerdevil[2525]: getfacl: Removing leading '/' from absolute path names
org_kde_powerdevil[2525]: # file: dev/i2c-5
org_kde_powerdevil[2525]: # owner: root
org_kde_powerdevil[2525]: # group: i2c
org_kde_powerdevil[2525]: user::rw-
org_kde_powerdevil[2525]: group::rw- #effective:rw-
org_kde_powerdevil[2525]: mask::rw-
org_kde_powerdevil[2525]: other::---
org_kde_powerdevil[2525]: Using acl api:
org_kde_powerdevil[2525]: user::rw-
org_kde_powerdevil[2525]: group::rw-
org_kde_powerdevil[2525]: mask::rw-
org_kde_powerdevil[2525]: other::---
org_kde_powerdevil[2525]: Using low level acl api:
org_kde_powerdevil[2525]: ACL entries for /dev/i2c-5:
org_kde_powerdevil[2525]: user:: rw-
org_kde_powerdevil[2525]: group:: rw-
org_kde_powerdevil[2525]: mask:: rw-
org_kde_powerdevil[2525]: other:: ---
org_kde_powerdevil[2525]: sh: line 1: lsof: command not found
org_kde_powerdevil[2525]: acl for user 1000: (null)
There seem to be conflicting statements whether users should be added to group i2c or not. According to ddcutil’s release notes, things should work fine without adding users to that group:
Most users will find that command ddcutil just works “out of the box”, without the need for manual configuation. Driver i2c-dev is loaded automatically in case it was not already built into the kernel. When executing on a system running systemd (i.e. on almost every current Linux distribution) the logged on user automatically has read-write access to the /dev/i2c devices associated with monitors, making excution as root or set up of group I2C unnecessary.
❯ journalctl --no-pager -t org_kde_powerdevil --since '15 minutes ago'
Sep 25 07:56:45 scott-ser org_kde_powerdevil[30118]: Starting libddcutil. library built Not set at Not set. stdout_stderr_redirected=true
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: Starting. library built Not set at Not set, library_initialized=false, libopts=|(null)|
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: Initializing libddcutil. ddcutil version: 3.0.2, shared library: /usr/lib/libddcutil.so.5.6.2
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: library built Not set at Not set. stdout_stderr_redirected=true
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.061624] Options passed from client:
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.061639] Applying combined libddcutil options:
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: Library initialization complete.
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.305723] (ddca_start_watch_displays ) Starting ddca_start_watch_displays()
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: Watching for DPMS state changes unimplemented
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118] Watching for DPMS state changes unimplemented
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.307154] (dw_start_watch_displays ) skip_settling_pauses = false
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.317092] (dw_start_watch_displays ) Watching for display connection changes, resolved watch mode = Watch_Mode_Udev, poll loop interval = 500 millisec
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.317102] (dw_start_watch_displays ) initial_stabilization_millisec: 0, stabilization_poll_millisec: 100
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.317165] (dw_start_watch_displays ) libddcutil recheck thread 0x56369fc8fc70 started
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.317208] (dw_start_watch_displays ) libddcutil watch thread 0x56369fcbbff0 started
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.317215] (ddca_start_watch_displays ) Done ddca_start_watch_displays returning OK - OK(0): success
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.317227] (ddca_get_display_refs ) Called with include_invalid_displays=false
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.317230] (ddca_get_display_refs ) Returning DDCA_Display_Ref list:
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: [ 30118][ 0.317236] (ddca_get_display_refs ) DDCA_Display_Ref Display_Ref[1:bus /dev/i2c-1 @0x56369fc8e880]
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: Failed to register with host portal QDBusError("org.freedesktop.portal.Error.Failed", "Could not register app ID: App info not found for 'org.kde.org_kde_powerdevil'")
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: org.kde.powerdevil.chargethresholdhelper.getthreshold failed "Charge thresholds are not supported by the kernel for this hardware"
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: org.kde.powerdevil.backlighthelper.brightness failed
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: Handle button events action could not check for screen configuration
Sep 25 07:56:46 scott-ser org_kde_powerdevil[30118]: org.kde.powerdevil.chargethresholdhelper.getthreshold failed "Charge thresholds are not supported by the kernel for this hardware"
My feeling is that your errors/warnings are related to the older version of ddcutil installed on your system. If you really want to test if that is the case, then you could try switching to Unstable branch to see if ddcutil v3.0.2-1 stops those messages:
Could be. The messages are thrown right after resuming from sleep. Might be some sort of race condition, where ddcutil/powerdevil try to access those device nodes before proper ACLs are applied (assuming those device nodes are torn down on suspend and recreated on resume).
Well, the workaround works fine until newer versions of the affected packages are pushed to stable, thus it’s likely not that important to dig deeper here.