uboot/boot/boot_fit.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2017
   4 * Texas Instruments, <www.ti.com>
   5 *
   6 * Franklin S Cooper Jr. <fcooper@ti.com>
   7 */
   8
   9#include <boot_fit.h>
  10#include <common.h>
  11#include <errno.h>
  12#include <image.h>
  13#include <log.h>
  14#include <linux/libfdt.h>
  15
  16static 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
  58void *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