boot_fit.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. #include <boot_fit.h>
  9. #include <common.h>
  10. #include <errno.h>
  11. #include <image.h>
  12. #include <linux/libfdt.h>
  13. static int fdt_offset(const void *fit)
  14. {
  15. int images, node, fdt_len, fdt_node, fdt_offset;
  16. const char *fdt_name;
  17. node = fit_find_config_node(fit);
  18. if (node < 0)
  19. return node;
  20. images = fdt_path_offset(fit, FIT_IMAGES_PATH);
  21. if (images < 0) {
  22. debug("%s: Cannot find /images node: %d\n", __func__, images);
  23. return -EINVAL;
  24. }
  25. fdt_name = fdt_getprop(fit, node, FIT_FDT_PROP, &fdt_len);
  26. if (!fdt_name) {
  27. debug("%s: Cannot find fdt name property: %d\n",
  28. __func__, fdt_len);
  29. return -EINVAL;
  30. }
  31. fdt_node = fdt_subnode_offset(fit, images, fdt_name);
  32. if (fdt_node < 0) {
  33. debug("%s: Cannot find fdt node '%s': %d\n",
  34. __func__, fdt_name, fdt_node);
  35. return -EINVAL;
  36. }
  37. fdt_offset = fdt_getprop_u32(fit, fdt_node, "data-offset");
  38. if (fdt_offset == FDT_ERROR)
  39. return -ENOENT;
  40. fdt_len = fdt_getprop_u32(fit, fdt_node, "data-size");
  41. if (fdt_len < 0)
  42. return fdt_len;
  43. return fdt_offset;
  44. }
  45. void *locate_dtb_in_fit(const void *fit)
  46. {
  47. struct image_header *header;
  48. int size;
  49. int ret;
  50. size = fdt_totalsize(fit);
  51. size = (size + 3) & ~3;
  52. header = (struct image_header *)fit;
  53. if (image_get_magic(header) != FDT_MAGIC) {
  54. debug("No FIT image appended to U-boot\n");
  55. return NULL;
  56. }
  57. ret = fdt_offset(fit);
  58. if (ret < 0)
  59. return NULL;
  60. else
  61. return (void *)fit+size+ret;
  62. }