1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Common security related functions for OMAP devices
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * (C) Copyright 2016-2017
6*4882a593Smuzhiyun * Texas Instruments, <www.ti.com>
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Daniel Allred <d-allred@ti.com>
9*4882a593Smuzhiyun * Andreas Dannenberg <dannenberg@ti.com>
10*4882a593Smuzhiyun * Harinarayan Bhatta <harinarayan@ti.com>
11*4882a593Smuzhiyun * Andrew F. Davis <afd@ti.com>
12*4882a593Smuzhiyun *
13*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
14*4882a593Smuzhiyun */
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #include <common.h>
17*4882a593Smuzhiyun #include <stdarg.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
20*4882a593Smuzhiyun #include <asm/cache.h>
21*4882a593Smuzhiyun #include <asm/omap_common.h>
22*4882a593Smuzhiyun #include <asm/omap_sec_common.h>
23*4882a593Smuzhiyun #include <asm/spl.h>
24*4882a593Smuzhiyun #include <asm/ti-common/sys_proto.h>
25*4882a593Smuzhiyun #include <mapmem.h>
26*4882a593Smuzhiyun #include <spl.h>
27*4882a593Smuzhiyun #include <tee/optee.h>
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun /* Index for signature verify ROM API */
30*4882a593Smuzhiyun #ifdef CONFIG_AM33XX
31*4882a593Smuzhiyun #define API_HAL_KM_VERIFYCERTIFICATESIGNATURE_INDEX (0x0000000C)
32*4882a593Smuzhiyun #else
33*4882a593Smuzhiyun #define API_HAL_KM_VERIFYCERTIFICATESIGNATURE_INDEX (0x0000000E)
34*4882a593Smuzhiyun #endif
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun /* Index for signature PPA-based TI HAL APIs */
37*4882a593Smuzhiyun #define PPA_HAL_SERVICES_START_INDEX (0x200)
38*4882a593Smuzhiyun #define PPA_SERV_HAL_TEE_LOAD_MASTER (PPA_HAL_SERVICES_START_INDEX + 23)
39*4882a593Smuzhiyun #define PPA_SERV_HAL_TEE_LOAD_SLAVE (PPA_HAL_SERVICES_START_INDEX + 24)
40*4882a593Smuzhiyun #define PPA_SERV_HAL_SETUP_SEC_RESVD_REGION (PPA_HAL_SERVICES_START_INDEX + 25)
41*4882a593Smuzhiyun #define PPA_SERV_HAL_SETUP_EMIF_FW_REGION (PPA_HAL_SERVICES_START_INDEX + 26)
42*4882a593Smuzhiyun #define PPA_SERV_HAL_LOCK_EMIF_FW (PPA_HAL_SERVICES_START_INDEX + 27)
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun int tee_loaded = 0;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun /* Argument for PPA_SERV_HAL_TEE_LOAD_MASTER */
47*4882a593Smuzhiyun struct ppa_tee_load_info {
48*4882a593Smuzhiyun u32 tee_sec_mem_start; /* Physical start address reserved for TEE */
49*4882a593Smuzhiyun u32 tee_sec_mem_size; /* Size of the memory reserved for TEE */
50*4882a593Smuzhiyun u32 tee_cert_start; /* Address where signed TEE binary is loaded */
51*4882a593Smuzhiyun u32 tee_cert_size; /* Size of TEE certificate (signed binary) */
52*4882a593Smuzhiyun u32 tee_jump_addr; /* Address to jump to start TEE execution */
53*4882a593Smuzhiyun u32 tee_arg0; /* argument to TEE jump function, in r0 */
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun static uint32_t secure_rom_call_args[5] __aligned(ARCH_DMA_MINALIGN);
57*4882a593Smuzhiyun
secure_rom_call(u32 service,u32 proc_id,u32 flag,...)58*4882a593Smuzhiyun u32 secure_rom_call(u32 service, u32 proc_id, u32 flag, ...)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun int i;
61*4882a593Smuzhiyun u32 num_args;
62*4882a593Smuzhiyun va_list ap;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun va_start(ap, flag);
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun num_args = va_arg(ap, u32);
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun if (num_args > 4) {
69*4882a593Smuzhiyun va_end(ap);
70*4882a593Smuzhiyun return 1;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun /* Copy args to aligned args structure */
74*4882a593Smuzhiyun for (i = 0; i < num_args; i++)
75*4882a593Smuzhiyun secure_rom_call_args[i + 1] = va_arg(ap, u32);
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun secure_rom_call_args[0] = num_args;
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun va_end(ap);
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun /* if data cache is enabled, flush the aligned args structure */
82*4882a593Smuzhiyun flush_dcache_range(
83*4882a593Smuzhiyun (unsigned int)&secure_rom_call_args[0],
84*4882a593Smuzhiyun (unsigned int)&secure_rom_call_args[0] +
85*4882a593Smuzhiyun roundup(sizeof(secure_rom_call_args), ARCH_DMA_MINALIGN));
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun return omap_smc_sec(service, proc_id, flag, secure_rom_call_args);
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
find_sig_start(char * image,size_t size)90*4882a593Smuzhiyun static u32 find_sig_start(char *image, size_t size)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun char *image_end = image + size;
93*4882a593Smuzhiyun char *sig_start_magic = "CERT_";
94*4882a593Smuzhiyun int magic_str_len = strlen(sig_start_magic);
95*4882a593Smuzhiyun char *ch;
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun while (--image_end > image) {
98*4882a593Smuzhiyun if (*image_end == '_') {
99*4882a593Smuzhiyun ch = image_end - magic_str_len + 1;
100*4882a593Smuzhiyun if (!strncmp(ch, sig_start_magic, magic_str_len))
101*4882a593Smuzhiyun return (u32)ch;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun return 0;
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun
secure_boot_verify_image(void ** image,size_t * size)107*4882a593Smuzhiyun int secure_boot_verify_image(void **image, size_t *size)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun int result = 1;
110*4882a593Smuzhiyun u32 cert_addr, sig_addr;
111*4882a593Smuzhiyun size_t cert_size;
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun /* Perform cache writeback on input buffer */
114*4882a593Smuzhiyun flush_dcache_range(
115*4882a593Smuzhiyun rounddown((u32)*image, ARCH_DMA_MINALIGN),
116*4882a593Smuzhiyun roundup((u32)*image + *size, ARCH_DMA_MINALIGN));
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun cert_addr = (uint32_t)*image;
119*4882a593Smuzhiyun sig_addr = find_sig_start((char *)*image, *size);
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun if (sig_addr == 0) {
122*4882a593Smuzhiyun printf("No signature found in image!\n");
123*4882a593Smuzhiyun result = 1;
124*4882a593Smuzhiyun goto auth_exit;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun *size = sig_addr - cert_addr; /* Subtract out the signature size */
128*4882a593Smuzhiyun cert_size = *size;
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun /* Check if image load address is 32-bit aligned */
131*4882a593Smuzhiyun if (!IS_ALIGNED(cert_addr, 4)) {
132*4882a593Smuzhiyun printf("Image is not 4-byte aligned!\n");
133*4882a593Smuzhiyun result = 1;
134*4882a593Smuzhiyun goto auth_exit;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun /* Image size also should be multiple of 4 */
138*4882a593Smuzhiyun if (!IS_ALIGNED(cert_size, 4)) {
139*4882a593Smuzhiyun printf("Image size is not 4-byte aligned!\n");
140*4882a593Smuzhiyun result = 1;
141*4882a593Smuzhiyun goto auth_exit;
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun /* Call ROM HAL API to verify certificate signature */
145*4882a593Smuzhiyun debug("%s: load_addr = %x, size = %x, sig_addr = %x\n", __func__,
146*4882a593Smuzhiyun cert_addr, cert_size, sig_addr);
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun result = secure_rom_call(
149*4882a593Smuzhiyun API_HAL_KM_VERIFYCERTIFICATESIGNATURE_INDEX, 0, 0,
150*4882a593Smuzhiyun 4, cert_addr, cert_size, sig_addr, 0xFFFFFFFF);
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun /* Perform cache writeback on output buffer */
153*4882a593Smuzhiyun flush_dcache_range(
154*4882a593Smuzhiyun rounddown((u32)*image, ARCH_DMA_MINALIGN),
155*4882a593Smuzhiyun roundup((u32)*image + *size, ARCH_DMA_MINALIGN));
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun auth_exit:
158*4882a593Smuzhiyun if (result != 0) {
159*4882a593Smuzhiyun printf("Authentication failed!\n");
160*4882a593Smuzhiyun printf("Return Value = %08X\n", result);
161*4882a593Smuzhiyun hang();
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun /*
165*4882a593Smuzhiyun * Output notification of successful authentication as well the name of
166*4882a593Smuzhiyun * the signing certificate used to re-assure the user that the secure
167*4882a593Smuzhiyun * code is being processed as expected. However suppress any such log
168*4882a593Smuzhiyun * output in case of building for SPL and booting via YMODEM. This is
169*4882a593Smuzhiyun * done to avoid disturbing the YMODEM serial protocol transactions.
170*4882a593Smuzhiyun */
171*4882a593Smuzhiyun if (!(IS_ENABLED(CONFIG_SPL_BUILD) &&
172*4882a593Smuzhiyun IS_ENABLED(CONFIG_SPL_YMODEM_SUPPORT) &&
173*4882a593Smuzhiyun spl_boot_device() == BOOT_DEVICE_UART))
174*4882a593Smuzhiyun printf("Authentication passed: %s\n", (char *)sig_addr);
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun return result;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun
get_sec_mem_start(void)179*4882a593Smuzhiyun u32 get_sec_mem_start(void)
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun u32 sec_mem_start = CONFIG_TI_SECURE_EMIF_REGION_START;
182*4882a593Smuzhiyun u32 sec_mem_size = CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE;
183*4882a593Smuzhiyun /*
184*4882a593Smuzhiyun * Total reserved region is all contiguous with protected
185*4882a593Smuzhiyun * region coming first, followed by the non-secure region.
186*4882a593Smuzhiyun * If 0x0 start address is given, we simply put the reserved
187*4882a593Smuzhiyun * region at the end of the external DRAM.
188*4882a593Smuzhiyun */
189*4882a593Smuzhiyun if (sec_mem_start == 0)
190*4882a593Smuzhiyun sec_mem_start =
191*4882a593Smuzhiyun (CONFIG_SYS_SDRAM_BASE + (
192*4882a593Smuzhiyun #if defined(CONFIG_OMAP54XX)
193*4882a593Smuzhiyun omap_sdram_size()
194*4882a593Smuzhiyun #else
195*4882a593Smuzhiyun get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
196*4882a593Smuzhiyun CONFIG_MAX_RAM_BANK_SIZE)
197*4882a593Smuzhiyun #endif
198*4882a593Smuzhiyun - sec_mem_size));
199*4882a593Smuzhiyun return sec_mem_start;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun
secure_emif_firewall_setup(uint8_t region_num,uint32_t start_addr,uint32_t size,uint32_t access_perm,uint32_t initiator_perm)202*4882a593Smuzhiyun int secure_emif_firewall_setup(uint8_t region_num, uint32_t start_addr,
203*4882a593Smuzhiyun uint32_t size, uint32_t access_perm,
204*4882a593Smuzhiyun uint32_t initiator_perm)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun int result = 1;
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun /*
209*4882a593Smuzhiyun * Call PPA HAL API to do any other general firewall
210*4882a593Smuzhiyun * configuration for regions 1-6 of the EMIF firewall.
211*4882a593Smuzhiyun */
212*4882a593Smuzhiyun debug("%s: regionNum = %x, startAddr = %x, size = %x", __func__,
213*4882a593Smuzhiyun region_num, start_addr, size);
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun result = secure_rom_call(
216*4882a593Smuzhiyun PPA_SERV_HAL_SETUP_EMIF_FW_REGION, 0, 0, 4,
217*4882a593Smuzhiyun (start_addr & 0xFFFFFFF0) | (region_num & 0x0F),
218*4882a593Smuzhiyun size, access_perm, initiator_perm);
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun if (result != 0) {
221*4882a593Smuzhiyun puts("Secure EMIF Firewall Setup failed!\n");
222*4882a593Smuzhiyun debug("Return Value = %x\n", result);
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun return result;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun #if (CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE < \
229*4882a593Smuzhiyun CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE)
230*4882a593Smuzhiyun #error "TI Secure EMIF: Protected size cannot be larger than total size."
231*4882a593Smuzhiyun #endif
secure_emif_reserve(void)232*4882a593Smuzhiyun int secure_emif_reserve(void)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun int result = 1;
235*4882a593Smuzhiyun u32 sec_mem_start = get_sec_mem_start();
236*4882a593Smuzhiyun u32 sec_prot_size = CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE;
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun /* If there is no protected region, there is no reservation to make */
239*4882a593Smuzhiyun if (sec_prot_size == 0)
240*4882a593Smuzhiyun return 0;
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun /*
243*4882a593Smuzhiyun * Call PPA HAL API to reserve a chunk of EMIF SDRAM
244*4882a593Smuzhiyun * for secure world use. This region should be carved out
245*4882a593Smuzhiyun * from use by any public code. EMIF firewall region 7
246*4882a593Smuzhiyun * will be used to protect this block of memory.
247*4882a593Smuzhiyun */
248*4882a593Smuzhiyun result = secure_rom_call(
249*4882a593Smuzhiyun PPA_SERV_HAL_SETUP_SEC_RESVD_REGION,
250*4882a593Smuzhiyun 0, 0, 2, sec_mem_start, sec_prot_size);
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun if (result != 0) {
253*4882a593Smuzhiyun puts("SDRAM Firewall: Secure memory reservation failed!\n");
254*4882a593Smuzhiyun debug("Return Value = %x\n", result);
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun return result;
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun
secure_emif_firewall_lock(void)260*4882a593Smuzhiyun int secure_emif_firewall_lock(void)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun int result = 1;
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun /*
265*4882a593Smuzhiyun * Call PPA HAL API to lock the EMIF firewall configurations.
266*4882a593Smuzhiyun * After this API is called, none of the PPA HAL APIs for
267*4882a593Smuzhiyun * configuring the EMIF firewalls will be usable again (that
268*4882a593Smuzhiyun * is, calls to those APIs will return failure and have no
269*4882a593Smuzhiyun * effect).
270*4882a593Smuzhiyun */
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun result = secure_rom_call(
273*4882a593Smuzhiyun PPA_SERV_HAL_LOCK_EMIF_FW,
274*4882a593Smuzhiyun 0, 0, 0);
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun if (result != 0) {
277*4882a593Smuzhiyun puts("Secure EMIF Firewall Lock failed!\n");
278*4882a593Smuzhiyun debug("Return Value = %x\n", result);
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun return result;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun static struct ppa_tee_load_info tee_info __aligned(ARCH_DMA_MINALIGN);
285*4882a593Smuzhiyun
secure_tee_install(u32 addr)286*4882a593Smuzhiyun int secure_tee_install(u32 addr)
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun struct optee_header *hdr;
289*4882a593Smuzhiyun void *loadptr;
290*4882a593Smuzhiyun u32 tee_file_size;
291*4882a593Smuzhiyun u32 sec_mem_start = get_sec_mem_start();
292*4882a593Smuzhiyun const u32 size = CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE;
293*4882a593Smuzhiyun u32 ret;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun /* If there is no protected region, there is no place to put the TEE */
296*4882a593Smuzhiyun if (size == 0) {
297*4882a593Smuzhiyun printf("Error loading TEE, no protected memory region available\n");
298*4882a593Smuzhiyun return -ENOBUFS;
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun hdr = (struct optee_header *)map_sysmem(addr, sizeof(struct optee_header));
302*4882a593Smuzhiyun /* 280 bytes = size of signature */
303*4882a593Smuzhiyun tee_file_size = hdr->init_size + hdr->paged_size +
304*4882a593Smuzhiyun sizeof(struct optee_header) + 280;
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun if ((hdr->magic != OPTEE_MAGIC) ||
307*4882a593Smuzhiyun (hdr->version != OPTEE_VERSION) ||
308*4882a593Smuzhiyun (hdr->init_load_addr_hi != 0) ||
309*4882a593Smuzhiyun (hdr->init_load_addr_lo < (sec_mem_start + sizeof(struct optee_header))) ||
310*4882a593Smuzhiyun (tee_file_size > size) ||
311*4882a593Smuzhiyun ((hdr->init_load_addr_lo + tee_file_size - 1) >
312*4882a593Smuzhiyun (sec_mem_start + size - 1))) {
313*4882a593Smuzhiyun printf("Error in TEE header. Check load address and sizes\n");
314*4882a593Smuzhiyun unmap_sysmem(hdr);
315*4882a593Smuzhiyun return CMD_RET_FAILURE;
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun tee_info.tee_sec_mem_start = sec_mem_start;
319*4882a593Smuzhiyun tee_info.tee_sec_mem_size = size;
320*4882a593Smuzhiyun tee_info.tee_jump_addr = hdr->init_load_addr_lo;
321*4882a593Smuzhiyun tee_info.tee_cert_start = addr;
322*4882a593Smuzhiyun tee_info.tee_cert_size = tee_file_size;
323*4882a593Smuzhiyun tee_info.tee_arg0 = hdr->init_size + tee_info.tee_jump_addr;
324*4882a593Smuzhiyun unmap_sysmem(hdr);
325*4882a593Smuzhiyun loadptr = map_sysmem(addr, tee_file_size);
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun debug("tee_info.tee_sec_mem_start= %08X\n", tee_info.tee_sec_mem_start);
328*4882a593Smuzhiyun debug("tee_info.tee_sec_mem_size = %08X\n", tee_info.tee_sec_mem_size);
329*4882a593Smuzhiyun debug("tee_info.tee_jump_addr = %08X\n", tee_info.tee_jump_addr);
330*4882a593Smuzhiyun debug("tee_info.tee_cert_start = %08X\n", tee_info.tee_cert_start);
331*4882a593Smuzhiyun debug("tee_info.tee_cert_size = %08X\n", tee_info.tee_cert_size);
332*4882a593Smuzhiyun debug("tee_info.tee_arg0 = %08X\n", tee_info.tee_arg0);
333*4882a593Smuzhiyun debug("tee_file_size = %d\n", tee_file_size);
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun #if !defined(CONFIG_SYS_DCACHE_OFF)
336*4882a593Smuzhiyun flush_dcache_range(
337*4882a593Smuzhiyun rounddown((u32)loadptr, ARCH_DMA_MINALIGN),
338*4882a593Smuzhiyun roundup((u32)loadptr + tee_file_size, ARCH_DMA_MINALIGN));
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun flush_dcache_range((u32)&tee_info, (u32)&tee_info +
341*4882a593Smuzhiyun roundup(sizeof(tee_info), ARCH_DMA_MINALIGN));
342*4882a593Smuzhiyun #endif
343*4882a593Smuzhiyun unmap_sysmem(loadptr);
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun ret = secure_rom_call(PPA_SERV_HAL_TEE_LOAD_MASTER, 0, 0, 1, &tee_info);
346*4882a593Smuzhiyun if (ret) {
347*4882a593Smuzhiyun printf("TEE_LOAD_MASTER Failed\n");
348*4882a593Smuzhiyun return ret;
349*4882a593Smuzhiyun }
350*4882a593Smuzhiyun printf("TEE_LOAD_MASTER Done\n");
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun #if defined(CONFIG_OMAP54XX)
353*4882a593Smuzhiyun if (!is_dra72x()) {
354*4882a593Smuzhiyun u32 *smc_cpu1_params;
355*4882a593Smuzhiyun /* Reuse the tee_info buffer for SMC params */
356*4882a593Smuzhiyun smc_cpu1_params = (u32 *)&tee_info;
357*4882a593Smuzhiyun smc_cpu1_params[0] = 0;
358*4882a593Smuzhiyun #if !defined(CONFIG_SYS_DCACHE_OFF)
359*4882a593Smuzhiyun flush_dcache_range((u32)smc_cpu1_params, (u32)smc_cpu1_params +
360*4882a593Smuzhiyun roundup(sizeof(u32), ARCH_DMA_MINALIGN));
361*4882a593Smuzhiyun #endif
362*4882a593Smuzhiyun ret = omap_smc_sec_cpu1(PPA_SERV_HAL_TEE_LOAD_SLAVE, 0, 0,
363*4882a593Smuzhiyun smc_cpu1_params);
364*4882a593Smuzhiyun if (ret) {
365*4882a593Smuzhiyun printf("TEE_LOAD_SLAVE Failed\n");
366*4882a593Smuzhiyun return ret;
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun printf("TEE_LOAD_SLAVE Done\n");
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun #endif
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun tee_loaded = 1;
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun return 0;
375*4882a593Smuzhiyun }
376