On Fri, Jun 12, 2026 at 04:18:54PM -0400, Raymond Mao wrote:
> From: Guodong Xu <[email protected]>
> 
> Add logic to determine the current boot device by reading the
> SoC's configuration registers, rather than using a hardcoded
> default.
> 
> Signed-off-by: Guodong Xu <[email protected]>
> Signed-off-by: Raymond Mao <[email protected]>
> ---
>  board/spacemit/k1/spl.c | 77 ++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 76 insertions(+), 1 deletion(-)
> 
> diff --git a/board/spacemit/k1/spl.c b/board/spacemit/k1/spl.c
> index 0db362130e4..d5e87d79fa2 100644
> --- a/board/spacemit/k1/spl.c
> +++ b/board/spacemit/k1/spl.c

...

> @@ -379,7 +401,60 @@ void board_init_f(ulong dummy)
>  
>  u32 spl_boot_device(void)
>  {
> -     return BOOT_DEVICE_SPI;
> +     void __iomem *boot_dev = (void __iomem *)BOOT_DEV_FLAG_REG;
> +     void __iomem *boot_strap = (void __iomem *)BOOT_PIN_SEL_REG;
> +     u32 mode, sel, ret = 0;
> +
> +     mode = readl(boot_dev);
> +     if (mode == BOOT_MODE_NONE || mode > BOOT_MODE_SD) {
> +             sel = readl(boot_strap);
> +             sel >>= BOOT_STRAP_MODE_OFFSET;
> +             sel &= BOOT_STRAP_MODE_MASK;

Is FIELD_GET() helpful here?

> +             switch (sel) {
> +             case BOOT_STRAP_MODE_EMMC:
> +                     mode = BOOT_MODE_EMMC;
> +                     break;
> +             case BOOT_STRAP_MODE_NAND:
> +                     mode = BOOT_MODE_NAND;
> +                     break;
> +             case BOOT_STRAP_MODE_SPI:
> +                     mode = BOOT_MODE_SPI;
> +                     break;
> +             case BOOT_STRAP_MODE_SD:
> +             default:
> +                     mode = BOOT_MODE_SD;
> +                     break;
> +             }
> +     }
> +     /* TODO:
> +      *   The current upstream DTS file only contains the eMMC node. When
> +      *   the SD node is added via an overlay, the eMMC device ends up as
> +      *   MMC1 in SPL.

Why not fix this with an extra alias in the overlay dt?

> +      *   However, the SD device should be the first device (MMC1).
> +      *   This sequence needs to be corrected once the SD node is merged
> +      *   into the upstream U-Boot DTS file.
> +      */
> +     switch (mode) {
> +     case BOOT_MODE_EMMC:
> +             ret = BOOT_DEVICE_MMC1;
> +             break;
> +     case BOOT_MODE_NAND:
> +             ret = BOOT_DEVICE_NAND;
> +             break;
> +     case BOOT_MODE_SPI:
> +             ret = BOOT_DEVICE_SPI;
> +             break;
> +     case BOOT_MODE_USB:
> +             ret = BOOT_DEVICE_USB;
> +             break;
> +     case BOOT_MODE_SD:
> +             ret = BOOT_DEVICE_MMC2;
> +             break;
> +     default:
> +             ret = BOOT_DEVICE_MMC1;
> +             break;
> +     }
> +     return ret;
>  }
>  
>  void spl_board_init(void)
> -- 
> 2.25.1
> 

Regards,
Yao Zi

Reply via email to