/* * Copyright 2015 Freescale Semiconductor, Inc. * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #ifdef CONFIG_LS102XA #include #endif #if defined(CONFIG_MPC85xx) #define CONFIG_DCFG_ADDR CONFIG_SYS_MPC85xx_GUTS_ADDR #else #define CONFIG_DCFG_ADDR CONFIG_SYS_FSL_GUTS_ADDR #endif #ifdef CONFIG_SYS_FSL_CCSR_GUR_LE #define gur_in32(a) in_le32(a) #else #define gur_in32(a) in_be32(a) #endif /* Check the Boot Mode. If Secure, return 1 else return 0 */ int fsl_check_boot_mode_secure(void) { uint32_t val; struct ccsr_sfp_regs *sfp_regs = (void *)(CONFIG_SYS_SFP_ADDR); struct ccsr_gur __iomem *gur = (void *)(CONFIG_DCFG_ADDR); val = sfp_in32(&sfp_regs->ospr) & ITS_MASK; if (val == ITS_MASK) return 1; #if defined(CONFIG_FSL_CORENET) || !defined(CONFIG_MPC85xx) /* For PBL based platforms check the SB_EN bit in RCWSR */ val = gur_in32(&gur->rcwsr[RCW_SB_EN_REG_INDEX - 1]) & RCW_SB_EN_MASK; if (val == RCW_SB_EN_MASK) return 1; #endif #if defined(CONFIG_MPC85xx) && !defined(CONFIG_FSL_CORENET) /* For Non-PBL Platforms, check the Device Status register 2*/ val = gur_in32(&gur->pordevsr2) & MPC85xx_PORDEVSR2_SBC_MASK; if (val != MPC85xx_PORDEVSR2_SBC_MASK) return 1; #endif return 0; } int fsl_setenv_chain_of_trust(void) { /* Check Boot Mode * If Boot Mode is Non-Secure, no changes are required */ if (fsl_check_boot_mode_secure() == 0) return 0; /* If Boot mode is Secure, set the environment variables * bootdelay = 0 (To disable Boot Prompt) * bootcmd = CONFIG_CHAIN_BOOT_CMD (Validate and execute Boot script) */ setenv("bootdelay", "0"); setenv("bootcmd", CONFIG_CHAIN_BOOT_CMD); return 0; }