/* SPDX-License-Identifier: GPL-2.0-only */ #ifndef __LINUX_IRQCHIP_ARM_GIC_V3_PRIO_H #define __LINUX_IRQCHIP_ARM_GIC_V3_PRIO_H /* * GIC priorities from the view of the PMR/RPR. * * These values are chosen to be valid in either the absolute priority space or * the NS view of the priority space. The value programmed into the distributor * and ITS will be chosen at boot time such that these values appear in the * PMR/RPR. * * GICV3_PRIO_UNMASKED is the PMR view of the priority to use to permit both * IRQs and pseudo-NMIs. * * GICV3_PRIO_IRQ is the PMR view of the priority of regular interrupts. This * can be written to the PMR to mask regular IRQs. * * GICV3_PRIO_NMI is the PMR view of the priority of pseudo-NMIs. This can be * written to the PMR to mask pseudo-NMIs. * * On arm64 some code sections either automatically switch back to PSR.I or * explicitly require to not use priority masking. If bit GICV3_PRIO_PSR_I_SET * is included in the priority mask, it indicates that PSR.I should be set and * interrupt disabling temporarily does not rely on IRQ priorities. */ #define GICV3_PRIO_UNMASKED 0xe0 #define GICV3_PRIO_IRQ 0xc0 #define GICV3_PRIO_NMI 0x80 #define GICV3_PRIO_PSR_I_SET (1 << 4) #ifndef __ASSEMBLER__ #define __gicv3_prio_to_ns(p) (0xff & ((p) << 1)) #define __gicv3_ns_to_prio(ns) (0x80 | ((ns) >> 1)) #define __gicv3_prio_valid_ns(p) \ (__gicv3_ns_to_prio(__gicv3_prio_to_ns(p)) == (p)) static_assert(__gicv3_prio_valid_ns(GICV3_PRIO_NMI)); static_assert(__gicv3_prio_valid_ns(GICV3_PRIO_IRQ)); static_assert(GICV3_PRIO_NMI < GICV3_PRIO_IRQ); static_assert(GICV3_PRIO_IRQ < GICV3_PRIO_UNMASKED); static_assert(GICV3_PRIO_IRQ < (GICV3_PRIO_IRQ | GICV3_PRIO_PSR_I_SET)); #endif /* __ASSEMBLER */ #endif /* __LINUX_IRQCHIP_ARM_GIC_V3_PRIO_H */