1*4c158b9aSHarinarayan Bhatta/* 2*4c158b9aSHarinarayan Bhatta * Secure entry function for CPU Core #1 3*4c158b9aSHarinarayan Bhatta * 4*4c158b9aSHarinarayan Bhatta * (C) Copyright 2016 5*4c158b9aSHarinarayan Bhatta * Texas Instruments, <www.ti.com> 6*4c158b9aSHarinarayan Bhatta * 7*4c158b9aSHarinarayan Bhatta * Author : 8*4c158b9aSHarinarayan Bhatta * Harinarayan Bhatta <harinarayan@ti.com> 9*4c158b9aSHarinarayan Bhatta * 10*4c158b9aSHarinarayan Bhatta * SPDX-License-Identifier: GPL-2.0+ 11*4c158b9aSHarinarayan Bhatta */ 12*4c158b9aSHarinarayan Bhatta 13*4c158b9aSHarinarayan Bhatta#include <config.h> 14*4c158b9aSHarinarayan Bhatta#include <asm/arch/omap.h> 15*4c158b9aSHarinarayan Bhatta#include <asm/omap_common.h> 16*4c158b9aSHarinarayan Bhatta#include <linux/linkage.h> 17*4c158b9aSHarinarayan Bhatta 18*4c158b9aSHarinarayan Bhatta.arch_extension sec 19*4c158b9aSHarinarayan Bhatta 20*4c158b9aSHarinarayan Bhatta#if !defined(CONFIG_SYS_DCACHE_OFF) 21*4c158b9aSHarinarayan Bhatta.global flush_dcache_range 22*4c158b9aSHarinarayan Bhatta#endif 23*4c158b9aSHarinarayan Bhatta 24*4c158b9aSHarinarayan Bhatta#define AUX_CORE_BOOT_0 0x48281800 25*4c158b9aSHarinarayan Bhatta#define AUX_CORE_BOOT_1 0x48281804 26*4c158b9aSHarinarayan Bhatta 27*4c158b9aSHarinarayan Bhatta#ifdef CONFIG_DRA7XX 28*4c158b9aSHarinarayan Bhatta/* DRA7xx ROM code function "startup_BootSlave". This function is where CPU1 29*4c158b9aSHarinarayan Bhatta * waits on WFE, polling on AUX_CORE_BOOT_x registers. 30*4c158b9aSHarinarayan Bhatta * This address is same for J6 and J6 Eco. 31*4c158b9aSHarinarayan Bhatta */ 32*4c158b9aSHarinarayan Bhatta#define ROM_FXN_STARTUP_BOOTSLAVE 0x00038a64 33*4c158b9aSHarinarayan Bhatta#endif 34*4c158b9aSHarinarayan Bhatta 35*4c158b9aSHarinarayan Bhatta/* Assembly core where CPU1 is woken up into 36*4c158b9aSHarinarayan Bhatta * No need to save-restore registers, does not use stack. 37*4c158b9aSHarinarayan Bhatta */ 38*4c158b9aSHarinarayan BhattaLENTRY(cpu1_entry) 39*4c158b9aSHarinarayan Bhatta ldr r4, =omap_smc_sec_cpu1_args 40*4c158b9aSHarinarayan Bhatta ldm r4, {r0,r1,r2,r3} @ Retrieve args 41*4c158b9aSHarinarayan Bhatta 42*4c158b9aSHarinarayan Bhatta mov r6, #0xFF @ Indicate new Task call 43*4c158b9aSHarinarayan Bhatta mov r12, #0x00 @ Secure Service ID in R12 44*4c158b9aSHarinarayan Bhatta 45*4c158b9aSHarinarayan Bhatta dsb 46*4c158b9aSHarinarayan Bhatta dmb 47*4c158b9aSHarinarayan Bhatta smc 0 @ SMC #0 to enter monitor mode 48*4c158b9aSHarinarayan Bhatta 49*4c158b9aSHarinarayan Bhatta b .Lend @ exit at end of the service execution 50*4c158b9aSHarinarayan Bhatta nop 51*4c158b9aSHarinarayan Bhatta 52*4c158b9aSHarinarayan Bhatta @ In case of IRQ happening in Secure, then ARM will branch here. 53*4c158b9aSHarinarayan Bhatta @ At that moment, IRQ will be pending and ARM will jump to Non Secure 54*4c158b9aSHarinarayan Bhatta @ IRQ handler 55*4c158b9aSHarinarayan Bhatta mov r12, #0xFE 56*4c158b9aSHarinarayan Bhatta 57*4c158b9aSHarinarayan Bhatta dsb 58*4c158b9aSHarinarayan Bhatta dmb 59*4c158b9aSHarinarayan Bhatta smc 0 @ SMC #0 to enter monitor mode 60*4c158b9aSHarinarayan Bhatta 61*4c158b9aSHarinarayan Bhatta.Lend: 62*4c158b9aSHarinarayan Bhatta ldr r4, =omap_smc_sec_cpu1_args 63*4c158b9aSHarinarayan Bhatta str r0, [r4, #0x10] @ save return value 64*4c158b9aSHarinarayan Bhatta ldr r4, =AUX_CORE_BOOT_0 65*4c158b9aSHarinarayan Bhatta mov r5, #0x0 66*4c158b9aSHarinarayan Bhatta str r5, [r4] 67*4c158b9aSHarinarayan Bhatta ldr r4, =ROM_FXN_STARTUP_BOOTSLAVE 68*4c158b9aSHarinarayan Bhatta sev @ Tell CPU0 we are done 69*4c158b9aSHarinarayan Bhatta bx r4 @ Jump back to ROM 70*4c158b9aSHarinarayan BhattaEND(cpu1_entry) 71*4c158b9aSHarinarayan Bhatta 72*4c158b9aSHarinarayan Bhatta/* 73*4c158b9aSHarinarayan Bhatta * u32 omap_smc_sec_cpu1(u32 service, u32 proc_id, u32 flag, u32 *params); 74*4c158b9aSHarinarayan Bhatta * 75*4c158b9aSHarinarayan Bhatta * Makes a secure ROM/PPA call on CPU Core #1 on supported platforms. 76*4c158b9aSHarinarayan Bhatta * Assumes that CPU #1 is waiting in ROM code and not yet woken up or used by 77*4c158b9aSHarinarayan Bhatta * u-boot. 78*4c158b9aSHarinarayan Bhatta */ 79*4c158b9aSHarinarayan BhattaENTRY(omap_smc_sec_cpu1) 80*4c158b9aSHarinarayan Bhatta push {r4, r5, lr} 81*4c158b9aSHarinarayan Bhatta ldr r4, =omap_smc_sec_cpu1_args 82*4c158b9aSHarinarayan Bhatta stm r4, {r0,r1,r2,r3} @ Save args to memory 83*4c158b9aSHarinarayan Bhatta#if !defined(CONFIG_SYS_DCACHE_OFF) 84*4c158b9aSHarinarayan Bhatta mov r0, r4 85*4c158b9aSHarinarayan Bhatta mov r1, #CONFIG_SYS_CACHELINE_SIZE 86*4c158b9aSHarinarayan Bhatta add r1, r0, r1 @ dcache is not enabled on CPU1, so 87*4c158b9aSHarinarayan Bhatta blx flush_dcache_range @ flush the cache on args buffer 88*4c158b9aSHarinarayan Bhatta#endif 89*4c158b9aSHarinarayan Bhatta ldr r4, =AUX_CORE_BOOT_1 90*4c158b9aSHarinarayan Bhatta ldr r5, =cpu1_entry 91*4c158b9aSHarinarayan Bhatta str r5, [r4] @ Setup CPU1 entry function 92*4c158b9aSHarinarayan Bhatta ldr r4, =AUX_CORE_BOOT_0 93*4c158b9aSHarinarayan Bhatta mov r5, #0x10 94*4c158b9aSHarinarayan Bhatta str r5, [r4] @ Tell ROM to exit while loop 95*4c158b9aSHarinarayan Bhatta sev @ Wake up CPU1 96*4c158b9aSHarinarayan Bhatta.Lwait: 97*4c158b9aSHarinarayan Bhatta wfe @ Wait for CPU1 to finish 98*4c158b9aSHarinarayan Bhatta nop 99*4c158b9aSHarinarayan Bhatta ldr r5, [r4] @ Check if CPU1 is done 100*4c158b9aSHarinarayan Bhatta cmp r5, #0 101*4c158b9aSHarinarayan Bhatta bne .Lwait 102*4c158b9aSHarinarayan Bhatta 103*4c158b9aSHarinarayan Bhatta ldr r4, =omap_smc_sec_cpu1_args 104*4c158b9aSHarinarayan Bhatta ldr r0, [r4, #0x10] @ Retrieve return value 105*4c158b9aSHarinarayan Bhatta pop {r4, r5, pc} 106*4c158b9aSHarinarayan BhattaENDPROC(omap_smc_sec_cpu1) 107*4c158b9aSHarinarayan Bhatta 108*4c158b9aSHarinarayan Bhatta/* 109*4c158b9aSHarinarayan Bhatta * Buffer to save function arguments and return value for omap_smc_sec_cpu1 110*4c158b9aSHarinarayan Bhatta */ 111*4c158b9aSHarinarayan Bhatta.section .data 112*4c158b9aSHarinarayan Bhattaomap_smc_sec_cpu1_args: 113*4c158b9aSHarinarayan Bhatta#if !defined(CONFIG_SYS_DCACHE_OFF) 114*4c158b9aSHarinarayan Bhatta .balign CONFIG_SYS_CACHELINE_SIZE 115*4c158b9aSHarinarayan Bhatta .rept CONFIG_SYS_CACHELINE_SIZE/4 116*4c158b9aSHarinarayan Bhatta .word 0 117*4c158b9aSHarinarayan Bhatta .endr 118*4c158b9aSHarinarayan Bhatta#else 119*4c158b9aSHarinarayan Bhatta .rept 5 120*4c158b9aSHarinarayan Bhatta .word 0 121*4c158b9aSHarinarayan Bhatta .endr 122*4c158b9aSHarinarayan Bhatta#endif 123*4c158b9aSHarinarayan BhattaEND(omap_smc_sec_cpu1_args) 124