[fdt] Add ability to parse unsigned integer properties
Signed-off-by: Michael Brown <mcb30@ipxe.org>
diff --git a/src/core/fdt.c b/src/core/fdt.c
index f439422..b7289fd 100644
--- a/src/core/fdt.c
+++ b/src/core/fdt.c
@@ -368,6 +368,44 @@
}
/**
+ * Find integer property
+ *
+ * @v offset Starting node offset
+ * @v name Property name
+ * @v value Integer value to fill in
+ * @ret rc Return status code
+ */
+int fdt_u64 ( unsigned int offset, const char *name, uint64_t *value ) {
+ struct fdt_descriptor desc;
+ const uint8_t *data;
+ size_t remaining;
+ int rc;
+
+ /* Clear value */
+ *value = 0;
+
+ /* Find property */
+ if ( ( rc = fdt_property ( offset, name, &desc ) ) != 0 )
+ return rc;
+
+ /* Check range */
+ if ( desc.len > sizeof ( *value ) ) {
+ DBGC ( &fdt, "FDT oversized integer property \"%s\"\n", name );
+ return -ERANGE;
+ }
+
+ /* Parse value */
+ data = desc.data;
+ remaining = desc.len;
+ while ( remaining-- ) {
+ *value <<= 8;
+ *value |= *(data++);
+ }
+
+ return 0;
+}
+
+/**
* Get MAC address from property
*
* @v offset Starting node offset
diff --git a/src/include/ipxe/fdt.h b/src/include/ipxe/fdt.h
index 97efa10..9b9b01b 100644
--- a/src/include/ipxe/fdt.h
+++ b/src/include/ipxe/fdt.h
@@ -96,6 +96,7 @@
extern int fdt_path ( const char *path, unsigned int *offset );
extern int fdt_alias ( const char *name, unsigned int *offset );
extern const char * fdt_string ( unsigned int offset, const char *name );
+extern int fdt_u64 ( unsigned int offset, const char *name, uint64_t *value );
extern int fdt_mac ( unsigned int offset, struct net_device *netdev );
extern int register_fdt ( const struct fdt_header *hdr );