spl: add a 'return to bootrom' boot method
authorPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Thu, 22 Jun 2017 21:38:36 +0000 (23:38 +0200)
committerPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Sun, 13 Aug 2017 15:12:19 +0000 (17:12 +0200)
Some devices (e.g. the RK3368) have only limited SRAM, but provide
support for loading the next boot stage after our SPL performs basic
setup (e.g. DRAM).

For target systems like these, we add a boot device BOOTROM that will
invoke a board-specific hook to return to the bootrom (if supported).

Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/arm/include/asm/spl.h
common/spl/Kconfig
common/spl/Makefile
common/spl/spl_bootrom.c [new file with mode: 0644]
include/spl.h

index 0e674704ab6d020a260b78f548bbc07838a038ab..df45511699099c759ada76f2e26f0e5d34f9dac9 100644 (file)
@@ -30,6 +30,7 @@ enum {
        BOOT_DEVICE_BOARD,
        BOOT_DEVICE_DFU,
        BOOT_DEVICE_XIP,
+       BOOT_DEVICE_BOOTROM,
        BOOT_DEVICE_NONE
 };
 #endif
index 4de81392b0260464e30bcb67265ed6b598e7c279..ee767b7d180883c7d268e407026e7a2f2aaa7feb 100644 (file)
@@ -25,6 +25,17 @@ config SPL_BOARD_INIT
          spl_board_init() from board_init_r(). This function should be
          provided by the board.
 
+config SPL_BOOTROM_SUPPORT
+        bool "Support returning to the BOOTROM"
+       help
+         Some platforms (e.g. the Rockchip RK3368) provide support in their
+         ROM for loading the next boot-stage after performing basic setup
+         from the SPL stage.
+
+         Enable this option, to return to the BOOTROM through the
+         BOOT_DEVICE_BOOTROM (or fall-through to the next boot device in the
+         boot device list, if not implemented for a given board)
+
 config SPL_RAW_IMAGE_SUPPORT
        bool "Support SPL loading and booting of RAW images"
        default n if (ARCH_MX6 && (SPL_MMC_SUPPORT || SPL_SATA_SUPPORT))
index 47a64dd7d0cdaca517e108eaa8cf4b4e82f27341..189b2727d3cb4793068668f614c05911378b47e5 100644 (file)
@@ -10,6 +10,7 @@
 
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_SPL_FRAMEWORK) += spl.o
+obj-$(CONFIG_SPL_BOOTROM_SUPPORT) += spl_bootrom.o
 obj-$(CONFIG_SPL_LOAD_FIT) += spl_fit.o
 obj-$(CONFIG_SPL_NOR_SUPPORT) += spl_nor.o
 obj-$(CONFIG_SPL_XIP_SUPPORT) += spl_xip.o
diff --git a/common/spl/spl_bootrom.c b/common/spl/spl_bootrom.c
new file mode 100644 (file)
index 0000000..6804246
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2017 Theobroma Systems Design und Consulting GmH
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <spl.h>
+
+__weak void board_return_to_bootrom(void)
+{
+}
+
+static int spl_return_to_bootrom(struct spl_image_info *spl_image,
+                                struct spl_boot_device *bootdev)
+{
+       /*
+        * If the board implements a way to return to its ROM (with
+        * the expectation that the next stage of will be booted by
+        * the ROM), it will implement board_return_to_bootrom() and
+        * should not return from it.
+        */
+       board_return_to_bootrom();
+       return false;
+}
+
+SPL_LOAD_IMAGE_METHOD("BOOTROM", 0, BOOT_DEVICE_BOOTROM, spl_return_to_bootrom);
index ffadce93c7be28ac6b409f28ff7eeaed3a37da71..ce4cf0abbebb6e599d7b8727afbf65fe80bfe348 100644 (file)
@@ -268,4 +268,14 @@ int spl_mmc_load_image(struct spl_image_info *spl_image,
                       struct spl_boot_device *bootdev);
 
 void bl31_entry(void);
+
+/**
+ * board_return_to_bootrom - allow for boards to continue with the boot ROM
+ *
+ * If a board (e.g. the Rockchip RK3368 boards) provide some
+ * supporting functionality for SPL in their boot ROM and the SPL
+ * stage wants to return to the ROM code to continue booting, boards
+ * can implement 'board_return_to_bootrom'.
+ */
+void board_return_to_bootrom(void);
 #endif