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 7d64f84f6SLorenzo Pieralisi #ifdef CONFIG_CPU_IDLE 8c9d62161SDaniel Lezcano extern int arm_cpuidle_init(unsigned int cpu); 9af391b15SSudeep Holla extern int arm_cpuidle_suspend(int index); 10d64f84f6SLorenzo Pieralisi #else 11c9d62161SDaniel Lezcano static inline int arm_cpuidle_init(unsigned int cpu) 12d64f84f6SLorenzo Pieralisi { 13d64f84f6SLorenzo Pieralisi return -EOPNOTSUPP; 14d64f84f6SLorenzo Pieralisi } 15af3cfdbfSLorenzo Pieralisi 16af391b15SSudeep Holla static inline int arm_cpuidle_suspend(int index) 17af3cfdbfSLorenzo Pieralisi { 18af3cfdbfSLorenzo Pieralisi return -EOPNOTSUPP; 19af3cfdbfSLorenzo Pieralisi } 20d64f84f6SLorenzo Pieralisi #endif 21*8848f066SMarc Zyngier 22*8848f066SMarc Zyngier #ifdef CONFIG_ARM64_PSEUDO_NMI 23*8848f066SMarc Zyngier #include <asm/arch_gicv3.h> 24*8848f066SMarc Zyngier 25*8848f066SMarc Zyngier struct arm_cpuidle_irq_context { 26*8848f066SMarc Zyngier unsigned long pmr; 27*8848f066SMarc Zyngier unsigned long daif_bits; 28*8848f066SMarc Zyngier }; 29*8848f066SMarc Zyngier 30*8848f066SMarc Zyngier #define arm_cpuidle_save_irq_context(__c) \ 31*8848f066SMarc Zyngier do { \ 32*8848f066SMarc Zyngier struct arm_cpuidle_irq_context *c = __c; \ 33*8848f066SMarc Zyngier if (system_uses_irq_prio_masking()) { \ 34*8848f066SMarc Zyngier c->daif_bits = read_sysreg(daif); \ 35*8848f066SMarc Zyngier write_sysreg(c->daif_bits | PSR_I_BIT | PSR_F_BIT, \ 36*8848f066SMarc Zyngier daif); \ 37*8848f066SMarc Zyngier c->pmr = gic_read_pmr(); \ 38*8848f066SMarc Zyngier gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); \ 39*8848f066SMarc Zyngier } \ 40*8848f066SMarc Zyngier } while (0) 41*8848f066SMarc Zyngier 42*8848f066SMarc Zyngier #define arm_cpuidle_restore_irq_context(__c) \ 43*8848f066SMarc Zyngier do { \ 44*8848f066SMarc Zyngier struct arm_cpuidle_irq_context *c = __c; \ 45*8848f066SMarc Zyngier if (system_uses_irq_prio_masking()) { \ 46*8848f066SMarc Zyngier gic_write_pmr(c->pmr); \ 47*8848f066SMarc Zyngier write_sysreg(c->daif_bits, daif); \ 48*8848f066SMarc Zyngier } \ 49*8848f066SMarc Zyngier } while (0) 50*8848f066SMarc Zyngier #else 51*8848f066SMarc Zyngier struct arm_cpuidle_irq_context { }; 52*8848f066SMarc Zyngier 53*8848f066SMarc Zyngier #define arm_cpuidle_save_irq_context(c) (void)c 54*8848f066SMarc Zyngier #define arm_cpuidle_restore_irq_context(c) (void)c 55*8848f066SMarc Zyngier #endif 56d64f84f6SLorenzo Pieralisi #endif 57