Skip to content

Correctly identify right and left PD controllers #170

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 1 commit 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
4 changes: 2 additions & 2 deletions EXAMPLES_ADVANCED.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ Example on Framework 13 AMD Ryzen AI 300

```
> sudo framework_tool.exe --pd-info
Left / Ports 01
Right / Ports 01
Silicon ID: 0x3580
Mode: MainFw
Flash Row Size: 256 B
Ports Enabled: 0, 1
Bootloader Version: Base: 3.6.0.009, App: 0.0.01
FW1 (Backup) Version: Base: 3.7.0.197, App: 0.0.0B
FW2 (Main) Version: Base: 3.7.0.197, App: 0.0.0B
Right / Ports 23
Left / Ports 23
Silicon ID: 0x3580
Mode: MainFw
Flash Row Size: 256 B
Expand Down
28 changes: 14 additions & 14 deletions framework_lib/src/ccgx/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ enum ControlRegisters {

#[derive(Debug, PartialEq, Clone, Copy)]
pub enum PdPort {
Left01,
Right23,
Right01,
Left23,
Back,
}

Expand All @@ -58,21 +58,21 @@ impl PdPort {
));

Ok(match (platform, self) {
(Platform::GenericFramework((left, _, _), _), PdPort::Left01) => *left,
(Platform::GenericFramework((_, right, _), _), PdPort::Right23) => *right,
(Platform::GenericFramework((left, _, _), _), PdPort::Right01) => *left,
(Platform::GenericFramework((_, right, _), _), PdPort::Left23) => *right,
(Platform::GenericFramework((_, _, back), _), PdPort::Back) => *back,
// Framework AMD Platforms (CCG8)
(
Platform::Framework13Amd7080
| Platform::Framework13AmdAi300
| Platform::Framework16Amd7080,
PdPort::Left01,
PdPort::Right01,
) => 0x42,
(
Platform::Framework13Amd7080
| Platform::Framework13AmdAi300
| Platform::Framework16Amd7080,
PdPort::Right23,
PdPort::Left23,
) => 0x40,
(Platform::Framework16Amd7080, PdPort::Back) => 0x42,
(Platform::FrameworkDesktopAmdAiMax300, PdPort::Back) => 0x08,
Expand All @@ -84,15 +84,15 @@ impl PdPort {
| Platform::IntelGen12
| Platform::IntelGen13
| Platform::IntelCoreUltra1,
PdPort::Left01,
PdPort::Right01,
) => 0x08,
(
Platform::Framework12IntelGen13
| Platform::IntelGen11
| Platform::IntelGen12
| Platform::IntelGen13
| Platform::IntelCoreUltra1,
PdPort::Right23,
PdPort::Left23,
) => 0x40,
(Platform::UnknownSystem, _) => {
Err(EcError::DeviceError("Unsupported platform".to_string()))?
Expand All @@ -111,27 +111,27 @@ impl PdPort {
)));

Ok(match (platform, self) {
(Platform::GenericFramework(_, (left, _, _)), PdPort::Left01) => *left,
(Platform::GenericFramework(_, (_, right, _)), PdPort::Right23) => *right,
(Platform::GenericFramework(_, (left, _, _)), PdPort::Right01) => *left,
(Platform::GenericFramework(_, (_, right, _)), PdPort::Left23) => *right,
(Platform::GenericFramework(_, (_, _, back)), PdPort::Back) => *back,
(Platform::IntelGen11, _) => 6,
(Platform::IntelGen12 | Platform::IntelGen13, PdPort::Left01) => 6,
(Platform::IntelGen12 | Platform::IntelGen13, PdPort::Right23) => 7,
(Platform::IntelGen12 | Platform::IntelGen13, PdPort::Right01) => 6,
(Platform::IntelGen12 | Platform::IntelGen13, PdPort::Left23) => 7,
(
Platform::Framework13Amd7080
| Platform::Framework16Amd7080
| Platform::IntelCoreUltra1
| Platform::Framework13AmdAi300
| Platform::Framework12IntelGen13,
PdPort::Left01,
PdPort::Right01,
) => 1,
(
Platform::Framework13Amd7080
| Platform::Framework16Amd7080
| Platform::IntelCoreUltra1
| Platform::Framework13AmdAi300
| Platform::Framework12IntelGen13,
PdPort::Right23,
PdPort::Left23,
) => 2,
(Platform::Framework16Amd7080, PdPort::Back) => 5,
(Platform::FrameworkDesktopAmdAiMax300, PdPort::Back) => 1,
Expand Down
4 changes: 2 additions & 2 deletions framework_lib/src/ccgx/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -252,8 +252,8 @@ pub enum MainPdVersions {
}

pub fn get_pd_controller_versions(ec: &CrosEc) -> EcResult<PdVersions> {
let pd01 = PdController::new(PdPort::Left01, ec.clone()).get_fw_versions();
let pd23 = PdController::new(PdPort::Right23, ec.clone()).get_fw_versions();
let pd01 = PdController::new(PdPort::Right01, ec.clone()).get_fw_versions();
let pd23 = PdController::new(PdPort::Left23, ec.clone()).get_fw_versions();
let pd_back = PdController::new(PdPort::Back, ec.clone()).get_fw_versions();

match (pd01, pd23, pd_back) {
Expand Down
40 changes: 20 additions & 20 deletions framework_lib/src/commandline/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,13 +247,13 @@ fn print_pd_details(ec: &CrosEc) {
println!("Only supported on Framework systems");
return;
}
let pd_01 = PdController::new(PdPort::Left01, ec.clone());
let pd_23 = PdController::new(PdPort::Right23, ec.clone());
let pd_01 = PdController::new(PdPort::Right01, ec.clone());
let pd_23 = PdController::new(PdPort::Left23, ec.clone());
let pd_back = PdController::new(PdPort::Back, ec.clone());

println!("Left / Ports 01");
println!("Right / Ports 01");
print_single_pd_details(&pd_01);
println!("Right / Ports 23");
println!("Left / Ports 23");
print_single_pd_details(&pd_23);
println!("Back");
print_single_pd_details(&pd_back);
Expand Down Expand Up @@ -570,13 +570,13 @@ fn print_versions(ec: &CrosEc) {
| esrt::ADL_RETIMER01_GUID
| esrt::RPL_RETIMER01_GUID
| esrt::MTL_RETIMER01_GUID => {
left_retimer = Some(entry.fw_version);
right_retimer = Some(entry.fw_version);
}
esrt::TGL_RETIMER23_GUID
| esrt::ADL_RETIMER23_GUID
| esrt::RPL_RETIMER23_GUID
| esrt::MTL_RETIMER23_GUID => {
right_retimer = Some(entry.fw_version);
left_retimer = Some(entry.fw_version);
}
_ => {}
}
Expand Down Expand Up @@ -1017,8 +1017,8 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 {
} else if let Some(pd) = args.pd_reset {
println!("Resetting PD {}...", pd);
print_err(match pd {
0 => PdController::new(PdPort::Left01, ec.clone()).reset_device(),
1 => PdController::new(PdPort::Right23, ec.clone()).reset_device(),
0 => PdController::new(PdPort::Right01, ec.clone()).reset_device(),
1 => PdController::new(PdPort::Left23, ec.clone()).reset_device(),
2 => PdController::new(PdPort::Back, ec.clone()).reset_device(),
_ => {
error!("PD {} does not exist", pd);
Expand All @@ -1028,8 +1028,8 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 {
} else if let Some(pd) = args.pd_disable {
println!("Disabling PD {}...", pd);
print_err(match pd {
0 => PdController::new(PdPort::Left01, ec.clone()).enable_ports(false),
1 => PdController::new(PdPort::Right23, ec.clone()).enable_ports(false),
0 => PdController::new(PdPort::Right01, ec.clone()).enable_ports(false),
1 => PdController::new(PdPort::Left23, ec.clone()).enable_ports(false),
2 => PdController::new(PdPort::Back, ec.clone()).enable_ports(false),
_ => {
error!("PD {} does not exist", pd);
Expand All @@ -1039,8 +1039,8 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 {
} else if let Some(pd) = args.pd_enable {
println!("Enabling PD {}...", pd);
print_err(match pd {
0 => PdController::new(PdPort::Left01, ec.clone()).enable_ports(true),
1 => PdController::new(PdPort::Right23, ec.clone()).enable_ports(true),
0 => PdController::new(PdPort::Right01, ec.clone()).enable_ports(true),
1 => PdController::new(PdPort::Left23, ec.clone()).enable_ports(true),
2 => PdController::new(PdPort::Back, ec.clone()).enable_ports(true),
_ => {
error!("PD {} does not exist", pd);
Expand Down Expand Up @@ -1376,8 +1376,8 @@ fn selftest(ec: &CrosEc) -> Option<()> {
println!(" - OK");
}

let pd_01 = PdController::new(PdPort::Left01, ec.clone());
let pd_23 = PdController::new(PdPort::Right23, ec.clone());
let pd_01 = PdController::new(PdPort::Right01, ec.clone());
let pd_23 = PdController::new(PdPort::Left23, ec.clone());
print!(" Getting PD01 info through I2C tunnel");
print_err(pd_01.get_silicon_id())?;
print_err(pd_01.get_device_info())?;
Expand Down Expand Up @@ -1554,22 +1554,22 @@ pub fn analyze_capsule(data: &[u8]) -> Option<capsule::EfiCapsuleHeader> {
println!(" Type: Framework RPL Insyde BIOS");
}
esrt::TGL_RETIMER01_GUID => {
println!(" Type: Framework TGL Retimer01 (Left)");
println!(" Type: Framework TGL Retimer01 (Right)");
}
esrt::TGL_RETIMER23_GUID => {
println!(" Type: Framework TGL Retimer23 (Right)");
println!(" Type: Framework TGL Retimer23 (Left)");
}
esrt::ADL_RETIMER01_GUID => {
println!(" Type: Framework ADL Retimer01 (Left)");
println!(" Type: Framework ADL Retimer01 (Right)");
}
esrt::ADL_RETIMER23_GUID => {
println!(" Type: Framework ADL Retimer23 (Right)");
println!(" Type: Framework ADL Retimer23 (Left)");
}
esrt::RPL_RETIMER01_GUID => {
println!(" Type: Framework RPL Retimer01 (Left)");
println!(" Type: Framework RPL Retimer01 (Right)");
}
esrt::RPL_RETIMER23_GUID => {
println!(" Type: Framework RPL Retimer23 (Right)");
println!(" Type: Framework RPL Retimer23 (Left)");
}
esrt::WINUX_GUID => {
println!(" Type: Windows UX capsule");
Expand Down
Loading