This source file includes following definitions.
- GIC_VX_ACCESSOR_RW
- mips_gic_present
- mips_gic_vx_map_reg
1
2
3
4
5
6
7 #ifndef __MIPS_ASM_MIPS_CPS_H__
8 # error Please include asm/mips-cps.h rather than asm/mips-gic.h
9 #endif
10
11 #ifndef __MIPS_ASM_MIPS_GIC_H__
12 #define __MIPS_ASM_MIPS_GIC_H__
13
14 #include <linux/bitops.h>
15
16
17 extern void __iomem *mips_gic_base;
18
19
20 #define MIPS_GIC_SHARED_OFS 0x00000
21 #define MIPS_GIC_SHARED_SZ 0x08000
22 #define MIPS_GIC_LOCAL_OFS 0x08000
23 #define MIPS_GIC_LOCAL_SZ 0x04000
24 #define MIPS_GIC_REDIR_OFS 0x0c000
25 #define MIPS_GIC_REDIR_SZ 0x04000
26 #define MIPS_GIC_USER_OFS 0x10000
27 #define MIPS_GIC_USER_SZ 0x10000
28
29
30 #define GIC_ACCESSOR_RO(sz, off, name) \
31 CPS_ACCESSOR_RO(gic, sz, MIPS_GIC_SHARED_OFS + off, name)
32
33
34 #define GIC_ACCESSOR_RW(sz, off, name) \
35 CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_SHARED_OFS + off, name)
36
37
38 #define GIC_VX_ACCESSOR_RO(sz, off, name) \
39 CPS_ACCESSOR_RO(gic, sz, MIPS_GIC_LOCAL_OFS + off, vl_##name) \
40 CPS_ACCESSOR_RO(gic, sz, MIPS_GIC_REDIR_OFS + off, vo_##name)
41
42
43 #define GIC_VX_ACCESSOR_RW(sz, off, name) \
44 CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_LOCAL_OFS + off, vl_##name) \
45 CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_REDIR_OFS + off, vo_##name)
46
47
48 #define GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
49 static inline void __iomem *addr_gic_##name(unsigned int intr) \
50 { \
51 return mips_gic_base + (off) + (intr * (stride)); \
52 } \
53 \
54 static inline unsigned int read_gic_##name(unsigned int intr) \
55 { \
56 BUILD_BUG_ON(sz != 32); \
57 return __raw_readl(addr_gic_##name(intr)); \
58 }
59
60
61 #define GIC_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \
62 GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
63 \
64 static inline void write_gic_##name(unsigned int intr, \
65 unsigned int val) \
66 { \
67 BUILD_BUG_ON(sz != 32); \
68 __raw_writel(val, addr_gic_##name(intr)); \
69 }
70
71
72 #define GIC_VX_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
73 GIC_ACCESSOR_RO_INTR_REG(sz, MIPS_GIC_LOCAL_OFS + off, \
74 stride, vl_##name) \
75 GIC_ACCESSOR_RO_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, \
76 stride, vo_##name)
77
78
79 #define GIC_VX_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \
80 GIC_ACCESSOR_RW_INTR_REG(sz, MIPS_GIC_LOCAL_OFS + off, \
81 stride, vl_##name) \
82 GIC_ACCESSOR_RW_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, \
83 stride, vo_##name)
84
85
86 #define GIC_ACCESSOR_RO_INTR_BIT(off, name) \
87 static inline void __iomem *addr_gic_##name(void) \
88 { \
89 return mips_gic_base + (off); \
90 } \
91 \
92 static inline unsigned int read_gic_##name(unsigned int intr) \
93 { \
94 void __iomem *addr = addr_gic_##name(); \
95 unsigned int val; \
96 \
97 if (mips_cm_is64) { \
98 addr += (intr / 64) * sizeof(uint64_t); \
99 val = __raw_readq(addr) >> intr % 64; \
100 } else { \
101 addr += (intr / 32) * sizeof(uint32_t); \
102 val = __raw_readl(addr) >> intr % 32; \
103 } \
104 \
105 return val & 0x1; \
106 }
107
108
109 #define GIC_ACCESSOR_RW_INTR_BIT(off, name) \
110 GIC_ACCESSOR_RO_INTR_BIT(off, name) \
111 \
112 static inline void write_gic_##name(unsigned int intr) \
113 { \
114 void __iomem *addr = addr_gic_##name(); \
115 \
116 if (mips_cm_is64) { \
117 addr += (intr / 64) * sizeof(uint64_t); \
118 __raw_writeq(BIT(intr % 64), addr); \
119 } else { \
120 addr += (intr / 32) * sizeof(uint32_t); \
121 __raw_writel(BIT(intr % 32), addr); \
122 } \
123 } \
124 \
125 static inline void change_gic_##name(unsigned int intr, \
126 unsigned int val) \
127 { \
128 void __iomem *addr = addr_gic_##name(); \
129 \
130 if (mips_cm_is64) { \
131 uint64_t _val; \
132 \
133 addr += (intr / 64) * sizeof(uint64_t); \
134 _val = __raw_readq(addr); \
135 _val &= ~BIT_ULL(intr % 64); \
136 _val |= (uint64_t)val << (intr % 64); \
137 __raw_writeq(_val, addr); \
138 } else { \
139 uint32_t _val; \
140 \
141 addr += (intr / 32) * sizeof(uint32_t); \
142 _val = __raw_readl(addr); \
143 _val &= ~BIT(intr % 32); \
144 _val |= val << (intr % 32); \
145 __raw_writel(_val, addr); \
146 } \
147 }
148
149
150 #define GIC_VX_ACCESSOR_RO_INTR_BIT(sz, off, name) \
151 GIC_ACCESSOR_RO_INTR_BIT(sz, MIPS_GIC_LOCAL_OFS + off, \
152 vl_##name) \
153 GIC_ACCESSOR_RO_INTR_BIT(sz, MIPS_GIC_REDIR_OFS + off, \
154 vo_##name)
155
156
157 #define GIC_VX_ACCESSOR_RW_INTR_BIT(sz, off, name) \
158 GIC_ACCESSOR_RW_INTR_BIT(sz, MIPS_GIC_LOCAL_OFS + off, \
159 vl_##name) \
160 GIC_ACCESSOR_RW_INTR_BIT(sz, MIPS_GIC_REDIR_OFS + off, \
161 vo_##name)
162
163
164 GIC_ACCESSOR_RW(32, 0x000, config)
165 #define GIC_CONFIG_COUNTSTOP BIT(28)
166 #define GIC_CONFIG_COUNTBITS GENMASK(27, 24)
167 #define GIC_CONFIG_NUMINTERRUPTS GENMASK(23, 16)
168 #define GIC_CONFIG_PVPS GENMASK(6, 0)
169
170
171 GIC_ACCESSOR_RW(64, 0x010, counter)
172 GIC_ACCESSOR_RW(32, 0x010, counter_32l)
173 GIC_ACCESSOR_RW(32, 0x014, counter_32h)
174
175
176 GIC_ACCESSOR_RW_INTR_BIT(0x100, pol)
177 #define GIC_POL_ACTIVE_LOW 0
178 #define GIC_POL_ACTIVE_HIGH 1
179 #define GIC_POL_FALLING_EDGE 0
180 #define GIC_POL_RISING_EDGE 1
181
182
183 GIC_ACCESSOR_RW_INTR_BIT(0x180, trig)
184 #define GIC_TRIG_LEVEL 0
185 #define GIC_TRIG_EDGE 1
186
187
188 GIC_ACCESSOR_RW_INTR_BIT(0x200, dual)
189 #define GIC_DUAL_SINGLE 0
190 #define GIC_DUAL_DUAL 1
191
192
193 GIC_ACCESSOR_RW(32, 0x280, wedge)
194 #define GIC_WEDGE_RW BIT(31)
195 #define GIC_WEDGE_INTR GENMASK(7, 0)
196
197
198 GIC_ACCESSOR_RW_INTR_BIT(0x300, rmask)
199
200
201 GIC_ACCESSOR_RW_INTR_BIT(0x380, smask)
202
203
204 GIC_ACCESSOR_RO_INTR_BIT(0x400, mask)
205
206
207 GIC_ACCESSOR_RO_INTR_BIT(0x480, pend)
208
209
210 GIC_ACCESSOR_RW_INTR_REG(32, 0x500, 0x4, map_pin)
211 #define GIC_MAP_PIN_MAP_TO_PIN BIT(31)
212 #define GIC_MAP_PIN_MAP_TO_NMI BIT(30)
213 #define GIC_MAP_PIN_MAP GENMASK(5, 0)
214
215
216 GIC_ACCESSOR_RW_INTR_REG(32, 0x2000, 0x20, map_vp)
217
218
219 GIC_VX_ACCESSOR_RW(32, 0x000, ctl)
220 #define GIC_VX_CTL_FDC_ROUTABLE BIT(4)
221 #define GIC_VX_CTL_SWINT_ROUTABLE BIT(3)
222 #define GIC_VX_CTL_PERFCNT_ROUTABLE BIT(2)
223 #define GIC_VX_CTL_TIMER_ROUTABLE BIT(1)
224 #define GIC_VX_CTL_EIC BIT(0)
225
226
227 GIC_VX_ACCESSOR_RO(32, 0x004, pend)
228
229
230 GIC_VX_ACCESSOR_RO(32, 0x008, mask)
231
232
233 GIC_VX_ACCESSOR_RW(32, 0x00c, rmask)
234
235
236 GIC_VX_ACCESSOR_RW(32, 0x010, smask)
237
238
239 GIC_VX_ACCESSOR_RW_INTR_REG(32, 0x040, 0x4, map)
240
241
242 GIC_VX_ACCESSOR_RW(32, 0x040, wd_map)
243
244
245 GIC_VX_ACCESSOR_RW(32, 0x044, compare_map)
246
247
248 GIC_VX_ACCESSOR_RW(32, 0x048, timer_map)
249
250
251 GIC_VX_ACCESSOR_RW(32, 0x04c, fdc_map)
252
253
254 GIC_VX_ACCESSOR_RW(32, 0x050, perfctr_map)
255
256
257 GIC_VX_ACCESSOR_RW(32, 0x054, swint0_map)
258
259
260 GIC_VX_ACCESSOR_RW(32, 0x058, swint1_map)
261
262
263 GIC_VX_ACCESSOR_RW(32, 0x080, other)
264 #define GIC_VX_OTHER_VPNUM GENMASK(5, 0)
265
266
267 GIC_VX_ACCESSOR_RO(32, 0x088, ident)
268 #define GIC_VX_IDENT_VPNUM GENMASK(5, 0)
269
270
271 GIC_VX_ACCESSOR_RW(64, 0x0a0, compare)
272
273
274 GIC_VX_ACCESSOR_RW_INTR_REG(32, 0x100, 0x4, eic_shadow_set)
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289 enum mips_gic_local_interrupt {
290 GIC_LOCAL_INT_WD,
291 GIC_LOCAL_INT_COMPARE,
292 GIC_LOCAL_INT_TIMER,
293 GIC_LOCAL_INT_PERFCTR,
294 GIC_LOCAL_INT_SWINT0,
295 GIC_LOCAL_INT_SWINT1,
296 GIC_LOCAL_INT_FDC,
297 GIC_NUM_LOCAL_INTRS
298 };
299
300
301
302
303
304
305
306
307
308 static inline bool mips_gic_present(void)
309 {
310 return IS_ENABLED(CONFIG_MIPS_GIC) && mips_gic_base;
311 }
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328 static inline unsigned int
329 mips_gic_vx_map_reg(enum mips_gic_local_interrupt intr)
330 {
331
332 if (intr <= GIC_LOCAL_INT_TIMER)
333 return intr;
334
335
336 if (intr == GIC_LOCAL_INT_FDC)
337 return GIC_LOCAL_INT_TIMER + 1;
338
339
340 return intr + 1;
341 }
342
343
344
345
346
347
348
349
350
351 extern int gic_get_c0_compare_int(void);
352
353
354
355
356
357
358
359
360
361 extern int gic_get_c0_perfcount_int(void);
362
363
364
365
366
367
368
369
370
371 extern int gic_get_c0_fdc_int(void);
372
373 #endif