On 30. 03. 20 11:19, Marc Zyngier wrote: > On 2020-03-30 10:12, Michal Simek wrote: >> 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. > > If you leave it up to me, I'll revert the whole series right now. > > What I'd expect from you is to tell me exactly what is the minimal > change that keeps it working on both ARM, microblaze and PPC. > If it is a revert, tell me which patches to revert. if it is a patch > on top, send me the fix so that I can queue it now. It won't be that simple. Please revert patches 9c2d4f525c00 ("irqchip/xilinx: Do not call irq_set_default_host()") a0789993bf82 ("irqchip/xilinx: Enable generic irq multi handler") And we should be fine. Thanks, Michal