1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __ASM_CPUIDLE_H 3 #define __ASM_CPUIDLE_H 4 5 #include <asm/proc-fns.h> 6 7 #ifdef CONFIG_ARM64_PSEUDO_NMI 8 #include <asm/arch_gicv3.h> 9 10 struct arm_cpuidle_irq_context { 11 unsigned long pmr; 12 unsigned long daif_bits; 13 }; 14 15 #define arm_cpuidle_save_irq_context(__c) \ 16 do { \ 17 struct arm_cpuidle_irq_context *c = __c; \ 18 if (system_uses_irq_prio_masking()) { \ 19 c->daif_bits = read_sysreg(daif); \ 20 write_sysreg(c->daif_bits | PSR_I_BIT | PSR_F_BIT, \ 21 daif); \ 22 c->pmr = gic_read_pmr(); \ 23 gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); \ 24 } \ 25 } while (0) 26 27 #define arm_cpuidle_restore_irq_context(__c) \ 28 do { \ 29 struct arm_cpuidle_irq_context *c = __c; \ 30 if (system_uses_irq_prio_masking()) { \ 31 gic_write_pmr(c->pmr); \ 32 write_sysreg(c->daif_bits, daif); \ 33 } \ 34 } while (0) 35 #else 36 struct arm_cpuidle_irq_context { }; 37 38 #define arm_cpuidle_save_irq_context(c) (void)c 39 #define arm_cpuidle_restore_irq_context(c) (void)c 40 #endif 41 #endif 42