boot_fit.c 1.6 KB

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