Looking through my journalctl logs, I’ve noticed these powerdevil-related errors when trying to access i2c for a while now:
Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: Initializing libddcutil. ddcutil version: 2.2.1-dev, shared library: /usr/lib/libddcutil.so.5.3.0 Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Options passed from client: Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Applying combined libddcutil options: Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Device /dev/i2c-0 lacks R/W permissions Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Device /dev/i2c-1 lacks R/W permissions Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Device /dev/i2c-2 lacks R/W permissions Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Device /dev/i2c-3 lacks R/W permissions Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Device /dev/i2c-4 lacks R/W permissions Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Device /dev/i2c-5 lacks R/W permissions Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Device /dev/i2c-6 lacks R/W permissions Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Device /dev/i2c-7 lacks R/W permissions Jun 18 11:05:57 n5z690 org_kde_powerdevil[1537]: [ 1537] Device /dev/i2c-8 lacks R/W permissions Jun 18 11:05:57 n5z690 plasmashell[1492]: kf.plasma.quick: Applet preload policy set to 1 Jun 18 11:05:57 n5z690 plasmashell[1492]: file:///usr/share/plasma/plasmoids/org.kde.desktopcontainment/contents/ui/main.qml:178:25: QML FolderViewDropArea (parent or ancestor of QQuickLayoutAttached): Binding loop > file:///usr/share/plasma/plasmoids/org.kde.desktopcontainment/contents/ui/main.qml:201:9 Jun 18 11:05:57 n5z690 plasmashell[1492]: Toolbox not loading, toolbox package is either invalid or disabled. Jun 18 11:05:58 n5z690 kernel: ixgbe 0000:04:00.0 enp4s0: NIC Link is Up 1 Gbps, Flow Control: None Jun 18 11:05:58 n5z690 NetworkManager[1105]: <info> [1750237558.1752] device (enp4s0): carrier: link connected Jun 18 11:05:58 n5z690 NetworkManager[1105]: <info> [1750237558.1752] device (enp4s0): state change: unavailable -> disconnected (reason 'carrier-changed', managed-type: 'full') Jun 18 11:05:58 n5z690 NetworkManager[1105]: <info> [1750237558.1781] policy: auto-activating connection 'Kabelgebundene Verbindung 1' (7c0c62c6-f22c-3d72-b66f-284047c2444c) Jun 18 11:05:58 n5z690 NetworkManager[1105]: <info> [1750237558.1782] device (enp4s0): Activation: starting connection 'Kabelgebundene Verbindung 1' (7c0c62c6-f22c-3d72-b66f-284047c2444c) Jun 18 11:05:58 n5z690 NetworkManager[1105]: <info> [1750237558.1782] device (enp4s0): state change: disconnected -> prepare (reason 'none', managed-type: 'full') Jun 18 11:05:58 n5z690 NetworkManager[1105]: <info> [1750237558.1783] manager: NetworkManager state is now CONNECTING Jun 18 11:05:58 n5z690 NetworkManager[1105]: <info> [1750237558.1784] device (enp4s0): state change: prepare -> config (reason 'none', managed-type: 'full') Jun 18 11:05:58 n5z690 NetworkManager[1105]: <info> [1750237558.1798] device (enp4s0): state change: config -> ip-config (reason 'none', managed-type: 'full') Jun 18 11:05:58 n5z690 NetworkManager[1105]: <info> [1750237558.1824] dhcp4 (enp4s0): activation: beginning transaction (timeout in 45 seconds) Jun 18 11:05:58 n5z690 avahi-daemon[1107]: Joining mDNS multicast group on interface enp4s0.IPv6 with address fe80::6180:d195:c539:21aa. Jun 18 11:05:58 n5z690 avahi-daemon[1107]: New relevant interface enp4s0.IPv6 for mDNS. Jun 18 11:05:58 n5z690 avahi-daemon[1107]: Registering new address record for fe80::6180:d195:c539:21aa on enp4s0.*. Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Library initialization complete. Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Watching for DPMS state changes unimplemented Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Watching for DPMS state changes unimplemented Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Watching for display connection changes, resolved watch mode = Watch_Mode_Xevent, poll loop interval = 100 millisec Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] extra_stabilization_millisec: 0, stabilization_poll_millisec: 100 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] libddcutil recheck thread 0x555e77405dd0 started Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] libddcutil watch thread 0x555e773dab40 started Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error(s) opening ddc devices Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error EACCES(-13): Keine Berechtigung opening /dev/i2c-0 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error EACCES(-13): Keine Berechtigung opening /dev/i2c-1 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error EACCES(-13): Keine Berechtigung opening /dev/i2c-2 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error(s) opening ddc devices Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error EACCES(-13): Keine Berechtigung opening /dev/i2c-3 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error EACCES(-13): Keine Berechtigung opening /dev/i2c-4 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error EACCES(-13): Keine Berechtigung opening /dev/i2c-5 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error EACCES(-13): Keine Berechtigung opening /dev/i2c-6 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error EACCES(-13): Keine Berechtigung opening /dev/i2c-7 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: Error EACCES(-13): Keine Berechtigung opening /dev/i2c-8 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error EACCES(-13): Keine Berechtigung opening /dev/i2c-0 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error EACCES(-13): Keine Berechtigung opening /dev/i2c-1 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error EACCES(-13): Keine Berechtigung opening /dev/i2c-2 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error EACCES(-13): Keine Berechtigung opening /dev/i2c-3 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error EACCES(-13): Keine Berechtigung opening /dev/i2c-4 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error EACCES(-13): Keine Berechtigung opening /dev/i2c-5 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error EACCES(-13): Keine Berechtigung opening /dev/i2c-6 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error EACCES(-13): Keine Berechtigung opening /dev/i2c-7 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1537] Error EACCES(-13): Keine Berechtigung opening /dev/i2c-8 Jun 18 11:05:58 n5z690 org_kde_powerdevil[1537]: [ 1689] (dw_recheck_displays_func) Recheck interval: Sleeping for 200 milliseconds
Debugging this issue with openAI O3 came up with this report (shortened for brevity):
1. Executive Summary
KDE’s power-management daemon (powerdevil) repeatedly attempts to access DDC/CI interfaces exposed as /dev/i2c-* to control external-monitor brightness.
All nine I²C character devices return EACCES (permission denied). The daemon then enters a tight re-check loop every 200 ms, generating log noise and a small but measurable CPU wake-up penalty (~0.3–0.7 % on typical systems).
No functional brightness control is delivered and future features relying on DPMS signals are marked “unimplemented”.
2. Timeline (18 Jun 11:05:57–11:05:58)
| T-offset | Component | Log excerpt | Meaning |
|---|---|---|---|
| +0 ms | powerdevil | Initializing libddcutil … |
DDC/CI support enabled |
| +2 ms | powerdevil | Device /dev/i2c-N lacks R/W permissions (N=0-8) |
udev permissions incorrect |
| +1 s | powerdevil | Error EACCES(-13) … opening /dev/i2c-N |
access attempt failed |
| +1 s | powerdevil | Recheck interval: Sleeping for 200 ms |
falls back to polling |
No crashes occur, but the daemon never succeeds.
3. Technical Root-Cause Analysis
-
Missing user/group ownership
• Default udev rule fromddcutil(e.g./usr/lib/udev/rules.d/60-ddcutil.rules) should set
GROUP="i2c", MODE="0660".
• Either the ruleset is absent, overridden, or the session user is not in groupi2c. -
libddcutil built from “-dev” branch (2.2.1-dev)
• Development snapshot may install rules under/usr/share/libddcutil/data/but not deploy them automatically.
• It also enables verbose “watch” + “recheck” threads which amplify the log rate. -
Secondary observations (non-blocking)
•Watching for DPMS state changes unimplemented→ Feature stub in your current plasma/powerdevil build; harmless.
•QML FolderViewDropArea … Binding loopandToolbox not loadingbelong to plasmashell UI; unrelated.
4. Impact Assessment
| Area | Impact |
|---|---|
| User experience | External monitor brightness keys / sliders have no effect. |
| Power efficiency | ~3–5 wakeups/s by powerdevil watch thread; negligible on desktop but wastes battery on laptops. |
| Log hygiene | Rapid, repeating EACCES messages clutter /var/log/journal, hampering troubleshooting. |
| Security | None (permission denied prevents potentially dangerous I²C writes). |
I then implemented O3’s suggestions (seen below) and the errors are indeed gone. Could this issue be fixed in CachyOS by default? That would be great!
────────────────────────────────────────
Option A – one-liner with echo/tee
────────────────────────────────────────
echo 'SUBSYSTEM=="i2c-dev", KERNEL=="i2c-[0-9]*", MODE="0660", GROUP="i2c", TAG+="uaccess"' \
| sudo tee /etc/udev/rules.d/99-i2c-permissions.rules
────────────────────────────────────────
Option B – open with $EDITOR (recommended)
────────────────────────────────────────
sudoedit /etc/udev/rules.d/99-i2c-permissions.rules
Then paste exactly:
# Broader rule: allow seat users + i2c group access to ALL i2c-dev nodes
SUBSYSTEM=="i2c-dev", KERNEL=="i2c-[0-9]*", MODE="0660", GROUP="i2c", TAG+="uaccess"
Save & exit.
────────────────────────────────────────
Reload rules and re-trigger
────────────────────────────────────────
sudo udevadm control --reload-rules
sudo udevadm trigger -s i2c-dev
────────────────────────────────────────
Quick verification
────────────────────────────────────────
ls -l /dev/i2c-6 # pick any bus
# expect: crw-rw---- 1 root i2c ...
ddcutil detect # should list your monitor(s) without EACCES