/* * All ripped off from arch/arm/include/asm/arch_gicv3.h * * Copyright (C) 2016, Red Hat Inc, Andrew Jones * * This work is licensed under the terms of the GNU LGPL, version 2. */ #ifndef _ASMARM_ARCH_GICV3_H_ #define _ASMARM_ARCH_GICV3_H_ #ifndef __ASSEMBLY__ #include #include #include #include #define ICC_PMR __ACCESS_CP15(c4, 0, c6, 0) #define ICC_SGI1R __ACCESS_CP15_64(0, c12) #define ICC_IAR1 __ACCESS_CP15(c12, 0, c12, 0) #define ICC_EOIR1 __ACCESS_CP15(c12, 0, c12, 1) #define ICC_IGRPEN1 __ACCESS_CP15(c12, 0, c12, 7) static inline void gicv3_write_pmr(u32 val) { write_sysreg(val, ICC_PMR); } static inline void gicv3_write_sgi1r(u64 val) { write_sysreg(val, ICC_SGI1R); } static inline u32 gicv3_read_iar(void) { u32 irqstat = read_sysreg(ICC_IAR1); dsb(sy); return irqstat; } static inline void gicv3_write_eoir(u32 irq) { write_sysreg(irq, ICC_EOIR1); isb(); } static inline void gicv3_write_grpen1(u32 val) { write_sysreg(val, ICC_IGRPEN1); isb(); } /* * We may access GICR_TYPER and GITS_TYPER by reading both the TYPER * offset and the following offset (+ 4) and then combining them to * form a 64-bit address. */ static inline u64 gicv3_read_typer(const volatile void __iomem *addr) { u64 val = readl(addr); val |= (u64)readl(addr + 4) << 32; return val; } #endif /* !__ASSEMBLY__ */ #endif /* _ASMARM_ARCH_GICV3_H_ */