xref: /OK3568_Linux_fs/kernel/arch/arm/mach-omap2/omap-smc.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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