diff options
author | Chia-Wei Wang <chiawei_wang@aspeedtech.com> | 2022-06-01 16:43:52 +0800 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2022-06-22 21:30:05 -0400 |
commit | 12770d0df0e841cfa1bdbde7636aad3d531bf66b (patch) | |
tree | 363b6e9aa64f183b669ea0e30a2178aab4d3182e | |
parent | 442a69c143759648f571e3784c7b3bc5be7ed595 (diff) | |
download | u-boot-12770d0df0e841cfa1bdbde7636aad3d531bf66b.zip u-boot-12770d0df0e841cfa1bdbde7636aad3d531bf66b.tar.gz u-boot-12770d0df0e841cfa1bdbde7636aad3d531bf66b.tar.bz2 |
ast2600: spl: Add boot mode detection
AST2600 supports boot from SPI(mmap), eMMC, and UART.
This patch adds the boot mode detection and return the
corresponding boot device type.
Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
-rw-r--r-- | arch/arm/include/asm/arch-aspeed/scu_ast2600.h | 3 | ||||
-rw-r--r-- | arch/arm/mach-aspeed/ast2600/spl.c | 30 |
2 files changed, 33 insertions, 0 deletions
diff --git a/arch/arm/include/asm/arch-aspeed/scu_ast2600.h b/arch/arm/include/asm/arch-aspeed/scu_ast2600.h index 7c5aab9..251bfa2 100644 --- a/arch/arm/include/asm/arch-aspeed/scu_ast2600.h +++ b/arch/arm/include/asm/arch-aspeed/scu_ast2600.h @@ -87,6 +87,9 @@ #define SCU_HWSTRAP1_CPU_FREQ_SHIFT 8 #define SCU_HWSTRAP1_MAC2_INTF BIT(7) #define SCU_HWSTRAP1_MAC1_INTF BIT(6) +#define SCU_HWSTRAP1_BOOT_EMMC BIT(2) + +#define SCU_HWSTRAP2_BOOT_UART BIT(8) #define SCU_EFUSE_DIS_DP BIT(17) #define SCU_EFUSE_DIS_VGA BIT(14) diff --git a/arch/arm/mach-aspeed/ast2600/spl.c b/arch/arm/mach-aspeed/ast2600/spl.c index 6c49d6a..53c8a15 100644 --- a/arch/arm/mach-aspeed/ast2600/spl.c +++ b/arch/arm/mach-aspeed/ast2600/spl.c @@ -7,6 +7,7 @@ #include <dm.h> #include <spl.h> #include <init.h> +#include <linux/err.h> #include <asm/io.h> #include <asm/arch/scu_ast2600.h> #include <asm/global_data.h> @@ -21,8 +22,37 @@ void board_init_f(ulong dummy) dram_init(); } +/* + * Try to detect the boot mode. Fallback to the default, + * memory mapped SPI XIP booting if detection failed. + */ u32 spl_boot_device(void) { + int rc; + struct udevice *scu_dev; + struct ast2600_scu *scu; + + rc = uclass_get_device_by_driver(UCLASS_CLK, + DM_DRIVER_GET(aspeed_ast2600_scu), &scu_dev); + if (rc) { + debug("%s: failed to get SCU driver\n", __func__); + goto out; + } + + scu = devfdt_get_addr_ptr(scu_dev); + if (IS_ERR_OR_NULL(scu)) { + debug("%s: failed to get SCU base\n", __func__); + goto out; + } + + /* boot from UART has higher priority */ + if (scu->hwstrap2 & SCU_HWSTRAP2_BOOT_UART) + return BOOT_DEVICE_UART; + + if (scu->hwstrap1 & SCU_HWSTRAP1_BOOT_EMMC) + return BOOT_DEVICE_MMC1; + +out: return BOOT_DEVICE_RAM; } |