You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
On a fresh boot, rog-control-center shows "The asus-armoury driver is not loaded" and the Armoury settings are unavailable — even though the asus-armoury kernel module is loaded and /sys/class/firmware-attributes/asus-armoury/attributes/ is fully populated.
The real cause is in asusd, not the kernel: start_attributes_zbus()breaks out of the whole attribute loop the moment any single attribute's reload() fails. When asusd boots while the laptop is on battery in the Balanced or Quiet profile, it tries to restore the persisted PPT tuning nv_dynamic_boost = 20, the firmware rejects that write with EINVAL, and the break then prevents every armoury attribute from being registered on D-Bus. The GUI sees no xyz.ljones.AsusArmoury objects and reports the driver as "not loaded".
A systemctl restart asusd while on AC + Performance "fixes" it only because that profile's tuning is nv_dynamic_boost = 5 (accepted), so no attribute errors and the loop completes — i.e. the bug is masked by power/profile state, not actually resolved.
Root cause (code references — still present on main, v6.3.8)
The fatal break — asusd/src/asus_armoury.rs:587 (start_attributes_zbus):
for attr in attributes.attributes(){
...ifletErr(e) = attr.reload().await{error!("Skipping attribute '{}' due to reload error: {e:?}", attr.attr.name());break;// <-- abandons ALL remaining attributes}
...
registry.push(registry_attr);}
The log says "Skipping attribute", but break does not skip it — it aborts the entire registration. A single firmware-rejected attribute therefore takes down the whole xyz.ljones.AsusArmoury interface.
Non-deterministic ordering — rog-platform/src/asus_armoury.rs (FirmwareAttributes::new) builds the list from read_dir(BASE_DIR), whose order is unsorted/filesystem-dependent. So which attributes happen to register before the offending one varies between boots, making the failure look intermittent.
The trigger value — nv_dynamic_boost is typed Ppt (rog-platform/src/asus_armoury.rs), so on reload asusd writes the active profile's tuning to the firmware. The battery (dc_profile_tunings) Balanced/Quiet groups carried NvDynamicBoost: 20, which the asus-armoury driver rejects with EINVAL even though it advertises max_value = 20 (the effective max is state-dependent / lower on battery; current_value = 5).
Steps to reproduce
Laptop with an Nvidia dGPU exposing nv_dynamic_boost via asus-armoury (here: current=5 / min=5 / max=20 / default=20).
Have a persisted battery PPT tuning of NvDynamicBoost: 20 in /etc/asusd/asusd.ron under dc_profile_tunings (Balanced and/or Quiet) — this is what asusd had saved by default.
Unplug AC, set the Platform Profile to Balanced or Quiet.
Reboot (cold boot, no manual asusd restart).
Open rog-control-center.
What is the current bug behavior?
rog-control-center shows "The asus-armoury driver is not loaded" and hides Armoury settings.
asusd log shows exactly one armoury reload attempt, the EINVAL, and then nothing further.
systemctl restart asusdwhile on AC + Performance makes all attributes appear — proving the kernel/driver is fine and the failure is the break.
What is the expected correct behavior?
A single attribute failing to reload should be skipped (logged), and all other armoury attributes should still register on D-Bus. The Armoury interface should be available regardless of power source or profile at boot time.
Suggested fix: replace break with continue in start_attributes_zbus() so a per-attribute failure is non-fatal (which also matches the existing "Skipping attribute" log wording). Optionally, treat a firmware EINVAL on a PPT restore as a non-fatal warning rather than a hard error.
Relevant logs and/or screenshots
journalctl -b -u asusd at boot (on battery, Balanced/Quiet), redacted to the relevant lines:
asusd[...]: [INFO asusd::asus_armoury] Reloading nv_dynamic_boost
asusd[...]: [INFO asusd::asus_armoury] Applying value Integer(20) to attribute nv_dynamic_boost
asusd[...]: [ERROR asusd::asus_armoury] Could not set nv_dynamic_boost value: Io(Os { code: 22, kind: InvalidInput, message: "Invalid argument" })
asusd[...]: [DEBUG rog_platform::asus_armoury] Attribute path "/sys/class/firmware-attributes/asus-armoury/attributes/nv_dynamic_boost" exits? true
asusd[...]: [ERROR asusd::asus_armoury] Skipping attribute 'nv_dynamic_boost' due to reload error: Platform(Io(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }))
asusd[...]: [INFO asusd] attribute on zbus initialized
D-Bus tree in the failed state (no armoury objects):
rog-control-center power tuning sliders are not updating on a power state change. #87 (closed) — "rog-control-center power tuning sliders are not updating on a power state change." Documents that PPT min_value/max_valuechange between AC and DC. This is exactly why writing nv_dynamic_boost = 20 is rejected with EINVAL on battery: the effective max is lower on DC. This issue is the next layer — asusd's break turns that one rejected write into a complete loss of the armoury D-Bus interface.
Fix missing asus-armoury driver #67 (closed) — same surface symptom ("asus-armoury driver is not loaded") but a different cause (driver genuinely absent on Debian). Noted to distinguish: in this report the driver is loaded and /sys/class/firmware-attributes/asus-armoury/attributes/ is fully populated.
Issue description
On a fresh boot,
rog-control-centershows "The asus-armoury driver is not loaded" and the Armoury settings are unavailable — even though theasus-armourykernel module is loaded and/sys/class/firmware-attributes/asus-armoury/attributes/is fully populated.The real cause is in
asusd, not the kernel:start_attributes_zbus()breaks out of the whole attribute loop the moment any single attribute'sreload()fails. Whenasusdboots while the laptop is on battery in the Balanced or Quiet profile, it tries to restore the persisted PPT tuningnv_dynamic_boost = 20, the firmware rejects that write withEINVAL, and thebreakthen prevents every armoury attribute from being registered on D-Bus. The GUI sees noxyz.ljones.AsusArmouryobjects and reports the driver as "not loaded".A
systemctl restart asusdwhile on AC + Performance "fixes" it only because that profile's tuning isnv_dynamic_boost = 5(accepted), so no attribute errors and the loop completes — i.e. the bug is masked by power/profile state, not actually resolved.Root cause (code references — still present on
main, v6.3.8)The fatal
break—asusd/src/asus_armoury.rs:587(start_attributes_zbus):The log says "Skipping attribute", but
breakdoes not skip it — it aborts the entire registration. A single firmware-rejected attribute therefore takes down the wholexyz.ljones.AsusArmouryinterface.Non-deterministic ordering —
rog-platform/src/asus_armoury.rs(FirmwareAttributes::new) builds the list fromread_dir(BASE_DIR), whose order is unsorted/filesystem-dependent. So which attributes happen to register before the offending one varies between boots, making the failure look intermittent.The trigger value —
nv_dynamic_boostis typedPpt(rog-platform/src/asus_armoury.rs), so on reloadasusdwrites the active profile's tuning to the firmware. The battery (dc_profile_tunings) Balanced/Quiet groups carriedNvDynamicBoost: 20, which theasus-armourydriver rejects withEINVALeven though it advertisesmax_value = 20(the effective max is state-dependent / lower on battery;current_value = 5).Steps to reproduce
nv_dynamic_boostviaasus-armoury(here:current=5 / min=5 / max=20 / default=20).NvDynamicBoost: 20in/etc/asusd/asusd.ronunderdc_profile_tunings(Balanced and/or Quiet) — this is what asusd had saved by default.rog-control-center.What is the current bug behavior?
rog-control-centershows "The asus-armoury driver is not loaded" and hides Armoury settings.busctl --system tree xyz.ljones.Asusdshows no/xyz/ljones/asus_armoury/*objects (onlyaura,Platform,FanCurves).asusdlog shows exactly one armoury reload attempt, theEINVAL, and then nothing further.systemctl restart asusdwhile on AC + Performance makes all attributes appear — proving the kernel/driver is fine and the failure is thebreak.What is the expected correct behavior?
A single attribute failing to reload should be skipped (logged), and all other armoury attributes should still register on D-Bus. The Armoury interface should be available regardless of power source or profile at boot time.
Suggested fix: replace
breakwithcontinueinstart_attributes_zbus()so a per-attribute failure is non-fatal (which also matches the existing "Skipping attribute" log wording). Optionally, treat a firmwareEINVALon a PPT restore as a non-fatal warning rather than a hard error.Relevant logs and/or screenshots
journalctl -b -u asusdat boot (on battery, Balanced/Quiet), redacted to the relevant lines:D-Bus tree in the failed state (no armoury objects):
After
systemctl restart asusdon AC + Performance (tuning value5, accepted) — all attributes register:Workaround that makes it survive any boot state (set the rejected battery value to an accepted one):
Related issues
min_value/max_valuechange between AC and DC. This is exactly why writingnv_dynamic_boost = 20is rejected withEINVALon battery: the effective max is lower on DC. This issue is the next layer — asusd'sbreakturns that one rejected write into a complete loss of the armoury D-Bus interface./sys/class/firmware-attributes/asus-armoury/attributes/is fully populated.System details
main)