Skip to content

Commit ccc66bf

Browse files
committed
--versions: Return any number of PD versions
Based on EC host command. Signed-off-by: Daniel Schaefer <dhs@frame.work>
1 parent ea3625a commit ccc66bf

File tree

3 files changed

+53
-11
lines changed

3 files changed

+53
-11
lines changed

framework_lib/src/ccgx/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,10 @@ pub struct PdVersions {
241241

242242
/// Same as PdVersions but only the main FW
243243
#[derive(Debug)]
244-
pub struct MainPdVersions {
245-
pub controller01: ControllerVersion,
246-
pub controller23: ControllerVersion,
244+
pub enum MainPdVersions {
245+
RightLeft((ControllerVersion, ControllerVersion)),
246+
Single(ControllerVersion),
247+
Many(Vec<ControllerVersion>),
247248
}
248249

249250
pub fn get_pd_controller_versions(ec: &CrosEc) -> EcResult<PdVersions> {

framework_lib/src/commandline/mod.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::capsule_content::{
3232
use crate::ccgx::device::{FwMode, PdController, PdPort};
3333
#[cfg(feature = "hidapi")]
3434
use crate::ccgx::hid::{check_ccg_fw_version, find_devices, DP_CARD_PID, HDMI_CARD_PID};
35-
use crate::ccgx::{self, SiliconId::*};
35+
use crate::ccgx::{self, MainPdVersions, SiliconId::*};
3636
use crate::chromium_ec;
3737
use crate::chromium_ec::commands::DeckStateMode;
3838
use crate::chromium_ec::commands::FpLedBrightnessLevel;
@@ -477,8 +477,25 @@ fn print_versions(ec: &CrosEc) {
477477
}
478478
} else if let Ok(pd_versions) = power::read_pd_version(ec) {
479479
// As fallback try to get it from the EC. But not all EC versions have this command
480-
println!(" Right (01): {}", pd_versions.controller01.app);
481-
println!(" Left (23): {}", pd_versions.controller23.app);
480+
match pd_versions {
481+
MainPdVersions::RightLeft((controller01, controller23)) => {
482+
if let Some(Platform::IntelGen11) = smbios::get_platform() {
483+
println!(" Right (01): {}", controller01.base);
484+
println!(" Left (23): {}", controller23.base);
485+
} else {
486+
println!(" Right (01): {}", controller01.app);
487+
println!(" Left (23): {}", controller23.app);
488+
}
489+
}
490+
MainPdVersions::Single(version) => {
491+
println!(" Version: {}", version.app);
492+
}
493+
MainPdVersions::Many(versions) => {
494+
for (i, version) in versions.into_iter().enumerate() {
495+
println!(" PD {}: {}", i, version.app);
496+
}
497+
}
498+
}
482499
} else {
483500
println!(" Unknown")
484501
}

framework_lib/src/power.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,11 @@ pub fn is_charging(ec: &CrosEc) -> EcResult<(bool, bool)> {
798798
Ok((port0 || port1, port2 || port3))
799799
}
800800

801+
fn parse_pd_ver_slice(data: &[u8]) -> ControllerVersion {
802+
parse_pd_ver(&[
803+
data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7],
804+
])
805+
}
801806
fn parse_pd_ver(data: &[u8; 8]) -> ControllerVersion {
802807
ControllerVersion {
803808
base: BaseVersion {
@@ -818,12 +823,31 @@ fn parse_pd_ver(data: &[u8; 8]) -> ControllerVersion {
818823
// NOTE: Only works on ADL at the moment!
819824
// TODO: Not on TGL, need to check if RPL and later have it.
820825
pub fn read_pd_version(ec: &CrosEc) -> EcResult<MainPdVersions> {
821-
let info = EcRequestReadPdVersion {}.send_command(ec)?;
826+
let info = EcRequestReadPdVersionV1 {}.send_command_vec(ec);
822827

823-
Ok(MainPdVersions {
824-
controller01: parse_pd_ver(&info.controller01),
825-
controller23: parse_pd_ver(&info.controller23),
826-
})
828+
// If v1 not available, fall back
829+
if let Err(EcError::Response(EcResponseStatus::InvalidCommand)) = info {
830+
let info = EcRequestReadPdVersionV0 {}.send_command(ec)?;
831+
832+
return Ok(MainPdVersions::RightLeft((
833+
parse_pd_ver(&info.controller01),
834+
parse_pd_ver(&info.controller23),
835+
)));
836+
}
837+
// If any other error, exit
838+
let info = info?;
839+
840+
let mut versions = vec![];
841+
let pd_count = info[0] as usize;
842+
for i in 0..pd_count {
843+
// TODO: Is there a safer way to check the range?
844+
if info.len() < 1 + 8 * (i + 1) {
845+
return Err(EcError::DeviceError("Not enough data returned".to_string()))?;
846+
}
847+
versions.push(parse_pd_ver_slice(&info[1 + 8 * i..1 + 8 * (i + 1)]));
848+
}
849+
850+
Ok(MainPdVersions::Many(versions))
827851
}
828852

829853
pub fn standalone_mode(ec: &CrosEc) -> bool {

0 commit comments

Comments
 (0)