Skip to content

Add support for dynamic number of PDs #166

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions framework_lib/src/ccgx/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -54,6 +55,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)
Expand Down Expand Up @@ -90,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,
Expand All @@ -111,6 +114,7 @@ impl PdPort {
| Platform::Framework12IntelGen13,
PdPort::Right23,
) => 2,
(Platform::Framework16Amd7080, PdPort::Back) => 5,
(Platform::FrameworkDesktopAmdAiMax300, PdPort::Back) => 1,
(Platform::FrameworkDesktopAmdAiMax300, _) => unsupported?,
(Platform::UnknownSystem, _) => {
Expand Down
8 changes: 4 additions & 4 deletions framework_lib/src/commandline/clap_std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,12 +238,12 @@ struct ClapCli {
driver: Option<CrosEcDriverType>,

/// 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<u16>,

/// 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<u8>,

Expand Down Expand Up @@ -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!(),
Expand Down
28 changes: 26 additions & 2 deletions framework_lib/src/commandline/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,8 @@ pub struct Cli {
pub reboot_ec: Option<RebootEcArg>,
pub ec_hib_delay: Option<Option<u32>>,
pub hash: Option<String>,
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)>,
Expand Down Expand Up @@ -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")]
Expand Down Expand Up @@ -474,6 +477,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!(
Expand Down
26 changes: 15 additions & 11 deletions framework_lib/src/commandline/uefi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::<u16>();
let right = args[i + 2].parse::<u16>();
if left.is_ok() && right.is_ok() {
Some((left.unwrap(), right.unwrap()))
let back = args[i + 3].parse::<u16>();
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::<u8>();
let right = args[i + 2].parse::<u8>();
if left.is_ok() && right.is_ok() {
Some((left.unwrap(), right.unwrap()))
let back = args[i + 3].parse::<u8>();
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
}
Expand Down
4 changes: 2 additions & 2 deletions framework_lib/src/smbios.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -292,7 +292,7 @@ pub fn get_platform() -> Option<Platform> {
let platform = &(*config).as_ref().unwrap().platform;
if matches!(
platform,
Platform::GenericFramework((_, _), (_, _)) | Platform::UnknownSystem
Platform::GenericFramework((_, _, _), (_, _, _)) | Platform::UnknownSystem
) {
return Some(*platform);
}
Expand Down
2 changes: 1 addition & 1 deletion framework_lib/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}

Expand Down
Loading