1/* 2 * Copyright 2016 NXP Semiconductor, Inc. 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6#include <common.h> 7#include <config.h> 8#include <errno.h> 9#include <asm/system.h> 10#include <asm/types.h> 11#include <asm/arch/soc.h> 12#ifdef CONFIG_FSL_LSCH3 13#include <asm/arch/immap_lsch3.h> 14#elif defined(CONFIG_FSL_LSCH2) 15#include <asm/arch/immap_lsch2.h> 16#endif 17#ifdef CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT 18#include <asm/armv8/sec_firmware.h> 19#endif 20#ifdef CONFIG_CHAIN_OF_TRUST 21#include <fsl_validate.h> 22#endif 23 24int ppa_init(void) 25{ 26 const void *ppa_fit_addr; 27 u32 *boot_loc_ptr_l, *boot_loc_ptr_h; 28 int ret; 29 30#ifdef CONFIG_CHAIN_OF_TRUST 31 uintptr_t ppa_esbc_hdr = CONFIG_SYS_LS_PPA_ESBC_ADDR; 32 uintptr_t ppa_img_addr = 0; 33#endif 34 35#ifdef CONFIG_SYS_LS_PPA_FW_IN_XIP 36 ppa_fit_addr = (void *)CONFIG_SYS_LS_PPA_FW_ADDR; 37#else 38#error "No CONFIG_SYS_LS_PPA_FW_IN_xxx defined" 39#endif 40 41#ifdef CONFIG_CHAIN_OF_TRUST 42 ppa_img_addr = (uintptr_t)ppa_fit_addr; 43 if (fsl_check_boot_mode_secure() != 0) { 44 ret = fsl_secboot_validate(ppa_esbc_hdr, 45 CONFIG_PPA_KEY_HASH, 46 &ppa_img_addr); 47 if (ret != 0) 48 printf("PPA validation failed\n"); 49 else 50 printf("PPA validation Successful\n"); 51 } 52#endif 53 54#ifdef CONFIG_FSL_LSCH3 55 struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); 56 boot_loc_ptr_l = &gur->bootlocptrl; 57 boot_loc_ptr_h = &gur->bootlocptrh; 58#elif defined(CONFIG_FSL_LSCH2) 59 struct ccsr_scfg __iomem *scfg = (void *)(CONFIG_SYS_FSL_SCFG_ADDR); 60 boot_loc_ptr_l = &scfg->scratchrw[1]; 61 boot_loc_ptr_h = &scfg->scratchrw[0]; 62#endif 63 64 debug("fsl-ppa: boot_loc_ptr_l = 0x%p, boot_loc_ptr_h =0x%p\n", 65 boot_loc_ptr_l, boot_loc_ptr_h); 66 ret = sec_firmware_init(ppa_fit_addr, boot_loc_ptr_l, boot_loc_ptr_h); 67 68 return ret; 69} 70