Merge tag 'u-boot-atmel-fixes-2020.07-a' of https://gitlab.denx.de/u-boot/custodians...
[oweals/u-boot.git] / arch / sandbox / cpu / spl.c
index 4cee293f76a96adad96767f3e72018c09070d724..7ab8919eb9091e2ffdf1a1d8c2e0afd87065bf23 100644 (file)
@@ -1,10 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (c) 2016 Google, Inc
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <dm.h>
+#include <hang.h>
+#include <init.h>
+#include <log.h>
 #include <os.h>
 #include <spl.h>
 #include <asm/spl.h>
@@ -12,6 +15,7 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/* SPL / TPL init function */
 void board_init_f(ulong flag)
 {
        struct sandbox_state *state = state_get_current();
@@ -25,7 +29,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 +38,53 @@ 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(struct spl_boot_device *bootdev)
-{
-       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", 9, 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;
+
+       if (fname) {
+               os_fd_restore();
+               os_spl_to_uboot(fname);
+       } else {
+               printf("No filename provided for U-Boot\n");
+       }
+       hang();
+}
+
+int handoff_arch_save(struct spl_handoff *ho)
+{
+       ho->arch.magic = TEST_HANDOFF_MAGIC;
 
-       /*
-       * 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))
-               ;
+       return 0;
 }