diff --git a/common/image-android-dt.c b/common/image-android-dt.c index ccef164e20..c3d424a7b6 100644 --- a/common/image-android-dt.c +++ b/common/image-android-dt.c @@ -155,3 +155,20 @@ void android_dt_print_contents(ulong hdr_addr) } } #endif + +/** + * Get dt entry count of DT image structure. + * + * @param hdr_addr Start address of DT image + */ +int android_dt_get_count(ulong hdr_addr) +{ + const struct dt_table_header *hdr; + int count; + + hdr = map_sysmem(hdr_addr, sizeof(*hdr)); + count = fdt32_to_cpu(hdr->dt_entry_count); + unmap_sysmem(hdr); + + return count; +} diff --git a/include/image-android-dt.h b/include/image-android-dt.h index 08b810d461..fdf7945cda 100644 --- a/include/image-android-dt.h +++ b/include/image-android-dt.h @@ -13,9 +13,36 @@ bool android_dt_check_header(ulong hdr_addr); bool android_dt_get_fdt_by_index(ulong hdr_addr, u32 index, ulong *addr, u32 *size); +int android_dt_get_count(ulong hdr_addr); #if !defined(CONFIG_SPL_BUILD) void android_dt_print_contents(ulong hdr_addr); #endif +/** + * dt_for_each_entry() - iterate over all dt entry of DT image + * + * @entry: struct dt_table_entry pointing to entry address + * @hdr: struct dt_table_header pointing to hdr address + * @idx: temporary index variant + * + * This is a wrapper around a for loop and is used like so: + * + * struct dt_table_header *hdr; + * struct dt_table_entry *entry; + * int index; + * + * ...... + * + * dt_for_each_entry(entry, hdr, index) { + * Use entry + * ... + * } + * + */ +#define dt_for_each_entry(entry, hdr, idx) \ + for (idx = 0, android_dt_get_fdt_by_index((ulong)hdr, idx, (ulong *)&entry, NULL); \ + idx < android_dt_get_count((ulong)hdr); \ + idx++, android_dt_get_fdt_by_index((ulong)hdr, idx, (ulong *)&entry, NULL)) + #endif /* IMAGE_ANDROID_DT_H */