@@ -292,7 +292,6 @@ struct aic_irq_chip {
292
292
void __iomem * base ;
293
293
void __iomem * event ;
294
294
struct irq_domain * hw_domain ;
295
- struct irq_domain * ipi_domain ;
296
295
struct {
297
296
cpumask_t aff ;
298
297
} * fiq_aff [AIC_NR_FIQ ];
@@ -307,9 +306,6 @@ struct aic_irq_chip {
307
306
308
307
static DEFINE_PER_CPU (uint32_t , aic_fiq_unmasked ) ;
309
308
310
- static DEFINE_PER_CPU (atomic_t , aic_vipi_flag ) ;
311
- static DEFINE_PER_CPU (atomic_t , aic_vipi_enable ) ;
312
-
313
309
static struct aic_irq_chip * aic_irqc ;
314
310
315
311
static void aic_handle_ipi (struct pt_regs * regs );
@@ -751,98 +747,8 @@ static void aic_ipi_send_fast(int cpu)
751
747
isb ();
752
748
}
753
749
754
- static void aic_ipi_mask (struct irq_data * d )
755
- {
756
- u32 irq_bit = BIT (irqd_to_hwirq (d ));
757
-
758
- /* No specific ordering requirements needed here. */
759
- atomic_andnot (irq_bit , this_cpu_ptr (& aic_vipi_enable ));
760
- }
761
-
762
- static void aic_ipi_unmask (struct irq_data * d )
763
- {
764
- struct aic_irq_chip * ic = irq_data_get_irq_chip_data (d );
765
- u32 irq_bit = BIT (irqd_to_hwirq (d ));
766
-
767
- atomic_or (irq_bit , this_cpu_ptr (& aic_vipi_enable ));
768
-
769
- /*
770
- * The atomic_or() above must complete before the atomic_read()
771
- * below to avoid racing aic_ipi_send_mask().
772
- */
773
- smp_mb__after_atomic ();
774
-
775
- /*
776
- * If a pending vIPI was unmasked, raise a HW IPI to ourselves.
777
- * No barriers needed here since this is a self-IPI.
778
- */
779
- if (atomic_read (this_cpu_ptr (& aic_vipi_flag )) & irq_bit ) {
780
- if (static_branch_likely (& use_fast_ipi ))
781
- aic_ipi_send_fast (smp_processor_id ());
782
- else
783
- aic_ic_write (ic , AIC_IPI_SEND , AIC_IPI_SEND_CPU (smp_processor_id ()));
784
- }
785
- }
786
-
787
- static void aic_ipi_send_mask (struct irq_data * d , const struct cpumask * mask )
788
- {
789
- struct aic_irq_chip * ic = irq_data_get_irq_chip_data (d );
790
- u32 irq_bit = BIT (irqd_to_hwirq (d ));
791
- u32 send = 0 ;
792
- int cpu ;
793
- unsigned long pending ;
794
-
795
- for_each_cpu (cpu , mask ) {
796
- /*
797
- * This sequence is the mirror of the one in aic_ipi_unmask();
798
- * see the comment there. Additionally, release semantics
799
- * ensure that the vIPI flag set is ordered after any shared
800
- * memory accesses that precede it. This therefore also pairs
801
- * with the atomic_fetch_andnot in aic_handle_ipi().
802
- */
803
- pending = atomic_fetch_or_release (irq_bit , per_cpu_ptr (& aic_vipi_flag , cpu ));
804
-
805
- /*
806
- * The atomic_fetch_or_release() above must complete before the
807
- * atomic_read() below to avoid racing aic_ipi_unmask().
808
- */
809
- smp_mb__after_atomic ();
810
-
811
- if (!(pending & irq_bit ) &&
812
- (atomic_read (per_cpu_ptr (& aic_vipi_enable , cpu )) & irq_bit )) {
813
- if (static_branch_likely (& use_fast_ipi ))
814
- aic_ipi_send_fast (cpu );
815
- else
816
- send |= AIC_IPI_SEND_CPU (cpu );
817
- }
818
- }
819
-
820
- /*
821
- * The flag writes must complete before the physical IPI is issued
822
- * to another CPU. This is implied by the control dependency on
823
- * the result of atomic_read_acquire() above, which is itself
824
- * already ordered after the vIPI flag write.
825
- */
826
- if (send )
827
- aic_ic_write (ic , AIC_IPI_SEND , send );
828
- }
829
-
830
- static struct irq_chip ipi_chip = {
831
- .name = "AIC-IPI" ,
832
- .irq_mask = aic_ipi_mask ,
833
- .irq_unmask = aic_ipi_unmask ,
834
- .ipi_send_mask = aic_ipi_send_mask ,
835
- };
836
-
837
- /*
838
- * IPI IRQ domain
839
- */
840
-
841
750
static void aic_handle_ipi (struct pt_regs * regs )
842
751
{
843
- int i ;
844
- unsigned long enabled , firing ;
845
-
846
752
/*
847
753
* Ack the IPI. We need to order this after the AIC event read, but
848
754
* that is enforced by normal MMIO ordering guarantees.
@@ -857,27 +763,7 @@ static void aic_handle_ipi(struct pt_regs *regs)
857
763
aic_ic_write (aic_irqc , AIC_IPI_ACK , AIC_IPI_OTHER );
858
764
}
859
765
860
- /*
861
- * The mask read does not need to be ordered. Only we can change
862
- * our own mask anyway, so no races are possible here, as long as
863
- * we are properly in the interrupt handler (which is covered by
864
- * the barrier that is part of the top-level AIC handler's readl()).
865
- */
866
- enabled = atomic_read (this_cpu_ptr (& aic_vipi_enable ));
867
-
868
- /*
869
- * Clear the IPIs we are about to handle. This pairs with the
870
- * atomic_fetch_or_release() in aic_ipi_send_mask(), and needs to be
871
- * ordered after the aic_ic_write() above (to avoid dropping vIPIs) and
872
- * before IPI handling code (to avoid races handling vIPIs before they
873
- * are signaled). The former is taken care of by the release semantics
874
- * of the write portion, while the latter is taken care of by the
875
- * acquire semantics of the read portion.
876
- */
877
- firing = atomic_fetch_andnot (enabled , this_cpu_ptr (& aic_vipi_flag )) & enabled ;
878
-
879
- for_each_set_bit (i , & firing , AIC_NR_SWIPI )
880
- generic_handle_domain_irq (aic_irqc -> ipi_domain , i );
766
+ ipi_mux_process ();
881
767
882
768
/*
883
769
* No ordering needed here; at worst this just changes the timing of
@@ -887,55 +773,24 @@ static void aic_handle_ipi(struct pt_regs *regs)
887
773
aic_ic_write (aic_irqc , AIC_IPI_MASK_CLR , AIC_IPI_OTHER );
888
774
}
889
775
890
- static int aic_ipi_alloc (struct irq_domain * d , unsigned int virq ,
891
- unsigned int nr_irqs , void * args )
776
+ static void aic_ipi_send_single (unsigned int cpu )
892
777
{
893
- int i ;
894
-
895
- for (i = 0 ; i < nr_irqs ; i ++ ) {
896
- irq_set_percpu_devid (virq + i );
897
- irq_domain_set_info (d , virq + i , i , & ipi_chip , d -> host_data ,
898
- handle_percpu_devid_irq , NULL , NULL );
899
- }
900
-
901
- return 0 ;
902
- }
903
-
904
- static void aic_ipi_free (struct irq_domain * d , unsigned int virq , unsigned int nr_irqs )
905
- {
906
- /* Not freeing IPIs */
778
+ if (static_branch_likely (& use_fast_ipi ))
779
+ aic_ipi_send_fast (cpu );
780
+ else
781
+ aic_ic_write (aic_irqc , AIC_IPI_SEND , AIC_IPI_SEND_CPU (cpu ));
907
782
}
908
783
909
- static const struct irq_domain_ops aic_ipi_domain_ops = {
910
- .alloc = aic_ipi_alloc ,
911
- .free = aic_ipi_free ,
912
- };
913
-
914
784
static int __init aic_init_smp (struct aic_irq_chip * irqc , struct device_node * node )
915
785
{
916
- struct irq_domain * ipi_domain ;
917
786
int base_ipi ;
918
787
919
- ipi_domain = irq_domain_create_linear (irqc -> hw_domain -> fwnode , AIC_NR_SWIPI ,
920
- & aic_ipi_domain_ops , irqc );
921
- if (WARN_ON (!ipi_domain ))
922
- return - ENODEV ;
923
-
924
- ipi_domain -> flags |= IRQ_DOMAIN_FLAG_IPI_SINGLE ;
925
- irq_domain_update_bus_token (ipi_domain , DOMAIN_BUS_IPI );
926
-
927
- base_ipi = __irq_domain_alloc_irqs (ipi_domain , -1 , AIC_NR_SWIPI ,
928
- NUMA_NO_NODE , NULL , false, NULL );
929
-
930
- if (WARN_ON (!base_ipi )) {
931
- irq_domain_remove (ipi_domain );
788
+ base_ipi = ipi_mux_create (AIC_NR_SWIPI , aic_ipi_send_single );
789
+ if (WARN_ON (base_ipi <= 0 ))
932
790
return - ENODEV ;
933
- }
934
791
935
792
set_smp_ipi_range (base_ipi , AIC_NR_SWIPI );
936
793
937
- irqc -> ipi_domain = ipi_domain ;
938
-
939
794
return 0 ;
940
795
}
941
796
0 commit comments