xref: /linux/tools/testing/selftests/kvm/include/arm64/gic_v5.h (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
1*0a9f38bfSSascha Bischoff /* SPDX-License-Identifier: GPL-2.0-only */
2*0a9f38bfSSascha Bischoff 
3*0a9f38bfSSascha Bischoff #ifndef __SELFTESTS_GIC_V5_H
4*0a9f38bfSSascha Bischoff #define __SELFTESTS_GIC_V5_H
5*0a9f38bfSSascha Bischoff 
6*0a9f38bfSSascha Bischoff #include <asm/barrier.h>
7*0a9f38bfSSascha Bischoff #include <asm/sysreg.h>
8*0a9f38bfSSascha Bischoff 
9*0a9f38bfSSascha Bischoff #include <linux/bitfield.h>
10*0a9f38bfSSascha Bischoff 
11*0a9f38bfSSascha Bischoff #include "processor.h"
12*0a9f38bfSSascha Bischoff 
13*0a9f38bfSSascha Bischoff /*
14*0a9f38bfSSascha Bischoff  * Definitions for GICv5 instructions for the Current Domain
15*0a9f38bfSSascha Bischoff  */
16*0a9f38bfSSascha Bischoff #define GICV5_OP_GIC_CDAFF		sys_insn(1, 0, 12, 1, 3)
17*0a9f38bfSSascha Bischoff #define GICV5_OP_GIC_CDDI		sys_insn(1, 0, 12, 2, 0)
18*0a9f38bfSSascha Bischoff #define GICV5_OP_GIC_CDDIS		sys_insn(1, 0, 12, 1, 0)
19*0a9f38bfSSascha Bischoff #define GICV5_OP_GIC_CDHM		sys_insn(1, 0, 12, 2, 1)
20*0a9f38bfSSascha Bischoff #define GICV5_OP_GIC_CDEN		sys_insn(1, 0, 12, 1, 1)
21*0a9f38bfSSascha Bischoff #define GICV5_OP_GIC_CDEOI		sys_insn(1, 0, 12, 1, 7)
22*0a9f38bfSSascha Bischoff #define GICV5_OP_GIC_CDPEND		sys_insn(1, 0, 12, 1, 4)
23*0a9f38bfSSascha Bischoff #define GICV5_OP_GIC_CDPRI		sys_insn(1, 0, 12, 1, 2)
24*0a9f38bfSSascha Bischoff #define GICV5_OP_GIC_CDRCFG		sys_insn(1, 0, 12, 1, 5)
25*0a9f38bfSSascha Bischoff #define GICV5_OP_GICR_CDIA		sys_insn(1, 0, 12, 3, 0)
26*0a9f38bfSSascha Bischoff #define GICV5_OP_GICR_CDNMIA		sys_insn(1, 0, 12, 3, 1)
27*0a9f38bfSSascha Bischoff 
28*0a9f38bfSSascha Bischoff /* Definitions for GIC CDAFF */
29*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDAFF_IAFFID_MASK	GENMASK_ULL(47, 32)
30*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDAFF_TYPE_MASK	GENMASK_ULL(31, 29)
31*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDAFF_IRM_MASK	BIT_ULL(28)
32*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDAFF_ID_MASK		GENMASK_ULL(23, 0)
33*0a9f38bfSSascha Bischoff 
34*0a9f38bfSSascha Bischoff /* Definitions for GIC CDDI */
35*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDDI_TYPE_MASK	GENMASK_ULL(31, 29)
36*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDDI_ID_MASK		GENMASK_ULL(23, 0)
37*0a9f38bfSSascha Bischoff 
38*0a9f38bfSSascha Bischoff /* Definitions for GIC CDDIS */
39*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDDIS_TYPE_MASK	GENMASK_ULL(31, 29)
40*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDDIS_TYPE(r)		FIELD_GET(GICV5_GIC_CDDIS_TYPE_MASK, r)
41*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDDIS_ID_MASK		GENMASK_ULL(23, 0)
42*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDDIS_ID(r)		FIELD_GET(GICV5_GIC_CDDIS_ID_MASK, r)
43*0a9f38bfSSascha Bischoff 
44*0a9f38bfSSascha Bischoff /* Definitions for GIC CDEN */
45*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDEN_TYPE_MASK	GENMASK_ULL(31, 29)
46*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDEN_ID_MASK		GENMASK_ULL(23, 0)
47*0a9f38bfSSascha Bischoff 
48*0a9f38bfSSascha Bischoff /* Definitions for GIC CDHM */
49*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDHM_HM_MASK		BIT_ULL(32)
50*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDHM_TYPE_MASK	GENMASK_ULL(31, 29)
51*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDHM_ID_MASK		GENMASK_ULL(23, 0)
52*0a9f38bfSSascha Bischoff 
53*0a9f38bfSSascha Bischoff /* Definitions for GIC CDPEND */
54*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDPEND_PENDING_MASK	BIT_ULL(32)
55*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDPEND_TYPE_MASK	GENMASK_ULL(31, 29)
56*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDPEND_ID_MASK	GENMASK_ULL(23, 0)
57*0a9f38bfSSascha Bischoff 
58*0a9f38bfSSascha Bischoff /* Definitions for GIC CDPRI */
59*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDPRI_PRIORITY_MASK	GENMASK_ULL(39, 35)
60*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDPRI_TYPE_MASK	GENMASK_ULL(31, 29)
61*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDPRI_ID_MASK		GENMASK_ULL(23, 0)
62*0a9f38bfSSascha Bischoff 
63*0a9f38bfSSascha Bischoff /* Definitions for GIC CDRCFG */
64*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDRCFG_TYPE_MASK	GENMASK_ULL(31, 29)
65*0a9f38bfSSascha Bischoff #define GICV5_GIC_CDRCFG_ID_MASK	GENMASK_ULL(23, 0)
66*0a9f38bfSSascha Bischoff 
67*0a9f38bfSSascha Bischoff /* Definitions for GICR CDIA */
68*0a9f38bfSSascha Bischoff #define GICV5_GICR_CDIA_VALID_MASK	BIT_ULL(32)
69*0a9f38bfSSascha Bischoff #define GICV5_GICR_CDIA_VALID(r)	FIELD_GET(GICV5_GICR_CDIA_VALID_MASK, r)
70*0a9f38bfSSascha Bischoff #define GICV5_GICR_CDIA_TYPE_MASK	GENMASK_ULL(31, 29)
71*0a9f38bfSSascha Bischoff #define GICV5_GICR_CDIA_ID_MASK		GENMASK_ULL(23, 0)
72*0a9f38bfSSascha Bischoff #define GICV5_GICR_CDIA_INTID		GENMASK_ULL(31, 0)
73*0a9f38bfSSascha Bischoff 
74*0a9f38bfSSascha Bischoff /* Definitions for GICR CDNMIA */
75*0a9f38bfSSascha Bischoff #define GICV5_GICR_CDNMIA_VALID_MASK	BIT_ULL(32)
76*0a9f38bfSSascha Bischoff #define GICV5_GICR_CDNMIA_VALID(r)	FIELD_GET(GICV5_GICR_CDNMIA_VALID_MASK, r)
77*0a9f38bfSSascha Bischoff #define GICV5_GICR_CDNMIA_TYPE_MASK	GENMASK_ULL(31, 29)
78*0a9f38bfSSascha Bischoff #define GICV5_GICR_CDNMIA_ID_MASK	GENMASK_ULL(23, 0)
79*0a9f38bfSSascha Bischoff 
80*0a9f38bfSSascha Bischoff #define gicr_insn(insn)			read_sysreg_s(GICV5_OP_GICR_##insn)
81*0a9f38bfSSascha Bischoff #define gic_insn(v, insn)		write_sysreg_s(v, GICV5_OP_GIC_##insn)
82*0a9f38bfSSascha Bischoff 
83*0a9f38bfSSascha Bischoff #define __GIC_BARRIER_INSN(op0, op1, CRn, CRm, op2, Rt)			\
84*0a9f38bfSSascha Bischoff 	__emit_inst(0xd5000000					|	\
85*0a9f38bfSSascha Bischoff 		    sys_insn((op0), (op1), (CRn), (CRm), (op2))	|	\
86*0a9f38bfSSascha Bischoff 		    ((Rt) & 0x1f))
87*0a9f38bfSSascha Bischoff 
88*0a9f38bfSSascha Bischoff #define GSB_SYS_BARRIER_INSN		__GIC_BARRIER_INSN(1, 0, 12, 0, 0, 31)
89*0a9f38bfSSascha Bischoff #define GSB_ACK_BARRIER_INSN		__GIC_BARRIER_INSN(1, 0, 12, 0, 1, 31)
90*0a9f38bfSSascha Bischoff 
91*0a9f38bfSSascha Bischoff #define gsb_ack()	asm volatile(GSB_ACK_BARRIER_INSN : : : "memory")
92*0a9f38bfSSascha Bischoff #define gsb_sys()	asm volatile(GSB_SYS_BARRIER_INSN : : : "memory")
93*0a9f38bfSSascha Bischoff 
94*0a9f38bfSSascha Bischoff #define REPEAT_BYTE(x)	((~0ul / 0xff) * (x))
95*0a9f38bfSSascha Bischoff 
96*0a9f38bfSSascha Bischoff #define GICV5_IRQ_DEFAULT_PRI 0b10000
97*0a9f38bfSSascha Bischoff 
98*0a9f38bfSSascha Bischoff #define GICV5_ARCH_PPI_SW_PPI		0x3
99*0a9f38bfSSascha Bischoff 
100*0a9f38bfSSascha Bischoff void gicv5_ppi_priority_init(void)
101*0a9f38bfSSascha Bischoff {
102*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR0_EL1);
103*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR1_EL1);
104*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR2_EL1);
105*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR3_EL1);
106*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR4_EL1);
107*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR5_EL1);
108*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR6_EL1);
109*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR7_EL1);
110*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR8_EL1);
111*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR9_EL1);
112*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR10_EL1);
113*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR11_EL1);
114*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR12_EL1);
115*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR13_EL1);
116*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR14_EL1);
117*0a9f38bfSSascha Bischoff 	write_sysreg_s(REPEAT_BYTE(GICV5_IRQ_DEFAULT_PRI), SYS_ICC_PPI_PRIORITYR15_EL1);
118*0a9f38bfSSascha Bischoff 
119*0a9f38bfSSascha Bischoff 	/*
120*0a9f38bfSSascha Bischoff 	 * Context syncronization required to make sure system register writes
121*0a9f38bfSSascha Bischoff 	 * effects are synchronised.
122*0a9f38bfSSascha Bischoff 	 */
123*0a9f38bfSSascha Bischoff 	isb();
124*0a9f38bfSSascha Bischoff }
125*0a9f38bfSSascha Bischoff 
126*0a9f38bfSSascha Bischoff void gicv5_cpu_disable_interrupts(void)
127*0a9f38bfSSascha Bischoff {
128*0a9f38bfSSascha Bischoff 	u64 cr0;
129*0a9f38bfSSascha Bischoff 
130*0a9f38bfSSascha Bischoff 	cr0 = FIELD_PREP(ICC_CR0_EL1_EN, 0);
131*0a9f38bfSSascha Bischoff 	write_sysreg_s(cr0, SYS_ICC_CR0_EL1);
132*0a9f38bfSSascha Bischoff }
133*0a9f38bfSSascha Bischoff 
134*0a9f38bfSSascha Bischoff void gicv5_cpu_enable_interrupts(void)
135*0a9f38bfSSascha Bischoff {
136*0a9f38bfSSascha Bischoff 	u64 cr0, pcr;
137*0a9f38bfSSascha Bischoff 
138*0a9f38bfSSascha Bischoff 	write_sysreg_s(0, SYS_ICC_PPI_ENABLER0_EL1);
139*0a9f38bfSSascha Bischoff 	write_sysreg_s(0, SYS_ICC_PPI_ENABLER1_EL1);
140*0a9f38bfSSascha Bischoff 
141*0a9f38bfSSascha Bischoff 	gicv5_ppi_priority_init();
142*0a9f38bfSSascha Bischoff 
143*0a9f38bfSSascha Bischoff 	pcr = FIELD_PREP(ICC_PCR_EL1_PRIORITY, GICV5_IRQ_DEFAULT_PRI);
144*0a9f38bfSSascha Bischoff 	write_sysreg_s(pcr, SYS_ICC_PCR_EL1);
145*0a9f38bfSSascha Bischoff 
146*0a9f38bfSSascha Bischoff 	cr0 = FIELD_PREP(ICC_CR0_EL1_EN, 1);
147*0a9f38bfSSascha Bischoff 	write_sysreg_s(cr0, SYS_ICC_CR0_EL1);
148*0a9f38bfSSascha Bischoff }
149*0a9f38bfSSascha Bischoff 
150*0a9f38bfSSascha Bischoff #endif
151