From 0a49fdaf1f4ff162b172994a2586e42141ad0c24 Mon Sep 17 00:00:00 2001 From: Jeremy Whiting Date: Wed, 11 Oct 2023 13:20:53 -0600 Subject: [PATCH] Implement set_gpu_performance_level. Use an enum of values for level: 0 - auto 1 - low 2 - high 3 - manual 4 - peak_performance If any out of range are given, return an false. If unable to write or open for writing, return false. May change to give an err type instead later if that helps client side. --- com.steampowered.SteamOSManager1.xml | 4 +--- src/manager.rs | 32 +++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/com.steampowered.SteamOSManager1.xml b/com.steampowered.SteamOSManager1.xml index 47eeb73..5828e1f 100644 --- a/com.steampowered.SteamOSManager1.xml +++ b/com.steampowered.SteamOSManager1.xml @@ -137,15 +137,13 @@ - diff --git a/src/manager.rs b/src/manager.rs index fcfc331..084ecd9 100644 --- a/src/manager.rs +++ b/src/manager.rs @@ -24,7 +24,7 @@ */ use std::{ffi::OsStr}; -use tokio::process::Command; +use tokio::{process::Command, fs::File, io::AsyncWriteExt}; use zbus_macros::dbus_interface; pub struct SMManager { } @@ -132,6 +132,36 @@ impl SMManager { run_script("format sdcard", "/usr/bin/steamos-polkit-helpers/steamos-format-sdcard", &[""]).await } + async fn set_gpu_performance_level(&self, level: i32) -> bool { + // Set given level to sysfs path /sys/class/drm/card0/device/power_dpm_force_performance_level + // Levels are defined below + // return true if able to write, false otherwise or if level is out of range, etc. + let levels = [ + "auto", + "low", + "high", + "manual", + "peak_performance" + ]; + if level < 0 || level >= levels.len() as i32 { + return false; + } + + // Open sysfs file + let result = File::create("/sys/class/drm/card0/device/power_dpm_force_performance_level").await; + let mut myfile; + match result { + Ok(f) => myfile = f, + Err(message) => { println!("Error opening sysfs file for writing {message}"); return false; } + }; + + // write value + let result = myfile.write_all(levels[level as usize].as_bytes()).await; + match result { + Ok(_worked) => true, + Err(message) => { println!("Error writing to sysfs file {message}"); false } + } + } /// A version property. #[dbus_interface(property)]