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)?;