Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm64/include/asm/cpuidle.h
26481 views
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
43