bootm.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2003
  4. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  5. *
  6. * (c) Copyright 2008 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
  7. * (c) Copyright 2008 Renesas Solutions Corp.
  8. */
  9. #include <common.h>
  10. #include <command.h>
  11. #include <asm/byteorder.h>
  12. #include <asm/zimage.h>
  13. #ifdef CONFIG_SYS_DEBUG
  14. static void hexdump(unsigned char *buf, int len)
  15. {
  16. int i;
  17. for (i = 0; i < len; i++) {
  18. if ((i % 16) == 0)
  19. printf("%s%08x: ", i ? "\n" : "",
  20. (unsigned int)&buf[i]);
  21. printf("%02x ", buf[i]);
  22. }
  23. printf("\n");
  24. }
  25. #endif
  26. #ifdef CONFIG_SH_SDRAM_OFFSET
  27. #define GET_INITRD_START(initrd, linux) (initrd - linux + CONFIG_SH_SDRAM_OFFSET)
  28. #else
  29. #define GET_INITRD_START(initrd, linux) (initrd - linux)
  30. #endif
  31. static void set_sh_linux_param(unsigned long param_addr, unsigned long data)
  32. {
  33. *(unsigned long *)(param_addr) = data;
  34. }
  35. static unsigned long sh_check_cmd_arg(char *cmdline, char *key, int base)
  36. {
  37. unsigned long val = 0;
  38. char *p = strstr(cmdline, key);
  39. if (p) {
  40. p += strlen(key);
  41. val = simple_strtol(p, NULL, base);
  42. }
  43. return val;
  44. }
  45. int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
  46. {
  47. /* Linux kernel load address */
  48. void (*kernel) (void) = (void (*)(void))images->ep;
  49. /* empty_zero_page */
  50. unsigned char *param
  51. = (unsigned char *)image_get_load(images->legacy_hdr_os);
  52. /* Linux kernel command line */
  53. char *cmdline = (char *)param + COMMAND_LINE;
  54. /* PAGE_SIZE */
  55. unsigned long size = images->ep - (unsigned long)param;
  56. char *bootargs = env_get("bootargs");
  57. /*
  58. * allow the PREP bootm subcommand, it is required for bootm to work
  59. */
  60. if (flag & BOOTM_STATE_OS_PREP)
  61. return 0;
  62. if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
  63. return 1;
  64. /* Clear zero page */
  65. memset(param, 0, size);
  66. /* Set commandline */
  67. strcpy(cmdline, bootargs);
  68. /* Initrd */
  69. if (images->rd_start || images->rd_end) {
  70. unsigned long ramdisk_flags = 0;
  71. int val = sh_check_cmd_arg(bootargs, CMD_ARG_RD_PROMPT, 10);
  72. if (val == 1)
  73. ramdisk_flags |= RD_PROMPT;
  74. else
  75. ramdisk_flags &= ~RD_PROMPT;
  76. val = sh_check_cmd_arg(bootargs, CMD_ARG_RD_DOLOAD, 10);
  77. if (val == 1)
  78. ramdisk_flags |= RD_DOLOAD;
  79. else
  80. ramdisk_flags &= ~RD_DOLOAD;
  81. set_sh_linux_param((unsigned long)param + MOUNT_ROOT_RDONLY, 0x0001);
  82. set_sh_linux_param((unsigned long)param + RAMDISK_FLAGS, ramdisk_flags);
  83. set_sh_linux_param((unsigned long)param + ORIG_ROOT_DEV, 0x0200);
  84. set_sh_linux_param((unsigned long)param + LOADER_TYPE, 0x0001);
  85. set_sh_linux_param((unsigned long)param + INITRD_START,
  86. GET_INITRD_START(images->rd_start, CONFIG_SYS_SDRAM_BASE));
  87. set_sh_linux_param((unsigned long)param + INITRD_SIZE,
  88. images->rd_end - images->rd_start);
  89. }
  90. /* Boot kernel */
  91. kernel();
  92. /* does not return */
  93. return 1;
  94. }