18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __ALPHA_IRQFLAGS_H
38c2ecf20Sopenharmony_ci#define __ALPHA_IRQFLAGS_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <asm/pal.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#define IPL_MIN		0
88c2ecf20Sopenharmony_ci#define IPL_SW0		1
98c2ecf20Sopenharmony_ci#define IPL_SW1		2
108c2ecf20Sopenharmony_ci#define IPL_DEV0	3
118c2ecf20Sopenharmony_ci#define IPL_DEV1	4
128c2ecf20Sopenharmony_ci#define IPL_TIMER	5
138c2ecf20Sopenharmony_ci#define IPL_PERF	6
148c2ecf20Sopenharmony_ci#define IPL_POWERFAIL	6
158c2ecf20Sopenharmony_ci#define IPL_MCHECK	7
168c2ecf20Sopenharmony_ci#define IPL_MAX		7
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#ifdef CONFIG_ALPHA_BROKEN_IRQ_MASK
198c2ecf20Sopenharmony_ci#undef IPL_MIN
208c2ecf20Sopenharmony_ci#define IPL_MIN		__min_ipl
218c2ecf20Sopenharmony_ciextern int __min_ipl;
228c2ecf20Sopenharmony_ci#endif
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#define getipl()		(rdps() & 7)
258c2ecf20Sopenharmony_ci#define setipl(ipl)		((void) swpipl(ipl))
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistatic inline unsigned long arch_local_save_flags(void)
288c2ecf20Sopenharmony_ci{
298c2ecf20Sopenharmony_ci	return rdps();
308c2ecf20Sopenharmony_ci}
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistatic inline void arch_local_irq_disable(void)
338c2ecf20Sopenharmony_ci{
348c2ecf20Sopenharmony_ci	setipl(IPL_MAX);
358c2ecf20Sopenharmony_ci	barrier();
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic inline unsigned long arch_local_irq_save(void)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	unsigned long flags = swpipl(IPL_MAX);
418c2ecf20Sopenharmony_ci	barrier();
428c2ecf20Sopenharmony_ci	return flags;
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistatic inline void arch_local_irq_enable(void)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	barrier();
488c2ecf20Sopenharmony_ci	setipl(IPL_MIN);
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistatic inline void arch_local_irq_restore(unsigned long flags)
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	barrier();
548c2ecf20Sopenharmony_ci	setipl(flags);
558c2ecf20Sopenharmony_ci	barrier();
568c2ecf20Sopenharmony_ci}
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_cistatic inline bool arch_irqs_disabled_flags(unsigned long flags)
598c2ecf20Sopenharmony_ci{
608c2ecf20Sopenharmony_ci	return flags == IPL_MAX;
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistatic inline bool arch_irqs_disabled(void)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	return arch_irqs_disabled_flags(getipl());
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#endif /* __ALPHA_IRQFLAGS_H */
69