[U-Boot] imx-common: spl: return boot mode for asked MMC device in spl_boot_mode()
diff mbox

Message ID 1501593834-24510-1-git-send-email-agust@denx.de
State Rejected
Delegated to: Stefano Babic
Headers show

Commit Message

Anatolij Gustschin Aug. 1, 2017, 1:23 p.m. UTC
Boards may extend or re-define the boot list in their board_boot_order()
function by modifying spl_boot_list. E.g. a board might boot SPL from a
slow SPI NOR flash and then load the U-Boot from an eMMC or SD-card.
Or it might use additional MMC boot device in spl_boot_list for cases
when the image in SPI NOR flash is not found, so it could fall back to
eMMC, SD-card or another boot device.

Getting the MMC boot mode in spl_mmc will fail when we are trying to
boot from an MMC device in the spl_boot_list and the original board
boot mode (as returned by spl_boot_device()) is not an MMC boot mode.
Fix it by checking the asked MMC boot device from the spl_boot_mode()
argument.

Signed-off-by: Anatolij Gustschin <agust@denx.de>
---
 arch/arm/mach-imx/spl.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Stefano Babic Aug. 2, 2017, 9:54 a.m. UTC | #1
Hi anatolji,

On 01/08/2017 15:23, Anatolij Gustschin wrote:
> Boards may extend or re-define the boot list in their board_boot_order()
> function by modifying spl_boot_list. E.g. a board might boot SPL from a
> slow SPI NOR flash and then load the U-Boot from an eMMC or SD-card.
> Or it might use additional MMC boot device in spl_boot_list for cases
> when the image in SPI NOR flash is not found, so it could fall back to
> eMMC, SD-card or another boot device.
> 
> Getting the MMC boot mode in spl_mmc will fail when we are trying to
> boot from an MMC device in the spl_boot_list and the original board
> boot mode (as returned by spl_boot_device()) is not an MMC boot mode.
> Fix it by checking the asked MMC boot device from the spl_boot_mode()
> argument.
> 
> Signed-off-by: Anatolij Gustschin <agust@denx.de>
> ---
>  arch/arm/mach-imx/spl.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm/mach-imx/spl.c b/arch/arm/mach-imx/spl.c
> index 75698c4..cbb9dd5 100644
> --- a/arch/arm/mach-imx/spl.c
> +++ b/arch/arm/mach-imx/spl.c
> @@ -84,7 +84,7 @@ u32 spl_boot_device(void)
>  /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
>  u32 spl_boot_mode(const u32 boot_device)
>  {
> -	switch (spl_boot_device()) {
> +	switch (boot_device) {
>  	/* for MMC return either RAW or FAT mode */
>  	case BOOT_DEVICE_MMC1:
>  	case BOOT_DEVICE_MMC2:
> 

Nevertheless it seems difficult to be consistent. Let's start with the
case where a on-board device (SPI or eMMC) does not boot, and the way to
save the board is to boot from an external board. And SPL on the onboard
flash is damaged, but not u-boot.img. Anyway, we want that the board
boots with its consistent status, that is with the pair SPL+u-boot.img.
In the example I tracked, both from the SD card. This is consistent
using spl_boot_device, because it does not try to boot from a different
device as the one where SPL was loaded.

Best regards,
Stefano
Anatolij Gustschin Aug. 2, 2017, 3:32 p.m. UTC | #2
Hi Stefano,

On Wed, 2 Aug 2017 11:54:24 +0200
Stefano Babic sbabic@denx.de wrote:
...
> > +++ b/arch/arm/mach-imx/spl.c
> > @@ -84,7 +84,7 @@ u32 spl_boot_device(void)
> >  /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
> >  u32 spl_boot_mode(const u32 boot_device)
> >  {
> > -	switch (spl_boot_device()) {
> > +	switch (boot_device) {
> >  	/* for MMC return either RAW or FAT mode */
> >  	case BOOT_DEVICE_MMC1:
> >  	case BOOT_DEVICE_MMC2:
> >   
> 
> Nevertheless it seems difficult to be consistent. Let's start with the
> case where a on-board device (SPI or eMMC) does not boot, and the way to
> save the board is to boot from an external board. And SPL on the onboard
> flash is damaged, but not u-boot.img. Anyway, we want that the board
> boots with its consistent status, that is with the pair SPL+u-boot.img.
> In the example I tracked, both from the SD card. This is consistent
> using spl_boot_device, because it does not try to boot from a different
> device as the one where SPL was loaded.

thanks for explanation, I'll have to find another way then, or
will maintain this patch out of tree.

--
Anatolij

Patch
diff mbox

diff --git a/arch/arm/mach-imx/spl.c b/arch/arm/mach-imx/spl.c
index 75698c4..cbb9dd5 100644
--- a/arch/arm/mach-imx/spl.c
+++ b/arch/arm/mach-imx/spl.c
@@ -84,7 +84,7 @@  u32 spl_boot_device(void)
 /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
 u32 spl_boot_mode(const u32 boot_device)
 {
-	switch (spl_boot_device()) {
+	switch (boot_device) {
 	/* for MMC return either RAW or FAT mode */
 	case BOOT_DEVICE_MMC1:
 	case BOOT_DEVICE_MMC2: