diff mbox series

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

Message ID 20191112081410.24876-1-michael@amarulasolutions.com
State RFC
Delegated to: Kever Yang
Headers show
Series [U-Boot,RFC] rockchip: tinker: Add boot from capability | expand

Commit Message

Michael Nazzareno Trimarchi Nov. 12, 2019, 8:14 a.m. UTC
We need to know from what device we are booting in order
to save the enviroment in right place

Signed-off-by: Michael Trimarchi <michael@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(+)

Comments

Kever Yang Nov. 12, 2019, 9:57 a.m. UTC | #1
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@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@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@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@ff0f0000" },
> +		{ BOOT_DEVICE_MMC1, "/dwmmc@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@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
Michael Nazzareno Trimarchi Nov. 12, 2019, 10:02 a.m. UTC | #2
Hi Kever

On Tue, Nov 12, 2019 at 10:57 AM Kever Yang <kever.yang@rock-chips.com> wrote:
>
> 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".

That implementation has no sense in my use case. You need fit image. I
don't need any special change

Michael
>
>
> Thanks,
>
> - Kever
>
> > in order
> > to save the enviroment in right place
> >
> > Signed-off-by: Michael Trimarchi <michael@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@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@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@ff0f0000" },
> > +             { BOOT_DEVICE_MMC1, "/dwmmc@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@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
>
>
Michael Nazzareno Trimarchi Nov. 12, 2019, 6:48 p.m. UTC | #3
Hi Kever

Let me more clear

On Tue, Nov 12, 2019 at 11:02 AM Michael Nazzareno Trimarchi
<michael@amarulasolutions.com> wrote:
>
> Hi Kever
>
> On Tue, Nov 12, 2019 at 10:57 AM Kever Yang <kever.yang@rock-chips.com> wrote:
> >
> > 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".
>
> That implementation has no sense in my use case. You need fit image. I
> don't need any special change

I don't re-allocate the dtb so the size in no-fit image is the same. I
think that we can use
some meta-tag for bootloader to store information from spl to second
stage. You need to keep
in the same size or you have -ENOSPACE. This can be generic but
depends what the maintair
think.

Michael

>
> Michael
> >
> >
> > Thanks,
> >
> > - Kever
> >
> > > in order
> > > to save the enviroment in right place
> > >
> > > Signed-off-by: Michael Trimarchi <michael@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@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@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@ff0f0000" },
> > > +             { BOOT_DEVICE_MMC1, "/dwmmc@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@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
> >
> >
>
>
> --
> | Michael Nazzareno Trimarchi                     Amarula Solutions BV |
> | COO  -  Founder                                      Cruquiuskade 47 |
> | +31(0)851119172                                 Amsterdam 1018 AM NL |
> |                  [`as] http://www.amarulasolutions.com               |
Kever Yang Nov. 13, 2019, 1:01 a.m. UTC | #4
On 2019/11/12 下午6:02, Michael Nazzareno Trimarchi wrote:
> Hi Kever
>
> On Tue, Nov 12, 2019 at 10:57 AM Kever Yang <kever.yang@rock-chips.com> wrote:
>> 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".
> That implementation has no sense in my use case. You need fit image. I
> don't need any special change


I don't understand what you want to do.

The implementation is to get boot device from bootRom and convert it to 
the device in SPL dt,

why it has no sense?


Thanks,

- Kever

> Michael
>>
>> Thanks,
>>
>> - Kever
>>
>>> in order
>>> to save the enviroment in right place
>>>
>>> Signed-off-by: Michael Trimarchi <michael@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@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@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@ff0f0000" },
>>> +             { BOOT_DEVICE_MMC1, "/dwmmc@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@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
>>
>
Michael Nazzareno Trimarchi Nov. 13, 2019, 7:50 a.m. UTC | #5
Hi Kever

On Wed, Nov 13, 2019 at 2:03 AM Kever Yang <kever.yang@rock-chips.com> wrote:
>
>
> On 2019/11/12 下午6:02, Michael Nazzareno Trimarchi wrote:
> > Hi Kever
> >
> > On Tue, Nov 12, 2019 at 10:57 AM Kever Yang <kever.yang@rock-chips.com> wrote:
> >> 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".
> > That implementation has no sense in my use case. You need fit image. I
> > don't need any special change
>
>
> I don't understand what you want to do.
>
> The implementation is to get boot device from bootRom and convert it to
> the device in SPL dt,
>
> why it has no sense?

commit 75014470aec60580978962071972f2962695938d
Author: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Date:   Wed Sep 13 21:29:30 2017 +0200

    spl: add a fdt_addr field to spl_image_info

    When loading a full U-Boot with detached device-tree using the SPL FIT
    backend, we should store the address of the FDT loaded as part of the
    SPL image info: this allows us to fixup the FDT with additional info
    we may want to propagate onward.

    Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
    Reviewed-by: Simon Glass <sjg@chromium.org>

The change rk3399 use is a detached device-tree. This not cover all
the use case. I'm using some place holder
to pass the information to next stage without detach it

Michael
>
>
> Thanks,
>
> - Kever
>
> > Michael
> >>
> >> Thanks,
> >>
> >> - Kever
> >>
> >>> in order
> >>> to save the enviroment in right place
> >>>
> >>> Signed-off-by: Michael Trimarchi <michael@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@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@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@ff0f0000" },
> >>> +             { BOOT_DEVICE_MMC1, "/dwmmc@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@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
> >>
> >
>
>
Michael Nazzareno Trimarchi Nov. 14, 2019, 9:47 p.m. UTC | #6
Hi

Drop it

+int mmc_get_env_dev(void)
+{
+       u32 bootdevice_brom_id = readl(BROM_BOOTSOURCE_ID_ADDR);
+
+       if (bootdevice_brom_id == BROM_BOOTSOURCE_EMMC)
+               return 0;
+
+       return 1;
+}

THis is enough for tinker

Michael

On Wed, Nov 13, 2019 at 8:50 AM Michael Nazzareno Trimarchi
<michael@amarulasolutions.com> wrote:
>
> Hi Kever
>
> On Wed, Nov 13, 2019 at 2:03 AM Kever Yang <kever.yang@rock-chips.com> wrote:
> >
> >
> > On 2019/11/12 下午6:02, Michael Nazzareno Trimarchi wrote:
> > > Hi Kever
> > >
> > > On Tue, Nov 12, 2019 at 10:57 AM Kever Yang <kever.yang@rock-chips.com> wrote:
> > >> 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".
> > > That implementation has no sense in my use case. You need fit image. I
> > > don't need any special change
> >
> >
> > I don't understand what you want to do.
> >
> > The implementation is to get boot device from bootRom and convert it to
> > the device in SPL dt,
> >
> > why it has no sense?
>
> commit 75014470aec60580978962071972f2962695938d
> Author: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
> Date:   Wed Sep 13 21:29:30 2017 +0200
>
>     spl: add a fdt_addr field to spl_image_info
>
>     When loading a full U-Boot with detached device-tree using the SPL FIT
>     backend, we should store the address of the FDT loaded as part of the
>     SPL image info: this allows us to fixup the FDT with additional info
>     we may want to propagate onward.
>
>     Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>     Reviewed-by: Simon Glass <sjg@chromium.org>
>
> The change rk3399 use is a detached device-tree. This not cover all
> the use case. I'm using some place holder
> to pass the information to next stage without detach it
>
> Michael
> >
> >
> > Thanks,
> >
> > - Kever
> >
> > > Michael
> > >>
> > >> Thanks,
> > >>
> > >> - Kever
> > >>
> > >>> in order
> > >>> to save the enviroment in right place
> > >>>
> > >>> Signed-off-by: Michael Trimarchi <michael@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@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@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@ff0f0000" },
> > >>> +             { BOOT_DEVICE_MMC1, "/dwmmc@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@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
> > >>
> > >
> >
> >
>
>
> --
> | Michael Nazzareno Trimarchi                     Amarula Solutions BV |
> | COO  -  Founder                                      Cruquiuskade 47 |
> | +31(0)851119172                                 Amsterdam 1018 AM NL |
> |                  [`as] http://www.amarulasolutions.com               |
diff mbox series

Patch

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@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@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@ff0f0000" },
+		{ BOOT_DEVICE_MMC1, "/dwmmc@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@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