2015-10-01 13:47:14 +01:00
/*
* arch / arm64 / include / asm / arch_gicv3 . h
*
* Copyright ( C ) 2015 ARM Ltd .
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# ifndef __ASM_ARCH_GICV3_H
# define __ASM_ARCH_GICV3_H
# include <asm/sysreg.h>
# ifndef __ASSEMBLY__
# include <linux/stringify.h>
2015-12-07 10:11:12 +00:00
# include <asm/barrier.h>
2016-11-02 11:54:05 +00:00
# include <asm/cacheflush.h>
2015-10-01 13:47:14 +01:00
2017-01-19 17:57:43 +00:00
# define read_gicreg(r) read_sysreg_s(SYS_ ## r)
# define write_gicreg(v, r) write_sysreg_s(v, SYS_ ## r)
2016-09-12 15:49:16 +01:00
2015-10-01 13:47:15 +01:00
/*
* Low - level accessors
*
* These system registers are 32 bits , but we make sure that the compiler
* sets the GP register ' s most significant bits to 0 with an explicit cast .
*/
2015-10-01 13:47:14 +01:00
2015-10-01 13:47:15 +01:00
static inline void gic_write_eoir ( u32 irq )
2015-10-01 13:47:14 +01:00
{
2017-01-19 17:57:43 +00:00
write_sysreg_s ( irq , SYS_ICC_EOIR1_EL1 ) ;
2015-10-01 13:47:14 +01:00
isb ( ) ;
}
2015-10-01 13:47:15 +01:00
static inline void gic_write_dir ( u32 irq )
2015-10-01 13:47:14 +01:00
{
2017-01-19 17:57:43 +00:00
write_sysreg_s ( irq , SYS_ICC_DIR_EL1 ) ;
2015-10-01 13:47:14 +01:00
isb ( ) ;
}
static inline u64 gic_read_iar_common ( void )
{
u64 irqstat ;
2017-01-19 17:57:43 +00:00
irqstat = read_sysreg_s ( SYS_ICC_IAR1_EL1 ) ;
2016-02-04 10:45:25 -08:00
dsb ( sy ) ;
2015-10-01 13:47:14 +01:00
return irqstat ;
}
/*
* Cavium ThunderX erratum 23154
*
* The gicv3 of ThunderX requires a modified version for reading the
* IAR status to ensure data synchronization ( access to icc_iar1_el1
* is not sync ' ed before and after ) .
*/
static inline u64 gic_read_iar_cavium_thunderx ( void )
{
u64 irqstat ;
2016-10-28 12:23:58 +01:00
nops ( 8 ) ;
2017-01-19 17:57:43 +00:00
irqstat = read_sysreg_s ( SYS_ICC_IAR1_EL1 ) ;
2016-10-28 12:23:58 +01:00
nops ( 4 ) ;
2015-10-01 13:47:14 +01:00
mb ( ) ;
return irqstat ;
}
2015-10-01 13:47:15 +01:00
static inline void gic_write_pmr ( u32 val )
2015-10-01 13:47:14 +01:00
{
2017-01-19 17:57:43 +00:00
write_sysreg_s ( val , SYS_ICC_PMR_EL1 ) ;
2015-10-01 13:47:14 +01:00
}
2015-10-01 13:47:15 +01:00
static inline void gic_write_ctlr ( u32 val )
2015-10-01 13:47:14 +01:00
{
2017-01-19 17:57:43 +00:00
write_sysreg_s ( val , SYS_ICC_CTLR_EL1 ) ;
2015-10-01 13:47:14 +01:00
isb ( ) ;
}
2015-10-01 13:47:15 +01:00
static inline void gic_write_grpen1 ( u32 val )
2015-10-01 13:47:14 +01:00
{
2017-06-05 14:20:00 +01:00
write_sysreg_s ( val , SYS_ICC_IGRPEN1_EL1 ) ;
2015-10-01 13:47:14 +01:00
isb ( ) ;
}
static inline void gic_write_sgi1r ( u64 val )
{
2017-01-19 17:57:43 +00:00
write_sysreg_s ( val , SYS_ICC_SGI1R_EL1 ) ;
2015-10-01 13:47:14 +01:00
}
2015-10-01 13:47:15 +01:00
static inline u32 gic_read_sre ( void )
2015-10-01 13:47:14 +01:00
{
2017-01-19 17:57:43 +00:00
return read_sysreg_s ( SYS_ICC_SRE_EL1 ) ;
2015-10-01 13:47:14 +01:00
}
2015-10-01 13:47:15 +01:00
static inline void gic_write_sre ( u32 val )
2015-10-01 13:47:14 +01:00
{
2017-01-19 17:57:43 +00:00
write_sysreg_s ( val , SYS_ICC_SRE_EL1 ) ;
2015-10-01 13:47:14 +01:00
isb ( ) ;
}
2016-08-19 17:13:09 +01:00
static inline void gic_write_bpr1 ( u32 val )
{
2017-01-19 17:57:43 +00:00
write_sysreg_s ( val , SYS_ICC_BPR1_EL1 ) ;
2016-08-19 17:13:09 +01:00
}
2015-10-01 13:47:16 +01:00
# define gic_read_typer(c) readq_relaxed(c)
# define gic_write_irouter(v, c) writeq_relaxed(v, c)
2016-11-02 11:54:05 +00:00
# define gic_flush_dcache_to_poc(a,l) __flush_dcache_area((a), (l))
2016-11-02 11:54:06 +00:00
# define gits_read_baser(c) readq_relaxed(c)
# define gits_write_baser(v, c) writeq_relaxed(v, c)
# define gits_read_cbaser(c) readq_relaxed(c)
# define gits_write_cbaser(v, c) writeq_relaxed(v, c)
# define gits_write_cwriter(v, c) writeq_relaxed(v, c)
# define gicr_read_propbaser(c) readq_relaxed(c)
# define gicr_write_propbaser(v, c) writeq_relaxed(v, c)
# define gicr_write_pendbaser(v, c) writeq_relaxed(v, c)
# define gicr_read_pendbaser(c) readq_relaxed(c)
2015-10-01 13:47:14 +01:00
# endif /* __ASSEMBLY__ */
# endif /* __ASM_ARCH_GICV3_H */