]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - arch/arm64/include/asm/arch_gicv3.h
irqchip/gic-v3: Convert arm64 GIC accessors to {read,write}_sysreg_s
[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
125 asm volatile(
126 "nop;nop;nop;nop\n\t"
d44ffa5a
WD
127 "nop;nop;nop;nop");
128
129 irqstat = read_sysreg_s(ICC_IAR1_EL1);
130
131 asm volatile(
132 "nop;nop;nop;nop");
7936e914
JPB
133 mb();
134
135 return irqstat;
136}
137
f6c86a41 138static inline void gic_write_pmr(u32 val)
7936e914 139{
d44ffa5a 140 write_sysreg_s(val, ICC_PMR_EL1);
7936e914
JPB
141}
142
f6c86a41 143static inline void gic_write_ctlr(u32 val)
7936e914 144{
d44ffa5a 145 write_sysreg_s(val, ICC_CTLR_EL1);
7936e914
JPB
146 isb();
147}
148
f6c86a41 149static inline void gic_write_grpen1(u32 val)
7936e914 150{
d44ffa5a 151 write_sysreg_s(val, ICC_GRPEN1_EL1);
7936e914
JPB
152 isb();
153}
154
155static inline void gic_write_sgi1r(u64 val)
156{
d44ffa5a 157 write_sysreg_s(val, ICC_SGI1R_EL1);
7936e914
JPB
158}
159
f6c86a41 160static inline u32 gic_read_sre(void)
7936e914 161{
d44ffa5a 162 return read_sysreg_s(ICC_SRE_EL1);
7936e914
JPB
163}
164
f6c86a41 165static inline void gic_write_sre(u32 val)
7936e914 166{
d44ffa5a 167 write_sysreg_s(val, ICC_SRE_EL1);
7936e914
JPB
168 isb();
169}
170
91ef8442
DT
171static inline void gic_write_bpr1(u32 val)
172{
173 asm volatile("msr_s " __stringify(ICC_BPR1_EL1) ", %0" : : "r" (val));
174}
175
72c97126
JPB
176#define gic_read_typer(c) readq_relaxed(c)
177#define gic_write_irouter(v, c) writeq_relaxed(v, c)
178
7936e914
JPB
179#endif /* __ASSEMBLY__ */
180#endif /* __ASM_ARCH_GICV3_H */