pvmfw: Patching cpu_capacity info
Read and patch optional cpu_capacity properties from
cpu nodes.
Bug: 284369518
Test: m pvmfw, boot protected microdroid and tested vcpufreq end-to-end
Change-Id: I775880814f6ffe613259e4869b62c2eb226f13ae
Signed-off-by: David Dai <davidai@google.com>
diff --git a/pvmfw/src/fdt.rs b/pvmfw/src/fdt.rs
index f20451a..ba0a992 100644
--- a/pvmfw/src/fdt.rs
+++ b/pvmfw/src/fdt.rs
@@ -178,10 +178,10 @@
.setprop_inplace(cstr!("reg"), [addr.to_be(), size.to_be()].as_bytes())
}
-//TODO: Need to add info for cpu capacity
#[derive(Debug, Default)]
struct CpuInfo {
opptable_info: Option<ArrayVec<[u64; CpuInfo::MAX_OPPTABLES]>>,
+ cpu_capacity: Option<u32>,
}
impl CpuInfo {
@@ -204,6 +204,7 @@
let mut cpus = ArrayVec::new();
let mut cpu_nodes = fdt.compatible_nodes(cstr!("arm,arm-v8"))?;
for cpu in cpu_nodes.by_ref().take(cpus.capacity()) {
+ let cpu_capacity = cpu.getprop_u32(cstr!("capacity-dmips-mhz"))?;
let opp_phandle = cpu.getprop_u32(cstr!("operating-points-v2"))?;
let opptable_info = if let Some(phandle) = opp_phandle {
let phandle = phandle.try_into()?;
@@ -212,7 +213,7 @@
} else {
None
};
- let info = CpuInfo { opptable_info };
+ let info = CpuInfo { opptable_info, cpu_capacity };
cpus.push(info);
}
if cpu_nodes.next().is_some() {
@@ -226,7 +227,6 @@
if cpus.is_empty() {
return Err(FdtValidationError::InvalidCpuCount(0));
}
-
Ok(())
}
@@ -307,7 +307,10 @@
fn patch_cpus(fdt: &mut Fdt, cpus: &[CpuInfo]) -> libfdt::Result<()> {
const COMPAT: &CStr = cstr!("arm,arm-v8");
for (idx, cpu) in cpus.iter().enumerate() {
- let cur = get_nth_compatible(fdt, idx, COMPAT)?.ok_or(FdtError::NoSpace)?;
+ let mut cur = get_nth_compatible(fdt, idx, COMPAT)?.ok_or(FdtError::NoSpace)?;
+ if let Some(cpu_capacity) = cpu.cpu_capacity {
+ cur.setprop_inplace(cstr!("capacity-dmips-mhz"), &cpu_capacity.to_be_bytes())?;
+ }
patch_opptable(cur, cpu.opptable_info)?;
}
let mut next = get_nth_compatible(fdt, cpus.len(), COMPAT)?;