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 10struct 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 36struct 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