/** * __handle_domain_irq - Invoke the handler for a HW irq belonging to a domain * @domain: The domain where to perform the lookup * @hwirq: The HW irq number to convert to a logical one * @lookup: Whether to perform the domain lookup or not * @regs: Register file coming from the low-level handling code * * Returns: 0 on success, or -EINVAL if conversion has failed */ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq, bool lookup, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); unsigned int irq = hwirq; int ret = 0; irq_enter(); #ifdef CONFIG_IRQ_DOMAIN if (lookup) irq = irq_find_mapping(domain, hwirq); #endif /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(!irq || irq >= nr_irqs)) { ack_bad_irq(irq); ret = -EINVAL; } else { generic_handle_irq(irq); } irq_exit(); set_irq_regs(old_regs); return ret; }
/* * handle_IRQ handles all hardware IRQ's. Decoded IRQs should * not come via this function. Instead, they should provide their * own 'handler'. Used by platform code implementing C-based 1st * level decoding. */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); #ifdef CONFIG_SEC_DEBUG int cpu = smp_processor_id(); unsigned long long start_time = cpu_clock(cpu); #endif perf_mon_interrupt_in(); irq_enter(); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } /* AT91 specific workaround */ irq_finish(irq); irq_exit(); #ifdef CONFIG_SEC_DEBUG sec_debug_irq_enterexit_log(irq, start_time); #endif set_irq_regs(old_regs); perf_mon_interrupt_out(); }
/** * handle_bad_irq - handle spurious and unhandled irqs * @irq: the interrupt number * @desc: description of the interrupt * * Handles spurious and unhandled IRQ's. It also prints a debugmessage. */ void fastcall handle_bad_irq(unsigned int irq, struct irq_desc *desc) { print_irq_desc(irq, desc); kstat_this_cpu.irqs[irq]++; ack_bad_irq(irq); }
/* * handle_IRQ handles all hardware IRQ's. Decoded IRQs should * not come via this function. Instead, they should provide their * own 'handler'. Used by platform code implementing C-based 1st * level decoding. */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); #ifdef CONFIG_MTK_SCHED_TRACERS struct irq_desc *desc; #endif mt_trace_ISR_start(irq); irq_enter(); #ifdef CONFIG_MTK_SCHED_TRACERS desc = irq_to_desc(irq); trace_irq_entry(irq, (desc && desc->action && desc->action->name) ? desc->action->name : "-"); #endif /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } #ifdef CONFIG_MTK_SCHED_TRACERS trace_irq_exit(irq); #endif mt_trace_ISR_end(irq); irq_exit(); set_irq_regs(old_regs); }
/* * What should we do if we get a hw irq event on an illegal vector? * Each architecture has to answer this themself. */ static void ack_bad(unsigned int irq) { struct irq_desc *desc = irq_to_desc(irq); print_irq_desc(irq, desc); ack_bad_irq(irq); }
/* * do_IRQ handles all hardware IRQ's. Decoded IRQs should not * come via this function. Instead, they should provide their * own 'handler' */ asmlinkage void __exception_irq_entry asm_do_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); irq_enter(); DEBUG_LED_IRQ_ENTER(smp_processor_id(), irq); #ifdef CONFIG_K3V2_RAMDUMP mark_cpu_irq(smp_processor_id(), irq); #endif /* CONFIG_K3V2_RAMDUMP */ /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } #ifdef CONFIG_K3V2_RAMDUMP clear_cpu_irq(smp_processor_id()); #endif /* CONFIG_K3V2_RAMDUMP */ DEBUG_LED_IRQ_EXIT(smp_processor_id(), irq); /* AT91 specific workaround */ irq_finish(irq); irq_exit(); set_irq_regs(old_regs); }
/* * What should we do if we get a hw irq event on an illegal vector? * Each architecture has to answer this themself. */ static void ack_bad(struct irq_data *data) { struct irq_desc *desc = irq_data_to_desc(data); print_irq_desc(data->irq, desc); ack_bad_irq(data->irq); }
/* * do_IRQ handles all hardware IRQ's. Decoded IRQs should not * come via this function. Instead, they should provide their * own 'handler' */ asmlinkage void __exception_irq_entry asm_do_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); irq_enter(); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } /* AT91 specific workaround */ irq_finish(irq); irq_exit(); set_irq_regs(old_regs); }
/** * handle_bad_irq - handle spurious and unhandled irqs * @irq: the interrupt number * @desc: description of the interrupt * * Handles spurious and unhandled IRQ's. It also prints a debugmessage. */ void handle_bad_irq(struct irq_desc *desc) { unsigned int irq = irq_desc_get_irq(desc); print_irq_desc(irq, desc); kstat_incr_irqs_this_cpu(desc); ack_bad_irq(irq); }
static void ack_none(unsigned int irq) { /* * 'what should we do if we get a hw irq event on an illegal vector'. * each architecture has to answer this themself. */ ack_bad_irq(irq); }
/* * handle_IRQ handles all hardware IRQ's. Decoded IRQs should * not come via this function. Instead, they should provide their * own 'handler'. Used by platform code implementing C-based 1st * level decoding. */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); #ifdef CONFIG_HISI_RDR #ifdef CONFIG_HISI_RDR_SWITCH unsigned int old_int_num = curr_int_num; curr_int_num = irq; if (NULL != int_switch_hook) {/*exc int hook func*/ int_switch_hook(0, old_int_num, curr_int_num); int_switch_flag = 1; } #endif #else unsigned int old_int_num = curr_int_num; curr_int_num = irq; if (NULL != int_switch_hook) {/*exc int hook func*/ int_switch_hook(0, old_int_num, curr_int_num); int_switch_flag = 1; } #endif irq_enter(); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { pr_warn_ratelimited("Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } irq_exit(); #ifdef CONFIG_HISI_RDR #ifdef CONFIG_HISI_RDR_SWITCH /*call exception interrupt hook func*/ if ((NULL != int_switch_hook) && (0 != int_switch_flag)) int_switch_hook(1, old_int_num, curr_int_num); #endif #else /*call exception interrupt hook func*/ if ((NULL != int_switch_hook) && (0 != int_switch_flag)) int_switch_hook(1, old_int_num, curr_int_num); #endif set_irq_regs(old_regs); }
/* * handle_IRQ handles all hardware IRQ's. Decoded IRQs should * not come via this function. Instead, they should provide their * own 'handler'. Used by platform code implementing C-based 1st * level decoding. */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); unsigned int ulOldIntNum = g_ulIntNumCurrent; g_ulIntNumCurrent = irq; /*exc int hook func*/ if( NULL != g_pIntSwitchHook) { (g_pIntSwitchHook)(0, ulOldIntNum, irq); g_ulIntFlag = 1; } irq_enter(); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } /* AT91 specific workaround */ irq_finish(irq); irq_exit(); /*exc int hook func*/ if( (NULL != g_pIntSwitchHook) && (0 != g_ulIntFlag) ) { (g_pIntSwitchHook)(1, ulOldIntNum, irq); } set_irq_regs(old_regs); }
/* * handle_IRQ handles all hardware IRQ's. Decoded IRQs should * not come via this function. Instead, they should provide their * own 'handler'. Used by platform code implementing C-based 1st * level decoding. */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); irq_enter(); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { pr_warn_ratelimited("Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } irq_exit(); set_irq_regs(old_regs); }
void handle_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); perf_mon_interrupt_in(); irq_enter(); if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } irq_finish(irq); irq_exit(); set_irq_regs(old_regs); perf_mon_interrupt_out(); }
/* * do_IRQ handles all hardware IRQ's. Decoded IRQs should not * come via this function. Instead, they should provide their * own 'handler' */ asmlinkage void __exception_irq_entry asm_do_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); #ifdef CONFIG_BCM_KNLLOG_IRQ struct irq_desc *desc; #endif irq_enter(); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { #ifdef CONFIG_BCM_KNLLOG_IRQ desc = irq_desc + irq; if (gKnllogIrqSchedEnable & KNLLOG_IRQ) KNLLOG("in [%d] (0x%x)\n", irq, (int)desc); #endif generic_handle_irq(irq); } #ifdef CONFIG_BCM_KNLLOG_IRQ if (gKnllogIrqSchedEnable & KNLLOG_IRQ) KNLLOG("out [%d] (0x%x)\n", irq, (int)desc); #endif /* AT91 specific workaround */ irq_finish(irq); irq_exit(); set_irq_regs(old_regs); }
/* * handle_IRQ handles all hardware IRQ's. Decoded IRQs should * not come via this function. Instead, they should provide their * own 'handler'. Used by platform code implementing C-based 1st * level decoding. */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); /* * Disable interrupt in oops progress to avoid * panic over panic in ISR. */ if (oops_in_progress && !smp_processor_id()) { set_irq_regs(old_regs); local_irq_disable(); printk(KERN_ERR "In oops," " interrupt is disabled on IRQ%u\n", irq); return; } perf_mon_interrupt_in(); irq_enter(); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } /* AT91 specific workaround */ irq_finish(irq); irq_exit(); set_irq_regs(old_regs); perf_mon_interrupt_out(); }
/* * handle_IRQ handles all hardware IRQ's. Decoded IRQs should * not come via this function. Instead, they should provide their * own 'handler'. Used by platform code implementing C-based 1st * level decoding. */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); ////printk(KERN_ALERT "asm_do_IRQ. irq=%d\n", irq); // NCTUSS irq_enter(); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); } irq_exit(); set_irq_regs(old_regs); }
/* * handle_IRQ handles all hardware IRQ's. Decoded IRQs should * not come via this function. Instead, they should provide their * own 'handler'. Used by platform code implementing C-based 1st * level decoding. */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); irq_enter(); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) printk(KERN_WARNING "Bad IRQ%u\n", irq); ack_bad_irq(irq); irq_exit(); } else { msa_start_irq(irq); generic_handle_irq(irq); msa_irq_exit(irq, user_mode(regs)); } set_irq_regs(old_regs); }
/** * handle_bad_irq - handle spurious and unhandled irqs * @irq: the interrupt number * @desc: description of the interrupt * * Handles spurious and unhandled IRQ's. It also prints a debugmessage. */ void handle_bad_irq(unsigned int irq, struct irq_desc *desc) { print_irq_desc(irq, desc); kstat_incr_irqs_this_cpu(irq, desc); ack_bad_irq(irq); }
/* * What should we do if we get a hw irq event on an illegal vector? * Each architecture has to answer this themself. */ static void ack_bad(unsigned int irq) { print_irq_desc(irq, irq_desc + irq); ack_bad_irq(irq); }