Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge remote-tracking branch 'origin/irq/gic-retrigger' into irq/irqchip-next

Signed-off-by: Marc Zyngier <maz@kernel.org>

+41 -4
+6
drivers/irqchip/irq-gic-v3-its.c
··· 1720 1720 return 0; 1721 1721 } 1722 1722 1723 + static int its_irq_retrigger(struct irq_data *d) 1724 + { 1725 + return !its_irq_set_irqchip_state(d, IRQCHIP_STATE_PENDING, true); 1726 + } 1727 + 1723 1728 /* 1724 1729 * Two favourable cases: 1725 1730 * ··· 1976 1971 .irq_set_affinity = its_set_affinity, 1977 1972 .irq_compose_msi_msg = its_irq_compose_msi_msg, 1978 1973 .irq_set_irqchip_state = its_irq_set_irqchip_state, 1974 + .irq_retrigger = its_irq_retrigger, 1979 1975 .irq_set_vcpu_affinity = its_irq_set_vcpu_affinity, 1980 1976 }; 1981 1977
+11 -1
drivers/irqchip/irq-gic-v3.c
··· 1221 1221 #define gic_smp_init() do { } while(0) 1222 1222 #endif 1223 1223 1224 + static int gic_retrigger(struct irq_data *data) 1225 + { 1226 + return !gic_irq_set_irqchip_state(data, IRQCHIP_STATE_PENDING, true); 1227 + } 1228 + 1224 1229 #ifdef CONFIG_CPU_PM 1225 1230 static int gic_cpu_pm_notifier(struct notifier_block *self, 1226 1231 unsigned long cmd, void *v) ··· 1261 1256 .irq_eoi = gic_eoi_irq, 1262 1257 .irq_set_type = gic_set_type, 1263 1258 .irq_set_affinity = gic_set_affinity, 1259 + .irq_retrigger = gic_retrigger, 1264 1260 .irq_get_irqchip_state = gic_irq_get_irqchip_state, 1265 1261 .irq_set_irqchip_state = gic_irq_set_irqchip_state, 1266 1262 .irq_nmi_setup = gic_irq_nmi_setup, ··· 1279 1273 .irq_eoi = gic_eoimode1_eoi_irq, 1280 1274 .irq_set_type = gic_set_type, 1281 1275 .irq_set_affinity = gic_set_affinity, 1276 + .irq_retrigger = gic_retrigger, 1282 1277 .irq_get_irqchip_state = gic_irq_get_irqchip_state, 1283 1278 .irq_set_irqchip_state = gic_irq_set_irqchip_state, 1284 1279 .irq_set_vcpu_affinity = gic_irq_set_vcpu_affinity, ··· 1295 1288 irq_hw_number_t hw) 1296 1289 { 1297 1290 struct irq_chip *chip = &gic_chip; 1291 + struct irq_data *irqd = irq_desc_get_irq_data(irq_to_desc(irq)); 1298 1292 1299 1293 if (static_branch_likely(&supports_deactivate_key)) 1300 1294 chip = &gic_eoimode1_chip; ··· 1320 1312 irq_domain_set_info(d, irq, hw, chip, d->host_data, 1321 1313 handle_fasteoi_irq, NULL, NULL); 1322 1314 irq_set_probe(irq); 1323 - irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(irq))); 1315 + irqd_set_single_target(irqd); 1324 1316 break; 1325 1317 1326 1318 case LPI_RANGE: ··· 1334 1326 return -EPERM; 1335 1327 } 1336 1328 1329 + /* Prevents SW retriggers which mess up the ACK/EOI ordering */ 1330 + irqd_set_handle_enforce_irqctx(irqd); 1337 1331 return 0; 1338 1332 } 1339 1333
+11 -1
drivers/irqchip/irq-gic.c
··· 326 326 return 0; 327 327 } 328 328 329 + static int gic_retrigger(struct irq_data *data) 330 + { 331 + return !gic_irq_set_irqchip_state(data, IRQCHIP_STATE_PENDING, true); 332 + } 333 + 329 334 static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) 330 335 { 331 336 u32 irqstat, irqnr; ··· 403 398 .irq_unmask = gic_unmask_irq, 404 399 .irq_eoi = gic_eoi_irq, 405 400 .irq_set_type = gic_set_type, 401 + .irq_retrigger = gic_retrigger, 406 402 .irq_get_irqchip_state = gic_irq_get_irqchip_state, 407 403 .irq_set_irqchip_state = gic_irq_set_irqchip_state, 408 404 .flags = IRQCHIP_SET_TYPE_MASKED | ··· 1002 996 irq_hw_number_t hw) 1003 997 { 1004 998 struct gic_chip_data *gic = d->host_data; 999 + struct irq_data *irqd = irq_desc_get_irq_data(irq_to_desc(irq)); 1005 1000 1006 1001 switch (hw) { 1007 1002 case 0 ... 15: ··· 1020 1013 irq_domain_set_info(d, irq, hw, &gic->chip, d->host_data, 1021 1014 handle_fasteoi_irq, NULL, NULL); 1022 1015 irq_set_probe(irq); 1023 - irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(irq))); 1016 + irqd_set_single_target(irqd); 1024 1017 break; 1025 1018 } 1019 + 1020 + /* Prevents SW retriggers which mess up the ACK/EOI ordering */ 1021 + irqd_set_handle_enforce_irqctx(irqd); 1026 1022 return 0; 1027 1023 } 1028 1024
+13 -2
kernel/irq/resend.c
··· 86 86 } 87 87 #endif 88 88 89 + static int try_retrigger(struct irq_desc *desc) 90 + { 91 + if (desc->irq_data.chip->irq_retrigger) 92 + return desc->irq_data.chip->irq_retrigger(&desc->irq_data); 93 + 94 + #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY 95 + return irq_chip_retrigger_hierarchy(&desc->irq_data); 96 + #else 97 + return 0; 98 + #endif 99 + } 100 + 89 101 /* 90 102 * IRQ resend 91 103 * ··· 125 113 126 114 desc->istate &= ~IRQS_PENDING; 127 115 128 - if (!desc->irq_data.chip->irq_retrigger || 129 - !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) 116 + if (!try_retrigger(desc)) 130 117 err = irq_sw_resend(desc); 131 118 132 119 /* If the retrigger was successfull, mark it with the REPLAY bit */