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