aboutsummaryrefslogtreecommitdiff
path: root/kernel/irq/chip.c
AgeCommit message (Collapse)AuthorFilesLines
2012-02-15genirq: Unmask oneshot irqs when thread was not wokenThomas Gleixner1-2/+23
When the primary handler of an interrupt which is marked IRQ_ONESHOT returns IRQ_HANDLED or IRQ_NONE, then the interrupt thread is not woken and the unmask logic of the interrupt line is never invoked. This keeps the interrupt masked forever. This was not noticed as most IRQ_ONESHOT users wake the thread unconditionally (usually because they cannot access the underlying device from hard interrupt context). Though this behaviour was nowhere documented and not necessarily intentional. Some drivers can avoid the thread wakeup in certain cases and run into the situation where the interrupt line s kept masked. Handle it gracefully. Reported-and-tested-by: Lothar Wassmann <[email protected]> Cc: [email protected] Signed-off-by: Thomas Gleixner <[email protected]>
2012-02-03tracing/softirq: Move __raise_softirq_irqoff() out of headerSteven Rostedt1-0/+2
The __raise_softirq_irqoff() contains a tracepoint. As tracepoints in headers can cause issues, and not to mention, bloats the kernel when they are in a static inline, it is best to move the function that contains the tracepoint out of the header and into softirq.c. Link: http://lkml.kernel.org/r/[email protected] Suggested-by: Ingo Molnar <[email protected]> Signed-off-by: Steven Rostedt <[email protected]>
2011-10-03genirq: Add support for per-cpu dev_id interruptsMarc Zyngier1-7/+57
The ARM GIC interrupt controller offers per CPU interrupts (PPIs), which are usually used to connect local timers to each core. Each CPU has its own private interface to the GIC, and only sees the PPIs that are directly connect to it. While these timers are separate devices and have a separate interrupt line to a core, they all use the same IRQ number. For these devices, request_irq() is not the right API as it assumes that an IRQ number is visible by a number of CPUs (through the affinity setting), but makes it very awkward to express that an IRQ number can be handled by all CPUs, and yet be a different interrupt line on each CPU, requiring a different dev_id cookie to be passed back to the handler. The *_percpu_irq() functions is designed to overcome these limitations, by providing a per-cpu dev_id vector: int request_percpu_irq(unsigned int irq, irq_handler_t handler, const char *devname, void __percpu *percpu_dev_id); void free_percpu_irq(unsigned int, void __percpu *); int setup_percpu_irq(unsigned int irq, struct irqaction *new); void remove_percpu_irq(unsigned int irq, struct irqaction *act); void enable_percpu_irq(unsigned int irq); void disable_percpu_irq(unsigned int irq); The API has a number of limitations: - no interrupt sharing - no threading - common handler across all the CPUs Once the interrupt is requested using setup_percpu_irq() or request_percpu_irq(), it must be enabled by each core that wishes its local interrupt to be delivered. Based on an initial patch by Thomas Gleixner. Signed-off-by: Marc Zyngier <[email protected]> Cc: [email protected] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Thomas Gleixner <[email protected]>
2011-09-12genirq: Make irq_shutdown() symmetric vs. irq_startup againGeert Uytterhoeven1-1/+1
If an irq_chip provides .irq_shutdown(), but neither of .irq_disable() or .irq_mask(), free_irq() crashes when jumping to NULL. Fix this by only trying .irq_disable() and .irq_mask() if there's no .irq_shutdown() provided. This revives the symmetry with irq_startup(), which tries .irq_startup(), .irq_enable(), and irq_unmask(), and makes it consistent with the comment for irq_chip.irq_shutdown() in <linux/irq.h>, which says: * @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL) This is also how __free_irq() behaved before the big overhaul, cfr. e.g. 3b56f0585fd4c02d047dc406668cb40159b2d340 ("genirq: Remove bogus conditional"), where the core interrupt code always overrode .irq_shutdown() to .irq_disable() if .irq_shutdown() was NULL. Signed-off-by: Geert Uytterhoeven <[email protected]> Cc: [email protected] Link: http://lkml.kernel.org/r/[email protected] Cc: [email protected] Signed-off-by: Thomas Gleixner <[email protected]>
2011-05-18irq: Export functions to allow modular irq driversJonathan Cameron1-0/+2
Export handle_simple_irq, irq_modify_status, irq_alloc_descs, irq_free_descs and generic_handle_irq to allow their usage in modules. First user is IIO, which wants to be built modular, but needs to be able to create irq chips, allocate and configure interrupt descriptors and handle demultiplexing interrupts. [ tglx: Moved the uninlinig of generic_handle_irq to a separate patch ] Signed-off-by: Jonathan Cameron <[email protected]> Link: http://lkml.kernel.org/r/%3C1305711544-505-1-git-send-email-jic23%40cam.ac.uk%3E Signed-off-by: Thomas Gleixner <[email protected]>
2011-04-23genirq: Support per-IRQ thread disabling.Paul Mundt1-0/+1
This adds support for disabling threading on a per-IRQ basis via the IRQ status instead of the IRQ flow, which is necessary for interrupts that don't follow the natural IRQ flow channels, such as those that are virtually created. The new APIs added are simply: irq_set_thread() irq_set_nothread() which follow the rest of the IRQ status routines. Chained handlers also have IRQ_NOTHREAD set on them automatically, making the lack of threading explicit rather than implicit. Subsequently, the nothread flag can be viewed through the standard genirq debugging facilities. [ tglx: Fixed cleanup fallout ] Signed-off-by: Paul Mundt <[email protected]> Link: http://lkml.kernel.org/r/%3C20110406210135.GF18426%40linux-sh.org%3E Signed-off-by: Thomas Gleixner <[email protected]>
2011-03-31Fix common misspellingsLucas De Marchi1-1/+1
Fixes generated by 'codespell' and manually reviewed. Signed-off-by: Lucas De Marchi <[email protected]>
2011-03-29genirq: fix CONFIG_IRQ_EDGE_EOI_HANDLER buildStephen Rothwell1-1/+1
Fixes these errors: kernel/irq/chip.c: In function 'handle_edge_eoi_irq': kernel/irq/chip.c:517: warning: label 'out_unlock' defined but not used kernel/irq/chip.c:503: error: label 'out_eoi' used but not defined Signed-off-by: Stephen Rothwell <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
2011-03-29genirq: Remove compat codeThomas Gleixner1-129/+0
Signed-off-by: Thomas Gleixner <[email protected]>
2011-03-29genirq; Fix cleanup falloutThomas Gleixner1-0/+2
I missed the CONFIG_GENERIC_PENDING_IRQ dependency in the affinity related functions and the IRQ_LEVEL propagation into irq_data state. Did not pop up on my main test platforms. :( Signed-off-by: Thomas Gleixner <[email protected]> Tested-by: David Daney <[email protected]>
2011-03-28genirq: Provide edge_eoi flow handlerThomas Gleixner1-0/+45
This is a replacment for the cell flow handler which is in the way of cleanups. Must be selected to avoid general bloat. Signed-off-by: Thomas Gleixner <[email protected]>
2011-03-28genirq: Move INPROGRESS, MASKED and DISABLED state flags to irq_dataThomas Gleixner1-21/+19
We really need these flags for some of the interrupt chips. Move it from internal state to irq_data and provide proper accessors. Signed-off-by: Thomas Gleixner <[email protected]> Cc: David Daney <[email protected]>
2011-03-27genirq: Add chip flag for restricting cpu_on/offline callsThomas Gleixner1-4/+6
Add a flag which indicates that the on/offline callback should only be called on enabled interrupts. Signed-off-by: Thomas Gleixner <[email protected]>
2011-03-27genirq: Add chip hooks for taking CPUs on/off line.David Daney1-0/+58
[ tglx: Removed the enabled argument as this is now available in irq_data ] Signed-off-by: David Daney <[email protected]> Cc: [email protected] Cc: [email protected] LKML-Reference: <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]>
2011-03-27genirq: Add irq disabled flag to irq_data stateThomas Gleixner1-2/+3
Some irq_chip implementation require to know the disabled state of the interrupt in certain callbacks. Add a state flag and accessor to irq_data. Signed-off-by: Thomas Gleixner <[email protected]>
2011-03-27genirq: Reserve the irq when calling irq_set_chip()David Daney1-0/+6
The helper macros and functions like for_each_active_irq() don't work unless the irq is in the allocated_irqs set. In the case of !CONFIG_SPARSE_IRQ, instead of forcing all users of the irq infrastructure to explicitly call irq_reserve_irq(), do it for them. Signed-off-by: David Daney <[email protected]> Cc: [email protected] Cc: [email protected] LKML-Reference: <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]>
2011-03-02genirq: Fixup fasteoi handler for oneshot modeThomas Gleixner1-0/+4
The fasteoi handler must mask the interrupt line in oneshot mode otherwise we end up with an irq storm. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-21genirq: Fix misplaced status update in irq_disable()Thomas Gleixner1-1/+1
We lazy disable interrupt lines, so only mark the line masked, when the chip provides an irq_disable callback. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq; Add fasteoi irq_chip quirkThomas Gleixner1-1/+8
Some chips want irq_eoi() only called when an interrupt is actually handled. So they have checks for INPROGRESS and DISABLED in their irq_eoi callbacks. Add a chip flag, which allows to handle that in the generic code. No impact on the fastpath. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Add preflow handler supportThomas Gleixner1-0/+11
sparc64 needs to call a preflow handler on certain interrupts befor calling the action chain. Integrate it into handle_fasteoi_irq. Must be enabled via CONFIG_IRQ_FASTEOI_PREFLOW. No impact when disabled. Signed-off-by: Thomas Gleixner <[email protected]> Cc: David S. Miller <[email protected]>
2011-02-19genirq: Consolidate set_chip_handler functionsThomas Gleixner1-12/+4
No need to have separate functions if we have one plus inline wrappers. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Use irq_get/put functionsThomas Gleixner1-67/+26
Convert the management functions to use the common irq_get/put function. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Remove real old transition functionsThomas Gleixner1-12/+4
These transition helpers are stale for years now. Remove them. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Reflect IRQ_MOVE_PCNTXT in irq_data stateThomas Gleixner1-1/+3
Required by x86. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Add IRQCHIP_SET_TYPE_MASKED flagThomas Gleixner1-2/+2
irq_chips, which require to mask the chip before changing the trigger type should set this flag. So the core takes care of it and the requirement for looking into desc->status in the chip goes away. Signed-off-by: Thomas Gleixner <[email protected]> Cc: Linus Walleij <[email protected]> Cc: Lars-Peter Clausen <[email protected]>
2011-02-19genirq: Wrap the remaning IRQ_* flagsThomas Gleixner1-1/+2
Use wrappers to keep them away from the core code. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Mirror irq trigger type bits in irq_data.stateThomas Gleixner1-1/+4
That's the data structure chip functions get provided. Also allow them to signal the core code that they updated the flags in irq_data.state by returning IRQ_SET_MASK_OK_NOCOPY. The default is unchanged. The type bits should be accessed via: val = irqd_get_trigger_type(irqdata); and irqd_set_trigger_type(irqdata, val); Coders who access them directly will be tracked down and slapped with stinking trouts. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Mirror IRQ_PER_CPU and IRQ_NO_BALANCING in irq_data.stateThomas Gleixner1-6/+9
That's the right data structure to look at for arch code. Accessor functions are provided. irqd_is_per_cpu(irqdata); irqd_can_balance(irqdata); Coders who access them directly will be tracked down and slapped with stinking trouts. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Move IRQ_MASKED to coreThomas Gleixner1-8/+20
Keep status in sync until all users are fixed. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Move IRQ_PENDING flag to coreThomas Gleixner1-4/+6
Keep status in sync until all users are fixed. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Move IRQ_DISABLED to coreThomas Gleixner1-17/+31
Keep status in sync until all abusers are fixed. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Move IRQ_REPLAY and IRQ_WAITING to coreThomas Gleixner1-5/+4
No users outside of core. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Move IRQ_ONESHOT to coreThomas Gleixner1-1/+1
No users outside of core. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Add IRQ_INPROGRESS to coreThomas Gleixner1-7/+9
We need to maintain the flag for now in both fields status and istate. Add a CONFIG_GENERIC_HARDIRQS_NO_COMPAT switch to allow testing w/o the status one. Wrap the access to status IRQ_INPROGRESS in a inline which can be turned of with CONFIG_GENERIC_HARDIRQS_NO_COMPAT along with the define. There is no reason that anything outside of core looks at this. That needs some modifications, but we'll get there. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Move IRQ_POLL_INPROGRESS to coreThomas Gleixner1-1/+1
No users outside of core. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Use modify_status for set_irq_nested_threadThomas Gleixner1-28/+0
No need for a separate function in the core code. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Fixup core code namespace falloutThomas Gleixner1-3/+3
Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Use handle_perpcu_event() in handle_percpu_irq()Thomas Gleixner1-8/+6
Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Use handle_irq_event() in handle_edge_irq()Thomas Gleixner1-14/+2
It's safe to drop the IRQ_INPROGRESS flag between action chain walks as we are protected by desc->lock. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Use handle_irq_event() in handle_fasteoi_irq()Thomas Gleixner1-17/+2
Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Use handle_irq_event() in handle_level_irq()Thomas Gleixner1-14/+2
Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Use handle_irq_event() in handle_simple_irq()Thomas Gleixner1-13/+2
Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Do not fiddle with IRQ_MASKED in handle_edge_irq()Thomas Gleixner1-1/+1
IRQ_MASKED is set in mask_ack_irq() anyway. Remove it from handle_edge_irq() to allow simpler ab^HHreuse of that function. Signed-off-by: Thomas Gleixner <[email protected]> Cc: Peter Zijlstra <[email protected]> LKML-Reference: <[email protected]>
2011-02-19genirq: Consolidate IRQ_DISABLEDThomas Gleixner1-4/+10
Handle IRQ_DISABLED consistent. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Remove default magicThomas Gleixner1-58/+15
Now that everything uses the wrappers, we can remove the default functions. None of those functions is performance critical. That makes the IRQ_MASKED flag tracking fully consistent. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Consolidate disable/enableThomas Gleixner1-1/+11
Create irq_disable/enable and use them to keep the flags consistent. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Consolidate startup/shutdown of interruptsThomas Gleixner1-17/+20
Aside of duplicated code some of the startup/shutdown sites do not handle the MASKED/DISABLED flags and the depth field at all. Move that to a helper function and take care of it there. Signed-off-by: Thomas Gleixner <[email protected]> Cc: Peter Zijlstra <[email protected]> LKML-Reference: <[email protected]>
2011-02-19genirq: Mark polled irqs and defer the real handlerThomas Gleixner1-6/+20
With the chip.end() function gone we might run into a situation where a poll call runs and the real interrupt comes in, sees IRQ_INPROGRESS and disables the line. That might be a perfect working one, which will then be masked forever. So mark them polled while the poll runs. When the real handler sees IRQ_INPROGRESS it checks the poll flag and waits for the polling to complete. Add the necessary amount of sanity checks to it to avoid deadlocks. Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Namespace cleanupThomas Gleixner1-14/+14
The irq namespace has become quite convoluted. My bad. Clean it up and deprecate the old functions. All new functions follow the scheme: irq number based: irq_set/get/xxx/_xxx(unsigned int irq, ...) irq_data based: irq_data_set/get/xxx/_xxx(struct irq_data *d, ....) irq_desc based: irq_desc_get_xxx(struct irq_desc *desc) Signed-off-by: Thomas Gleixner <[email protected]>
2011-02-19genirq: Add missing buslock to set_irq_type(), set_irq_wake()Thomas Gleixner1-0/+2
chips behind a slow bus cannot update the chip under desc->lock, but we miss the chip_buslock/chip_bus_sync_unlock() calls around the set type and set wake functions. Signed-off-by: Thomas Gleixner <[email protected]>