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