Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/mips/cavium-octeon/octeon-irq.c
26424 views
1
/*
2
* This file is subject to the terms and conditions of the GNU General Public
3
* License. See the file "COPYING" in the main directory of this archive
4
* for more details.
5
*
6
* Copyright (C) 2004-2016 Cavium, Inc.
7
*/
8
9
#include <linux/of_address.h>
10
#include <linux/interrupt.h>
11
#include <linux/irqdomain.h>
12
#include <linux/bitops.h>
13
#include <linux/of_irq.h>
14
#include <linux/percpu.h>
15
#include <linux/slab.h>
16
#include <linux/irq.h>
17
#include <linux/smp.h>
18
#include <linux/of.h>
19
20
#include <asm/octeon/octeon.h>
21
#include <asm/octeon/cvmx-ciu2-defs.h>
22
#include <asm/octeon/cvmx-ciu3-defs.h>
23
24
static DEFINE_PER_CPU(unsigned long, octeon_irq_ciu0_en_mirror);
25
static DEFINE_PER_CPU(unsigned long, octeon_irq_ciu1_en_mirror);
26
static DEFINE_PER_CPU(raw_spinlock_t, octeon_irq_ciu_spinlock);
27
static DEFINE_PER_CPU(unsigned int, octeon_irq_ciu3_idt_ip2);
28
29
static DEFINE_PER_CPU(unsigned int, octeon_irq_ciu3_idt_ip3);
30
static DEFINE_PER_CPU(struct octeon_ciu3_info *, octeon_ciu3_info);
31
#define CIU3_MBOX_PER_CORE 10
32
33
/*
34
* The 8 most significant bits of the intsn identify the interrupt major block.
35
* Each major block might use its own interrupt domain. Thus 256 domains are
36
* needed.
37
*/
38
#define MAX_CIU3_DOMAINS 256
39
40
typedef irq_hw_number_t (*octeon_ciu3_intsn2hw_t)(struct irq_domain *, unsigned int);
41
42
/* Information for each ciu3 in the system */
43
struct octeon_ciu3_info {
44
u64 ciu3_addr;
45
int node;
46
struct irq_domain *domain[MAX_CIU3_DOMAINS];
47
octeon_ciu3_intsn2hw_t intsn2hw[MAX_CIU3_DOMAINS];
48
};
49
50
/* Each ciu3 in the system uses its own data (one ciu3 per node) */
51
static struct octeon_ciu3_info *octeon_ciu3_info_per_node[4];
52
53
struct octeon_irq_ciu_domain_data {
54
int num_sum; /* number of sum registers (2 or 3). */
55
};
56
57
/* Register offsets from ciu3_addr */
58
#define CIU3_CONST 0x220
59
#define CIU3_IDT_CTL(_idt) ((_idt) * 8 + 0x110000)
60
#define CIU3_IDT_PP(_idt, _idx) ((_idt) * 32 + (_idx) * 8 + 0x120000)
61
#define CIU3_IDT_IO(_idt) ((_idt) * 8 + 0x130000)
62
#define CIU3_DEST_PP_INT(_pp_ip) ((_pp_ip) * 8 + 0x200000)
63
#define CIU3_DEST_IO_INT(_io) ((_io) * 8 + 0x210000)
64
#define CIU3_ISC_CTL(_intsn) ((_intsn) * 8 + 0x80000000)
65
#define CIU3_ISC_W1C(_intsn) ((_intsn) * 8 + 0x90000000)
66
#define CIU3_ISC_W1S(_intsn) ((_intsn) * 8 + 0xa0000000)
67
68
static __read_mostly int octeon_irq_ciu_to_irq[8][64];
69
70
struct octeon_ciu_chip_data {
71
union {
72
struct { /* only used for ciu3 */
73
u64 ciu3_addr;
74
unsigned int intsn;
75
};
76
struct { /* only used for ciu/ciu2 */
77
u8 line;
78
u8 bit;
79
};
80
};
81
int gpio_line;
82
int current_cpu; /* Next CPU expected to take this irq */
83
int ciu_node; /* NUMA node number of the CIU */
84
};
85
86
struct octeon_core_chip_data {
87
struct mutex core_irq_mutex;
88
bool current_en;
89
bool desired_en;
90
u8 bit;
91
};
92
93
#define MIPS_CORE_IRQ_LINES 8
94
95
static struct octeon_core_chip_data octeon_irq_core_chip_data[MIPS_CORE_IRQ_LINES];
96
97
static int octeon_irq_set_ciu_mapping(int irq, int line, int bit, int gpio_line,
98
struct irq_chip *chip,
99
irq_flow_handler_t handler)
100
{
101
struct octeon_ciu_chip_data *cd;
102
103
cd = kzalloc(sizeof(*cd), GFP_KERNEL);
104
if (!cd)
105
return -ENOMEM;
106
107
irq_set_chip_and_handler(irq, chip, handler);
108
109
cd->line = line;
110
cd->bit = bit;
111
cd->gpio_line = gpio_line;
112
113
irq_set_chip_data(irq, cd);
114
octeon_irq_ciu_to_irq[line][bit] = irq;
115
return 0;
116
}
117
118
static void octeon_irq_free_cd(struct irq_domain *d, unsigned int irq)
119
{
120
struct irq_data *data = irq_get_irq_data(irq);
121
struct octeon_ciu_chip_data *cd = irq_data_get_irq_chip_data(data);
122
123
irq_set_chip_data(irq, NULL);
124
kfree(cd);
125
}
126
127
static int octeon_irq_force_ciu_mapping(struct irq_domain *domain,
128
int irq, int line, int bit)
129
{
130
struct device_node *of_node;
131
int ret;
132
133
of_node = irq_domain_get_of_node(domain);
134
if (!of_node)
135
return -EINVAL;
136
ret = irq_alloc_desc_at(irq, of_node_to_nid(of_node));
137
if (ret < 0)
138
return ret;
139
140
return irq_domain_associate(domain, irq, line << 6 | bit);
141
}
142
143
static int octeon_coreid_for_cpu(int cpu)
144
{
145
#ifdef CONFIG_SMP
146
return cpu_logical_map(cpu);
147
#else
148
return cvmx_get_core_num();
149
#endif
150
}
151
152
static int octeon_cpu_for_coreid(int coreid)
153
{
154
#ifdef CONFIG_SMP
155
return cpu_number_map(coreid);
156
#else
157
return smp_processor_id();
158
#endif
159
}
160
161
static void octeon_irq_core_ack(struct irq_data *data)
162
{
163
struct octeon_core_chip_data *cd = irq_data_get_irq_chip_data(data);
164
unsigned int bit = cd->bit;
165
166
/*
167
* We don't need to disable IRQs to make these atomic since
168
* they are already disabled earlier in the low level
169
* interrupt code.
170
*/
171
clear_c0_status(0x100 << bit);
172
/* The two user interrupts must be cleared manually. */
173
if (bit < 2)
174
clear_c0_cause(0x100 << bit);
175
}
176
177
static void octeon_irq_core_eoi(struct irq_data *data)
178
{
179
struct octeon_core_chip_data *cd = irq_data_get_irq_chip_data(data);
180
181
/*
182
* We don't need to disable IRQs to make these atomic since
183
* they are already disabled earlier in the low level
184
* interrupt code.
185
*/
186
set_c0_status(0x100 << cd->bit);
187
}
188
189
static void octeon_irq_core_set_enable_local(void *arg)
190
{
191
struct irq_data *data = arg;
192
struct octeon_core_chip_data *cd = irq_data_get_irq_chip_data(data);
193
unsigned int mask = 0x100 << cd->bit;
194
195
/*
196
* Interrupts are already disabled, so these are atomic.
197
*/
198
if (cd->desired_en)
199
set_c0_status(mask);
200
else
201
clear_c0_status(mask);
202
203
}
204
205
static void octeon_irq_core_disable(struct irq_data *data)
206
{
207
struct octeon_core_chip_data *cd = irq_data_get_irq_chip_data(data);
208
cd->desired_en = false;
209
}
210
211
static void octeon_irq_core_enable(struct irq_data *data)
212
{
213
struct octeon_core_chip_data *cd = irq_data_get_irq_chip_data(data);
214
cd->desired_en = true;
215
}
216
217
static void octeon_irq_core_bus_lock(struct irq_data *data)
218
{
219
struct octeon_core_chip_data *cd = irq_data_get_irq_chip_data(data);
220
221
mutex_lock(&cd->core_irq_mutex);
222
}
223
224
static void octeon_irq_core_bus_sync_unlock(struct irq_data *data)
225
{
226
struct octeon_core_chip_data *cd = irq_data_get_irq_chip_data(data);
227
228
if (cd->desired_en != cd->current_en) {
229
on_each_cpu(octeon_irq_core_set_enable_local, data, 1);
230
231
cd->current_en = cd->desired_en;
232
}
233
234
mutex_unlock(&cd->core_irq_mutex);
235
}
236
237
static struct irq_chip octeon_irq_chip_core = {
238
.name = "Core",
239
.irq_enable = octeon_irq_core_enable,
240
.irq_disable = octeon_irq_core_disable,
241
.irq_ack = octeon_irq_core_ack,
242
.irq_eoi = octeon_irq_core_eoi,
243
.irq_bus_lock = octeon_irq_core_bus_lock,
244
.irq_bus_sync_unlock = octeon_irq_core_bus_sync_unlock,
245
246
.irq_cpu_online = octeon_irq_core_eoi,
247
.irq_cpu_offline = octeon_irq_core_ack,
248
.flags = IRQCHIP_ONOFFLINE_ENABLED,
249
};
250
251
static void __init octeon_irq_init_core(void)
252
{
253
int i;
254
int irq;
255
struct octeon_core_chip_data *cd;
256
257
for (i = 0; i < MIPS_CORE_IRQ_LINES; i++) {
258
cd = &octeon_irq_core_chip_data[i];
259
cd->current_en = false;
260
cd->desired_en = false;
261
cd->bit = i;
262
mutex_init(&cd->core_irq_mutex);
263
264
irq = OCTEON_IRQ_SW0 + i;
265
irq_set_chip_data(irq, cd);
266
irq_set_chip_and_handler(irq, &octeon_irq_chip_core,
267
handle_percpu_irq);
268
}
269
}
270
271
static int next_cpu_for_irq(struct irq_data *data)
272
{
273
274
#ifdef CONFIG_SMP
275
int cpu;
276
const struct cpumask *mask = irq_data_get_affinity_mask(data);
277
int weight = cpumask_weight(mask);
278
struct octeon_ciu_chip_data *cd = irq_data_get_irq_chip_data(data);
279
280
if (weight > 1) {
281
cpu = cd->current_cpu;
282
for (;;) {
283
cpu = cpumask_next(cpu, mask);
284
if (cpu >= nr_cpu_ids) {
285
cpu = -1;
286
continue;
287
} else if (cpumask_test_cpu(cpu, cpu_online_mask)) {
288
break;
289
}
290
}
291
} else if (weight == 1) {
292
cpu = cpumask_first(mask);
293
} else {
294
cpu = smp_processor_id();
295
}
296
cd->current_cpu = cpu;
297
return cpu;
298
#else
299
return smp_processor_id();
300
#endif
301
}
302
303
static void octeon_irq_ciu_enable(struct irq_data *data)
304
{
305
int cpu = next_cpu_for_irq(data);
306
int coreid = octeon_coreid_for_cpu(cpu);
307
unsigned long *pen;
308
unsigned long flags;
309
struct octeon_ciu_chip_data *cd;
310
raw_spinlock_t *lock = &per_cpu(octeon_irq_ciu_spinlock, cpu);
311
312
cd = irq_data_get_irq_chip_data(data);
313
314
raw_spin_lock_irqsave(lock, flags);
315
if (cd->line == 0) {
316
pen = &per_cpu(octeon_irq_ciu0_en_mirror, cpu);
317
__set_bit(cd->bit, pen);
318
/*
319
* Must be visible to octeon_irq_ip{2,3}_ciu() before
320
* enabling the irq.
321
*/
322
wmb();
323
cvmx_write_csr(CVMX_CIU_INTX_EN0(coreid * 2), *pen);
324
} else {
325
pen = &per_cpu(octeon_irq_ciu1_en_mirror, cpu);
326
__set_bit(cd->bit, pen);
327
/*
328
* Must be visible to octeon_irq_ip{2,3}_ciu() before
329
* enabling the irq.
330
*/
331
wmb();
332
cvmx_write_csr(CVMX_CIU_INTX_EN1(coreid * 2 + 1), *pen);
333
}
334
raw_spin_unlock_irqrestore(lock, flags);
335
}
336
337
static void octeon_irq_ciu_enable_local(struct irq_data *data)
338
{
339
unsigned long *pen;
340
unsigned long flags;
341
struct octeon_ciu_chip_data *cd;
342
raw_spinlock_t *lock = this_cpu_ptr(&octeon_irq_ciu_spinlock);
343
344
cd = irq_data_get_irq_chip_data(data);
345
346
raw_spin_lock_irqsave(lock, flags);
347
if (cd->line == 0) {
348
pen = this_cpu_ptr(&octeon_irq_ciu0_en_mirror);
349
__set_bit(cd->bit, pen);
350
/*
351
* Must be visible to octeon_irq_ip{2,3}_ciu() before
352
* enabling the irq.
353
*/
354
wmb();
355
cvmx_write_csr(CVMX_CIU_INTX_EN0(cvmx_get_core_num() * 2), *pen);
356
} else {
357
pen = this_cpu_ptr(&octeon_irq_ciu1_en_mirror);
358
__set_bit(cd->bit, pen);
359
/*
360
* Must be visible to octeon_irq_ip{2,3}_ciu() before
361
* enabling the irq.
362
*/
363
wmb();
364
cvmx_write_csr(CVMX_CIU_INTX_EN1(cvmx_get_core_num() * 2 + 1), *pen);
365
}
366
raw_spin_unlock_irqrestore(lock, flags);
367
}
368
369
static void octeon_irq_ciu_disable_local(struct irq_data *data)
370
{
371
unsigned long *pen;
372
unsigned long flags;
373
struct octeon_ciu_chip_data *cd;
374
raw_spinlock_t *lock = this_cpu_ptr(&octeon_irq_ciu_spinlock);
375
376
cd = irq_data_get_irq_chip_data(data);
377
378
raw_spin_lock_irqsave(lock, flags);
379
if (cd->line == 0) {
380
pen = this_cpu_ptr(&octeon_irq_ciu0_en_mirror);
381
__clear_bit(cd->bit, pen);
382
/*
383
* Must be visible to octeon_irq_ip{2,3}_ciu() before
384
* enabling the irq.
385
*/
386
wmb();
387
cvmx_write_csr(CVMX_CIU_INTX_EN0(cvmx_get_core_num() * 2), *pen);
388
} else {
389
pen = this_cpu_ptr(&octeon_irq_ciu1_en_mirror);
390
__clear_bit(cd->bit, pen);
391
/*
392
* Must be visible to octeon_irq_ip{2,3}_ciu() before
393
* enabling the irq.
394
*/
395
wmb();
396
cvmx_write_csr(CVMX_CIU_INTX_EN1(cvmx_get_core_num() * 2 + 1), *pen);
397
}
398
raw_spin_unlock_irqrestore(lock, flags);
399
}
400
401
static void octeon_irq_ciu_disable_all(struct irq_data *data)
402
{
403
unsigned long flags;
404
unsigned long *pen;
405
int cpu;
406
struct octeon_ciu_chip_data *cd;
407
raw_spinlock_t *lock;
408
409
cd = irq_data_get_irq_chip_data(data);
410
411
for_each_online_cpu(cpu) {
412
int coreid = octeon_coreid_for_cpu(cpu);
413
lock = &per_cpu(octeon_irq_ciu_spinlock, cpu);
414
if (cd->line == 0)
415
pen = &per_cpu(octeon_irq_ciu0_en_mirror, cpu);
416
else
417
pen = &per_cpu(octeon_irq_ciu1_en_mirror, cpu);
418
419
raw_spin_lock_irqsave(lock, flags);
420
__clear_bit(cd->bit, pen);
421
/*
422
* Must be visible to octeon_irq_ip{2,3}_ciu() before
423
* enabling the irq.
424
*/
425
wmb();
426
if (cd->line == 0)
427
cvmx_write_csr(CVMX_CIU_INTX_EN0(coreid * 2), *pen);
428
else
429
cvmx_write_csr(CVMX_CIU_INTX_EN1(coreid * 2 + 1), *pen);
430
raw_spin_unlock_irqrestore(lock, flags);
431
}
432
}
433
434
static void octeon_irq_ciu_enable_all(struct irq_data *data)
435
{
436
unsigned long flags;
437
unsigned long *pen;
438
int cpu;
439
struct octeon_ciu_chip_data *cd;
440
raw_spinlock_t *lock;
441
442
cd = irq_data_get_irq_chip_data(data);
443
444
for_each_online_cpu(cpu) {
445
int coreid = octeon_coreid_for_cpu(cpu);
446
lock = &per_cpu(octeon_irq_ciu_spinlock, cpu);
447
if (cd->line == 0)
448
pen = &per_cpu(octeon_irq_ciu0_en_mirror, cpu);
449
else
450
pen = &per_cpu(octeon_irq_ciu1_en_mirror, cpu);
451
452
raw_spin_lock_irqsave(lock, flags);
453
__set_bit(cd->bit, pen);
454
/*
455
* Must be visible to octeon_irq_ip{2,3}_ciu() before
456
* enabling the irq.
457
*/
458
wmb();
459
if (cd->line == 0)
460
cvmx_write_csr(CVMX_CIU_INTX_EN0(coreid * 2), *pen);
461
else
462
cvmx_write_csr(CVMX_CIU_INTX_EN1(coreid * 2 + 1), *pen);
463
raw_spin_unlock_irqrestore(lock, flags);
464
}
465
}
466
467
/*
468
* Enable the irq on the next core in the affinity set for chips that
469
* have the EN*_W1{S,C} registers.
470
*/
471
static void octeon_irq_ciu_enable_v2(struct irq_data *data)
472
{
473
u64 mask;
474
int cpu = next_cpu_for_irq(data);
475
struct octeon_ciu_chip_data *cd;
476
477
cd = irq_data_get_irq_chip_data(data);
478
mask = 1ull << (cd->bit);
479
480
/*
481
* Called under the desc lock, so these should never get out
482
* of sync.
483
*/
484
if (cd->line == 0) {
485
int index = octeon_coreid_for_cpu(cpu) * 2;
486
set_bit(cd->bit, &per_cpu(octeon_irq_ciu0_en_mirror, cpu));
487
cvmx_write_csr(CVMX_CIU_INTX_EN0_W1S(index), mask);
488
} else {
489
int index = octeon_coreid_for_cpu(cpu) * 2 + 1;
490
set_bit(cd->bit, &per_cpu(octeon_irq_ciu1_en_mirror, cpu));
491
cvmx_write_csr(CVMX_CIU_INTX_EN1_W1S(index), mask);
492
}
493
}
494
495
/*
496
* Enable the irq in the sum2 registers.
497
*/
498
static void octeon_irq_ciu_enable_sum2(struct irq_data *data)
499
{
500
u64 mask;
501
int cpu = next_cpu_for_irq(data);
502
int index = octeon_coreid_for_cpu(cpu);
503
struct octeon_ciu_chip_data *cd;
504
505
cd = irq_data_get_irq_chip_data(data);
506
mask = 1ull << (cd->bit);
507
508
cvmx_write_csr(CVMX_CIU_EN2_PPX_IP4_W1S(index), mask);
509
}
510
511
/*
512
* Disable the irq in the sum2 registers.
513
*/
514
static void octeon_irq_ciu_disable_local_sum2(struct irq_data *data)
515
{
516
u64 mask;
517
int cpu = next_cpu_for_irq(data);
518
int index = octeon_coreid_for_cpu(cpu);
519
struct octeon_ciu_chip_data *cd;
520
521
cd = irq_data_get_irq_chip_data(data);
522
mask = 1ull << (cd->bit);
523
524
cvmx_write_csr(CVMX_CIU_EN2_PPX_IP4_W1C(index), mask);
525
}
526
527
static void octeon_irq_ciu_ack_sum2(struct irq_data *data)
528
{
529
u64 mask;
530
int cpu = next_cpu_for_irq(data);
531
int index = octeon_coreid_for_cpu(cpu);
532
struct octeon_ciu_chip_data *cd;
533
534
cd = irq_data_get_irq_chip_data(data);
535
mask = 1ull << (cd->bit);
536
537
cvmx_write_csr(CVMX_CIU_SUM2_PPX_IP4(index), mask);
538
}
539
540
static void octeon_irq_ciu_disable_all_sum2(struct irq_data *data)
541
{
542
int cpu;
543
struct octeon_ciu_chip_data *cd;
544
u64 mask;
545
546
cd = irq_data_get_irq_chip_data(data);
547
mask = 1ull << (cd->bit);
548
549
for_each_online_cpu(cpu) {
550
int coreid = octeon_coreid_for_cpu(cpu);
551
552
cvmx_write_csr(CVMX_CIU_EN2_PPX_IP4_W1C(coreid), mask);
553
}
554
}
555
556
/*
557
* Enable the irq on the current CPU for chips that
558
* have the EN*_W1{S,C} registers.
559
*/
560
static void octeon_irq_ciu_enable_local_v2(struct irq_data *data)
561
{
562
u64 mask;
563
struct octeon_ciu_chip_data *cd;
564
565
cd = irq_data_get_irq_chip_data(data);
566
mask = 1ull << (cd->bit);
567
568
if (cd->line == 0) {
569
int index = cvmx_get_core_num() * 2;
570
set_bit(cd->bit, this_cpu_ptr(&octeon_irq_ciu0_en_mirror));
571
cvmx_write_csr(CVMX_CIU_INTX_EN0_W1S(index), mask);
572
} else {
573
int index = cvmx_get_core_num() * 2 + 1;
574
set_bit(cd->bit, this_cpu_ptr(&octeon_irq_ciu1_en_mirror));
575
cvmx_write_csr(CVMX_CIU_INTX_EN1_W1S(index), mask);
576
}
577
}
578
579
static void octeon_irq_ciu_disable_local_v2(struct irq_data *data)
580
{
581
u64 mask;
582
struct octeon_ciu_chip_data *cd;
583
584
cd = irq_data_get_irq_chip_data(data);
585
mask = 1ull << (cd->bit);
586
587
if (cd->line == 0) {
588
int index = cvmx_get_core_num() * 2;
589
clear_bit(cd->bit, this_cpu_ptr(&octeon_irq_ciu0_en_mirror));
590
cvmx_write_csr(CVMX_CIU_INTX_EN0_W1C(index), mask);
591
} else {
592
int index = cvmx_get_core_num() * 2 + 1;
593
clear_bit(cd->bit, this_cpu_ptr(&octeon_irq_ciu1_en_mirror));
594
cvmx_write_csr(CVMX_CIU_INTX_EN1_W1C(index), mask);
595
}
596
}
597
598
/*
599
* Write to the W1C bit in CVMX_CIU_INTX_SUM0 to clear the irq.
600
*/
601
static void octeon_irq_ciu_ack(struct irq_data *data)
602
{
603
u64 mask;
604
struct octeon_ciu_chip_data *cd;
605
606
cd = irq_data_get_irq_chip_data(data);
607
mask = 1ull << (cd->bit);
608
609
if (cd->line == 0) {
610
int index = cvmx_get_core_num() * 2;
611
cvmx_write_csr(CVMX_CIU_INTX_SUM0(index), mask);
612
} else {
613
cvmx_write_csr(CVMX_CIU_INT_SUM1, mask);
614
}
615
}
616
617
/*
618
* Disable the irq on the all cores for chips that have the EN*_W1{S,C}
619
* registers.
620
*/
621
static void octeon_irq_ciu_disable_all_v2(struct irq_data *data)
622
{
623
int cpu;
624
u64 mask;
625
struct octeon_ciu_chip_data *cd;
626
627
cd = irq_data_get_irq_chip_data(data);
628
mask = 1ull << (cd->bit);
629
630
if (cd->line == 0) {
631
for_each_online_cpu(cpu) {
632
int index = octeon_coreid_for_cpu(cpu) * 2;
633
clear_bit(cd->bit,
634
&per_cpu(octeon_irq_ciu0_en_mirror, cpu));
635
cvmx_write_csr(CVMX_CIU_INTX_EN0_W1C(index), mask);
636
}
637
} else {
638
for_each_online_cpu(cpu) {
639
int index = octeon_coreid_for_cpu(cpu) * 2 + 1;
640
clear_bit(cd->bit,
641
&per_cpu(octeon_irq_ciu1_en_mirror, cpu));
642
cvmx_write_csr(CVMX_CIU_INTX_EN1_W1C(index), mask);
643
}
644
}
645
}
646
647
/*
648
* Enable the irq on the all cores for chips that have the EN*_W1{S,C}
649
* registers.
650
*/
651
static void octeon_irq_ciu_enable_all_v2(struct irq_data *data)
652
{
653
int cpu;
654
u64 mask;
655
struct octeon_ciu_chip_data *cd;
656
657
cd = irq_data_get_irq_chip_data(data);
658
mask = 1ull << (cd->bit);
659
660
if (cd->line == 0) {
661
for_each_online_cpu(cpu) {
662
int index = octeon_coreid_for_cpu(cpu) * 2;
663
set_bit(cd->bit,
664
&per_cpu(octeon_irq_ciu0_en_mirror, cpu));
665
cvmx_write_csr(CVMX_CIU_INTX_EN0_W1S(index), mask);
666
}
667
} else {
668
for_each_online_cpu(cpu) {
669
int index = octeon_coreid_for_cpu(cpu) * 2 + 1;
670
set_bit(cd->bit,
671
&per_cpu(octeon_irq_ciu1_en_mirror, cpu));
672
cvmx_write_csr(CVMX_CIU_INTX_EN1_W1S(index), mask);
673
}
674
}
675
}
676
677
static int octeon_irq_ciu_set_type(struct irq_data *data, unsigned int t)
678
{
679
irqd_set_trigger_type(data, t);
680
681
if (t & IRQ_TYPE_EDGE_BOTH)
682
irq_set_handler_locked(data, handle_edge_irq);
683
else
684
irq_set_handler_locked(data, handle_level_irq);
685
686
return IRQ_SET_MASK_OK;
687
}
688
689
static void octeon_irq_gpio_setup(struct irq_data *data)
690
{
691
union cvmx_gpio_bit_cfgx cfg;
692
struct octeon_ciu_chip_data *cd;
693
u32 t = irqd_get_trigger_type(data);
694
695
cd = irq_data_get_irq_chip_data(data);
696
697
cfg.u64 = 0;
698
cfg.s.int_en = 1;
699
cfg.s.int_type = (t & IRQ_TYPE_EDGE_BOTH) != 0;
700
cfg.s.rx_xor = (t & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_EDGE_FALLING)) != 0;
701
702
/* 140 nS glitch filter*/
703
cfg.s.fil_cnt = 7;
704
cfg.s.fil_sel = 3;
705
706
cvmx_write_csr(CVMX_GPIO_BIT_CFGX(cd->gpio_line), cfg.u64);
707
}
708
709
static void octeon_irq_ciu_enable_gpio_v2(struct irq_data *data)
710
{
711
octeon_irq_gpio_setup(data);
712
octeon_irq_ciu_enable_v2(data);
713
}
714
715
static void octeon_irq_ciu_enable_gpio(struct irq_data *data)
716
{
717
octeon_irq_gpio_setup(data);
718
octeon_irq_ciu_enable(data);
719
}
720
721
static int octeon_irq_ciu_gpio_set_type(struct irq_data *data, unsigned int t)
722
{
723
irqd_set_trigger_type(data, t);
724
octeon_irq_gpio_setup(data);
725
726
if (t & IRQ_TYPE_EDGE_BOTH)
727
irq_set_handler_locked(data, handle_edge_irq);
728
else
729
irq_set_handler_locked(data, handle_level_irq);
730
731
return IRQ_SET_MASK_OK;
732
}
733
734
static void octeon_irq_ciu_disable_gpio_v2(struct irq_data *data)
735
{
736
struct octeon_ciu_chip_data *cd;
737
738
cd = irq_data_get_irq_chip_data(data);
739
cvmx_write_csr(CVMX_GPIO_BIT_CFGX(cd->gpio_line), 0);
740
741
octeon_irq_ciu_disable_all_v2(data);
742
}
743
744
static void octeon_irq_ciu_disable_gpio(struct irq_data *data)
745
{
746
struct octeon_ciu_chip_data *cd;
747
748
cd = irq_data_get_irq_chip_data(data);
749
cvmx_write_csr(CVMX_GPIO_BIT_CFGX(cd->gpio_line), 0);
750
751
octeon_irq_ciu_disable_all(data);
752
}
753
754
static void octeon_irq_ciu_gpio_ack(struct irq_data *data)
755
{
756
struct octeon_ciu_chip_data *cd;
757
u64 mask;
758
759
cd = irq_data_get_irq_chip_data(data);
760
mask = 1ull << (cd->gpio_line);
761
762
cvmx_write_csr(CVMX_GPIO_INT_CLR, mask);
763
}
764
765
#ifdef CONFIG_SMP
766
767
static void octeon_irq_cpu_offline_ciu(struct irq_data *data)
768
{
769
int cpu = smp_processor_id();
770
cpumask_t new_affinity;
771
const struct cpumask *mask = irq_data_get_affinity_mask(data);
772
773
if (!cpumask_test_cpu(cpu, mask))
774
return;
775
776
if (cpumask_weight(mask) > 1) {
777
/*
778
* It has multi CPU affinity, just remove this CPU
779
* from the affinity set.
780
*/
781
cpumask_copy(&new_affinity, mask);
782
cpumask_clear_cpu(cpu, &new_affinity);
783
} else {
784
/* Otherwise, put it on lowest numbered online CPU. */
785
cpumask_clear(&new_affinity);
786
cpumask_set_cpu(cpumask_first(cpu_online_mask), &new_affinity);
787
}
788
irq_set_affinity_locked(data, &new_affinity, false);
789
}
790
791
static int octeon_irq_ciu_set_affinity(struct irq_data *data,
792
const struct cpumask *dest, bool force)
793
{
794
int cpu;
795
bool enable_one = !irqd_irq_disabled(data) && !irqd_irq_masked(data);
796
unsigned long flags;
797
struct octeon_ciu_chip_data *cd;
798
unsigned long *pen;
799
raw_spinlock_t *lock;
800
801
cd = irq_data_get_irq_chip_data(data);
802
803
/*
804
* For non-v2 CIU, we will allow only single CPU affinity.
805
* This removes the need to do locking in the .ack/.eoi
806
* functions.
807
*/
808
if (cpumask_weight(dest) != 1)
809
return -EINVAL;
810
811
if (!enable_one)
812
return 0;
813
814
815
for_each_online_cpu(cpu) {
816
int coreid = octeon_coreid_for_cpu(cpu);
817
818
lock = &per_cpu(octeon_irq_ciu_spinlock, cpu);
819
raw_spin_lock_irqsave(lock, flags);
820
821
if (cd->line == 0)
822
pen = &per_cpu(octeon_irq_ciu0_en_mirror, cpu);
823
else
824
pen = &per_cpu(octeon_irq_ciu1_en_mirror, cpu);
825
826
if (cpumask_test_cpu(cpu, dest) && enable_one) {
827
enable_one = false;
828
__set_bit(cd->bit, pen);
829
} else {
830
__clear_bit(cd->bit, pen);
831
}
832
/*
833
* Must be visible to octeon_irq_ip{2,3}_ciu() before
834
* enabling the irq.
835
*/
836
wmb();
837
838
if (cd->line == 0)
839
cvmx_write_csr(CVMX_CIU_INTX_EN0(coreid * 2), *pen);
840
else
841
cvmx_write_csr(CVMX_CIU_INTX_EN1(coreid * 2 + 1), *pen);
842
843
raw_spin_unlock_irqrestore(lock, flags);
844
}
845
return 0;
846
}
847
848
/*
849
* Set affinity for the irq for chips that have the EN*_W1{S,C}
850
* registers.
851
*/
852
static int octeon_irq_ciu_set_affinity_v2(struct irq_data *data,
853
const struct cpumask *dest,
854
bool force)
855
{
856
int cpu;
857
bool enable_one = !irqd_irq_disabled(data) && !irqd_irq_masked(data);
858
u64 mask;
859
struct octeon_ciu_chip_data *cd;
860
861
if (!enable_one)
862
return 0;
863
864
cd = irq_data_get_irq_chip_data(data);
865
mask = 1ull << cd->bit;
866
867
if (cd->line == 0) {
868
for_each_online_cpu(cpu) {
869
unsigned long *pen = &per_cpu(octeon_irq_ciu0_en_mirror, cpu);
870
int index = octeon_coreid_for_cpu(cpu) * 2;
871
if (cpumask_test_cpu(cpu, dest) && enable_one) {
872
enable_one = false;
873
set_bit(cd->bit, pen);
874
cvmx_write_csr(CVMX_CIU_INTX_EN0_W1S(index), mask);
875
} else {
876
clear_bit(cd->bit, pen);
877
cvmx_write_csr(CVMX_CIU_INTX_EN0_W1C(index), mask);
878
}
879
}
880
} else {
881
for_each_online_cpu(cpu) {
882
unsigned long *pen = &per_cpu(octeon_irq_ciu1_en_mirror, cpu);
883
int index = octeon_coreid_for_cpu(cpu) * 2 + 1;
884
if (cpumask_test_cpu(cpu, dest) && enable_one) {
885
enable_one = false;
886
set_bit(cd->bit, pen);
887
cvmx_write_csr(CVMX_CIU_INTX_EN1_W1S(index), mask);
888
} else {
889
clear_bit(cd->bit, pen);
890
cvmx_write_csr(CVMX_CIU_INTX_EN1_W1C(index), mask);
891
}
892
}
893
}
894
return 0;
895
}
896
897
static int octeon_irq_ciu_set_affinity_sum2(struct irq_data *data,
898
const struct cpumask *dest,
899
bool force)
900
{
901
int cpu;
902
bool enable_one = !irqd_irq_disabled(data) && !irqd_irq_masked(data);
903
u64 mask;
904
struct octeon_ciu_chip_data *cd;
905
906
if (!enable_one)
907
return 0;
908
909
cd = irq_data_get_irq_chip_data(data);
910
mask = 1ull << cd->bit;
911
912
for_each_online_cpu(cpu) {
913
int index = octeon_coreid_for_cpu(cpu);
914
915
if (cpumask_test_cpu(cpu, dest) && enable_one) {
916
enable_one = false;
917
cvmx_write_csr(CVMX_CIU_EN2_PPX_IP4_W1S(index), mask);
918
} else {
919
cvmx_write_csr(CVMX_CIU_EN2_PPX_IP4_W1C(index), mask);
920
}
921
}
922
return 0;
923
}
924
#endif
925
926
static unsigned int edge_startup(struct irq_data *data)
927
{
928
/* ack any pending edge-irq at startup, so there is
929
* an _edge_ to fire on when the event reappears.
930
*/
931
data->chip->irq_ack(data);
932
data->chip->irq_enable(data);
933
return 0;
934
}
935
936
/*
937
* Newer octeon chips have support for lockless CIU operation.
938
*/
939
static struct irq_chip octeon_irq_chip_ciu_v2 = {
940
.name = "CIU",
941
.irq_enable = octeon_irq_ciu_enable_v2,
942
.irq_disable = octeon_irq_ciu_disable_all_v2,
943
.irq_mask = octeon_irq_ciu_disable_local_v2,
944
.irq_unmask = octeon_irq_ciu_enable_v2,
945
#ifdef CONFIG_SMP
946
.irq_set_affinity = octeon_irq_ciu_set_affinity_v2,
947
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
948
#endif
949
};
950
951
static struct irq_chip octeon_irq_chip_ciu_v2_edge = {
952
.name = "CIU",
953
.irq_enable = octeon_irq_ciu_enable_v2,
954
.irq_disable = octeon_irq_ciu_disable_all_v2,
955
.irq_ack = octeon_irq_ciu_ack,
956
.irq_mask = octeon_irq_ciu_disable_local_v2,
957
.irq_unmask = octeon_irq_ciu_enable_v2,
958
#ifdef CONFIG_SMP
959
.irq_set_affinity = octeon_irq_ciu_set_affinity_v2,
960
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
961
#endif
962
};
963
964
/*
965
* Newer octeon chips have support for lockless CIU operation.
966
*/
967
static struct irq_chip octeon_irq_chip_ciu_sum2 = {
968
.name = "CIU",
969
.irq_enable = octeon_irq_ciu_enable_sum2,
970
.irq_disable = octeon_irq_ciu_disable_all_sum2,
971
.irq_mask = octeon_irq_ciu_disable_local_sum2,
972
.irq_unmask = octeon_irq_ciu_enable_sum2,
973
#ifdef CONFIG_SMP
974
.irq_set_affinity = octeon_irq_ciu_set_affinity_sum2,
975
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
976
#endif
977
};
978
979
static struct irq_chip octeon_irq_chip_ciu_sum2_edge = {
980
.name = "CIU",
981
.irq_enable = octeon_irq_ciu_enable_sum2,
982
.irq_disable = octeon_irq_ciu_disable_all_sum2,
983
.irq_ack = octeon_irq_ciu_ack_sum2,
984
.irq_mask = octeon_irq_ciu_disable_local_sum2,
985
.irq_unmask = octeon_irq_ciu_enable_sum2,
986
#ifdef CONFIG_SMP
987
.irq_set_affinity = octeon_irq_ciu_set_affinity_sum2,
988
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
989
#endif
990
};
991
992
static struct irq_chip octeon_irq_chip_ciu = {
993
.name = "CIU",
994
.irq_enable = octeon_irq_ciu_enable,
995
.irq_disable = octeon_irq_ciu_disable_all,
996
.irq_mask = octeon_irq_ciu_disable_local,
997
.irq_unmask = octeon_irq_ciu_enable,
998
#ifdef CONFIG_SMP
999
.irq_set_affinity = octeon_irq_ciu_set_affinity,
1000
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
1001
#endif
1002
};
1003
1004
static struct irq_chip octeon_irq_chip_ciu_edge = {
1005
.name = "CIU",
1006
.irq_enable = octeon_irq_ciu_enable,
1007
.irq_disable = octeon_irq_ciu_disable_all,
1008
.irq_ack = octeon_irq_ciu_ack,
1009
.irq_mask = octeon_irq_ciu_disable_local,
1010
.irq_unmask = octeon_irq_ciu_enable,
1011
#ifdef CONFIG_SMP
1012
.irq_set_affinity = octeon_irq_ciu_set_affinity,
1013
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
1014
#endif
1015
};
1016
1017
/* The mbox versions don't do any affinity or round-robin. */
1018
static struct irq_chip octeon_irq_chip_ciu_mbox_v2 = {
1019
.name = "CIU-M",
1020
.irq_enable = octeon_irq_ciu_enable_all_v2,
1021
.irq_disable = octeon_irq_ciu_disable_all_v2,
1022
.irq_ack = octeon_irq_ciu_disable_local_v2,
1023
.irq_eoi = octeon_irq_ciu_enable_local_v2,
1024
1025
.irq_cpu_online = octeon_irq_ciu_enable_local_v2,
1026
.irq_cpu_offline = octeon_irq_ciu_disable_local_v2,
1027
.flags = IRQCHIP_ONOFFLINE_ENABLED,
1028
};
1029
1030
static struct irq_chip octeon_irq_chip_ciu_mbox = {
1031
.name = "CIU-M",
1032
.irq_enable = octeon_irq_ciu_enable_all,
1033
.irq_disable = octeon_irq_ciu_disable_all,
1034
.irq_ack = octeon_irq_ciu_disable_local,
1035
.irq_eoi = octeon_irq_ciu_enable_local,
1036
1037
.irq_cpu_online = octeon_irq_ciu_enable_local,
1038
.irq_cpu_offline = octeon_irq_ciu_disable_local,
1039
.flags = IRQCHIP_ONOFFLINE_ENABLED,
1040
};
1041
1042
static struct irq_chip octeon_irq_chip_ciu_gpio_v2 = {
1043
.name = "CIU-GPIO",
1044
.irq_enable = octeon_irq_ciu_enable_gpio_v2,
1045
.irq_disable = octeon_irq_ciu_disable_gpio_v2,
1046
.irq_ack = octeon_irq_ciu_gpio_ack,
1047
.irq_mask = octeon_irq_ciu_disable_local_v2,
1048
.irq_unmask = octeon_irq_ciu_enable_v2,
1049
.irq_set_type = octeon_irq_ciu_gpio_set_type,
1050
#ifdef CONFIG_SMP
1051
.irq_set_affinity = octeon_irq_ciu_set_affinity_v2,
1052
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
1053
#endif
1054
.flags = IRQCHIP_SET_TYPE_MASKED,
1055
};
1056
1057
static struct irq_chip octeon_irq_chip_ciu_gpio = {
1058
.name = "CIU-GPIO",
1059
.irq_enable = octeon_irq_ciu_enable_gpio,
1060
.irq_disable = octeon_irq_ciu_disable_gpio,
1061
.irq_mask = octeon_irq_ciu_disable_local,
1062
.irq_unmask = octeon_irq_ciu_enable,
1063
.irq_ack = octeon_irq_ciu_gpio_ack,
1064
.irq_set_type = octeon_irq_ciu_gpio_set_type,
1065
#ifdef CONFIG_SMP
1066
.irq_set_affinity = octeon_irq_ciu_set_affinity,
1067
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
1068
#endif
1069
.flags = IRQCHIP_SET_TYPE_MASKED,
1070
};
1071
1072
/*
1073
* Watchdog interrupts are special. They are associated with a single
1074
* core, so we hardwire the affinity to that core.
1075
*/
1076
static void octeon_irq_ciu_wd_enable(struct irq_data *data)
1077
{
1078
unsigned long flags;
1079
unsigned long *pen;
1080
int coreid = data->irq - OCTEON_IRQ_WDOG0; /* Bit 0-63 of EN1 */
1081
int cpu = octeon_cpu_for_coreid(coreid);
1082
raw_spinlock_t *lock = &per_cpu(octeon_irq_ciu_spinlock, cpu);
1083
1084
raw_spin_lock_irqsave(lock, flags);
1085
pen = &per_cpu(octeon_irq_ciu1_en_mirror, cpu);
1086
__set_bit(coreid, pen);
1087
/*
1088
* Must be visible to octeon_irq_ip{2,3}_ciu() before enabling
1089
* the irq.
1090
*/
1091
wmb();
1092
cvmx_write_csr(CVMX_CIU_INTX_EN1(coreid * 2 + 1), *pen);
1093
raw_spin_unlock_irqrestore(lock, flags);
1094
}
1095
1096
/*
1097
* Watchdog interrupts are special. They are associated with a single
1098
* core, so we hardwire the affinity to that core.
1099
*/
1100
static void octeon_irq_ciu1_wd_enable_v2(struct irq_data *data)
1101
{
1102
int coreid = data->irq - OCTEON_IRQ_WDOG0;
1103
int cpu = octeon_cpu_for_coreid(coreid);
1104
1105
set_bit(coreid, &per_cpu(octeon_irq_ciu1_en_mirror, cpu));
1106
cvmx_write_csr(CVMX_CIU_INTX_EN1_W1S(coreid * 2 + 1), 1ull << coreid);
1107
}
1108
1109
1110
static struct irq_chip octeon_irq_chip_ciu_wd_v2 = {
1111
.name = "CIU-W",
1112
.irq_enable = octeon_irq_ciu1_wd_enable_v2,
1113
.irq_disable = octeon_irq_ciu_disable_all_v2,
1114
.irq_mask = octeon_irq_ciu_disable_local_v2,
1115
.irq_unmask = octeon_irq_ciu_enable_local_v2,
1116
};
1117
1118
static struct irq_chip octeon_irq_chip_ciu_wd = {
1119
.name = "CIU-W",
1120
.irq_enable = octeon_irq_ciu_wd_enable,
1121
.irq_disable = octeon_irq_ciu_disable_all,
1122
.irq_mask = octeon_irq_ciu_disable_local,
1123
.irq_unmask = octeon_irq_ciu_enable_local,
1124
};
1125
1126
static bool octeon_irq_ciu_is_edge(unsigned int line, unsigned int bit)
1127
{
1128
bool edge = false;
1129
1130
if (line == 0)
1131
switch (bit) {
1132
case 48 ... 49: /* GMX DRP */
1133
case 50: /* IPD_DRP */
1134
case 52 ... 55: /* Timers */
1135
case 58: /* MPI */
1136
edge = true;
1137
break;
1138
default:
1139
break;
1140
}
1141
else /* line == 1 */
1142
switch (bit) {
1143
case 47: /* PTP */
1144
edge = true;
1145
break;
1146
default:
1147
break;
1148
}
1149
return edge;
1150
}
1151
1152
struct octeon_irq_gpio_domain_data {
1153
unsigned int base_hwirq;
1154
};
1155
1156
static int octeon_irq_gpio_xlat(struct irq_domain *d,
1157
struct device_node *node,
1158
const u32 *intspec,
1159
unsigned int intsize,
1160
unsigned long *out_hwirq,
1161
unsigned int *out_type)
1162
{
1163
unsigned int type;
1164
unsigned int pin;
1165
unsigned int trigger;
1166
1167
if (irq_domain_get_of_node(d) != node)
1168
return -EINVAL;
1169
1170
if (intsize < 2)
1171
return -EINVAL;
1172
1173
pin = intspec[0];
1174
if (pin >= 16)
1175
return -EINVAL;
1176
1177
trigger = intspec[1];
1178
1179
switch (trigger) {
1180
case 1:
1181
type = IRQ_TYPE_EDGE_RISING;
1182
break;
1183
case 2:
1184
type = IRQ_TYPE_EDGE_FALLING;
1185
break;
1186
case 4:
1187
type = IRQ_TYPE_LEVEL_HIGH;
1188
break;
1189
case 8:
1190
type = IRQ_TYPE_LEVEL_LOW;
1191
break;
1192
default:
1193
pr_err("Error: (%pOFn) Invalid irq trigger specification: %x\n",
1194
node,
1195
trigger);
1196
type = IRQ_TYPE_LEVEL_LOW;
1197
break;
1198
}
1199
*out_type = type;
1200
*out_hwirq = pin;
1201
1202
return 0;
1203
}
1204
1205
static int octeon_irq_ciu_xlat(struct irq_domain *d,
1206
struct device_node *node,
1207
const u32 *intspec,
1208
unsigned int intsize,
1209
unsigned long *out_hwirq,
1210
unsigned int *out_type)
1211
{
1212
unsigned int ciu, bit;
1213
struct octeon_irq_ciu_domain_data *dd = d->host_data;
1214
1215
ciu = intspec[0];
1216
bit = intspec[1];
1217
1218
if (ciu >= dd->num_sum || bit > 63)
1219
return -EINVAL;
1220
1221
*out_hwirq = (ciu << 6) | bit;
1222
*out_type = 0;
1223
1224
return 0;
1225
}
1226
1227
static struct irq_chip *octeon_irq_ciu_chip;
1228
static struct irq_chip *octeon_irq_ciu_chip_edge;
1229
static struct irq_chip *octeon_irq_gpio_chip;
1230
1231
static int octeon_irq_ciu_map(struct irq_domain *d,
1232
unsigned int virq, irq_hw_number_t hw)
1233
{
1234
int rv;
1235
unsigned int line = hw >> 6;
1236
unsigned int bit = hw & 63;
1237
struct octeon_irq_ciu_domain_data *dd = d->host_data;
1238
1239
if (line >= dd->num_sum || octeon_irq_ciu_to_irq[line][bit] != 0)
1240
return -EINVAL;
1241
1242
if (line == 2) {
1243
if (octeon_irq_ciu_is_edge(line, bit))
1244
rv = octeon_irq_set_ciu_mapping(virq, line, bit, 0,
1245
&octeon_irq_chip_ciu_sum2_edge,
1246
handle_edge_irq);
1247
else
1248
rv = octeon_irq_set_ciu_mapping(virq, line, bit, 0,
1249
&octeon_irq_chip_ciu_sum2,
1250
handle_level_irq);
1251
} else {
1252
if (octeon_irq_ciu_is_edge(line, bit))
1253
rv = octeon_irq_set_ciu_mapping(virq, line, bit, 0,
1254
octeon_irq_ciu_chip_edge,
1255
handle_edge_irq);
1256
else
1257
rv = octeon_irq_set_ciu_mapping(virq, line, bit, 0,
1258
octeon_irq_ciu_chip,
1259
handle_level_irq);
1260
}
1261
return rv;
1262
}
1263
1264
static int octeon_irq_gpio_map(struct irq_domain *d,
1265
unsigned int virq, irq_hw_number_t hw)
1266
{
1267
struct octeon_irq_gpio_domain_data *gpiod = d->host_data;
1268
unsigned int line, bit;
1269
int r;
1270
1271
line = (hw + gpiod->base_hwirq) >> 6;
1272
bit = (hw + gpiod->base_hwirq) & 63;
1273
if (line >= ARRAY_SIZE(octeon_irq_ciu_to_irq) ||
1274
octeon_irq_ciu_to_irq[line][bit] != 0)
1275
return -EINVAL;
1276
1277
/*
1278
* Default to handle_level_irq. If the DT contains a different
1279
* trigger type, it will call the irq_set_type callback and
1280
* the handler gets updated.
1281
*/
1282
r = octeon_irq_set_ciu_mapping(virq, line, bit, hw,
1283
octeon_irq_gpio_chip, handle_level_irq);
1284
return r;
1285
}
1286
1287
static const struct irq_domain_ops octeon_irq_domain_ciu_ops = {
1288
.map = octeon_irq_ciu_map,
1289
.unmap = octeon_irq_free_cd,
1290
.xlate = octeon_irq_ciu_xlat,
1291
};
1292
1293
static const struct irq_domain_ops octeon_irq_domain_gpio_ops = {
1294
.map = octeon_irq_gpio_map,
1295
.unmap = octeon_irq_free_cd,
1296
.xlate = octeon_irq_gpio_xlat,
1297
};
1298
1299
static void octeon_irq_ip2_ciu(void)
1300
{
1301
const unsigned long core_id = cvmx_get_core_num();
1302
u64 ciu_sum = cvmx_read_csr(CVMX_CIU_INTX_SUM0(core_id * 2));
1303
1304
ciu_sum &= __this_cpu_read(octeon_irq_ciu0_en_mirror);
1305
if (likely(ciu_sum)) {
1306
int bit = fls64(ciu_sum) - 1;
1307
int irq = octeon_irq_ciu_to_irq[0][bit];
1308
if (likely(irq))
1309
do_IRQ(irq);
1310
else
1311
spurious_interrupt();
1312
} else {
1313
spurious_interrupt();
1314
}
1315
}
1316
1317
static void octeon_irq_ip3_ciu(void)
1318
{
1319
u64 ciu_sum = cvmx_read_csr(CVMX_CIU_INT_SUM1);
1320
1321
ciu_sum &= __this_cpu_read(octeon_irq_ciu1_en_mirror);
1322
if (likely(ciu_sum)) {
1323
int bit = fls64(ciu_sum) - 1;
1324
int irq = octeon_irq_ciu_to_irq[1][bit];
1325
if (likely(irq))
1326
do_IRQ(irq);
1327
else
1328
spurious_interrupt();
1329
} else {
1330
spurious_interrupt();
1331
}
1332
}
1333
1334
static void octeon_irq_ip4_ciu(void)
1335
{
1336
int coreid = cvmx_get_core_num();
1337
u64 ciu_sum = cvmx_read_csr(CVMX_CIU_SUM2_PPX_IP4(coreid));
1338
u64 ciu_en = cvmx_read_csr(CVMX_CIU_EN2_PPX_IP4(coreid));
1339
1340
ciu_sum &= ciu_en;
1341
if (likely(ciu_sum)) {
1342
int bit = fls64(ciu_sum) - 1;
1343
int irq = octeon_irq_ciu_to_irq[2][bit];
1344
1345
if (likely(irq))
1346
do_IRQ(irq);
1347
else
1348
spurious_interrupt();
1349
} else {
1350
spurious_interrupt();
1351
}
1352
}
1353
1354
static bool octeon_irq_use_ip4;
1355
1356
static void octeon_irq_local_enable_ip4(void *arg)
1357
{
1358
set_c0_status(STATUSF_IP4);
1359
}
1360
1361
static void octeon_irq_ip4_mask(void)
1362
{
1363
clear_c0_status(STATUSF_IP4);
1364
spurious_interrupt();
1365
}
1366
1367
static void (*octeon_irq_ip2)(void);
1368
static void (*octeon_irq_ip3)(void);
1369
static void (*octeon_irq_ip4)(void);
1370
1371
void (*octeon_irq_setup_secondary)(void);
1372
1373
void octeon_irq_set_ip4_handler(octeon_irq_ip4_handler_t h)
1374
{
1375
octeon_irq_ip4 = h;
1376
octeon_irq_use_ip4 = true;
1377
on_each_cpu(octeon_irq_local_enable_ip4, NULL, 1);
1378
}
1379
1380
static void octeon_irq_percpu_enable(void)
1381
{
1382
irq_cpu_online();
1383
}
1384
1385
static void octeon_irq_init_ciu_percpu(void)
1386
{
1387
int coreid = cvmx_get_core_num();
1388
1389
1390
__this_cpu_write(octeon_irq_ciu0_en_mirror, 0);
1391
__this_cpu_write(octeon_irq_ciu1_en_mirror, 0);
1392
wmb();
1393
raw_spin_lock_init(this_cpu_ptr(&octeon_irq_ciu_spinlock));
1394
/*
1395
* Disable All CIU Interrupts. The ones we need will be
1396
* enabled later. Read the SUM register so we know the write
1397
* completed.
1398
*/
1399
cvmx_write_csr(CVMX_CIU_INTX_EN0((coreid * 2)), 0);
1400
cvmx_write_csr(CVMX_CIU_INTX_EN0((coreid * 2 + 1)), 0);
1401
cvmx_write_csr(CVMX_CIU_INTX_EN1((coreid * 2)), 0);
1402
cvmx_write_csr(CVMX_CIU_INTX_EN1((coreid * 2 + 1)), 0);
1403
cvmx_read_csr(CVMX_CIU_INTX_SUM0((coreid * 2)));
1404
}
1405
1406
static void octeon_irq_init_ciu2_percpu(void)
1407
{
1408
u64 regx, ipx;
1409
int coreid = cvmx_get_core_num();
1410
u64 base = CVMX_CIU2_EN_PPX_IP2_WRKQ(coreid);
1411
1412
/*
1413
* Disable All CIU2 Interrupts. The ones we need will be
1414
* enabled later. Read the SUM register so we know the write
1415
* completed.
1416
*
1417
* There are 9 registers and 3 IPX levels with strides 0x1000
1418
* and 0x200 respectively. Use loops to clear them.
1419
*/
1420
for (regx = 0; regx <= 0x8000; regx += 0x1000) {
1421
for (ipx = 0; ipx <= 0x400; ipx += 0x200)
1422
cvmx_write_csr(base + regx + ipx, 0);
1423
}
1424
1425
cvmx_read_csr(CVMX_CIU2_SUM_PPX_IP2(coreid));
1426
}
1427
1428
static void octeon_irq_setup_secondary_ciu(void)
1429
{
1430
octeon_irq_init_ciu_percpu();
1431
octeon_irq_percpu_enable();
1432
1433
/* Enable the CIU lines */
1434
set_c0_status(STATUSF_IP3 | STATUSF_IP2);
1435
if (octeon_irq_use_ip4)
1436
set_c0_status(STATUSF_IP4);
1437
else
1438
clear_c0_status(STATUSF_IP4);
1439
}
1440
1441
static void octeon_irq_setup_secondary_ciu2(void)
1442
{
1443
octeon_irq_init_ciu2_percpu();
1444
octeon_irq_percpu_enable();
1445
1446
/* Enable the CIU lines */
1447
set_c0_status(STATUSF_IP3 | STATUSF_IP2);
1448
if (octeon_irq_use_ip4)
1449
set_c0_status(STATUSF_IP4);
1450
else
1451
clear_c0_status(STATUSF_IP4);
1452
}
1453
1454
static int __init octeon_irq_init_ciu(
1455
struct device_node *ciu_node, struct device_node *parent)
1456
{
1457
int i, r;
1458
struct irq_chip *chip;
1459
struct irq_chip *chip_edge;
1460
struct irq_chip *chip_mbox;
1461
struct irq_chip *chip_wd;
1462
struct irq_domain *ciu_domain = NULL;
1463
struct octeon_irq_ciu_domain_data *dd;
1464
1465
dd = kzalloc(sizeof(*dd), GFP_KERNEL);
1466
if (!dd)
1467
return -ENOMEM;
1468
1469
octeon_irq_init_ciu_percpu();
1470
octeon_irq_setup_secondary = octeon_irq_setup_secondary_ciu;
1471
1472
octeon_irq_ip2 = octeon_irq_ip2_ciu;
1473
octeon_irq_ip3 = octeon_irq_ip3_ciu;
1474
if ((OCTEON_IS_OCTEON2() || OCTEON_IS_OCTEON3())
1475
&& !OCTEON_IS_MODEL(OCTEON_CN63XX)) {
1476
octeon_irq_ip4 = octeon_irq_ip4_ciu;
1477
dd->num_sum = 3;
1478
octeon_irq_use_ip4 = true;
1479
} else {
1480
octeon_irq_ip4 = octeon_irq_ip4_mask;
1481
dd->num_sum = 2;
1482
octeon_irq_use_ip4 = false;
1483
}
1484
if (OCTEON_IS_MODEL(OCTEON_CN58XX_PASS2_X) ||
1485
OCTEON_IS_MODEL(OCTEON_CN56XX_PASS2_X) ||
1486
OCTEON_IS_MODEL(OCTEON_CN52XX_PASS2_X) ||
1487
OCTEON_IS_OCTEON2() || OCTEON_IS_OCTEON3()) {
1488
chip = &octeon_irq_chip_ciu_v2;
1489
chip_edge = &octeon_irq_chip_ciu_v2_edge;
1490
chip_mbox = &octeon_irq_chip_ciu_mbox_v2;
1491
chip_wd = &octeon_irq_chip_ciu_wd_v2;
1492
octeon_irq_gpio_chip = &octeon_irq_chip_ciu_gpio_v2;
1493
} else {
1494
chip = &octeon_irq_chip_ciu;
1495
chip_edge = &octeon_irq_chip_ciu_edge;
1496
chip_mbox = &octeon_irq_chip_ciu_mbox;
1497
chip_wd = &octeon_irq_chip_ciu_wd;
1498
octeon_irq_gpio_chip = &octeon_irq_chip_ciu_gpio;
1499
}
1500
octeon_irq_ciu_chip = chip;
1501
octeon_irq_ciu_chip_edge = chip_edge;
1502
1503
/* Mips internal */
1504
octeon_irq_init_core();
1505
1506
ciu_domain = irq_domain_create_tree(of_fwnode_handle(ciu_node), &octeon_irq_domain_ciu_ops,
1507
dd);
1508
irq_set_default_domain(ciu_domain);
1509
1510
/* CIU_0 */
1511
for (i = 0; i < 16; i++) {
1512
r = octeon_irq_force_ciu_mapping(
1513
ciu_domain, i + OCTEON_IRQ_WORKQ0, 0, i + 0);
1514
if (r)
1515
goto err;
1516
}
1517
1518
r = irq_alloc_desc_at(OCTEON_IRQ_MBOX0, -1);
1519
if (r < 0) {
1520
pr_err("Failed to allocate desc for %s\n", "OCTEON_IRQ_MBOX0");
1521
goto err;
1522
}
1523
r = octeon_irq_set_ciu_mapping(
1524
OCTEON_IRQ_MBOX0, 0, 32, 0, chip_mbox, handle_percpu_irq);
1525
if (r)
1526
goto err;
1527
r = irq_alloc_desc_at(OCTEON_IRQ_MBOX1, -1);
1528
if (r < 0) {
1529
pr_err("Failed to allocate desc for %s\n", "OCTEON_IRQ_MBOX1");
1530
goto err;
1531
}
1532
r = octeon_irq_set_ciu_mapping(
1533
OCTEON_IRQ_MBOX1, 0, 33, 0, chip_mbox, handle_percpu_irq);
1534
if (r)
1535
goto err;
1536
1537
for (i = 0; i < 4; i++) {
1538
r = octeon_irq_force_ciu_mapping(
1539
ciu_domain, i + OCTEON_IRQ_PCI_INT0, 0, i + 36);
1540
if (r)
1541
goto err;
1542
}
1543
for (i = 0; i < 4; i++) {
1544
r = octeon_irq_force_ciu_mapping(
1545
ciu_domain, i + OCTEON_IRQ_PCI_MSI0, 0, i + 40);
1546
if (r)
1547
goto err;
1548
}
1549
1550
r = octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_TWSI, 0, 45);
1551
if (r)
1552
goto err;
1553
1554
r = octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_RML, 0, 46);
1555
if (r)
1556
goto err;
1557
1558
for (i = 0; i < 4; i++) {
1559
r = octeon_irq_force_ciu_mapping(
1560
ciu_domain, i + OCTEON_IRQ_TIMER0, 0, i + 52);
1561
if (r)
1562
goto err;
1563
}
1564
1565
r = octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_TWSI2, 0, 59);
1566
if (r)
1567
goto err;
1568
1569
r = irq_alloc_descs(OCTEON_IRQ_WDOG0, OCTEON_IRQ_WDOG0, 16, -1);
1570
if (r < 0) {
1571
pr_err("Failed to allocate desc for %s\n", "OCTEON_IRQ_WDOGx");
1572
goto err;
1573
}
1574
/* CIU_1 */
1575
for (i = 0; i < 16; i++) {
1576
r = octeon_irq_set_ciu_mapping(
1577
i + OCTEON_IRQ_WDOG0, 1, i + 0, 0, chip_wd,
1578
handle_level_irq);
1579
if (r)
1580
goto err;
1581
}
1582
1583
/* Enable the CIU lines */
1584
set_c0_status(STATUSF_IP3 | STATUSF_IP2);
1585
if (octeon_irq_use_ip4)
1586
set_c0_status(STATUSF_IP4);
1587
else
1588
clear_c0_status(STATUSF_IP4);
1589
1590
return 0;
1591
err:
1592
return r;
1593
}
1594
1595
static int __init octeon_irq_init_gpio(
1596
struct device_node *gpio_node, struct device_node *parent)
1597
{
1598
struct octeon_irq_gpio_domain_data *gpiod;
1599
u32 interrupt_cells;
1600
unsigned int base_hwirq;
1601
int r;
1602
1603
r = of_property_read_u32(parent, "#interrupt-cells", &interrupt_cells);
1604
if (r)
1605
return r;
1606
1607
if (interrupt_cells == 1) {
1608
u32 v;
1609
1610
r = of_property_read_u32_index(gpio_node, "interrupts", 0, &v);
1611
if (r) {
1612
pr_warn("No \"interrupts\" property.\n");
1613
return r;
1614
}
1615
base_hwirq = v;
1616
} else if (interrupt_cells == 2) {
1617
u32 v0, v1;
1618
1619
r = of_property_read_u32_index(gpio_node, "interrupts", 0, &v0);
1620
if (r) {
1621
pr_warn("No \"interrupts\" property.\n");
1622
return r;
1623
}
1624
r = of_property_read_u32_index(gpio_node, "interrupts", 1, &v1);
1625
if (r) {
1626
pr_warn("No \"interrupts\" property.\n");
1627
return r;
1628
}
1629
base_hwirq = (v0 << 6) | v1;
1630
} else {
1631
pr_warn("Bad \"#interrupt-cells\" property: %u\n",
1632
interrupt_cells);
1633
return -EINVAL;
1634
}
1635
1636
gpiod = kzalloc(sizeof(*gpiod), GFP_KERNEL);
1637
if (gpiod) {
1638
/* gpio domain host_data is the base hwirq number. */
1639
gpiod->base_hwirq = base_hwirq;
1640
irq_domain_create_linear(of_fwnode_handle(gpio_node), 16,
1641
&octeon_irq_domain_gpio_ops, gpiod);
1642
} else {
1643
pr_warn("Cannot allocate memory for GPIO irq_domain.\n");
1644
return -ENOMEM;
1645
}
1646
1647
/*
1648
* Clear the OF_POPULATED flag that was set by of_irq_init()
1649
* so that all GPIO devices will be probed.
1650
*/
1651
of_node_clear_flag(gpio_node, OF_POPULATED);
1652
1653
return 0;
1654
}
1655
/*
1656
* Watchdog interrupts are special. They are associated with a single
1657
* core, so we hardwire the affinity to that core.
1658
*/
1659
static void octeon_irq_ciu2_wd_enable(struct irq_data *data)
1660
{
1661
u64 mask;
1662
u64 en_addr;
1663
int coreid = data->irq - OCTEON_IRQ_WDOG0;
1664
struct octeon_ciu_chip_data *cd;
1665
1666
cd = irq_data_get_irq_chip_data(data);
1667
mask = 1ull << (cd->bit);
1668
1669
en_addr = CVMX_CIU2_EN_PPX_IP2_WRKQ_W1S(coreid) +
1670
(0x1000ull * cd->line);
1671
cvmx_write_csr(en_addr, mask);
1672
1673
}
1674
1675
static void octeon_irq_ciu2_enable(struct irq_data *data)
1676
{
1677
u64 mask;
1678
u64 en_addr;
1679
int cpu = next_cpu_for_irq(data);
1680
int coreid = octeon_coreid_for_cpu(cpu);
1681
struct octeon_ciu_chip_data *cd;
1682
1683
cd = irq_data_get_irq_chip_data(data);
1684
mask = 1ull << (cd->bit);
1685
1686
en_addr = CVMX_CIU2_EN_PPX_IP2_WRKQ_W1S(coreid) +
1687
(0x1000ull * cd->line);
1688
cvmx_write_csr(en_addr, mask);
1689
}
1690
1691
static void octeon_irq_ciu2_enable_local(struct irq_data *data)
1692
{
1693
u64 mask;
1694
u64 en_addr;
1695
int coreid = cvmx_get_core_num();
1696
struct octeon_ciu_chip_data *cd;
1697
1698
cd = irq_data_get_irq_chip_data(data);
1699
mask = 1ull << (cd->bit);
1700
1701
en_addr = CVMX_CIU2_EN_PPX_IP2_WRKQ_W1S(coreid) +
1702
(0x1000ull * cd->line);
1703
cvmx_write_csr(en_addr, mask);
1704
1705
}
1706
1707
static void octeon_irq_ciu2_disable_local(struct irq_data *data)
1708
{
1709
u64 mask;
1710
u64 en_addr;
1711
int coreid = cvmx_get_core_num();
1712
struct octeon_ciu_chip_data *cd;
1713
1714
cd = irq_data_get_irq_chip_data(data);
1715
mask = 1ull << (cd->bit);
1716
1717
en_addr = CVMX_CIU2_EN_PPX_IP2_WRKQ_W1C(coreid) +
1718
(0x1000ull * cd->line);
1719
cvmx_write_csr(en_addr, mask);
1720
1721
}
1722
1723
static void octeon_irq_ciu2_ack(struct irq_data *data)
1724
{
1725
u64 mask;
1726
u64 en_addr;
1727
int coreid = cvmx_get_core_num();
1728
struct octeon_ciu_chip_data *cd;
1729
1730
cd = irq_data_get_irq_chip_data(data);
1731
mask = 1ull << (cd->bit);
1732
1733
en_addr = CVMX_CIU2_RAW_PPX_IP2_WRKQ(coreid) + (0x1000ull * cd->line);
1734
cvmx_write_csr(en_addr, mask);
1735
1736
}
1737
1738
static void octeon_irq_ciu2_disable_all(struct irq_data *data)
1739
{
1740
int cpu;
1741
u64 mask;
1742
struct octeon_ciu_chip_data *cd;
1743
1744
cd = irq_data_get_irq_chip_data(data);
1745
mask = 1ull << (cd->bit);
1746
1747
for_each_online_cpu(cpu) {
1748
u64 en_addr = CVMX_CIU2_EN_PPX_IP2_WRKQ_W1C(
1749
octeon_coreid_for_cpu(cpu)) + (0x1000ull * cd->line);
1750
cvmx_write_csr(en_addr, mask);
1751
}
1752
}
1753
1754
static void octeon_irq_ciu2_mbox_enable_all(struct irq_data *data)
1755
{
1756
int cpu;
1757
u64 mask;
1758
1759
mask = 1ull << (data->irq - OCTEON_IRQ_MBOX0);
1760
1761
for_each_online_cpu(cpu) {
1762
u64 en_addr = CVMX_CIU2_EN_PPX_IP3_MBOX_W1S(
1763
octeon_coreid_for_cpu(cpu));
1764
cvmx_write_csr(en_addr, mask);
1765
}
1766
}
1767
1768
static void octeon_irq_ciu2_mbox_disable_all(struct irq_data *data)
1769
{
1770
int cpu;
1771
u64 mask;
1772
1773
mask = 1ull << (data->irq - OCTEON_IRQ_MBOX0);
1774
1775
for_each_online_cpu(cpu) {
1776
u64 en_addr = CVMX_CIU2_EN_PPX_IP3_MBOX_W1C(
1777
octeon_coreid_for_cpu(cpu));
1778
cvmx_write_csr(en_addr, mask);
1779
}
1780
}
1781
1782
static void octeon_irq_ciu2_mbox_enable_local(struct irq_data *data)
1783
{
1784
u64 mask;
1785
u64 en_addr;
1786
int coreid = cvmx_get_core_num();
1787
1788
mask = 1ull << (data->irq - OCTEON_IRQ_MBOX0);
1789
en_addr = CVMX_CIU2_EN_PPX_IP3_MBOX_W1S(coreid);
1790
cvmx_write_csr(en_addr, mask);
1791
}
1792
1793
static void octeon_irq_ciu2_mbox_disable_local(struct irq_data *data)
1794
{
1795
u64 mask;
1796
u64 en_addr;
1797
int coreid = cvmx_get_core_num();
1798
1799
mask = 1ull << (data->irq - OCTEON_IRQ_MBOX0);
1800
en_addr = CVMX_CIU2_EN_PPX_IP3_MBOX_W1C(coreid);
1801
cvmx_write_csr(en_addr, mask);
1802
}
1803
1804
#ifdef CONFIG_SMP
1805
static int octeon_irq_ciu2_set_affinity(struct irq_data *data,
1806
const struct cpumask *dest, bool force)
1807
{
1808
int cpu;
1809
bool enable_one = !irqd_irq_disabled(data) && !irqd_irq_masked(data);
1810
u64 mask;
1811
struct octeon_ciu_chip_data *cd;
1812
1813
if (!enable_one)
1814
return 0;
1815
1816
cd = irq_data_get_irq_chip_data(data);
1817
mask = 1ull << cd->bit;
1818
1819
for_each_online_cpu(cpu) {
1820
u64 en_addr;
1821
if (cpumask_test_cpu(cpu, dest) && enable_one) {
1822
enable_one = false;
1823
en_addr = CVMX_CIU2_EN_PPX_IP2_WRKQ_W1S(
1824
octeon_coreid_for_cpu(cpu)) +
1825
(0x1000ull * cd->line);
1826
} else {
1827
en_addr = CVMX_CIU2_EN_PPX_IP2_WRKQ_W1C(
1828
octeon_coreid_for_cpu(cpu)) +
1829
(0x1000ull * cd->line);
1830
}
1831
cvmx_write_csr(en_addr, mask);
1832
}
1833
1834
return 0;
1835
}
1836
#endif
1837
1838
static void octeon_irq_ciu2_enable_gpio(struct irq_data *data)
1839
{
1840
octeon_irq_gpio_setup(data);
1841
octeon_irq_ciu2_enable(data);
1842
}
1843
1844
static void octeon_irq_ciu2_disable_gpio(struct irq_data *data)
1845
{
1846
struct octeon_ciu_chip_data *cd;
1847
1848
cd = irq_data_get_irq_chip_data(data);
1849
1850
cvmx_write_csr(CVMX_GPIO_BIT_CFGX(cd->gpio_line), 0);
1851
1852
octeon_irq_ciu2_disable_all(data);
1853
}
1854
1855
static struct irq_chip octeon_irq_chip_ciu2 = {
1856
.name = "CIU2-E",
1857
.irq_enable = octeon_irq_ciu2_enable,
1858
.irq_disable = octeon_irq_ciu2_disable_all,
1859
.irq_mask = octeon_irq_ciu2_disable_local,
1860
.irq_unmask = octeon_irq_ciu2_enable,
1861
#ifdef CONFIG_SMP
1862
.irq_set_affinity = octeon_irq_ciu2_set_affinity,
1863
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
1864
#endif
1865
};
1866
1867
static struct irq_chip octeon_irq_chip_ciu2_edge = {
1868
.name = "CIU2-E",
1869
.irq_enable = octeon_irq_ciu2_enable,
1870
.irq_disable = octeon_irq_ciu2_disable_all,
1871
.irq_ack = octeon_irq_ciu2_ack,
1872
.irq_mask = octeon_irq_ciu2_disable_local,
1873
.irq_unmask = octeon_irq_ciu2_enable,
1874
#ifdef CONFIG_SMP
1875
.irq_set_affinity = octeon_irq_ciu2_set_affinity,
1876
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
1877
#endif
1878
};
1879
1880
static struct irq_chip octeon_irq_chip_ciu2_mbox = {
1881
.name = "CIU2-M",
1882
.irq_enable = octeon_irq_ciu2_mbox_enable_all,
1883
.irq_disable = octeon_irq_ciu2_mbox_disable_all,
1884
.irq_ack = octeon_irq_ciu2_mbox_disable_local,
1885
.irq_eoi = octeon_irq_ciu2_mbox_enable_local,
1886
1887
.irq_cpu_online = octeon_irq_ciu2_mbox_enable_local,
1888
.irq_cpu_offline = octeon_irq_ciu2_mbox_disable_local,
1889
.flags = IRQCHIP_ONOFFLINE_ENABLED,
1890
};
1891
1892
static struct irq_chip octeon_irq_chip_ciu2_wd = {
1893
.name = "CIU2-W",
1894
.irq_enable = octeon_irq_ciu2_wd_enable,
1895
.irq_disable = octeon_irq_ciu2_disable_all,
1896
.irq_mask = octeon_irq_ciu2_disable_local,
1897
.irq_unmask = octeon_irq_ciu2_enable_local,
1898
};
1899
1900
static struct irq_chip octeon_irq_chip_ciu2_gpio = {
1901
.name = "CIU-GPIO",
1902
.irq_enable = octeon_irq_ciu2_enable_gpio,
1903
.irq_disable = octeon_irq_ciu2_disable_gpio,
1904
.irq_ack = octeon_irq_ciu_gpio_ack,
1905
.irq_mask = octeon_irq_ciu2_disable_local,
1906
.irq_unmask = octeon_irq_ciu2_enable,
1907
.irq_set_type = octeon_irq_ciu_gpio_set_type,
1908
#ifdef CONFIG_SMP
1909
.irq_set_affinity = octeon_irq_ciu2_set_affinity,
1910
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
1911
#endif
1912
.flags = IRQCHIP_SET_TYPE_MASKED,
1913
};
1914
1915
static int octeon_irq_ciu2_xlat(struct irq_domain *d,
1916
struct device_node *node,
1917
const u32 *intspec,
1918
unsigned int intsize,
1919
unsigned long *out_hwirq,
1920
unsigned int *out_type)
1921
{
1922
unsigned int ciu, bit;
1923
1924
ciu = intspec[0];
1925
bit = intspec[1];
1926
1927
*out_hwirq = (ciu << 6) | bit;
1928
*out_type = 0;
1929
1930
return 0;
1931
}
1932
1933
static bool octeon_irq_ciu2_is_edge(unsigned int line, unsigned int bit)
1934
{
1935
bool edge = false;
1936
1937
if (line == 3) /* MIO */
1938
switch (bit) {
1939
case 2: /* IPD_DRP */
1940
case 8 ... 11: /* Timers */
1941
case 48: /* PTP */
1942
edge = true;
1943
break;
1944
default:
1945
break;
1946
}
1947
else if (line == 6) /* PKT */
1948
switch (bit) {
1949
case 52 ... 53: /* ILK_DRP */
1950
case 8 ... 12: /* GMX_DRP */
1951
edge = true;
1952
break;
1953
default:
1954
break;
1955
}
1956
return edge;
1957
}
1958
1959
static int octeon_irq_ciu2_map(struct irq_domain *d,
1960
unsigned int virq, irq_hw_number_t hw)
1961
{
1962
unsigned int line = hw >> 6;
1963
unsigned int bit = hw & 63;
1964
1965
/*
1966
* Don't map irq if it is reserved for GPIO.
1967
* (Line 7 are the GPIO lines.)
1968
*/
1969
if (line == 7)
1970
return 0;
1971
1972
if (line > 7 || octeon_irq_ciu_to_irq[line][bit] != 0)
1973
return -EINVAL;
1974
1975
if (octeon_irq_ciu2_is_edge(line, bit))
1976
octeon_irq_set_ciu_mapping(virq, line, bit, 0,
1977
&octeon_irq_chip_ciu2_edge,
1978
handle_edge_irq);
1979
else
1980
octeon_irq_set_ciu_mapping(virq, line, bit, 0,
1981
&octeon_irq_chip_ciu2,
1982
handle_level_irq);
1983
1984
return 0;
1985
}
1986
1987
static const struct irq_domain_ops octeon_irq_domain_ciu2_ops = {
1988
.map = octeon_irq_ciu2_map,
1989
.unmap = octeon_irq_free_cd,
1990
.xlate = octeon_irq_ciu2_xlat,
1991
};
1992
1993
static void octeon_irq_ciu2(void)
1994
{
1995
int line;
1996
int bit;
1997
int irq;
1998
u64 src_reg, src, sum;
1999
const unsigned long core_id = cvmx_get_core_num();
2000
2001
sum = cvmx_read_csr(CVMX_CIU2_SUM_PPX_IP2(core_id)) & 0xfful;
2002
2003
if (unlikely(!sum))
2004
goto spurious;
2005
2006
line = fls64(sum) - 1;
2007
src_reg = CVMX_CIU2_SRC_PPX_IP2_WRKQ(core_id) + (0x1000 * line);
2008
src = cvmx_read_csr(src_reg);
2009
2010
if (unlikely(!src))
2011
goto spurious;
2012
2013
bit = fls64(src) - 1;
2014
irq = octeon_irq_ciu_to_irq[line][bit];
2015
if (unlikely(!irq))
2016
goto spurious;
2017
2018
do_IRQ(irq);
2019
goto out;
2020
2021
spurious:
2022
spurious_interrupt();
2023
out:
2024
/* CN68XX pass 1.x has an errata that accessing the ACK registers
2025
can stop interrupts from propagating */
2026
if (OCTEON_IS_MODEL(OCTEON_CN68XX))
2027
cvmx_read_csr(CVMX_CIU2_INTR_CIU_READY);
2028
else
2029
cvmx_read_csr(CVMX_CIU2_ACK_PPX_IP2(core_id));
2030
return;
2031
}
2032
2033
static void octeon_irq_ciu2_mbox(void)
2034
{
2035
int line;
2036
2037
const unsigned long core_id = cvmx_get_core_num();
2038
u64 sum = cvmx_read_csr(CVMX_CIU2_SUM_PPX_IP3(core_id)) >> 60;
2039
2040
if (unlikely(!sum))
2041
goto spurious;
2042
2043
line = fls64(sum) - 1;
2044
2045
do_IRQ(OCTEON_IRQ_MBOX0 + line);
2046
goto out;
2047
2048
spurious:
2049
spurious_interrupt();
2050
out:
2051
/* CN68XX pass 1.x has an errata that accessing the ACK registers
2052
can stop interrupts from propagating */
2053
if (OCTEON_IS_MODEL(OCTEON_CN68XX))
2054
cvmx_read_csr(CVMX_CIU2_INTR_CIU_READY);
2055
else
2056
cvmx_read_csr(CVMX_CIU2_ACK_PPX_IP3(core_id));
2057
return;
2058
}
2059
2060
static int __init octeon_irq_init_ciu2(
2061
struct device_node *ciu_node, struct device_node *parent)
2062
{
2063
unsigned int i, r;
2064
struct irq_domain *ciu_domain = NULL;
2065
2066
octeon_irq_init_ciu2_percpu();
2067
octeon_irq_setup_secondary = octeon_irq_setup_secondary_ciu2;
2068
2069
octeon_irq_gpio_chip = &octeon_irq_chip_ciu2_gpio;
2070
octeon_irq_ip2 = octeon_irq_ciu2;
2071
octeon_irq_ip3 = octeon_irq_ciu2_mbox;
2072
octeon_irq_ip4 = octeon_irq_ip4_mask;
2073
2074
/* Mips internal */
2075
octeon_irq_init_core();
2076
2077
ciu_domain = irq_domain_create_tree(of_fwnode_handle(ciu_node), &octeon_irq_domain_ciu2_ops,
2078
NULL);
2079
irq_set_default_domain(ciu_domain);
2080
2081
/* CUI2 */
2082
for (i = 0; i < 64; i++) {
2083
r = octeon_irq_force_ciu_mapping(
2084
ciu_domain, i + OCTEON_IRQ_WORKQ0, 0, i);
2085
if (r)
2086
goto err;
2087
}
2088
2089
for (i = 0; i < 32; i++) {
2090
r = octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_WDOG0, 1, i, 0,
2091
&octeon_irq_chip_ciu2_wd, handle_level_irq);
2092
if (r)
2093
goto err;
2094
}
2095
2096
for (i = 0; i < 4; i++) {
2097
r = octeon_irq_force_ciu_mapping(
2098
ciu_domain, i + OCTEON_IRQ_TIMER0, 3, i + 8);
2099
if (r)
2100
goto err;
2101
}
2102
2103
for (i = 0; i < 4; i++) {
2104
r = octeon_irq_force_ciu_mapping(
2105
ciu_domain, i + OCTEON_IRQ_PCI_INT0, 4, i);
2106
if (r)
2107
goto err;
2108
}
2109
2110
for (i = 0; i < 4; i++) {
2111
r = octeon_irq_force_ciu_mapping(
2112
ciu_domain, i + OCTEON_IRQ_PCI_MSI0, 4, i + 8);
2113
if (r)
2114
goto err;
2115
}
2116
2117
irq_set_chip_and_handler(OCTEON_IRQ_MBOX0, &octeon_irq_chip_ciu2_mbox, handle_percpu_irq);
2118
irq_set_chip_and_handler(OCTEON_IRQ_MBOX1, &octeon_irq_chip_ciu2_mbox, handle_percpu_irq);
2119
irq_set_chip_and_handler(OCTEON_IRQ_MBOX2, &octeon_irq_chip_ciu2_mbox, handle_percpu_irq);
2120
irq_set_chip_and_handler(OCTEON_IRQ_MBOX3, &octeon_irq_chip_ciu2_mbox, handle_percpu_irq);
2121
2122
/* Enable the CIU lines */
2123
set_c0_status(STATUSF_IP3 | STATUSF_IP2);
2124
clear_c0_status(STATUSF_IP4);
2125
return 0;
2126
err:
2127
return r;
2128
}
2129
2130
struct octeon_irq_cib_host_data {
2131
raw_spinlock_t lock;
2132
u64 raw_reg;
2133
u64 en_reg;
2134
int max_bits;
2135
};
2136
2137
struct octeon_irq_cib_chip_data {
2138
struct octeon_irq_cib_host_data *host_data;
2139
int bit;
2140
};
2141
2142
static void octeon_irq_cib_enable(struct irq_data *data)
2143
{
2144
unsigned long flags;
2145
u64 en;
2146
struct octeon_irq_cib_chip_data *cd = irq_data_get_irq_chip_data(data);
2147
struct octeon_irq_cib_host_data *host_data = cd->host_data;
2148
2149
raw_spin_lock_irqsave(&host_data->lock, flags);
2150
en = cvmx_read_csr(host_data->en_reg);
2151
en |= 1ull << cd->bit;
2152
cvmx_write_csr(host_data->en_reg, en);
2153
raw_spin_unlock_irqrestore(&host_data->lock, flags);
2154
}
2155
2156
static void octeon_irq_cib_disable(struct irq_data *data)
2157
{
2158
unsigned long flags;
2159
u64 en;
2160
struct octeon_irq_cib_chip_data *cd = irq_data_get_irq_chip_data(data);
2161
struct octeon_irq_cib_host_data *host_data = cd->host_data;
2162
2163
raw_spin_lock_irqsave(&host_data->lock, flags);
2164
en = cvmx_read_csr(host_data->en_reg);
2165
en &= ~(1ull << cd->bit);
2166
cvmx_write_csr(host_data->en_reg, en);
2167
raw_spin_unlock_irqrestore(&host_data->lock, flags);
2168
}
2169
2170
static int octeon_irq_cib_set_type(struct irq_data *data, unsigned int t)
2171
{
2172
irqd_set_trigger_type(data, t);
2173
return IRQ_SET_MASK_OK;
2174
}
2175
2176
static struct irq_chip octeon_irq_chip_cib = {
2177
.name = "CIB",
2178
.irq_enable = octeon_irq_cib_enable,
2179
.irq_disable = octeon_irq_cib_disable,
2180
.irq_mask = octeon_irq_cib_disable,
2181
.irq_unmask = octeon_irq_cib_enable,
2182
.irq_set_type = octeon_irq_cib_set_type,
2183
};
2184
2185
static int octeon_irq_cib_xlat(struct irq_domain *d,
2186
struct device_node *node,
2187
const u32 *intspec,
2188
unsigned int intsize,
2189
unsigned long *out_hwirq,
2190
unsigned int *out_type)
2191
{
2192
unsigned int type = 0;
2193
2194
if (intsize == 2)
2195
type = intspec[1];
2196
2197
switch (type) {
2198
case 0: /* unofficial value, but we might as well let it work. */
2199
case 4: /* official value for level triggering. */
2200
*out_type = IRQ_TYPE_LEVEL_HIGH;
2201
break;
2202
case 1: /* official value for edge triggering. */
2203
*out_type = IRQ_TYPE_EDGE_RISING;
2204
break;
2205
default: /* Nothing else is acceptable. */
2206
return -EINVAL;
2207
}
2208
2209
*out_hwirq = intspec[0];
2210
2211
return 0;
2212
}
2213
2214
static int octeon_irq_cib_map(struct irq_domain *d,
2215
unsigned int virq, irq_hw_number_t hw)
2216
{
2217
struct octeon_irq_cib_host_data *host_data = d->host_data;
2218
struct octeon_irq_cib_chip_data *cd;
2219
2220
if (hw >= host_data->max_bits) {
2221
pr_err("ERROR: %s mapping %u is too big!\n",
2222
irq_domain_get_of_node(d)->name, (unsigned)hw);
2223
return -EINVAL;
2224
}
2225
2226
cd = kzalloc(sizeof(*cd), GFP_KERNEL);
2227
if (!cd)
2228
return -ENOMEM;
2229
2230
cd->host_data = host_data;
2231
cd->bit = hw;
2232
2233
irq_set_chip_and_handler(virq, &octeon_irq_chip_cib,
2234
handle_simple_irq);
2235
irq_set_chip_data(virq, cd);
2236
return 0;
2237
}
2238
2239
static const struct irq_domain_ops octeon_irq_domain_cib_ops = {
2240
.map = octeon_irq_cib_map,
2241
.unmap = octeon_irq_free_cd,
2242
.xlate = octeon_irq_cib_xlat,
2243
};
2244
2245
/* Chain to real handler. */
2246
static irqreturn_t octeon_irq_cib_handler(int my_irq, void *data)
2247
{
2248
u64 en;
2249
u64 raw;
2250
u64 bits;
2251
int i;
2252
int irq;
2253
struct irq_domain *cib_domain = data;
2254
struct octeon_irq_cib_host_data *host_data = cib_domain->host_data;
2255
2256
en = cvmx_read_csr(host_data->en_reg);
2257
raw = cvmx_read_csr(host_data->raw_reg);
2258
2259
bits = en & raw;
2260
2261
for (i = 0; i < host_data->max_bits; i++) {
2262
if ((bits & 1ull << i) == 0)
2263
continue;
2264
irq = irq_find_mapping(cib_domain, i);
2265
if (!irq) {
2266
unsigned long flags;
2267
2268
pr_err("ERROR: CIB bit %d@%llx IRQ unhandled, disabling\n",
2269
i, host_data->raw_reg);
2270
raw_spin_lock_irqsave(&host_data->lock, flags);
2271
en = cvmx_read_csr(host_data->en_reg);
2272
en &= ~(1ull << i);
2273
cvmx_write_csr(host_data->en_reg, en);
2274
cvmx_write_csr(host_data->raw_reg, 1ull << i);
2275
raw_spin_unlock_irqrestore(&host_data->lock, flags);
2276
} else {
2277
struct irq_desc *desc = irq_to_desc(irq);
2278
struct irq_data *irq_data = irq_desc_get_irq_data(desc);
2279
/* If edge, acknowledge the bit we will be sending. */
2280
if (irqd_get_trigger_type(irq_data) &
2281
IRQ_TYPE_EDGE_BOTH)
2282
cvmx_write_csr(host_data->raw_reg, 1ull << i);
2283
generic_handle_irq_desc(desc);
2284
}
2285
}
2286
2287
return IRQ_HANDLED;
2288
}
2289
2290
static int __init octeon_irq_init_cib(struct device_node *ciu_node,
2291
struct device_node *parent)
2292
{
2293
struct resource res;
2294
u32 val;
2295
struct octeon_irq_cib_host_data *host_data;
2296
int parent_irq;
2297
int r;
2298
struct irq_domain *cib_domain;
2299
2300
parent_irq = irq_of_parse_and_map(ciu_node, 0);
2301
if (!parent_irq) {
2302
pr_err("ERROR: Couldn't acquire parent_irq for %pOFn\n",
2303
ciu_node);
2304
return -EINVAL;
2305
}
2306
2307
host_data = kzalloc(sizeof(*host_data), GFP_KERNEL);
2308
if (!host_data)
2309
return -ENOMEM;
2310
raw_spin_lock_init(&host_data->lock);
2311
2312
r = of_address_to_resource(ciu_node, 0, &res);
2313
if (r) {
2314
pr_err("ERROR: Couldn't acquire reg(0) %pOFn\n", ciu_node);
2315
return r;
2316
}
2317
host_data->raw_reg = (u64)phys_to_virt(res.start);
2318
2319
r = of_address_to_resource(ciu_node, 1, &res);
2320
if (r) {
2321
pr_err("ERROR: Couldn't acquire reg(1) %pOFn\n", ciu_node);
2322
return r;
2323
}
2324
host_data->en_reg = (u64)phys_to_virt(res.start);
2325
2326
r = of_property_read_u32(ciu_node, "cavium,max-bits", &val);
2327
if (r) {
2328
pr_err("ERROR: Couldn't read cavium,max-bits from %pOFn\n",
2329
ciu_node);
2330
return r;
2331
}
2332
host_data->max_bits = val;
2333
2334
cib_domain = irq_domain_create_linear(of_fwnode_handle(ciu_node),
2335
host_data->max_bits,
2336
&octeon_irq_domain_cib_ops,
2337
host_data);
2338
if (!cib_domain) {
2339
pr_err("ERROR: Couldn't irq_domain_create_linear()\n");
2340
return -ENOMEM;
2341
}
2342
2343
cvmx_write_csr(host_data->en_reg, 0); /* disable all IRQs */
2344
cvmx_write_csr(host_data->raw_reg, ~0); /* ack any outstanding */
2345
2346
r = request_irq(parent_irq, octeon_irq_cib_handler,
2347
IRQF_NO_THREAD, "cib", cib_domain);
2348
if (r) {
2349
pr_err("request_irq cib failed %d\n", r);
2350
return r;
2351
}
2352
pr_info("CIB interrupt controller probed: %llx %d\n",
2353
host_data->raw_reg, host_data->max_bits);
2354
return 0;
2355
}
2356
2357
int octeon_irq_ciu3_xlat(struct irq_domain *d,
2358
struct device_node *node,
2359
const u32 *intspec,
2360
unsigned int intsize,
2361
unsigned long *out_hwirq,
2362
unsigned int *out_type)
2363
{
2364
struct octeon_ciu3_info *ciu3_info = d->host_data;
2365
unsigned int hwirq, type, intsn_major;
2366
union cvmx_ciu3_iscx_ctl isc;
2367
2368
if (intsize < 2)
2369
return -EINVAL;
2370
hwirq = intspec[0];
2371
type = intspec[1];
2372
2373
if (hwirq >= (1 << 20))
2374
return -EINVAL;
2375
2376
intsn_major = hwirq >> 12;
2377
switch (intsn_major) {
2378
case 0x04: /* Software handled separately. */
2379
return -EINVAL;
2380
default:
2381
break;
2382
}
2383
2384
isc.u64 = cvmx_read_csr(ciu3_info->ciu3_addr + CIU3_ISC_CTL(hwirq));
2385
if (!isc.s.imp)
2386
return -EINVAL;
2387
2388
switch (type) {
2389
case 4: /* official value for level triggering. */
2390
*out_type = IRQ_TYPE_LEVEL_HIGH;
2391
break;
2392
case 0: /* unofficial value, but we might as well let it work. */
2393
case 1: /* official value for edge triggering. */
2394
*out_type = IRQ_TYPE_EDGE_RISING;
2395
break;
2396
default: /* Nothing else is acceptable. */
2397
return -EINVAL;
2398
}
2399
2400
*out_hwirq = hwirq;
2401
2402
return 0;
2403
}
2404
2405
void octeon_irq_ciu3_enable(struct irq_data *data)
2406
{
2407
int cpu;
2408
union cvmx_ciu3_iscx_ctl isc_ctl;
2409
union cvmx_ciu3_iscx_w1c isc_w1c;
2410
u64 isc_ctl_addr;
2411
2412
struct octeon_ciu_chip_data *cd;
2413
2414
cpu = next_cpu_for_irq(data);
2415
2416
cd = irq_data_get_irq_chip_data(data);
2417
2418
isc_w1c.u64 = 0;
2419
isc_w1c.s.en = 1;
2420
cvmx_write_csr(cd->ciu3_addr + CIU3_ISC_W1C(cd->intsn), isc_w1c.u64);
2421
2422
isc_ctl_addr = cd->ciu3_addr + CIU3_ISC_CTL(cd->intsn);
2423
isc_ctl.u64 = 0;
2424
isc_ctl.s.en = 1;
2425
isc_ctl.s.idt = per_cpu(octeon_irq_ciu3_idt_ip2, cpu);
2426
cvmx_write_csr(isc_ctl_addr, isc_ctl.u64);
2427
cvmx_read_csr(isc_ctl_addr);
2428
}
2429
2430
void octeon_irq_ciu3_disable(struct irq_data *data)
2431
{
2432
u64 isc_ctl_addr;
2433
union cvmx_ciu3_iscx_w1c isc_w1c;
2434
2435
struct octeon_ciu_chip_data *cd;
2436
2437
cd = irq_data_get_irq_chip_data(data);
2438
2439
isc_w1c.u64 = 0;
2440
isc_w1c.s.en = 1;
2441
2442
isc_ctl_addr = cd->ciu3_addr + CIU3_ISC_CTL(cd->intsn);
2443
cvmx_write_csr(cd->ciu3_addr + CIU3_ISC_W1C(cd->intsn), isc_w1c.u64);
2444
cvmx_write_csr(isc_ctl_addr, 0);
2445
cvmx_read_csr(isc_ctl_addr);
2446
}
2447
2448
void octeon_irq_ciu3_ack(struct irq_data *data)
2449
{
2450
u64 isc_w1c_addr;
2451
union cvmx_ciu3_iscx_w1c isc_w1c;
2452
struct octeon_ciu_chip_data *cd;
2453
u32 trigger_type = irqd_get_trigger_type(data);
2454
2455
/*
2456
* We use a single irq_chip, so we have to do nothing to ack a
2457
* level interrupt.
2458
*/
2459
if (!(trigger_type & IRQ_TYPE_EDGE_BOTH))
2460
return;
2461
2462
cd = irq_data_get_irq_chip_data(data);
2463
2464
isc_w1c.u64 = 0;
2465
isc_w1c.s.raw = 1;
2466
2467
isc_w1c_addr = cd->ciu3_addr + CIU3_ISC_W1C(cd->intsn);
2468
cvmx_write_csr(isc_w1c_addr, isc_w1c.u64);
2469
cvmx_read_csr(isc_w1c_addr);
2470
}
2471
2472
void octeon_irq_ciu3_mask(struct irq_data *data)
2473
{
2474
union cvmx_ciu3_iscx_w1c isc_w1c;
2475
u64 isc_w1c_addr;
2476
struct octeon_ciu_chip_data *cd;
2477
2478
cd = irq_data_get_irq_chip_data(data);
2479
2480
isc_w1c.u64 = 0;
2481
isc_w1c.s.en = 1;
2482
2483
isc_w1c_addr = cd->ciu3_addr + CIU3_ISC_W1C(cd->intsn);
2484
cvmx_write_csr(isc_w1c_addr, isc_w1c.u64);
2485
cvmx_read_csr(isc_w1c_addr);
2486
}
2487
2488
void octeon_irq_ciu3_mask_ack(struct irq_data *data)
2489
{
2490
union cvmx_ciu3_iscx_w1c isc_w1c;
2491
u64 isc_w1c_addr;
2492
struct octeon_ciu_chip_data *cd;
2493
u32 trigger_type = irqd_get_trigger_type(data);
2494
2495
cd = irq_data_get_irq_chip_data(data);
2496
2497
isc_w1c.u64 = 0;
2498
isc_w1c.s.en = 1;
2499
2500
/*
2501
* We use a single irq_chip, so only ack an edge (!level)
2502
* interrupt.
2503
*/
2504
if (trigger_type & IRQ_TYPE_EDGE_BOTH)
2505
isc_w1c.s.raw = 1;
2506
2507
isc_w1c_addr = cd->ciu3_addr + CIU3_ISC_W1C(cd->intsn);
2508
cvmx_write_csr(isc_w1c_addr, isc_w1c.u64);
2509
cvmx_read_csr(isc_w1c_addr);
2510
}
2511
2512
#ifdef CONFIG_SMP
2513
static int octeon_irq_ciu3_set_affinity(struct irq_data *data,
2514
const struct cpumask *dest, bool force)
2515
{
2516
union cvmx_ciu3_iscx_ctl isc_ctl;
2517
union cvmx_ciu3_iscx_w1c isc_w1c;
2518
u64 isc_ctl_addr;
2519
int cpu;
2520
bool enable_one = !irqd_irq_disabled(data) && !irqd_irq_masked(data);
2521
struct octeon_ciu_chip_data *cd = irq_data_get_irq_chip_data(data);
2522
2523
if (!cpumask_subset(dest, cpumask_of_node(cd->ciu_node)))
2524
return -EINVAL;
2525
2526
if (!enable_one)
2527
return IRQ_SET_MASK_OK;
2528
2529
cd = irq_data_get_irq_chip_data(data);
2530
cpu = cpumask_first(dest);
2531
if (cpu >= nr_cpu_ids)
2532
cpu = smp_processor_id();
2533
cd->current_cpu = cpu;
2534
2535
isc_w1c.u64 = 0;
2536
isc_w1c.s.en = 1;
2537
cvmx_write_csr(cd->ciu3_addr + CIU3_ISC_W1C(cd->intsn), isc_w1c.u64);
2538
2539
isc_ctl_addr = cd->ciu3_addr + CIU3_ISC_CTL(cd->intsn);
2540
isc_ctl.u64 = 0;
2541
isc_ctl.s.en = 1;
2542
isc_ctl.s.idt = per_cpu(octeon_irq_ciu3_idt_ip2, cpu);
2543
cvmx_write_csr(isc_ctl_addr, isc_ctl.u64);
2544
cvmx_read_csr(isc_ctl_addr);
2545
2546
return IRQ_SET_MASK_OK;
2547
}
2548
#endif
2549
2550
static struct irq_chip octeon_irq_chip_ciu3 = {
2551
.name = "CIU3",
2552
.irq_startup = edge_startup,
2553
.irq_enable = octeon_irq_ciu3_enable,
2554
.irq_disable = octeon_irq_ciu3_disable,
2555
.irq_ack = octeon_irq_ciu3_ack,
2556
.irq_mask = octeon_irq_ciu3_mask,
2557
.irq_mask_ack = octeon_irq_ciu3_mask_ack,
2558
.irq_unmask = octeon_irq_ciu3_enable,
2559
.irq_set_type = octeon_irq_ciu_set_type,
2560
#ifdef CONFIG_SMP
2561
.irq_set_affinity = octeon_irq_ciu3_set_affinity,
2562
.irq_cpu_offline = octeon_irq_cpu_offline_ciu,
2563
#endif
2564
};
2565
2566
int octeon_irq_ciu3_mapx(struct irq_domain *d, unsigned int virq,
2567
irq_hw_number_t hw, struct irq_chip *chip)
2568
{
2569
struct octeon_ciu3_info *ciu3_info = d->host_data;
2570
struct octeon_ciu_chip_data *cd = kzalloc_node(sizeof(*cd), GFP_KERNEL,
2571
ciu3_info->node);
2572
if (!cd)
2573
return -ENOMEM;
2574
cd->intsn = hw;
2575
cd->current_cpu = -1;
2576
cd->ciu3_addr = ciu3_info->ciu3_addr;
2577
cd->ciu_node = ciu3_info->node;
2578
irq_set_chip_and_handler(virq, chip, handle_edge_irq);
2579
irq_set_chip_data(virq, cd);
2580
2581
return 0;
2582
}
2583
2584
static int octeon_irq_ciu3_map(struct irq_domain *d,
2585
unsigned int virq, irq_hw_number_t hw)
2586
{
2587
return octeon_irq_ciu3_mapx(d, virq, hw, &octeon_irq_chip_ciu3);
2588
}
2589
2590
static const struct irq_domain_ops octeon_dflt_domain_ciu3_ops = {
2591
.map = octeon_irq_ciu3_map,
2592
.unmap = octeon_irq_free_cd,
2593
.xlate = octeon_irq_ciu3_xlat,
2594
};
2595
2596
static void octeon_irq_ciu3_ip2(void)
2597
{
2598
union cvmx_ciu3_destx_pp_int dest_pp_int;
2599
struct octeon_ciu3_info *ciu3_info;
2600
u64 ciu3_addr;
2601
2602
ciu3_info = __this_cpu_read(octeon_ciu3_info);
2603
ciu3_addr = ciu3_info->ciu3_addr;
2604
2605
dest_pp_int.u64 = cvmx_read_csr(ciu3_addr + CIU3_DEST_PP_INT(3 * cvmx_get_local_core_num()));
2606
2607
if (likely(dest_pp_int.s.intr)) {
2608
irq_hw_number_t intsn = dest_pp_int.s.intsn;
2609
irq_hw_number_t hw;
2610
struct irq_domain *domain;
2611
/* Get the domain to use from the major block */
2612
int block = intsn >> 12;
2613
int ret;
2614
2615
domain = ciu3_info->domain[block];
2616
if (ciu3_info->intsn2hw[block])
2617
hw = ciu3_info->intsn2hw[block](domain, intsn);
2618
else
2619
hw = intsn;
2620
2621
irq_enter();
2622
ret = generic_handle_domain_irq(domain, hw);
2623
irq_exit();
2624
2625
if (ret < 0) {
2626
union cvmx_ciu3_iscx_w1c isc_w1c;
2627
u64 isc_w1c_addr = ciu3_addr + CIU3_ISC_W1C(intsn);
2628
2629
isc_w1c.u64 = 0;
2630
isc_w1c.s.en = 1;
2631
cvmx_write_csr(isc_w1c_addr, isc_w1c.u64);
2632
cvmx_read_csr(isc_w1c_addr);
2633
spurious_interrupt();
2634
}
2635
} else {
2636
spurious_interrupt();
2637
}
2638
}
2639
2640
/*
2641
* 10 mbox per core starting from zero.
2642
* Base mbox is core * 10
2643
*/
2644
static unsigned int octeon_irq_ciu3_base_mbox_intsn(int core)
2645
{
2646
/* SW (mbox) are 0x04 in bits 12..19 */
2647
return 0x04000 + CIU3_MBOX_PER_CORE * core;
2648
}
2649
2650
static unsigned int octeon_irq_ciu3_mbox_intsn_for_core(int core, unsigned int mbox)
2651
{
2652
return octeon_irq_ciu3_base_mbox_intsn(core) + mbox;
2653
}
2654
2655
static unsigned int octeon_irq_ciu3_mbox_intsn_for_cpu(int cpu, unsigned int mbox)
2656
{
2657
int local_core = octeon_coreid_for_cpu(cpu) & 0x3f;
2658
2659
return octeon_irq_ciu3_mbox_intsn_for_core(local_core, mbox);
2660
}
2661
2662
static void octeon_irq_ciu3_mbox(void)
2663
{
2664
union cvmx_ciu3_destx_pp_int dest_pp_int;
2665
struct octeon_ciu3_info *ciu3_info;
2666
u64 ciu3_addr;
2667
int core = cvmx_get_local_core_num();
2668
2669
ciu3_info = __this_cpu_read(octeon_ciu3_info);
2670
ciu3_addr = ciu3_info->ciu3_addr;
2671
2672
dest_pp_int.u64 = cvmx_read_csr(ciu3_addr + CIU3_DEST_PP_INT(1 + 3 * core));
2673
2674
if (likely(dest_pp_int.s.intr)) {
2675
irq_hw_number_t intsn = dest_pp_int.s.intsn;
2676
int mbox = intsn - octeon_irq_ciu3_base_mbox_intsn(core);
2677
2678
if (likely(mbox >= 0 && mbox < CIU3_MBOX_PER_CORE)) {
2679
do_IRQ(mbox + OCTEON_IRQ_MBOX0);
2680
} else {
2681
union cvmx_ciu3_iscx_w1c isc_w1c;
2682
u64 isc_w1c_addr = ciu3_addr + CIU3_ISC_W1C(intsn);
2683
2684
isc_w1c.u64 = 0;
2685
isc_w1c.s.en = 1;
2686
cvmx_write_csr(isc_w1c_addr, isc_w1c.u64);
2687
cvmx_read_csr(isc_w1c_addr);
2688
spurious_interrupt();
2689
}
2690
} else {
2691
spurious_interrupt();
2692
}
2693
}
2694
2695
void octeon_ciu3_mbox_send(int cpu, unsigned int mbox)
2696
{
2697
struct octeon_ciu3_info *ciu3_info;
2698
unsigned int intsn;
2699
union cvmx_ciu3_iscx_w1s isc_w1s;
2700
u64 isc_w1s_addr;
2701
2702
if (WARN_ON_ONCE(mbox >= CIU3_MBOX_PER_CORE))
2703
return;
2704
2705
intsn = octeon_irq_ciu3_mbox_intsn_for_cpu(cpu, mbox);
2706
ciu3_info = per_cpu(octeon_ciu3_info, cpu);
2707
isc_w1s_addr = ciu3_info->ciu3_addr + CIU3_ISC_W1S(intsn);
2708
2709
isc_w1s.u64 = 0;
2710
isc_w1s.s.raw = 1;
2711
2712
cvmx_write_csr(isc_w1s_addr, isc_w1s.u64);
2713
cvmx_read_csr(isc_w1s_addr);
2714
}
2715
2716
static void octeon_irq_ciu3_mbox_set_enable(struct irq_data *data, int cpu, bool en)
2717
{
2718
struct octeon_ciu3_info *ciu3_info;
2719
unsigned int intsn;
2720
u64 isc_ctl_addr, isc_w1c_addr;
2721
union cvmx_ciu3_iscx_ctl isc_ctl;
2722
unsigned int mbox = data->irq - OCTEON_IRQ_MBOX0;
2723
2724
intsn = octeon_irq_ciu3_mbox_intsn_for_cpu(cpu, mbox);
2725
ciu3_info = per_cpu(octeon_ciu3_info, cpu);
2726
isc_w1c_addr = ciu3_info->ciu3_addr + CIU3_ISC_W1C(intsn);
2727
isc_ctl_addr = ciu3_info->ciu3_addr + CIU3_ISC_CTL(intsn);
2728
2729
isc_ctl.u64 = 0;
2730
isc_ctl.s.en = 1;
2731
2732
cvmx_write_csr(isc_w1c_addr, isc_ctl.u64);
2733
cvmx_write_csr(isc_ctl_addr, 0);
2734
if (en) {
2735
unsigned int idt = per_cpu(octeon_irq_ciu3_idt_ip3, cpu);
2736
2737
isc_ctl.u64 = 0;
2738
isc_ctl.s.en = 1;
2739
isc_ctl.s.idt = idt;
2740
cvmx_write_csr(isc_ctl_addr, isc_ctl.u64);
2741
}
2742
cvmx_read_csr(isc_ctl_addr);
2743
}
2744
2745
static void octeon_irq_ciu3_mbox_enable(struct irq_data *data)
2746
{
2747
int cpu;
2748
unsigned int mbox = data->irq - OCTEON_IRQ_MBOX0;
2749
2750
WARN_ON(mbox >= CIU3_MBOX_PER_CORE);
2751
2752
for_each_online_cpu(cpu)
2753
octeon_irq_ciu3_mbox_set_enable(data, cpu, true);
2754
}
2755
2756
static void octeon_irq_ciu3_mbox_disable(struct irq_data *data)
2757
{
2758
int cpu;
2759
unsigned int mbox = data->irq - OCTEON_IRQ_MBOX0;
2760
2761
WARN_ON(mbox >= CIU3_MBOX_PER_CORE);
2762
2763
for_each_online_cpu(cpu)
2764
octeon_irq_ciu3_mbox_set_enable(data, cpu, false);
2765
}
2766
2767
static void octeon_irq_ciu3_mbox_ack(struct irq_data *data)
2768
{
2769
struct octeon_ciu3_info *ciu3_info;
2770
unsigned int intsn;
2771
u64 isc_w1c_addr;
2772
union cvmx_ciu3_iscx_w1c isc_w1c;
2773
unsigned int mbox = data->irq - OCTEON_IRQ_MBOX0;
2774
2775
intsn = octeon_irq_ciu3_mbox_intsn_for_core(cvmx_get_local_core_num(), mbox);
2776
2777
isc_w1c.u64 = 0;
2778
isc_w1c.s.raw = 1;
2779
2780
ciu3_info = __this_cpu_read(octeon_ciu3_info);
2781
isc_w1c_addr = ciu3_info->ciu3_addr + CIU3_ISC_W1C(intsn);
2782
cvmx_write_csr(isc_w1c_addr, isc_w1c.u64);
2783
cvmx_read_csr(isc_w1c_addr);
2784
}
2785
2786
static void octeon_irq_ciu3_mbox_cpu_online(struct irq_data *data)
2787
{
2788
octeon_irq_ciu3_mbox_set_enable(data, smp_processor_id(), true);
2789
}
2790
2791
static void octeon_irq_ciu3_mbox_cpu_offline(struct irq_data *data)
2792
{
2793
octeon_irq_ciu3_mbox_set_enable(data, smp_processor_id(), false);
2794
}
2795
2796
static int octeon_irq_ciu3_alloc_resources(struct octeon_ciu3_info *ciu3_info)
2797
{
2798
u64 b = ciu3_info->ciu3_addr;
2799
int idt_ip2, idt_ip3, idt_ip4;
2800
int unused_idt2;
2801
int core = cvmx_get_local_core_num();
2802
int i;
2803
2804
__this_cpu_write(octeon_ciu3_info, ciu3_info);
2805
2806
/*
2807
* 4 idt per core starting from 1 because zero is reserved.
2808
* Base idt per core is 4 * core + 1
2809
*/
2810
idt_ip2 = core * 4 + 1;
2811
idt_ip3 = core * 4 + 2;
2812
idt_ip4 = core * 4 + 3;
2813
unused_idt2 = core * 4 + 4;
2814
__this_cpu_write(octeon_irq_ciu3_idt_ip2, idt_ip2);
2815
__this_cpu_write(octeon_irq_ciu3_idt_ip3, idt_ip3);
2816
2817
/* ip2 interrupts for this CPU */
2818
cvmx_write_csr(b + CIU3_IDT_CTL(idt_ip2), 0);
2819
cvmx_write_csr(b + CIU3_IDT_PP(idt_ip2, 0), 1ull << core);
2820
cvmx_write_csr(b + CIU3_IDT_IO(idt_ip2), 0);
2821
2822
/* ip3 interrupts for this CPU */
2823
cvmx_write_csr(b + CIU3_IDT_CTL(idt_ip3), 1);
2824
cvmx_write_csr(b + CIU3_IDT_PP(idt_ip3, 0), 1ull << core);
2825
cvmx_write_csr(b + CIU3_IDT_IO(idt_ip3), 0);
2826
2827
/* ip4 interrupts for this CPU */
2828
cvmx_write_csr(b + CIU3_IDT_CTL(idt_ip4), 2);
2829
cvmx_write_csr(b + CIU3_IDT_PP(idt_ip4, 0), 0);
2830
cvmx_write_csr(b + CIU3_IDT_IO(idt_ip4), 0);
2831
2832
cvmx_write_csr(b + CIU3_IDT_CTL(unused_idt2), 0);
2833
cvmx_write_csr(b + CIU3_IDT_PP(unused_idt2, 0), 0);
2834
cvmx_write_csr(b + CIU3_IDT_IO(unused_idt2), 0);
2835
2836
for (i = 0; i < CIU3_MBOX_PER_CORE; i++) {
2837
unsigned int intsn = octeon_irq_ciu3_mbox_intsn_for_core(core, i);
2838
2839
cvmx_write_csr(b + CIU3_ISC_W1C(intsn), 2);
2840
cvmx_write_csr(b + CIU3_ISC_CTL(intsn), 0);
2841
}
2842
2843
return 0;
2844
}
2845
2846
static void octeon_irq_setup_secondary_ciu3(void)
2847
{
2848
struct octeon_ciu3_info *ciu3_info;
2849
2850
ciu3_info = octeon_ciu3_info_per_node[cvmx_get_node_num()];
2851
octeon_irq_ciu3_alloc_resources(ciu3_info);
2852
irq_cpu_online();
2853
2854
/* Enable the CIU lines */
2855
set_c0_status(STATUSF_IP3 | STATUSF_IP2);
2856
if (octeon_irq_use_ip4)
2857
set_c0_status(STATUSF_IP4);
2858
else
2859
clear_c0_status(STATUSF_IP4);
2860
}
2861
2862
static struct irq_chip octeon_irq_chip_ciu3_mbox = {
2863
.name = "CIU3-M",
2864
.irq_enable = octeon_irq_ciu3_mbox_enable,
2865
.irq_disable = octeon_irq_ciu3_mbox_disable,
2866
.irq_ack = octeon_irq_ciu3_mbox_ack,
2867
2868
.irq_cpu_online = octeon_irq_ciu3_mbox_cpu_online,
2869
.irq_cpu_offline = octeon_irq_ciu3_mbox_cpu_offline,
2870
.flags = IRQCHIP_ONOFFLINE_ENABLED,
2871
};
2872
2873
static int __init octeon_irq_init_ciu3(struct device_node *ciu_node,
2874
struct device_node *parent)
2875
{
2876
int i, ret;
2877
int node;
2878
struct irq_domain *domain;
2879
struct octeon_ciu3_info *ciu3_info;
2880
struct resource res;
2881
u64 base_addr;
2882
union cvmx_ciu3_const consts;
2883
2884
node = 0; /* of_node_to_nid(ciu_node); */
2885
ciu3_info = kzalloc_node(sizeof(*ciu3_info), GFP_KERNEL, node);
2886
2887
if (!ciu3_info)
2888
return -ENOMEM;
2889
2890
ret = of_address_to_resource(ciu_node, 0, &res);
2891
if (WARN_ON(ret))
2892
return ret;
2893
2894
ciu3_info->ciu3_addr = base_addr = (u64)phys_to_virt(res.start);
2895
ciu3_info->node = node;
2896
2897
consts.u64 = cvmx_read_csr(base_addr + CIU3_CONST);
2898
2899
octeon_irq_setup_secondary = octeon_irq_setup_secondary_ciu3;
2900
2901
octeon_irq_ip2 = octeon_irq_ciu3_ip2;
2902
octeon_irq_ip3 = octeon_irq_ciu3_mbox;
2903
octeon_irq_ip4 = octeon_irq_ip4_mask;
2904
2905
if (node == cvmx_get_node_num()) {
2906
/* Mips internal */
2907
octeon_irq_init_core();
2908
2909
/* Only do per CPU things if it is the CIU of the boot node. */
2910
i = irq_alloc_descs_from(OCTEON_IRQ_MBOX0, 8, node);
2911
WARN_ON(i < 0);
2912
2913
for (i = 0; i < 8; i++)
2914
irq_set_chip_and_handler(i + OCTEON_IRQ_MBOX0,
2915
&octeon_irq_chip_ciu3_mbox, handle_percpu_irq);
2916
}
2917
2918
/*
2919
* Initialize all domains to use the default domain. Specific major
2920
* blocks will overwrite the default domain as needed.
2921
*/
2922
domain = irq_domain_create_tree(of_fwnode_handle(ciu_node), &octeon_dflt_domain_ciu3_ops,
2923
ciu3_info);
2924
for (i = 0; i < MAX_CIU3_DOMAINS; i++)
2925
ciu3_info->domain[i] = domain;
2926
2927
octeon_ciu3_info_per_node[node] = ciu3_info;
2928
2929
if (node == cvmx_get_node_num()) {
2930
/* Only do per CPU things if it is the CIU of the boot node. */
2931
octeon_irq_ciu3_alloc_resources(ciu3_info);
2932
if (node == 0)
2933
irq_set_default_domain(domain);
2934
2935
octeon_irq_use_ip4 = false;
2936
/* Enable the CIU lines */
2937
set_c0_status(STATUSF_IP2 | STATUSF_IP3);
2938
clear_c0_status(STATUSF_IP4);
2939
}
2940
2941
return 0;
2942
}
2943
2944
static struct of_device_id ciu_types[] __initdata = {
2945
{.compatible = "cavium,octeon-3860-ciu", .data = octeon_irq_init_ciu},
2946
{.compatible = "cavium,octeon-3860-gpio", .data = octeon_irq_init_gpio},
2947
{.compatible = "cavium,octeon-6880-ciu2", .data = octeon_irq_init_ciu2},
2948
{.compatible = "cavium,octeon-7890-ciu3", .data = octeon_irq_init_ciu3},
2949
{.compatible = "cavium,octeon-7130-cib", .data = octeon_irq_init_cib},
2950
{}
2951
};
2952
2953
void __init arch_init_irq(void)
2954
{
2955
#ifdef CONFIG_SMP
2956
/* Set the default affinity to the boot cpu. */
2957
cpumask_clear(irq_default_affinity);
2958
cpumask_set_cpu(smp_processor_id(), irq_default_affinity);
2959
#endif
2960
of_irq_init(ciu_types);
2961
}
2962
2963
asmlinkage void plat_irq_dispatch(void)
2964
{
2965
unsigned long cop0_cause;
2966
unsigned long cop0_status;
2967
2968
while (1) {
2969
cop0_cause = read_c0_cause();
2970
cop0_status = read_c0_status();
2971
cop0_cause &= cop0_status;
2972
cop0_cause &= ST0_IM;
2973
2974
if (cop0_cause & STATUSF_IP2)
2975
octeon_irq_ip2();
2976
else if (cop0_cause & STATUSF_IP3)
2977
octeon_irq_ip3();
2978
else if (cop0_cause & STATUSF_IP4)
2979
octeon_irq_ip4();
2980
else if (cop0_cause)
2981
do_IRQ(fls(cop0_cause) - 9 + MIPS_CPU_IRQ_BASE);
2982
else
2983
break;
2984
}
2985
}
2986
2987
#ifdef CONFIG_HOTPLUG_CPU
2988
2989
void octeon_fixup_irqs(void)
2990
{
2991
irq_cpu_offline();
2992
}
2993
2994
#endif /* CONFIG_HOTPLUG_CPU */
2995
2996
struct irq_domain *octeon_irq_get_block_domain(int node, uint8_t block)
2997
{
2998
struct octeon_ciu3_info *ciu3_info;
2999
3000
ciu3_info = octeon_ciu3_info_per_node[node & CVMX_NODE_MASK];
3001
return ciu3_info->domain[block];
3002
}
3003
EXPORT_SYMBOL(octeon_irq_get_block_domain);
3004
3005