1*83ee3b4dSClement Faure // SPDX-License-Identifier: BSD-2-Clause
2*83ee3b4dSClement Faure /*
3*83ee3b4dSClement Faure * Copyright 2019 Pengutronix
4*83ee3b4dSClement Faure * All rights reserved.
5*83ee3b4dSClement Faure * Copyright 2023 NXP
6*83ee3b4dSClement Faure *
7*83ee3b4dSClement Faure * Rouven Czerwinski <entwicklung@pengutronix.de>
8*83ee3b4dSClement Faure */
9*83ee3b4dSClement Faure
10*83ee3b4dSClement Faure #include <config.h>
11*83ee3b4dSClement Faure #include <drivers/tzc380.h>
12*83ee3b4dSClement Faure #include <imx-regs.h>
13*83ee3b4dSClement Faure #include <initcall.h>
14*83ee3b4dSClement Faure #include <kernel/panic.h>
15*83ee3b4dSClement Faure #include <kernel/pm.h>
16*83ee3b4dSClement Faure #include <mm/core_memprot.h>
17*83ee3b4dSClement Faure #include <mm/generic_ram_layout.h>
18*83ee3b4dSClement Faure
19*83ee3b4dSClement Faure /*
20*83ee3b4dSClement Faure * TZASC2_BASE is asserted non null when used.
21*83ee3b4dSClement Faure * This is needed to compile the code for i.MX6UL/L
22*83ee3b4dSClement Faure * and i.MX8MQ.
23*83ee3b4dSClement Faure */
24*83ee3b4dSClement Faure #ifndef TZASC2_BASE
25*83ee3b4dSClement Faure #define TZASC2_BASE 0
26*83ee3b4dSClement Faure #else
27*83ee3b4dSClement Faure register_phys_mem(MEM_AREA_IO_SEC, TZASC2_BASE, TZASC_SIZE);
28*83ee3b4dSClement Faure #endif
29*83ee3b4dSClement Faure
30*83ee3b4dSClement Faure register_phys_mem(MEM_AREA_IO_SEC, TZASC_BASE, TZASC_SIZE);
31*83ee3b4dSClement Faure
imx_tzc_auto_configure(vaddr_t addr,vaddr_t rsize,uint32_t attr,uint8_t region)32*83ee3b4dSClement Faure static int imx_tzc_auto_configure(vaddr_t addr, vaddr_t rsize, uint32_t attr,
33*83ee3b4dSClement Faure uint8_t region)
34*83ee3b4dSClement Faure {
35*83ee3b4dSClement Faure vaddr_t addr_imx = 0;
36*83ee3b4dSClement Faure
37*83ee3b4dSClement Faure /*
38*83ee3b4dSClement Faure * On 8mscale platforms, the TZASC controller for the DRAM protection,
39*83ee3b4dSClement Faure * has the memory regions starting at address 0x0 instead of the DRAM
40*83ee3b4dSClement Faure * base address (0x40000000)
41*83ee3b4dSClement Faure */
42*83ee3b4dSClement Faure if (IS_ENABLED(CFG_MX8M))
43*83ee3b4dSClement Faure addr_imx = addr - CFG_DRAM_BASE;
44*83ee3b4dSClement Faure else
45*83ee3b4dSClement Faure addr_imx = addr;
46*83ee3b4dSClement Faure
47*83ee3b4dSClement Faure return tzc_auto_configure(addr_imx, rsize, attr, region);
48*83ee3b4dSClement Faure }
49*83ee3b4dSClement Faure
imx_configure_tzasc(void)50*83ee3b4dSClement Faure static TEE_Result imx_configure_tzasc(void)
51*83ee3b4dSClement Faure {
52*83ee3b4dSClement Faure vaddr_t addr[2] = {0};
53*83ee3b4dSClement Faure int end = 1;
54*83ee3b4dSClement Faure int i = 0;
55*83ee3b4dSClement Faure
56*83ee3b4dSClement Faure addr[0] = core_mmu_get_va(TZASC_BASE, MEM_AREA_IO_SEC, 1);
57*83ee3b4dSClement Faure
58*83ee3b4dSClement Faure if (IS_ENABLED(CFG_MX6Q) || IS_ENABLED(CFG_MX6D) ||
59*83ee3b4dSClement Faure IS_ENABLED(CFG_MX6DL)) {
60*83ee3b4dSClement Faure assert(TZASC2_BASE != 0);
61*83ee3b4dSClement Faure addr[1] = core_mmu_get_va(TZASC2_BASE, MEM_AREA_IO_SEC, 1);
62*83ee3b4dSClement Faure end = 2;
63*83ee3b4dSClement Faure }
64*83ee3b4dSClement Faure
65*83ee3b4dSClement Faure for (i = 0; i < end; i++) {
66*83ee3b4dSClement Faure uint8_t region = 1;
67*83ee3b4dSClement Faure
68*83ee3b4dSClement Faure tzc_init(addr[i]);
69*83ee3b4dSClement Faure
70*83ee3b4dSClement Faure region = imx_tzc_auto_configure(CFG_DRAM_BASE, CFG_DDR_SIZE,
71*83ee3b4dSClement Faure TZC_ATTR_SP_NS_RW, region);
72*83ee3b4dSClement Faure region = imx_tzc_auto_configure(CFG_TZDRAM_START,
73*83ee3b4dSClement Faure CFG_TZDRAM_SIZE,
74*83ee3b4dSClement Faure TZC_ATTR_SP_S_RW, region);
75*83ee3b4dSClement Faure region = imx_tzc_auto_configure(CFG_SHMEM_START, CFG_SHMEM_SIZE,
76*83ee3b4dSClement Faure TZC_ATTR_SP_ALL, region);
77*83ee3b4dSClement Faure
78*83ee3b4dSClement Faure if (tzc_regions_lockdown() != TEE_SUCCESS)
79*83ee3b4dSClement Faure panic("Region lockdown failed!");
80*83ee3b4dSClement Faure
81*83ee3b4dSClement Faure tzc_dump_state();
82*83ee3b4dSClement Faure }
83*83ee3b4dSClement Faure return TEE_SUCCESS;
84*83ee3b4dSClement Faure }
85*83ee3b4dSClement Faure
86*83ee3b4dSClement Faure static TEE_Result
pm_enter_resume(enum pm_op op,uint32_t pm_hint __unused,const struct pm_callback_handle * pm_handle __unused)87*83ee3b4dSClement Faure pm_enter_resume(enum pm_op op, uint32_t pm_hint __unused,
88*83ee3b4dSClement Faure const struct pm_callback_handle *pm_handle __unused)
89*83ee3b4dSClement Faure {
90*83ee3b4dSClement Faure if (op == PM_OP_RESUME)
91*83ee3b4dSClement Faure return imx_configure_tzasc();
92*83ee3b4dSClement Faure
93*83ee3b4dSClement Faure return TEE_SUCCESS;
94*83ee3b4dSClement Faure }
95*83ee3b4dSClement Faure
tzasc_init(void)96*83ee3b4dSClement Faure static TEE_Result tzasc_init(void)
97*83ee3b4dSClement Faure {
98*83ee3b4dSClement Faure register_pm_driver_cb(pm_enter_resume, NULL, "imx-tzasc");
99*83ee3b4dSClement Faure
100*83ee3b4dSClement Faure return imx_configure_tzasc();
101*83ee3b4dSClement Faure }
102*83ee3b4dSClement Faure driver_init(tzasc_init);
103