]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[fdt] Add ability to parse unsigned integer properties
authorMichael Brown <mcb30@ipxe.org>
Mon, 28 Oct 2024 13:45:51 +0000 (13:45 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 28 Oct 2024 13:55:00 +0000 (13:55 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/fdt.c
src/include/ipxe/fdt.h

index f439422cfd70ef215c28ab7bae4492f418ce55c8..b7289fd36df02cb5319a5e0ceec467531b101c4c 100644 (file)
@@ -367,6 +367,44 @@ const char * fdt_string ( unsigned int offset, const char *name ) {
        return desc.data;
 }
 
+/**
+ * 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
  *
index 97efa100cca10c32c6bef0469668d5da42a86045..9b9b01b6cc88f51b6a3e86b79d4a3012a1c9bcdb 100644 (file)
@@ -96,6 +96,7 @@ struct fdt {
 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 );