xref: /rk3399_ARM-atf/bl32/tsp/tsp_private.h (revision d5dfdeb65ff5b7f24dded201d2945c7b74565ce8)
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 
7c3cf06f1SAntonio Nino Diaz #ifndef TSP_PRIVATE_H
8c3cf06f1SAntonio Nino Diaz #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 
23*d5dfdeb6SJulius Werner #ifndef __ASSEMBLER__
24da0af78aSDan Handley 
25da0af78aSDan Handley #include <stdint.h>
26da0af78aSDan Handley 
2709d40e0eSAntonio Nino Diaz #include <platform_def.h> /* For CACHE_WRITEBACK_GRANULE */
2809d40e0eSAntonio Nino Diaz 
2909d40e0eSAntonio Nino Diaz #include <bl32/tsp/tsp.h>
3009d40e0eSAntonio Nino Diaz #include <lib/cassert.h>
3109d40e0eSAntonio Nino Diaz #include <lib/spinlock.h>
32da0af78aSDan Handley 
33da0af78aSDan Handley typedef struct work_statistics {
3402446137SSoby Mathew 	/* Number of s-el1 interrupts on this cpu */
3502446137SSoby Mathew 	uint32_t sel1_intr_count;
36404dba53SSoby Mathew 	/* Number of non s-el1 interrupts on this cpu which preempted TSP */
37404dba53SSoby Mathew 	uint32_t preempt_intr_count;
3802446137SSoby Mathew 	/* Number of sync s-el1 interrupts on this cpu */
3902446137SSoby Mathew 	uint32_t sync_sel1_intr_count;
4002446137SSoby Mathew 	/* Number of s-el1 interrupts returns on this cpu */
4102446137SSoby Mathew 	uint32_t sync_sel1_intr_ret_count;
42da0af78aSDan Handley 	uint32_t smc_count;		/* Number of returns on this cpu */
43da0af78aSDan Handley 	uint32_t eret_count;		/* Number of entries on this cpu */
44da0af78aSDan Handley 	uint32_t cpu_on_count;		/* Number of cpu on requests */
45da0af78aSDan Handley 	uint32_t cpu_off_count;		/* Number of cpu off requests */
46da0af78aSDan Handley 	uint32_t cpu_suspend_count;	/* Number of cpu suspend requests */
47da0af78aSDan Handley 	uint32_t cpu_resume_count;	/* Number of cpu resume requests */
48da0af78aSDan Handley } __aligned(CACHE_WRITEBACK_GRANULE) work_statistics_t;
49da0af78aSDan Handley 
50da0af78aSDan Handley typedef struct tsp_args {
51da0af78aSDan Handley 	uint64_t _regs[TSP_ARGS_END >> 3];
52da0af78aSDan Handley } __aligned(CACHE_WRITEBACK_GRANULE) tsp_args_t;
53da0af78aSDan Handley 
54da0af78aSDan Handley /* Macros to access members of the above structure using their offsets */
55da0af78aSDan Handley #define read_sp_arg(args, offset)	((args)->_regs[offset >> 3])
56da0af78aSDan Handley #define write_sp_arg(args, offset, val) (((args)->_regs[offset >> 3])	\
57da0af78aSDan Handley 					 = val)
58da0af78aSDan Handley /*
59da0af78aSDan Handley  * Ensure that the assembler's view of the size of the tsp_args is the
60da0af78aSDan Handley  * same as the compilers
61da0af78aSDan Handley  */
62da0af78aSDan Handley CASSERT(TSP_ARGS_SIZE == sizeof(tsp_args_t), assert_sp_args_size_mismatch);
63da0af78aSDan Handley 
64da0af78aSDan Handley void tsp_get_magic(uint64_t args[4]);
65da0af78aSDan Handley 
66a27163bcSRoberto Vargas tsp_args_t *tsp_cpu_resume_main(uint64_t max_off_pwrlvl,
67da0af78aSDan Handley 				uint64_t arg1,
68da0af78aSDan Handley 				uint64_t arg2,
69da0af78aSDan Handley 				uint64_t arg3,
70da0af78aSDan Handley 				uint64_t arg4,
71da0af78aSDan Handley 				uint64_t arg5,
72da0af78aSDan Handley 				uint64_t arg6,
73da0af78aSDan Handley 				uint64_t arg7);
74da0af78aSDan Handley tsp_args_t *tsp_cpu_suspend_main(uint64_t arg0,
75da0af78aSDan Handley 				 uint64_t arg1,
76da0af78aSDan Handley 				 uint64_t arg2,
77da0af78aSDan Handley 				 uint64_t arg3,
78da0af78aSDan Handley 				 uint64_t arg4,
79da0af78aSDan Handley 				 uint64_t arg5,
80da0af78aSDan Handley 				 uint64_t arg6,
81da0af78aSDan Handley 				 uint64_t arg7);
82da0af78aSDan Handley tsp_args_t *tsp_cpu_on_main(void);
83da0af78aSDan Handley tsp_args_t *tsp_cpu_off_main(uint64_t arg0,
84da0af78aSDan Handley 			     uint64_t arg1,
85da0af78aSDan Handley 			     uint64_t arg2,
86da0af78aSDan Handley 			     uint64_t arg3,
87da0af78aSDan Handley 			     uint64_t arg4,
88da0af78aSDan Handley 			     uint64_t arg5,
89da0af78aSDan Handley 			     uint64_t arg6,
90da0af78aSDan Handley 			     uint64_t arg7);
91da0af78aSDan Handley 
92da0af78aSDan Handley /* Generic Timer functions */
93da0af78aSDan Handley void tsp_generic_timer_start(void);
94da0af78aSDan Handley void tsp_generic_timer_handler(void);
95da0af78aSDan Handley void tsp_generic_timer_stop(void);
96da0af78aSDan Handley void tsp_generic_timer_save(void);
97da0af78aSDan Handley void tsp_generic_timer_restore(void);
98da0af78aSDan Handley 
9902446137SSoby Mathew /* S-EL1 interrupt management functions */
10002446137SSoby Mathew void tsp_update_sync_sel1_intr_stats(uint32_t type, uint64_t elr_el3);
101da0af78aSDan Handley 
102da0af78aSDan Handley 
103da0af78aSDan Handley /* Data structure to keep track of TSP statistics */
104da0af78aSDan Handley extern spinlock_t console_lock;
105da0af78aSDan Handley extern work_statistics_t tsp_stats[PLATFORM_CORE_COUNT];
106da0af78aSDan Handley 
107da0af78aSDan Handley /* Vector table of jumps */
108da0af78aSDan Handley extern tsp_vectors_t tsp_vector_table;
109da0af78aSDan Handley 
1101a29f938SRoberto Vargas /* functions */
1111a29f938SRoberto Vargas int32_t tsp_common_int_handler(void);
1121a29f938SRoberto Vargas int32_t tsp_handle_preemption(void);
113da0af78aSDan Handley 
1141a29f938SRoberto Vargas tsp_args_t *tsp_abort_smc_handler(uint64_t func,
1151a29f938SRoberto Vargas 				  uint64_t arg1,
1161a29f938SRoberto Vargas 				  uint64_t arg2,
1171a29f938SRoberto Vargas 				  uint64_t arg3,
1181a29f938SRoberto Vargas 				  uint64_t arg4,
1191a29f938SRoberto Vargas 				  uint64_t arg5,
1201a29f938SRoberto Vargas 				  uint64_t arg6,
1211a29f938SRoberto Vargas 				  uint64_t arg7);
1221a29f938SRoberto Vargas 
1231a29f938SRoberto Vargas tsp_args_t *tsp_smc_handler(uint64_t func,
1241a29f938SRoberto Vargas 			       uint64_t arg1,
1251a29f938SRoberto Vargas 			       uint64_t arg2,
1261a29f938SRoberto Vargas 			       uint64_t arg3,
1271a29f938SRoberto Vargas 			       uint64_t arg4,
1281a29f938SRoberto Vargas 			       uint64_t arg5,
1291a29f938SRoberto Vargas 			       uint64_t arg6,
1301a29f938SRoberto Vargas 			       uint64_t arg7);
1311a29f938SRoberto Vargas 
1321a29f938SRoberto Vargas tsp_args_t *tsp_system_reset_main(uint64_t arg0,
1331a29f938SRoberto Vargas 				uint64_t arg1,
1341a29f938SRoberto Vargas 				uint64_t arg2,
1351a29f938SRoberto Vargas 				uint64_t arg3,
1361a29f938SRoberto Vargas 				uint64_t arg4,
1371a29f938SRoberto Vargas 				uint64_t arg5,
1381a29f938SRoberto Vargas 				uint64_t arg6,
1391a29f938SRoberto Vargas 				uint64_t arg7);
1401a29f938SRoberto Vargas 
1411a29f938SRoberto Vargas tsp_args_t *tsp_system_off_main(uint64_t arg0,
1421a29f938SRoberto Vargas 				uint64_t arg1,
1431a29f938SRoberto Vargas 				uint64_t arg2,
1441a29f938SRoberto Vargas 				uint64_t arg3,
1451a29f938SRoberto Vargas 				uint64_t arg4,
1461a29f938SRoberto Vargas 				uint64_t arg5,
1471a29f938SRoberto Vargas 				uint64_t arg6,
1481a29f938SRoberto Vargas 				uint64_t arg7);
1491a29f938SRoberto Vargas 
1501a29f938SRoberto Vargas uint64_t tsp_main(void);
151*d5dfdeb6SJulius Werner #endif /* __ASSEMBLER__ */
152da0af78aSDan Handley 
153c3cf06f1SAntonio Nino Diaz #endif /* TSP_PRIVATE_H */
154