diff mbox

[U-Boot,v2,16/17] rockchip: rk3036: Add core Soc start-up code

Message ID 1446641620-11049-17-git-send-email-hl@rock-chips.com
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Lin Huang Nov. 4, 2015, 12:53 p.m. UTC
rk3036 only 4K size SRAM for SPL, so only support
timer, uart, sdram driver in SPL stage, when finish
initial sdram, back to bootrom.

Signed-off-by: Lin Huang <hl@rock-chips.com>
---
Changes in v1:
- clean copyright announcement
Changes in v2:
- support SPL

 arch/arm/mach-rockchip/Kconfig                  |  10 +-
 arch/arm/mach-rockchip/Makefile                 |   4 +-
 arch/arm/mach-rockchip/board.c                  |   1 +
 arch/arm/mach-rockchip/rk3036-board-spl.c       |  44 +++++++++
 arch/arm/mach-rockchip/rk3036/Kconfig           |  17 ++++
 arch/arm/mach-rockchip/rk3036/Makefile          |   1 +
 arch/arm/mach-rockchip/rk3036/save_boot_param.S |  34 +++++++
 include/configs/rk3036_common.h                 | 120 ++++++++++++++++++++++++
 8 files changed, 229 insertions(+), 2 deletions(-)
 create mode 100644 arch/arm/mach-rockchip/rk3036-board-spl.c
 create mode 100644 arch/arm/mach-rockchip/rk3036/Kconfig
 create mode 100644 arch/arm/mach-rockchip/rk3036/save_boot_param.S
 create mode 100644 include/configs/rk3036_common.h

Comments

Sjoerd Simons Nov. 6, 2015, 9:11 a.m. UTC | #1
On Wed, 2015-11-04 at 20:53 +0800, Lin Huang wrote:
> rk3036 only 4K size SRAM for SPL, so only support
> timer, uart, sdram driver in SPL stage, when finish
> initial sdram, back to bootrom.
> 
> Signed-off-by: Lin Huang <hl@rock-chips.com>


> diff --git a/arch/arm/mach-rockchip/rk3036/save_boot_param.S
> b/arch/arm/mach-rockchip/rk3036/save_boot_param.S
> new file mode 100644
> index 0000000..3d3883d
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/rk3036/save_boot_param.S
> @@ -0,0 +1,34 @@
> +/*
> + * (C) Copyright 2015 Google, Inc
> + *
> + * SPDX-License-Identifier:     GPL-2.0+
> + */
> +
> +#include <linux/linkage.h>
> +
> +.globl	SAVE_SP_ADDR
> +SAVE_SP_ADDR:
> +	.word 0
> +
> +/*******************************************************************
> ******
> + *
> + * void save_boot_params
> + *
> + * Save sp, lr, r1~r12
> + *
> +
> *********************************************************************
> ****/
> +ENTRY(save_boot_params)
> +	push	{r1-r12, lr}
> +	ldr	r0, =SAVE_SP_ADDR
> +	str	sp, [r0]	
> +	b	save_boot_params_ret		@ back to my
> caller
> +ENDPROC(save_boot_params)
> +
> +
> +.globl back_to_bootrom
> +ENTRY(back_to_bootrom)
> +	ldr	r0, =SAVE_SP_ADDR
> +	ldr	sp, [r0]
> +	mov	r0, #0
> +	pop	{r1-r12, pc}
> +ENDPROC(back_to_bootrom)

Is this way of going back to be bootrom generic for other Rockchip SOCs
as well? 

Specifically for RK3288 in maskrom mode we can currently load the 
u-boot SPL, but not the main loader. If we could use this method of
going to the bootrom on that board that should be a nice way forward.


> diff --git a/include/configs/rk3036_common.h
> b/include/configs/rk3036_common.h
> new file mode 100644
> index 0000000..f7bd852
> --- /dev/null
> +++ b/include/configs/rk3036_common.h
> @@ -0,0 +1,120 @@
> +/*
> + * (C) Copyright 2015 Rockchip Electronics Co., Ltd
> + *
> + * SPDX-License-Identifier:     GPL-2.0+
> + */

> +/* RAW SD card / eMMC locations. */
> +#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR	256
> +#define CONFIG_SYS_SPI_U_BOOT_OFFS	(128 << 10)

I don't think you need to define these if you're having the main u-boot 
image loaded by your bootrom rather then SPL directly.

> +/* FAT sd card locations. */
> +#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION	1
> +#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME		"u-boot.img"

ditto

> +/* #define CONFIG_SPL_PINCTRL_SUPPORT
> +#define CONFIG_SPL_GPIO_SUPPORT
> +#define CONFIG_SPL_RAM_SUPPORT
> +#define CONFIG_SPL_DRIVERS_MISC_SUPPORT */
> +
> +#define CONFIG_CMD_CACHE
> +#define CONFIG_CMD_TIME
> +
> +#define CONFIG_SYS_SDRAM_BASE		0x60000000
> +#define CONFIG_NR_DRAM_BANKS		1
> +#define SDRAM_BANK_SIZE			(512UL << 20UL)
> +
> +#define CONFIG_SPI_FLASH
> +#define CONFIG_SPI
> +#define CONFIG_CMD_SF
> +#define CONFIG_CMD_SPI
> +#define CONFIG_SPI_FLASH_GIGADEVICE
> +#define CONFIG_SF_DEFAULT_SPEED 20000000

> +#define CONFIG_CMD_I2C
> +
> +#ifndef CONFIG_SPL_BUILD
> +#include <config_distro_defaults.h>
> +
> +#define ENV_MEM_LAYOUT_SETTINGS \
> +	"scriptaddr=0x00000000\0" \
> +	"pxefile_addr_r=0x00100000\0" \
> +	"fdt_addr_r=0x01f00000\0" \
> +	"kernel_addr_r=0x02000000\0" \
> +	"ramdisk_addr_r=0x04000000\0"

I suspect these offset don't make sense for this board given your
SYS_SDRAM_BASE is 0x60000000

> +/* First try to boot from SD (index 0), then eMMC (index 1 */
> +#define BOOT_TARGET_DEVICES(func) \
> +	func(MMC, mmc, 0) \
> +	func(MMC, mmc, 1)
> +
> +#include <config_distro_bootcmd.h>
> +
> +/* Linux fails to load the fdt if it's loaded above 512M on a Rock 2
> board, so
> + * limit the fdt reallocation to that */

You probably want to change the comment here :)

> +#define CONFIG_EXTRA_ENV_SETTINGS \
> +	"fdt_high=0x1fffffff\0" \

Hopefully the fdt_high isn't needed on 3036? (It's hopefully temporary
as well on 3288 until someone figures out what's wrong.

> +	ENV_MEM_LAYOUT_SETTINGS \
> +	BOOTENV
> +#endif
> +
> +#endif
Eddie Cai Nov. 6, 2015, 9:47 a.m. UTC | #2
Hi Sjoerd

2015-11-06 17:11 GMT+08:00 Sjoerd Simons <sjoerd.simons@collabora.co.uk>:

> On Wed, 2015-11-04 at 20:53 +0800, Lin Huang wrote:
> > rk3036 only 4K size SRAM for SPL, so only support
> > timer, uart, sdram driver in SPL stage, when finish
> > initial sdram, back to bootrom.
> >
> > Signed-off-by: Lin Huang <hl@rock-chips.com>
> >
> >
> > diff --git a/arch/arm/mach-rockchip/rk3036/save_boot_param.S
> > b/arch/arm/mach-rockchip/rk3036/save_boot_param.S
> > new file mode 100644
> > index 0000000..3d3883d
> > --- /dev/null
> > +++ b/arch/arm/mach-rockchip/rk3036/save_boot_param.S
> > @@ -0,0 +1,34 @@
> > +/*
> > + * (C) Copyright 2015 Google, Inc
> > + *
> > + * SPDX-License-Identifier:     GPL-2.0+
> > + */
> > +
> > +#include <linux/linkage.h>
> > +
> > +.globl       SAVE_SP_ADDR
> > +SAVE_SP_ADDR:
> > +     .word 0
> > +
> > +/*******************************************************************
> > ******
> > + *
> > + * void save_boot_params
> > + *
> > + * Save sp, lr, r1~r12
> > + *
> > +
> > *********************************************************************
> > ****/
> > +ENTRY(save_boot_params)
> > +     push    {r1-r12, lr}
> > +     ldr     r0, =SAVE_SP_ADDR
> > +     str     sp, [r0]
> > +     b       save_boot_params_ret            @ back to my
> > caller
> > +ENDPROC(save_boot_params)
> > +
> > +
> > +.globl back_to_bootrom
> > +ENTRY(back_to_bootrom)
> > +     ldr     r0, =SAVE_SP_ADDR
> > +     ldr     sp, [r0]
> > +     mov     r0, #0
> > +     pop     {r1-r12, pc}
> > +ENDPROC(back_to_bootrom)
>
> Is this way of going back to be bootrom generic for other Rockchip SOCs
> as well?
>
Yes

>
> Specifically for RK3288 in maskrom mode we can currently load the
> u-boot SPL, but not the main loader. If we could use this method of
> going to the bootrom on that board that should be a nice way forward.
>
Agree.
Simon.What do you think?

>
>
> > diff --git a/include/configs/rk3036_common.h
> > b/include/configs/rk3036_common.h
> > new file mode 100644
> > index 0000000..f7bd852
> > --- /dev/null
> > +++ b/include/configs/rk3036_common.h
> > @@ -0,0 +1,120 @@
> > +/*
> > + * (C) Copyright 2015 Rockchip Electronics Co., Ltd
> > + *
> > + * SPDX-License-Identifier:     GPL-2.0+
> > + */
> >
> > +/* RAW SD card / eMMC locations. */
> > +#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR      256
> > +#define CONFIG_SYS_SPI_U_BOOT_OFFS   (128 << 10)
>
> I don't think you need to define these if you're having the main u-boot
> image loaded by your bootrom rather then SPL directly.
>
> > +/* FAT sd card locations. */
> > +#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION   1
> > +#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME              "u-boot.img"
>
> ditto
>
> > +/* #define CONFIG_SPL_PINCTRL_SUPPORT
> > +#define CONFIG_SPL_GPIO_SUPPORT
> > +#define CONFIG_SPL_RAM_SUPPORT
> > +#define CONFIG_SPL_DRIVERS_MISC_SUPPORT */
> > +
> > +#define CONFIG_CMD_CACHE
> > +#define CONFIG_CMD_TIME
> > +
> > +#define CONFIG_SYS_SDRAM_BASE                0x60000000
> > +#define CONFIG_NR_DRAM_BANKS         1
> > +#define SDRAM_BANK_SIZE                      (512UL << 20UL)
> > +
> > +#define CONFIG_SPI_FLASH
> > +#define CONFIG_SPI
> > +#define CONFIG_CMD_SF
> > +#define CONFIG_CMD_SPI
> > +#define CONFIG_SPI_FLASH_GIGADEVICE
> > +#define CONFIG_SF_DEFAULT_SPEED 20000000
>
> > +#define CONFIG_CMD_I2C
> > +
> > +#ifndef CONFIG_SPL_BUILD
> > +#include <config_distro_defaults.h>
> > +
> > +#define ENV_MEM_LAYOUT_SETTINGS \
> > +     "scriptaddr=0x00000000\0" \
> > +     "pxefile_addr_r=0x00100000\0" \
> > +     "fdt_addr_r=0x01f00000\0" \
> > +     "kernel_addr_r=0x02000000\0" \
> > +     "ramdisk_addr_r=0x04000000\0"
>
> I suspect these offset don't make sense for this board given your
> SYS_SDRAM_BASE is 0x60000000
>
> > +/* First try to boot from SD (index 0), then eMMC (index 1 */
> > +#define BOOT_TARGET_DEVICES(func) \
> > +     func(MMC, mmc, 0) \
> > +     func(MMC, mmc, 1)
> > +
> > +#include <config_distro_bootcmd.h>
> > +
> > +/* Linux fails to load the fdt if it's loaded above 512M on a Rock 2
> > board, so
> > + * limit the fdt reallocation to that */
>
> You probably want to change the comment here :)
>
> > +#define CONFIG_EXTRA_ENV_SETTINGS \
> > +     "fdt_high=0x1fffffff\0" \
>
> Hopefully the fdt_high isn't needed on 3036? (It's hopefully temporary
> as well on 3288 until someone figures out what's wrong.
>
> > +     ENV_MEM_LAYOUT_SETTINGS \
> > +     BOOTENV
> > +#endif
> > +
> > +#endif
>
> --
> Sjoerd Simons
> Collabora Ltd.
>
>
>
Lin Huang Nov. 6, 2015, 9:59 a.m. UTC | #3
Hi

