diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c index 3f19f7e..67db961 100644 --- a/arch/arm/mach-imx/cpu.c +++ b/arch/arm/mach-imx/cpu.c @@ -43,7 +43,12 @@ static char *get_reset_cause(void) struct src *src_regs = (struct src *)SRC_BASE_ADDR; cause = readl(&src_regs->srsr); +#ifndef CONFIG_ANDROID_BOOT_IMAGE + /* We will read the ssrs states later for android so we don't + * clear the states here. + */ writel(cause, &src_regs->srsr); +#endif reset_cause = cause; switch (cause) { @@ -87,6 +92,17 @@ static char *get_reset_cause(void) } } +#ifdef CONFIG_ANDROID_BOOT_IMAGE +void get_reboot_reason(char *ret) +{ + struct src *src_regs = (struct src *)SRC_BASE_ADDR; + + strcpy(ret, (char *)get_reset_cause()); + /* clear the srsr here, its state has been recorded in reset_cause */ + writel(reset_cause, &src_regs->srsr); +} +#endif + u32 get_imx_reset_cause(void) { return reset_cause; diff --git a/arch/arm/mach-imx/mx7ulp/soc.c b/arch/arm/mach-imx/mx7ulp/soc.c index 81ce576..10b2e18 100644 --- a/arch/arm/mach-imx/mx7ulp/soc.c +++ b/arch/arm/mach-imx/mx7ulp/soc.c @@ -252,7 +252,12 @@ static char *get_reset_cause(char *ret) srs = readl(reg_srs); cause1 = readl(reg_ssrs); +#ifndef CONFIG_ANDROID_BOOT_IMAGE + /* We will read the ssrs states later for android so we don't + * clear the states here. + */ writel(cause1, reg_ssrs); +#endif reset_cause = cause1; @@ -292,6 +297,17 @@ static char *get_reset_cause(char *ret) return ret; } +#ifdef CONFIG_ANDROID_BOOT_IMAGE +void get_reboot_reason(char *ret) +{ + u32 *reg_ssrs = (u32 *)(SRC_BASE_ADDR + 0x28); + + get_reset_cause(ret); + /* clear the ssrs here, its state has been recorded in reset_cause */ + writel(reset_cause, reg_ssrs); +} +#endif + void arch_preboot_os(void) { #if defined(CONFIG_VIDEO_MXS) diff --git a/common/image-android.c b/common/image-android.c index 07d82d5..81eaca8 100644 --- a/common/image-android.c +++ b/common/image-android.c @@ -143,6 +143,23 @@ int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify, metrics.odt, metrics.sw); strncat(commandline, newbootargs, sizeof(commandline) - strlen(commandline)); +#if defined(CONFIG_ARCH_MX6) || defined(CONFIG_ARCH_MX7) || \ + defined(CONFIG_ARCH_MX7ULP) || defined(CONFIG_ARCH_IMX8M) + char cause[18]; + + memset(cause, '\0', sizeof(cause)); + get_reboot_reason(cause); + if (strstr(cause, "POR")) + sprintf(newbootargs," androidboot.bootreason=cold,powerkey"); + else if (strstr(cause, "WDOG") || strstr(cause, "WDG")) + sprintf(newbootargs," androidboot.bootreason=watchdog"); + else + sprintf(newbootargs," androidboot.bootreason=reboot"); +#else + sprintf(newbootargs," androidboot.bootreason=reboot"); +#endif + strncat(commandline, newbootargs, sizeof(commandline) - strlen(commandline)); + #ifdef CONFIG_AVB_SUPPORT /* secondary cmdline added by avb */ char *bootargs_sec = env_get("bootargs_sec"); diff --git a/include/common.h b/include/common.h index eed03c3..0554752 100644 --- a/include/common.h +++ b/include/common.h @@ -164,6 +164,10 @@ int print_cpuinfo(void); int update_flash_size(int flash_size); int arch_early_init_r(void); +#ifdef CONFIG_ANDROID_BOOT_IMAGE +void get_reboot_reason(char *ret); +#endif + /* * setup_board_extra() - Fill in extra details in the bd_t structure *