1 /* 2 * (C) Copyright 2017 3 * Texas Instruments, <www.ti.com> 4 * 5 * Franklin S Cooper Jr. <fcooper@ti.com> 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ 9 10 #include <boot_fit.h> 11 #include <common.h> 12 #include <errno.h> 13 #include <image.h> 14 #include <linux/libfdt.h> 15 16 static int fdt_offset(const void *fit) 17 { 18 int images, node, fdt_len, fdt_node, fdt_offset; 19 const char *fdt_name; 20 21 node = fit_find_config_node(fit); 22 if (node < 0) 23 return node; 24 25 images = fdt_path_offset(fit, FIT_IMAGES_PATH); 26 if (images < 0) { 27 debug("%s: Cannot find /images node: %d\n", __func__, images); 28 return -EINVAL; 29 } 30 31 fdt_name = fdt_getprop(fit, node, FIT_FDT_PROP, &fdt_len); 32 if (!fdt_name) { 33 debug("%s: Cannot find fdt name property: %d\n", 34 __func__, fdt_len); 35 return -EINVAL; 36 } 37 38 fdt_node = fdt_subnode_offset(fit, images, fdt_name); 39 if (fdt_node < 0) { 40 debug("%s: Cannot find fdt node '%s': %d\n", 41 __func__, fdt_name, fdt_node); 42 return -EINVAL; 43 } 44 45 fdt_offset = fdt_getprop_u32(fit, fdt_node, "data-offset"); 46 47 if (fdt_offset == FDT_ERROR) 48 return -ENOENT; 49 50 fdt_len = fdt_getprop_u32(fit, fdt_node, "data-size"); 51 52 if (fdt_len < 0) 53 return fdt_len; 54 55 return fdt_offset; 56 } 57 58 void *locate_dtb_in_fit(const void *fit) 59 { 60 struct image_header *header; 61 int size; 62 int ret; 63 64 size = fdt_totalsize(fit); 65 size = (size + 3) & ~3; 66 67 header = (struct image_header *)fit; 68 69 if (image_get_magic(header) != FDT_MAGIC) { 70 debug("No FIT image appended to U-boot\n"); 71 return NULL; 72 } 73 74 ret = fdt_offset(fit); 75 76 if (ret < 0) 77 return NULL; 78 else 79 return (void *)fit+size+ret; 80 } 81