]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - arch/arm64/include/asm/arch_gicv3.h
irqchip/gic-v3-its: Narrow down Entry Size when used as a divider
[mirror_ubuntu-zesty-kernel.git] / arch / arm64 / include / asm / arch_gicv3.h
CommitLineData
7936e914
JPB
1/*
2 * arch/arm64/include/asm/arch_gicv3.h
3 *
4 * Copyright (C) 2015 ARM Ltd.
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18#ifndef __ASM_ARCH_GICV3_H
19#define __ASM_ARCH_GICV3_H
20
21#include <asm/sysreg.h>
22
23#define ICC_EOIR1_EL1 sys_reg(3, 0, 12, 12, 1)
24#define ICC_DIR_EL1 sys_reg(3, 0, 12, 11, 1)
25#define ICC_IAR1_EL1 sys_reg(3, 0, 12, 12, 0)
26#define ICC_SGI1R_EL1 sys_reg(3, 0, 12, 11, 5)
27#define ICC_PMR_EL1 sys_reg(3, 0, 4, 6, 0)
28#define ICC_CTLR_EL1 sys_reg(3, 0, 12, 12, 4)
29#define ICC_SRE_EL1 sys_reg(3, 0, 12, 12, 5)
30#define ICC_GRPEN1_EL1 sys_reg(3, 0, 12, 12, 7)
91ef8442 31#define ICC_BPR1_EL1 sys_reg(3, 0, 12, 12, 3)
7936e914
JPB
32
33#define ICC_SRE_EL2 sys_reg(3, 4, 12, 9, 5)
34
35/*
36 * System register definitions
37 */
38#define ICH_VSEIR_EL2 sys_reg(3, 4, 12, 9, 4)
39#define ICH_HCR_EL2 sys_reg(3, 4, 12, 11, 0)
40#define ICH_VTR_EL2 sys_reg(3, 4, 12, 11, 1)
41#define ICH_MISR_EL2 sys_reg(3, 4, 12, 11, 2)
42#define ICH_EISR_EL2 sys_reg(3, 4, 12, 11, 3)
43#define ICH_ELSR_EL2 sys_reg(3, 4, 12, 11, 5)
44#define ICH_VMCR_EL2 sys_reg(3, 4, 12, 11, 7)
45
46#define __LR0_EL2(x) sys_reg(3, 4, 12, 12, x)
47#define __LR8_EL2(x) sys_reg(3, 4, 12, 13, x)
48
49#define ICH_LR0_EL2 __LR0_EL2(0)
50#define ICH_LR1_EL2 __LR0_EL2(1)
51#define ICH_LR2_EL2 __LR0_EL2(2)
52#define ICH_LR3_EL2 __LR0_EL2(3)
53#define ICH_LR4_EL2 __LR0_EL2(4)
54#define ICH_LR5_EL2 __LR0_EL2(5)
55#define ICH_LR6_EL2 __LR0_EL2(6)
56#define ICH_LR7_EL2 __LR0_EL2(7)
57#define ICH_LR8_EL2 __LR8_EL2(0)
58#define ICH_LR9_EL2 __LR8_EL2(1)
59#define ICH_LR10_EL2 __LR8_EL2(2)
60#define ICH_LR11_EL2 __LR8_EL2(3)
61#define ICH_LR12_EL2 __LR8_EL2(4)
62#define ICH_LR13_EL2 __LR8_EL2(5)
63#define ICH_LR14_EL2 __LR8_EL2(6)
64#define ICH_LR15_EL2 __LR8_EL2(7)
65
66#define __AP0Rx_EL2(x) sys_reg(3, 4, 12, 8, x)
67#define ICH_AP0R0_EL2 __AP0Rx_EL2(0)
68#define ICH_AP0R1_EL2 __AP0Rx_EL2(1)
69#define ICH_AP0R2_EL2 __AP0Rx_EL2(2)
70#define ICH_AP0R3_EL2 __AP0Rx_EL2(3)
71
72#define __AP1Rx_EL2(x) sys_reg(3, 4, 12, 9, x)
73#define ICH_AP1R0_EL2 __AP1Rx_EL2(0)
74#define ICH_AP1R1_EL2 __AP1Rx_EL2(1)
75#define ICH_AP1R2_EL2 __AP1Rx_EL2(2)
76#define ICH_AP1R3_EL2 __AP1Rx_EL2(3)
77
78#ifndef __ASSEMBLY__
79
80#include <linux/stringify.h>
8e31ed9c 81#include <asm/barrier.h>
7936e914 82
d44ffa5a
WD
83#define read_gicreg read_sysreg_s
84#define write_gicreg write_sysreg_s
b5525ce8 85
f6c86a41
JPB
86/*
87 * Low-level accessors
88 *
89 * These system registers are 32 bits, but we make sure that the compiler
90 * sets the GP register's most significant bits to 0 with an explicit cast.
91 */
7936e914 92
f6c86a41 93static inline void gic_write_eoir(u32 irq)
7936e914 94{
d44ffa5a 95 write_sysreg_s(irq, ICC_EOIR1_EL1);
7936e914
JPB
96 isb();
97}
98
f6c86a41 99static inline void gic_write_dir(u32 irq)
7936e914 100{
d44ffa5a 101 write_sysreg_s(irq, ICC_DIR_EL1);
7936e914
JPB
102 isb();
103}
104
105static inline u64 gic_read_iar_common(void)
106{
107 u64 irqstat;
108
d44ffa5a 109 irqstat = read_sysreg_s(ICC_IAR1_EL1);
1a1ebd5f 110 dsb(sy);
7936e914
JPB
111 return irqstat;
112}
113
114/*
115 * Cavium ThunderX erratum 23154
116 *
117 * The gicv3 of ThunderX requires a modified version for reading the
118 * IAR status to ensure data synchronization (access to icc_iar1_el1
119 * is not sync'ed before and after).
120 */
121static inline u64 gic_read_iar_cavium_thunderx(void)
122{
123 u64 irqstat;
124
016f98af 125 nops(8);
d44ffa5a 126 irqstat = read_sysreg_s(ICC_IAR1_EL1);
016f98af 127 nops(4);
7936e914
JPB
128 mb();
129
130 return irqstat;
131}
132
f6c86a41 133static inline void gic_write_pmr(u32 val)
7936e914 134{
d44ffa5a 135 write_sysreg_s(val, ICC_PMR_EL1);
7936e914
JPB
136}
137
f6c86a41 138static inline void gic_write_ctlr(u32 val)
7936e914 139{
d44ffa5a 140 write_sysreg_s(val, ICC_CTLR_EL1);
7936e914
JPB
141 isb();
142}
143
f6c86a41 144static inline void gic_write_grpen1(u32 val)
7936e914 145{
d44ffa5a 146 write_sysreg_s(val, ICC_GRPEN1_EL1);
7936e914
JPB
147 isb();
148}
149
150static inline void gic_write_sgi1r(u64 val)
151{
d44ffa5a 152 write_sysreg_s(val, ICC_SGI1R_EL1);
7936e914
JPB
153}
154
f6c86a41 155static inline u32 gic_read_sre(void)
7936e914 156{
d44ffa5a 157 return read_sysreg_s(ICC_SRE_EL1);
7936e914
JPB
158}
159
f6c86a41 160static inline void gic_write_sre(u32 val)
7936e914 161{
d44ffa5a 162 write_sysreg_s(val, ICC_SRE_EL1);
7936e914
JPB
163 isb();
164}
165
91ef8442
DT
166static inline void gic_write_bpr1(u32 val)
167{
168 asm volatile("msr_s " __stringify(ICC_BPR1_EL1) ", %0" : : "r" (val));
169}
170
72c97126
JPB
171#define gic_read_typer(c) readq_relaxed(c)
172#define gic_write_irouter(v, c) writeq_relaxed(v, c)
173
7936e914
JPB
174#endif /* __ASSEMBLY__ */
175#endif /* __ASM_ARCH_GICV3_H */