On 06/11/15 17:11, Sjoerd Simons wrote:
> On Wed, 2015-11-04 at 20:53 +0800, Lin Huang wrote:
>> rk3036 only 4K size SRAM for SPL, so only support
>> timer, uart, sdram driver in SPL stage, when finish
>> initial sdram, back to bootrom.
>>
>> Signed-off-by: Lin Huang <hl@rock-chips.com>
>>   
>>   
>> diff --git a/arch/arm/mach-rockchip/rk3036/save_boot_param.S
>> b/arch/arm/mach-rockchip/rk3036/save_boot_param.S
>> new file mode 100644
>> index 0000000..3d3883d
>> --- /dev/null
>> +++ b/arch/arm/mach-rockchip/rk3036/save_boot_param.S
>> @@ -0,0 +1,34 @@
>> +/*
>> + * (C) Copyright 2015 Google, Inc
>> + *
>> + * SPDX-License-Identifier:     GPL-2.0+
>> + */
>> +
>> +#include <linux/linkage.h>
>> +
>> +.globl	SAVE_SP_ADDR
>> +SAVE_SP_ADDR:
>> +	.word 0
>> +
>> +/*******************************************************************
>> ******
>> + *
>> + * void save_boot_params
>> + *
>> + * Save sp, lr, r1~r12
>> + *
>> +
>> *********************************************************************
>> ****/
>> +ENTRY(save_boot_params)
>> +	push	{r1-r12, lr}
>> +	ldr	r0, =SAVE_SP_ADDR
>> +	str	sp, [r0]	
>> +	b	save_boot_params_ret		@ back to my
>> caller
>> +ENDPROC(save_boot_params)
>> +
>> +
>> +.globl back_to_bootrom
>> +ENTRY(back_to_bootrom)
>> +	ldr	r0, =SAVE_SP_ADDR
>> +	ldr	sp, [r0]
>> +	mov	r0, #0
>> +	pop	{r1-r12, pc}
>> +ENDPROC(back_to_bootrom)
> Is this way of going back to be bootrom generic for other Rockchip SOCs
> as well?
>
> Specifically for RK3288 in maskrom mode we can currently load the
> u-boot SPL, but not the main loader. If we could use this method of
> going to the bootrom on that board that should be a nice way forward.
>
>
>> diff --git a/include/configs/rk3036_common.h
>> b/include/configs/rk3036_common.h
>> new file mode 100644
>> index 0000000..f7bd852
>> --- /dev/null
>> +++ b/include/configs/rk3036_common.h
>> @@ -0,0 +1,120 @@
>> +/*
>> + * (C) Copyright 2015 Rockchip Electronics Co., Ltd
>> + *
>> + * SPDX-License-Identifier:     GPL-2.0+
>> + */
>>   
>> +/* RAW SD card / eMMC locations. */
>> +#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR	256
>> +#define CONFIG_SYS_SPI_U_BOOT_OFFS	(128 << 10)
> I don't think you need to define these if you're having the main u-boot
> image loaded by your bootrom rather then SPL directly.
yes, you are right, i just sended v3, will correct it in v4, thank you.
>> +/* FAT sd card locations. */
>> +#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION	1
>> +#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME		"u-boot.img"
> ditto
>
>> +/* #define CONFIG_SPL_PINCTRL_SUPPORT
>> +#define CONFIG_SPL_GPIO_SUPPORT
>> +#define CONFIG_SPL_RAM_SUPPORT
>> +#define CONFIG_SPL_DRIVERS_MISC_SUPPORT */
>> +
>> +#define CONFIG_CMD_CACHE
>> +#define CONFIG_CMD_TIME
>> +
>> +#define CONFIG_SYS_SDRAM_BASE		0x60000000
>> +#define CONFIG_NR_DRAM_BANKS		1
>> +#define SDRAM_BANK_SIZE			(512UL << 20UL)
>> +
>> +#define CONFIG_SPI_FLASH
>> +#define CONFIG_SPI
>> +#define CONFIG_CMD_SF
>> +#define CONFIG_CMD_SPI
>> +#define CONFIG_SPI_FLASH_GIGADEVICE
>> +#define CONFIG_SF_DEFAULT_SPEED 20000000
>> +#define CONFIG_CMD_I2C
>> +
>> +#ifndef CONFIG_SPL_BUILD
>> +#include <config_distro_defaults.h>
>> +
>> +#define ENV_MEM_LAYOUT_SETTINGS \
>> +	"scriptaddr=0x00000000\0" \
>> +	"pxefile_addr_r=0x00100000\0" \
>> +	"fdt_addr_r=0x01f00000\0" \
>> +	"kernel_addr_r=0x02000000\0" \
>> +	"ramdisk_addr_r=0x04000000\0"
> I suspect these offset don't make sense for this board given your
> SYS_SDRAM_BASE is 0x60000000
     Have been correct in v3 patch.
>> +/* First try to boot from SD (index 0), then eMMC (index 1 */
>> +#define BOOT_TARGET_DEVICES(func) \
>> +	func(MMC, mmc, 0) \
>> +	func(MMC, mmc, 1)
>> +
>> +#include <config_distro_bootcmd.h>
>> +
>> +/* Linux fails to load the fdt if it's loaded above 512M on a Rock 2
>> board, so
>> + * limit the fdt reallocation to that */
> You probably want to change the comment here :)
>
     yes, will modify it in v4
>> +#define CONFIG_EXTRA_ENV_SETTINGS \
>> +	"fdt_high=0x1fffffff\0" \
> Hopefully the fdt_high isn't needed on 3036? (It's hopefully temporary
> as well on 3288 until someone figures out what's wrong.
     sorry, i am not very clear why 3288 need it.
>> +	ENV_MEM_LAYOUT_SETTINGS \
>> +	BOOTENV
>> +#endif
>> +
>> +#endif
diff mbox

Patch

diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
index da665ef..6b608db 100644
--- a/arch/arm/mach-rockchip/Kconfig
+++ b/arch/arm/mach-rockchip/Kconfig
@@ -9,6 +9,14 @@  config ROCKCHIP_RK3288
 	  and video codec support. Peripherals include Gigabit Ethernet,
 	  USB2 host and OTG, SDIO, I2S, UART,s, SPI, I2C and PWMs.
 
+config ROCKCHIP_RK3036
+	bool "Support Rockchip RK3036"
+	help
+	  The Rockchip RK3036 is a ARM-based SoC with a dual-core Cortex-A7
+	  including NEON and GPU, Mali-400 graphics, several DDR3 options
+	  and video codec support. Peripherals include Gigabit Ethernet,
+	  USB2 host and OTG, SDIO, I2S, UART, SPI, I2C and PWMs.
+
 config SYS_MALLOC_F
 	default y
 
@@ -34,5 +42,5 @@  config ROCKCHIP_SERIAL
 	default y
 
 source "arch/arm/mach-rockchip/rk3288/Kconfig"
-
+source "arch/arm/mach-rockchip/rk3036/Kconfig"
 endif
diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
index a29675d..b703c3c 100644
--- a/arch/arm/mach-rockchip/Makefile
+++ b/arch/arm/mach-rockchip/Makefile
@@ -6,10 +6,12 @@ 
 
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board-spl.o
+obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o
 else
-obj-y += board.o
+obj-$(CONFIG_ROCKCHIP_RK3288) += board.o
 endif
 obj-y += rk_timer.o
 obj-y += rk_early_print.o
 obj-$(CONFIG_$(SPL_)ROCKCHIP_COMMON) += common.o
 obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288/
+obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036/
diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c
index 688bc0f..d7a8312 100644
--- a/arch/arm/mach-rockchip/board.c
+++ b/arch/arm/mach-rockchip/board.c
@@ -4,6 +4,7 @@ 
  * SPDX-License-Identifier:     GPL-2.0+
  */
 
+#include <asm/io.h>
 #include <common.h>
 #include <dm.h>
 #include <ram.h>
diff --git a/arch/arm/mach-rockchip/rk3036-board-spl.c b/arch/arm/mach-rockchip/rk3036-board-spl.c
new file mode 100644
index 0000000..734dfe5
--- /dev/null
+++ b/arch/arm/mach-rockchip/rk3036-board-spl.c
@@ -0,0 +1,44 @@ 
+/*
+ * (C) Copyright 2015 Google, Inc
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+#include <asm/arch/grf_rk3036.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/sdram_rk3036.h>
+#include <asm/arch/timer.h>
+#include <asm/arch/uart.h>
+#include <asm/io.h>
+#include <common.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define GRF_BASE	0x20008000
+static struct rk3036_grf * const grf = (void *)GRF_BASE;
+
+extern void back_to_bootrom(void);
+
+void board_init_f(ulong dummy)
+{
+	//Debug UART can be used from here if required:
+	rk_clrsetreg(&grf->gpio1c_iomux,
+				GPIO1C3_MASK << GPIO1C3_SHIFT |
+				GPIO1C2_MASK << GPIO1C2_SHIFT,
+				GPIO1C3_UART2_SOUT << GPIO1C3_SHIFT |
+				GPIO1C2_UART2_SIN << GPIO1C2_SHIFT);
+	rk_uart_init();
+	rockchip_timer_init();
+	sdram_init();
+
+	/* return to maskrom */
+	back_to_bootrom();
+}
+
+/* Place Holders */
+void board_init_r(gd_t *id, ulong dest_addr)
+{
+	/* Function attribute is no-return */
+	/* This Function never executes */
+	while (1)
+		;
+}
diff --git a/arch/arm/mach-rockchip/rk3036/Kconfig b/arch/arm/mach-rockchip/rk3036/Kconfig
new file mode 100644
index 0000000..0fbc58e
--- /dev/null
+++ b/arch/arm/mach-rockchip/rk3036/Kconfig
@@ -0,0 +1,17 @@ 
+if ROCKCHIP_RK3036
+
+config TARGET_EVB_RK3036
+	bool "EVB_RK3036"
+
+config SYS_SOC
+	default "rockchip"
+
+config SYS_MALLOC_F_LEN
+	default 0x400
+
+config ROCKCHIP_COMMON
+	bool "Support rk common fuction"
+
+source "board/evb_rk3036/evb_rk3036/Kconfig"
+
+endif
diff --git a/arch/arm/mach-rockchip/rk3036/Makefile b/arch/arm/mach-rockchip/rk3036/Makefile
index 6095777..97d299d 100644
--- a/arch/arm/mach-rockchip/rk3036/Makefile
+++ b/arch/arm/mach-rockchip/rk3036/Makefile
@@ -10,3 +10,4 @@  obj-y += syscon_rk3036.o
 endif
 
 obj-y += sdram_rk3036.o
