18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * include/asm/irqflags.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * IRQ flags handling
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * This file gets included from lowlevel asm headers too, to provide
88c2ecf20Sopenharmony_ci * wrapped versions of the local_irq_*() APIs, based on the
98c2ecf20Sopenharmony_ci * arch_local_irq_*() functions from the lowlevel headers.
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci#ifndef _ASM_IRQFLAGS_H
128c2ecf20Sopenharmony_ci#define _ASM_IRQFLAGS_H
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include <linux/types.h>
178c2ecf20Sopenharmony_ci#include <asm/psr.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_civoid arch_local_irq_restore(unsigned long);
208c2ecf20Sopenharmony_ciunsigned long arch_local_irq_save(void);
218c2ecf20Sopenharmony_civoid arch_local_irq_enable(void);
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cistatic inline notrace unsigned long arch_local_save_flags(void)
248c2ecf20Sopenharmony_ci{
258c2ecf20Sopenharmony_ci	unsigned long flags;
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	asm volatile("rd        %%psr, %0" : "=r" (flags));
288c2ecf20Sopenharmony_ci	return flags;
298c2ecf20Sopenharmony_ci}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic inline notrace void arch_local_irq_disable(void)
328c2ecf20Sopenharmony_ci{
338c2ecf20Sopenharmony_ci	arch_local_irq_save();
348c2ecf20Sopenharmony_ci}
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cistatic inline notrace bool arch_irqs_disabled_flags(unsigned long flags)
378c2ecf20Sopenharmony_ci{
388c2ecf20Sopenharmony_ci	return (flags & PSR_PIL) != 0;
398c2ecf20Sopenharmony_ci}
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistatic inline notrace bool arch_irqs_disabled(void)
428c2ecf20Sopenharmony_ci{
438c2ecf20Sopenharmony_ci	return arch_irqs_disabled_flags(arch_local_save_flags());
448c2ecf20Sopenharmony_ci}
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci#endif /* (__ASSEMBLY__) */
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci#endif /* !(_ASM_IRQFLAGS_H) */
49