From c9bd44d317805e386e366a4565c086978e3c2789 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Fri, 30 May 2025 02:06:54 +0800 Subject: [PATCH 1/6] --versions: Add support for dumping NVIDIA graphics info Trying it out with thunderbolt eGPUs Signed-off-by: Daniel Schaefer --- Cargo.lock | 123 ++++++++++++++++++++++++++- framework_lib/Cargo.toml | 2 + framework_lib/src/commandline/mod.rs | 18 ++++ 3 files changed, 141 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index be5f5f4d..b1f289ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -331,6 +331,41 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.98", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.98", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -397,6 +432,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "form_urlencoded" version = "1.1.0" @@ -425,6 +466,7 @@ dependencies = [ "num", "num-derive", "num-traits", + "nvml-wrapper", "plain", "redox_hwio", "regex", @@ -646,6 +688,12 @@ dependencies = [ "cxx-build", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.3.0" @@ -733,6 +781,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libloading" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.53.0", +] + [[package]] name = "libusb1-sys" version = "0.7.0" @@ -921,6 +979,29 @@ dependencies = [ "autocfg", ] +[[package]] +name = "nvml-wrapper" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d5c6c0ef9702176a570f06ad94f3198bc29c524c8b498f1b9346e1b1bdcbb3a" +dependencies = [ + "bitflags 2.6.0", + "libloading", + "nvml-wrapper-sys", + "static_assertions", + "thiserror 1.0.69", + "wrapcenum-derive", +] + +[[package]] +name = "nvml-wrapper-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd23dbe2eb8d8335d2bce0299e0a07d6a63c089243d626ca75b770a962ff49e6" +dependencies = [ + "libloading", +] + [[package]] name = "once_cell" version = "1.16.0" @@ -1170,6 +1251,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "static_vcruntime" version = "2.0.0" @@ -1213,13 +1300,33 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.11", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -1856,7 +1963,19 @@ dependencies = [ "futures", "log", "serde", - "thiserror", + "thiserror 2.0.11", "windows 0.59.0", "windows-core", ] + +[[package]] +name = "wrapcenum-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76ff259533532054cfbaefb115c613203c73707017459206380f03b3b3f266e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.98", +] diff --git a/framework_lib/Cargo.toml b/framework_lib/Cargo.toml index 162538f4..a1abfef3 100644 --- a/framework_lib/Cargo.toml +++ b/framework_lib/Cargo.toml @@ -52,6 +52,7 @@ clap-num = { version = "1.2.0" } clap-verbosity-flag = { version = "2.2.1" } windows-version = "0.1.4" winreg = "0.55.0" +nvml-wrapper = "0.11.0" [target.'cfg(unix)'.dependencies] libc = "0.2.155" @@ -62,6 +63,7 @@ env_logger = "0.11" clap = { version = "4.5", features = ["derive", "cargo"] } clap-num = { version = "1.2.0" } clap-verbosity-flag = { version = "2.2.1" } +nvml-wrapper = "0.11.0" [target.'cfg(windows)'.dependencies.windows] version = "0.59.0" diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index dab66c02..025b8e8a 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -756,6 +756,24 @@ fn print_versions(ec: &CrosEc) { } } } + + #[cfg(any(target_os = "linux", target_os = "windows"))] + match nvml_wrapper::Nvml::init() { + Ok(nvml) => { + // Get the first `Device` (GPU) in the system + match nvml.device_by_index(0) { + Ok(device) => { + println!("NVIDIA GPU"); + println!(" BRAND: {:?}", device.brand()); + println!(" VBIOS Version: {:?}", device.vbios_version()); + println!(" INFO ROM Ver: {:?}", device.info_rom_image_version()); + println!(" Memory Info: {:?}", device.memory_info()); + } + Err(err) => debug!("Nvidia, device not foun: {:?}", err), + } + } + Err(err) => debug!("Nvidia, library init: {:?}", err), + } } fn print_esrt() { From e11f4f1ec92c399ef542fd1794e5790be3baad01 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Tue, 3 Jun 2025 09:48:29 +0800 Subject: [PATCH 2/6] nvidia: Print more information ``` > sudo framwork_tool --versions [...] NVIDIA GPU Name: NVIDIA GeForce RTX ???? Laptop GPU Architecture: Ok(Blackwell) VBIOS Version: ??.??.??.??.?? INFO ROM Ver: ????.????.??.?? PCI Info: Ok(PciInfo { bus: ??, bus_id: "00000000:??:00.0", device: 0, domain: 0, pci_device_id: ????????, pci_sub_system_id: Some(?????) }) Performance State:Ok(Eight) Pwr Mgmt Limit Df:Ok(100000)mW Pwr Mgmt Limit: Err(NotSupported)mW Pwr Mgmt Limit Cs:Ok(PowerManagementConstraints { min_limit: 5000, max_limit: 100000 }) Pwr Usage: Ok(5170)mW Total Energy: Ok(19002601)mJ Serialnum: Ok("0") Throttle Reason: Ok(ThrottleReasons(SW_POWER_CAP)) Temperature: Ok(45)C Util Rate: Ok(Utilization { gpu: 0, memory: 0 }) Memory Info: Ok(MemoryInfo { free: 8078753792, reserved: 455278592, total: 8546942976, used: 12910592, version: 33554472 }) Part Number: Ok("") Board ID: Ok(49664) Num Fans: Ok(0) Display Active?: Ok(false) Display Conn?: Ok(false) [...] ``` Signed-off-by: Daniel Schaefer --- framework_lib/src/commandline/mod.rs | 70 ++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 5 deletions(-) diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index 025b8e8a..dc56b328 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -72,6 +72,9 @@ use sha2::{Digest, Sha256, Sha384, Sha512}; //use smbioslib::*; use smbioslib::{DefinedStruct, SMBiosInformation}; +#[cfg(any(target_os = "linux", target_os = "windows"))] +use nvml_wrapper::{enum_wrappers::device::TemperatureSensor, Nvml}; + use crate::chromium_ec::{CrosEc, CrosEcDriverType, HardwareDeviceType}; #[cfg(feature = "uefi")] @@ -357,6 +360,8 @@ fn print_pd_details(ec: &CrosEc) { #[cfg(feature = "hidapi")] const NOT_SET: &str = "NOT SET"; +const UNKNOWN: &str = "Unknown"; + #[cfg(feature = "rusb")] fn print_audio_card_details() { check_synaptics_fw_version(); @@ -758,16 +763,71 @@ fn print_versions(ec: &CrosEc) { } #[cfg(any(target_os = "linux", target_os = "windows"))] - match nvml_wrapper::Nvml::init() { + print_nvidia_details(); +} + +#[cfg(any(target_os = "linux", target_os = "windows"))] +fn print_nvidia_details() { + match Nvml::init() { Ok(nvml) => { // Get the first `Device` (GPU) in the system match nvml.device_by_index(0) { Ok(device) => { println!("NVIDIA GPU"); - println!(" BRAND: {:?}", device.brand()); - println!(" VBIOS Version: {:?}", device.vbios_version()); - println!(" INFO ROM Ver: {:?}", device.info_rom_image_version()); - println!(" Memory Info: {:?}", device.memory_info()); + // GeForce + info!(" BRAND: {:?}", device.brand()); + println!( + " Name: {}", + device.name().unwrap_or(UNKNOWN.to_string()) + ); + println!(" Architecture: {:?}", device.architecture()); + println!( + " VBIOS Version: {}", + device.vbios_version().unwrap_or(UNKNOWN.to_string()) + ); + println!( + " INFO ROM Ver: {}", + device + .info_rom_image_version() + .unwrap_or(UNKNOWN.to_string()) + ); + println!(" PCI Info: {:X?}", device.pci_info()); + println!(" Performance State:{:?}", device.performance_state()); + println!( + " Pwr Mgmt Limit Df:{:?}mW", + device.power_management_limit_default() + ); + println!( + " Pwr Mgmt Limit: {:?}mW", + device.power_management_limit() + ); + println!( + " Pwr Mgmt Limit Cs:{:?}", + device.power_management_limit_constraints() + ); + println!(" Pwr Usage: {:?}mW", device.power_usage()); + println!( + " Total Energy: {:?}mJ", + device.total_energy_consumption() + ); + // 0 right now + println!(" Serialnum: {:?}", device.serial()); + println!( + " Throttle Reason: {:?}", + device.current_throttle_reasons() + ); + println!( + " Temperature: {:?}C", + device.temperature(TemperatureSensor::Gpu) + ); + //println!(" Temperature Thres:{:?}C", device.temperature_threshold()); + println!(" Util Rate: {:?}", device.utilization_rates()); + println!(" Memory Info: {:?}", device.memory_info()); + println!(" Part Number: {:?}", device.board_part_number()); + println!(" Board ID: {:?}", device.board_id()); + println!(" Num Fans: {:?}", device.num_fans()); + println!(" Display Active?: {:?}", device.is_display_active()); + println!(" Display Conn?: {:?}", device.is_display_connected()); } Err(err) => debug!("Nvidia, device not foun: {:?}", err), } From ef68bbc31481df42c7a4994a87fb2f1289b5d41f Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Tue, 3 Jun 2025 09:57:14 +0800 Subject: [PATCH 3/6] nvidia: Refactor Signed-off-by: Daniel Schaefer --- framework_lib/src/commandline/mod.rs | 135 ++++++++++++++------------- 1 file changed, 70 insertions(+), 65 deletions(-) diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index dc56b328..f6a373c5 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -768,72 +768,77 @@ fn print_versions(ec: &CrosEc) { #[cfg(any(target_os = "linux", target_os = "windows"))] fn print_nvidia_details() { - match Nvml::init() { - Ok(nvml) => { - // Get the first `Device` (GPU) in the system - match nvml.device_by_index(0) { - Ok(device) => { - println!("NVIDIA GPU"); - // GeForce - info!(" BRAND: {:?}", device.brand()); - println!( - " Name: {}", - device.name().unwrap_or(UNKNOWN.to_string()) - ); - println!(" Architecture: {:?}", device.architecture()); - println!( - " VBIOS Version: {}", - device.vbios_version().unwrap_or(UNKNOWN.to_string()) - ); - println!( - " INFO ROM Ver: {}", - device - .info_rom_image_version() - .unwrap_or(UNKNOWN.to_string()) - ); - println!(" PCI Info: {:X?}", device.pci_info()); - println!(" Performance State:{:?}", device.performance_state()); - println!( - " Pwr Mgmt Limit Df:{:?}mW", - device.power_management_limit_default() - ); - println!( - " Pwr Mgmt Limit: {:?}mW", - device.power_management_limit() - ); - println!( - " Pwr Mgmt Limit Cs:{:?}", - device.power_management_limit_constraints() - ); - println!(" Pwr Usage: {:?}mW", device.power_usage()); - println!( - " Total Energy: {:?}mJ", - device.total_energy_consumption() - ); - // 0 right now - println!(" Serialnum: {:?}", device.serial()); - println!( - " Throttle Reason: {:?}", - device.current_throttle_reasons() - ); - println!( - " Temperature: {:?}C", - device.temperature(TemperatureSensor::Gpu) - ); - //println!(" Temperature Thres:{:?}C", device.temperature_threshold()); - println!(" Util Rate: {:?}", device.utilization_rates()); - println!(" Memory Info: {:?}", device.memory_info()); - println!(" Part Number: {:?}", device.board_part_number()); - println!(" Board ID: {:?}", device.board_id()); - println!(" Num Fans: {:?}", device.num_fans()); - println!(" Display Active?: {:?}", device.is_display_active()); - println!(" Display Conn?: {:?}", device.is_display_connected()); - } - Err(err) => debug!("Nvidia, device not foun: {:?}", err), - } + let nvml = match Nvml::init() { + Ok(nvml) => nvml, + Err(err) => { + debug!("Nvidia, library init fail: {:?}", err); + return; } - Err(err) => debug!("Nvidia, library init: {:?}", err), - } + }; + // Get the first `Device` (GPU) in the system + let device = match nvml.device_by_index(0) { + Ok(device) => device, + Err(err) => { + debug!("Nvidia, device not found: {:?}", err); + return; + } + }; + + println!("NVIDIA GPU"); + // GeForce + info!(" BRAND: {:?}", device.brand()); + println!( + " Name: {}", + device.name().unwrap_or(UNKNOWN.to_string()) + ); + println!(" Architecture: {:?}", device.architecture()); + println!( + " VBIOS Version: {}", + device.vbios_version().unwrap_or(UNKNOWN.to_string()) + ); + println!( + " INFO ROM Ver: {}", + device + .info_rom_image_version() + .unwrap_or(UNKNOWN.to_string()) + ); + println!(" PCI Info: {:X?}", device.pci_info()); + println!(" Performance State:{:?}", device.performance_state()); + println!( + " Pwr Mgmt Limit Df:{:?}mW", + device.power_management_limit_default() + ); + println!( + " Pwr Mgmt Limit: {:?}mW", + device.power_management_limit() + ); + println!( + " Pwr Mgmt Limit Cs:{:?}", + device.power_management_limit_constraints() + ); + println!(" Pwr Usage: {:?}mW", device.power_usage()); + println!( + " Total Energy: {:?}mJ", + device.total_energy_consumption() + ); + // 0 right now + println!(" Serialnum: {:?}", device.serial()); + println!( + " Throttle Reason: {:?}", + device.current_throttle_reasons() + ); + println!( + " Temperature: {:?}C", + device.temperature(TemperatureSensor::Gpu) + ); + //println!(" Temperature Thres:{:?}C", device.temperature_threshold()); + println!(" Util Rate: {:?}", device.utilization_rates()); + println!(" Memory Info: {:?}", device.memory_info()); + println!(" Part Number: {:?}", device.board_part_number()); + println!(" Board ID: {:?}", device.board_id()); + println!(" Num Fans: {:?}", device.num_fans()); + println!(" Display Active?: {:?}", device.is_display_active()); + println!(" Display Conn?: {:?}", device.is_display_connected()); } fn print_esrt() { From 69d1380bf9f9f3f9bdf7fcbf7ae4f408172c599e Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Tue, 3 Jun 2025 14:42:17 +0800 Subject: [PATCH 4/6] nvidia: Add comments Run with: cargo build && sudo LD_LIBRARY_PATH=/nix/store/rz59zs1282j3c1779v6gfma9fkxa0j2h-nvidia-x11-570.153.02-6.14.8/lib/ ./target/debug/framework_tool --versions Signed-off-by: Daniel Schaefer --- framework_lib/src/commandline/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index f6a373c5..d2990a38 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -808,6 +808,7 @@ fn print_nvidia_details() { " Pwr Mgmt Limit Df:{:?}mW", device.power_management_limit_default() ); + // NotSupported println!( " Pwr Mgmt Limit: {:?}mW", device.power_management_limit() @@ -821,7 +822,7 @@ fn print_nvidia_details() { " Total Energy: {:?}mJ", device.total_energy_consumption() ); - // 0 right now + // 0/NotSupported right now println!(" Serialnum: {:?}", device.serial()); println!( " Throttle Reason: {:?}", @@ -834,9 +835,12 @@ fn print_nvidia_details() { //println!(" Temperature Thres:{:?}C", device.temperature_threshold()); println!(" Util Rate: {:?}", device.utilization_rates()); println!(" Memory Info: {:?}", device.memory_info()); + // Not supported println!(" Part Number: {:?}", device.board_part_number()); println!(" Board ID: {:?}", device.board_id()); + // 0 println!(" Num Fans: {:?}", device.num_fans()); + // Works println!(" Display Active?: {:?}", device.is_display_active()); println!(" Display Conn?: {:?}", device.is_display_connected()); } From 9a5e8c45d6599b7f889a79279ad159126582fb36 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Fri, 19 Sep 2025 12:58:01 +0800 Subject: [PATCH 5/6] link to nvidia lib only if nvidia feature it's proprietary, many distributions won't ship it by default. And almost all of our systems don't use nvidia Signed-off-by: Daniel Schaefer --- framework_lib/Cargo.toml | 5 +++-- framework_lib/src/commandline/mod.rs | 14 ++++++-------- framework_tool/Cargo.toml | 1 + 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/framework_lib/Cargo.toml b/framework_lib/Cargo.toml index a1abfef3..4213b22c 100644 --- a/framework_lib/Cargo.toml +++ b/framework_lib/Cargo.toml @@ -18,6 +18,7 @@ readonly = [ ] rusb = ["dep:rusb"] hidapi = ["dep:hidapi"] uefi = [ "lazy_static/spin_no_std" ] +nvidia = ["dep:nvml-wrapper"] [build-dependencies] built = { version = "0.5", features = ["chrono", "git2"] } @@ -52,7 +53,7 @@ clap-num = { version = "1.2.0" } clap-verbosity-flag = { version = "2.2.1" } windows-version = "0.1.4" winreg = "0.55.0" -nvml-wrapper = "0.11.0" +nvml-wrapper = { version = "0.11.0", optional = true } [target.'cfg(unix)'.dependencies] libc = "0.2.155" @@ -63,7 +64,7 @@ env_logger = "0.11" clap = { version = "4.5", features = ["derive", "cargo"] } clap-num = { version = "1.2.0" } clap-verbosity-flag = { version = "2.2.1" } -nvml-wrapper = "0.11.0" +nvml-wrapper = { version = "0.11.0", optional = true } [target.'cfg(windows)'.dependencies.windows] version = "0.59.0" diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index d2990a38..1f6ab50b 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -72,7 +72,7 @@ use sha2::{Digest, Sha256, Sha384, Sha512}; //use smbioslib::*; use smbioslib::{DefinedStruct, SMBiosInformation}; -#[cfg(any(target_os = "linux", target_os = "windows"))] +#[cfg(feature = "nvidia")] use nvml_wrapper::{enum_wrappers::device::TemperatureSensor, Nvml}; use crate::chromium_ec::{CrosEc, CrosEcDriverType, HardwareDeviceType}; @@ -360,8 +360,6 @@ fn print_pd_details(ec: &CrosEc) { #[cfg(feature = "hidapi")] const NOT_SET: &str = "NOT SET"; -const UNKNOWN: &str = "Unknown"; - #[cfg(feature = "rusb")] fn print_audio_card_details() { check_synaptics_fw_version(); @@ -762,11 +760,11 @@ fn print_versions(ec: &CrosEc) { } } - #[cfg(any(target_os = "linux", target_os = "windows"))] + #[cfg(feature = "nvidia")] print_nvidia_details(); } -#[cfg(any(target_os = "linux", target_os = "windows"))] +#[cfg(feature = "nvidia")] fn print_nvidia_details() { let nvml = match Nvml::init() { Ok(nvml) => nvml, @@ -789,18 +787,18 @@ fn print_nvidia_details() { info!(" BRAND: {:?}", device.brand()); println!( " Name: {}", - device.name().unwrap_or(UNKNOWN.to_string()) + device.name().unwrap_or("Unknown".to_string()) ); println!(" Architecture: {:?}", device.architecture()); println!( " VBIOS Version: {}", - device.vbios_version().unwrap_or(UNKNOWN.to_string()) + device.vbios_version().unwrap_or("Unknown".to_string()) ); println!( " INFO ROM Ver: {}", device .info_rom_image_version() - .unwrap_or(UNKNOWN.to_string()) + .unwrap_or("Unknown".to_string()) ); println!(" PCI Info: {:X?}", device.pci_info()); println!(" Performance State:{:?}", device.performance_state()); diff --git a/framework_tool/Cargo.toml b/framework_tool/Cargo.toml index 6dceeabb..27c3c034 100644 --- a/framework_tool/Cargo.toml +++ b/framework_tool/Cargo.toml @@ -15,6 +15,7 @@ path = "src/main.rs" [features] default = [ ] readonly = [ "framework_lib/readonly" ] +nvidia = [ "framework_lib/nvidia" ] [dependencies.framework_lib] path = "../framework_lib" From 8ad4389af6cef4f7443c85ce637ae974e985350b Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Sun, 19 Oct 2025 14:41:45 +0800 Subject: [PATCH 6/6] gh-actions: Build release builds with nvidia library Signed-off-by: Daniel Schaefer --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 32037c69..20cb7692 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,7 +66,7 @@ jobs: path: target/debug/framework_tool - name: Build Linux tool (Release) - run: cargo build -p framework_tool --release + run: cargo build -p framework_tool --release --features nvidia - name: Upload Linux App uses: actions/upload-artifact@v4 @@ -134,7 +134,7 @@ jobs: - name: Build Windows tool run: | cargo build -p framework_tool - cargo build -p framework_tool --release + cargo build -p framework_tool --release --features nvidia - name: Check if Windows tool can start run: cargo run -- --help --release