Pārlūkot izejas kodu

rockchip: add option to change method of loading u-boot

If we would like to boot from SD card, we have to implement mmc driver
in SPL stage, and get a slightly large SPL binary. Rockchip SoC's
bootrom code has the ability to load spl and u-boot, then boot.

If CONFIG_ROCKCHIP_SPL_BACK_TO_BROM is enabled, the spl will return to
bootrom in board_init_f(), then bootrom loads u-boot binary.

Loading sequence after rework:
bootrom ==> spl ==> bootrom ==> u-boot

Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
Acked-by: Simon Glass <sjg@chromium.org>
Fixed up spelling of U-Boot, boorom, opinion->option, Rochchip:
Signed-off-by: Simon Glass <sjg@chromium.org>
Xu Ziyuan 9 gadi atpakaļ
vecāks
revīzija
b47ea79219

+ 8 - 0
arch/arm/mach-rockchip/Kconfig

@@ -17,6 +17,14 @@ config ROCKCHIP_RK3036
 	  and video codec support. Peripherals include Gigabit Ethernet,
 	  and video codec support. Peripherals include Gigabit Ethernet,
 	  USB2 host and OTG, SDIO, I2S, UART, SPI, I2C and PWMs.
 	  USB2 host and OTG, SDIO, I2S, UART, SPI, I2C and PWMs.
 
 
+config ROCKCHIP_SPL_BACK_TO_BROM
+	bool "SPL returns to bootrom"
+	default y if ROCKCHIP_RK3036
+	help
+	  Rockchip SoCs have ability to load SPL & U-Boot binary. If enabled,
+          SPL will return to the boot rom, which will then load the U-Boot
+          binary to keep going on.
+
 source "arch/arm/mach-rockchip/rk3288/Kconfig"
 source "arch/arm/mach-rockchip/rk3288/Kconfig"
 source "arch/arm/mach-rockchip/rk3036/Kconfig"
 source "arch/arm/mach-rockchip/rk3036/Kconfig"
 endif
 endif

+ 1 - 0
arch/arm/mach-rockchip/Makefile

@@ -7,6 +7,7 @@
 ifdef CONFIG_SPL_BUILD
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board-spl.o
 obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board-spl.o
 obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o
 obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o
+obj-$(CONFIG_ROCKCHIP_SPL_BACK_TO_BROM) += save_boot_param.o
 else
 else
 obj-$(CONFIG_ROCKCHIP_RK3288) += board.o
 obj-$(CONFIG_ROCKCHIP_RK3288) += board.o
 endif
 endif

+ 33 - 0
arch/arm/mach-rockchip/board.c

@@ -10,12 +10,45 @@
 #include <ram.h>
 #include <ram.h>
 #include <asm/io.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/clock.h>
+#include <asm/arch/periph.h>
+#include <asm/gpio.h>
+#include <dm/pinctrl.h>
 
 
 DECLARE_GLOBAL_DATA_PTR;
 DECLARE_GLOBAL_DATA_PTR;
 
 
 int board_init(void)
 int board_init(void)
 {
 {
+#ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
+	struct udevice *pinctrl;
+	int ret;
+
+    /*
+     * We need to implement sdcard iomux here for the further
+     * initlization, otherwise, it'll hit sdcard command sending
+     * timeout exception.
+     */
+	ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
+	if (ret) {
+		debug("%s: Cannot find pinctrl device\n", __func__);
+		goto err;
+	}
+	ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
+	if (ret) {
+		debug("%s: Failed to set up SD card\n", __func__);
+		goto err;
+	}
+
+	return 0;
+err:
+	printf("board_init: Error %d\n", ret);
+
+	/* No way to report error here */
+	hang();
+
+	return -1;
+#else
 	return 0;
 	return 0;
+#endif
 }
 }
 
 
 int dram_init(void)
 int dram_init(void)

+ 0 - 1
arch/arm/mach-rockchip/rk3036/Makefile

@@ -10,4 +10,3 @@ obj-y += syscon_rk3036.o
 endif
 endif
 
 
 obj-y += sdram_rk3036.o
 obj-y += sdram_rk3036.o
-obj-y += save_boot_param.o

+ 4 - 1
arch/arm/mach-rockchip/rk3288-board-spl.c

@@ -149,7 +149,7 @@ static int configure_emmc(struct udevice *pinctrl)
 	return 0;
 	return 0;
 }
 }
 #endif
 #endif
-
+extern void back_to_bootrom(void);
 void board_init_f(ulong dummy)
 void board_init_f(ulong dummy)
 {
 {
 	struct udevice *pinctrl;
 	struct udevice *pinctrl;
@@ -204,6 +204,9 @@ void board_init_f(ulong dummy)
 		debug("DRAM init failed: %d\n", ret);
 		debug("DRAM init failed: %d\n", ret);
 		return;
 		return;
 	}
 	}
+#ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
+	back_to_bootrom();
+#endif
 }
 }
 
 
 static int setup_led(void)
 static int setup_led(void)

+ 1 - 1
arch/arm/mach-rockchip/rk3036/save_boot_param.S → arch/arm/mach-rockchip/save_boot_param.S

@@ -1,5 +1,5 @@
 /*
 /*
- * (C) Copyright 2015 Google, Inc
+ * (C) Copyright 2016 Rockchip Electronics Co., Ltd
  *
  *
  * SPDX-License-Identifier:     GPL-2.0+
  * SPDX-License-Identifier:     GPL-2.0+
  */
  */

+ 14 - 0
doc/README.rockchip

@@ -119,6 +119,20 @@ something like:
    Hit any key to stop autoboot:  0
    Hit any key to stop autoboot:  0
    =>
    =>
 
 
+The rockchip bootrom can load and boot an initial spl, then continue to
+load a second-level bootloader(ie. U-BOOT) as soon as it returns to bootrom.
+Therefore RK3288 has another loading sequence like RK3036. The option of
+U-Boot is controlled with this setting in U-Boot:
+
+	#define CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
+
+You can create the image via the following operations:
+
+   ./firefly-rk3288/tools/mkimage -n rk3288 -T rksd -d \
+	firefly-rk3288/spl/u-boot-spl-dtb.bin out && \
+   cat firefly-rk3288/u-boot-dtb.bin >> out && \
+   sudo dd if=out of=/dev/sdc seek=64
+
 If you have an HDMI cable attached you should see a video console.
 If you have an HDMI cable attached you should see a video console.
 
 
 For evb_rk3036 board:
 For evb_rk3036 board:

+ 5 - 0
include/configs/rk3288_common.h

@@ -33,7 +33,12 @@
 #define CONFIG_SYS_NS16550_MEM32
 #define CONFIG_SYS_NS16550_MEM32
 #define CONFIG_SPL_BOARD_INIT
 #define CONFIG_SPL_BOARD_INIT
 
 
+#ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
+/* Bootrom will load u-boot binary to 0x0 once return from SPL */
+#define CONFIG_SYS_TEXT_BASE		0x00000000
+#else
 #define CONFIG_SYS_TEXT_BASE		0x00100000
 #define CONFIG_SYS_TEXT_BASE		0x00100000
+#endif
 #define CONFIG_SYS_INIT_SP_ADDR		0x00100000
 #define CONFIG_SYS_INIT_SP_ADDR		0x00100000
 #define CONFIG_SYS_LOAD_ADDR		0x00800800
 #define CONFIG_SYS_LOAD_ADDR		0x00800800
 #define CONFIG_SPL_STACK		0xff718000
 #define CONFIG_SPL_STACK		0xff718000