blob: b68e87d657176308662440cdf56a3e5d31cf62c4 [file] [log] [blame]
Hou Zhiqiang00787862016-06-28 20:18:14 +08001/*
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
Sumit Garge0f9e9b2016-09-01 12:56:44 -040020#ifdef CONFIG_CHAIN_OF_TRUST
21#include <fsl_validate.h>
22#endif
Hou Zhiqiang00787862016-06-28 20:18:14 +080023
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
Sumit Garge0f9e9b2016-09-01 12:56:44 -040030#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
Hou Zhiqiang7f83a5f2016-07-29 19:26:34 +080035#ifdef CONFIG_SYS_LS_PPA_FW_IN_XIP
Hou Zhiqiang00787862016-06-28 20:18:14 +080036 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
Sumit Garge0f9e9b2016-09-01 12:56:44 -040041#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
Hou Zhiqiang00787862016-06-28 20:18:14 +080054#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}