fix: avoid setting pstates unless explicitly enabled in the gui (#465)

* feat: better pstate config

* fix: reset custom pstate settings

* fix: sensitivity

* fix: remove pstates from config when empty

* fix: react to configurable notify

* fix: show on start

* fix: gpu switching
This commit is contained in:
Ilya Zlobintsev
2025-02-08 18:09:30 +02:00
committed by GitHub
parent eef331fa0c
commit ff55dc7634
5 changed files with 83 additions and 28 deletions

View File

@@ -565,7 +565,11 @@ impl<'a> Handler {
enabled_states: Vec<u8>,
) -> anyhow::Result<u64> {
self.edit_gpu_config(id.to_owned(), |gpu| {
gpu.power_states.insert(kind, enabled_states);
if enabled_states.is_empty() {
gpu.power_states.shift_remove(&kind);
} else {
gpu.power_states.insert(kind, enabled_states);
}
})
.await
.context("Failed to edit GPU config and set enabled power states")

View File

@@ -649,17 +649,15 @@ impl AppModel {
let enabled_power_states = self.oc_page.model().get_enabled_power_states();
for (kind, states) in enabled_power_states {
if !states.is_empty() {
self.daemon_client
.set_enabled_power_states(&gpu_id, kind, states)
.await
.context("Could not set power states")?;
self.daemon_client
.set_enabled_power_states(&gpu_id, kind, states)
.await
.context("Could not set power states")?;
self.daemon_client
.confirm_pending_config(ConfirmCommand::Confirm)
.await
.context("Could not commit config")?;
}
self.daemon_client
.confirm_pending_config(ConfirmCommand::Confirm)
.await
.context("Could not commit config")?;
}
if !clocks_commands.is_empty() {

View File

@@ -43,6 +43,7 @@ pub enum OcPageMsg {
ClocksTable(Option<ClocksTable>),
ProfileModesTable(Option<PowerProfileModesTable>),
PowerStates(PowerStates),
PerformanceLevelChanged,
}
#[relm4::component(pub)]
@@ -156,6 +157,7 @@ impl relm4::Component for OcPage {
}
None => self.performance_frame.hide(),
}
sender.input(OcPageMsg::PerformanceLevelChanged);
}
}
PageUpdate::Info(info) => {
@@ -177,6 +179,14 @@ impl relm4::Component for OcPage {
OcPageMsg::PowerStates(states) => {
self.power_states_frame.set_power_states(states);
}
OcPageMsg::PerformanceLevelChanged => {
if let Some(PerformanceLevel::Manual) = self.get_performance_level() {
self.power_states_frame.set_toggleable(true);
} else {
self.power_states_frame.set_toggleable(false);
self.power_states_frame.set_configurable(false);
}
}
}
self.signals_blocked.set(false);
@@ -191,7 +201,17 @@ impl relm4::Component for OcPage {
}
};
self.performance_frame.connect_settings_changed(f.clone());
self.power_states_frame.connect_values_changed(f);
self.power_states_frame.connect_values_changed(f.clone());
{
let sender = sender.clone();
self.performance_frame.connect_settings_changed(move || {
sender.input(OcPageMsg::PerformanceLevelChanged);
});
}
self.power_states_frame
.connect_configurable_notify(move |_| f());
self.update_view(widgets, sender);
}
@@ -216,10 +236,6 @@ impl OcPage {
}
pub fn get_enabled_power_states(&self) -> HashMap<PowerLevelKind, Vec<u8>> {
if self.performance_frame.get_selected_performance_level() == PerformanceLevel::Manual {
self.power_states_frame.get_enabled_power_states()
} else {
HashMap::new()
}
self.power_states_frame.get_enabled_power_states()
}
}

View File

@@ -26,6 +26,15 @@ impl PowerStatesFrame {
imp.expander.set_expanded(false);
}
if states
.core
.iter()
.chain(states.vram.iter())
.any(|state| !state.enabled)
{
self.set_configurable(true);
}
imp.core_states_list
.set_power_states(states.core, "MHz", 1.0);
imp.vram_states_list
@@ -48,9 +57,17 @@ impl PowerStatesFrame {
}
pub fn get_enabled_power_states(&self) -> HashMap<PowerLevelKind, Vec<u8>> {
let imp = self.imp();
let core_states = imp.core_states_list.get_enabled_power_states();
let vram_states = imp.vram_states_list.get_enabled_power_states();
let core_states;
let vram_states;
if self.configurable() {
let imp = self.imp();
core_states = imp.core_states_list.get_enabled_power_states();
vram_states = imp.vram_states_list.get_enabled_power_states();
} else {
core_states = vec![];
vram_states = vec![];
}
[
(PowerLevelKind::CoreClock, core_states),
@@ -94,6 +111,8 @@ mod imp {
#[property(get, set)]
configurable: AtomicBool,
#[property(get, set)]
toggleable: AtomicBool,
#[property(get, set)]
vram_clock_ratio: Cell<f64>,
}

View File

@@ -5,21 +5,39 @@ template $PowerStatesFrame: Box {
label: "Power states";
Box {
orientation: vertical;
margin-start: 10;
margin-end: 10;
margin-top: 10;
margin-bottom: 10;
spacing: 10;
orientation: horizontal;
spacing: 5;
$PowerStatesList core_states_list {
title: "GPU power states";
sensitive: bind template.configurable;
Label {
label: "Note: performance level must be set to 'manual' to toggle power states";
margin-start: 10;
margin-end: 10;
halign: start;
}
$PowerStatesList vram_states_list {
title: "VRAM power states";
sensitive: bind template.configurable;
CheckButton {
label: "Enable power state configuration";
sensitive: bind template.toggleable bidirectional;
active: bind template.configurable bidirectional;
}
Box {
spacing: 10;
orientation: horizontal;
$PowerStatesList core_states_list {
title: "GPU power states";
sensitive: bind template.configurable;
}
$PowerStatesList vram_states_list {
title: "VRAM power states";
sensitive: bind template.configurable;
}
}
}
}