3434#include <linux/irqdomain.h>
3535#include <linux/interrupt.h>
3636#include <linux/percpu.h>
37+ #include <linux/seq_file.h>
3738#include <linux/slab.h>
3839#include <linux/irqchip.h>
3940#include <linux/irqchip/chained_irq.h>
@@ -66,7 +67,6 @@ union gic_base {
6667};
6768
6869struct gic_chip_data {
69- struct irq_chip chip ;
7070 union gic_base dist_base ;
7171 union gic_base cpu_base ;
7272 void __iomem * raw_dist_base ;
@@ -397,18 +397,15 @@ static void gic_handle_cascade_irq(struct irq_desc *desc)
397397 chained_irq_exit (chip , desc );
398398}
399399
400- static const struct irq_chip gic_chip = {
401- .irq_mask = gic_mask_irq ,
402- .irq_unmask = gic_unmask_irq ,
403- .irq_eoi = gic_eoi_irq ,
404- .irq_set_type = gic_set_type ,
405- .irq_retrigger = gic_retrigger ,
406- .irq_get_irqchip_state = gic_irq_get_irqchip_state ,
407- .irq_set_irqchip_state = gic_irq_set_irqchip_state ,
408- .flags = IRQCHIP_SET_TYPE_MASKED |
409- IRQCHIP_SKIP_SET_WAKE |
410- IRQCHIP_MASK_ON_SUSPEND ,
411- };
400+ static void gic_irq_print_chip (struct irq_data * d , struct seq_file * p )
401+ {
402+ struct gic_chip_data * gic = irq_data_get_irq_chip_data (d );
403+
404+ if (gic -> domain -> dev )
405+ seq_printf (p , gic -> domain -> dev -> of_node -> name );
406+ else
407+ seq_printf (p , "GIC-%d" , (int )(gic - & gic_data [0 ]));
408+ }
412409
413410void __init gic_cascade_irq (unsigned int gic_nr , unsigned int irq )
414411{
@@ -799,8 +796,12 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
799796 bool force )
800797{
801798 void __iomem * reg = gic_dist_base (d ) + GIC_DIST_TARGET + gic_irq (d );
799+ struct gic_chip_data * gic = irq_data_get_irq_chip_data (d );
802800 unsigned int cpu ;
803801
802+ if (unlikely (gic != & gic_data [0 ]))
803+ return - EINVAL ;
804+
804805 if (!force )
805806 cpu = cpumask_any_and (mask_val , cpu_online_mask );
806807 else
@@ -880,6 +881,39 @@ static __init void gic_smp_init(void)
880881#define gic_ipi_send_mask NULL
881882#endif
882883
884+ static const struct irq_chip gic_chip = {
885+ .irq_mask = gic_mask_irq ,
886+ .irq_unmask = gic_unmask_irq ,
887+ .irq_eoi = gic_eoi_irq ,
888+ .irq_set_type = gic_set_type ,
889+ .irq_retrigger = gic_retrigger ,
890+ .irq_set_affinity = gic_set_affinity ,
891+ .ipi_send_mask = gic_ipi_send_mask ,
892+ .irq_get_irqchip_state = gic_irq_get_irqchip_state ,
893+ .irq_set_irqchip_state = gic_irq_set_irqchip_state ,
894+ .irq_print_chip = gic_irq_print_chip ,
895+ .flags = IRQCHIP_SET_TYPE_MASKED |
896+ IRQCHIP_SKIP_SET_WAKE |
897+ IRQCHIP_MASK_ON_SUSPEND ,
898+ };
899+
900+ static const struct irq_chip gic_chip_mode1 = {
901+ .name = "GICv2" ,
902+ .irq_mask = gic_eoimode1_mask_irq ,
903+ .irq_unmask = gic_unmask_irq ,
904+ .irq_eoi = gic_eoimode1_eoi_irq ,
905+ .irq_set_type = gic_set_type ,
906+ .irq_retrigger = gic_retrigger ,
907+ .irq_set_affinity = gic_set_affinity ,
908+ .ipi_send_mask = gic_ipi_send_mask ,
909+ .irq_get_irqchip_state = gic_irq_get_irqchip_state ,
910+ .irq_set_irqchip_state = gic_irq_set_irqchip_state ,
911+ .irq_set_vcpu_affinity = gic_irq_set_vcpu_affinity ,
912+ .flags = IRQCHIP_SET_TYPE_MASKED |
913+ IRQCHIP_SKIP_SET_WAKE |
914+ IRQCHIP_MASK_ON_SUSPEND ,
915+ };
916+
883917#ifdef CONFIG_BL_SWITCHER
884918/*
885919 * gic_send_sgi - send a SGI directly to given CPU interface number
@@ -1024,15 +1058,19 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
10241058{
10251059 struct gic_chip_data * gic = d -> host_data ;
10261060 struct irq_data * irqd = irq_desc_get_irq_data (irq_to_desc (irq ));
1061+ const struct irq_chip * chip ;
1062+
1063+ chip = (static_branch_likely (& supports_deactivate_key ) &&
1064+ gic == & gic_data [0 ]) ? & gic_chip_mode1 : & gic_chip ;
10271065
10281066 switch (hw ) {
10291067 case 0 ... 31 :
10301068 irq_set_percpu_devid (irq );
1031- irq_domain_set_info (d , irq , hw , & gic -> chip , d -> host_data ,
1069+ irq_domain_set_info (d , irq , hw , chip , d -> host_data ,
10321070 handle_percpu_devid_irq , NULL , NULL );
10331071 break ;
10341072 default :
1035- irq_domain_set_info (d , irq , hw , & gic -> chip , d -> host_data ,
1073+ irq_domain_set_info (d , irq , hw , chip , d -> host_data ,
10361074 handle_fasteoi_irq , NULL , NULL );
10371075 irq_set_probe (irq );
10381076 irqd_set_single_target (irqd );
@@ -1127,25 +1165,6 @@ static const struct irq_domain_ops gic_irq_domain_ops = {
11271165 .unmap = gic_irq_domain_unmap ,
11281166};
11291167
1130- static void gic_init_chip (struct gic_chip_data * gic , const char * name ,
1131- bool use_eoimode1 )
1132- {
1133- /* Initialize irq_chip */
1134- gic -> chip = gic_chip ;
1135- gic -> chip .name = name ;
1136-
1137- if (use_eoimode1 ) {
1138- gic -> chip .irq_mask = gic_eoimode1_mask_irq ;
1139- gic -> chip .irq_eoi = gic_eoimode1_eoi_irq ;
1140- gic -> chip .irq_set_vcpu_affinity = gic_irq_set_vcpu_affinity ;
1141- }
1142-
1143- if (gic == & gic_data [0 ]) {
1144- gic -> chip .irq_set_affinity = gic_set_affinity ;
1145- gic -> chip .ipi_send_mask = gic_ipi_send_mask ;
1146- }
1147- }
1148-
11491168static int gic_init_bases (struct gic_chip_data * gic ,
11501169 struct fwnode_handle * handle )
11511170{
@@ -1245,7 +1264,6 @@ static int gic_init_bases(struct gic_chip_data *gic,
12451264static int __init __gic_init_bases (struct gic_chip_data * gic ,
12461265 struct fwnode_handle * handle )
12471266{
1248- char * name ;
12491267 int i , ret ;
12501268
12511269 if (WARN_ON (!gic || gic -> domain ))
@@ -1265,18 +1283,8 @@ static int __init __gic_init_bases(struct gic_chip_data *gic,
12651283 pr_info ("GIC: Using split EOI/Deactivate mode\n" );
12661284 }
12671285
1268- if (static_branch_likely (& supports_deactivate_key ) && gic == & gic_data [0 ]) {
1269- name = kasprintf (GFP_KERNEL , "GICv2" );
1270- gic_init_chip (gic , name , true);
1271- } else {
1272- name = kasprintf (GFP_KERNEL , "GIC-%d" , (int )(gic - & gic_data [0 ]));
1273- gic_init_chip (gic , name , false);
1274- }
1275-
12761286 ret = gic_init_bases (gic , handle );
1277- if (ret )
1278- kfree (name );
1279- else if (gic == & gic_data [0 ])
1287+ if (gic == & gic_data [0 ])
12801288 gic_smp_init ();
12811289
12821290 return ret ;
@@ -1459,8 +1467,6 @@ int gic_of_init_child(struct device *dev, struct gic_chip_data **gic, int irq)
14591467 if (!* gic )
14601468 return - ENOMEM ;
14611469
1462- gic_init_chip (* gic , dev -> of_node -> name , false);
1463-
14641470 ret = gic_of_setup (* gic , dev -> of_node );
14651471 if (ret )
14661472 return ret ;
0 commit comments