mirror of https://github.com/ipxe/ipxe.git
[fdt] Add ability to parse unsigned integer properties
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/1330/head
parent
cc45ca372c
commit
74710b8316
|
@ -367,6 +367,44 @@ const char * fdt_string ( unsigned int offset, const char *name ) {
|
||||||
return desc.data;
|
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
|
* Get MAC address from property
|
||||||
*
|
*
|
||||||
|
|
|
@ -96,6 +96,7 @@ struct fdt {
|
||||||
extern int fdt_path ( const char *path, unsigned int *offset );
|
extern int fdt_path ( const char *path, unsigned int *offset );
|
||||||
extern int fdt_alias ( const char *name, 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 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 fdt_mac ( unsigned int offset, struct net_device *netdev );
|
||||||
extern int register_fdt ( const struct fdt_header *hdr );
|
extern int register_fdt ( const struct fdt_header *hdr );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue