Merge branch 'master' of git://git.denx.de/u-boot-spi
[platform/kernel/u-boot.git] / arch / sandbox / cpu / spl.c
index e8349c0..5005ed2 100644 (file)
@@ -1,6 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (c) 2016 Google, Inc
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
@@ -25,7 +25,8 @@ u32 spl_boot_device(void)
        return BOOT_DEVICE_BOARD;
 }
 
-void spl_board_announce_boot_device(void)
+static int spl_board_load_image(struct spl_image_info *spl_image,
+                               struct spl_boot_device *bootdev)
 {
        char fname[256];
        int ret;
@@ -33,36 +34,42 @@ void spl_board_announce_boot_device(void)
        ret = os_find_u_boot(fname, sizeof(fname));
        if (ret) {
                printf("(%s not found, error %d)\n", fname, ret);
-               return;
+               return ret;
        }
-       printf("%s\n", fname);
-}
 
-int spl_board_load_image(void)
-{
-       char fname[256];
-       int ret;
+       /* Set up spl_image to boot from jump_to_image_no_args() */
+       spl_image->arg = strdup(fname);
+       if (!spl_image->arg)
+               return log_msg_ret("Setup exec filename", -ENOMEM);
 
-       ret = os_find_u_boot(fname, sizeof(fname));
-       if (ret)
-               return ret;
-
-       /* Hopefully this will not return */
-       return os_spl_to_uboot(fname);
+       return 0;
 }
+SPL_LOAD_IMAGE_METHOD("sandbox", 0, BOOT_DEVICE_BOARD, spl_board_load_image);
 
 void spl_board_init(void)
 {
+       struct sandbox_state *state = state_get_current();
        struct udevice *dev;
 
        preloader_console_init();
+       if (state->show_of_platdata) {
+               /*
+                * Scan all the devices so that we can output their platform
+                * data. See sandbox_spl_probe().
+                */
+               printf("Scanning misc devices\n");
+               for (uclass_first_device(UCLASS_MISC, &dev);
+                    dev;
+                    uclass_next_device(&dev))
+                       ;
+       }
+}
+
+void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
+{
+       const char *fname = spl_image->arg;
 
-       /*
-       * Scan all the devices so that we can output their platform data. See
-       * sandbox_spl_probe().
-       */
-       for (uclass_first_device(UCLASS_MISC, &dev);
-       dev;
-       uclass_next_device(&dev))
-               ;
+       os_fd_restore();
+       os_spl_to_uboot(fname);
+       hang();
 }