From: Michael Brown Date: Mon, 14 Apr 2025 10:32:17 +0000 (+0100) Subject: [fdt] Provide fdt_strings() to read string list properties X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c887de208fd18efd65e19d325e24e3365fce0570;p=thirdparty%2Fipxe.git [fdt] Provide fdt_strings() to read string list properties Signed-off-by: Michael Brown --- diff --git a/src/core/fdt.c b/src/core/fdt.c index 199a53497..2ca41bc08 100644 --- a/src/core/fdt.c +++ b/src/core/fdt.c @@ -403,30 +403,59 @@ static int fdt_property ( struct fdt *fdt, unsigned int offset, } /** - * Find string property + * Find strings property * * @v fdt Device tree * @v offset Starting node offset * @v name Property name + * @v count String count to fill in * @ret string String property, or NULL on error */ -const char * fdt_string ( struct fdt *fdt, unsigned int offset, - const char *name ) { +const char * fdt_strings ( struct fdt *fdt, unsigned int offset, + const char *name, unsigned int *count ) { struct fdt_descriptor desc; + const char *data; + size_t len; int rc; + /* Return a zero count on error */ + *count = 0; + /* Find property */ if ( ( rc = fdt_property ( fdt, offset, name, &desc ) ) != 0 ) return NULL; /* Check NUL termination */ - if ( strnlen ( desc.data, desc.len ) == desc.len ) { + data = desc.data; + if ( desc.len && ( data[ desc.len - 1 ] != '\0' ) ) { DBGC ( fdt, "FDT unterminated string property \"%s\"\n", name ); return NULL; } - return desc.data; + /* Count number of strings */ + for ( len = desc.len ; len-- ; ) { + if ( data[len] == '\0' ) + (*count)++; + } + + return data; +} + +/** + * Find string property + * + * @v fdt Device tree + * @v offset Starting node offset + * @v name Property name + * @ret string String property, or NULL on error + */ +const char * fdt_string ( struct fdt *fdt, unsigned int offset, + const char *name ) { + unsigned int count; + + /* Find strings property */ + return fdt_strings ( fdt, offset, name, &count ); } /** diff --git a/src/include/ipxe/fdt.h b/src/include/ipxe/fdt.h index 7eec5cd88..1e05c9e2d 100644 --- a/src/include/ipxe/fdt.h +++ b/src/include/ipxe/fdt.h @@ -115,6 +115,8 @@ extern int fdt_path ( struct fdt *fdt, const char *path, unsigned int *offset ); extern int fdt_alias ( struct fdt *fdt, const char *name, unsigned int *offset ); +extern const char * fdt_strings ( struct fdt *fdt, unsigned int offset, + const char *name, unsigned int *count ); extern const char * fdt_string ( struct fdt *fdt, unsigned int offset, const char *name ); extern int fdt_u64 ( struct fdt *fdt, unsigned int offset, const char *name,