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-cm.h
9#endif
10
11#ifndef __MIPS_ASM_MIPS_CM_H__
12#define __MIPS_ASM_MIPS_CM_H__
13
14#include <linux/bitfield.h>
15#include <linux/bitops.h>
16#include <linux/errno.h>
17
18
19extern void __iomem *mips_gcr_base;
20
21
22extern void __iomem *mips_cm_l2sync_base;
23
24
25
26
27
28
29
30
31
32
33
34extern phys_addr_t __mips_cm_phys_base(void);
35
36
37
38
39
40
41
42
43
44
45
46
47
48extern int mips_cm_is64;
49
50
51
52
53#ifdef CONFIG_MIPS_CM
54extern void mips_cm_error_report(void);
55#else
56static inline void mips_cm_error_report(void) {}
57#endif
58
59
60
61
62
63
64
65#ifdef CONFIG_MIPS_CM
66extern int mips_cm_probe(void);
67#else
68static inline int mips_cm_probe(void)
69{
70 return -ENODEV;
71}
72#endif
73
74
75
76
77
78
79static inline bool mips_cm_present(void)
80{
81#ifdef CONFIG_MIPS_CM
82 return mips_gcr_base != NULL;
83#else
84 return false;
85#endif
86}
87
88
89
90
91
92
93static inline bool mips_cm_has_l2sync(void)
94{
95#ifdef CONFIG_MIPS_CM
96 return mips_cm_l2sync_base != NULL;
97#else
98 return false;
99#endif
100}
101
102
103#define MIPS_CM_GCB_OFS 0x0000
104#define MIPS_CM_CLCB_OFS 0x2000
105#define MIPS_CM_COCB_OFS 0x4000
106#define MIPS_CM_GDB_OFS 0x6000
107
108
109#define MIPS_CM_GCR_SIZE 0x8000
110
111
112#define MIPS_CM_L2SYNC_SIZE 0x1000
113
114#define GCR_ACCESSOR_RO(sz, off, name) \
115 CPS_ACCESSOR_RO(gcr, sz, MIPS_CM_GCB_OFS + off, name) \
116 CPS_ACCESSOR_RO(gcr, sz, MIPS_CM_COCB_OFS + off, redir_##name)
117
118#define GCR_ACCESSOR_RW(sz, off, name) \
119 CPS_ACCESSOR_RW(gcr, sz, MIPS_CM_GCB_OFS + off, name) \
120 CPS_ACCESSOR_RW(gcr, sz, MIPS_CM_COCB_OFS + off, redir_##name)
121
122#define GCR_CX_ACCESSOR_RO(sz, off, name) \
123 CPS_ACCESSOR_RO(gcr, sz, MIPS_CM_CLCB_OFS + off, cl_##name) \
124 CPS_ACCESSOR_RO(gcr, sz, MIPS_CM_COCB_OFS + off, co_##name)
125
126#define GCR_CX_ACCESSOR_RW(sz, off, name) \
127 CPS_ACCESSOR_RW(gcr, sz, MIPS_CM_CLCB_OFS + off, cl_##name) \
128 CPS_ACCESSOR_RW(gcr, sz, MIPS_CM_COCB_OFS + off, co_##name)
129
130
131GCR_ACCESSOR_RO(64, 0x000, config)
132#define CM_GCR_CONFIG_CLUSTER_COH_CAPABLE BIT_ULL(43)
133#define CM_GCR_CONFIG_CLUSTER_ID GENMASK_ULL(39, 32)
134#define CM_GCR_CONFIG_NUM_CLUSTERS GENMASK(29, 23)
135#define CM_GCR_CONFIG_NUMIOCU GENMASK(15, 8)
136#define CM_GCR_CONFIG_PCORES GENMASK(7, 0)
137
138
139GCR_ACCESSOR_RW(64, 0x008, base)
140#define CM_GCR_BASE_GCRBASE GENMASK_ULL(47, 15)
141#define CM_GCR_BASE_CMDEFTGT GENMASK(1, 0)
142#define CM_GCR_BASE_CMDEFTGT_MEM 0
143#define CM_GCR_BASE_CMDEFTGT_RESERVED 1
144#define CM_GCR_BASE_CMDEFTGT_IOCU0 2
145#define CM_GCR_BASE_CMDEFTGT_IOCU1 3
146
147
148GCR_ACCESSOR_RW(32, 0x020, access)
149#define CM_GCR_ACCESS_ACCESSEN GENMASK(7, 0)
150
151
152GCR_ACCESSOR_RO(32, 0x030, rev)
153#define CM_GCR_REV_MAJOR GENMASK(15, 8)
154#define CM_GCR_REV_MINOR GENMASK(7, 0)
155
156#define CM_ENCODE_REV(major, minor) \
157 (FIELD_PREP(CM_GCR_REV_MAJOR, major) | \
158 FIELD_PREP(CM_GCR_REV_MINOR, minor))
159
160#define CM_REV_CM2 CM_ENCODE_REV(6, 0)
161#define CM_REV_CM2_5 CM_ENCODE_REV(7, 0)
162#define CM_REV_CM3 CM_ENCODE_REV(8, 0)
163#define CM_REV_CM3_5 CM_ENCODE_REV(9, 0)
164
165
166GCR_ACCESSOR_RW(32, 0x038, err_control)
167#define CM_GCR_ERR_CONTROL_L2_ECC_EN BIT(1)
168#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT BIT(0)
169
170
171GCR_ACCESSOR_RW(64, 0x040, error_mask)
172
173
174GCR_ACCESSOR_RW(64, 0x048, error_cause)
175#define CM_GCR_ERROR_CAUSE_ERRTYPE GENMASK(31, 27)
176#define CM3_GCR_ERROR_CAUSE_ERRTYPE GENMASK_ULL(63, 58)
177#define CM_GCR_ERROR_CAUSE_ERRINFO GENMASK(26, 0)
178
179
180GCR_ACCESSOR_RW(64, 0x050, error_addr)
181
182
183GCR_ACCESSOR_RW(64, 0x058, error_mult)
184#define CM_GCR_ERROR_MULT_ERR2ND GENMASK(4, 0)
185
186
187GCR_ACCESSOR_RW(64, 0x070, l2_only_sync_base)
188#define CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE GENMASK(31, 12)
189#define CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN BIT(0)
190
191
192GCR_ACCESSOR_RW(64, 0x080, gic_base)
193#define CM_GCR_GIC_BASE_GICBASE GENMASK(31, 17)
194#define CM_GCR_GIC_BASE_GICEN BIT(0)
195
196
197GCR_ACCESSOR_RW(64, 0x088, cpc_base)
198#define CM_GCR_CPC_BASE_CPCBASE GENMASK(31, 15)
199#define CM_GCR_CPC_BASE_CPCEN BIT(0)
200
201
202GCR_ACCESSOR_RW(64, 0x090, reg0_base)
203GCR_ACCESSOR_RW(64, 0x0a0, reg1_base)
204GCR_ACCESSOR_RW(64, 0x0b0, reg2_base)
205GCR_ACCESSOR_RW(64, 0x0c0, reg3_base)
206#define CM_GCR_REGn_BASE_BASEADDR GENMASK(31, 16)
207
208
209GCR_ACCESSOR_RW(64, 0x098, reg0_mask)
210GCR_ACCESSOR_RW(64, 0x0a8, reg1_mask)
211GCR_ACCESSOR_RW(64, 0x0b8, reg2_mask)
212GCR_ACCESSOR_RW(64, 0x0c8, reg3_mask)
213#define CM_GCR_REGn_MASK_ADDRMASK GENMASK(31, 16)
214#define CM_GCR_REGn_MASK_CCAOVR GENMASK(7, 5)
215#define CM_GCR_REGn_MASK_CCAOVREN BIT(4)
216#define CM_GCR_REGn_MASK_DROPL2 BIT(2)
217#define CM_GCR_REGn_MASK_CMTGT GENMASK(1, 0)
218#define CM_GCR_REGn_MASK_CMTGT_DISABLED 0x0
219#define CM_GCR_REGn_MASK_CMTGT_MEM 0x1
220#define CM_GCR_REGn_MASK_CMTGT_IOCU0 0x2
221#define CM_GCR_REGn_MASK_CMTGT_IOCU1 0x3
222
223
224GCR_ACCESSOR_RO(32, 0x0d0, gic_status)
225#define CM_GCR_GIC_STATUS_EX BIT(0)
226
227
228GCR_ACCESSOR_RO(32, 0x0f0, cpc_status)
229#define CM_GCR_CPC_STATUS_EX BIT(0)
230
231
232GCR_ACCESSOR_RW(32, 0x130, l2_config)
233#define CM_GCR_L2_CONFIG_BYPASS BIT(20)
234#define CM_GCR_L2_CONFIG_SET_SIZE GENMASK(15, 12)
235#define CM_GCR_L2_CONFIG_LINE_SIZE GENMASK(11, 8)
236#define CM_GCR_L2_CONFIG_ASSOC GENMASK(7, 0)
237
238
239GCR_ACCESSOR_RO(32, 0x150, sys_config2)
240#define CM_GCR_SYS_CONFIG2_MAXVPW GENMASK(3, 0)
241
242
243GCR_ACCESSOR_RW(32, 0x300, l2_pft_control)
244#define CM_GCR_L2_PFT_CONTROL_PAGEMASK GENMASK(31, 12)
245#define CM_GCR_L2_PFT_CONTROL_PFTEN BIT(8)
246#define CM_GCR_L2_PFT_CONTROL_NPFT GENMASK(7, 0)
247
248
249GCR_ACCESSOR_RW(32, 0x308, l2_pft_control_b)
250#define CM_GCR_L2_PFT_CONTROL_B_CEN BIT(8)
251#define CM_GCR_L2_PFT_CONTROL_B_PORTID GENMASK(7, 0)
252
253
254GCR_ACCESSOR_RW(32, 0x620, l2sm_cop)
255#define CM_GCR_L2SM_COP_PRESENT BIT(31)
256#define CM_GCR_L2SM_COP_RESULT GENMASK(8, 6)
257#define CM_GCR_L2SM_COP_RESULT_DONTCARE 0
258#define CM_GCR_L2SM_COP_RESULT_DONE_OK 1
259#define CM_GCR_L2SM_COP_RESULT_DONE_ERROR 2
260#define CM_GCR_L2SM_COP_RESULT_ABORT_OK 3
261#define CM_GCR_L2SM_COP_RESULT_ABORT_ERROR 4
262#define CM_GCR_L2SM_COP_RUNNING BIT(5)
263#define CM_GCR_L2SM_COP_TYPE GENMASK(4, 2)
264#define CM_GCR_L2SM_COP_TYPE_IDX_WBINV 0
265#define CM_GCR_L2SM_COP_TYPE_IDX_STORETAG 1
266#define CM_GCR_L2SM_COP_TYPE_IDX_STORETAGDATA 2
267#define CM_GCR_L2SM_COP_TYPE_HIT_INV 4
268#define CM_GCR_L2SM_COP_TYPE_HIT_WBINV 5
269#define CM_GCR_L2SM_COP_TYPE_HIT_WB 6
270#define CM_GCR_L2SM_COP_TYPE_FETCHLOCK 7
271#define CM_GCR_L2SM_COP_CMD GENMASK(1, 0)
272#define CM_GCR_L2SM_COP_CMD_START 1
273#define CM_GCR_L2SM_COP_CMD_ABORT 3
274
275
276GCR_ACCESSOR_RW(64, 0x628, l2sm_tag_addr_cop)
277#define CM_GCR_L2SM_TAG_ADDR_COP_NUM_LINES GENMASK_ULL(63, 48)
278#define CM_GCR_L2SM_TAG_ADDR_COP_START_TAG GENMASK_ULL(47, 6)
279
280
281GCR_ACCESSOR_RW(64, 0x680, bev_base)
282
283
284GCR_CX_ACCESSOR_RW(32, 0x000, reset_release)
285
286
287GCR_CX_ACCESSOR_RW(32, 0x008, coherence)
288#define CM_GCR_Cx_COHERENCE_COHDOMAINEN GENMASK(7, 0)
289#define CM3_GCR_Cx_COHERENCE_COHEN BIT(0)
290
291
292GCR_CX_ACCESSOR_RO(32, 0x010, config)
293#define CM_GCR_Cx_CONFIG_IOCUTYPE GENMASK(11, 10)
294#define CM_GCR_Cx_CONFIG_PVPE GENMASK(9, 0)
295
296
297GCR_CX_ACCESSOR_RW(32, 0x018, other)
298#define CM_GCR_Cx_OTHER_CORENUM GENMASK(31, 16)
299#define CM_GCR_Cx_OTHER_CLUSTER_EN BIT(31)
300#define CM_GCR_Cx_OTHER_GIC_EN BIT(30)
301#define CM_GCR_Cx_OTHER_BLOCK GENMASK(25, 24)
302#define CM_GCR_Cx_OTHER_BLOCK_LOCAL 0
303#define CM_GCR_Cx_OTHER_BLOCK_GLOBAL 1
304#define CM_GCR_Cx_OTHER_BLOCK_USER 2
305#define CM_GCR_Cx_OTHER_BLOCK_GLOBAL_HIGH 3
306#define CM_GCR_Cx_OTHER_CLUSTER GENMASK(21, 16)
307#define CM3_GCR_Cx_OTHER_CORE GENMASK(13, 8)
308#define CM_GCR_Cx_OTHER_CORE_CM 32
309#define CM3_GCR_Cx_OTHER_VP GENMASK(2, 0)
310
311
312GCR_CX_ACCESSOR_RW(32, 0x020, reset_base)
313#define CM_GCR_Cx_RESET_BASE_BEVEXCBASE GENMASK(31, 12)
314
315
316GCR_CX_ACCESSOR_RO(32, 0x028, id)
317#define CM_GCR_Cx_ID_CLUSTER GENMASK(15, 8)
318#define CM_GCR_Cx_ID_CORE GENMASK(7, 0)
319
320
321GCR_CX_ACCESSOR_RW(32, 0x030, reset_ext_base)
322#define CM_GCR_Cx_RESET_EXT_BASE_EVARESET BIT(31)
323#define CM_GCR_Cx_RESET_EXT_BASE_UEB BIT(30)
324#define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCMASK GENMASK(27, 20)
325#define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCPA GENMASK(7, 1)
326#define CM_GCR_Cx_RESET_EXT_BASE_PRESENT BIT(0)
327
328
329
330
331
332
333
334static inline int mips_cm_l2sync(void)
335{
336 if (!mips_cm_has_l2sync())
337 return -ENODEV;
338
339 writel(0, mips_cm_l2sync_base);
340 return 0;
341}
342
343
344
345
346
347
348
349static inline int mips_cm_revision(void)
350{
351 if (!mips_cm_present())
352 return 0;
353
354 return read_gcr_rev();
355}
356
357
358
359
360
361
362
363static inline unsigned int mips_cm_max_vp_width(void)
364{
365 extern int smp_num_siblings;
366
367 if (mips_cm_revision() >= CM_REV_CM3)
368 return FIELD_GET(CM_GCR_SYS_CONFIG2_MAXVPW,
369 read_gcr_sys_config2());
370
371 if (mips_cm_present()) {
372
373
374
375
376
377 return FIELD_GET(CM_GCR_Cx_CONFIG_PVPE, read_gcr_cl_config()) + 1;
378 }
379
380 if (IS_ENABLED(CONFIG_SMP))
381 return smp_num_siblings;
382
383 return 1;
384}
385
386
387
388
389
390
391
392
393
394
395
396static inline unsigned int mips_cm_vp_id(unsigned int cpu)
397{
398 unsigned int core = cpu_core(&cpu_data[cpu]);
399 unsigned int vp = cpu_vpe_id(&cpu_data[cpu]);
400
401 return (core * mips_cm_max_vp_width()) + vp;
402}
403
404#ifdef CONFIG_MIPS_CM
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424extern void mips_cm_lock_other(unsigned int cluster, unsigned int core,
425 unsigned int vp, unsigned int block);
426
427
428
429
430
431
432
433extern void mips_cm_unlock_other(void);
434
435#else
436
437static inline void mips_cm_lock_other(unsigned int cluster, unsigned int core,
438 unsigned int vp, unsigned int block) { }
439static inline void mips_cm_unlock_other(void) { }
440
441#endif
442
443
444
445
446
447
448
449
450
451
452static inline void mips_cm_lock_other_cpu(unsigned int cpu, unsigned int block)
453{
454 struct cpuinfo_mips *d = &cpu_data[cpu];
455
456 mips_cm_lock_other(cpu_cluster(d), cpu_core(d), cpu_vpe_id(d), block);
457}
458
459#endif
460