hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/irqchip/irq-mips-gic.c
....@@ -48,7 +48,7 @@
4848
4949 static DEFINE_PER_CPU_READ_MOSTLY(unsigned long[GIC_MAX_LONGS], pcpu_masks);
5050
51
-static DEFINE_SPINLOCK(gic_lock);
51
+static DEFINE_RAW_SPINLOCK(gic_lock);
5252 static struct irq_domain *gic_irq_domain;
5353 static int gic_shared_intrs;
5454 static unsigned int gic_cpu_pin;
....@@ -209,7 +209,7 @@
209209
210210 irq = GIC_HWIRQ_TO_SHARED(d->hwirq);
211211
212
- spin_lock_irqsave(&gic_lock, flags);
212
+ raw_spin_lock_irqsave(&gic_lock, flags);
213213 switch (type & IRQ_TYPE_SENSE_MASK) {
214214 case IRQ_TYPE_EDGE_FALLING:
215215 pol = GIC_POL_FALLING_EDGE;
....@@ -249,7 +249,7 @@
249249 else
250250 irq_set_chip_handler_name_locked(d, &gic_level_irq_controller,
251251 handle_level_irq, NULL);
252
- spin_unlock_irqrestore(&gic_lock, flags);
252
+ raw_spin_unlock_irqrestore(&gic_lock, flags);
253253
254254 return 0;
255255 }
....@@ -267,7 +267,7 @@
267267 return -EINVAL;
268268
269269 /* Assumption : cpumask refers to a single CPU */
270
- spin_lock_irqsave(&gic_lock, flags);
270
+ raw_spin_lock_irqsave(&gic_lock, flags);
271271
272272 /* Re-route this IRQ */
273273 write_gic_map_vp(irq, BIT(mips_cm_vp_id(cpu)));
....@@ -278,7 +278,7 @@
278278 set_bit(irq, per_cpu_ptr(pcpu_masks, cpu));
279279
280280 irq_data_update_effective_affinity(d, cpumask_of(cpu));
281
- spin_unlock_irqrestore(&gic_lock, flags);
281
+ raw_spin_unlock_irqrestore(&gic_lock, flags);
282282
283283 return IRQ_SET_MASK_OK;
284284 }
....@@ -356,12 +356,12 @@
356356 cd = irq_data_get_irq_chip_data(d);
357357 cd->mask = false;
358358
359
- spin_lock_irqsave(&gic_lock, flags);
359
+ raw_spin_lock_irqsave(&gic_lock, flags);
360360 for_each_online_cpu(cpu) {
361361 write_gic_vl_other(mips_cm_vp_id(cpu));
362362 write_gic_vo_rmask(BIT(intr));
363363 }
364
- spin_unlock_irqrestore(&gic_lock, flags);
364
+ raw_spin_unlock_irqrestore(&gic_lock, flags);
365365 }
366366
367367 static void gic_unmask_local_irq_all_vpes(struct irq_data *d)
....@@ -374,32 +374,43 @@
374374 cd = irq_data_get_irq_chip_data(d);
375375 cd->mask = true;
376376
377
- spin_lock_irqsave(&gic_lock, flags);
377
+ raw_spin_lock_irqsave(&gic_lock, flags);
378378 for_each_online_cpu(cpu) {
379379 write_gic_vl_other(mips_cm_vp_id(cpu));
380380 write_gic_vo_smask(BIT(intr));
381381 }
382
- spin_unlock_irqrestore(&gic_lock, flags);
382
+ raw_spin_unlock_irqrestore(&gic_lock, flags);
383383 }
384384
385
-static void gic_all_vpes_irq_cpu_online(struct irq_data *d)
385
+static void gic_all_vpes_irq_cpu_online(void)
386386 {
387
- struct gic_all_vpes_chip_data *cd;
388
- unsigned int intr;
387
+ static const unsigned int local_intrs[] = {
388
+ GIC_LOCAL_INT_TIMER,
389
+ GIC_LOCAL_INT_PERFCTR,
390
+ GIC_LOCAL_INT_FDC,
391
+ };
392
+ unsigned long flags;
393
+ int i;
389394
390
- intr = GIC_HWIRQ_TO_LOCAL(d->hwirq);
391
- cd = irq_data_get_irq_chip_data(d);
395
+ raw_spin_lock_irqsave(&gic_lock, flags);
392396
393
- write_gic_vl_map(mips_gic_vx_map_reg(intr), cd->map);
394
- if (cd->mask)
395
- write_gic_vl_smask(BIT(intr));
397
+ for (i = 0; i < ARRAY_SIZE(local_intrs); i++) {
398
+ unsigned int intr = local_intrs[i];
399
+ struct gic_all_vpes_chip_data *cd;
400
+
401
+ cd = &gic_all_vpes_chip_data[intr];
402
+ write_gic_vl_map(mips_gic_vx_map_reg(intr), cd->map);
403
+ if (cd->mask)
404
+ write_gic_vl_smask(BIT(intr));
405
+ }
406
+
407
+ raw_spin_unlock_irqrestore(&gic_lock, flags);
396408 }
397409
398410 static struct irq_chip gic_all_vpes_local_irq_controller = {
399411 .name = "MIPS GIC Local",
400412 .irq_mask = gic_mask_local_irq_all_vpes,
401413 .irq_unmask = gic_unmask_local_irq_all_vpes,
402
- .irq_cpu_online = gic_all_vpes_irq_cpu_online,
403414 };
404415
405416 static void __gic_irq_dispatch(void)
....@@ -423,11 +434,11 @@
423434
424435 data = irq_get_irq_data(virq);
425436
426
- spin_lock_irqsave(&gic_lock, flags);
437
+ raw_spin_lock_irqsave(&gic_lock, flags);
427438 write_gic_map_pin(intr, GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin);
428439 write_gic_map_vp(intr, BIT(mips_cm_vp_id(cpu)));
429440 irq_data_update_effective_affinity(data, cpumask_of(cpu));
430
- spin_unlock_irqrestore(&gic_lock, flags);
441
+ raw_spin_unlock_irqrestore(&gic_lock, flags);
431442
432443 return 0;
433444 }
....@@ -480,6 +491,10 @@
480491 intr = GIC_HWIRQ_TO_LOCAL(hwirq);
481492 map = GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin;
482493
494
+ /*
495
+ * If adding support for more per-cpu interrupts, keep the the
496
+ * array in gic_all_vpes_irq_cpu_online() in sync.
497
+ */
483498 switch (intr) {
484499 case GIC_LOCAL_INT_TIMER:
485500 /* CONFIG_MIPS_CMP workaround (see __gic_init) */
....@@ -518,12 +533,12 @@
518533 if (!gic_local_irq_is_routable(intr))
519534 return -EPERM;
520535
521
- spin_lock_irqsave(&gic_lock, flags);
536
+ raw_spin_lock_irqsave(&gic_lock, flags);
522537 for_each_online_cpu(cpu) {
523538 write_gic_vl_other(mips_cm_vp_id(cpu));
524539 write_gic_vo_map(mips_gic_vx_map_reg(intr), map);
525540 }
526
- spin_unlock_irqrestore(&gic_lock, flags);
541
+ raw_spin_unlock_irqrestore(&gic_lock, flags);
527542
528543 return 0;
529544 }
....@@ -710,8 +725,8 @@
710725 /* Clear all local IRQ masks (ie. disable all local interrupts) */
711726 write_gic_vl_rmask(~0);
712727
713
- /* Invoke irq_cpu_online callbacks to enable desired interrupts */
714
- irq_cpu_online();
728
+ /* Enable desired interrupts */
729
+ gic_all_vpes_irq_cpu_online();
715730
716731 return 0;
717732 }