Merge patch series "pxe: Allow extlinux booting without CMDLINE enabled"
authorTom Rini <trini@konsulko.com>
Wed, 10 Apr 2024 23:06:27 +0000 (17:06 -0600)
committerTom Rini <trini@konsulko.com>
Wed, 10 Apr 2024 23:06:27 +0000 (17:06 -0600)
Simon Glass <sjg@chromium.org> says:

This series is the culmanation of the current line of refactoring
series. It adjusts pxe to call the booting functionality directly
rather than going through the command-line interface.

With this is is possible to boot using the extlinux bootmeth without
the command line enabled.

It also updates fastboot to do a similar thing.

32 files changed:
1  2 
arch/arm/lib/Makefile
arch/mips/lib/Makefile
arch/x86/lib/Makefile
boot/Kconfig
boot/Makefile
boot/pxe_utils.c
cmd/Kconfig
configs/colibri_vf_defconfig
configs/iot_devkit_defconfig
configs/mx6memcal_defconfig
configs/xilinx_versal_mini_defconfig
configs/xilinx_versal_mini_emmc0_defconfig
configs/xilinx_versal_mini_emmc1_defconfig
configs/xilinx_versal_mini_ospi_defconfig
configs/xilinx_versal_mini_qspi_defconfig
configs/xilinx_versal_net_mini_ospi_defconfig
configs/xilinx_versal_net_mini_qspi_defconfig
configs/xilinx_zynqmp_mini_defconfig
configs/xilinx_zynqmp_mini_emmc0_defconfig
configs/xilinx_zynqmp_mini_emmc1_defconfig
configs/xilinx_zynqmp_mini_nand_defconfig
configs/xilinx_zynqmp_mini_nand_single_defconfig
configs/xilinx_zynqmp_mini_qspi_defconfig
configs/zynq_cse_nand_defconfig
configs/zynq_cse_nor_defconfig
configs/zynq_cse_qspi_defconfig
doc/android/fastboot.rst
drivers/fastboot/Kconfig
drivers/fastboot/fb_command.c
include/bootm.h
include/fastboot-internal.h
include/fastboot.h

Simple merge
Simple merge
Simple merge
diff --cc boot/Kconfig
@@@ -721,6 -677,85 +688,100 @@@ config BOOTMETH_SCRIP
  
  endif # BOOTSTD
  
+ config BOOTM
+       bool "Support booting an application image from memory"
+       default y
+       help
+         This is the main boot implementation in U-Boot, supporting a wide
+         variety of features including FIT and legacy-image boot, kernel and
+         FDT selection, setting up of the command line for the OS and many
+         other features.
+         This option should normally be enabled. It is used to implement the
+         'bootm' command.
+ config BOOTM_LINUX
+       bool "Support booting Linux OS images"
+       depends on BOOTM || CMD_BOOTZ || CMD_BOOTI
+       default y
+       help
+         Support booting the Linux kernel directly via a command such as bootm
+         or booti or bootz.
+ config BOOTM_NETBSD
+       bool "Support booting NetBSD (non-EFI) loader images"
+       depends on BOOTM
+       default y
+       help
+         Support booting NetBSD via the bootm command.
+ config BOOTM_OPENRTOS
+       bool "Support booting OPENRTOS / FreeRTOS images"
+       depends on BOOTM
+       help
+         Support booting OPENRTOS / FreeRTOS via the bootm command.
+ config BOOTM_OSE
+       bool "Support booting Enea OSE images"
+       depends on (ARM && (ARM64 || CPU_V7A || CPU_V7R) || SANDBOX || PPC || X86)
+       depends on BOOTM
+       help
+         Support booting Enea OSE images via the bootm command.
+ config BOOTM_PLAN9
+       bool "Support booting Plan9 OS images"
+       depends on BOOTM
+       default y
+       help
+         Support booting Plan9 images via the bootm command.
+ config BOOTM_RTEMS
+       bool "Support booting RTEMS OS images"
+       depends on BOOTM
+       default y
+       help
+         Support booting RTEMS images via the bootm command.
+ config BOOTM_VXWORKS
+       bool "Support booting VxWorks OS images"
+       depends on BOOTM
+       default y
+       help
+         Support booting VxWorks images via the bootm command.
+ config ANDROID_BOOT_IMAGE
+       bool "Android Boot Images"
+       default y if FASTBOOT
+       help
+         This enables support for booting images which use the Android
+         image format header.
+ config TIMESTAMP
+       bool "Show image date and time when displaying image information"
+       default y if CMD_DATE
+       help
+         When CONFIG_TIMESTAMP is selected, the timestamp (date and time) of
+         an image is printed by image commands like bootm or iminfo. This
+         is shown as 'Timestamp: xxx' and 'Created: xxx'. If this option is
+         enabled, then U-Boot requires FITs to have a timestamp. If a FIT is
+         loaded that does not, the message 'Wrong FIT format: no timestamp'
+         is shown.
++config BUTTON_CMD
++      bool "Support for running a command if a button is held during boot"
++      depends on CMDLINE
++      depends on BUTTON
++      help
++        For many embedded devices it's useful to enter a special flashing mode
++        such as fastboot mode when a button is held during boot. This option
++        allows arbitrary commands to be assigned to specific buttons. These will
++        be run after "preboot" if the button is held. Configuration is done via
++        the environment variables "button_cmd_N_name" and "button_cmd_N" where n is
++        the button number (starting from 0). e.g:
++
++          "button_cmd_0_name=vol_down"
++          "button_cmd_0=fastboot usb 0"
++
  config LEGACY_IMAGE_FORMAT
        bool "Enable support for the legacy image format"
        default y if !FIT_SIGNATURE && !TI_SECURE_DEVICE
