The ZynqMP reports the mode pins sampled at POR via the register ZYNQMP_CRL_APB_BOOT_MODE_USER. This commit adds a function that reads the register and populates the boot source. Signed-off-by: Michael Riesch <michael.riesch@xxxxxxxxxxxxxx> --- arch/arm/mach-zynqmp/zynqmp.c | 43 +++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/arch/arm/mach-zynqmp/zynqmp.c b/arch/arm/mach-zynqmp/zynqmp.c index 5871c145b..262bc0dd4 100644 --- a/arch/arm/mach-zynqmp/zynqmp.c +++ b/arch/arm/mach-zynqmp/zynqmp.c @@ -6,9 +6,11 @@ #include <common.h> #include <init.h> #include <linux/types.h> +#include <bootsource.h> #include <reset_source.h> #define ZYNQMP_CRL_APB_BASE 0xff5e0000 +#define ZYNQMP_CRL_APB_BOOT_MODE_USER (ZYNQMP_CRL_APB_BASE + 0x200) #define ZYNQMP_CRL_APB_RESET_REASON (ZYNQMP_CRL_APB_BASE + 0x220) /* External POR: The PS_POR_B reset signal pin was asserted. */ @@ -26,6 +28,46 @@ /* Software debugger reset: Write to BLOCKONLY_RST [debug_only]. */ #define ZYNQMP_CRL_APB_RESET_REASON_DEBUG_SYS BIT(6) +struct zynqmp_bootsource { + enum bootsource src; + int instance; +}; + +/* cf. Table 11-1 "Boot Modes" in UG1085 Zynq UltraScale+ Device TRM */ +static struct zynqmp_bootsource boot_modes[] = { + { .src = BOOTSOURCE_JTAG, .instance = 0 }, + { .src = BOOTSOURCE_SPI, .instance = 0 }, + { .src = BOOTSOURCE_SPI, .instance = 0 }, + { .src = BOOTSOURCE_MMC, .instance = 0 }, + { .src = BOOTSOURCE_SPI_NAND, .instance = 0 }, + { .src = BOOTSOURCE_MMC, .instance = 1 }, + { .src = BOOTSOURCE_MMC, .instance = 0 }, + { .src = BOOTSOURCE_USB, .instance = 0 }, + { .src = BOOTSOURCE_JTAG, .instance = 0 }, + { .src = BOOTSOURCE_JTAG, .instance = 0 }, + { .src = BOOTSOURCE_UNKNOWN, .instance = 0 }, + { .src = BOOTSOURCE_UNKNOWN, .instance = 0 }, + { .src = BOOTSOURCE_UNKNOWN, .instance = 0 }, + { .src = BOOTSOURCE_UNKNOWN, .instance = 0 }, + { .src = BOOTSOURCE_MMC, .instance = 1 }, +}; + +static enum bootsource zynqmp_bootsource(void) +{ + u32 v; + + v = readl(ZYNQMP_CRL_APB_BOOT_MODE_USER); + v &= 0x0F; + + if (v >= ARRAY_SIZE(boot_modes)) + return BOOTSOURCE_UNKNOWN; + + bootsource_set(boot_modes[v].src); + bootsource_set_instance(boot_modes[v].instance); + + return boot_modes[v].src; +} + struct zynqmp_reset_reason { u32 mask; enum reset_src_type type; @@ -65,6 +107,7 @@ static enum reset_src_type zynqmp_get_reset_src(void) static int zynqmp_init(void) { + zynqmp_bootsource(); reset_source_set(zynqmp_get_reset_src()); return 0; -- 2.17.1 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox