xref: /rk3399_ARM-atf/include/lib/extensions/idte3.h (revision ef397720a44e5caea76b9093644c27453af166b8)
1*f396aec8SArvind Ram Prakash /*
2*f396aec8SArvind Ram Prakash  * Copyright (c) 2025, Arm Limited. All rights reserved.
3*f396aec8SArvind Ram Prakash  *
4*f396aec8SArvind Ram Prakash  * SPDX-License-Identifier: BSD-3-Clause
5*f396aec8SArvind Ram Prakash  */
6*f396aec8SArvind Ram Prakash 
7*f396aec8SArvind Ram Prakash #ifndef IDTE3_H
8*f396aec8SArvind Ram Prakash #define IDTE3_H
9*f396aec8SArvind Ram Prakash 
10*f396aec8SArvind Ram Prakash #ifdef IMAGE_BL31
11*f396aec8SArvind Ram Prakash #include <bl31/sync_handle.h>
12*f396aec8SArvind Ram Prakash #include <context.h>
13*f396aec8SArvind Ram Prakash #include <lib/el3_runtime/cpu_data.h>
14*f396aec8SArvind Ram Prakash #define ESR_ELx_ISS(esr)          ((esr) & 0x01ffffff)
15*f396aec8SArvind Ram Prakash 
16*f396aec8SArvind Ram Prakash /* ISS layout for trapped AArch64 system-register access (ESR_EL3.ISS)
17*f396aec8SArvind Ram Prakash  *
18*f396aec8SArvind Ram Prakash  *  [21:20]  Op0
19*f396aec8SArvind Ram Prakash  *  [19:17]  Op2
20*f396aec8SArvind Ram Prakash  *  [16:14]  Op1
21*f396aec8SArvind Ram Prakash  *  [13:10]  CRn
22*f396aec8SArvind Ram Prakash  *  [9:5]    Rt
23*f396aec8SArvind Ram Prakash  *  [4:1]    CRm
24*f396aec8SArvind Ram Prakash  *  [0]      DIR
25*f396aec8SArvind Ram Prakash  */
26*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP0_SHIFT       U(20)
27*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP2_SHIFT       U(17)
28*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP1_SHIFT       U(14)
29*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRN_SHIFT       U(10)
30*f396aec8SArvind Ram Prakash #define ISS_SYS64_RT_SHIFT        U(5)
31*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRM_SHIFT       U(1)
32*f396aec8SArvind Ram Prakash #define ISS_SYS64_DIR_SHIFT       U(0)
33*f396aec8SArvind Ram Prakash 
34*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP0_MASK        U(0x3)
35*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP1_MASK        U(0x7)
36*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP2_MASK        U(0x7)
37*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRN_MASK        U(0xf)
38*f396aec8SArvind Ram Prakash #define ISS_SYS64_RT_MASK         ULL(0x1f)
39*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRM_MASK        U(0xf)
40*f396aec8SArvind Ram Prakash #define ISS_SYS64_DIR_MASK        U(0x1)
41*f396aec8SArvind Ram Prakash 
42*f396aec8SArvind Ram Prakash /* Field extractors */
43*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP0(iss)        (((iss) >> ISS_SYS64_OP0_SHIFT) & \
44*f396aec8SArvind Ram Prakash 		ISS_SYS64_OP0_MASK)
45*f396aec8SArvind Ram Prakash 
46*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP1(iss)        (((iss) >> ISS_SYS64_OP1_SHIFT) & \
47*f396aec8SArvind Ram Prakash 		ISS_SYS64_OP1_MASK)
48*f396aec8SArvind Ram Prakash 
49*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP2(iss)        (((iss) >> ISS_SYS64_OP2_SHIFT) & \
50*f396aec8SArvind Ram Prakash 		ISS_SYS64_OP2_MASK)
51*f396aec8SArvind Ram Prakash 
52*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRN(iss)        (((iss) >> ISS_SYS64_CRN_SHIFT) & \
53*f396aec8SArvind Ram Prakash 		ISS_SYS64_CRN_MASK)
54*f396aec8SArvind Ram Prakash 
55*f396aec8SArvind Ram Prakash #define ISS_SYS64_RT(iss)         (((iss) >> ISS_SYS64_RT_SHIFT)  & \
56*f396aec8SArvind Ram Prakash 		ISS_SYS64_RT_MASK)
57*f396aec8SArvind Ram Prakash 
58*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRM(iss)        (((iss) >> ISS_SYS64_CRM_SHIFT) & \
59*f396aec8SArvind Ram Prakash 		ISS_SYS64_CRM_MASK)
60*f396aec8SArvind Ram Prakash 
61*f396aec8SArvind Ram Prakash #define ISS_SYS64_DIR(iss)        (((iss) >> ISS_SYS64_DIR_SHIFT) & \
62*f396aec8SArvind Ram Prakash 		ISS_SYS64_DIR_MASK)
63*f396aec8SArvind Ram Prakash 
64*f396aec8SArvind Ram Prakash #define SYSREG_ESR(op0, op1, crn, crm, op2) \
65*f396aec8SArvind Ram Prakash 		((UL(op0) << ISS_SYS64_OP0_SHIFT) | \
66*f396aec8SArvind Ram Prakash 		 (UL(op1) << ISS_SYS64_OP1_SHIFT) | \
67*f396aec8SArvind Ram Prakash 		 (UL(crn) << ISS_SYS64_CRN_SHIFT) | \
68*f396aec8SArvind Ram Prakash 		 (UL(crm) << ISS_SYS64_CRM_SHIFT) | \
69*f396aec8SArvind Ram Prakash 		 (UL(op2) << ISS_SYS64_OP2_SHIFT))
70*f396aec8SArvind Ram Prakash 
71*f396aec8SArvind Ram Prakash #define ESR_EL3_SYSREG_MASK SYSREG_ESR(3, 7, 15, 15, 7)
72*f396aec8SArvind Ram Prakash 
73*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_PFR0_EL1 SYSREG_ESR(3, 0, 0, 1, 0)
74*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_PFR1_EL1 SYSREG_ESR(3, 0, 0, 1, 1)
75*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_DFR0_EL1 SYSREG_ESR(3, 0, 0, 1, 2)
76*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AFR0_EL1 SYSREG_ESR(3, 0, 0, 1, 3)
77*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR0_EL1 SYSREG_ESR(3, 0, 0, 1, 4)
78*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR1_EL1 SYSREG_ESR(3, 0, 0, 1, 5)
79*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR2_EL1 SYSREG_ESR(3, 0, 0, 1, 6)
80*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR3_EL1 SYSREG_ESR(3, 0, 0, 1, 7)
81*f396aec8SArvind Ram Prakash 
82*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR0_EL1 SYSREG_ESR(3, 0, 0, 2, 0)
83*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR1_EL1 SYSREG_ESR(3, 0, 0, 2, 1)
84*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR2_EL1 SYSREG_ESR(3, 0, 0, 2, 2)
85*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR3_EL1 SYSREG_ESR(3, 0, 0, 2, 3)
86*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR4_EL1 SYSREG_ESR(3, 0, 0, 2, 4)
87*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR5_EL1 SYSREG_ESR(3, 0, 0, 2, 5)
88*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR4_EL1 SYSREG_ESR(3, 0, 0, 2, 6)
89*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR6_EL1 SYSREG_ESR(3, 0, 0, 2, 7)
90*f396aec8SArvind Ram Prakash 
91*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_MVFR0_EL1 SYSREG_ESR(3, 0, 0, 3, 0)
92*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_MVFR1_EL1 SYSREG_ESR(3, 0, 0, 3, 1)
93*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_MVFR2_EL1 SYSREG_ESR(3, 0, 0, 3, 2)
94*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_PFR2_EL1 SYSREG_ESR(3, 0, 0, 3, 4)
95*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_DFR1_EL1 SYSREG_ESR(3, 0, 0, 3, 5)
96*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR5_EL1 SYSREG_ESR(3, 0, 0, 3, 6)
97*f396aec8SArvind Ram Prakash 
98*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64PFR0_EL1 SYSREG_ESR(3, 0, 0, 4, 0)
99*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64PFR1_EL1 SYSREG_ESR(3, 0, 0, 4, 1)
100*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64PFR2_EL1 SYSREG_ESR(3, 0, 0, 4, 2)
101*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ZFR0_EL1 SYSREG_ESR(3, 0, 0, 4, 4)
102*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64SMFR0_EL1 SYSREG_ESR(3, 0, 0, 4, 5)
103*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64FPFR0_EL1 SYSREG_ESR(3, 0, 0, 4, 7)
104*f396aec8SArvind Ram Prakash 
105*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64DFR0_EL1 SYSREG_ESR(3, 0, 0, 5, 0)
106*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64DFR1_EL1 SYSREG_ESR(3, 0, 0, 5, 1)
107*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64DFR2_EL1 SYSREG_ESR(3, 0, 0, 5, 2)
108*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64AFR0_EL1 SYSREG_ESR(3, 0, 0, 5, 4)
109*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64AFR1_EL1 SYSREG_ESR(3, 0, 0, 5, 5)
110*f396aec8SArvind Ram Prakash 
111*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ISAR0_EL1 SYSREG_ESR(3, 0, 0, 6, 0)
112*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ISAR1_EL1 SYSREG_ESR(3, 0, 0, 6, 1)
113*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ISAR2_EL1 SYSREG_ESR(3, 0, 0, 6, 2)
114*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ISAR3_EL1 SYSREG_ESR(3, 0, 0, 6, 3)
115*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR0_EL1 SYSREG_ESR(3, 0, 0, 7, 0)
116*f396aec8SArvind Ram Prakash 
117*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR1_EL1 SYSREG_ESR(3, 0, 0, 7, 1)
118*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR2_EL1 SYSREG_ESR(3, 0, 0, 7, 2)
119*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR3_EL1 SYSREG_ESR(3, 0, 0, 7, 3)
120*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR4_EL1 SYSREG_ESR(3, 0, 0, 7, 4)
121*f396aec8SArvind Ram Prakash 
122*f396aec8SArvind Ram Prakash /* Group 5 ID Registers trapped*/
123*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_GMID_EL1         SYSREG_ESR(3, 1, 0, 0, 4)
124*f396aec8SArvind Ram Prakash 
125*f396aec8SArvind Ram Prakash #if ENABLE_FEAT_IDTE3
126*f396aec8SArvind Ram Prakash void idte3_enable(cpu_context_t *ctx);
127*f396aec8SArvind Ram Prakash int handle_idreg_trap(uint64_t esr_el3, cpu_context_t *ctx,
128*f396aec8SArvind Ram Prakash 				u_register_t flags);
129*f396aec8SArvind Ram Prakash void idte3_init_cached_idregs_per_world(size_t security_state);
130*f396aec8SArvind Ram Prakash void idte3_init_percpu_once_regs(size_t security_state);
131*f396aec8SArvind Ram Prakash #else
idte3_enable(cpu_context_t * ctx)132*f396aec8SArvind Ram Prakash static inline void idte3_enable(cpu_context_t *ctx)
133*f396aec8SArvind Ram Prakash {
134*f396aec8SArvind Ram Prakash }
handle_idreg_trap(uint64_t esr_el3,cpu_context_t * ctx,u_register_t flags)135*f396aec8SArvind Ram Prakash static inline int handle_idreg_trap(uint64_t esr_el3, cpu_context_t *ctx,
136*f396aec8SArvind Ram Prakash 							u_register_t flags)
137*f396aec8SArvind Ram Prakash {
138*f396aec8SArvind Ram Prakash 	return TRAP_RET_UNHANDLED;
139*f396aec8SArvind Ram Prakash }
idte3_init_percpu_once_regs(size_t security_state)140*f396aec8SArvind Ram Prakash static inline void idte3_init_percpu_once_regs(size_t security_state)
141*f396aec8SArvind Ram Prakash {
142*f396aec8SArvind Ram Prakash }
idte3_init_cached_idregs_per_world(size_t security_state)143*f396aec8SArvind Ram Prakash static inline void idte3_init_cached_idregs_per_world(size_t security_state)
144*f396aec8SArvind Ram Prakash {
145*f396aec8SArvind Ram Prakash }
146*f396aec8SArvind Ram Prakash #endif /* ENABLE_FEAT_IDTE3 */
147*f396aec8SArvind Ram Prakash #endif /* IMAGE_BL31 */
148*f396aec8SArvind Ram Prakash #endif /* IDTE3_H */
149