From be7c49219261d6e25f7c43d90f760e2daff3ee40 Mon Sep 17 00:00:00 2001 From: William Edwards Date: Tue, 10 Dec 2024 23:09:24 -0800 Subject: [PATCH] fix(AsusWMI): use platform to set TDP instead of FirmwareAttributes --- Cargo.lock | 2 +- src/performance/gpu/asus/asus_wmi.rs | 126 ++++++--------------------- 2 files changed, 30 insertions(+), 98 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9014505..11afccb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1223,7 +1223,7 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "powerstation" -version = "0.3.1" +version = "0.3.2" dependencies = [ "libryzenadj", "log", diff --git a/src/performance/gpu/asus/asus_wmi.rs b/src/performance/gpu/asus/asus_wmi.rs index 53e1fb0..fb4988e 100644 --- a/src/performance/gpu/asus/asus_wmi.rs +++ b/src/performance/gpu/asus/asus_wmi.rs @@ -1,28 +1,29 @@ use crate::performance::gpu::tdp::{TDPError, TDPResult}; -use rog_platform::{ - firmware_attributes::{AttrValue, FirmwareAttributes}, - platform::RogPlatform, -}; +use rog_platform::{error::PlatformError, platform::RogPlatform}; + +impl From for TDPError { + fn from(value: PlatformError) -> Self { + Self::FailedOperation(value.to_string()) + } +} /// Implementation of asus-wmi sysfs /// See https://www.kernel.org/doc/html/v6.8-rc4/admin-guide/abi-testing.html#abi-sys-devices-platform-platform-ppt-apu-sppt pub struct AsusWmi { - attributes: FirmwareAttributes, + platform: RogPlatform, } impl AsusWmi { /// test if we are in an asus system with asus-wmi loaded pub async fn new() -> Option { match RogPlatform::new() { - Ok(_) => { + Ok(platform) => { log::info!("Module asus-wmi found"); - Some(Self { - attributes: FirmwareAttributes::new(), - }) + Some(Self { platform }) } Err(err) => { - log::info!("Module asus-wmi not found: {}", err); + log::info!("Module asus-wmi not found: {err:?}"); None } } @@ -30,56 +31,25 @@ impl AsusWmi { /// Returns the currently set STAPM value pub async fn tdp(&self) -> TDPResult { - match self - .attributes - .attributes() - .iter() - .find(|a| a.name() == "ppt_pl1_spl") - .unwrap() - .current_value() - { - Ok(attr_value) => match attr_value { - AttrValue::Integer(value) => { - log::info!("Found STAPM value: {value}"); - Ok(value as f64) - } - _ => Err(TDPError::FailedOperation( - "Failed to read STAPM value".to_string(), - )), - }, - Err(e) => Err(TDPError::FailedOperation(format!( - "Failed to read STAPM Value: {e:?}" - ))), - } + Ok(self.platform.get_ppt_pl1_spl()? as f64) } /// Sets STAPM to the given value and adjusts the SPPT/FPPT to maintaing the current boost /// ratio pub async fn set_tdp(&mut self, value: f64) -> TDPResult<()> { + if value < 1.0 || value > u8::MAX as f64 { + return Err(TDPError::InvalidArgument( + "Value must be between 1 and 255".to_string(), + )); + } + // Get the current Boost value let boost = self.boost().await?; // Set the STAPM value to the given TDP value - let val = AttrValue::Integer(value as i32); - match self - .attributes - .attributes_mut() - .iter() - .find(|a| a.name() == "ppt_pl1_spl") - .unwrap() - .set_current_value(val) - { - Ok(_) => { - log::info!("Set STAPM value to {value}"); - } - Err(e) => { - return Err(TDPError::FailedOperation(format!( - "Failed to set STAPM value: {e:}" - ))); - } - } + self.platform.set_ppt_pl1_spl(value as u8)?; - // Set the boost back to the expeted value with the new TDP + // Set the boost back to the expected value with the new TDP self.set_boost(boost).await?; Ok(()) @@ -93,35 +63,10 @@ impl AsusWmi { return Err(e); } }; - - let slow_ppt = match self - .attributes - .attributes() - .iter() - .find(|a| a.name() == "ppt_platform_sppt") - .unwrap() - .current_value() - { - Ok(attr_value) => match attr_value { - AttrValue::Integer(value) => { - log::info!("Found Slow PPT value: {value}"); - value as f64 - } - _ => { - return Err(TDPError::FailedOperation( - "Failed to read Slow PPT value".to_string(), - )) - } - }, - Err(e) => { - return Err(TDPError::FailedOperation(format!( - "Failed to read Slow PPT value: {e:?}" - ))) - } - }; - + let slow_ppt = self.platform.get_ppt_platform_sppt()? as f64; let boost = slow_ppt - stapm; log::info!("Found current boost: {boost}"); + Ok(boost) } @@ -133,28 +78,15 @@ impl AsusWmi { return Err(e); } }; - - let sppt_val = (stapm + value) as i32; - let boost = AttrValue::Integer(sppt_val); + if (stapm + value) < 1.0 || (stapm + value) > u8::MAX as f64 { + return Err(TDPError::InvalidArgument( + "Combined TDP + Boost value must be between 1 and 255".to_string(), + )); + } + let boost = (stapm + value) as u8; // ppt_platform_sppt will set sppt to value and fppt to value + 25% - match self - .attributes - .attributes_mut() - .iter() - .find(|a| a.name() == "ppt_platform_sppt") - .unwrap() - .set_current_value(boost) - { - Ok(_) => { - log::info!("Set Slow PPT to {sppt_val}"); - } - Err(e) => { - return Err(TDPError::FailedOperation(format!( - "Failed to set Slow PPT: {e:?}" - ))) - } - }; + self.platform.set_ppt_platform_sppt(boost)?; Ok(()) }