diff --cc boot/Makefile
Simple merge
@@@ -469,6 -470,198 +470,220 @@@ skip_overlay
  }
  #endif
  
 -                      fdtfile = label->fdt;
+ /**
+  * calc_fdt_fname() - Figure out the filename to use for the FDT
+  *
+  * Determine the path to the FDT filename, based on the "fdtfile" environment
+  * variable. Use <soc>-<board>.dtb as a fallback
+  *
+  * @fdtdir: Directory to use for the FDT file
+  * Return: allocated filename (including directory), or NULL if out of memory
+  */
+ static char *calc_fdt_fname(const char *fdtdir)
+ {
+       char *fdtfile;
+       char *f1, *f2, *f3, *f4, *slash;
+       int len;
+       f1 = env_get("fdtfile");
+       if (f1) {
+               f2 = "";
+               f3 = "";
+               f4 = "";
+       } else {
+               /*
+                * For complex cases where this code doesn't generate the
+                * correct filename, the board code should set $fdtfile during
+                * early boot, or the boot scripts should set $fdtfile before
+                * invoking "pxe" or "sysboot".
+                */
+               f1 = env_get("soc");
+               f2 = "-";
+               f3 = env_get("board");
+               f4 = ".dtb";
+               if (!f1) {
+                       f1 = "";
+                       f2 = "";
+               }
+               if (!f3) {
+                       f2 = "";
+                       f3 = "";
+               }
+       }
+       len = strlen(fdtdir);
+       if (!len)
+               slash = "./";
+       else if (fdtdir[len - 1] != '/')
+               slash = "/";
+       else
+               slash = "";
+       len = strlen(fdtdir) + strlen(slash) + strlen(f1) + strlen(f2) +
+               strlen(f3) + strlen(f4) + 1;
+       fdtfile = malloc(len);
+       if (!fdtfile) {
+               printf("malloc fail (FDT filename)\n");
+               return NULL;
+       }
+       snprintf(fdtfile, len, "%s%s%s%s%s%s", fdtdir, slash, f1, f2, f3, f4);
+       return fdtfile;
+ }
+ /**
+  * label_run_boot() - Run the correct boot procedure
+  *
+  * fdt usage is optional:
+  * It handles the following scenarios.
+  *
+  * Scenario 1: If fdt_addr_r specified and "fdt" or "fdtdir" label is
+  * defined in pxe file, retrieve fdt blob from server. Pass fdt_addr_r to
+  * bootm, and adjust argc appropriately.
+  *
+  * If retrieve fails and no exact fdt blob is specified in pxe file with
+  * "fdt" label, try Scenario 2.
+  *
+  * Scenario 2: If there is an fdt_addr specified, pass it along to
+  * bootm, and adjust argc appropriately.
+  *
+  * Scenario 3: If there is an fdtcontroladdr specified, pass it along to
+  * bootm, and adjust argc appropriately, unless the image type is fitImage.
+  *
+  * Scenario 4: fdt blob is not available.
+  *
+  * @ctx: PXE context
+  * @label: Label to process
+  * @kernel_addr: string containing the kernel address / config
+  * @initrd_str: string containing the initrd address / size
+  * @initrd_addr_str: initrd address, or NULL if none
+  * @initrd_filesize: initrd size in bytes; only valid if initrd_addr_str is not
+  *    NULL
+  * Returns does not return on success, otherwise returns 0 if a localboot
+  *    label was processed, or 1 on error
+  */
+ static int label_run_boot(struct pxe_context *ctx, struct pxe_label *label,
+                         char *kernel_addr, char *initrd_str,
+                         char *initrd_addr_str, char *initrd_filesize)
+ {
+       struct bootm_info bmi;
+       const char *fdt_addr;
+       ulong kernel_addr_r;
+       void *buf;
+       int ret;
+       if (IS_ENABLED(CONFIG_BOOTM))
+               bootm_init(&bmi);
+       fdt_addr = env_get("fdt_addr_r");
+       /* For FIT, the label can be identical to kernel one */
+       if (label->fdt && !strcmp(label->kernel_label, label->fdt)) {
+               fdt_addr = kernel_addr;
+       /* if fdt label is defined then get fdt from server */
+       } else if (fdt_addr) {
+               char *fdtfile = NULL;
+               char *fdtfilefree = NULL;
+               if (label->fdt) {
 -      bmi.addr_fit = kernel_addr;
++                      if (IS_ENABLED(CONFIG_SUPPORT_PASSING_ATAGS)) {
++                              if (strcmp("-", label->fdt))
++                                      fdtfile = label->fdt;
++                      } else {
++                              fdtfile = label->fdt;
++                      }
+               } else if (label->fdtdir) {
+                       fdtfilefree = calc_fdt_fname(label->fdtdir);
+                       if (!fdtfilefree)
+                               return -ENOMEM;
+                       fdtfile = fdtfilefree;
+               }
+               if (fdtfile) {
+                       int err = get_relfile_envaddr(ctx, fdtfile,
+                                                     "fdt_addr_r", NULL);
+                       free(fdtfilefree);
+                       if (err < 0) {
+                               fdt_addr = NULL;
+                               if (label->fdt) {
+                                       printf("Skipping %s for failure retrieving FDT\n",
+                                              label->name);
+                                       return -ENOENT;
+                               }
++
++                              if (label->fdtdir) {
++                                      printf("Skipping fdtdir %s for failure retrieving dts\n",
++                                              label->fdtdir);
++                              }
+                       }
+                       if (label->kaslrseed)
+                               label_boot_kaslrseed();
+ #ifdef CONFIG_OF_LIBFDT_OVERLAY
+                       if (label->fdtoverlays)
+                               label_boot_fdtoverlay(ctx, label);
+ #endif
+               } else {
+                       fdt_addr = NULL;
+               }
+       }
 -      if (!fdt_addr)
 -              fdt_addr = env_get("fdt_addr");
++      bmi.addr_img = kernel_addr;
+       if (initrd_addr_str)
+               bmi.conf_ramdisk = initrd_str;
 -      if (!fdt_addr && genimg_get_format(buf) != IMAGE_FORMAT_FIT)
 -              fdt_addr = env_get("fdtcontroladdr");
++      if (!fdt_addr) {
++              if (IS_ENABLED(CONFIG_SUPPORT_PASSING_ATAGS)) {
++                      if (strcmp("-", label->fdt))
++                              fdt_addr = env_get("fdt_addr");
++              } else {
++                      fdt_addr = env_get("fdt_addr");
++              }
++      }
+       kernel_addr_r = genimg_get_kernel_addr(kernel_addr);
+       buf = map_sysmem(kernel_addr_r, 0);
++      if (!fdt_addr && genimg_get_format(buf) != IMAGE_FORMAT_FIT) {
++              if (IS_ENABLED(CONFIG_SUPPORT_PASSING_ATAGS)) {
++                      if (strcmp("-", label->fdt))
++                              fdt_addr = env_get("fdtcontroladdr");
++              } else {
++                      fdt_addr = env_get("fdtcontroladdr");
++              }
++      }
+       bmi.conf_fdt = fdt_addr;
+       /* Try bootm for legacy and FIT format image */
+       if (genimg_get_format(buf) != IMAGE_FORMAT_INVALID &&
+           IS_ENABLED(CONFIG_BOOTM))
+               ret = bootm_run(&bmi);
+       /* Try booting an AArch64 Linux kernel image */
+       else if (IS_ENABLED(CONFIG_BOOTM))
+               ret = booti_run(&bmi);
+       /* Try booting a Image */
+       else if (IS_ENABLED(CONFIG_BOOTM))
+               ret = bootz_run(&bmi);
+       /* Try booting an x86_64 Linux kernel image */
+       else if (IS_ENABLED(CONFIG_ZBOOT))
+               ret = zboot_run(hextoul(kernel_addr, NULL), 0,
+                               initrd_addr_str ?
+                                       hextoul(initrd_addr_str, NULL) : 0,
+                               initrd_addr_str ?
+                                       hextoul(initrd_filesize, NULL) : 0,
+                               0, NULL);
+       unmap_sysmem(buf);
+       return 0;
+ }
  /**
   * label_boot() - Boot according to the contents of a pxe_label
   *
diff --cc cmd/Kconfig
Simple merge
@@@ -32,8 -32,8 +33,7 @@@ CONFIG_BOARD_EARLY_INIT_F=
  CONFIG_HUSH_PARSER=y
  # CONFIG_SYS_LONGHELP is not set
  CONFIG_SYS_PROMPT="Colibri VFxx # "
 -CONFIG_SYS_PBSIZE=1056
  # CONFIG_CMD_BOOTD is not set
- # CONFIG_CMD_BOOTM is not set
  CONFIG_CMD_BOOTZ=y
  # CONFIG_CMD_ELF is not set
  # CONFIG_CMD_IMI is not set
@@@ -14,12 -14,12 +14,12 @@@ CONFIG_DEFAULT_DEVICE_TREE="iot_devkit
  CONFIG_SYS_CLK_FREQ=16000000
  CONFIG_SYS_LOAD_ADDR=0x30000000
  CONFIG_LOCALVERSION="-iotdk-1.0"
+ # CONFIG_BOOTM is not set
  # CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
 -CONFIG_SYS_PROMPT="IoTDK# "
  CONFIG_SYS_CBSIZE=256
  CONFIG_SYS_PBSIZE=280
 +CONFIG_SYS_PROMPT="IoTDK# "
  # CONFIG_CMD_BOOTD is not set
- # CONFIG_CMD_BOOTM is not set
  # CONFIG_CMD_ELF is not set
  # CONFIG_CMD_XIMG is not set
  # CONFIG_CMD_LOADB is not set
@@@ -14,14 -14,14 +14,14 @@@ CONFIG_SPL_SERIAL=
  CONFIG_SPL=y
  CONFIG_SYS_MEMTEST_START=0x10000000
  CONFIG_SYS_MEMTEST_END=0x20000000
+ # CONFIG_BOOTM is not set
  CONFIG_SUPPORT_RAW_INITRD=y
 +CONFIG_SYS_PBSIZE=528
  CONFIG_SPL_SYS_MALLOC=y
  CONFIG_SPL_WATCHDOG=y
  CONFIG_HUSH_PARSER=y
  CONFIG_SYS_MAXARGS=32
 -CONFIG_SYS_PBSIZE=528
  # CONFIG_CMD_BOOTD is not set
- # CONFIG_CMD_BOOTM is not set
  # CONFIG_CMD_ELF is not set
  # CONFIG_CMD_IMI is not set
  # CONFIG_CMD_XIMG is not set
@@@ -18,10 -18,9 +18,11 @@@ CONFIG_SYS_MEMTEST_START=0x0000000
  CONFIG_SYS_MEMTEST_END=0x00001000
  # CONFIG_EXPERT is not set
  CONFIG_REMAKE_ELF=y
+ # CONFIG_BOOTM is not set
  # CONFIG_LEGACY_IMAGE_FORMAT is not set
  # CONFIG_AUTOBOOT is not set
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1049
  CONFIG_SYS_CONSOLE_INFO_QUIET=y
  # CONFIG_DISPLAY_CPUINFO is not set
  CONFIG_BOARD_EARLY_INIT_R=y
@@@ -31,9 -30,11 +32,8 @@@ CONFIG_CLOCKS=
  # CONFIG_AUTO_COMPLETE is not set
  # CONFIG_SYS_LONGHELP is not set
  CONFIG_SYS_PROMPT="Versal> "
 -CONFIG_SYS_MAXARGS=64
 -CONFIG_SYS_CBSIZE=1024
 -CONFIG_SYS_PBSIZE=1049
  # CONFIG_CMD_CONSOLE is not set
  # CONFIG_CMD_BOOTD is not set
- # CONFIG_CMD_BOOTM is not set
  # CONFIG_CMD_BOOTI is not set
  # CONFIG_CMD_ELF is not set
  # CONFIG_CMD_FDT is not set
@@@ -15,9 -15,8 +15,10 @@@ CONFIG_DEFAULT_DEVICE_TREE="versal-mini
  CONFIG_SYS_LOAD_ADDR=0x8000000
  # CONFIG_EXPERT is not set
  CONFIG_REMAKE_ELF=y
+ # CONFIG_BOOTM is not set
  # CONFIG_AUTOBOOT is not set
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1049
  CONFIG_SYS_CONSOLE_INFO_QUIET=y
  # CONFIG_DISPLAY_CPUINFO is not set
  CONFIG_BOARD_EARLY_INIT_R=y
@@@ -15,9 -15,8 +15,10 @@@ CONFIG_DEFAULT_DEVICE_TREE="versal-mini
  CONFIG_SYS_LOAD_ADDR=0x8000000
  # CONFIG_EXPERT is not set
  CONFIG_REMAKE_ELF=y
+ # CONFIG_BOOTM is not set
  # CONFIG_AUTOBOOT is not set
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1049
  CONFIG_SYS_CONSOLE_INFO_QUIET=y
  # CONFIG_DISPLAY_CPUINFO is not set
  CONFIG_BOARD_EARLY_INIT_R=y
@@@ -16,9 -16,9 +16,10 @@@ CONFIG_SYS_MEM_RSVD_FOR_MMU=
  CONFIG_VERSAL_NO_DDR=y
  # CONFIG_PSCI_RESET is not set
  CONFIG_SYS_LOAD_ADDR=0x8000000
 +CONFIG_LTO=y
  # CONFIG_EXPERT is not set
  CONFIG_REMAKE_ELF=y
+ # CONFIG_BOOTM is not set
  # CONFIG_AUTOBOOT is not set
  CONFIG_SYS_CONSOLE_INFO_QUIET=y
  # CONFIG_DISPLAY_CPUINFO is not set
@@@ -14,9 -14,9 +14,10 @@@ CONFIG_SYS_MEM_RSVD_FOR_MMU=
  CONFIG_VERSAL_NO_DDR=y
  # CONFIG_PSCI_RESET is not set
  CONFIG_SYS_LOAD_ADDR=0x8000000
 +CONFIG_LTO=y
  # CONFIG_EXPERT is not set
  CONFIG_REMAKE_ELF=y
+ # CONFIG_BOOTM is not set
  # CONFIG_AUTOBOOT is not set
  # CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
  CONFIG_LOGLEVEL=0
@@@ -13,10 -13,9 +13,11 @@@ CONFIG_SYS_LOAD_ADDR=0x800000
  CONFIG_SYS_MEMTEST_START=0x00000000
  CONFIG_SYS_MEMTEST_END=0x00001000
  CONFIG_REMAKE_ELF=y
+ # CONFIG_BOOTM is not set
  # CONFIG_LEGACY_IMAGE_FORMAT is not set
  # CONFIG_AUTOBOOT is not set
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1049
  # CONFIG_DISPLAY_CPUINFO is not set
  # CONFIG_BOARD_LATE_INIT is not set
  CONFIG_CLOCKS=y
@@@ -17,10 -17,9 +17,11 @@@ CONFIG_SYS_LOAD_ADDR=0x800000
  CONFIG_REMAKE_ELF=y
  # CONFIG_MP is not set
  CONFIG_FIT=y
+ # CONFIG_BOOTM is not set
  CONFIG_SUPPORT_RAW_INITRD=y
  # CONFIG_AUTOBOOT is not set
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1049
  # CONFIG_DISPLAY_CPUINFO is not set
  CONFIG_BOARD_EARLY_INIT_R=y
  # CONFIG_BOARD_LATE_INIT is not set
@@@ -17,10 -17,9 +17,11 @@@ CONFIG_SYS_LOAD_ADDR=0x800000
  CONFIG_REMAKE_ELF=y
  # CONFIG_MP is not set
  CONFIG_FIT=y
+ # CONFIG_BOOTM is not set
  CONFIG_SUPPORT_RAW_INITRD=y
  # CONFIG_AUTOBOOT is not set
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1049
  # CONFIG_DISPLAY_CPUINFO is not set
  CONFIG_BOARD_EARLY_INIT_R=y
  # CONFIG_BOARD_LATE_INIT is not set
@@@ -13,10 -13,9 +13,11 @@@ CONFIG_SYS_LOAD_ADDR=0x800000
  CONFIG_REMAKE_ELF=y
  # CONFIG_MP is not set
  CONFIG_FIT=y
+ # CONFIG_BOOTM is not set
  CONFIG_SUPPORT_RAW_INITRD=y
  # CONFIG_AUTOBOOT is not set
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1049
  # CONFIG_DISPLAY_CPUINFO is not set
  CONFIG_BOARD_EARLY_INIT_R=y
  # CONFIG_BOARD_LATE_INIT is not set
@@@ -13,10 -13,9 +13,11 @@@ CONFIG_SYS_LOAD_ADDR=0x800000
  CONFIG_REMAKE_ELF=y
  # CONFIG_MP is not set
  CONFIG_FIT=y
+ # CONFIG_BOOTM is not set
  CONFIG_SUPPORT_RAW_INITRD=y
  # CONFIG_AUTOBOOT is not set
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1049
  # CONFIG_DISPLAY_CPUINFO is not set
  CONFIG_BOARD_EARLY_INIT_R=y
  # CONFIG_BOARD_LATE_INIT is not set
@@@ -19,10 -19,9 +19,11 @@@ CONFIG_SYS_LOAD_ADDR=0x
  CONFIG_REMAKE_ELF=y
  CONFIG_SYS_CUSTOM_LDSCRIPT=y
  CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
+ # CONFIG_BOOTM is not set
  # CONFIG_AUTOBOOT is not set
  CONFIG_USE_PREBOOT=y
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1047
  # CONFIG_DISPLAY_CPUINFO is not set
  # CONFIG_BOARD_LATE_INIT is not set
  CONFIG_CLOCKS=y
@@@ -19,10 -19,9 +19,11 @@@ CONFIG_SYS_LOAD_ADDR=0x
  CONFIG_REMAKE_ELF=y
  CONFIG_SYS_CUSTOM_LDSCRIPT=y
  CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
+ # CONFIG_BOOTM is not set
  # CONFIG_AUTOBOOT is not set
  CONFIG_USE_PREBOOT=y
 +CONFIG_SYS_CBSIZE=1024
 +CONFIG_SYS_PBSIZE=1047
  # CONFIG_DISPLAY_CPUINFO is not set
  # CONFIG_BOARD_LATE_INIT is not set
  CONFIG_CLOCKS=y
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc include/bootm.h
Simple merge
Simple merge
Simple merge