blob: 45b6096844601147d493b767deece709313e74ad [file] [log] [blame]
/*
* All ripped off from arch/arm/include/asm/arch_gicv3.h
*
* Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
*
* 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 <libcflat.h>
#include <asm/sysreg.h>
#include <asm/barrier.h>
#include <asm/io.h>
#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_ */