0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <linux/irq.h>
0016 #include <linux/module.h>
0017 #include <linux/random.h>
0018 #include <linux/interrupt.h>
0019
0020 #include "internals.h"
0021
0022 #ifdef CONFIG_HARDIRQS_SW_RESEND
0023
0024
0025 static DECLARE_BITMAP(irqs_resend, IRQ_BITMAP_BITS);
0026
0027
0028
0029
0030 static void resend_irqs(struct tasklet_struct *unused)
0031 {
0032 struct irq_desc *desc;
0033 int irq;
0034
0035 while (!bitmap_empty(irqs_resend, nr_irqs)) {
0036 irq = find_first_bit(irqs_resend, nr_irqs);
0037 clear_bit(irq, irqs_resend);
0038 desc = irq_to_desc(irq);
0039 if (!desc)
0040 continue;
0041 local_irq_disable();
0042 desc->handle_irq(desc);
0043 local_irq_enable();
0044 }
0045 }
0046
0047
0048 static DECLARE_TASKLET(resend_tasklet, resend_irqs);
0049
0050 static int irq_sw_resend(struct irq_desc *desc)
0051 {
0052 unsigned int irq = irq_desc_get_irq(desc);
0053
0054
0055
0056
0057
0058 if (handle_enforce_irqctx(&desc->irq_data))
0059 return -EINVAL;
0060
0061
0062
0063
0064
0065
0066 if (irq_settings_is_nested_thread(desc)) {
0067
0068
0069
0070
0071 if (!desc->parent_irq)
0072 return -EINVAL;
0073 irq = desc->parent_irq;
0074 }
0075
0076
0077 set_bit(irq, irqs_resend);
0078 tasklet_schedule(&resend_tasklet);
0079 return 0;
0080 }
0081
0082 #else
0083 static int irq_sw_resend(struct irq_desc *desc)
0084 {
0085 return -EINVAL;
0086 }
0087 #endif
0088
0089 static int try_retrigger(struct irq_desc *desc)
0090 {
0091 if (desc->irq_data.chip->irq_retrigger)
0092 return desc->irq_data.chip->irq_retrigger(&desc->irq_data);
0093
0094 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
0095 return irq_chip_retrigger_hierarchy(&desc->irq_data);
0096 #else
0097 return 0;
0098 #endif
0099 }
0100
0101
0102
0103
0104
0105
0106 int check_irq_resend(struct irq_desc *desc, bool inject)
0107 {
0108 int err = 0;
0109
0110
0111
0112
0113
0114
0115 if (irq_settings_is_level(desc)) {
0116 desc->istate &= ~IRQS_PENDING;
0117 return -EINVAL;
0118 }
0119
0120 if (desc->istate & IRQS_REPLAY)
0121 return -EBUSY;
0122
0123 if (!(desc->istate & IRQS_PENDING) && !inject)
0124 return 0;
0125
0126 desc->istate &= ~IRQS_PENDING;
0127
0128 if (!try_retrigger(desc))
0129 err = irq_sw_resend(desc);
0130
0131
0132 if (!err)
0133 desc->istate |= IRQS_REPLAY;
0134 return err;
0135 }
0136
0137 #ifdef CONFIG_GENERIC_IRQ_INJECTION
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155 int irq_inject_interrupt(unsigned int irq)
0156 {
0157 struct irq_desc *desc;
0158 unsigned long flags;
0159 int err;
0160
0161
0162 if (!irq_set_irqchip_state(irq, IRQCHIP_STATE_PENDING, true))
0163 return 0;
0164
0165
0166 desc = irq_get_desc_buslock(irq, &flags, 0);
0167 if (!desc)
0168 return -EINVAL;
0169
0170
0171
0172
0173
0174
0175 if ((desc->istate & IRQS_NMI) || !irqd_is_activated(&desc->irq_data))
0176 err = -EINVAL;
0177 else
0178 err = check_irq_resend(desc, true);
0179
0180 irq_put_desc_busunlock(desc, flags);
0181 return err;
0182 }
0183 EXPORT_SYMBOL_GPL(irq_inject_interrupt);
0184 #endif