From f30c54c9076b164bb437630de3c60271ca0e54b6 Mon Sep 17 00:00:00 2001 From: Jeremy Whiting Date: Tue, 4 Jun 2024 15:17:27 -0600 Subject: [PATCH] Add gpu power profile(s) property management to steamosctl. Adds get-gpu-power-profiles to list supported profiles get-gpu-power-profile to list current and set-gpu-power-profile to set. --- src/bin/steamosctl.rs | 38 +++++++++++++++++++++++++++++++++++++- src/proxy.rs | 10 ++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/bin/steamosctl.rs b/src/bin/steamosctl.rs index 05b94bd..1fdc326 100644 --- a/src/bin/steamosctl.rs +++ b/src/bin/steamosctl.rs @@ -11,7 +11,7 @@ use itertools::Itertools; use std::ops::Deref; use steamos_manager::cec::HdmiCecState; use steamos_manager::hardware::FanControlState; -use steamos_manager::power::GPUPerformanceLevel; +use steamos_manager::power::{GPUPerformanceLevel, GPUPowerProfile}; use steamos_manager::proxy::ManagerProxy; use steamos_manager::wifi::{WifiBackend, WifiDebugMode, WifiPowerManagement}; use zbus::fdo::PropertiesProxy; @@ -45,6 +45,18 @@ enum Commands { /// Get the fan control state GetFanControlState, + /// Get the GPU power profiles supported on this device + GetGPUPowerProfiles, + + /// Get the current GPU power profile + GetGPUPowerProfile, + + /// Set the GPU Power profile + SetGPUPowerProfile { + /// Valid profiles are get-gpu-power-profiles. + profile: GPUPowerProfile, + }, + /// Set the GPU performance level SetGPUPerformanceLevel { /// Valid levels are auto, low, high, manual, peak_performance @@ -191,6 +203,30 @@ async fn main() -> Result<()> { Err(_) => println!("Got unknown value {state} from backend"), } } + Commands::GetGPUPowerProfiles => { + let profiles = proxy.gpu_power_profiles().await?; + println!("Profiles:\n"); + for key in profiles.keys().sorted() { + let name = &profiles[key]; + println!("{key}: {name}"); + } + } + Commands::GetGPUPowerProfile => { + let profile = proxy.gpu_power_profile().await?; + let profile_type = GPUPowerProfile::try_from(profile); + match profile_type { + Ok(t) => { + let name = t.to_string(); + println!("GPU Power Profile: {profile} {name}"); + } + Err(_) => { + println!("Unknown GPU power profile or unable to get type from {profile}") + } + } + } + Commands::SetGPUPowerProfile { profile } => { + proxy.set_gpu_power_profile(*profile as u32).await?; + } Commands::SetGPUPerformanceLevel { level } => { proxy.set_gpu_performance_level(*level as u32).await?; } diff --git a/src/proxy.rs b/src/proxy.rs index c9be1df..ac118ac 100644 --- a/src/proxy.rs +++ b/src/proxy.rs @@ -62,6 +62,16 @@ trait Manager { #[zbus(property)] fn set_gpu_performance_level(&self, value: u32) -> zbus::Result<()>; + /// GpuPowerProfile property + #[zbus(property)] + fn gpu_power_profile(&self) -> zbus::Result; + #[zbus(property)] + fn set_gpu_power_profile(&self, value: u32) -> zbus::Result<()>; + + /// GpuPowerProfiles property + #[zbus(property)] + fn gpu_power_profiles(&self) -> zbus::Result>; + /// HardwareCurrentlySupported property #[zbus(property)] fn hardware_currently_supported(&self) -> zbus::Result;