splash.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * (C) Copyright 2014 CompuLab, Ltd. <www.compulab.co.il>
  3. *
  4. * Authors: Igor Grinberg <grinberg@compulab.co.il>
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <common.h>
  9. #include <nand.h>
  10. #include <bmp_layout.h>
  11. DECLARE_GLOBAL_DATA_PTR;
  12. #ifdef CONFIG_CMD_NAND
  13. static int splash_load_from_nand(u32 bmp_load_addr, int nand_offset)
  14. {
  15. struct bmp_header *bmp_hdr;
  16. int res;
  17. size_t bmp_size, bmp_header_size = sizeof(struct bmp_header);
  18. if (bmp_load_addr + bmp_header_size >= gd->start_addr_sp)
  19. goto splash_address_too_high;
  20. res = nand_read_skip_bad(&nand_info[nand_curr_device],
  21. nand_offset, &bmp_header_size,
  22. NULL, nand_info[nand_curr_device].size,
  23. (u_char *)bmp_load_addr);
  24. if (res < 0)
  25. return res;
  26. bmp_hdr = (struct bmp_header *)bmp_load_addr;
  27. bmp_size = le32_to_cpu(bmp_hdr->file_size);
  28. if (bmp_load_addr + bmp_size >= gd->start_addr_sp)
  29. goto splash_address_too_high;
  30. return nand_read_skip_bad(&nand_info[nand_curr_device],
  31. nand_offset, &bmp_size,
  32. NULL, nand_info[nand_curr_device].size,
  33. (u_char *)bmp_load_addr);
  34. splash_address_too_high:
  35. printf("Error: splashimage address too high. Data overwrites U-Boot "
  36. "and/or placed beyond DRAM boundaries.\n");
  37. return -1;
  38. }
  39. #else
  40. static inline int splash_load_from_nand(u32 bmp_load_addr, int nand_offset)
  41. {
  42. return -1;
  43. }
  44. #endif /* CONFIG_CMD_NAND */
  45. int cl_splash_screen_prepare(int nand_offset)
  46. {
  47. char *env_splashimage_value;
  48. u32 bmp_load_addr;
  49. env_splashimage_value = getenv("splashimage");
  50. if (env_splashimage_value == NULL)
  51. return -1;
  52. bmp_load_addr = simple_strtoul(env_splashimage_value, 0, 16);
  53. if (bmp_load_addr == 0) {
  54. printf("Error: bad splashimage address specified\n");
  55. return -1;
  56. }
  57. return splash_load_from_nand(bmp_load_addr, nand_offset);
  58. }