1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * OMAP34xx and OMAP44xx secure APIs file. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2010 Texas Instruments, Inc. 6*4882a593Smuzhiyun * Written by Santosh Shilimkar <santosh.shilimkar@ti.com> 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Copyright (C) 2012 Ivaylo Dimitrov <freemangordon@abv.bg> 9*4882a593Smuzhiyun * Copyright (C) 2013 Pali Rohár <pali@kernel.org> 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun#include <linux/linkage.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun/* 15*4882a593Smuzhiyun * This is common routine to manage secure monitor API 16*4882a593Smuzhiyun * used to modify the PL310 secure registers. 17*4882a593Smuzhiyun * 'r0' contains the value to be modified and 'r12' contains 18*4882a593Smuzhiyun * the monitor API number. It uses few CPU registers 19*4882a593Smuzhiyun * internally and hence they need be backed up including 20*4882a593Smuzhiyun * link register "lr". 21*4882a593Smuzhiyun * Function signature : void _omap_smc1(u32 fn, u32 arg) 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun .arch armv7-a 24*4882a593Smuzhiyun .arch_extension sec 25*4882a593SmuzhiyunENTRY(_omap_smc1) 26*4882a593Smuzhiyun stmfd sp!, {r2-r12, lr} 27*4882a593Smuzhiyun mov r12, r0 28*4882a593Smuzhiyun mov r0, r1 29*4882a593Smuzhiyun dsb 30*4882a593Smuzhiyun smc #0 31*4882a593Smuzhiyun ldmfd sp!, {r2-r12, pc} 32*4882a593SmuzhiyunENDPROC(_omap_smc1) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun/** 35*4882a593Smuzhiyun * u32 omap_smc2(u32 id, u32 falg, u32 pargs) 36*4882a593Smuzhiyun * Low level common routine for secure HAL and PPA APIs. 37*4882a593Smuzhiyun * @id: Application ID of HAL APIs 38*4882a593Smuzhiyun * @flag: Flag to indicate the criticality of operation 39*4882a593Smuzhiyun * @pargs: Physical address of parameter list starting 40*4882a593Smuzhiyun * with number of parametrs 41*4882a593Smuzhiyun */ 42*4882a593SmuzhiyunENTRY(omap_smc2) 43*4882a593Smuzhiyun stmfd sp!, {r4-r12, lr} 44*4882a593Smuzhiyun mov r3, r2 45*4882a593Smuzhiyun mov r2, r1 46*4882a593Smuzhiyun mov r1, #0x0 @ Process ID 47*4882a593Smuzhiyun mov r6, #0xff 48*4882a593Smuzhiyun mov r12, #0x00 @ Secure Service ID 49*4882a593Smuzhiyun mov r7, #0 50*4882a593Smuzhiyun mcr p15, 0, r7, c7, c5, 6 51*4882a593Smuzhiyun dsb 52*4882a593Smuzhiyun dmb 53*4882a593Smuzhiyun smc #0 54*4882a593Smuzhiyun ldmfd sp!, {r4-r12, pc} 55*4882a593SmuzhiyunENDPROC(omap_smc2) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun/** 58*4882a593Smuzhiyun * u32 omap_smc3(u32 service_id, u32 process_id, u32 flag, u32 pargs) 59*4882a593Smuzhiyun * Low level common routine for secure HAL and PPA APIs via smc #1 60*4882a593Smuzhiyun * r0 - @service_id: Secure Service ID 61*4882a593Smuzhiyun * r1 - @process_id: Process ID 62*4882a593Smuzhiyun * r2 - @flag: Flag to indicate the criticality of operation 63*4882a593Smuzhiyun * r3 - @pargs: Physical address of parameter list 64*4882a593Smuzhiyun */ 65*4882a593SmuzhiyunENTRY(omap_smc3) 66*4882a593Smuzhiyun stmfd sp!, {r4-r11, lr} 67*4882a593Smuzhiyun mov r12, r0 @ Copy the secure service ID 68*4882a593Smuzhiyun mov r6, #0xff @ Indicate new Task call 69*4882a593Smuzhiyun dsb @ Memory Barrier (not sure if needed, copied from omap_smc2) 70*4882a593Smuzhiyun smc #1 @ Call PPA service 71*4882a593Smuzhiyun ldmfd sp!, {r4-r11, pc} 72*4882a593SmuzhiyunENDPROC(omap_smc3) 73*4882a593Smuzhiyun 74*4882a593SmuzhiyunENTRY(omap_modify_auxcoreboot0) 75*4882a593Smuzhiyun stmfd sp!, {r1-r12, lr} 76*4882a593Smuzhiyun ldr r12, =0x104 77*4882a593Smuzhiyun dsb 78*4882a593Smuzhiyun smc #0 79*4882a593Smuzhiyun ldmfd sp!, {r1-r12, pc} 80*4882a593SmuzhiyunENDPROC(omap_modify_auxcoreboot0) 81*4882a593Smuzhiyun 82*4882a593SmuzhiyunENTRY(omap_auxcoreboot_addr) 83*4882a593Smuzhiyun stmfd sp!, {r2-r12, lr} 84*4882a593Smuzhiyun ldr r12, =0x105 85*4882a593Smuzhiyun dsb 86*4882a593Smuzhiyun smc #0 87*4882a593Smuzhiyun ldmfd sp!, {r2-r12, pc} 88*4882a593SmuzhiyunENDPROC(omap_auxcoreboot_addr) 89*4882a593Smuzhiyun 90*4882a593SmuzhiyunENTRY(omap_read_auxcoreboot0) 91*4882a593Smuzhiyun stmfd sp!, {r2-r12, lr} 92*4882a593Smuzhiyun ldr r12, =0x103 93*4882a593Smuzhiyun dsb 94*4882a593Smuzhiyun smc #0 95*4882a593Smuzhiyun ldmfd sp!, {r2-r12, pc} 96*4882a593SmuzhiyunENDPROC(omap_read_auxcoreboot0) 97