GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
@@ -0,0 +1,414 @@
|
||||
/*
|
||||
* Copyright (c) 2019-2022, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <common/debug.h>
|
||||
#include <drivers/delay_timer.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <lib/psci/psci.h>
|
||||
#include <lib/smccc.h>
|
||||
#include <platform_def.h>
|
||||
#include <services/std_svc.h>
|
||||
|
||||
#include <gpc.h>
|
||||
#include <imx_sip_svc.h>
|
||||
|
||||
#define MIPI_PWR_REQ BIT(0)
|
||||
#define PCIE_PWR_REQ BIT(1)
|
||||
#define OTG1_PWR_REQ BIT(2)
|
||||
#define OTG2_PWR_REQ BIT(3)
|
||||
#define HSIOMIX_PWR_REQ BIT(4)
|
||||
#define GPU2D_PWR_REQ BIT(6)
|
||||
#define GPUMIX_PWR_REQ BIT(7)
|
||||
#define VPUMIX_PWR_REQ BIT(8)
|
||||
#define GPU3D_PWR_REQ BIT(9)
|
||||
#define DISPMIX_PWR_REQ BIT(10)
|
||||
#define VPU_G1_PWR_REQ BIT(11)
|
||||
#define VPU_G2_PWR_REQ BIT(12)
|
||||
#define VPU_H1_PWR_REQ BIT(13)
|
||||
|
||||
#define HSIOMIX_ADB400_SYNC (0x3 << 5)
|
||||
#define DISPMIX_ADB400_SYNC BIT(7)
|
||||
#define VPUMIX_ADB400_SYNC BIT(8)
|
||||
#define GPU3D_ADB400_SYNC BIT(9)
|
||||
#define GPU2D_ADB400_SYNC BIT(10)
|
||||
#define GPUMIX_ADB400_SYNC BIT(11)
|
||||
#define HSIOMIX_ADB400_ACK (0x3 << 23)
|
||||
#define DISPMIX_ADB400_ACK BIT(25)
|
||||
#define VPUMIX_ADB400_ACK BIT(26)
|
||||
#define GPU3D_ADB400_ACK BIT(27)
|
||||
#define GPU2D_ADB400_ACK BIT(28)
|
||||
#define GPUMIX_ADB400_ACK BIT(29)
|
||||
|
||||
#define MIPI_PGC 0xc00
|
||||
#define PCIE_PGC 0xc40
|
||||
#define OTG1_PGC 0xc80
|
||||
#define OTG2_PGC 0xcc0
|
||||
#define HSIOMIX_PGC 0xd00
|
||||
#define GPU2D_PGC 0xd80
|
||||
#define GPUMIX_PGC 0xdc0
|
||||
#define VPUMIX_PGC 0xe00
|
||||
#define GPU3D_PGC 0xe40
|
||||
#define DISPMIX_PGC 0xe80
|
||||
#define VPU_G1_PGC 0xec0
|
||||
#define VPU_G2_PGC 0xf00
|
||||
#define VPU_H1_PGC 0xf40
|
||||
|
||||
enum pu_domain_id {
|
||||
HSIOMIX,
|
||||
PCIE,
|
||||
OTG1,
|
||||
OTG2,
|
||||
GPUMIX,
|
||||
VPUMIX,
|
||||
VPU_G1,
|
||||
VPU_G2,
|
||||
VPU_H1,
|
||||
DISPMIX,
|
||||
MIPI,
|
||||
/* below two domain only for ATF internal use */
|
||||
GPU2D,
|
||||
GPU3D,
|
||||
MAX_DOMAINS,
|
||||
};
|
||||
|
||||
/* PU domain */
|
||||
static struct imx_pwr_domain pu_domains[] = {
|
||||
IMX_MIX_DOMAIN(HSIOMIX, false),
|
||||
IMX_PD_DOMAIN(PCIE, false),
|
||||
IMX_PD_DOMAIN(OTG1, true),
|
||||
IMX_PD_DOMAIN(OTG2, true),
|
||||
IMX_MIX_DOMAIN(GPUMIX, false),
|
||||
IMX_MIX_DOMAIN(VPUMIX, false),
|
||||
IMX_PD_DOMAIN(VPU_G1, false),
|
||||
IMX_PD_DOMAIN(VPU_G2, false),
|
||||
IMX_PD_DOMAIN(VPU_H1, false),
|
||||
IMX_MIX_DOMAIN(DISPMIX, false),
|
||||
IMX_PD_DOMAIN(MIPI, false),
|
||||
/* below two domain only for ATF internal use */
|
||||
IMX_MIX_DOMAIN(GPU2D, false),
|
||||
IMX_MIX_DOMAIN(GPU3D, false),
|
||||
};
|
||||
|
||||
static unsigned int pu_domain_status;
|
||||
|
||||
#define GPU_RCR 0x40
|
||||
#define VPU_RCR 0x44
|
||||
|
||||
#define VPU_CTL_BASE 0x38330000
|
||||
#define BLK_SFT_RSTN_CSR 0x0
|
||||
#define H1_SFT_RSTN BIT(2)
|
||||
#define G1_SFT_RSTN BIT(1)
|
||||
#define G2_SFT_RSTN BIT(0)
|
||||
|
||||
#define DISP_CTL_BASE 0x32e28000
|
||||
|
||||
void vpu_sft_reset_assert(uint32_t domain_id)
|
||||
{
|
||||
uint32_t val;
|
||||
|
||||
val = mmio_read_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR);
|
||||
|
||||
switch (domain_id) {
|
||||
case VPU_G1:
|
||||
val &= ~G1_SFT_RSTN;
|
||||
mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
|
||||
break;
|
||||
case VPU_G2:
|
||||
val &= ~G2_SFT_RSTN;
|
||||
mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
|
||||
break;
|
||||
case VPU_H1:
|
||||
val &= ~H1_SFT_RSTN;
|
||||
mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void vpu_sft_reset_deassert(uint32_t domain_id)
|
||||
{
|
||||
uint32_t val;
|
||||
|
||||
val = mmio_read_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR);
|
||||
|
||||
switch (domain_id) {
|
||||
case VPU_G1:
|
||||
val |= G1_SFT_RSTN;
|
||||
mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
|
||||
break;
|
||||
case VPU_G2:
|
||||
val |= G2_SFT_RSTN;
|
||||
mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
|
||||
break;
|
||||
case VPU_H1:
|
||||
val |= H1_SFT_RSTN;
|
||||
mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void imx_gpc_pm_domain_enable(uint32_t domain_id, bool on)
|
||||
{
|
||||
if (domain_id >= MAX_DOMAINS) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct imx_pwr_domain *pwr_domain = &pu_domains[domain_id];
|
||||
|
||||
if (on) {
|
||||
pu_domain_status |= (1 << domain_id);
|
||||
|
||||
if (domain_id == VPU_G1 || domain_id == VPU_G2 ||
|
||||
domain_id == VPU_H1) {
|
||||
vpu_sft_reset_assert(domain_id);
|
||||
}
|
||||
|
||||
/* HSIOMIX has no PU bit, so skip for it */
|
||||
if (domain_id != HSIOMIX) {
|
||||
/* clear the PGC bit */
|
||||
mmio_clrbits_32(IMX_GPC_BASE + pwr_domain->pgc_offset, 0x1);
|
||||
|
||||
/* power up the domain */
|
||||
mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, pwr_domain->pwr_req);
|
||||
|
||||
/* wait for power request done */
|
||||
while (mmio_read_32(IMX_GPC_BASE + PU_PGC_UP_TRG) & pwr_domain->pwr_req) {
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
if (domain_id == VPU_G1 || domain_id == VPU_G2 ||
|
||||
domain_id == VPU_H1) {
|
||||
vpu_sft_reset_deassert(domain_id);
|
||||
/* dealy for a while to make sure reset done */
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
if (domain_id == GPUMIX) {
|
||||
/* assert reset */
|
||||
mmio_write_32(IMX_SRC_BASE + GPU_RCR, 0x1);
|
||||
|
||||
/* power up GPU2D */
|
||||
mmio_clrbits_32(IMX_GPC_BASE + GPU2D_PGC, 0x1);
|
||||
|
||||
mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, GPU2D_PWR_REQ);
|
||||
|
||||
/* wait for power request done */
|
||||
while (mmio_read_32(IMX_GPC_BASE + PU_PGC_UP_TRG) & GPU2D_PWR_REQ) {
|
||||
;
|
||||
}
|
||||
|
||||
udelay(1);
|
||||
|
||||
/* power up GPU3D */
|
||||
mmio_clrbits_32(IMX_GPC_BASE + GPU3D_PGC, 0x1);
|
||||
|
||||
mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, GPU3D_PWR_REQ);
|
||||
|
||||
/* wait for power request done */
|
||||
while (mmio_read_32(IMX_GPC_BASE + PU_PGC_UP_TRG) & GPU3D_PWR_REQ) {
|
||||
;
|
||||
}
|
||||
|
||||
udelay(10);
|
||||
/* release the gpumix reset */
|
||||
mmio_write_32(IMX_SRC_BASE + GPU_RCR, 0x0);
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
/* vpu sft clock enable */
|
||||
if (domain_id == VPUMIX) {
|
||||
mmio_write_32(IMX_SRC_BASE + VPU_RCR, 0x1);
|
||||
udelay(5);
|
||||
mmio_write_32(IMX_SRC_BASE + VPU_RCR, 0x0);
|
||||
udelay(5);
|
||||
|
||||
/* enable all clock */
|
||||
mmio_write_32(VPU_CTL_BASE + 0x4, 0x7);
|
||||
}
|
||||
|
||||
if (domain_id == DISPMIX) {
|
||||
/* special setting for DISPMIX */
|
||||
mmio_write_32(DISP_CTL_BASE + 0x4, 0x1fff);
|
||||
mmio_write_32(DISP_CTL_BASE, 0x7f);
|
||||
mmio_write_32(DISP_CTL_BASE + 0x8, 0x30000);
|
||||
}
|
||||
|
||||
/* handle the ADB400 sync */
|
||||
if (pwr_domain->need_sync) {
|
||||
/* clear adb power down request */
|
||||
mmio_setbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, pwr_domain->adb400_sync);
|
||||
|
||||
/* wait for adb power request ack */
|
||||
while (!(mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & pwr_domain->adb400_ack)) {
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
if (domain_id == GPUMIX) {
|
||||
/* power up GPU2D ADB */
|
||||
mmio_setbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU2D_ADB400_SYNC);
|
||||
|
||||
/* wait for adb power request ack */
|
||||
while (!(mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU2D_ADB400_ACK)) {
|
||||
;
|
||||
}
|
||||
|
||||
/* power up GPU3D ADB */
|
||||
mmio_setbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU3D_ADB400_SYNC);
|
||||
|
||||
/* wait for adb power request ack */
|
||||
while (!(mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU3D_ADB400_ACK)) {
|
||||
;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
pu_domain_status &= ~(1 << domain_id);
|
||||
|
||||
if (domain_id == OTG1 || domain_id == OTG2) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* GPU2D & GPU3D ADB power down */
|
||||
if (domain_id == GPUMIX) {
|
||||
mmio_clrbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU2D_ADB400_SYNC);
|
||||
|
||||
/* wait for adb power request ack */
|
||||
while ((mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU2D_ADB400_ACK)) {
|
||||
;
|
||||
}
|
||||
|
||||
mmio_clrbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU3D_ADB400_SYNC);
|
||||
|
||||
/* wait for adb power request ack */
|
||||
while ((mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU3D_ADB400_ACK)) {
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
/* handle the ADB400 sync */
|
||||
if (pwr_domain->need_sync) {
|
||||
/* set adb power down request */
|
||||
mmio_clrbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, pwr_domain->adb400_sync);
|
||||
|
||||
/* wait for adb power request ack */
|
||||
while ((mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & pwr_domain->adb400_ack)) {
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
if (domain_id == GPUMIX) {
|
||||
/* power down GPU2D */
|
||||
mmio_setbits_32(IMX_GPC_BASE + GPU2D_PGC, 0x1);
|
||||
|
||||
mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, GPU2D_PWR_REQ);
|
||||
|
||||
/* wait for power request done */
|
||||
while (mmio_read_32(IMX_GPC_BASE + PU_PGC_DN_TRG) & GPU2D_PWR_REQ) {
|
||||
;
|
||||
}
|
||||
|
||||
/* power down GPU3D */
|
||||
mmio_setbits_32(IMX_GPC_BASE + GPU3D_PGC, 0x1);
|
||||
|
||||
mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, GPU3D_PWR_REQ);
|
||||
|
||||
/* wait for power request done */
|
||||
while (mmio_read_32(IMX_GPC_BASE + PU_PGC_DN_TRG) & GPU3D_PWR_REQ) {
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
/* HSIOMIX has no PU bit, so skip for it */
|
||||
if (domain_id != HSIOMIX) {
|
||||
/* set the PGC bit */
|
||||
mmio_setbits_32(IMX_GPC_BASE + pwr_domain->pgc_offset, 0x1);
|
||||
|
||||
/* power down the domain */
|
||||
mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, pwr_domain->pwr_req);
|
||||
|
||||
/* wait for power request done */
|
||||
while (mmio_read_32(IMX_GPC_BASE + PU_PGC_DN_TRG) & pwr_domain->pwr_req) {
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void imx_gpc_init(void)
|
||||
{
|
||||
unsigned int val;
|
||||
int i;
|
||||
|
||||
/* mask all the wakeup irq by default */
|
||||
for (i = 0; i < 4; i++) {
|
||||
mmio_write_32(IMX_GPC_BASE + IMR1_CORE0_A53 + i * 4, ~0x0);
|
||||
mmio_write_32(IMX_GPC_BASE + IMR1_CORE1_A53 + i * 4, ~0x0);
|
||||
mmio_write_32(IMX_GPC_BASE + IMR1_CORE2_A53 + i * 4, ~0x0);
|
||||
mmio_write_32(IMX_GPC_BASE + IMR1_CORE3_A53 + i * 4, ~0x0);
|
||||
mmio_write_32(IMX_GPC_BASE + IMR1_CORE0_M4 + i * 4, ~0x0);
|
||||
}
|
||||
|
||||
val = mmio_read_32(IMX_GPC_BASE + LPCR_A53_BSC);
|
||||
/* use GIC wake_request to wakeup C0~C3 from LPM */
|
||||
val |= 0x30c00000;
|
||||
/* clear the MASTER0 LPM handshake */
|
||||
val &= ~(1 << 6);
|
||||
mmio_write_32(IMX_GPC_BASE + LPCR_A53_BSC, val);
|
||||
|
||||
/* clear MASTER1 & MASTER2 mapping in CPU0(A53) */
|
||||
mmio_clrbits_32(IMX_GPC_BASE + MST_CPU_MAPPING, (MASTER1_MAPPING |
|
||||
MASTER2_MAPPING));
|
||||
|
||||
/* set all mix/PU in A53 domain */
|
||||
mmio_write_32(IMX_GPC_BASE + PGC_CPU_0_1_MAPPING, 0xffff);
|
||||
|
||||
/*
|
||||
* Set the CORE & SCU power up timing:
|
||||
* SW = 0x1, SW2ISO = 0x1;
|
||||
* the CPU CORE and SCU power up timming counter
|
||||
* is drived by 32K OSC, each domain's power up
|
||||
* latency is (SW + SW2ISO) / 32768
|
||||
*/
|
||||
mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(0) + 0x4, 0x81);
|
||||
mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(1) + 0x4, 0x81);
|
||||
mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(2) + 0x4, 0x81);
|
||||
mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(3) + 0x4, 0x81);
|
||||
mmio_write_32(IMX_GPC_BASE + PLAT_PGC_PCR + 0x4, 0x81);
|
||||
mmio_write_32(IMX_GPC_BASE + PGC_SCU_TIMING,
|
||||
(0x59 << 10) | 0x5B | (0x2 << 20));
|
||||
|
||||
/* set DUMMY PDN/PUP ACK by default for A53 domain */
|
||||
mmio_write_32(IMX_GPC_BASE + PGC_ACK_SEL_A53,
|
||||
A53_DUMMY_PUP_ACK | A53_DUMMY_PDN_ACK);
|
||||
|
||||
/* clear DSM by default */
|
||||
val = mmio_read_32(IMX_GPC_BASE + SLPCR);
|
||||
val &= ~SLPCR_EN_DSM;
|
||||
/* enable the fast wakeup wait mode */
|
||||
val |= SLPCR_A53_FASTWUP_WAIT_MODE;
|
||||
/* clear the RBC */
|
||||
val &= ~(0x3f << SLPCR_RBC_COUNT_SHIFT);
|
||||
/* set the STBY_COUNT to 0x5, (128 * 30)us */
|
||||
val &= ~(0x7 << SLPCR_STBY_COUNT_SHFT);
|
||||
val |= (0x5 << SLPCR_STBY_COUNT_SHFT);
|
||||
mmio_write_32(IMX_GPC_BASE + SLPCR, val);
|
||||
|
||||
/*
|
||||
* USB PHY power up needs to make sure RESET bit in SRC is clear,
|
||||
* otherwise, the PU power up bit in GPC will NOT self-cleared.
|
||||
* only need to do it once.
|
||||
*/
|
||||
mmio_clrbits_32(IMX_SRC_BASE + SRC_OTG1PHY_SCR, 0x1);
|
||||
mmio_clrbits_32(IMX_SRC_BASE + SRC_OTG2PHY_SCR, 0x1);
|
||||
}
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright 2017-2021 NXP
|
||||
* Copyright 2021 Arm
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <arch_helpers.h>
|
||||
#include <common/bl_common.h>
|
||||
#include <common/debug.h>
|
||||
#include <common/desc_image_load.h>
|
||||
#include <context.h>
|
||||
#include <drivers/console.h>
|
||||
#include <drivers/generic_delay_timer.h>
|
||||
#include <drivers/mmc.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <lib/optee_utils.h>
|
||||
#include <lib/utils.h>
|
||||
#include <stdbool.h>
|
||||
#include <tbbr_img_def.h>
|
||||
|
||||
#include <imx_aipstz.h>
|
||||
#include <imx_csu.h>
|
||||
#include <imx_uart.h>
|
||||
#include <imx_usdhc.h>
|
||||
#include <plat/common/platform.h>
|
||||
|
||||
#include "imx8mm_private.h"
|
||||
#include "platform_def.h"
|
||||
|
||||
static const struct aipstz_cfg aipstz[] = {
|
||||
{IMX_AIPSTZ1, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
|
||||
{IMX_AIPSTZ2, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
|
||||
{IMX_AIPSTZ3, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
|
||||
{IMX_AIPSTZ4, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
|
||||
{0},
|
||||
};
|
||||
|
||||
static void imx8mm_usdhc_setup(void)
|
||||
{
|
||||
imx_usdhc_params_t params;
|
||||
struct mmc_device_info info;
|
||||
|
||||
params.reg_base = PLAT_IMX8MM_BOOT_MMC_BASE;
|
||||
/*
|
||||
The imx8mm SD Card Speed modes for USDHC2
|
||||
+--------------+--------------------+--------------+--------------+
|
||||
|Bus Speed Mode|Max. Clock Frequency|Max. Bus Speed|Signal Voltage|
|
||||
+--------------+--------------------+--------------+--------------+
|
||||
|Default Speed | 25 MHz | 12.5 MB/s | 3.3V |
|
||||
|High Speed | 50 MHz | 25 MB/s | 3.3V |
|
||||
+--------------+--------------------+--------------+--------------+
|
||||
|
||||
We pick 50 Mhz here for High Speed access.
|
||||
*/
|
||||
params.clk_rate = 50000000;
|
||||
params.bus_width = MMC_BUS_WIDTH_1;
|
||||
params.flags = 0;
|
||||
info.mmc_dev_type = MMC_IS_SD;
|
||||
info.ocr_voltage = OCR_3_3_3_4 | OCR_3_2_3_3;
|
||||
imx_usdhc_init(¶ms, &info);
|
||||
}
|
||||
|
||||
void bl2_el3_early_platform_setup(u_register_t arg1, u_register_t arg2,
|
||||
u_register_t arg3, u_register_t arg4)
|
||||
{
|
||||
int i;
|
||||
static console_t console;
|
||||
|
||||
/* enable CSU NS access permission */
|
||||
for (i = 0; i < MAX_CSU_NUM; i++) {
|
||||
mmio_write_32(IMX_CSU_BASE + i * 4, CSU_CSL_OPEN_ACCESS);
|
||||
}
|
||||
|
||||
/* config the aips access permission */
|
||||
imx_aipstz_init(aipstz);
|
||||
|
||||
console_imx_uart_register(IMX_BOOT_UART_BASE, IMX_BOOT_UART_CLK_IN_HZ,
|
||||
IMX_CONSOLE_BAUDRATE, &console);
|
||||
|
||||
generic_delay_timer_init();
|
||||
|
||||
/* select the CKIL source to 32K OSC */
|
||||
mmio_write_32(0x30360124, 0x1);
|
||||
|
||||
imx8mm_usdhc_setup();
|
||||
|
||||
/* Open handles to a FIP image */
|
||||
plat_imx_io_setup();
|
||||
}
|
||||
|
||||
void bl2_el3_plat_arch_setup(void)
|
||||
{
|
||||
}
|
||||
|
||||
void bl2_platform_setup(void)
|
||||
{
|
||||
}
|
||||
|
||||
int bl2_plat_handle_post_image_load(unsigned int image_id)
|
||||
{
|
||||
int err = 0;
|
||||
bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
|
||||
bl_mem_params_node_t *pager_mem_params = NULL;
|
||||
bl_mem_params_node_t *paged_mem_params = NULL;
|
||||
|
||||
assert(bl_mem_params);
|
||||
|
||||
switch (image_id) {
|
||||
case BL32_IMAGE_ID:
|
||||
pager_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID);
|
||||
assert(pager_mem_params);
|
||||
|
||||
paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID);
|
||||
assert(paged_mem_params);
|
||||
|
||||
err = parse_optee_header(&bl_mem_params->ep_info,
|
||||
&pager_mem_params->image_info,
|
||||
&paged_mem_params->image_info);
|
||||
if (err != 0) {
|
||||
WARN("OPTEE header parse error.\n");
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
/* Do nothing in default case */
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
unsigned int plat_get_syscnt_freq2(void)
|
||||
{
|
||||
return COUNTER_FREQUENCY;
|
||||
}
|
||||
|
||||
void bl2_plat_runtime_setup(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <arch.h>
|
||||
#include <common/desc_image_load.h>
|
||||
#include <plat/common/platform.h>
|
||||
#include <platform_def.h>
|
||||
|
||||
static bl_mem_params_node_t bl2_mem_params_descs[] = {
|
||||
{
|
||||
.image_id = BL31_IMAGE_ID,
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
|
||||
entry_point_info_t,
|
||||
SECURE | EXECUTABLE | EP_FIRST_EXE),
|
||||
.ep_info.pc = BL31_BASE,
|
||||
.ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
|
||||
DISABLE_ALL_EXCEPTIONS),
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
|
||||
IMAGE_ATTRIB_PLAT_SETUP),
|
||||
.image_info.image_base = BL31_BASE,
|
||||
.image_info.image_max_size = BL31_LIMIT - BL31_BASE,
|
||||
.next_handoff_image_id = INVALID_IMAGE_ID,
|
||||
},
|
||||
{
|
||||
.image_id = BL32_IMAGE_ID,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
|
||||
entry_point_info_t,
|
||||
SECURE | EXECUTABLE),
|
||||
.ep_info.pc = BL32_BASE,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
|
||||
image_info_t, 0),
|
||||
|
||||
.image_info.image_base = BL32_BASE,
|
||||
.image_info.image_max_size = BL32_SIZE,
|
||||
|
||||
.next_handoff_image_id = BL33_IMAGE_ID,
|
||||
},
|
||||
{
|
||||
.image_id = BL32_EXTRA1_IMAGE_ID,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
|
||||
entry_point_info_t,
|
||||
SECURE | NON_EXECUTABLE),
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
|
||||
image_info_t, IMAGE_ATTRIB_SKIP_LOADING),
|
||||
.image_info.image_base = BL32_BASE,
|
||||
.image_info.image_max_size = BL32_SIZE,
|
||||
|
||||
.next_handoff_image_id = INVALID_IMAGE_ID,
|
||||
},
|
||||
{
|
||||
/* This is a zero sized image so we don't set base or size */
|
||||
.image_id = BL32_EXTRA2_IMAGE_ID,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
|
||||
VERSION_2, entry_point_info_t,
|
||||
SECURE | NON_EXECUTABLE),
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t,
|
||||
IMAGE_ATTRIB_SKIP_LOADING),
|
||||
.next_handoff_image_id = INVALID_IMAGE_ID,
|
||||
},
|
||||
{
|
||||
.image_id = BL33_IMAGE_ID,
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
|
||||
entry_point_info_t,
|
||||
NON_SECURE | EXECUTABLE),
|
||||
# ifdef PRELOADED_BL33_BASE
|
||||
.ep_info.pc = PLAT_NS_IMAGE_OFFSET,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t,
|
||||
IMAGE_ATTRIB_SKIP_LOADING),
|
||||
# else
|
||||
.ep_info.pc = PLAT_NS_IMAGE_OFFSET,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t, 0),
|
||||
.image_info.image_base = PLAT_NS_IMAGE_OFFSET,
|
||||
.image_info.image_max_size = PLAT_NS_IMAGE_SIZE,
|
||||
# endif /* PRELOADED_BL33_BASE */
|
||||
|
||||
.next_handoff_image_id = INVALID_IMAGE_ID,
|
||||
}
|
||||
};
|
||||
|
||||
REGISTER_BL_IMAGE_DESCS(bl2_mem_params_descs);
|
||||
+252
@@ -0,0 +1,252 @@
|
||||
/*
|
||||
* Copyright (c) 2019-2022 ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <arch_helpers.h>
|
||||
#include <common/bl_common.h>
|
||||
#include <common/debug.h>
|
||||
#include <context.h>
|
||||
#include <drivers/arm/tzc380.h>
|
||||
#include <drivers/console.h>
|
||||
#include <drivers/generic_delay_timer.h>
|
||||
#include <lib/el3_runtime/context_mgmt.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <lib/xlat_tables/xlat_tables_v2.h>
|
||||
#include <plat/common/platform.h>
|
||||
|
||||
#include <dram.h>
|
||||
#include <gpc.h>
|
||||
#include <imx_aipstz.h>
|
||||
#include <imx_uart.h>
|
||||
#include <imx_rdc.h>
|
||||
#include <imx8m_caam.h>
|
||||
#include <imx8m_csu.h>
|
||||
#include <plat_imx8.h>
|
||||
|
||||
#define TRUSTY_PARAMS_LEN_BYTES (4096*2)
|
||||
|
||||
/*
|
||||
* Note: DRAM region is mapped with entire size available and uses MT_RW
|
||||
* attributes.
|
||||
* See details in docs/plat/imx8m.rst "High Assurance Boot (HABv4)" section
|
||||
* for explanation of this mapping scheme.
|
||||
*/
|
||||
static const mmap_region_t imx_mmap[] = {
|
||||
MAP_REGION_FLAT(IMX_GIC_BASE, IMX_GIC_SIZE, MT_DEVICE | MT_RW),
|
||||
MAP_REGION_FLAT(IMX_AIPS_BASE, IMX_AIPS_SIZE, MT_DEVICE | MT_RW), /* AIPS map */
|
||||
MAP_REGION_FLAT(OCRAM_S_BASE, OCRAM_S_SIZE, MT_DEVICE | MT_RW), /* OCRAM_S */
|
||||
MAP_REGION_FLAT(IMX_DDRPHY_BASE, IMX_DDR_IPS_SIZE, MT_DEVICE | MT_RW), /* DDRMIX */
|
||||
MAP_REGION_FLAT(IMX_VPUMIX_BASE, IMX_VPUMIX_SIZE, MT_DEVICE | MT_RW), /* VPUMIX */
|
||||
MAP_REGION_FLAT(IMX_CAAM_RAM_BASE, IMX_CAAM_RAM_SIZE, MT_MEMORY | MT_RW), /* CAMM RAM */
|
||||
MAP_REGION_FLAT(IMX_NS_OCRAM_BASE, IMX_NS_OCRAM_SIZE, MT_MEMORY | MT_RW), /* NS OCRAM */
|
||||
MAP_REGION_FLAT(IMX_ROM_BASE, IMX_ROM_SIZE, MT_MEMORY | MT_RO), /* ROM code */
|
||||
MAP_REGION_FLAT(IMX_DRAM_BASE, IMX_DRAM_SIZE, MT_MEMORY | MT_RW | MT_NS), /* DRAM */
|
||||
{0},
|
||||
};
|
||||
|
||||
static const struct aipstz_cfg aipstz[] = {
|
||||
{IMX_AIPSTZ1, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
|
||||
{IMX_AIPSTZ2, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
|
||||
{IMX_AIPSTZ3, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
|
||||
{IMX_AIPSTZ4, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
|
||||
{0},
|
||||
};
|
||||
|
||||
static const struct imx_rdc_cfg rdc[] = {
|
||||
/* Master domain assignment */
|
||||
RDC_MDAn(RDC_MDA_M4, DID1),
|
||||
|
||||
/* peripherals domain permission */
|
||||
RDC_PDAPn(RDC_PDAP_UART4, D1R | D1W),
|
||||
RDC_PDAPn(RDC_PDAP_UART2, D0R | D0W),
|
||||
|
||||
/* memory region */
|
||||
|
||||
/* Sentinel */
|
||||
{0},
|
||||
};
|
||||
|
||||
static const struct imx_csu_cfg csu_cfg[] = {
|
||||
/* peripherals csl setting */
|
||||
CSU_CSLx(0x1, CSU_SEC_LEVEL_0, UNLOCKED),
|
||||
|
||||
/* master HP0~1 */
|
||||
|
||||
/* SA setting */
|
||||
|
||||
/* HP control setting */
|
||||
|
||||
/* Sentinel */
|
||||
{0}
|
||||
};
|
||||
|
||||
static entry_point_info_t bl32_image_ep_info;
|
||||
static entry_point_info_t bl33_image_ep_info;
|
||||
|
||||
/* get SPSR for BL33 entry */
|
||||
static uint32_t get_spsr_for_bl33_entry(void)
|
||||
{
|
||||
unsigned long el_status;
|
||||
unsigned long mode;
|
||||
uint32_t spsr;
|
||||
|
||||
/* figure out what mode we enter the non-secure world */
|
||||
el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT;
|
||||
el_status &= ID_AA64PFR0_ELX_MASK;
|
||||
|
||||
mode = (el_status) ? MODE_EL2 : MODE_EL1;
|
||||
|
||||
spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS);
|
||||
return spsr;
|
||||
}
|
||||
|
||||
void bl31_tzc380_setup(void)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
val = mmio_read_32(IMX_IOMUX_GPR_BASE + 0x28);
|
||||
if ((val & GPR_TZASC_EN) != GPR_TZASC_EN)
|
||||
return;
|
||||
|
||||
tzc380_init(IMX_TZASC_BASE);
|
||||
|
||||
/*
|
||||
* Need to substact offset 0x40000000 from CPU address when
|
||||
* programming tzasc region for i.mx8mm.
|
||||
*/
|
||||
|
||||
/* Enable 1G-5G S/NS RW */
|
||||
tzc380_configure_region(0, 0x00000000, TZC_ATTR_REGION_SIZE(TZC_REGION_SIZE_4G) |
|
||||
TZC_ATTR_REGION_EN_MASK | TZC_ATTR_SP_ALL);
|
||||
}
|
||||
|
||||
void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
|
||||
u_register_t arg2, u_register_t arg3)
|
||||
{
|
||||
static console_t console;
|
||||
int i;
|
||||
|
||||
/* Enable CSU NS access permission */
|
||||
for (i = 0; i < 64; i++) {
|
||||
mmio_write_32(IMX_CSU_BASE + i * 4, 0x00ff00ff);
|
||||
}
|
||||
|
||||
imx_aipstz_init(aipstz);
|
||||
|
||||
imx_rdc_init(rdc);
|
||||
|
||||
imx_csu_init(csu_cfg);
|
||||
|
||||
console_imx_uart_register(IMX_BOOT_UART_BASE, IMX_BOOT_UART_CLK_IN_HZ,
|
||||
IMX_CONSOLE_BAUDRATE, &console);
|
||||
/* This console is only used for boot stage */
|
||||
console_set_scope(&console, CONSOLE_FLAG_BOOT);
|
||||
|
||||
imx8m_caam_init();
|
||||
|
||||
/*
|
||||
* tell BL3-1 where the non-secure software image is located
|
||||
* and the entry state information.
|
||||
*/
|
||||
bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET;
|
||||
bl33_image_ep_info.spsr = get_spsr_for_bl33_entry();
|
||||
SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);
|
||||
|
||||
#if defined(SPD_opteed) || defined(SPD_trusty)
|
||||
/* Populate entry point information for BL32 */
|
||||
SET_PARAM_HEAD(&bl32_image_ep_info, PARAM_EP, VERSION_1, 0);
|
||||
SET_SECURITY_STATE(bl32_image_ep_info.h.attr, SECURE);
|
||||
bl32_image_ep_info.pc = BL32_BASE;
|
||||
bl32_image_ep_info.spsr = 0;
|
||||
|
||||
/* Pass TEE base and size to bl33 */
|
||||
bl33_image_ep_info.args.arg1 = BL32_BASE;
|
||||
bl33_image_ep_info.args.arg2 = BL32_SIZE;
|
||||
|
||||
#ifdef SPD_trusty
|
||||
bl32_image_ep_info.args.arg0 = BL32_SIZE;
|
||||
bl32_image_ep_info.args.arg1 = BL32_BASE;
|
||||
#else
|
||||
/* Make sure memory is clean */
|
||||
mmio_write_32(BL32_FDT_OVERLAY_ADDR, 0);
|
||||
bl33_image_ep_info.args.arg3 = BL32_FDT_OVERLAY_ADDR;
|
||||
bl32_image_ep_info.args.arg3 = BL32_FDT_OVERLAY_ADDR;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
bl31_tzc380_setup();
|
||||
}
|
||||
|
||||
#define MAP_BL31_TOTAL \
|
||||
MAP_REGION_FLAT(BL31_START, BL31_SIZE, MT_MEMORY | MT_RW | MT_SECURE)
|
||||
#define MAP_BL31_RO \
|
||||
MAP_REGION_FLAT(BL_CODE_BASE, BL_CODE_END - BL_CODE_BASE, MT_MEMORY | MT_RO | MT_SECURE)
|
||||
#define MAP_COHERENT_MEM \
|
||||
MAP_REGION_FLAT(BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE, \
|
||||
MT_DEVICE | MT_RW | MT_SECURE)
|
||||
#define MAP_BL32_TOTAL \
|
||||
MAP_REGION_FLAT(BL32_BASE, BL32_SIZE, MT_MEMORY | MT_RW)
|
||||
|
||||
void bl31_plat_arch_setup(void)
|
||||
{
|
||||
const mmap_region_t bl_regions[] = {
|
||||
MAP_BL31_TOTAL,
|
||||
MAP_BL31_RO,
|
||||
#if USE_COHERENT_MEM
|
||||
MAP_COHERENT_MEM,
|
||||
#endif
|
||||
/* Map TEE memory */
|
||||
MAP_BL32_TOTAL,
|
||||
{0}
|
||||
};
|
||||
|
||||
setup_page_tables(bl_regions, imx_mmap);
|
||||
enable_mmu_el3(0);
|
||||
}
|
||||
|
||||
void bl31_platform_setup(void)
|
||||
{
|
||||
generic_delay_timer_init();
|
||||
|
||||
/* select the CKIL source to 32K OSC */
|
||||
mmio_write_32(IMX_ANAMIX_BASE + ANAMIX_MISC_CTL, 0x1);
|
||||
|
||||
/* Init the dram info */
|
||||
dram_info_init(SAVED_DRAM_TIMING_BASE);
|
||||
|
||||
plat_gic_driver_init();
|
||||
plat_gic_init();
|
||||
|
||||
imx_gpc_init();
|
||||
}
|
||||
|
||||
entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type)
|
||||
{
|
||||
if (type == NON_SECURE)
|
||||
return &bl33_image_ep_info;
|
||||
if (type == SECURE)
|
||||
return &bl32_image_ep_info;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
unsigned int plat_get_syscnt_freq2(void)
|
||||
{
|
||||
return COUNTER_FREQUENCY;
|
||||
}
|
||||
|
||||
#ifdef SPD_trusty
|
||||
void plat_trusty_set_boot_args(aapcs64_params_t *args)
|
||||
{
|
||||
args->arg0 = BL32_SIZE;
|
||||
args->arg1 = BL32_BASE;
|
||||
args->arg2 = TRUSTY_PARAMS_LEN_BYTES;
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <arch.h>
|
||||
#include <arch_helpers.h>
|
||||
#include <common/debug.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <lib/psci/psci.h>
|
||||
|
||||
#include <gpc.h>
|
||||
#include <imx8m_psci.h>
|
||||
#include <plat_imx8.h>
|
||||
|
||||
static const plat_psci_ops_t imx_plat_psci_ops = {
|
||||
.pwr_domain_on = imx_pwr_domain_on,
|
||||
.pwr_domain_on_finish = imx_pwr_domain_on_finish,
|
||||
.pwr_domain_off = imx_pwr_domain_off,
|
||||
.validate_ns_entrypoint = imx_validate_ns_entrypoint,
|
||||
.validate_power_state = imx_validate_power_state,
|
||||
.cpu_standby = imx_cpu_standby,
|
||||
.pwr_domain_suspend = imx_domain_suspend,
|
||||
.pwr_domain_suspend_finish = imx_domain_suspend_finish,
|
||||
.pwr_domain_pwr_down_wfi = imx_pwr_domain_pwr_down_wfi,
|
||||
.get_sys_suspend_power_state = imx_get_sys_suspend_power_state,
|
||||
.system_reset = imx_system_reset,
|
||||
.system_reset2 = imx_system_reset2,
|
||||
.system_off = imx_system_off,
|
||||
};
|
||||
|
||||
/* export the platform specific psci ops */
|
||||
int plat_setup_psci_ops(uintptr_t sec_entrypoint,
|
||||
const plat_psci_ops_t **psci_ops)
|
||||
{
|
||||
/* sec_entrypoint is used for warm reset */
|
||||
imx_mailbox_init(sec_entrypoint);
|
||||
|
||||
*psci_ops = &imx_plat_psci_ops;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
.global imx8mm_rotpk_hash
|
||||
.global imx8mm_rotpk_hash_end
|
||||
imx8mm_rotpk_hash:
|
||||
/* DER header */
|
||||
.byte 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48
|
||||
.byte 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20
|
||||
/* SHA256 */
|
||||
.incbin ROTPK_HASH
|
||||
imx8mm_rotpk_hash_end:
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <plat/common/platform.h>
|
||||
|
||||
extern char imx8mm_rotpk_hash[], imx8mm_rotpk_hash_end[];
|
||||
|
||||
int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
|
||||
unsigned int *flags)
|
||||
{
|
||||
*key_ptr = imx8mm_rotpk_hash;
|
||||
*key_len = imx8mm_rotpk_hash_end - imx8mm_rotpk_hash;
|
||||
*flags = ROTPK_IS_HASH;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr)
|
||||
{
|
||||
*nv_ctr = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
|
||||
{
|
||||
return get_mbedtls_heap_helper(heap_addr, heap_size);
|
||||
}
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
/*
|
||||
* Copyright 2020 NXP
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef GPC_REG_H
|
||||
#define GPC_REG_H
|
||||
|
||||
#define LPCR_A53_BSC 0x0
|
||||
#define LPCR_A53_BSC2 0x108
|
||||
#define LPCR_A53_AD 0x4
|
||||
#define LPCR_M4 0x8
|
||||
#define SLPCR 0x14
|
||||
#define MST_CPU_MAPPING 0x18
|
||||
#define MLPCR 0x20
|
||||
#define PGC_ACK_SEL_A53 0x24
|
||||
#define IMR1_CORE0_A53 0x30
|
||||
#define IMR1_CORE1_A53 0x40
|
||||
#define IMR1_CORE2_A53 0x1C0
|
||||
#define IMR1_CORE3_A53 0x1D0
|
||||
#define IMR1_CORE0_M4 0x50
|
||||
#define SLT0_CFG 0xB0
|
||||
#define GPC_PU_PWRHSK 0x1FC
|
||||
#define PGC_CPU_0_1_MAPPING 0xEC
|
||||
#define CPU_PGC_UP_TRG 0xF0
|
||||
#define PU_PGC_UP_TRG 0xF8
|
||||
#define CPU_PGC_DN_TRG 0xFC
|
||||
#define PU_PGC_DN_TRG 0x104
|
||||
#define LPS_CPU1 0x114
|
||||
#define A53_CORE0_PGC 0x800
|
||||
#define A53_PLAT_PGC 0x900
|
||||
#define PLAT_PGC_PCR 0x900
|
||||
#define NOC_PGC_PCR 0xa40
|
||||
#define PGC_SCU_TIMING 0x910
|
||||
|
||||
#define MASK_DSM_TRIGGER_A53 BIT(31)
|
||||
#define IRQ_SRC_A53_WUP BIT(30)
|
||||
#define IRQ_SRC_A53_WUP_SHIFT 30
|
||||
#define IRQ_SRC_C1 BIT(29)
|
||||
#define IRQ_SRC_C0 BIT(28)
|
||||
#define IRQ_SRC_C3 BIT(23)
|
||||
#define IRQ_SRC_C2 BIT(22)
|
||||
#define CPU_CLOCK_ON_LPM BIT(14)
|
||||
#define A53_CLK_ON_LPM BIT(14)
|
||||
#define MASTER0_LPM_HSK BIT(6)
|
||||
#define MASTER1_LPM_HSK BIT(7)
|
||||
#define MASTER2_LPM_HSK BIT(8)
|
||||
|
||||
#define L2PGE BIT(31)
|
||||
#define EN_L2_WFI_PDN BIT(5)
|
||||
#define EN_PLAT_PDN BIT(4)
|
||||
|
||||
#define SLPCR_EN_DSM BIT(31)
|
||||
#define SLPCR_RBC_EN BIT(30)
|
||||
#define SLPCR_A53_FASTWUP_STOP_MODE BIT(17)
|
||||
#define SLPCR_A53_FASTWUP_WAIT_MODE BIT(16)
|
||||
#define SLPCR_VSTBY BIT(2)
|
||||
#define SLPCR_SBYOS BIT(1)
|
||||
#define SLPCR_BYPASS_PMIC_READY BIT(0)
|
||||
#define SLPCR_RBC_COUNT_SHIFT 24
|
||||
#define SLPCR_STBY_COUNT_SHFT 3
|
||||
|
||||
#define A53_DUMMY_PDN_ACK BIT(15)
|
||||
#define A53_DUMMY_PUP_ACK BIT(31)
|
||||
#define A53_PLAT_PDN_ACK BIT(2)
|
||||
#define A53_PLAT_PUP_ACK BIT(18)
|
||||
#define NOC_PDN_SLT_CTRL BIT(10)
|
||||
#define NOC_PUP_SLT_CTRL BIT(11)
|
||||
#define NOC_PGC_PDN_ACK BIT(3)
|
||||
#define NOC_PGC_PUP_ACK BIT(19)
|
||||
|
||||
#define PLAT_PUP_SLT_CTRL BIT(9)
|
||||
#define PLAT_PDN_SLT_CTRL BIT(8)
|
||||
|
||||
#define SLT_PLAT_PDN BIT(8)
|
||||
#define SLT_PLAT_PUP BIT(9)
|
||||
|
||||
#define MASTER1_MAPPING BIT(1)
|
||||
#define MASTER2_MAPPING BIT(2)
|
||||
|
||||
#define MIPI_PWR_REQ BIT(0)
|
||||
#define PCIE_PWR_REQ BIT(1)
|
||||
#define OTG1_PWR_REQ BIT(2)
|
||||
#define OTG2_PWR_REQ BIT(3)
|
||||
#define HSIOMIX_PWR_REQ BIT(4)
|
||||
#define DDRMIX_PWR_REQ BIT(5)
|
||||
#define GPU2D_PWR_REQ BIT(6)
|
||||
#define GPUMIX_PWR_REQ BIT(7)
|
||||
#define VPUMIX_PWR_REQ BIT(8)
|
||||
#define GPU3D_PWR_REQ BIT(9)
|
||||
#define DISPMIX_PWR_REQ BIT(10)
|
||||
#define VPU_G1_PWR_REQ BIT(11)
|
||||
#define VPU_G2_PWR_REQ BIT(12)
|
||||
#define VPU_H1_PWR_REQ BIT(13)
|
||||
|
||||
#define DDRMIX_ADB400_SYNC BIT(2)
|
||||
#define HSIOMIX_ADB400_SYNC (0x3 << 5)
|
||||
#define DISPMIX_ADB400_SYNC BIT(7)
|
||||
#define VPUMIX_ADB400_SYNC BIT(8)
|
||||
#define GPU3D_ADB400_SYNC BIT(9)
|
||||
#define GPU2D_ADB400_SYNC BIT(10)
|
||||
#define GPUMIX_ADB400_SYNC BIT(11)
|
||||
#define DDRMIX_ADB400_ACK BIT(20)
|
||||
#define HSIOMIX_ADB400_ACK (0x3 << 23)
|
||||
#define DISPMIX_ADB400_ACK BIT(25)
|
||||
#define VPUMIX_ADB400_ACK BIT(26)
|
||||
#define GPU3D_ADB400_ACK BIT(27)
|
||||
#define GPU2D_ADB400_ACK BIT(28)
|
||||
#define GPUMIX_ADB400_ACK BIT(29)
|
||||
|
||||
#define MIPI_PGC 0xc00
|
||||
#define PCIE_PGC 0xc40
|
||||
#define OTG1_PGC 0xc80
|
||||
#define OTG2_PGC 0xcc0
|
||||
#define HSIOMIX_PGC 0xd00
|
||||
#define DDRMIX_PGC 0xd40
|
||||
#define GPU2D_PGC 0xd80
|
||||
#define GPUMIX_PGC 0xdc0
|
||||
#define VPUMIX_PGC 0xe00
|
||||
#define GPU3D_PGC 0xe40
|
||||
#define DISPMIX_PGC 0xe80
|
||||
#define VPU_G1_PGC 0xec0
|
||||
#define VPU_G2_PGC 0xf00
|
||||
#define VPU_H1_PGC 0xf40
|
||||
|
||||
#define IRQ_IMR_NUM U(4)
|
||||
|
||||
#endif /* GPC_REG_H */
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef IMX8MM_PRIVATE_H
|
||||
#define IMX8MM_PRIVATE_H
|
||||
|
||||
/*******************************************************************************
|
||||
* Function and variable prototypes
|
||||
******************************************************************************/
|
||||
void plat_imx_io_setup(void);
|
||||
|
||||
#endif /* IMX8MM_PRIVATE_H */
|
||||
+216
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
* Copyright 2020-2022 NXP
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef IMX_SEC_DEF_H
|
||||
#define IMX_SEC_DEF_H
|
||||
|
||||
/* RDC MDA index */
|
||||
enum rdc_mda_idx {
|
||||
RDC_MDA_A53 = 0,
|
||||
RDC_MDA_M4 = 1,
|
||||
RDC_MDA_PCIE_CTRL1 = 2,
|
||||
RDC_MDA_SDMA3p = 3,
|
||||
RDC_MDA_VPU_Decoders = 4,
|
||||
RDC_MDA_LCDIF = 5,
|
||||
RDC_MDA_CSI1 = 6,
|
||||
RDC_MDA_SDMA3b = 7,
|
||||
RDC_MDA_Coresight = 8,
|
||||
RDC_MDA_DAP = 9,
|
||||
RDC_MDA_CAAM = 10,
|
||||
RDC_MDA_SDMA1p = 11,
|
||||
RDC_MDA_SDMA1b = 12,
|
||||
RDC_MDA_APBHDMA = 13,
|
||||
RDC_MDA_NAND = 14,
|
||||
RDC_MDA_uSDHC1 = 15,
|
||||
RDC_MDA_uSDHC2 = 16,
|
||||
RDC_MDA_uSDHC3 = 17,
|
||||
RDC_MDA_GPU = 18,
|
||||
RDC_MDA_USB1 = 19,
|
||||
RDC_MDA_USB2 = 20,
|
||||
RDC_MDA_TESTPORT = 21,
|
||||
RDC_MDA_ENET1_TX = 22,
|
||||
RDC_MDA_ENET1_RX = 23,
|
||||
RDC_MDA_SDMA2p = 24,
|
||||
RDC_MDA_SDMA2b = 24,
|
||||
RDC_MDA_SDMA2_to_SPBA2 = 24,
|
||||
RDC_MDA_SDMA3_to_SPBA2 = 25,
|
||||
RDC_MDA_SDMA1_to_SPBA1 = 26,
|
||||
};
|
||||
|
||||
/* RDC Peripherals index */
|
||||
enum rdc_pdap_idx {
|
||||
RDC_PDAP_GPIO2 = 1,
|
||||
RDC_PDAP_GPIO3 = 2,
|
||||
RDC_PDAP_GPIO4 = 3,
|
||||
RDC_PDAP_GPIO5 = 4,
|
||||
RDC_PDAP_ANA_TSENSOR = 6,
|
||||
RDC_PDAP_ANA_OSC = 7,
|
||||
RDC_PDAP_WDOG1 = 8,
|
||||
RDC_PDAP_WDOG2 = 9,
|
||||
RDC_PDAP_WDOG3 = 10,
|
||||
RDC_PDAP_SDMA3 = 11,
|
||||
RDC_PDAP_SDMA2 = 12,
|
||||
RDC_PDAP_GPT1 = 13,
|
||||
RDC_PDAP_GPT2 = 14,
|
||||
RDC_PDAP_GPT3 = 15,
|
||||
RDC_PDAP_ROMCP = 17,
|
||||
RDC_PDAP_IOMUXC = 19,
|
||||
RDC_PDAP_IOMUXC_GPR = 20,
|
||||
RDC_PDAP_OCOTP_CTRL = 21,
|
||||
RDC_PDAP_ANA_PLL = 22,
|
||||
RDC_PDAP_SNVS_HP = 23,
|
||||
RDC_PDAP_CCM = 24,
|
||||
RDC_PDAP_SRC = 25,
|
||||
RDC_PDAP_GPC = 26,
|
||||
RDC_PDAP_SEMAPHORE1 = 27,
|
||||
RDC_PDAP_SEMAPHORE2 = 28,
|
||||
RDC_PDAP_RDC = 29,
|
||||
RDC_PDAP_CSU = 30,
|
||||
RDC_PDAP_LCDIF = 32,
|
||||
RDC_PDAP_MIPI_DSI = 33,
|
||||
RDC_PDAP_CSI = 34,
|
||||
RDC_PDAP_MIPI_CSI = 35,
|
||||
RDC_PDAP_USB1 = 36,
|
||||
RDC_PDAP_PWM1 = 38,
|
||||
RDC_PDAP_PWM2 = 39,
|
||||
RDC_PDAP_PWM3 = 40,
|
||||
RDC_PDAP_PWM4 = 41,
|
||||
RDC_PDAP_System_Counter_RD = 42,
|
||||
RDC_PDAP_System_Counter_CMP = 43,
|
||||
RDC_PDAP_System_Counter_CTRL = 44,
|
||||
RDC_PDAP_GPT6 = 46,
|
||||
RDC_PDAP_GPT5 = 47,
|
||||
RDC_PDAP_GPT4 = 48,
|
||||
RDC_PDAP_TZASC = 56,
|
||||
RDC_PDAP_USB2 = 59,
|
||||
RDC_PDAP_PERFMON1 = 60,
|
||||
RDC_PDAP_PERFMON2 = 61,
|
||||
RDC_PDAP_PLATFORM_CTRL = 62,
|
||||
RDC_PDAP_QoSC = 63,
|
||||
RDC_PDAP_I2C1 = 66,
|
||||
RDC_PDAP_I2C2 = 67,
|
||||
RDC_PDAP_I2C3 = 68,
|
||||
RDC_PDAP_I2C4 = 69,
|
||||
RDC_PDAP_UART4 = 70,
|
||||
RDC_PDAP_MU_A = 74,
|
||||
RDC_PDAP_MU_B = 75,
|
||||
RDC_PDAP_SEMAPHORE_HS = 76,
|
||||
RDC_PDAP_SAI1 = 78,
|
||||
RDC_PDAP_SAI2 = 79,
|
||||
RDC_PDAP_SAI3 = 80,
|
||||
RDC_PDAP_SAI5 = 82,
|
||||
RDC_PDAP_SAI6 = 83,
|
||||
RDC_PDAP_uSDHC1 = 84,
|
||||
RDC_PDAP_uSDHC2 = 85,
|
||||
RDC_PDAP_uSDHC3 = 86,
|
||||
RDC_PDAP_PCIE_PHY1 = 88,
|
||||
RDC_PDAP_SPBA2 = 90,
|
||||
RDC_PDAP_QSPI = 91,
|
||||
RDC_PDAP_SDMA1 = 93,
|
||||
RDC_PDAP_ENET1 = 94,
|
||||
RDC_PDAP_SPDIF1 = 97,
|
||||
RDC_PDAP_eCSPI1 = 98,
|
||||
RDC_PDAP_eCSPI2 = 99,
|
||||
RDC_PDAP_eCSPI3 = 100,
|
||||
RDC_PDAP_MICFIL = 101,
|
||||
RDC_PDAP_UART1 = 102,
|
||||
RDC_PDAP_UART3 = 104,
|
||||
RDC_PDAP_UART2 = 105,
|
||||
RDC_PDAP_SPDIF2 = 106,
|
||||
RDC_PDAP_SPBA1 = 111,
|
||||
RDC_PDAP_CAAM = 114,
|
||||
};
|
||||
|
||||
enum csu_csl_idx {
|
||||
CSU_CSL_GPIO1 = 0,
|
||||
CSU_CSL_GPIO2 = 1,
|
||||
CSU_CSL_GPIO3 = 2,
|
||||
CSU_CSL_GPIO4 = 3,
|
||||
CSU_CSL_GPIO5 = 4,
|
||||
CSU_CSL_ANA_TSENSOR = 6,
|
||||
CSU_CSL_ANA_OSC = 7,
|
||||
CSU_CSL_WDOG1 = 8,
|
||||
CSU_CSL_WDOG2 = 9,
|
||||
CSU_CSL_WDOG3 = 10,
|
||||
CSU_CSL_SDMA2 = 12,
|
||||
CSU_CSL_GPT1 = 13,
|
||||
CSU_CSL_GPT2 = 14,
|
||||
CSU_CSL_GPT3 = 15,
|
||||
CSU_CSL_ROMCP = 17,
|
||||
CSU_CSL_LCDIF = 18,
|
||||
CSU_CSL_IOMUXC = 19,
|
||||
CSU_CSL_IOMUXC_GPR = 20,
|
||||
CSU_CSL_OCOTP_CTRL = 21,
|
||||
CSU_CSL_ANA_PLL = 22,
|
||||
CSU_CSL_SNVS_HP = 23,
|
||||
CSU_CSL_CCM = 24,
|
||||
CSU_CSL_SRC = 25,
|
||||
CSU_CSL_GPC = 26,
|
||||
CSU_CSL_SEMAPHORE1 = 27,
|
||||
CSU_CSL_SEMAPHORE2 = 28,
|
||||
CSU_CSL_RDC = 29,
|
||||
CSU_CSL_CSU = 30,
|
||||
CSU_CSL_DC_MST0 = 32,
|
||||
CSU_CSL_DC_MST1 = 33,
|
||||
CSU_CSL_DC_MST2 = 34,
|
||||
CSU_CSL_DC_MST3 = 35,
|
||||
CSU_CSL_PWM1 = 38,
|
||||
CSU_CSL_PWM2 = 39,
|
||||
CSU_CSL_PWM3 = 40,
|
||||
CSU_CSL_PWM4 = 41,
|
||||
CSU_CSL_System_Counter_RD = 42,
|
||||
CSU_CSL_System_Counter_CMP = 43,
|
||||
CSU_CSL_System_Counter_CTRL = 44,
|
||||
CSU_CSL_GPT6 = 46,
|
||||
CSU_CSL_GPT5 = 47,
|
||||
CSU_CSL_GPT4 = 48,
|
||||
CSU_CSL_TZASC = 56,
|
||||
CSU_CSL_MTR = 59,
|
||||
CSU_CSL_PERFMON1 = 60,
|
||||
CSU_CSL_PERFMON2 = 61,
|
||||
CSU_CSL_PLATFORM_CTRL = 62,
|
||||
CSU_CSL_QoSC = 63,
|
||||
CSU_CSL_MIPI_PHY = 64,
|
||||
CSU_CSL_MIPI_DSI = 65,
|
||||
CSU_CSL_I2C1 = 66,
|
||||
CSU_CSL_I2C2 = 67,
|
||||
CSU_CSL_I2C3 = 68,
|
||||
CSU_CSL_I2C4 = 69,
|
||||
CSU_CSL_UART4 = 70,
|
||||
CSU_CSL_MIPI_CSI1 = 71,
|
||||
CSU_CSL_MIPI_CSI_PHY1 = 72,
|
||||
CSU_CSL_CSI1 = 73,
|
||||
CSU_CSL_MU_A = 74,
|
||||
CSU_CSL_MU_B = 75,
|
||||
CSU_CSL_SEMAPHORE_HS = 76,
|
||||
CSU_CSL_SAI1 = 78,
|
||||
CSU_CSL_SAI6 = 80,
|
||||
CSU_CSL_SAI5 = 81,
|
||||
CSU_CSL_SAI4 = 82,
|
||||
CSU_CSL_uSDHC1 = 84,
|
||||
CSU_CSL_uSDHC2 = 85,
|
||||
CSU_CSL_MIPI_CSI2 = 86,
|
||||
CSU_CSL_MIPI_CSI_PHY2 = 87,
|
||||
CSU_CSL_CSI2 = 88,
|
||||
CSU_CSL_SPBA2 = 90,
|
||||
CSU_CSL_QSPI = 91,
|
||||
CSU_CSL_SDMA1 = 93,
|
||||
CSU_CSL_ENET1 = 94,
|
||||
CSU_CSL_SPDIF1 = 97,
|
||||
CSU_CSL_eCSPI1 = 98,
|
||||
CSU_CSL_eCSPI2 = 99,
|
||||
CSU_CSL_eCSPI3 = 100,
|
||||
CSU_CSL_UART1 = 102,
|
||||
CSU_CSL_UART3 = 104,
|
||||
CSU_CSL_UART2 = 105,
|
||||
CSU_CSL_SPDIF2 = 106,
|
||||
CSU_CSL_SAI2 = 107,
|
||||
CSU_CSL_SAI3 = 108,
|
||||
CSU_CSL_SPBA1 = 111,
|
||||
CSU_CSL_CAAM = 114,
|
||||
};
|
||||
|
||||
#endif /* IMX_SEC_DEF_H */
|
||||
+176
@@ -0,0 +1,176 @@
|
||||
/*
|
||||
* Copyright (c) 2021-2022, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <arch.h>
|
||||
#include <common/tbbr/tbbr_img_def.h>
|
||||
#include <lib/utils_def.h>
|
||||
#include <plat/common/common_def.h>
|
||||
|
||||
#define PLATFORM_LINKER_FORMAT "elf64-littleaarch64"
|
||||
#define PLATFORM_LINKER_ARCH aarch64
|
||||
|
||||
#define PLATFORM_STACK_SIZE 0xB00
|
||||
#define CACHE_WRITEBACK_GRANULE 64
|
||||
|
||||
#define PLAT_PRIMARY_CPU U(0x0)
|
||||
#define PLATFORM_MAX_CPU_PER_CLUSTER U(4)
|
||||
#define PLATFORM_CLUSTER_COUNT U(1)
|
||||
#define PLATFORM_CLUSTER0_CORE_COUNT U(4)
|
||||
#define PLATFORM_CLUSTER1_CORE_COUNT U(0)
|
||||
#define PLATFORM_CORE_COUNT (PLATFORM_CLUSTER0_CORE_COUNT)
|
||||
|
||||
#define IMX_PWR_LVL0 MPIDR_AFFLVL0
|
||||
#define IMX_PWR_LVL1 MPIDR_AFFLVL1
|
||||
#define IMX_PWR_LVL2 MPIDR_AFFLVL2
|
||||
|
||||
#define PWR_DOMAIN_AT_MAX_LVL U(1)
|
||||
#define PLAT_MAX_PWR_LVL U(2)
|
||||
#define PLAT_MAX_OFF_STATE U(4)
|
||||
#define PLAT_MAX_RET_STATE U(2)
|
||||
|
||||
#define PLAT_WAIT_RET_STATE U(1)
|
||||
#define PLAT_STOP_OFF_STATE U(3)
|
||||
|
||||
#define PLAT_PRI_BITS U(3)
|
||||
#define PLAT_SDEI_CRITICAL_PRI 0x10
|
||||
#define PLAT_SDEI_NORMAL_PRI 0x20
|
||||
#define PLAT_SDEI_SGI_PRIVATE U(9)
|
||||
|
||||
#if defined(NEED_BL2)
|
||||
#define BL2_BASE U(0x920000)
|
||||
#define BL2_SIZE SZ_128K
|
||||
#define BL2_LIMIT (BL2_BASE + BL2_SIZE)
|
||||
#define BL31_BASE U(0x900000)
|
||||
#define IMX_FIP_BASE U(0x40310000)
|
||||
#define IMX_FIP_SIZE U(0x000300000)
|
||||
#define IMX_FIP_LIMIT U(FIP_BASE + FIP_SIZE)
|
||||
|
||||
/* Define FIP image location on eMMC */
|
||||
#define IMX_FIP_MMC_BASE U(0x100000)
|
||||
|
||||
#define PLAT_IMX8MM_BOOT_MMC_BASE U(0x30B50000) /* SD */
|
||||
#else
|
||||
#define BL31_BASE U(0x920000)
|
||||
#endif
|
||||
|
||||
#define BL31_SIZE SZ_128K
|
||||
#define BL31_LIMIT (BL31_BASE + BL31_SIZE)
|
||||
|
||||
/* non-secure uboot base */
|
||||
#define PLAT_NS_IMAGE_OFFSET U(0x40200000)
|
||||
#define PLAT_NS_IMAGE_SIZE U(0x00200000)
|
||||
|
||||
#define BL32_FDT_OVERLAY_ADDR (PLAT_NS_IMAGE_OFFSET + 0x3000000)
|
||||
|
||||
/* GICv3 base address */
|
||||
#define PLAT_GICD_BASE U(0x38800000)
|
||||
#define PLAT_GICR_BASE U(0x38880000)
|
||||
|
||||
#define PLAT_VIRT_ADDR_SPACE_SIZE (1ull << 32)
|
||||
#define PLAT_PHY_ADDR_SPACE_SIZE (1ull << 32)
|
||||
|
||||
#define MAX_XLAT_TABLES 8
|
||||
#define MAX_MMAP_REGIONS 16
|
||||
|
||||
#define HAB_RVT_BASE U(0x00000900) /* HAB_RVT for i.MX8MM */
|
||||
|
||||
#define IMX_BOOT_UART_CLK_IN_HZ 24000000 /* Select 24MHz oscillator */
|
||||
|
||||
#define PLAT_CRASH_UART_BASE IMX_BOOT_UART_BASE
|
||||
#define PLAT_CRASH_UART_CLK_IN_HZ 24000000
|
||||
#define IMX_CONSOLE_BAUDRATE 115200
|
||||
|
||||
#define IMX_AIPSTZ1 U(0x301f0000)
|
||||
#define IMX_AIPSTZ2 U(0x305f0000)
|
||||
#define IMX_AIPSTZ3 U(0x309f0000)
|
||||
#define IMX_AIPSTZ4 U(0x32df0000)
|
||||
|
||||
#define IMX_AIPS_BASE U(0x30000000)
|
||||
#define IMX_AIPS_SIZE U(0x3000000)
|
||||
#define IMX_GPV_BASE U(0x32000000)
|
||||
#define IMX_GPV_SIZE U(0x800000)
|
||||
#define IMX_AIPS1_BASE U(0x30200000)
|
||||
#define IMX_AIPS4_BASE U(0x32c00000)
|
||||
#define IMX_ANAMIX_BASE U(0x30360000)
|
||||
#define IMX_CCM_BASE U(0x30380000)
|
||||
#define IMX_SRC_BASE U(0x30390000)
|
||||
#define IMX_GPC_BASE U(0x303a0000)
|
||||
#define IMX_RDC_BASE U(0x303d0000)
|
||||
#define IMX_CSU_BASE U(0x303e0000)
|
||||
#define IMX_WDOG_BASE U(0x30280000)
|
||||
#define IMX_SNVS_BASE U(0x30370000)
|
||||
#define IMX_NOC_BASE U(0x32700000)
|
||||
#define IMX_TZASC_BASE U(0x32F80000)
|
||||
#define IMX_IOMUX_GPR_BASE U(0x30340000)
|
||||
#define IMX_CAAM_BASE U(0x30900000)
|
||||
#define IMX_DDRC_BASE U(0x3d400000)
|
||||
#define IMX_DDRPHY_BASE U(0x3c000000)
|
||||
#define IMX_DDR_IPS_BASE U(0x3d000000)
|
||||
#define IMX_DDR_IPS_SIZE U(0x1800000)
|
||||
#define IMX_VPUMIX_BASE U(0x38330000)
|
||||
#define IMX_VPUMIX_SIZE U(0x100000)
|
||||
#define IMX_ROM_BASE U(0x0)
|
||||
#define IMX_ROM_SIZE U(0x40000)
|
||||
#define IMX_NS_OCRAM_BASE U(0x900000)
|
||||
#define IMX_NS_OCRAM_SIZE U(0x20000)
|
||||
#define IMX_CAAM_RAM_BASE U(0x100000)
|
||||
#define IMX_CAAM_RAM_SIZE U(0x10000)
|
||||
#define IMX_DRAM_BASE U(0x40000000)
|
||||
#define IMX_DRAM_SIZE U(0xc0000000)
|
||||
|
||||
#define GPV_BASE U(0x32000000)
|
||||
#define GPV_SIZE U(0x800000)
|
||||
#define IMX_GIC_BASE PLAT_GICD_BASE
|
||||
#define IMX_GIC_SIZE U(0x200000)
|
||||
|
||||
#define WDOG_WSR U(0x2)
|
||||
#define WDOG_WCR_WDZST BIT(0)
|
||||
#define WDOG_WCR_WDBG BIT(1)
|
||||
#define WDOG_WCR_WDE BIT(2)
|
||||
#define WDOG_WCR_WDT BIT(3)
|
||||
#define WDOG_WCR_SRS BIT(4)
|
||||
#define WDOG_WCR_WDA BIT(5)
|
||||
#define WDOG_WCR_SRE BIT(6)
|
||||
#define WDOG_WCR_WDW BIT(7)
|
||||
|
||||
#define SRC_A53RCR0 U(0x4)
|
||||
#define SRC_A53RCR1 U(0x8)
|
||||
#define SRC_OTG1PHY_SCR U(0x20)
|
||||
#define SRC_OTG2PHY_SCR U(0x24)
|
||||
#define SRC_GPR1_OFFSET U(0x74)
|
||||
#define SRC_GPR10_OFFSET U(0x98)
|
||||
#define SRC_GPR10_PERSIST_SECONDARY_BOOT BIT(30)
|
||||
|
||||
#define SNVS_LPCR U(0x38)
|
||||
#define SNVS_LPCR_SRTC_ENV BIT(0)
|
||||
#define SNVS_LPCR_DP_EN BIT(5)
|
||||
#define SNVS_LPCR_TOP BIT(6)
|
||||
|
||||
#define IOMUXC_GPR10 U(0x28)
|
||||
#define GPR_TZASC_EN BIT(0)
|
||||
#define GPR_TZASC_EN_LOCK BIT(16)
|
||||
|
||||
#define ANAMIX_MISC_CTL U(0x124)
|
||||
#define DRAM_PLL_CTRL (IMX_ANAMIX_BASE + 0x50)
|
||||
|
||||
#define MAX_CSU_NUM U(64)
|
||||
|
||||
#define OCRAM_S_BASE U(0x00180000)
|
||||
#define OCRAM_S_SIZE U(0x8000)
|
||||
#define OCRAM_S_LIMIT (OCRAM_S_BASE + OCRAM_S_SIZE)
|
||||
#define SAVED_DRAM_TIMING_BASE OCRAM_S_BASE
|
||||
|
||||
#define COUNTER_FREQUENCY 8000000 /* 8MHz */
|
||||
|
||||
#define IMX_WDOG_B_RESET
|
||||
|
||||
#define MAX_IO_HANDLES 3U
|
||||
#define MAX_IO_DEVICES 2U
|
||||
#define MAX_IO_BLOCK_DEVICES 1U
|
||||
|
||||
#define PLAT_IMX8M_DTO_BASE 0x53000000
|
||||
#define PLAT_IMX8M_DTO_MAX_SIZE 0x1000
|
||||
#define PLAT_IMX_EVENT_LOG_MAX_SIZE UL(0x400)
|
||||
@@ -0,0 +1,185 @@
|
||||
#
|
||||
# Copyright (c) 2019-2022, ARM Limited and Contributors. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
#
|
||||
# Translation tables library
|
||||
include lib/xlat_tables_v2/xlat_tables.mk
|
||||
|
||||
PLAT_INCLUDES := -Iplat/imx/common/include \
|
||||
-Iplat/imx/imx8m/include \
|
||||
-Iplat/imx/imx8m/imx8mm/include \
|
||||
-Idrivers/imx/usdhc \
|
||||
-Iinclude/common/tbbr \
|
||||
-Iinclude/lib/libfdt
|
||||
|
||||
# Include GICv3 driver files
|
||||
include drivers/arm/gic/v3/gicv3.mk
|
||||
|
||||
include lib/libfdt/libfdt.mk
|
||||
|
||||
IMX_DRAM_SOURCES := plat/imx/imx8m/ddr/dram.c \
|
||||
plat/imx/imx8m/ddr/clock.c \
|
||||
plat/imx/imx8m/ddr/dram_retention.c \
|
||||
plat/imx/imx8m/ddr/ddr4_dvfs.c \
|
||||
plat/imx/imx8m/ddr/lpddr4_dvfs.c
|
||||
|
||||
IMX_GIC_SOURCES := ${GICV3_SOURCES} \
|
||||
plat/common/plat_gicv3.c \
|
||||
plat/common/plat_psci_common.c \
|
||||
plat/imx/common/plat_imx8_gic.c
|
||||
|
||||
BL31_SOURCES += plat/imx/common/imx8_helpers.S \
|
||||
plat/imx/imx8m/gpc_common.c \
|
||||
plat/imx/imx8m/imx_hab.c \
|
||||
plat/imx/imx8m/imx_aipstz.c \
|
||||
plat/imx/imx8m/imx_rdc.c \
|
||||
plat/imx/imx8m/imx8m_csu.c \
|
||||
plat/imx/imx8m/imx8m_caam.c \
|
||||
plat/imx/imx8m/imx8m_psci_common.c \
|
||||
plat/imx/imx8m/imx8mm/imx8mm_bl31_setup.c \
|
||||
plat/imx/imx8m/imx8mm/imx8mm_psci.c \
|
||||
plat/imx/imx8m/imx8mm/gpc.c \
|
||||
plat/imx/common/imx8_topology.c \
|
||||
plat/imx/common/imx_sip_handler.c \
|
||||
plat/imx/common/imx_sip_svc.c \
|
||||
plat/imx/common/imx_uart_console.S \
|
||||
lib/cpus/aarch64/cortex_a53.S \
|
||||
drivers/arm/tzc/tzc380.c \
|
||||
drivers/delay_timer/delay_timer.c \
|
||||
drivers/delay_timer/generic_delay_timer.c \
|
||||
${XLAT_TABLES_LIB_SRCS} \
|
||||
${IMX_DRAM_SOURCES} \
|
||||
${IMX_GIC_SOURCES}
|
||||
|
||||
ifeq (${NEED_BL2},yes)
|
||||
BL2_SOURCES += common/desc_image_load.c \
|
||||
common/fdt_wrappers.c \
|
||||
plat/imx/common/imx8_helpers.S \
|
||||
plat/imx/common/imx_uart_console.S \
|
||||
plat/imx/imx8m/imx8mm/imx8mm_bl2_el3_setup.c \
|
||||
plat/imx/imx8m/imx8mm/gpc.c \
|
||||
plat/imx/imx8m/imx_aipstz.c \
|
||||
plat/common/plat_psci_common.c \
|
||||
lib/xlat_tables/aarch64/xlat_tables.c \
|
||||
lib/xlat_tables/xlat_tables_common.c \
|
||||
lib/cpus/aarch64/cortex_a53.S \
|
||||
drivers/delay_timer/delay_timer.c \
|
||||
drivers/delay_timer/generic_delay_timer.c \
|
||||
${PLAT_GIC_SOURCES} \
|
||||
${PLAT_DRAM_SOURCES} \
|
||||
drivers/mmc/mmc.c \
|
||||
drivers/io/io_block.c \
|
||||
drivers/io/io_fip.c \
|
||||
drivers/io/io_memmap.c \
|
||||
drivers/io/io_storage.c \
|
||||
drivers/imx/usdhc/imx_usdhc.c \
|
||||
plat/imx/imx8m/imx8mm/imx8mm_bl2_mem_params_desc.c \
|
||||
plat/imx/common/imx_io_storage.c \
|
||||
plat/imx/imx8m/imx8m_image_load.c \
|
||||
lib/optee/optee_utils.c
|
||||
endif
|
||||
|
||||
# Add the build options to pack BLx images and kernel device tree
|
||||
# in the FIP if the platform requires.
|
||||
ifneq ($(BL2),)
|
||||
RESET_TO_BL31 := 0
|
||||
$(eval $(call TOOL_ADD_PAYLOAD,${BUILD_PLAT}/tb_fw.crt,--tb-fw-cert))
|
||||
endif
|
||||
ifneq ($(BL32_EXTRA1),)
|
||||
$(eval $(call TOOL_ADD_IMG,BL32_EXTRA1,--tos-fw-extra1))
|
||||
endif
|
||||
ifneq ($(BL32_EXTRA2),)
|
||||
$(eval $(call TOOL_ADD_IMG,BL32_EXTRA2,--tos-fw-extra2))
|
||||
endif
|
||||
ifneq ($(HW_CONFIG),)
|
||||
$(eval $(call TOOL_ADD_IMG,HW_CONFIG,--hw-config))
|
||||
endif
|
||||
|
||||
ifeq (${NEED_BL2},yes)
|
||||
$(eval $(call add_define,NEED_BL2))
|
||||
LOAD_IMAGE_V2 := 1
|
||||
# Non-TF Boot ROM
|
||||
BL2_AT_EL3 := 1
|
||||
endif
|
||||
|
||||
ifneq (${TRUSTED_BOARD_BOOT},0)
|
||||
|
||||
include drivers/auth/mbedtls/mbedtls_crypto.mk
|
||||
include drivers/auth/mbedtls/mbedtls_x509.mk
|
||||
|
||||
AUTH_SOURCES := drivers/auth/auth_mod.c \
|
||||
drivers/auth/crypto_mod.c \
|
||||
drivers/auth/img_parser_mod.c \
|
||||
drivers/auth/tbbr/tbbr_cot_common.c \
|
||||
drivers/auth/tbbr/tbbr_cot_bl2.c
|
||||
|
||||
BL2_SOURCES += ${AUTH_SOURCES} \
|
||||
plat/common/tbbr/plat_tbbr.c \
|
||||
plat/imx/imx8m/imx8mm/imx8mm_trusted_boot.c \
|
||||
plat/imx/imx8m/imx8mm/imx8mm_rotpk.S
|
||||
|
||||
ROT_KEY = $(BUILD_PLAT)/rot_key.pem
|
||||
ROTPK_HASH = $(BUILD_PLAT)/rotpk_sha256.bin
|
||||
|
||||
$(eval $(call add_define_val,ROTPK_HASH,'"$(ROTPK_HASH)"'))
|
||||
$(eval $(call MAKE_LIB_DIRS))
|
||||
|
||||
$(BUILD_PLAT)/bl2/imx8mm_rotpk.o: $(ROTPK_HASH)
|
||||
|
||||
certificates: $(ROT_KEY)
|
||||
|
||||
$(ROT_KEY): | $(BUILD_PLAT)
|
||||
@echo " OPENSSL $@"
|
||||
@if [ ! -f $(ROT_KEY) ]; then \
|
||||
${OPENSSL_BIN_PATH}/openssl genrsa 2048 > $@ 2>/dev/null; \
|
||||
fi
|
||||
|
||||
$(ROTPK_HASH): $(ROT_KEY)
|
||||
@echo " OPENSSL $@"
|
||||
$(Q)${OPENSSL_BIN_PATH}/openssl rsa -in $< -pubout -outform DER 2>/dev/null |\
|
||||
${OPENSSL_BIN_PATH}/openssl dgst -sha256 -binary > $@ 2>/dev/null
|
||||
endif
|
||||
|
||||
ENABLE_PIE := 1
|
||||
USE_COHERENT_MEM := 1
|
||||
RESET_TO_BL31 := 1
|
||||
A53_DISABLE_NON_TEMPORAL_HINT := 0
|
||||
|
||||
ERRATA_A53_835769 := 1
|
||||
ERRATA_A53_843419 := 1
|
||||
ERRATA_A53_855873 := 1
|
||||
|
||||
BL32_BASE ?= 0xbe000000
|
||||
$(eval $(call add_define,BL32_BASE))
|
||||
|
||||
BL32_SIZE ?= 0x2000000
|
||||
$(eval $(call add_define,BL32_SIZE))
|
||||
|
||||
IMX_BOOT_UART_BASE ?= 0x30890000
|
||||
$(eval $(call add_define,IMX_BOOT_UART_BASE))
|
||||
|
||||
EL3_EXCEPTION_HANDLING := $(SDEI_SUPPORT)
|
||||
ifeq (${SDEI_SUPPORT}, 1)
|
||||
BL31_SOURCES += plat/imx/common/imx_ehf.c \
|
||||
plat/imx/common/imx_sdei.c
|
||||
endif
|
||||
|
||||
ifeq (${MEASURED_BOOT},1)
|
||||
MEASURED_BOOT_MK := drivers/measured_boot/event_log/event_log.mk
|
||||
$(info Including ${MEASURED_BOOT_MK})
|
||||
include ${MEASURED_BOOT_MK}
|
||||
|
||||
ifneq (${MBOOT_EL_HASH_ALG}, sha256)
|
||||
$(eval $(call add_define,TF_MBEDTLS_MBOOT_USE_SHA512))
|
||||
endif
|
||||
|
||||
BL2_SOURCES += plat/imx/imx8m/imx8m_measured_boot.c \
|
||||
plat/imx/imx8m/imx8m_dyn_cfg_helpers.c \
|
||||
${EVENT_LOG_SOURCES}
|
||||
endif
|
||||
|
||||
ifeq (${SPD},trusty)
|
||||
BL31_CFLAGS += -DPLAT_XLAT_TABLES_DYNAMIC=1
|
||||
endif
|
||||
Reference in New Issue
Block a user