[U-Boot] [RFC PATCH] rockchip: tinker: Add boot from capability

Kever Yang kever.yang at rock-chips.com
Tue Nov 12 09:57:40 UTC 2019


Hi Michael,

On 2019/11/12 下午4:14, Michael Trimarchi wrote:
> We need to know from what device we are booting

Please make sure board_spl_was_booted_from() works for rk3288, which

already work for rk3399, after that, we can move those functions from rk3399

only into common code to make everything work.

We are not going to add "spl-boot-device".


Thanks,

- Kever

> in order
> to save the enviroment in right place
>
> Signed-off-by: Michael Trimarchi <michael at amarulasolutions.com>
> ---
>   arch/arm/dts/rk3288-tinker-s-u-boot.dtsi     |  1 +
>   arch/arm/mach-rockchip/rk3288/rk3288.c       | 46 ++++++++++++++++++++
>   board/rockchip/tinker_rk3288/tinker-rk3288.c | 41 +++++++++++++++++
>   configs/tinker-rk3288_defconfig              |  2 +
>   configs/tinker-s-rk3288_defconfig            |  2 +
>   5 files changed, 92 insertions(+)
>
> diff --git a/arch/arm/dts/rk3288-tinker-s-u-boot.dtsi b/arch/arm/dts/rk3288-tinker-s-u-boot.dtsi
> index 538593359a..2193127514 100644
> --- a/arch/arm/dts/rk3288-tinker-s-u-boot.dtsi
> +++ b/arch/arm/dts/rk3288-tinker-s-u-boot.dtsi
> @@ -10,6 +10,7 @@
>   	chosen {
>   		u-boot,spl-boot-order = \
>   			"same-as-spl", &sdmmc, &emmc;
> +		u-boot,spl-boot-device = "/dwmmc at ff0f0000";
>   	};
>   };
>   
> diff --git a/arch/arm/mach-rockchip/rk3288/rk3288.c b/arch/arm/mach-rockchip/rk3288/rk3288.c
> index 987b4e0d58..002d1508e5 100644
> --- a/arch/arm/mach-rockchip/rk3288/rk3288.c
> +++ b/arch/arm/mach-rockchip/rk3288/rk3288.c
> @@ -3,6 +3,8 @@
>    * Copyright (c) 2016 Rockchip Electronics Co., Ltd
>    */
>   #include <common.h>
> +#include <spl.h>
> +#include <fdt_support.h>
>   #include <dm.h>
>   #include <env.h>
>   #include <clk.h>
> @@ -26,6 +28,50 @@ const char * const boot_devices[BROM_LAST_BOOTSOURCE + 1] = {
>   	[BROM_BOOTSOURCE_SD] = "/dwmmc at ff0c0000",
>   };
>   
> +#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
> +const char *spl_decode_boot_device(u32 boot_device)
> +{
> +	int i;
> +	static const struct {
> +		u32 boot_device;
> +		const char *ofpath;
> +	} spl_boot_devices_tbl[] = {
> +		{ BOOT_DEVICE_MMC2, "/dwmmc at ff0f0000" },
> +		{ BOOT_DEVICE_MMC1, "/dwmmc at ff0c0000" },
> +	};
> +
> +	for (i = 0; i < ARRAY_SIZE(spl_boot_devices_tbl); ++i)
> +		if (spl_boot_devices_tbl[i].boot_device == boot_device)
> +			return spl_boot_devices_tbl[i].ofpath;
> +
> +	return NULL;
> +}
> +
> +void spl_perform_fixups(struct spl_image_info *spl_image)
> +{
> +	void *blob = (void *)gd->fdt_blob;
> +	const char *boot_ofpath;
> +	int chosen;
> +
> +	if (!blob)
> +		return;
> +
> +	boot_ofpath = spl_decode_boot_device(spl_image->boot_device);
> +	if (!boot_ofpath) {
> +		pr_err("%s: could not map boot_device to ofpath\n", __func__);
> +		return;
> +	}
> +
> +	chosen = fdt_find_or_add_subnode(blob, 0, "chosen");
> +	if (chosen < 0) {
> +		pr_err("%s: could not find/create '/chosen'\n", __func__);
> +		return;
> +	}
> +	fdt_setprop_string(blob, chosen,
> +			   "u-boot,spl-boot-device", boot_ofpath);
> +}
> +#endif
> +
>   #ifdef CONFIG_SPL_BUILD
>   static void configure_l2ctlr(void)
>   {
> diff --git a/board/rockchip/tinker_rk3288/tinker-rk3288.c b/board/rockchip/tinker_rk3288/tinker-rk3288.c
> index 6c76c3c25c..66a7394d95 100644
> --- a/board/rockchip/tinker_rk3288/tinker-rk3288.c
> +++ b/board/rockchip/tinker_rk3288/tinker-rk3288.c
> @@ -9,6 +9,34 @@
>   #include <i2c_eeprom.h>
>   #include <netdev.h>
>   
> +static int tinker_boot_device = CONFIG_SYS_MMC_ENV_DEV;
> +
> +/*
> + * Select the boot device according to what was set in spl step
> + */
> +static int setup_boottargets(void)
> +{
> +	const char *boot_device =
> +		ofnode_get_chosen_prop("u-boot,spl-boot-device");
> +
> +	if (!boot_device) {
> +		debug("%s: /chosen/u-boot,spl-boot-device not set\n",
> +		      __func__);
> +		return -1;
> +	}
> +	debug("%s: booted from %s\n", __func__, boot_device);
> +
> +	if (!strcmp(boot_device, "/dwmmc at ff0f0000")) {
> +		/* eMMC boot device */
> +		tinker_boot_device = 1;
> +	} else {
> +		/* sdcard boot device */
> +		tinker_boot_device = 0;
> +	}
> +
> +	return 0;
> +}
> +
>   static int get_ethaddr_from_eeprom(u8 *addr)
>   {
>   	int ret;
> @@ -33,3 +61,16 @@ int rk3288_board_late_init(void)
>   
>   	return 0;
>   }
> +
> +int misc_init_r(void)
> +{
> +	setup_boottargets();
> +
> +	return 0;
> +}
> +
> +int mmc_get_env_dev(void)
> +{
> +	debug("boot device %d\n", tinker_boot_device);
> +	return tinker_boot_device;
> +}
> diff --git a/configs/tinker-rk3288_defconfig b/configs/tinker-rk3288_defconfig
> index c851a93f31..106e24e8ca 100644
> --- a/configs/tinker-rk3288_defconfig
> +++ b/configs/tinker-rk3288_defconfig
> @@ -13,7 +13,9 @@ CONFIG_DEBUG_UART=y
>   CONFIG_TPL_SYS_MALLOC_F_LEN=0x4000
>   CONFIG_SPL_SYS_MALLOC_F_LEN=0x4000
>   CONFIG_SYS_MALLOC_F_LEN=0x4000
> +CONFIG_SPL_OF_LIBFDT=y
>   # CONFIG_ANDROID_BOOT_IMAGE is not set
> +CONFIG_MISC_INIT_R=y
>   CONFIG_USE_PREBOOT=y
>   CONFIG_SILENT_CONSOLE=y
>   CONFIG_CONSOLE_MUX=y
> diff --git a/configs/tinker-s-rk3288_defconfig b/configs/tinker-s-rk3288_defconfig
> index c851a93f31..106e24e8ca 100644
> --- a/configs/tinker-s-rk3288_defconfig
> +++ b/configs/tinker-s-rk3288_defconfig
> @@ -13,7 +13,9 @@ CONFIG_DEBUG_UART=y
>   CONFIG_TPL_SYS_MALLOC_F_LEN=0x4000
>   CONFIG_SPL_SYS_MALLOC_F_LEN=0x4000
>   CONFIG_SYS_MALLOC_F_LEN=0x4000
> +CONFIG_SPL_OF_LIBFDT=y
>   # CONFIG_ANDROID_BOOT_IMAGE is not set
> +CONFIG_MISC_INIT_R=y
>   CONFIG_USE_PREBOOT=y
>   CONFIG_SILENT_CONSOLE=y
>   CONFIG_CONSOLE_MUX=y




More information about the U-Boot mailing list