diff mbox series

[01/12] rockchip: puma-rk3399: fix boot_targets swap depending on U-Boot proper load medium

Message ID 20220722160655.3904213-2-foss+uboot@0leil.net
State Superseded
Delegated to: Kever Yang
Headers show
Series Puma RK3399 migration to TPL and numerous fixes | expand

Commit Message

Quentin Schulz July 22, 2022, 4:06 p.m. UTC
From: Quentin Schulz <quentin.schulz@theobroma-systems.com>

distroboot should try first on the same MMC medium as the one the SPL
loaded U-Boot proper from. This was the case when the introducing commit
was merged because the default order was eMMC first and then SD card.
The check was therefore made only on whether we booted from SD card,
because otherwise the order was the expected one.
However, in commit b212ad24a604 ("rockchip: Fix MMC boot order"), the
order was swapped. Meaning our simple check is now useless.

Let's fix that by accounting for all scenarii: default boot_targets has
mmc0 first but booting from SD Card, mmc1 first but booting from eMMC.

Fixes: b212ad24a604 ("rockchip: Fix MMC boot order")
Cc: Quentin Schulz <foss+uboot@0leil.net>
Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>
---

Depends on
https://lore.kernel.org/u-boot/20220715151552.953654-1-foss+uboot@0leil.net/
https://lore.kernel.org/u-boot/20220715151552.953654-2-foss+uboot@0leil.net/

 .../puma_rk3399/puma-rk3399.c                 | 25 ++++++++++---------
 1 file changed, 13 insertions(+), 12 deletions(-)

Comments

Kever Yang Sept. 4, 2022, 11:41 a.m. UTC | #1
On 2022/7/23 00:06, Quentin Schulz wrote:
> From: Quentin Schulz <quentin.schulz@theobroma-systems.com>
>
> distroboot should try first on the same MMC medium as the one the SPL
> loaded U-Boot proper from. This was the case when the introducing commit
> was merged because the default order was eMMC first and then SD card.
> The check was therefore made only on whether we booted from SD card,
> because otherwise the order was the expected one.
> However, in commit b212ad24a604 ("rockchip: Fix MMC boot order"), the
> order was swapped. Meaning our simple check is now useless.
>
> Let's fix that by accounting for all scenarii: default boot_targets has
> mmc0 first but booting from SD Card, mmc1 first but booting from eMMC.
>
> Fixes: b212ad24a604 ("rockchip: Fix MMC boot order")
> Cc: Quentin Schulz <foss+uboot@0leil.net>
> Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>

I will apply this first, but it will be better to use boot script, too 
many logic to get the correct boot dev with this.


Reviewed-by: Kever Yang <kever.yang@rock-chips.com>

Thanks,
- Kever

> ---
>
> Depends on
> https://lore.kernel.org/u-boot/20220715151552.953654-1-foss+uboot@0leil.net/
> https://lore.kernel.org/u-boot/20220715151552.953654-2-foss+uboot@0leil.net/
>
>   .../puma_rk3399/puma-rk3399.c                 | 25 ++++++++++---------
>   1 file changed, 13 insertions(+), 12 deletions(-)
>
> diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
> index deeba3084a..ce3436b770 100644
> --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c
> +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
> @@ -77,18 +77,16 @@ static int setup_boottargets(void)
>   	}
>   
>   	/*
> -	 * Only run, if booting from mmc1 (i.e. /mmc@fe320000) and
> -	 * only consider cases where the default boot-order first
> -	 * tries to boot from mmc0 (eMMC) and then from mmc1
> -	 * (i.e. external SD).
> -	 *
> -	 * In other words: the SD card will be moved to earlier in the
> -	 * order, if U-Boot was also loaded from the SD-card.
> +	 * Make the default boot medium between SD Card and eMMC, the one that
> +	 * was used to load U-Boot proper. If SPI-NOR flash was used, keep
> +	 * original default order.
>   	 */
> -	if (!strcmp(boot_device, "/mmc@fe320000")) {
> +	if (strcmp(boot_device, "/spi@ff1d0000/flash@0")) {
> +		bool sd_booted = !strcmp(boot_device, "/mmc@fe320000");
>   		char *mmc0, *mmc1;
>   
> -		debug("%s: booted from SD-Card\n", __func__);
> +		debug("%s: booted from %s\n", __func__,
> +		      sd_booted ? "SD-Card" : "eMMC");
>   		mmc0 = strstr(env, "mmc0");
>   		mmc1 = strstr(env, "mmc1");
>   
> @@ -98,10 +96,13 @@ static int setup_boottargets(void)
>   		}
>   
>   		/*
> -		 * If mmc0 comes first in the boot order, we need to change
> -		 * the strings to make mmc1 first.
> +		 * If mmc0 comes first in the boot order and U-Boot proper was
> +		 * loaded from mmc1, swap mmc0 and mmc1 in the list.
> +		 * If mmc1 comes first in the boot order and U-Boot proper was
> +		 * loaded from mmc0, swap mmc0 and mmc1 in the list.
>   		 */
> -		if (mmc0 < mmc1) {
> +		if ((mmc0 < mmc1 && sd_booted) ||
> +		    (mmc0 > mmc1 && !sd_booted)) {
>   			mmc0[3] = '1';
>   			mmc1[3] = '0';
>   			debug("%s: set boot_targets to: %s\n", __func__, env);
diff mbox series

Patch

diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
index deeba3084a..ce3436b770 100644
--- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c
+++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
@@ -77,18 +77,16 @@  static int setup_boottargets(void)
 	}
 
 	/*
-	 * Only run, if booting from mmc1 (i.e. /mmc@fe320000) and
-	 * only consider cases where the default boot-order first
-	 * tries to boot from mmc0 (eMMC) and then from mmc1
-	 * (i.e. external SD).
-	 *
-	 * In other words: the SD card will be moved to earlier in the
-	 * order, if U-Boot was also loaded from the SD-card.
+	 * Make the default boot medium between SD Card and eMMC, the one that
+	 * was used to load U-Boot proper. If SPI-NOR flash was used, keep
+	 * original default order.
 	 */
-	if (!strcmp(boot_device, "/mmc@fe320000")) {
+	if (strcmp(boot_device, "/spi@ff1d0000/flash@0")) {
+		bool sd_booted = !strcmp(boot_device, "/mmc@fe320000");
 		char *mmc0, *mmc1;
 
-		debug("%s: booted from SD-Card\n", __func__);
+		debug("%s: booted from %s\n", __func__,
+		      sd_booted ? "SD-Card" : "eMMC");
 		mmc0 = strstr(env, "mmc0");
 		mmc1 = strstr(env, "mmc1");
 
@@ -98,10 +96,13 @@  static int setup_boottargets(void)
 		}
 
 		/*
-		 * If mmc0 comes first in the boot order, we need to change
-		 * the strings to make mmc1 first.
+		 * If mmc0 comes first in the boot order and U-Boot proper was
+		 * loaded from mmc1, swap mmc0 and mmc1 in the list.
+		 * If mmc1 comes first in the boot order and U-Boot proper was
+		 * loaded from mmc0, swap mmc0 and mmc1 in the list.
 		 */
-		if (mmc0 < mmc1) {
+		if ((mmc0 < mmc1 && sd_booted) ||
+		    (mmc0 > mmc1 && !sd_booted)) {
 			mmc0[3] = '1';
 			mmc1[3] = '0';
 			debug("%s: set boot_targets to: %s\n", __func__, env);