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