1*0a6b2714SAneesh Bansal /*
2*0a6b2714SAneesh Bansal  * Copyright 2015 Freescale Semiconductor, Inc.
3*0a6b2714SAneesh Bansal  *
4*0a6b2714SAneesh Bansal  * SPDX-License-Identifier:	GPL-2.0+
5*0a6b2714SAneesh Bansal  */
6*0a6b2714SAneesh Bansal 
7*0a6b2714SAneesh Bansal #include <common.h>
8*0a6b2714SAneesh Bansal #include <fsl_validate.h>
9*0a6b2714SAneesh Bansal #include <fsl_sfp.h>
10*0a6b2714SAneesh Bansal 
11*0a6b2714SAneesh Bansal #ifdef CONFIG_LS102XA
12*0a6b2714SAneesh Bansal #include <asm/arch/immap_ls102xa.h>
13*0a6b2714SAneesh Bansal #endif
14*0a6b2714SAneesh Bansal 
15*0a6b2714SAneesh Bansal #if defined(CONFIG_MPC85xx)
16*0a6b2714SAneesh Bansal #define CONFIG_DCFG_ADDR	CONFIG_SYS_MPC85xx_GUTS_ADDR
17*0a6b2714SAneesh Bansal #else
18*0a6b2714SAneesh Bansal #define CONFIG_DCFG_ADDR	CONFIG_SYS_FSL_GUTS_ADDR
19*0a6b2714SAneesh Bansal #endif
20*0a6b2714SAneesh Bansal 
21*0a6b2714SAneesh Bansal #ifdef CONFIG_SYS_FSL_CCSR_GUR_LE
22*0a6b2714SAneesh Bansal #define gur_in32(a)       in_le32(a)
23*0a6b2714SAneesh Bansal #else
24*0a6b2714SAneesh Bansal #define gur_in32(a)       in_be32(a)
25*0a6b2714SAneesh Bansal #endif
26*0a6b2714SAneesh Bansal 
27*0a6b2714SAneesh Bansal /* Check the Boot Mode. If Secure, return 1 else return 0 */
28*0a6b2714SAneesh Bansal int fsl_check_boot_mode_secure(void)
29*0a6b2714SAneesh Bansal {
30*0a6b2714SAneesh Bansal 	uint32_t val;
31*0a6b2714SAneesh Bansal 	struct ccsr_sfp_regs *sfp_regs = (void *)(CONFIG_SYS_SFP_ADDR);
32*0a6b2714SAneesh Bansal 	struct ccsr_gur __iomem *gur = (void *)(CONFIG_DCFG_ADDR);
33*0a6b2714SAneesh Bansal 
34*0a6b2714SAneesh Bansal 	val = sfp_in32(&sfp_regs->ospr) & ITS_MASK;
35*0a6b2714SAneesh Bansal 	if (val == ITS_MASK)
36*0a6b2714SAneesh Bansal 		return 1;
37*0a6b2714SAneesh Bansal 
38*0a6b2714SAneesh Bansal #if defined(CONFIG_FSL_CORENET) || !defined(CONFIG_MPC85xx)
39*0a6b2714SAneesh Bansal 	/* For PBL based platforms check the SB_EN bit in RCWSR */
40*0a6b2714SAneesh Bansal 	val = gur_in32(&gur->rcwsr[RCW_SB_EN_REG_INDEX - 1]) & RCW_SB_EN_MASK;
41*0a6b2714SAneesh Bansal 	if (val == RCW_SB_EN_MASK)
42*0a6b2714SAneesh Bansal 		return 1;
43*0a6b2714SAneesh Bansal #endif
44*0a6b2714SAneesh Bansal 
45*0a6b2714SAneesh Bansal #if defined(CONFIG_MPC85xx) && !defined(CONFIG_FSL_CORENET)
46*0a6b2714SAneesh Bansal 	/* For Non-PBL Platforms, check the Device Status register 2*/
47*0a6b2714SAneesh Bansal 	val = gur_in32(&gur->pordevsr2) & MPC85xx_PORDEVSR2_SBC_MASK;
48*0a6b2714SAneesh Bansal 	if (val != MPC85xx_PORDEVSR2_SBC_MASK)
49*0a6b2714SAneesh Bansal 		return 1;
50*0a6b2714SAneesh Bansal 
51*0a6b2714SAneesh Bansal #endif
52*0a6b2714SAneesh Bansal 	return 0;
53*0a6b2714SAneesh Bansal }
54