From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andy Yan Date: Tue, 21 Nov 2017 08:48:51 +0800 Subject: [U-Boot] [U-Boot, v3, 1/3] rockchip: make boot_mode related codes reused across all platforms In-Reply-To: References: <1507705216-10673-1-git-send-email-andy.yan@rock-chips.com> Message-ID: <2d2fa9bb-ae23-b673-9319-bdf28972cba7@rock-chips.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit To: u-boot@lists.denx.de Hi Philipp: On 2017年11月20日 22:50, Philipp Tomsich wrote: > > > On Wed, 11 Oct 2017, Andy Yan wrote: > >> setup_boot_mode function use the same logic but different >> mode register address across all the rockchip platforms, >> so it's better to make this function reused across all the >> platforms, and let the mode register address setting from >> the config file. >> >> Signed-off-by: Andy Yan >> Reviewed-by: Simon Glass >> Acked-by: Philipp Tomsich > > Reviewed-by: Philipp Tomsich > > See below for a suggestion... > >> --- >> >> Changes in v3: >> - add support for rk3188 >> >> Changes in v2: >> - correct the rk322x boot mode register address >> - make the help text more clear >> >> arch/arm/include/asm/arch-rockchip/boot_mode.h |  2 ++ >> arch/arm/mach-rockchip/Kconfig                 | 15 ++++++++++++ >> arch/arm/mach-rockchip/Makefile                |  6 +++++ >> arch/arm/mach-rockchip/boot_mode.c             | 33 >> ++++++++++++++++++++++++++ >> arch/arm/mach-rockchip/rk3036-board.c          | 24 ------------------- >> arch/arm/mach-rockchip/rk3188-board.c          |  1 + >> arch/arm/mach-rockchip/rk322x-board.c          | 24 ------------------- >> arch/arm/mach-rockchip/rk3288-board.c          | 25 ------------------- >> arch/arm/mach-rockchip/rk3399-board.c          | 14 +++++++++++ >> 9 files changed, 71 insertions(+), 73 deletions(-) >> create mode 100644 arch/arm/mach-rockchip/boot_mode.c >> create mode 100644 arch/arm/mach-rockchip/rk3399-board.c >> >> diff --git a/arch/arm/include/asm/arch-rockchip/boot_mode.h >> b/arch/arm/include/asm/arch-rockchip/boot_mode.h >> index bd65f60..163b2e7 100644 >> --- a/arch/arm/include/asm/arch-rockchip/boot_mode.h >> +++ b/arch/arm/include/asm/arch-rockchip/boot_mode.h >> @@ -16,4 +16,6 @@ >> /* enter usb mass storage mode */ >> #define BOOT_UMS        (REBOOT_FLAG + 12) >> >> +int setup_boot_mode(void); >> + >> #endif >> diff --git a/arch/arm/mach-rockchip/Kconfig >> b/arch/arm/mach-rockchip/Kconfig >> index 36df484..6144057 100644 >> --- a/arch/arm/mach-rockchip/Kconfig >> +++ b/arch/arm/mach-rockchip/Kconfig >> @@ -117,6 +117,7 @@ config ROCKCHIP_RK3399 >>     select SPL_SERIAL_SUPPORT >>     select SPL_DRIVERS_MISC_SUPPORT >>     select DEBUG_UART_BOARD_INIT >> +    select BOARD_LATE_INIT >>     help >>       The Rockchip RK3399 is a ARM-based SoC with a dual-core Cortex-A72 >>       and quad-core Cortex-A53. >> @@ -152,6 +153,20 @@ config TPL_ROCKCHIP_BACK_TO_BROM >>           SPL will return to the boot rom, which will then load the >> U-Boot >>           binary to keep going on. >> >> +config ROCKCHIP_BOOT_MODE_REG >> +    hex "Rockchip boot mode flag register address" >> +    default 0x200081c8 if ROCKCHIP_RK3036 >> +    default 0x20004040 if ROCKCHIP_RK3188 >> +    default 0x110005c8 if ROCKCHIP_RK322X >> +    default 0xff730094 if ROCKCHIP_RK3288 >> +    default 0xff738200 if ROCKCHIP_RK3368 >> +    default 0xff320300 if ROCKCHIP_RK3399 >> +    default 0x10300580 if ROCKCHIP_RV1108 >> +    default 0 >> +    help >> +      The Soc will enter to different boot mode(defined in >> asm/arch/boot_mode.h) >> +      according to the value from this register. >> + >> config ROCKCHIP_SPL_RESERVE_IRAM >>     hex "Size of IRAM reserved in SPL" >>     default 0x4000 >> diff --git a/arch/arm/mach-rockchip/Makefile >> b/arch/arm/mach-rockchip/Makefile >> index c15e9bf..2127f2b 100644 >> --- a/arch/arm/mach-rockchip/Makefile >> +++ b/arch/arm/mach-rockchip/Makefile >> @@ -22,10 +22,16 @@ obj-spl-$(CONFIG_ROCKCHIP_RK3368) += >> rk3368-board-spl.o spl-boot-order.o >> obj-spl-$(CONFIG_ROCKCHIP_RK3399) += rk3399-board-spl.o spl-boot-order.o >> >> ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),) >> + >> +ifneq ($(CONFIG_ROCKCHIP_BOOT_MODE_REG),0) >> +obj-y += boot_mode.o >> +endif >> + >> obj-$(CONFIG_ROCKCHIP_RK3188) += rk3188-board.o >> obj-$(CONFIG_ROCKCHIP_RK322X) += rk322x-board.o >> obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board.o >> obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board.o >> +obj-$(CONFIG_ROCKCHIP_RK3399) += rk3399-board.o >> endif >> >> obj-$(CONFIG_$(SPL_TPL_)RAM) += sdram_common.o >> diff --git a/arch/arm/mach-rockchip/boot_mode.c >> b/arch/arm/mach-rockchip/boot_mode.c >> new file mode 100644 >> index 0000000..4652490 >> --- /dev/null >> +++ b/arch/arm/mach-rockchip/boot_mode.c >> @@ -0,0 +1,33 @@ >> +/* >> + * (C) Copyright 2016 Rockchip Electronics Co., Ltd >> + * >> + * SPDX-License-Identifier:     GPL-2.0+ >> + */ >> + >> +#include >> +#include >> +#include >> + >> +int setup_boot_mode(void) >> +{ >> +    void *reg = (void *)CONFIG_ROCKCHIP_BOOT_MODE_REG; > > I am somewhat uneasy about this... could we use a syscon/regmap instead > that will map to something different on each device?  I am thinking of > something along the lines of "syscon_get_first_range(ROCKCHIP_BOOTMODE)".  The reason why we put the BOOTMODE register in Kconfig is because that we also need to access the resister in function save_boot_params(see patch 2/3) to check the BROM_DNL flag, we have no way to access the dtb or syscon driver at that point(it's the first step we enter the tpl/spl world from bootrom). > >> +    int boot_mode = readl(reg); >> + >> +    debug("boot mode %x.\n", boot_mode); >> + >> +    /* Clear boot mode */ >> +    writel(BOOT_NORMAL, reg); >> + >> +    switch (boot_mode) { >> +    case BOOT_FASTBOOT: >> +        printf("enter fastboot!\n"); >> +        env_set("preboot", "setenv preboot; fastboot usb0"); >> +        break; >> +    case BOOT_UMS: >> +        printf("enter UMS!\n"); >> +        env_set("preboot", "setenv preboot; ums mmc 0"); >> +        break; >> +    } >> + >> +    return 0; >> +} >> diff --git a/arch/arm/mach-rockchip/rk3036-board.c >> b/arch/arm/mach-rockchip/rk3036-board.c >> index a3457f3..a5d2571 100644 >> --- a/arch/arm/mach-rockchip/rk3036-board.c >> +++ b/arch/arm/mach-rockchip/rk3036-board.c >> @@ -19,30 +19,6 @@ >> >> DECLARE_GLOBAL_DATA_PTR; >> >> -#define GRF_BASE    0x20008000 >> - >> -static void setup_boot_mode(void) >> -{ >> -    struct rk3036_grf *const grf = (void *)GRF_BASE; >> -    int boot_mode = readl(&grf->os_reg[4]); >> - >> -    debug("boot mode %x.\n", boot_mode); >> - >> -    /* Clear boot mode */ >> -    writel(BOOT_NORMAL, &grf->os_reg[4]); >> - >> -    switch (boot_mode) { >> -    case BOOT_FASTBOOT: >> -        printf("enter fastboot!\n"); >> -        env_set("preboot", "setenv preboot; fastboot usb0"); >> -        break; >> -    case BOOT_UMS: >> -        printf("enter UMS!\n"); >> -        env_set("preboot", "setenv preboot; ums mmc 0"); >> -        break; >> -    } >> -} >> - >> __weak int rk_board_late_init(void) >> { >>     return 0; >> diff --git a/arch/arm/mach-rockchip/rk3188-board.c >> b/arch/arm/mach-rockchip/rk3188-board.c >> index 96859a5..916d18f 100644 >> --- a/arch/arm/mach-rockchip/rk3188-board.c >> +++ b/arch/arm/mach-rockchip/rk3188-board.c >> @@ -24,6 +24,7 @@ int board_late_init(void) >> { >>     struct rk3188_grf *grf; >> >> +    setup_boot_mode(); >>     grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); >>     if (IS_ERR(grf)) { >>         pr_err("grf syscon returned %ld\n", PTR_ERR(grf)); >> diff --git a/arch/arm/mach-rockchip/rk322x-board.c >> b/arch/arm/mach-rockchip/rk322x-board.c >> index d443114..e71847d 100644 >> --- a/arch/arm/mach-rockchip/rk322x-board.c >> +++ b/arch/arm/mach-rockchip/rk322x-board.c >> @@ -16,30 +16,6 @@ >> >> DECLARE_GLOBAL_DATA_PTR; >> >> -#define GRF_BASE    0x11000000 >> - >> -static void setup_boot_mode(void) >> -{ >> -    struct rk322x_grf *const grf = (void *)GRF_BASE; >> -    int boot_mode = readl(&grf->os_reg[0]); >> - >> -    debug("boot mode %x.\n", boot_mode); >> - >> -    /* Clear boot mode */ >> -    writel(BOOT_NORMAL, &grf->os_reg[0]); >> - >> -    switch (boot_mode) { >> -    case BOOT_FASTBOOT: >> -        printf("enter fastboot!\n"); >> -        env_set("preboot", "setenv preboot; fastboot usb0"); >> -        break; >> -    case BOOT_UMS: >> -        printf("enter UMS!\n"); >> -        env_set("preboot", "setenv preboot; ums mmc 0"); >> -        break; >> -    } >> -} >> - >> __weak int rk_board_late_init(void) >> { >>     return 0; >> diff --git a/arch/arm/mach-rockchip/rk3288-board.c >> b/arch/arm/mach-rockchip/rk3288-board.c >> index 278bb40..1c53cca 100644 >> --- a/arch/arm/mach-rockchip/rk3288-board.c >> +++ b/arch/arm/mach-rockchip/rk3288-board.c >> @@ -23,31 +23,6 @@ >> >> DECLARE_GLOBAL_DATA_PTR; >> >> -#define PMU_BASE    0xff730000 >> - >> -static void setup_boot_mode(void) >> -{ >> -    struct rk3288_pmu *const pmu = (void *)PMU_BASE; >> -    int boot_mode = readl(&pmu->sys_reg[0]); >> - >> -    debug("boot mode %x.\n", boot_mode); >> - >> -    /* Clear boot mode */ >> -    writel(BOOT_NORMAL, &pmu->sys_reg[0]); >> - >> -    switch (boot_mode) { >> -    case BOOT_FASTBOOT: >> -        printf("enter fastboot!\n"); >> -        env_set("preboot", "setenv preboot; fastboot usb0"); >> -        break; >> -    case BOOT_UMS: >> -        printf("enter UMS!\n"); >> -        env_set("preboot", "setenv preboot; if mmc dev 0;" >> -               "then ums mmc 0; else ums mmc 1;fi"); >> -        break; >> -    } >> -} >> - >> __weak int rk_board_late_init(void) >> { >>     return 0; >> diff --git a/arch/arm/mach-rockchip/rk3399-board.c >> b/arch/arm/mach-rockchip/rk3399-board.c >> new file mode 100644 >> index 0000000..9293843 >> --- /dev/null >> +++ b/arch/arm/mach-rockchip/rk3399-board.c >> @@ -0,0 +1,14 @@ >> +/* >> + * Copyright (c) 2017 Rockchip Electronics Co., Ltd >> + * >> + * SPDX-License-Identifier:     GPL-2.0+ >> + */ >> + >> +#include >> +#include >> + >> +int board_late_init(void) >> +{ >> +    setup_boot_mode(); >> +    return 0; >> +} >> > > >