somewhat working power cap

This commit is contained in:
Ilya Zlobintsev
2022-11-20 20:09:36 +02:00
parent bb8094404d
commit 41cc2cd266
6 changed files with 51 additions and 39 deletions

2
Cargo.lock generated
View File

@@ -26,7 +26,7 @@ dependencies = [
[[package]]
name = "amdgpu-sysfs"
version = "0.5.0"
source = "git+https://github.com/ilya-zlobintsev/amdgpu-sysfs-rs?branch=error#4ffd5ee0be7fb644c50a6163c3eea6b3872333cd"
source = "git+https://github.com/ilya-zlobintsev/amdgpu-sysfs-rs?branch=error#80cf493d20c36e27a54e5b34162d05767ec6c305"
dependencies = [
"serde",
]

View File

@@ -21,7 +21,7 @@ use std::{
time::Duration,
};
use tokio::{select, sync::Notify, task::JoinHandle, time::sleep};
use tracing::{debug, error, info, warn};
use tracing::{error, info, trace, warn};
type FanControlHandle = (Arc<Notify>, JoinHandle<()>);
@@ -212,7 +212,7 @@ impl GpuController {
.remove(&temp_key)
.expect("Could not get temperature by given key");
let target_rpm = curve.rpm_at_temp(temp, min_rpm, max_rpm);
debug!("Fan control tick: setting rpm to {target_rpm}");
trace!("Fan control tick: setting rpm to {target_rpm}");
if let Err(err) = hw_mon.set_fan_target(target_rpm) {
error!("Could not set fan speed: {err}, disabling fan control");

View File

@@ -17,6 +17,9 @@ use lact_schema::DeviceStats;
use root_stack::RootStack;
use tracing::{debug, error, info, trace};
// In ms
const STATS_POLL_INTERVAL: u64 = 250;
#[derive(Clone)]
pub struct App {
pub window: Window,
@@ -98,10 +101,10 @@ impl App {
let apply_revealer = self.apply_revealer.clone();
// self.root_stack.oc_page.connect_settings_changed(move || {
// debug!("Settings changed, showing apply button");
// apply_revealer.show();
// });
self.root_stack.oc_page.connect_settings_changed(move || {
debug!("Settings changed, showing apply button");
apply_revealer.show();
});
}
{
@@ -169,13 +172,13 @@ impl App {
app.daemon_client
.set_power_profile(gpu_id, profile)
.expect("Failed to set power profile");
}
}*/
if let Some(cap) = app.root_stack.oc_page.get_power_cap() {
app.daemon_client
.set_power_cap(gpu_id, cap)
.set_power_cap(&gpu_id, Some(cap))
.expect("Failed to set power cap");
}*/
}
app.set_info(&gpu_id);
});
@@ -192,9 +195,16 @@ impl App {
.get_device_info(gpu_id)
.expect("Could not fetch info");
let info = info_buf.inner().unwrap();
trace!("Setting info {info:?}");
let stats_buf = self
.daemon_client
.get_device_stats(gpu_id)
.expect("Could not fetch stats");
let stats = stats_buf.inner().unwrap();
trace!("Setting info {info:?} and stats {stats:?}");
self.root_stack.info_page.set_info(&info);
self.root_stack.oc_page.set_stats(&stats, true);
// trace!("Setting clocks");
// self.root_stack.oc_page.set_info(&info);
@@ -265,7 +275,7 @@ impl App {
error!("Could not fetch stats: {err}");
}
}
thread::sleep(Duration::from_millis(500));
thread::sleep(Duration::from_millis(STATS_POLL_INTERVAL));
}),
);
@@ -279,7 +289,7 @@ impl App {
trace!("New stats received, updating {stats:?}");
root_stack.info_page.set_stats(&stats);
root_stack.thermals_page.set_stats(&stats);
root_stack.oc_page.set_stats(&stats);
root_stack.oc_page.set_stats(&stats, false);
} /*GuiUpdateMsg::FanControlInfo(fan_control_info) => {
thermals_page.set_ventilation_info(fan_control_info)
}*/

View File

@@ -4,6 +4,7 @@ mod power_cap_frame;
mod stats_grid;
mod warning_frame;
use glib::clone;
use gtk::prelude::*;
use gtk::*;
use lact_schema::{DeviceInfo, DeviceStats, PerformanceLevel, PowerStats};
@@ -56,12 +57,14 @@ impl OcPage {
}
}
pub fn set_stats(&self, stats: &DeviceStats) {
pub fn set_stats(&self, stats: &DeviceStats, initial: bool) {
self.stats_grid.set_stats(stats);
self.power_cap_frame.set_data(
stats.power_stats.power_cap_current,
stats.power_stats.power_cap_max,
);
if initial {
self.power_cap_frame.set_data(
stats.power_stats.power_cap_current,
stats.power_stats.power_cap_max,
);
}
}
pub fn connect_clocks_reset<F: Fn() + 'static + Clone>(&self, f: F) {
@@ -72,24 +75,17 @@ impl OcPage {
}
pub fn connect_settings_changed<F: Fn() + 'static + Clone>(&self, f: F) {
{
let f = f.clone();
self.performance_level_frame
.connect_power_profile_changed(move || {
f();
});
}
{
/*let f = f.clone();
self.clocks_frame.connect_clocks_changed(move || {
f();
})*/
}
{
self.power_cap_frame.connect_cap_changed(move || {
f();
})
}
self.performance_level_frame
.connect_power_profile_changed(clone!(@strong f => move || {
f()
}));
/*let f = f.clone();
self.clocks_frame.connect_clocks_changed(move || {
f();
})*/
self.power_cap_frame.connect_cap_changed(move || {
f();
})
}
pub fn set_performance_level(&self, profile: Option<PerformanceLevel>) {
@@ -130,7 +126,7 @@ impl OcPage {
}
}*/
pub fn get_power_cap(&self) -> Option<i64> {
pub fn get_power_cap(&self) -> Option<f64> {
self.power_cap_frame.get_cap()
}
}

View File

@@ -63,13 +63,13 @@ impl PowerCapFrame {
}
}
pub fn get_cap(&self) -> Option<i64> {
pub fn get_cap(&self) -> Option<f64> {
// Using match gives a warning that floats shouldn't be used in patterns
let cap = self.adjustment.value();
if cap == 0.0 {
None
} else {
Some(cap as i64)
Some(cap)
}
}

View File

@@ -62,6 +62,12 @@ impl DaemonClient {
Ok(())
}
pub fn set_power_cap(&self, id: &str, cap: Option<f64>) -> anyhow::Result<()> {
self.make_request(Request::SetPowerCap { id, cap })?
.inner()?;
Ok(())
}
pub fn get_device_info(&self, id: &str) -> anyhow::Result<ResponseBuffer<DeviceInfo>> {
self.make_request(Request::DeviceInfo { id })
}