pvmfw: Get vcpufreq by compat & NOP unused OPPs am: c37c72e6fc am: 4b433d2c16
Original change: https://android-review.googlesource.com/c/platform/packages/modules/Virtualization/+/2963845
Change-Id: I3188fc131fdb1e5bb92e4a147cd48e38756fcb4a
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/pvmfw/src/fdt.rs b/pvmfw/src/fdt.rs
index 41ae5e5..dfc9ad1 100644
--- a/pvmfw/src/fdt.rs
+++ b/pvmfw/src/fdt.rs
@@ -229,13 +229,19 @@
}
fn read_vcpufreq_info(fdt: &Fdt) -> libfdt::Result<Option<VcpufreqInfo>> {
- if let Some(node) = fdt.node(cstr!("/cpufreq"))? {
- let mut regs = node.reg()?.ok_or(FdtError::NotFound)?;
- let reg = regs.next().ok_or(FdtError::NotFound)?;
- return Ok(Some(VcpufreqInfo { addr: reg.addr, size: reg.size.unwrap() }));
+ let mut nodes = fdt.compatible_nodes(cstr!("virtual,android-v-only-cpufreq"))?;
+ let Some(node) = nodes.next() else {
+ return Ok(None);
};
- Ok(None)
+ if nodes.next().is_some() {
+ warn!("DT has more than 1 cpufreq node: discarding extra nodes.");
+ }
+
+ let mut regs = node.reg()?.ok_or(FdtError::NotFound)?;
+ let reg = regs.next().ok_or(FdtError::NotFound)?;
+
+ Ok(Some(VcpufreqInfo { addr: reg.addr, size: reg.size.unwrap() }))
}
fn validate_vcpufreq_info(
@@ -262,10 +268,15 @@
fn patch_opptable(
node: FdtNodeMut,
- opptable: ArrayVec<[u64; DeviceTreeInfo::MAX_CPUS]>,
+ opptable: Option<ArrayVec<[u64; DeviceTreeInfo::MAX_CPUS]>>,
) -> libfdt::Result<()> {
let oppcompat = cstr!("operating-points-v2");
let next = node.next_compatible(oppcompat)?.ok_or(FdtError::NoSpace)?;
+
+ let Some(opptable) = opptable else {
+ return next.nop();
+ };
+
let mut next_subnode = next.first_subnode()?;
for entry in opptable {
@@ -297,9 +308,7 @@
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)?;
- if let Some(opptable) = cpu.opptable_info {
- patch_opptable(cur, opptable)?;
- }
+ patch_opptable(cur, cpu.opptable_info)?;
}
let mut next = get_nth_compatible(fdt, cpus.len(), COMPAT)?;
while let Some(current) = next {