On 30. 03. 20 11:03, Michal Simek wrote: > On 30. 03. 20 10:45, Marc Zyngier wrote: >> On 2020-03-30 09:32, Michal Simek wrote: >>> Hi Thomas and Marc, >>> >>> On 29. 03. 20 22:26, tip-bot2 for Michal Simek wrote: >>>> The following commit has been merged into the irq/core branch of tip: >>>> >>>> Commit-ID: a0789993bf8266e62fea6b4613945ba081c71e7d >>>> Gitweb: >>>> https://git.kernel.org/tip/a0789993bf8266e62fea6b4613945ba081c71e7d >>>> Author: Michal Simek <michal.simek@xxxxxxxxxx> >>>> AuthorDate: Tue, 17 Mar 2020 18:25:59 +05:30 >>>> Committer: Marc Zyngier <maz@xxxxxxxxxx> >>>> CommitterDate: Sun, 22 Mar 2020 11:52:53 >>>> >>>> irqchip/xilinx: Enable generic irq multi handler >>>> >>>> Register default arch handler via driver instead of directly pointing to >>>> xilinx intc controller. This patch makes architecture code more generic. >>>> >>>> Driver calls generic domain specific irq handler which does the most of >>>> things self. Also get rid of concurrent_irq counting which hasn't been >>>> exported anywhere. >>>> Based on this loop was also optimized by using do/while loop instead of >>>> goto loop. >>>> >>>> Signed-off-by: Michal Simek <michal.simek@xxxxxxxxxx> >>>> Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> >>>> Reviewed-by: Stefan Asserhall <stefan.asserhall@xxxxxxxxxx> >>>> Link: >>>> https://lore.kernel.org/r/20200317125600.15913-4-mubin.usman.sayyed@xxxxxxxxxx >>>> >>>> --- >>>> arch/microblaze/Kconfig | 2 ++- >>>> arch/microblaze/include/asm/irq.h | 3 +--- >>>> arch/microblaze/kernel/irq.c | 21 +------------------- >>>> drivers/irqchip/irq-xilinx-intc.c | 34 +++++++++++++++++------------- >>>> 4 files changed, 23 insertions(+), 37 deletions(-) >>>> >>>> diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig >>>> index 6a331bd..242f58e 100644 >>>> --- a/arch/microblaze/Kconfig >>>> +++ b/arch/microblaze/Kconfig >>>> @@ -47,6 +47,8 @@ config MICROBLAZE >>>> select CPU_NO_EFFICIENT_FFS >>>> select MMU_GATHER_NO_RANGE if MMU >>>> select SPARSE_IRQ >>>> + select GENERIC_IRQ_MULTI_HANDLER >>>> + select HANDLE_DOMAIN_IRQ >>>> >>>> # Endianness selection >>>> choice >>>> diff --git a/arch/microblaze/include/asm/irq.h >>>> b/arch/microblaze/include/asm/irq.h >>>> index eac2fb4..5166f08 100644 >>>> --- a/arch/microblaze/include/asm/irq.h >>>> +++ b/arch/microblaze/include/asm/irq.h >>>> @@ -14,7 +14,4 @@ >>>> struct pt_regs; >>>> extern void do_IRQ(struct pt_regs *regs); >>>> >>>> -/* should be defined in each interrupt controller driver */ >>>> -extern unsigned int xintc_get_irq(void); >>>> - >>>> #endif /* _ASM_MICROBLAZE_IRQ_H */ >>>> diff --git a/arch/microblaze/kernel/irq.c b/arch/microblaze/kernel/irq.c >>>> index 903dad8..0b37dde 100644 >>>> --- a/arch/microblaze/kernel/irq.c >>>> +++ b/arch/microblaze/kernel/irq.c >>>> @@ -20,29 +20,10 @@ >>>> #include <linux/irqchip.h> >>>> #include <linux/of_irq.h> >>>> >>>> -static u32 concurrent_irq; >>>> - >>>> void __irq_entry do_IRQ(struct pt_regs *regs) >>>> { >>>> - unsigned int irq; >>>> - struct pt_regs *old_regs = set_irq_regs(regs); >>>> trace_hardirqs_off(); >>>> - >>>> - irq_enter(); >>>> - irq = xintc_get_irq(); >>>> -next_irq: >>>> - BUG_ON(!irq); >>>> - generic_handle_irq(irq); >>>> - >>>> - irq = xintc_get_irq(); >>>> - if (irq != -1U) { >>>> - pr_debug("next irq: %d\n", irq); >>>> - ++concurrent_irq; >>>> - goto next_irq; >>>> - } >>>> - >>>> - irq_exit(); >>>> - set_irq_regs(old_regs); >>>> + handle_arch_irq(regs); >>>> trace_hardirqs_on(); >>>> } >>>> >>>> diff --git a/drivers/irqchip/irq-xilinx-intc.c >>>> b/drivers/irqchip/irq-xilinx-intc.c >>>> index 1d3d273..ea74181 100644 >>>> --- a/drivers/irqchip/irq-xilinx-intc.c >>>> +++ b/drivers/irqchip/irq-xilinx-intc.c >>>> @@ -124,20 +124,6 @@ static unsigned int xintc_get_irq_local(struct >>>> xintc_irq_chip *irqc) >>>> return irq; >>>> } >>>> >>>> -unsigned int xintc_get_irq(void) >>>> -{ >>>> - unsigned int irq = -1; >>>> - u32 hwirq; >>>> - >>>> - hwirq = xintc_read(primary_intc, IVR); >>>> - if (hwirq != -1U) >>>> - irq = irq_find_mapping(primary_intc->root_domain, hwirq); >>>> - >>>> - pr_debug("irq-xilinx: hwirq=%d, irq=%d\n", hwirq, irq); >>>> - >>>> - return irq; >>>> -} >>>> - One more thing. We could also get this function back and it will be fine too. But up2you. Thanks, Michal