MA-12335 Canonical Boot Reason in Android Pie 9.0
Read boot reason from SRC(system reset controller) and report it to kernel by "androidboot.bootreason=<>" kernel commandline. This is enabled on imx6/7/7ulp/8m, imx8 will report default value "androidboot.bootreason=reboot" since it can't get such info on A core at u-boot stage. Test: Boot reason report ok on imx6qp/imx7ulp/imx8qxp. Change-Id: I03effaa03bc513bec6153e82c1a04e29c07e7db8 Signed-off-by: Ji Luo <ji.luo@nxp.com>
This commit is contained in:
		
							parent
							
								
									225fa189fa
								
							
						
					
					
						commit
						02b8787d0d
					
				| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue