fix: apply pstates correctly when clocks settings are used (#437)

* fix: apply pstates after clocks table and other settings

* fix: take vram clock ratio into account for pstates
This commit is contained in:
Ilya Zlobintsev
2024-12-31 19:03:39 +02:00
committed by GitHub
parent 08a3d5b90e
commit e1457cad54
4 changed files with 29 additions and 17 deletions

View File

@@ -873,18 +873,6 @@ impl GpuController for AmdGpuController {
}
}
for (kind, states) in &config.power_states {
if config.performance_level != Some(PerformanceLevel::Manual) {
return Err(anyhow!(
"Performance level has to be set to `manual` to configure power states"
));
}
self.handle
.set_enabled_power_levels(*kind, states)
.with_context(|| format!("Could not set {kind:?} power states"))?;
}
if config.fan_control_enabled {
if let Some(ref settings) = config.fan_control_settings {
match settings.mode {
@@ -1017,6 +1005,18 @@ impl GpuController for AmdGpuController {
handle.commit()?;
}
for (kind, states) in &config.power_states {
if config.performance_level != Some(PerformanceLevel::Manual) {
return Err(anyhow!(
"Performance level has to be set to `manual` to configure power states"
));
}
self.handle
.set_enabled_power_levels(*kind, states)
.with_context(|| format!("Could not set {kind:?} power states"))?;
}
Ok(())
})
}

View File

@@ -121,6 +121,8 @@ impl OcPage {
.map(|info| info.vram_clock_ratio)
.unwrap_or(1.0);
self.power_states_frame
.set_vram_clock_ratio(vram_clock_ratio);
self.stats_section.set_vram_clock_ratio(vram_clock_ratio);
self.clocks_frame.set_vram_clock_ratio(vram_clock_ratio);
}

View File

@@ -26,8 +26,10 @@ impl PowerStatesFrame {
imp.expander.set_expanded(false);
}
imp.core_states_list.set_power_states(states.core, "MHz");
imp.vram_states_list.set_power_states(states.vram, "MHz");
imp.core_states_list
.set_power_states(states.core, "MHz", 1.0);
imp.vram_states_list
.set_power_states(states.vram, "MHz", self.vram_clock_ratio());
}
pub fn connect_values_changed<F: Fn() + 'static + Clone>(&self, f: F) {
@@ -76,7 +78,7 @@ mod imp {
},
CompositeTemplate, Expander,
};
use std::sync::atomic::AtomicBool;
use std::{cell::Cell, sync::atomic::AtomicBool};
#[derive(CompositeTemplate, Default, Properties)]
#[properties(wrapper_type = super::PowerStatesFrame)]
@@ -91,6 +93,8 @@ mod imp {
#[property(get, set)]
configurable: AtomicBool,
#[property(get, set)]
vram_clock_ratio: Cell<f64>,
}
#[glib::object_subclass]

View File

@@ -31,9 +31,15 @@ impl PowerStatesList {
.collect()
}
pub fn set_power_states(&self, power_states: Vec<PowerState>, value_suffix: &str) {
pub fn set_power_states(
&self,
power_states: Vec<PowerState>,
value_suffix: &str,
value_ratio: f64,
) {
let store = gio::ListStore::new::<PowerStateRow>();
for (i, state) in power_states.into_iter().enumerate() {
for (i, mut state) in power_states.into_iter().enumerate() {
state.value = (state.value as f64 * value_ratio) as u64;
let index = u8::try_from(i).expect("Power state index doesn't fit in u8?");
let row = PowerStateRow::new(state, index, value_suffix);
store.append(&row);