xref: /rk3399_ARM-atf/bl32/tsp/tsp_private.h (revision 1a29f93815d3ec313c4667d7108d379b93ef6831)
1da0af78aSDan Handley /*
2a27163bcSRoberto Vargas  * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
3da0af78aSDan Handley  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
5da0af78aSDan Handley  */
6da0af78aSDan Handley 
7da0af78aSDan Handley #ifndef __TSP_PRIVATE_H__
8da0af78aSDan Handley #define __TSP_PRIVATE_H__
9da0af78aSDan Handley 
10da0af78aSDan Handley /* Definitions to help the assembler access the SMC/ERET args structure */
11da0af78aSDan Handley #define TSP_ARGS_SIZE		0x40
12da0af78aSDan Handley #define TSP_ARG0		0x0
13da0af78aSDan Handley #define TSP_ARG1		0x8
14da0af78aSDan Handley #define TSP_ARG2		0x10
15da0af78aSDan Handley #define TSP_ARG3		0x18
16da0af78aSDan Handley #define TSP_ARG4		0x20
17da0af78aSDan Handley #define TSP_ARG5		0x28
18da0af78aSDan Handley #define TSP_ARG6		0x30
19da0af78aSDan Handley #define TSP_ARG7		0x38
20da0af78aSDan Handley #define TSP_ARGS_END		0x40
21da0af78aSDan Handley 
22da0af78aSDan Handley 
23da0af78aSDan Handley #ifndef __ASSEMBLY__
24da0af78aSDan Handley 
25da0af78aSDan Handley #include <cassert.h>
26da0af78aSDan Handley #include <platform_def.h> /* For CACHE_WRITEBACK_GRANULE */
27da0af78aSDan Handley #include <spinlock.h>
28da0af78aSDan Handley #include <stdint.h>
29da0af78aSDan Handley #include <tsp.h>
30da0af78aSDan Handley 
31da0af78aSDan Handley 
32da0af78aSDan Handley typedef struct work_statistics {
3302446137SSoby Mathew 	/* Number of s-el1 interrupts on this cpu */
3402446137SSoby Mathew 	uint32_t sel1_intr_count;
35404dba53SSoby Mathew 	/* Number of non s-el1 interrupts on this cpu which preempted TSP */
36404dba53SSoby Mathew 	uint32_t preempt_intr_count;
3702446137SSoby Mathew 	/* Number of sync s-el1 interrupts on this cpu */
3802446137SSoby Mathew 	uint32_t sync_sel1_intr_count;
3902446137SSoby Mathew 	/* Number of s-el1 interrupts returns on this cpu */
4002446137SSoby Mathew 	uint32_t sync_sel1_intr_ret_count;
41da0af78aSDan Handley 	uint32_t smc_count;		/* Number of returns on this cpu */
42da0af78aSDan Handley 	uint32_t eret_count;		/* Number of entries on this cpu */
43da0af78aSDan Handley 	uint32_t cpu_on_count;		/* Number of cpu on requests */
44da0af78aSDan Handley 	uint32_t cpu_off_count;		/* Number of cpu off requests */
45da0af78aSDan Handley 	uint32_t cpu_suspend_count;	/* Number of cpu suspend requests */
46da0af78aSDan Handley 	uint32_t cpu_resume_count;	/* Number of cpu resume requests */
47da0af78aSDan Handley } __aligned(CACHE_WRITEBACK_GRANULE) work_statistics_t;
48da0af78aSDan Handley 
49da0af78aSDan Handley typedef struct tsp_args {
50da0af78aSDan Handley 	uint64_t _regs[TSP_ARGS_END >> 3];
51da0af78aSDan Handley } __aligned(CACHE_WRITEBACK_GRANULE) tsp_args_t;
52da0af78aSDan Handley 
53da0af78aSDan Handley /* Macros to access members of the above structure using their offsets */
54da0af78aSDan Handley #define read_sp_arg(args, offset)	((args)->_regs[offset >> 3])
55da0af78aSDan Handley #define write_sp_arg(args, offset, val) (((args)->_regs[offset >> 3])	\
56da0af78aSDan Handley 					 = val)
57da0af78aSDan Handley /*
58da0af78aSDan Handley  * Ensure that the assembler's view of the size of the tsp_args is the
59da0af78aSDan Handley  * same as the compilers
60da0af78aSDan Handley  */
61da0af78aSDan Handley CASSERT(TSP_ARGS_SIZE == sizeof(tsp_args_t), assert_sp_args_size_mismatch);
62da0af78aSDan Handley 
63da0af78aSDan Handley void tsp_get_magic(uint64_t args[4]);
64da0af78aSDan Handley 
65a27163bcSRoberto Vargas tsp_args_t *tsp_cpu_resume_main(uint64_t max_off_pwrlvl,
66da0af78aSDan Handley 				uint64_t arg1,
67da0af78aSDan Handley 				uint64_t arg2,
68da0af78aSDan Handley 				uint64_t arg3,
69da0af78aSDan Handley 				uint64_t arg4,
70da0af78aSDan Handley 				uint64_t arg5,
71da0af78aSDan Handley 				uint64_t arg6,
72da0af78aSDan Handley 				uint64_t arg7);
73da0af78aSDan Handley tsp_args_t *tsp_cpu_suspend_main(uint64_t arg0,
74da0af78aSDan Handley 				 uint64_t arg1,
75da0af78aSDan Handley 				 uint64_t arg2,
76da0af78aSDan Handley 				 uint64_t arg3,
77da0af78aSDan Handley 				 uint64_t arg4,
78da0af78aSDan Handley 				 uint64_t arg5,
79da0af78aSDan Handley 				 uint64_t arg6,
80da0af78aSDan Handley 				 uint64_t arg7);
81da0af78aSDan Handley tsp_args_t *tsp_cpu_on_main(void);
82da0af78aSDan Handley tsp_args_t *tsp_cpu_off_main(uint64_t arg0,
83da0af78aSDan Handley 			     uint64_t arg1,
84da0af78aSDan Handley 			     uint64_t arg2,
85da0af78aSDan Handley 			     uint64_t arg3,
86da0af78aSDan Handley 			     uint64_t arg4,
87da0af78aSDan Handley 			     uint64_t arg5,
88da0af78aSDan Handley 			     uint64_t arg6,
89da0af78aSDan Handley 			     uint64_t arg7);
90da0af78aSDan Handley 
91da0af78aSDan Handley /* Generic Timer functions */
92da0af78aSDan Handley void tsp_generic_timer_start(void);
93da0af78aSDan Handley void tsp_generic_timer_handler(void);
94da0af78aSDan Handley void tsp_generic_timer_stop(void);
95da0af78aSDan Handley void tsp_generic_timer_save(void);
96da0af78aSDan Handley void tsp_generic_timer_restore(void);
97da0af78aSDan Handley 
9802446137SSoby Mathew /* S-EL1 interrupt management functions */
9902446137SSoby Mathew void tsp_update_sync_sel1_intr_stats(uint32_t type, uint64_t elr_el3);
100da0af78aSDan Handley 
101da0af78aSDan Handley 
102da0af78aSDan Handley /* Data structure to keep track of TSP statistics */
103da0af78aSDan Handley extern spinlock_t console_lock;
104da0af78aSDan Handley extern work_statistics_t tsp_stats[PLATFORM_CORE_COUNT];
105da0af78aSDan Handley 
106da0af78aSDan Handley /* Vector table of jumps */
107da0af78aSDan Handley extern tsp_vectors_t tsp_vector_table;
108da0af78aSDan Handley 
109*1a29f938SRoberto Vargas /* functions */
110*1a29f938SRoberto Vargas int32_t tsp_common_int_handler(void);
111*1a29f938SRoberto Vargas int32_t tsp_handle_preemption(void);
112da0af78aSDan Handley 
113*1a29f938SRoberto Vargas tsp_args_t *tsp_abort_smc_handler(uint64_t func,
114*1a29f938SRoberto Vargas 				  uint64_t arg1,
115*1a29f938SRoberto Vargas 				  uint64_t arg2,
116*1a29f938SRoberto Vargas 				  uint64_t arg3,
117*1a29f938SRoberto Vargas 				  uint64_t arg4,
118*1a29f938SRoberto Vargas 				  uint64_t arg5,
119*1a29f938SRoberto Vargas 				  uint64_t arg6,
120*1a29f938SRoberto Vargas 				  uint64_t arg7);
121*1a29f938SRoberto Vargas 
122*1a29f938SRoberto Vargas tsp_args_t *tsp_smc_handler(uint64_t func,
123*1a29f938SRoberto Vargas 			       uint64_t arg1,
124*1a29f938SRoberto Vargas 			       uint64_t arg2,
125*1a29f938SRoberto Vargas 			       uint64_t arg3,
126*1a29f938SRoberto Vargas 			       uint64_t arg4,
127*1a29f938SRoberto Vargas 			       uint64_t arg5,
128*1a29f938SRoberto Vargas 			       uint64_t arg6,
129*1a29f938SRoberto Vargas 			       uint64_t arg7);
130*1a29f938SRoberto Vargas 
131*1a29f938SRoberto Vargas tsp_args_t *tsp_system_reset_main(uint64_t arg0,
132*1a29f938SRoberto Vargas 				uint64_t arg1,
133*1a29f938SRoberto Vargas 				uint64_t arg2,
134*1a29f938SRoberto Vargas 				uint64_t arg3,
135*1a29f938SRoberto Vargas 				uint64_t arg4,
136*1a29f938SRoberto Vargas 				uint64_t arg5,
137*1a29f938SRoberto Vargas 				uint64_t arg6,
138*1a29f938SRoberto Vargas 				uint64_t arg7);
139*1a29f938SRoberto Vargas 
140*1a29f938SRoberto Vargas tsp_args_t *tsp_system_off_main(uint64_t arg0,
141*1a29f938SRoberto Vargas 				uint64_t arg1,
142*1a29f938SRoberto Vargas 				uint64_t arg2,
143*1a29f938SRoberto Vargas 				uint64_t arg3,
144*1a29f938SRoberto Vargas 				uint64_t arg4,
145*1a29f938SRoberto Vargas 				uint64_t arg5,
146*1a29f938SRoberto Vargas 				uint64_t arg6,
147*1a29f938SRoberto Vargas 				uint64_t arg7);
148*1a29f938SRoberto Vargas 
149*1a29f938SRoberto Vargas uint64_t tsp_main(void);
150da0af78aSDan Handley #endif /* __ASSEMBLY__ */
151da0af78aSDan Handley 
152da0af78aSDan Handley #endif /* __TSP_PRIVATE_H__ */
153da0af78aSDan Handley 
154