Loading Documentation/DocBook/genericirq.tmpl +52 −32 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ </authorgroup> <copyright> <year>2005-2006</year> <year>2005-2010</year> <holder>Thomas Gleixner</holder> </copyright> <copyright> Loading Loading @@ -100,6 +100,10 @@ <listitem><para>Edge type</para></listitem> <listitem><para>Simple type</para></listitem> </itemizedlist> During the implementation we identified another type: <itemizedlist> <listitem><para>Fast EOI type</para></listitem> </itemizedlist> In the SMP world of the __do_IRQ() super-handler another type was identified: <itemizedlist> Loading Loading @@ -153,6 +157,7 @@ is still available. This leads to a kind of duality for the time being. Over time the new model should be used in more and more architectures, as it enables smaller and cleaner IRQ subsystems. It's deprecated for three years now and about to be removed. </para> </chapter> <chapter id="bugs"> Loading Loading @@ -217,6 +222,7 @@ <itemizedlist> <listitem><para>handle_level_irq</para></listitem> <listitem><para>handle_edge_irq</para></listitem> <listitem><para>handle_fasteoi_irq</para></listitem> <listitem><para>handle_simple_irq</para></listitem> <listitem><para>handle_percpu_irq</para></listitem> </itemizedlist> Loading @@ -233,33 +239,33 @@ are used by the default flow implementations. The following helper functions are implemented (simplified excerpt): <programlisting> default_enable(irq) default_enable(struct irq_data *data) { desc->chip->unmask(irq); desc->chip->irq_unmask(data); } default_disable(irq) default_disable(struct irq_data *data) { if (!delay_disable(irq)) desc->chip->mask(irq); if (!delay_disable(data)) desc->chip->irq_mask(data); } default_ack(irq) default_ack(struct irq_data *data) { chip->ack(irq); chip->irq_ack(data); } default_mask_ack(irq) default_mask_ack(struct irq_data *data) { if (chip->mask_ack) { chip->mask_ack(irq); if (chip->irq_mask_ack) { chip->irq_mask_ack(data); } else { chip->mask(irq); chip->ack(irq); chip->irq_mask(data); chip->irq_ack(data); } } noop(irq) noop(struct irq_data *data)) { } Loading @@ -278,9 +284,24 @@ noop(irq) <para> The following control flow is implemented (simplified excerpt): <programlisting> desc->chip->start(); desc->chip->irq_mask(); handle_IRQ_event(desc->action); desc->chip->irq_unmask(); </programlisting> </para> </sect3> <sect3 id="Default_FASTEOI_IRQ_flow_handler"> <title>Default Fast EOI IRQ flow handler</title> <para> handle_fasteoi_irq provides a generic implementation for interrupts, which only need an EOI at the end of the handler </para> <para> The following control flow is implemented (simplified excerpt): <programlisting> handle_IRQ_event(desc->action); desc->chip->end(); desc->chip->irq_eoi(); </programlisting> </para> </sect3> Loading @@ -294,20 +315,19 @@ desc->chip->end(); The following control flow is implemented (simplified excerpt): <programlisting> if (desc->status & running) { desc->chip->hold(); desc->chip->irq_mask(); desc->status |= pending | masked; return; } desc->chip->start(); desc->chip->irq_ack(); desc->status |= running; do { if (desc->status & masked) desc->chip->enable(); desc->chip->irq_unmask(); desc->status &= ~pending; handle_IRQ_event(desc->action); } while (status & pending); desc->status &= ~running; desc->chip->end(); </programlisting> </para> </sect3> Loading Loading @@ -342,9 +362,9 @@ handle_IRQ_event(desc->action); <para> The following control flow is implemented (simplified excerpt): <programlisting> desc->chip->start(); handle_IRQ_event(desc->action); desc->chip->end(); if (desc->chip->irq_eoi) desc->chip->irq_eoi(); </programlisting> </para> </sect3> Loading Loading @@ -375,8 +395,7 @@ desc->chip->end(); mechanism. (It's necessary to enable CONFIG_HARDIRQS_SW_RESEND when you want to use the delayed interrupt disable feature and your hardware is not capable of retriggering an interrupt.) The delayed interrupt disable can be runtime enabled, per interrupt, by setting the IRQ_DELAYED_DISABLE flag in the irq_desc status field. The delayed interrupt disable is not configurable. </para> </sect2> </sect1> Loading @@ -387,13 +406,13 @@ desc->chip->end(); contains all the direct chip relevant functions, which can be utilized by the irq flow implementations. <itemizedlist> <listitem><para>ack()</para></listitem> <listitem><para>mask_ack() - Optional, recommended for performance</para></listitem> <listitem><para>mask()</para></listitem> <listitem><para>unmask()</para></listitem> <listitem><para>retrigger() - Optional</para></listitem> <listitem><para>set_type() - Optional</para></listitem> <listitem><para>set_wake() - Optional</para></listitem> <listitem><para>irq_ack()</para></listitem> <listitem><para>irq_mask_ack() - Optional, recommended for performance</para></listitem> <listitem><para>irq_mask()</para></listitem> <listitem><para>irq_unmask()</para></listitem> <listitem><para>irq_retrigger() - Optional</para></listitem> <listitem><para>irq_set_type() - Optional</para></listitem> <listitem><para>irq_set_wake() - Optional</para></listitem> </itemizedlist> These primitives are strictly intended to mean what they say: ack means ACK, masking means masking of an IRQ line, etc. It is up to the flow Loading Loading @@ -458,6 +477,7 @@ desc->chip->end(); <para> This chapter contains the autogenerated documentation of the internal functions. </para> !Ikernel/irq/irqdesc.c !Ikernel/irq/handle.c !Ikernel/irq/chip.c </chapter> Loading MAINTAINERS +23 −3 Original line number Diff line number Diff line Loading @@ -3239,6 +3239,12 @@ F: drivers/net/irda/ F: include/net/irda/ F: net/irda/ IRQ SUBSYSTEM M: Thomas Gleixner <tglx@linutronix.de> S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core F: kernel/irq/ ISAPNP M: Jaroslav Kysela <perex@perex.cz> S: Maintained Loading Loading @@ -6522,11 +6528,25 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86. S: Maintained F: drivers/platform/x86 XEN PCI SUBSYSTEM M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> L: xen-devel@lists.xensource.com S: Supported F: arch/x86/pci/*xen* F: drivers/pci/*xen* XEN SWIOTLB SUBSYSTEM M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> L: xen-devel@lists.xensource.com S: Supported F: arch/x86/xen/*swiotlb* F: drivers/xen/*swiotlb* XEN HYPERVISOR INTERFACE M: Jeremy Fitzhardinge <jeremy@xensource.com> M: Chris Wright <chrisw@sous-sol.org> M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> L: xen-devel@lists.xen.org L: virtualization@lists.osdl.org L: xen-devel@lists.xensource.com S: Supported F: arch/x86/xen/ F: drivers/*/xen-*front.c Loading arch/arm/include/asm/hw_irq.h +2 −0 Original line number Diff line number Diff line Loading @@ -24,4 +24,6 @@ void set_irq_flags(unsigned int irq, unsigned int flags); #define IRQF_PROBE (1 << 1) #define IRQF_NOAUTOEN (1 << 2) #define ARCH_IRQ_INIT_FLAGS (IRQ_NOREQUEST | IRQ_NOPROBE) #endif arch/arm/kernel/irq.c +1 −9 Original line number Diff line number Diff line Loading @@ -154,14 +154,6 @@ void set_irq_flags(unsigned int irq, unsigned int iflags) void __init init_IRQ(void) { struct irq_desc *desc; int irq; for (irq = 0; irq < nr_irqs; irq++) { desc = irq_to_desc_alloc_node(irq, 0); desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE; } init_arch_irq(); } Loading @@ -169,7 +161,7 @@ void __init init_IRQ(void) int __init arch_probe_nr_irqs(void) { nr_irqs = arch_nr_irqs ? arch_nr_irqs : NR_IRQS; return 0; return nr_irqs; } #endif Loading arch/arm/mach-bcmring/irq.c +3 −3 Original line number Diff line number Diff line Loading @@ -67,21 +67,21 @@ static void bcmring_unmask_irq2(unsigned int irq) } static struct irq_chip bcmring_irq0_chip = { .typename = "ARM-INTC0", .name = "ARM-INTC0", .ack = bcmring_mask_irq0, .mask = bcmring_mask_irq0, /* mask a specific interrupt, blocking its delivery. */ .unmask = bcmring_unmask_irq0, /* unmaks an interrupt */ }; static struct irq_chip bcmring_irq1_chip = { .typename = "ARM-INTC1", .name = "ARM-INTC1", .ack = bcmring_mask_irq1, .mask = bcmring_mask_irq1, .unmask = bcmring_unmask_irq1, }; static struct irq_chip bcmring_irq2_chip = { .typename = "ARM-SINTC", .name = "ARM-SINTC", .ack = bcmring_mask_irq2, .mask = bcmring_mask_irq2, .unmask = bcmring_unmask_irq2, Loading Loading
Documentation/DocBook/genericirq.tmpl +52 −32 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ </authorgroup> <copyright> <year>2005-2006</year> <year>2005-2010</year> <holder>Thomas Gleixner</holder> </copyright> <copyright> Loading Loading @@ -100,6 +100,10 @@ <listitem><para>Edge type</para></listitem> <listitem><para>Simple type</para></listitem> </itemizedlist> During the implementation we identified another type: <itemizedlist> <listitem><para>Fast EOI type</para></listitem> </itemizedlist> In the SMP world of the __do_IRQ() super-handler another type was identified: <itemizedlist> Loading Loading @@ -153,6 +157,7 @@ is still available. This leads to a kind of duality for the time being. Over time the new model should be used in more and more architectures, as it enables smaller and cleaner IRQ subsystems. It's deprecated for three years now and about to be removed. </para> </chapter> <chapter id="bugs"> Loading Loading @@ -217,6 +222,7 @@ <itemizedlist> <listitem><para>handle_level_irq</para></listitem> <listitem><para>handle_edge_irq</para></listitem> <listitem><para>handle_fasteoi_irq</para></listitem> <listitem><para>handle_simple_irq</para></listitem> <listitem><para>handle_percpu_irq</para></listitem> </itemizedlist> Loading @@ -233,33 +239,33 @@ are used by the default flow implementations. The following helper functions are implemented (simplified excerpt): <programlisting> default_enable(irq) default_enable(struct irq_data *data) { desc->chip->unmask(irq); desc->chip->irq_unmask(data); } default_disable(irq) default_disable(struct irq_data *data) { if (!delay_disable(irq)) desc->chip->mask(irq); if (!delay_disable(data)) desc->chip->irq_mask(data); } default_ack(irq) default_ack(struct irq_data *data) { chip->ack(irq); chip->irq_ack(data); } default_mask_ack(irq) default_mask_ack(struct irq_data *data) { if (chip->mask_ack) { chip->mask_ack(irq); if (chip->irq_mask_ack) { chip->irq_mask_ack(data); } else { chip->mask(irq); chip->ack(irq); chip->irq_mask(data); chip->irq_ack(data); } } noop(irq) noop(struct irq_data *data)) { } Loading @@ -278,9 +284,24 @@ noop(irq) <para> The following control flow is implemented (simplified excerpt): <programlisting> desc->chip->start(); desc->chip->irq_mask(); handle_IRQ_event(desc->action); desc->chip->irq_unmask(); </programlisting> </para> </sect3> <sect3 id="Default_FASTEOI_IRQ_flow_handler"> <title>Default Fast EOI IRQ flow handler</title> <para> handle_fasteoi_irq provides a generic implementation for interrupts, which only need an EOI at the end of the handler </para> <para> The following control flow is implemented (simplified excerpt): <programlisting> handle_IRQ_event(desc->action); desc->chip->end(); desc->chip->irq_eoi(); </programlisting> </para> </sect3> Loading @@ -294,20 +315,19 @@ desc->chip->end(); The following control flow is implemented (simplified excerpt): <programlisting> if (desc->status & running) { desc->chip->hold(); desc->chip->irq_mask(); desc->status |= pending | masked; return; } desc->chip->start(); desc->chip->irq_ack(); desc->status |= running; do { if (desc->status & masked) desc->chip->enable(); desc->chip->irq_unmask(); desc->status &= ~pending; handle_IRQ_event(desc->action); } while (status & pending); desc->status &= ~running; desc->chip->end(); </programlisting> </para> </sect3> Loading Loading @@ -342,9 +362,9 @@ handle_IRQ_event(desc->action); <para> The following control flow is implemented (simplified excerpt): <programlisting> desc->chip->start(); handle_IRQ_event(desc->action); desc->chip->end(); if (desc->chip->irq_eoi) desc->chip->irq_eoi(); </programlisting> </para> </sect3> Loading Loading @@ -375,8 +395,7 @@ desc->chip->end(); mechanism. (It's necessary to enable CONFIG_HARDIRQS_SW_RESEND when you want to use the delayed interrupt disable feature and your hardware is not capable of retriggering an interrupt.) The delayed interrupt disable can be runtime enabled, per interrupt, by setting the IRQ_DELAYED_DISABLE flag in the irq_desc status field. The delayed interrupt disable is not configurable. </para> </sect2> </sect1> Loading @@ -387,13 +406,13 @@ desc->chip->end(); contains all the direct chip relevant functions, which can be utilized by the irq flow implementations. <itemizedlist> <listitem><para>ack()</para></listitem> <listitem><para>mask_ack() - Optional, recommended for performance</para></listitem> <listitem><para>mask()</para></listitem> <listitem><para>unmask()</para></listitem> <listitem><para>retrigger() - Optional</para></listitem> <listitem><para>set_type() - Optional</para></listitem> <listitem><para>set_wake() - Optional</para></listitem> <listitem><para>irq_ack()</para></listitem> <listitem><para>irq_mask_ack() - Optional, recommended for performance</para></listitem> <listitem><para>irq_mask()</para></listitem> <listitem><para>irq_unmask()</para></listitem> <listitem><para>irq_retrigger() - Optional</para></listitem> <listitem><para>irq_set_type() - Optional</para></listitem> <listitem><para>irq_set_wake() - Optional</para></listitem> </itemizedlist> These primitives are strictly intended to mean what they say: ack means ACK, masking means masking of an IRQ line, etc. It is up to the flow Loading Loading @@ -458,6 +477,7 @@ desc->chip->end(); <para> This chapter contains the autogenerated documentation of the internal functions. </para> !Ikernel/irq/irqdesc.c !Ikernel/irq/handle.c !Ikernel/irq/chip.c </chapter> Loading
MAINTAINERS +23 −3 Original line number Diff line number Diff line Loading @@ -3239,6 +3239,12 @@ F: drivers/net/irda/ F: include/net/irda/ F: net/irda/ IRQ SUBSYSTEM M: Thomas Gleixner <tglx@linutronix.de> S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core F: kernel/irq/ ISAPNP M: Jaroslav Kysela <perex@perex.cz> S: Maintained Loading Loading @@ -6522,11 +6528,25 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86. S: Maintained F: drivers/platform/x86 XEN PCI SUBSYSTEM M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> L: xen-devel@lists.xensource.com S: Supported F: arch/x86/pci/*xen* F: drivers/pci/*xen* XEN SWIOTLB SUBSYSTEM M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> L: xen-devel@lists.xensource.com S: Supported F: arch/x86/xen/*swiotlb* F: drivers/xen/*swiotlb* XEN HYPERVISOR INTERFACE M: Jeremy Fitzhardinge <jeremy@xensource.com> M: Chris Wright <chrisw@sous-sol.org> M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> L: xen-devel@lists.xen.org L: virtualization@lists.osdl.org L: xen-devel@lists.xensource.com S: Supported F: arch/x86/xen/ F: drivers/*/xen-*front.c Loading
arch/arm/include/asm/hw_irq.h +2 −0 Original line number Diff line number Diff line Loading @@ -24,4 +24,6 @@ void set_irq_flags(unsigned int irq, unsigned int flags); #define IRQF_PROBE (1 << 1) #define IRQF_NOAUTOEN (1 << 2) #define ARCH_IRQ_INIT_FLAGS (IRQ_NOREQUEST | IRQ_NOPROBE) #endif
arch/arm/kernel/irq.c +1 −9 Original line number Diff line number Diff line Loading @@ -154,14 +154,6 @@ void set_irq_flags(unsigned int irq, unsigned int iflags) void __init init_IRQ(void) { struct irq_desc *desc; int irq; for (irq = 0; irq < nr_irqs; irq++) { desc = irq_to_desc_alloc_node(irq, 0); desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE; } init_arch_irq(); } Loading @@ -169,7 +161,7 @@ void __init init_IRQ(void) int __init arch_probe_nr_irqs(void) { nr_irqs = arch_nr_irqs ? arch_nr_irqs : NR_IRQS; return 0; return nr_irqs; } #endif Loading
arch/arm/mach-bcmring/irq.c +3 −3 Original line number Diff line number Diff line Loading @@ -67,21 +67,21 @@ static void bcmring_unmask_irq2(unsigned int irq) } static struct irq_chip bcmring_irq0_chip = { .typename = "ARM-INTC0", .name = "ARM-INTC0", .ack = bcmring_mask_irq0, .mask = bcmring_mask_irq0, /* mask a specific interrupt, blocking its delivery. */ .unmask = bcmring_unmask_irq0, /* unmaks an interrupt */ }; static struct irq_chip bcmring_irq1_chip = { .typename = "ARM-INTC1", .name = "ARM-INTC1", .ack = bcmring_mask_irq1, .mask = bcmring_mask_irq1, .unmask = bcmring_unmask_irq1, }; static struct irq_chip bcmring_irq2_chip = { .typename = "ARM-SINTC", .name = "ARM-SINTC", .ack = bcmring_mask_irq2, .mask = bcmring_mask_irq2, .unmask = bcmring_unmask_irq2, Loading