[fdt] Add function to get the first range in /memory node of fdt

and test it. This function will be reused later in both pvmfw and
rialto.

Test: atest liblibfdt.integration_test
Test: atest vmbase_example.integration_test
Test: m pvmfw_img
Bug: 284462758
Change-Id: Ic547530f911281c2db14b9a59b7e2470be10361f
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index 91214b3..8e0bb65 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -25,6 +25,7 @@
 use core::ffi::{c_int, c_void, CStr};
 use core::fmt;
 use core::mem;
+use core::ops::Range;
 use core::result;
 use zerocopy::AsBytes as _;
 
@@ -716,23 +717,24 @@
         Ok(self)
     }
 
-    /// Return an iterator of memory banks specified the "/memory" node.
+    /// Returns an iterator of memory banks specified the "/memory" node.
+    /// Throws an error when the "/memory" is not found in the device tree.
     ///
     /// NOTE: This does not support individual "/memory@XXXX" banks.
-    pub fn memory(&self) -> Result<Option<MemRegIterator>> {
-        let memory = CStr::from_bytes_with_nul(b"/memory\0").unwrap();
-        let device_type = CStr::from_bytes_with_nul(b"memory\0").unwrap();
+    pub fn memory(&self) -> Result<MemRegIterator> {
+        let memory_node_name = CStr::from_bytes_with_nul(b"/memory\0").unwrap();
+        let memory_device_type = CStr::from_bytes_with_nul(b"memory\0").unwrap();
 
-        if let Some(node) = self.node(memory)? {
-            if node.device_type()? != Some(device_type) {
-                return Err(FdtError::BadValue);
-            }
-            let reg = node.reg()?.ok_or(FdtError::BadValue)?;
-
-            Ok(Some(MemRegIterator::new(reg)))
-        } else {
-            Ok(None)
+        let node = self.node(memory_node_name)?.ok_or(FdtError::NotFound)?;
+        if node.device_type()? != Some(memory_device_type) {
+            return Err(FdtError::BadValue);
         }
+        node.reg()?.ok_or(FdtError::BadValue).map(MemRegIterator::new)
+    }
+
+    /// Returns the first memory range in the `/memory` node.
+    pub fn first_memory_range(&self) -> Result<Range<usize>> {
+        self.memory()?.next().ok_or(FdtError::NotFound)
     }
 
     /// Retrieve the standard /chosen node.