]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - arch/arm64/include/asm/arch_gicv3.h
KVM: arm64: vgic-v3: Add ICV_EOIR1_EL1 handler
[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>
328191c0 82#include <asm/cacheflush.h>
7936e914 83
d44ffa5a
WD
84#define read_gicreg read_sysreg_s
85#define write_gicreg write_sysreg_s
b5525ce8 86
f6c86a41
JPB
87/*
88 * Low-level accessors
89 *
90 * These system registers are 32 bits, but we make sure that the compiler
91 * sets the GP register's most significant bits to 0 with an explicit cast.
92 */
7936e914 93
f6c86a41 94static inline void gic_write_eoir(u32 irq)
7936e914 95{
d44ffa5a 96 write_sysreg_s(irq, ICC_EOIR1_EL1);
7936e914
JPB
97 isb();
98}
99
f6c86a41 100static inline void gic_write_dir(u32 irq)
7936e914 101{
d44ffa5a 102 write_sysreg_s(irq, ICC_DIR_EL1);
7936e914
JPB
103 isb();
104}
105
106static inline u64 gic_read_iar_common(void)
107{
108 u64 irqstat;
109
d44ffa5a 110 irqstat = read_sysreg_s(ICC_IAR1_EL1);
1a1ebd5f 111 dsb(sy);
7936e914
JPB
112 return irqstat;
113}
114
115/*
116 * Cavium ThunderX erratum 23154
117 *
118 * The gicv3 of ThunderX requires a modified version for reading the
119 * IAR status to ensure data synchronization (access to icc_iar1_el1
120 * is not sync'ed before and after).
121 */
122static inline u64 gic_read_iar_cavium_thunderx(void)
123{
124 u64 irqstat;
125
016f98af 126 nops(8);
d44ffa5a 127 irqstat = read_sysreg_s(ICC_IAR1_EL1);
016f98af 128 nops(4);
7936e914
JPB
129 mb();
130
131 return irqstat;
132}
133
f6c86a41 134static inline void gic_write_pmr(u32 val)
7936e914 135{
d44ffa5a 136 write_sysreg_s(val, ICC_PMR_EL1);
7936e914
JPB
137}
138
f6c86a41 139static inline void gic_write_ctlr(u32 val)
7936e914 140{
d44ffa5a 141 write_sysreg_s(val, ICC_CTLR_EL1);
7936e914
JPB
142 isb();
143}
144
f6c86a41 145static inline void gic_write_grpen1(u32 val)
7936e914 146{
d44ffa5a 147 write_sysreg_s(val, ICC_GRPEN1_EL1);
7936e914
JPB
148 isb();
149}
150
151static inline void gic_write_sgi1r(u64 val)
152{
d44ffa5a 153 write_sysreg_s(val, ICC_SGI1R_EL1);
7936e914
JPB
154}
155
f6c86a41 156static inline u32 gic_read_sre(void)
7936e914 157{
d44ffa5a 158 return read_sysreg_s(ICC_SRE_EL1);
7936e914
JPB
159}
160
f6c86a41 161static inline void gic_write_sre(u32 val)
7936e914 162{
d44ffa5a 163 write_sysreg_s(val, ICC_SRE_EL1);
7936e914
JPB
164 isb();
165}
166
91ef8442
DT
167static inline void gic_write_bpr1(u32 val)
168{
169 asm volatile("msr_s " __stringify(ICC_BPR1_EL1) ", %0" : : "r" (val));
170}
171
72c97126
JPB
172#define gic_read_typer(c) readq_relaxed(c)
173#define gic_write_irouter(v, c) writeq_relaxed(v, c)
174
328191c0
VM
175#define gic_flush_dcache_to_poc(a,l) __flush_dcache_area((a), (l))
176
0968a619
VM
177#define gits_read_baser(c) readq_relaxed(c)
178#define gits_write_baser(v, c) writeq_relaxed(v, c)
179
180#define gits_read_cbaser(c) readq_relaxed(c)
181#define gits_write_cbaser(v, c) writeq_relaxed(v, c)
182
183#define gits_write_cwriter(v, c) writeq_relaxed(v, c)
184
185#define gicr_read_propbaser(c) readq_relaxed(c)
186#define gicr_write_propbaser(v, c) writeq_relaxed(v, c)
187
188#define gicr_write_pendbaser(v, c) writeq_relaxed(v, c)
189#define gicr_read_pendbaser(c) readq_relaxed(c)
190
7936e914
JPB
191#endif /* __ASSEMBLY__ */
192#endif /* __ASM_ARCH_GICV3_H */