spl_nand.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Copyright (C) 2011
  3. * Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <config.h>
  9. #include <spl.h>
  10. #include <asm/io.h>
  11. #include <nand.h>
  12. #if defined(CONFIG_SPL_NAND_RAW_ONLY)
  13. void spl_nand_load_image(void)
  14. {
  15. nand_init();
  16. nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
  17. CONFIG_SYS_NAND_U_BOOT_SIZE,
  18. (void *)CONFIG_SYS_NAND_U_BOOT_DST);
  19. spl_set_header_raw_uboot();
  20. nand_deselect();
  21. }
  22. #else
  23. void spl_nand_load_image(void)
  24. {
  25. struct image_header *header;
  26. int *src __attribute__((unused));
  27. int *dst __attribute__((unused));
  28. debug("spl: nand - using hw ecc\n");
  29. nand_init();
  30. /*use CONFIG_SYS_TEXT_BASE as temporary storage area */
  31. header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
  32. #ifdef CONFIG_SPL_OS_BOOT
  33. if (!spl_start_uboot()) {
  34. /*
  35. * load parameter image
  36. * load to temp position since nand_spl_load_image reads
  37. * a whole block which is typically larger than
  38. * CONFIG_CMD_SPL_WRITE_SIZE therefore may overwrite
  39. * following sections like BSS
  40. */
  41. nand_spl_load_image(CONFIG_CMD_SPL_NAND_OFS,
  42. CONFIG_CMD_SPL_WRITE_SIZE,
  43. (void *)CONFIG_SYS_TEXT_BASE);
  44. /* copy to destintion */
  45. for (dst = (int *)CONFIG_SYS_SPL_ARGS_ADDR,
  46. src = (int *)CONFIG_SYS_TEXT_BASE;
  47. src < (int *)(CONFIG_SYS_TEXT_BASE +
  48. CONFIG_CMD_SPL_WRITE_SIZE);
  49. src++, dst++) {
  50. writel(readl(src), dst);
  51. }
  52. /* load linux */
  53. nand_spl_load_image(CONFIG_SYS_NAND_SPL_KERNEL_OFFS,
  54. sizeof(*header), (void *)header);
  55. spl_parse_image_header(header);
  56. if (header->ih_os == IH_OS_LINUX) {
  57. /* happy - was a linux */
  58. nand_spl_load_image(CONFIG_SYS_NAND_SPL_KERNEL_OFFS,
  59. spl_image.size, (void *)spl_image.load_addr);
  60. nand_deselect();
  61. return;
  62. } else {
  63. puts("The Expected Linux image was not "
  64. "found. Please check your NAND "
  65. "configuration.\n");
  66. puts("Trying to start u-boot now...\n");
  67. }
  68. }
  69. #endif
  70. #ifdef CONFIG_NAND_ENV_DST
  71. nand_spl_load_image(CONFIG_ENV_OFFSET,
  72. sizeof(*header), (void *)header);
  73. spl_parse_image_header(header);
  74. nand_spl_load_image(CONFIG_ENV_OFFSET, spl_image.size,
  75. (void *)spl_image.load_addr);
  76. #ifdef CONFIG_ENV_OFFSET_REDUND
  77. nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND,
  78. sizeof(*header), (void *)header);
  79. spl_parse_image_header(header);
  80. nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, spl_image.size,
  81. (void *)spl_image.load_addr);
  82. #endif
  83. #endif
  84. /* Load u-boot */
  85. nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
  86. sizeof(*header), (void *)header);
  87. spl_parse_image_header(header);
  88. nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
  89. spl_image.size, (void *)(unsigned long)spl_image.load_addr);
  90. nand_deselect();
  91. }
  92. #endif