Skip to content

Commit 3e0d595

Browse files
committed
--version: Properly fetch single PD controller ver from ccgx
For Framework Desktop. It has only a single PD controller. Signed-off-by: Daniel Schaefer <[email protected]>
1 parent ace46f9 commit 3e0d595

File tree

3 files changed

+70
-24
lines changed

3 files changed

+70
-24
lines changed

framework_lib/src/ccgx/device.rs

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,17 @@ enum ControlRegisters {
2626
pub enum PdPort {
2727
Left01,
2828
Right23,
29+
Back,
2930
}
3031

3132
impl PdPort {
3233
/// SMBUS/I2C Address
3334
fn i2c_address(&self) -> EcResult<u16> {
3435
let config = Config::get();
3536
let platform = &(*config).as_ref().unwrap().platform;
37+
let unsupported = Err(EcError::DeviceError(
38+
"Controller does not exist on this platform".to_string(),
39+
));
3640

3741
Ok(match (platform, self) {
3842
(Platform::GenericFramework((left, _), _), PdPort::Left01) => *left,
@@ -50,21 +54,40 @@ impl PdPort {
5054
| Platform::Framework16Amd7080,
5155
PdPort::Right23,
5256
) => 0x40,
53-
// TODO: It only has a single PD controller
54-
(Platform::FrameworkDesktopAmdAiMax300, _) => 0x08,
57+
(Platform::FrameworkDesktopAmdAiMax300, PdPort::Back) => 0x08,
58+
(Platform::FrameworkDesktopAmdAiMax300, _) => unsupported?,
59+
// Framework Intel Platforms (CCG5 and CCG6)
60+
(
61+
Platform::Framework12IntelGen13
62+
| Platform::IntelGen11
63+
| Platform::IntelGen12
64+
| Platform::IntelGen13
65+
| Platform::IntelCoreUltra1,
66+
PdPort::Left01,
67+
) => 0x08,
68+
(
69+
Platform::Framework12IntelGen13
70+
| Platform::IntelGen11
71+
| Platform::IntelGen12
72+
| Platform::IntelGen13
73+
| Platform::IntelCoreUltra1,
74+
PdPort::Right23,
75+
) => 0x40,
5576
(Platform::UnknownSystem, _) => {
5677
Err(EcError::DeviceError("Unsupported platform".to_string()))?
5778
}
58-
// Framework Intel Platforms (CCG5 and CCG6)
59-
(_, PdPort::Left01) => 0x08,
60-
(_, PdPort::Right23) => 0x40,
79+
(_, PdPort::Back) => unsupported?,
6180
})
6281
}
6382

6483
/// I2C port on the EC
6584
fn i2c_port(&self) -> EcResult<u8> {
6685
let config = Config::get();
6786
let platform = &(*config).as_ref().unwrap().platform;
87+
let unsupported = Err(EcError::DeviceError(format!(
88+
"Controller {:?}, does not exist on {:?}",
89+
self, platform
90+
)));
6891

6992
Ok(match (platform, self) {
7093
(Platform::GenericFramework(_, (left, _)), PdPort::Left01) => *left,
@@ -88,11 +111,12 @@ impl PdPort {
88111
| Platform::Framework12IntelGen13,
89112
PdPort::Right23,
90113
) => 2,
91-
// TODO: It only has a single PD controller
92-
(Platform::FrameworkDesktopAmdAiMax300, _) => 1,
114+
(Platform::FrameworkDesktopAmdAiMax300, PdPort::Back) => 1,
115+
(Platform::FrameworkDesktopAmdAiMax300, _) => unsupported?,
93116
(Platform::UnknownSystem, _) => {
94117
Err(EcError::DeviceError("Unsupported platform".to_string()))?
95118
}
119+
(_, PdPort::Back) => unsupported?,
96120
})
97121
}
98122
}

framework_lib/src/ccgx/mod.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use alloc::format;
44
use alloc::string::String;
55
use alloc::string::ToString;
6+
use alloc::vec;
67
use alloc::vec::Vec;
78
#[cfg(feature = "uefi")]
89
use core::prelude::rust_2021::derive;
@@ -235,9 +236,10 @@ impl ControllerFirmwares {
235236
}
236237

237238
#[derive(Debug, PartialEq)]
238-
pub struct PdVersions {
239-
pub controller01: ControllerFirmwares,
240-
pub controller23: ControllerFirmwares,
239+
pub enum PdVersions {
240+
RightLeft((ControllerFirmwares, ControllerFirmwares)),
241+
Single(ControllerFirmwares),
242+
Many(Vec<ControllerFirmwares>),
241243
}
242244

243245
/// Same as PdVersions but only the main FW
@@ -249,10 +251,17 @@ pub enum MainPdVersions {
249251
}
250252

251253
pub fn get_pd_controller_versions(ec: &CrosEc) -> EcResult<PdVersions> {
252-
Ok(PdVersions {
253-
controller01: PdController::new(PdPort::Left01, ec.clone()).get_fw_versions()?,
254-
controller23: PdController::new(PdPort::Right23, ec.clone()).get_fw_versions()?,
255-
})
254+
let pd01 = PdController::new(PdPort::Left01, ec.clone()).get_fw_versions();
255+
let pd23 = PdController::new(PdPort::Right23, ec.clone()).get_fw_versions();
256+
let pd_back = PdController::new(PdPort::Back, ec.clone()).get_fw_versions();
257+
258+
match (pd01, pd23, pd_back) {
259+
(Err(_), Err(_), Ok(pd_back)) => Ok(PdVersions::Single(pd_back)),
260+
(Ok(pd01), Ok(pd23), Err(_)) => Ok(PdVersions::RightLeft((pd01, pd23))),
261+
(Ok(pd01), Ok(pd23), Ok(pd_back)) => Ok(PdVersions::Many(vec![pd01, pd23, pd_back])),
262+
(Err(err), _, _) => Err(err),
263+
(_, Err(err), _) => Err(err),
264+
}
256265
}
257266

258267
fn parse_metadata_ccg3(buffer: &[u8]) -> Option<(u32, u32)> {

framework_lib/src/commandline/mod.rs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use crate::capsule_content::{
3333
use crate::ccgx::device::{FwMode, PdController, PdPort};
3434
#[cfg(feature = "hidapi")]
3535
use crate::ccgx::hid::{check_ccg_fw_version, find_devices, DP_CARD_PID, HDMI_CARD_PID};
36-
use crate::ccgx::{self, MainPdVersions, SiliconId::*};
36+
use crate::ccgx::{self, MainPdVersions, PdVersions, SiliconId::*};
3737
use crate::chromium_ec;
3838
use crate::chromium_ec::commands::DeckStateMode;
3939
use crate::chromium_ec::commands::FpLedBrightnessLevel;
@@ -398,11 +398,8 @@ fn print_versions(ec: &CrosEc) {
398398
}
399399

400400
println!("PD Controllers");
401-
402-
if let Ok(pd_versions) = ccgx::get_pd_controller_versions(ec) {
403-
let right = &pd_versions.controller01;
404-
let left = &pd_versions.controller23;
405-
// let active_mode =
401+
let ccgx_pd_vers = ccgx::get_pd_controller_versions(ec);
402+
if let Ok(PdVersions::RightLeft((right, left))) = ccgx_pd_vers {
406403
if let Some(Platform::IntelGen11) = smbios::get_platform() {
407404
if right.main_fw.base != right.backup_fw.base {
408405
println!(" Right (01)");
@@ -476,8 +473,24 @@ fn print_versions(ec: &CrosEc) {
476473
left.main_fw.app, left.active_fw
477474
);
478475
}
476+
} else if let Ok(PdVersions::Single(pd)) = ccgx_pd_vers {
477+
if pd.main_fw.app != pd.backup_fw.app {
478+
println!(
479+
" Main: {}{}",
480+
pd.main_fw.app,
481+
active_mode(&pd.active_fw, FwMode::MainFw)
482+
);
483+
println!(
484+
" Backup: {}{}",
485+
pd.backup_fw.app,
486+
active_mode(&pd.active_fw, FwMode::BackupFw)
487+
);
488+
} else {
489+
println!(" Version: {} ({:?})", pd.main_fw.app, pd.active_fw);
490+
}
479491
} else if let Ok(pd_versions) = power::read_pd_version(ec) {
480492
// As fallback try to get it from the EC. But not all EC versions have this command
493+
debug!(" Fallback to PD Host command");
481494
match pd_versions {
482495
MainPdVersions::RightLeft((controller01, controller23)) => {
483496
if let Some(Platform::IntelGen11) = smbios::get_platform() {
@@ -655,8 +668,8 @@ fn compare_version(device: Option<HardwareDeviceType>, version: String, ec: &Cro
655668
}
656669
}
657670
Some(HardwareDeviceType::PD0) => {
658-
if let Ok(pd_versions) = ccgx::get_pd_controller_versions(ec) {
659-
let ver = pd_versions.controller01.active_fw_ver();
671+
if let Ok(PdVersions::RightLeft((pd01, _pd23))) = ccgx::get_pd_controller_versions(ec) {
672+
let ver = pd01.active_fw_ver();
660673
println!("Comparing PD0 version {:?}", ver);
661674

662675
if ver.contains(&version) {
@@ -667,8 +680,8 @@ fn compare_version(device: Option<HardwareDeviceType>, version: String, ec: &Cro
667680
}
668681
}
669682
Some(HardwareDeviceType::PD1) => {
670-
if let Ok(pd_versions) = ccgx::get_pd_controller_versions(ec) {
671-
let ver = pd_versions.controller23.active_fw_ver();
683+
if let Ok(PdVersions::RightLeft((_pd01, pd23))) = ccgx::get_pd_controller_versions(ec) {
684+
let ver = pd23.active_fw_ver();
672685
println!("Comparing PD1 version {:?}", ver);
673686

674687
if ver.contains(&version) {

0 commit comments

Comments
 (0)