+obj-y += save_boot_param.o
diff --git a/arch/arm/mach-rockchip/rk3036/save_boot_param.S b/arch/arm/mach-rockchip/rk3036/save_boot_param.S
new file mode 100644
index 0000000..3d3883d
--- /dev/null
+++ b/arch/arm/mach-rockchip/rk3036/save_boot_param.S
@@ -0,0 +1,34 @@ 
+/*
+ * (C) Copyright 2015 Google, Inc
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <linux/linkage.h>
+
+.globl	SAVE_SP_ADDR
+SAVE_SP_ADDR:
+	.word 0
+
+/*************************************************************************
+ *
+ * void save_boot_params
+ *
+ * Save sp, lr, r1~r12
+ *
+ *************************************************************************/
+ENTRY(save_boot_params)
+	push	{r1-r12, lr}
+	ldr	r0, =SAVE_SP_ADDR
+	str	sp, [r0]	
+	b	save_boot_params_ret		@ back to my caller
+ENDPROC(save_boot_params)
+
+
+.globl back_to_bootrom
+ENTRY(back_to_bootrom)
+	ldr	r0, =SAVE_SP_ADDR
+	ldr	sp, [r0]
+	mov	r0, #0
+	pop	{r1-r12, pc}
+ENDPROC(back_to_bootrom)
diff --git a/include/configs/rk3036_common.h b/include/configs/rk3036_common.h
new file mode 100644
index 0000000..f7bd852
--- /dev/null
+++ b/include/configs/rk3036_common.h
@@ -0,0 +1,120 @@ 
+/*
+ * (C) Copyright 2015 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+#ifndef __CONFIG_RK3036_COMMON_H
+#define __CONFIG_RK3036_COMMON_H
+
+#include <asm/arch/hardware.h>
+
+#define CONFIG_SYS_NO_FLASH
+#define CONFIG_NR_DRAM_BANKS		1
+#define CONFIG_ENV_IS_NOWHERE
+#define CONFIG_ENV_SIZE			0x2000
+#define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_SYS_MAXARGS		16
+#define CONFIG_BAUDRATE			115200
+#define CONFIG_SYS_MALLOC_LEN		(32 << 20)
+#define CONFIG_SYS_CBSIZE		1024
+#define CONFIG_SKIP_LOWLEVEL_INIT
+#define CONFIG_SYS_THUMB_BUILD
+/* #define CONFIG_OF_LIBFDT */
+#define CONFIG_DISPLAY_BOARDINFO
+
+#define CONFIG_SYS_TIMER_RATE		(24 * 1000 * 1000)
+#define CONFIG_SYS_TIMER_BASE		0x200440a0 /* TIMER5 */
+#define CONFIG_SYS_TIMER_COUNTER	(CONFIG_SYS_TIMER_BASE + 8)
+
+/* #define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_SERIAL_SUPPORT */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_MEM32
+/* #define CONFIG_SPL_BOARD_INIT */
+
+#ifdef CONFIG_SPL_BUILD
+#define CONFIG_SYS_MALLOC_SIMPLE
+#endif
+
+#define CONFIG_SYS_TEXT_BASE		0x60000000
+#define CONFIG_SYS_INIT_SP_ADDR		0x60100000
+#define CONFIG_SYS_LOAD_ADDR		0x60800800
+#define CONFIG_SPL_STACK		0x10081fff
+#define CONFIG_SPL_TEXT_BASE		0x10081004
+
+#define CONFIG_ROCKCHIP_COMMON
+
+/* MMC/SD IP block */
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_SDHCI
+#define CONFIG_ROCKCHIP_3036_DWMMC
+#define CONFIG_BOUNCE_BUFFER
+
+#define CONFIG_DOS_PARTITION
+#define CONFIG_CMD_FAT
+#define CONFIG_FAT_WRITE
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_EXT4
+#define CONFIG_CMD_FS_GENERIC
+#define CONFIG_PARTITION_UUIDS
+#define CONFIG_CMD_PART
+
+/* RAW SD card / eMMC locations. */
+#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR	256
+#define CONFIG_SYS_SPI_U_BOOT_OFFS	(128 << 10)
+
+/* FAT sd card locations. */
+#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION	1
+#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME		"u-boot.img"
+
+/* #define CONFIG_SPL_PINCTRL_SUPPORT
+#define CONFIG_SPL_GPIO_SUPPORT
+#define CONFIG_SPL_RAM_SUPPORT
+#define CONFIG_SPL_DRIVERS_MISC_SUPPORT */
+
+#define CONFIG_CMD_CACHE
+#define CONFIG_CMD_TIME
+
+#define CONFIG_SYS_SDRAM_BASE		0x60000000
+#define CONFIG_NR_DRAM_BANKS		1
+#define SDRAM_BANK_SIZE			(512UL << 20UL)
+
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI
+#define CONFIG_CMD_SF
+#define CONFIG_CMD_SPI
+#define CONFIG_SPI_FLASH_GIGADEVICE
+#define CONFIG_SF_DEFAULT_SPEED 20000000
+
+#define CONFIG_CMD_I2C
+
+#ifndef CONFIG_SPL_BUILD
+#include <config_distro_defaults.h>
+
+#define ENV_MEM_LAYOUT_SETTINGS \
+	"scriptaddr=0x00000000\0" \
+	"pxefile_addr_r=0x00100000\0" \
+	"fdt_addr_r=0x01f00000\0" \
+	"kernel_addr_r=0x02000000\0" \
+	"ramdisk_addr_r=0x04000000\0"
+
+/* First try to boot from SD (index 0), then eMMC (index 1 */
+#define BOOT_TARGET_DEVICES(func) \
+	func(MMC, mmc, 0) \
+	func(MMC, mmc, 1)
+
+#include <config_distro_bootcmd.h>
+
+/* Linux fails to load the fdt if it's loaded above 512M on a Rock 2 board, so
+ * limit the fdt reallocation to that */
+#define CONFIG_EXTRA_ENV_SETTINGS \
+	"fdt_high=0x1fffffff\0" \
+	ENV_MEM_LAYOUT_SETTINGS \
+	BOOTENV
+#endif
+
+#endif