xref: /rk3399_ARM-atf/include/bl31/interrupt_mgmt.h (revision 82cb2c1ad9897473743f08437d0a3995bed561b9)
1 /*
2  * Copyright (c) 2014, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef __INTERRUPT_MGMT_H__
8 #define __INTERRUPT_MGMT_H__
9 
10 #include <arch.h>
11 
12 /*******************************************************************************
13  * Constants for the types of interrupts recognised by the IM framework
14  ******************************************************************************/
15 #define INTR_TYPE_S_EL1			0
16 #define INTR_TYPE_EL3			1
17 #define INTR_TYPE_NS			2
18 #define MAX_INTR_TYPES			3
19 #define INTR_TYPE_INVAL			MAX_INTR_TYPES
20 /*
21  * Constant passed to the interrupt handler in the 'id' field when the
22  * framework does not read the gic registers to determine the interrupt id.
23  */
24 #define INTR_ID_UNAVAILABLE		0xFFFFFFFF
25 
26 
27 /*******************************************************************************
28  * Mask for _both_ the routing model bits in the 'flags' parameter and
29  * constants to define the valid routing models for each supported interrupt
30  * type
31  ******************************************************************************/
32 #define INTR_RM_FLAGS_SHIFT		0x0
33 #define INTR_RM_FLAGS_MASK		0x3
34 /* Routed to EL3 from NS. Taken to S-EL1 from Secure */
35 #define INTR_SEL1_VALID_RM0		0x2
36 /* Routed to EL3 from NS and Secure */
37 #define INTR_SEL1_VALID_RM1		0x3
38 /* Routed to EL1/EL2 from NS and to S-EL1 from Secure */
39 #define INTR_NS_VALID_RM0		0x0
40 /* Routed to EL1/EL2 from NS and to EL3 from Secure */
41 #define INTR_NS_VALID_RM1		0x1
42 /* Routed to EL3 from NS. Taken to S-EL1 from Secure and handed over to EL3 */
43 #define INTR_EL3_VALID_RM0		0x2
44 /* Routed to EL3 from NS and Secure */
45 #define INTR_EL3_VALID_RM1		0x3
46 /* This is the default routing model */
47 #define INTR_DEFAULT_RM		0x0
48 
49 /*******************************************************************************
50  * Constants for the _individual_ routing model bits in the 'flags' field for
51  * each interrupt type and mask to validate the 'flags' parameter while
52  * registering an interrupt handler
53  ******************************************************************************/
54 #define INTR_TYPE_FLAGS_MASK		0xFFFFFFFC
55 
56 #define INTR_RM_FROM_SEC_SHIFT		SECURE		/* BIT[0] */
57 #define INTR_RM_FROM_NS_SHIFT		NON_SECURE	/* BIT[1] */
58 #define INTR_RM_FROM_FLAG_MASK		1
59 #define get_interrupt_rm_flag(flag, ss)	(((flag >> INTR_RM_FLAGS_SHIFT) >> ss) \
60 					 & INTR_RM_FROM_FLAG_MASK)
61 #define set_interrupt_rm_flag(flag, ss)	(flag |= 1 << ss)
62 #define clr_interrupt_rm_flag(flag, ss)	(flag &= ~(1 << ss))
63 
64 
65 /*******************************************************************************
66  * Macros to validate the routing model bits in the 'flags' for a type
67  * of interrupt. If the model does not match one of the valid masks
68  * -EINVAL is returned.
69  ******************************************************************************/
70 #define validate_sel1_interrupt_rm(x)	((x) == INTR_SEL1_VALID_RM0 ? 0 : \
71 					 ((x) == INTR_SEL1_VALID_RM1 ? 0 :\
72 					  -EINVAL))
73 
74 #define validate_ns_interrupt_rm(x)	((x) == INTR_NS_VALID_RM0 ? 0 : \
75 					 ((x) == INTR_NS_VALID_RM1 ? 0 :\
76 					  -EINVAL))
77 
78 #define validate_el3_interrupt_rm(x)	((x) == INTR_EL3_VALID_RM0 ? 0 : \
79 					 ((x) == INTR_EL3_VALID_RM1 ? 0 :\
80 					  -EINVAL))
81 
82 /*******************************************************************************
83  * Macros to set the 'flags' parameter passed to an interrupt type handler. Only
84  * the flag to indicate the security state when the exception was generated is
85  * supported.
86  ******************************************************************************/
87 #define INTR_SRC_SS_FLAG_SHIFT		0		/* BIT[0] */
88 #define INTR_SRC_SS_FLAG_MASK		1
89 #define set_interrupt_src_ss(flag, val)	(flag |= val << INTR_SRC_SS_FLAG_SHIFT)
90 #define clr_interrupt_src_ss(flag)	(flag &= ~(1 << INTR_SRC_SS_FLAG_SHIFT))
91 #define get_interrupt_src_ss(flag)	((flag >> INTR_SRC_SS_FLAG_SHIFT) & \
92 					 INTR_SRC_SS_FLAG_MASK)
93 
94 #ifndef __ASSEMBLY__
95 
96 /* Prototype for defining a handler for an interrupt type */
97 typedef uint64_t (*interrupt_type_handler_t)(uint32_t id,
98 					     uint32_t flags,
99 					     void *handle,
100 					     void *cookie);
101 
102 /*******************************************************************************
103  * Function & variable prototypes
104  ******************************************************************************/
105 uint32_t get_scr_el3_from_routing_model(uint32_t security_state);
106 int32_t set_routing_model(uint32_t type, uint32_t flags);
107 int32_t register_interrupt_type_handler(uint32_t type,
108 					interrupt_type_handler_t handler,
109 					uint32_t flags);
110 interrupt_type_handler_t get_interrupt_type_handler(uint32_t interrupt_type);
111 int disable_intr_rm_local(uint32_t type, uint32_t security_state);
112 int enable_intr_rm_local(uint32_t type, uint32_t security_state);
113 
114 #endif /*__ASSEMBLY__*/
115 #endif /* __INTERRUPT_MGMT_H__ */
116