From 55e127a8993e76a3a01a073e13d1a34e765dfa68 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Tue, 3 Jun 2025 17:04:48 +0800 Subject: [PATCH 1/4] Add support for directly querying 3 PDs ``` > framework_tool --versions [...] PD Controllers PD 0: 0.0.0C (MainFw) PD 1: 0.0.0C (MainFw) PD 2: 0.0.0C (MainFw) [...] ``` Signed-off-by: Daniel Schaefer --- framework_lib/src/commandline/mod.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index ce7071ed..793182d8 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -474,6 +474,27 @@ fn print_versions(ec: &CrosEc) { left.main_fw.app, left.active_fw ); } + } else if let Ok(PdVersions::Many(versions)) = ccgx_pd_vers { + for (i, version) in versions.into_iter().enumerate() { + if version.main_fw.app != version.backup_fw.app { + println!(" PD {}", 1); + println!( + " Main: {}{}", + version.main_fw.app, + active_mode(&version.active_fw, FwMode::MainFw) + ); + println!( + " Backup: {}{}", + version.backup_fw.app, + active_mode(&version.active_fw, FwMode::BackupFw) + ); + } else { + println!( + " PD {}: {} ({:?})", + i, version.main_fw.app, version.active_fw + ); + } + } } else if let Ok(PdVersions::Single(pd)) = ccgx_pd_vers { if pd.main_fw.app != pd.backup_fw.app { println!( From 28be5a2573a4c3e4d36d2e04a79356f889fa5771 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Tue, 3 Jun 2025 17:08:09 +0800 Subject: [PATCH 2/4] Framework16Amd7080: Add support for 3rd PD Signed-off-by: Daniel Schaefer --- framework_lib/src/ccgx/device.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework_lib/src/ccgx/device.rs b/framework_lib/src/ccgx/device.rs index 7cdd6839..c22bf30e 100644 --- a/framework_lib/src/ccgx/device.rs +++ b/framework_lib/src/ccgx/device.rs @@ -54,6 +54,7 @@ impl PdPort { | Platform::Framework16Amd7080, PdPort::Right23, ) => 0x40, + (Platform::Framework16Amd7080, PdPort::Back) => 0x42, (Platform::FrameworkDesktopAmdAiMax300, PdPort::Back) => 0x08, (Platform::FrameworkDesktopAmdAiMax300, _) => unsupported?, // Framework Intel Platforms (CCG5 and CCG6) @@ -111,6 +112,7 @@ impl PdPort { | Platform::Framework12IntelGen13, PdPort::Right23, ) => 2, + (Platform::Framework16Amd7080, PdPort::Back) => 5, (Platform::FrameworkDesktopAmdAiMax300, PdPort::Back) => 1, (Platform::FrameworkDesktopAmdAiMax300, _) => unsupported?, (Platform::UnknownSystem, _) => { From c8494e4a779aa250d87a9c929c5b3451407cdb15 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Tue, 3 Jun 2025 17:16:38 +0800 Subject: [PATCH 3/4] Allow --pd-ports and --pd-addrs to accept 3 ports If the platforms has only 2 or 1, pass same arguments. Signed-off-by: Daniel Schaefer --- framework_lib/src/ccgx/device.rs | 10 +++++---- framework_lib/src/commandline/clap_std.rs | 8 +++---- framework_lib/src/commandline/mod.rs | 4 ++-- framework_lib/src/commandline/uefi.rs | 26 +++++++++++++---------- framework_lib/src/smbios.rs | 4 ++-- framework_lib/src/util.rs | 2 +- 6 files changed, 30 insertions(+), 24 deletions(-) diff --git a/framework_lib/src/ccgx/device.rs b/framework_lib/src/ccgx/device.rs index c22bf30e..ed55c8ee 100644 --- a/framework_lib/src/ccgx/device.rs +++ b/framework_lib/src/ccgx/device.rs @@ -39,8 +39,9 @@ impl PdPort { )); Ok(match (platform, self) { - (Platform::GenericFramework((left, _), _), PdPort::Left01) => *left, - (Platform::GenericFramework((_, right), _), PdPort::Right23) => *right, + (Platform::GenericFramework((left, _, _), _), PdPort::Left01) => *left, + (Platform::GenericFramework((_, right, _), _), PdPort::Right23) => *right, + (Platform::GenericFramework((_, _, back), _), PdPort::Back) => *back, // Framework AMD Platforms (CCG8) ( Platform::Framework13Amd7080 @@ -91,8 +92,9 @@ impl PdPort { ))); Ok(match (platform, self) { - (Platform::GenericFramework(_, (left, _)), PdPort::Left01) => *left, - (Platform::GenericFramework(_, (_, right)), PdPort::Right23) => *right, + (Platform::GenericFramework(_, (left, _, _)), PdPort::Left01) => *left, + (Platform::GenericFramework(_, (_, right, _)), PdPort::Right23) => *right, + (Platform::GenericFramework(_, (_, _, back)), PdPort::Back) => *back, (Platform::IntelGen11, _) => 6, (Platform::IntelGen12 | Platform::IntelGen13, PdPort::Left01) => 6, (Platform::IntelGen12 | Platform::IntelGen13, PdPort::Right23) => 7, diff --git a/framework_lib/src/commandline/clap_std.rs b/framework_lib/src/commandline/clap_std.rs index 2796057d..8203e7c9 100644 --- a/framework_lib/src/commandline/clap_std.rs +++ b/framework_lib/src/commandline/clap_std.rs @@ -238,12 +238,12 @@ struct ClapCli { driver: Option, /// Specify I2C addresses of the PD chips (Advanced) - #[clap(number_of_values = 2, requires("pd_ports"))] + #[clap(number_of_values = 3, requires("pd_ports"))] #[arg(long)] pd_addrs: Vec, /// Specify I2C ports of the PD chips (Advanced) - #[clap(number_of_values = 2, requires("pd_addrs"))] + #[clap(number_of_values = 3, requires("pd_addrs"))] #[arg(long)] pd_ports: Vec, @@ -317,13 +317,13 @@ pub fn parse(args: &[String]) -> Cli { .unwrap(); let pd_addrs = match args.pd_addrs.len() { - 2 => Some((args.pd_addrs[0], args.pd_addrs[1])), + 3 => Some((args.pd_addrs[0], args.pd_addrs[1], args.pd_addrs[2])), 0 => None, // Checked by clap _ => unreachable!(), }; let pd_ports = match args.pd_ports.len() { - 2 => Some((args.pd_ports[0], args.pd_ports[1])), + 3 => Some((args.pd_ports[0], args.pd_ports[1], args.pd_ports[2])), 0 => None, // Checked by clap _ => unreachable!(), diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index 793182d8..cc7283bb 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -193,8 +193,8 @@ pub struct Cli { pub reboot_ec: Option, pub ec_hib_delay: Option>, pub hash: Option, - pub pd_addrs: Option<(u16, u16)>, - pub pd_ports: Option<(u8, u8)>, + pub pd_addrs: Option<(u16, u16, u16)>, + pub pd_ports: Option<(u8, u8, u8)>, pub help: bool, pub info: bool, pub flash_gpu_descriptor: Option<(u8, String)>, diff --git a/framework_lib/src/commandline/uefi.rs b/framework_lib/src/commandline/uefi.rs index 09a43399..98c27152 100644 --- a/framework_lib/src/commandline/uefi.rs +++ b/framework_lib/src/commandline/uefi.rs @@ -602,35 +602,39 @@ pub fn parse(args: &[String]) -> Cli { }; found_an_option = true; } else if arg == "--pd-addrs" { - cli.pd_addrs = if args.len() > i + 2 { + cli.pd_addrs = if args.len() > i + 3 { let left = args[i + 1].parse::(); let right = args[i + 2].parse::(); - if left.is_ok() && right.is_ok() { - Some((left.unwrap(), right.unwrap())) + let back = args[i + 3].parse::(); + if left.is_ok() && right.is_ok() && back.is_ok() { + Some((left.unwrap(), right.unwrap(), back.unwrap())) } else { println!( - "Invalid values for --pd-addrs: '{} {}'. Must be u16 integers.", + "Invalid values for --pd-addrs: '{} {} {}'. Must be u16 integers.", args[i + 1], - args[i + 2] + args[i + 2], + args[i + 3] ); None } } else { - println!("--pd-addrs requires two arguments, one for each address"); + println!("--pd-addrs requires three arguments, one for each address"); None }; found_an_option = true; } else if arg == "--pd-ports" { - cli.pd_ports = if args.len() > i + 2 { + cli.pd_ports = if args.len() > i + 3 { let left = args[i + 1].parse::(); let right = args[i + 2].parse::(); - if left.is_ok() && right.is_ok() { - Some((left.unwrap(), right.unwrap())) + let back = args[i + 3].parse::(); + if left.is_ok() && right.is_ok() && back.is_ok() { + Some((left.unwrap(), right.unwrap(), back.unwrap())) } else { println!( - "Invalid values for --pd-ports: '{} {}'. Must be u16 integers.", + "Invalid values for --pd-ports: '{} {} {}'. Must be u16 integers.", args[i + 1], - args[i + 2] + args[i + 2], + args[i + 3] ); None } diff --git a/framework_lib/src/smbios.rs b/framework_lib/src/smbios.rs index 935f0dc7..144ad210 100644 --- a/framework_lib/src/smbios.rs +++ b/framework_lib/src/smbios.rs @@ -47,7 +47,7 @@ pub enum ConfigDigit0 { pub fn is_framework() -> bool { if matches!( get_platform(), - Some(Platform::GenericFramework((_, _), (_, _))) | Some(Platform::UnknownSystem) + Some(Platform::GenericFramework((_, _, _), (_, _, _))) | Some(Platform::UnknownSystem) ) { return true; } @@ -292,7 +292,7 @@ pub fn get_platform() -> Option { let platform = &(*config).as_ref().unwrap().platform; if matches!( platform, - Platform::GenericFramework((_, _), (_, _)) | Platform::UnknownSystem + Platform::GenericFramework((_, _, _), (_, _, _)) | Platform::UnknownSystem ) { return Some(*platform); } diff --git a/framework_lib/src/util.rs b/framework_lib/src/util.rs index 69bdbd32..1716ed65 100644 --- a/framework_lib/src/util.rs +++ b/framework_lib/src/util.rs @@ -37,7 +37,7 @@ pub enum Platform { FrameworkDesktopAmdAiMax300, /// Generic Framework device /// pd_addrs, pd_ports - GenericFramework((u16, u16), (u8, u8)), + GenericFramework((u16, u16, u16), (u8, u8, u8)), UnknownSystem, } From 26d6eca2d0d6ed86a79b41ceb1454e4b1d4f4d28 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 4 Jun 2025 18:49:29 +0800 Subject: [PATCH 4/4] --pd-info: Print 3rd pd info ``` > framework_tool --pd-info [...] Back Silicon ID: 0x???? Mode: MainFw Flash Row Size: 256 B Bootloader Version: Base: 3.6.0.009, App: 0.0.01 FW1 (Backup) Version: Base: 3.7.0.197, App: 0.0.0D FW2 (Main) Version: Base: 3.7.0.197, App: 0.0.0D ``` Signed-off-by: Daniel Schaefer --- framework_lib/src/commandline/mod.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index cc7283bb..9df8ae37 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -234,11 +234,14 @@ fn print_pd_details(ec: &CrosEc) { } let pd_01 = PdController::new(PdPort::Left01, ec.clone()); let pd_23 = PdController::new(PdPort::Right23, ec.clone()); + let pd_back = PdController::new(PdPort::Back, ec.clone()); println!("Left / Ports 01"); print_single_pd_details(&pd_01); println!("Right / Ports 23"); print_single_pd_details(&pd_23); + println!("Back"); + print_single_pd_details(&pd_back); } #[cfg(feature = "hidapi")]