All of lore.kernel.org
 help / color / mirror / Atom feed
From: Noam Camus <noamc@ezchip.com>
To: Vineet Gupta <Vineet.Gupta1@synopsys.com>,
	Marc Zyngier <marc.zyngier@arm.com>,
	"linux-snps-arc@lists.infradead.org" 
	<linux-snps-arc@lists.infradead.org>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"Chris Metcalf" <cmetcalf@ezchip.com>,
	"daniel.lezcano@linaro.org" <daniel.lezcano@linaro.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	"Jason Cooper" <jason@lakedaemon.net>
Subject: Re: [PATCH v4 05/19] irqchip: add nps Internal and external irqchips
Date: Fri, 29 Jan 2016 16:37:02 +0000	[thread overview]
Message-ID: <HE1PR02MB1387F61AE58E7011D744E564D6DB0@HE1PR02MB1387.eurprd02.prod.outlook.com> (raw)
In-Reply-To: <56A61E52.3050505@synopsys.com>

Hi Marc,

Please respond to Vineet last email.
I wish to close the IPI handling within my patch set.

Regards,
Noam
________________________________________
From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
Sent: Monday, January 25, 2016 3:08:34 PM
To: Marc Zyngier; Noam Camus; linux-snps-arc@lists.infradead.org
Cc: linux-kernel@vger.kernel.org; Chris Metcalf; daniel.lezcano@linaro.org; Thomas Gleixner; Jason Cooper
Subject: Re: [PATCH v4 05/19] irqchip: add nps Internal and external irqchips

Hi Marc,

On Friday 18 December 2015 10:01 PM, Marc Zyngier wrote:
> On 18/12/15 14:29, Noam Camus wrote:
>>> From: Marc Zyngier [mailto:marc.zyngier@arm.com]
>>> Sent: Friday, December 18, 2015 1:21 PM
>>
>>>> I need this for my per CPU irqs such timer and IPI which do not come
>>>> from some external device but from CPUs. For these IRQs I am calling
>>>> to irq_create_mapping() from my platform at arch/arc and at that point
>>>> I got no irqdomain and using irq_find_host() is not good since I got
>>>> no device_node (at most I can have DT root).
>>
>>> That's a problem. You should never do that for your timer (doing a request_irq will do the right thing, and that's what your timer driver already does).
>>
>> Please be more specific, from all that I wrote what is the problem?
>
> Calling irq_create_mapping out of the blue like you do it here:
>
> +static void eznps_init_per_cpu(int cpu)
> +{
> +     /* Create mapping for all per cpu IRQs */
> +     if (cpu == 0) {
> +             irq_create_mapping(NULL, TIMER0_IRQ);
> +             irq_create_mapping(NULL, IPI_IRQ);
> +     }
>
> is simply not acceptable.

I understand but... see below

>>> As for initializing your IPIs, they are usually outside of the IRQ
>>> space, so you should handle them separately (and get your irqchip
>>> to initialize them).
>> I am handling all my IRQs within same irqchip, which is the only one
>> I have. So I am not sure what you expect here. Please be more
>> elaborate.
>
> Do not create a mapping for IPIs. Full stop. Handle them independently
> from your normal IRQs.

why not ? IPI is a hardware construct afterall.

Anyhow I looked in arch/arm and do_IPI/handle_IPI are the handlers. do_IPI is
called from asm, irq-gic.c calls handle_IPI. I can't seem to find an explicit
request_irq / request_percpu_irq for IPI irq ?

...

>> Note that I am working with ARC (seem alike) here and we do not
>> define CONFIG_HANDLE_DOMAIN_IRQ and do not implement
>> set_handle_irq().
>>
>> So for ARC this reverse mapping is something we can leave without
>> (maybe because we are kind of a legacy domain).
>
> Yeah, I just located the crap: arch_do_IRQ() happily takes a hwirq (the
> vector number), and uses that as a Linux IRQ. This looks a lot like ARM
> pre-DT, about 10 years ago.
>
> Well, time to meet the 21st century. If you intend to use DT, please fix
> your arch port. Otherwise, just hardcode everything in your platform and
> don't pretend to support device tree.

Following works for me, hopefully it is closer to 21st century code :-)

----------->
>From 619eb5179d865140a723dd524d0e42fbf234b53b Mon Sep 17 00:00:00 2001
From: Vineet Gupta <vgupta@synopsys.com>
Date: Fri, 1 Jan 2016 15:12:54 +0530
Subject: [PATCH] ARC: [intc-*] Do a domain lookup in primary handler for hwirq
 -> linux virq

The primary interrupt handler arch_do_IRQ() was passing hwirq as linux
virq to core code. This was fragile and worked so far as we only had legacy/linear
domains.

This came out of a rant by Marc Zyngier.
http://lists.infradead.org/pipermail/linux-snps-arc/2015-December/000298.html

Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Noam Camus <noamc@ezchip.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
---
 arch/arc/Kconfig               |  1 +
 arch/arc/kernel/intc-arcv2.c   |  9 ++++++---
 arch/arc/kernel/intc-compact.c | 10 ++++++----
 arch/arc/kernel/irq.c          |  9 ++-------
 4 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig
index 6312f607932f..576f1c40ba75 100644
--- a/arch/arc/Kconfig
+++ b/arch/arc/Kconfig
@@ -31,6 +31,7 @@ config ARC
        select HAVE_MOD_ARCH_SPECIFIC if ARC_DW2_UNWIND
        select HAVE_OPROFILE
        select HAVE_PERF_EVENTS
+       select HANDLE_DOMAIN_IRQ
        select IRQ_DOMAIN
        select MODULES_USE_ELF_RELA
        select NO_BOOTMEM
diff --git a/arch/arc/kernel/intc-arcv2.c b/arch/arc/kernel/intc-arcv2.c
index 0394f9f61b46..cede73b50d31 100644
--- a/arch/arc/kernel/intc-arcv2.c
+++ b/arch/arc/kernel/intc-arcv2.c
@@ -130,21 +130,24 @@ static const struct irq_domain_ops arcv2_irq_ops = {
        .map = arcv2_irq_map,
 };

-static struct irq_domain *root_domain;

 static int __init
 init_onchip_IRQ(struct device_node *intc, struct device_node *parent)
 {
+       struct irq_domain *root_domain;
+
        if (parent)
                panic("DeviceTree incore intc not a root irq controller\n");

        root_domain = irq_domain_add_legacy(intc, NR_CPU_IRQS, 0, 0,
                                            &arcv2_irq_ops, NULL);
-
        if (!root_domain)
                panic("root irq domain not avail\n");

-       /* with this we don't need to export root_domain */
+       /*
+        * Needed for primary domain lookup to succeed
+        * This is a primary irqchip, and can never have a parent
+        */
        irq_set_default_host(root_domain);

        return 0;
diff --git a/arch/arc/kernel/intc-compact.c b/arch/arc/kernel/intc-compact.c
index 06bcedf19b62..c2df66624bbb 100644
--- a/arch/arc/kernel/intc-compact.c
+++ b/arch/arc/kernel/intc-compact.c
@@ -97,21 +97,23 @@ static const struct irq_domain_ops arc_intc_domain_ops = {
        .map = arc_intc_domain_map,
 };

-static struct irq_domain *root_domain;
-
 static int __init
 init_onchip_IRQ(struct device_node *intc, struct device_node *parent)
 {
+       struct irq_domain *root_domain;
+
        if (parent)
                panic("DeviceTree incore intc not a root irq controller\n");

        root_domain = irq_domain_add_legacy(intc, NR_CPU_IRQS, 0, 0,
                                            &arc_intc_domain_ops, NULL);
-
        if (!root_domain)
                panic("root irq domain not avail\n");

-       /* with this we don't need to export root_domain */
+       /*
+        * Needed for primary domain lookup to succeed
+        * This is a primary irqchip, and can never have a parent
+        */
        irq_set_default_host(root_domain);

        return 0;
diff --git a/arch/arc/kernel/irq.c b/arch/arc/kernel/irq.c
index ba17f85285cf..5c027005039b 100644
--- a/arch/arc/kernel/irq.c
+++ b/arch/arc/kernel/irq.c
@@ -41,14 +41,9 @@ void __init init_IRQ(void)
  * "C" Entry point for any ARC ISR, called from low level vector handler
  * @irq is the vector number read from ICAUSE reg of on-chip intc
  */
-void arch_do_IRQ(unsigned int irq, struct pt_regs *regs)
+void arch_do_IRQ(unsigned int hwirq, struct pt_regs *regs)
 {
-       struct pt_regs *old_regs = set_irq_regs(regs);
-
-       irq_enter();
-       generic_handle_irq(irq);
-       irq_exit();
-       set_irq_regs(old_regs);
+       handle_domain_irq(NULL, hwirq, regs);
 }

 /*
--
2.5.0

WARNING: multiple messages have this Message-ID (diff)
From: noamc@ezchip.com (Noam Camus)
To: linux-snps-arc@lists.infradead.org
Subject: [PATCH v4 05/19] irqchip: add nps Internal and external irqchips
Date: Fri, 29 Jan 2016 16:37:02 +0000	[thread overview]
Message-ID: <HE1PR02MB1387F61AE58E7011D744E564D6DB0@HE1PR02MB1387.eurprd02.prod.outlook.com> (raw)
In-Reply-To: <56A61E52.3050505@synopsys.com>

Hi Marc,

Please respond to Vineet last email.
I wish to close the IPI handling within my patch set.

Regards,
Noam
________________________________________
From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
Sent: Monday, January 25, 2016 3:08:34 PM
To: Marc Zyngier; Noam Camus; linux-snps-arc at lists.infradead.org
Cc: linux-kernel at vger.kernel.org; Chris Metcalf; daniel.lezcano at linaro.org; Thomas Gleixner; Jason Cooper
Subject: Re: [PATCH v4 05/19] irqchip: add nps Internal and external irqchips

Hi Marc,

On Friday 18 December 2015 10:01 PM, Marc Zyngier wrote:
> On 18/12/15 14:29, Noam Camus wrote:
>>> From: Marc Zyngier [mailto:marc.zyngier at arm.com]
>>> Sent: Friday, December 18, 2015 1:21 PM
>>
>>>> I need this for my per CPU irqs such timer and IPI which do not come
>>>> from some external device but from CPUs. For these IRQs I am calling
>>>> to irq_create_mapping() from my platform at arch/arc and at that point
>>>> I got no irqdomain and using irq_find_host() is not good since I got
>>>> no device_node (at most I can have DT root).
>>
>>> That's a problem. You should never do that for your timer (doing a request_irq will do the right thing, and that's what your timer driver already does).
>>
>> Please be more specific, from all that I wrote what is the problem?
>
> Calling irq_create_mapping out of the blue like you do it here:
>
> +static void eznps_init_per_cpu(int cpu)
> +{
> +     /* Create mapping for all per cpu IRQs */
> +     if (cpu == 0) {
> +             irq_create_mapping(NULL, TIMER0_IRQ);
> +             irq_create_mapping(NULL, IPI_IRQ);
> +     }
>
> is simply not acceptable.

I understand but... see below

>>> As for initializing your IPIs, they are usually outside of the IRQ
>>> space, so you should handle them separately (and get your irqchip
>>> to initialize them).
>> I am handling all my IRQs within same irqchip, which is the only one
>> I have. So I am not sure what you expect here. Please be more
>> elaborate.
>
> Do not create a mapping for IPIs. Full stop. Handle them independently
> from your normal IRQs.

why not ? IPI is a hardware construct afterall.

Anyhow I looked in arch/arm and do_IPI/handle_IPI are the handlers. do_IPI is
called from asm, irq-gic.c calls handle_IPI. I can't seem to find an explicit
request_irq / request_percpu_irq for IPI irq ?

...

>> Note that I am working with ARC (seem alike) here and we do not
>> define CONFIG_HANDLE_DOMAIN_IRQ and do not implement
>> set_handle_irq().
>>
>> So for ARC this reverse mapping is something we can leave without
>> (maybe because we are kind of a legacy domain).
>
> Yeah, I just located the crap: arch_do_IRQ() happily takes a hwirq (the
> vector number), and uses that as a Linux IRQ. This looks a lot like ARM
> pre-DT, about 10 years ago.
>
> Well, time to meet the 21st century. If you intend to use DT, please fix
> your arch port. Otherwise, just hardcode everything in your platform and
> don't pretend to support device tree.

Following works for me, hopefully it is closer to 21st century code :-)

----------->
>From 619eb5179d865140a723dd524d0e42fbf234b53b Mon Sep 17 00:00:00 2001
From: Vineet Gupta <vgupta@synopsys.com>
Date: Fri, 1 Jan 2016 15:12:54 +0530
Subject: [PATCH] ARC: [intc-*] Do a domain lookup in primary handler for hwirq
 -> linux virq

The primary interrupt handler arch_do_IRQ() was passing hwirq as linux
virq to core code. This was fragile and worked so far as we only had legacy/linear
domains.

This came out of a rant by Marc Zyngier.
http://lists.infradead.org/pipermail/linux-snps-arc/2015-December/000298.html

Cc: Marc Zyngier <marc.zyngier at arm.com>
Cc: Thomas Gleixner <tglx at linutronix.de>
Cc: Noam Camus <noamc at ezchip.com>
Signed-off-by: Vineet Gupta <vgupta at synopsys.com>
---
 arch/arc/Kconfig               |  1 +
 arch/arc/kernel/intc-arcv2.c   |  9 ++++++---
 arch/arc/kernel/intc-compact.c | 10 ++++++----
 arch/arc/kernel/irq.c          |  9 ++-------
 4 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig
index 6312f607932f..576f1c40ba75 100644
--- a/arch/arc/Kconfig
+++ b/arch/arc/Kconfig
@@ -31,6 +31,7 @@ config ARC
        select HAVE_MOD_ARCH_SPECIFIC if ARC_DW2_UNWIND
        select HAVE_OPROFILE
        select HAVE_PERF_EVENTS
+       select HANDLE_DOMAIN_IRQ
        select IRQ_DOMAIN
        select MODULES_USE_ELF_RELA
        select NO_BOOTMEM
diff --git a/arch/arc/kernel/intc-arcv2.c b/arch/arc/kernel/intc-arcv2.c
index 0394f9f61b46..cede73b50d31 100644
--- a/arch/arc/kernel/intc-arcv2.c
+++ b/arch/arc/kernel/intc-arcv2.c
@@ -130,21 +130,24 @@ static const struct irq_domain_ops arcv2_irq_ops = {
        .map = arcv2_irq_map,
 };

-static struct irq_domain *root_domain;

 static int __init
 init_onchip_IRQ(struct device_node *intc, struct device_node *parent)
 {
+       struct irq_domain *root_domain;
+
        if (parent)
                panic("DeviceTree incore intc not a root irq controller\n");

        root_domain = irq_domain_add_legacy(intc, NR_CPU_IRQS, 0, 0,
                                            &arcv2_irq_ops, NULL);
-
        if (!root_domain)
                panic("root irq domain not avail\n");

-       /* with this we don't need to export root_domain */
+       /*
+        * Needed for primary domain lookup to succeed
+        * This is a primary irqchip, and can never have a parent
+        */
        irq_set_default_host(root_domain);

        return 0;
diff --git a/arch/arc/kernel/intc-compact.c b/arch/arc/kernel/intc-compact.c
index 06bcedf19b62..c2df66624bbb 100644
--- a/arch/arc/kernel/intc-compact.c
+++ b/arch/arc/kernel/intc-compact.c
@@ -97,21 +97,23 @@ static const struct irq_domain_ops arc_intc_domain_ops = {
        .map = arc_intc_domain_map,
 };

-static struct irq_domain *root_domain;
-
 static int __init
 init_onchip_IRQ(struct device_node *intc, struct device_node *parent)
 {
+       struct irq_domain *root_domain;
+
        if (parent)
                panic("DeviceTree incore intc not a root irq controller\n");

        root_domain = irq_domain_add_legacy(intc, NR_CPU_IRQS, 0, 0,
                                            &arc_intc_domain_ops, NULL);
-
        if (!root_domain)
                panic("root irq domain not avail\n");

-       /* with this we don't need to export root_domain */
+       /*
+        * Needed for primary domain lookup to succeed
+        * This is a primary irqchip, and can never have a parent
+        */
        irq_set_default_host(root_domain);

        return 0;
diff --git a/arch/arc/kernel/irq.c b/arch/arc/kernel/irq.c
index ba17f85285cf..5c027005039b 100644
--- a/arch/arc/kernel/irq.c
+++ b/arch/arc/kernel/irq.c
@@ -41,14 +41,9 @@ void __init init_IRQ(void)
  * "C" Entry point for any ARC ISR, called from low level vector handler
  * @irq is the vector number read from ICAUSE reg of on-chip intc
  */
-void arch_do_IRQ(unsigned int irq, struct pt_regs *regs)
+void arch_do_IRQ(unsigned int hwirq, struct pt_regs *regs)
 {
-       struct pt_regs *old_regs = set_irq_regs(regs);
-
-       irq_enter();
-       generic_handle_irq(irq);
-       irq_exit();
-       set_irq_regs(old_regs);
+       handle_domain_irq(NULL, hwirq, regs);
 }

 /*
--
2.5.0

  reply	other threads:[~2016-01-29 16:37 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-16  1:10 [PATCH v4 00/19] Adding plat-eznps to ARC Noam Camus
2015-12-16  1:10 ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 01/19] Documentation: Add EZchip vendor to binding list Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 02/19] soc: Support for EZchip SoC Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 03/19] ARC: [plat-eznps] define IPI_IRQ Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 04/19] clocksource: Add NPS400 timers driver Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-17 13:12   ` Daniel Lezcano
2015-12-17 13:12     ` Daniel Lezcano
2015-12-16  1:10 ` [PATCH v4 05/19] irqchip: add nps Internal and external irqchips Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  9:30   ` Marc Zyngier
2015-12-16  9:30     ` Marc Zyngier
2015-12-18 10:37     ` Noam Camus
2015-12-18 10:37       ` Noam Camus
2015-12-18 11:21       ` Marc Zyngier
2015-12-18 11:21         ` Marc Zyngier
2015-12-18 14:29         ` Noam Camus
2015-12-18 14:29           ` Noam Camus
2015-12-18 16:31           ` Marc Zyngier
2015-12-18 16:31             ` Marc Zyngier
2015-12-19  9:30             ` Noam Camus
2015-12-19  9:30               ` Noam Camus
2015-12-30 11:35             ` Vineet Gupta
2015-12-30 11:35               ` Vineet Gupta
2016-01-12  7:00               ` Vineet Gupta
2016-01-12  7:00                 ` Vineet Gupta
2016-01-12  8:48                 ` Marc Zyngier
2016-01-12  8:48                   ` Marc Zyngier
2016-01-12  9:12                   ` Vineet Gupta
2016-01-12  9:12                     ` Vineet Gupta
2016-01-12  9:28                     ` Marc Zyngier
2016-01-12  9:28                       ` Marc Zyngier
2016-01-25 13:08             ` Vineet Gupta
2016-01-25 13:08               ` Vineet Gupta
2016-01-29 16:37               ` Noam Camus [this message]
2016-01-29 16:37                 ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 06/19] ARC: Set vmalloc size from configuration Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 07/19] ARC: rwlock: disable interrupts in !LLSC variant Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 08/19] ARC: rename smp operation init_irq_cpu() to init_per_cpu() Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 09/19] ARC: Mark secondary cpu online only after all HW setup is done Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 10/19] ARC: Add clock from device tree to time_init() Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 11/19] ARC: [plat-eznps] Add eznps board defconfig and dts Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 12/19] ARC: [plat-eznps] Add eznps platform Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 13/19] ARC: [plat-eznps] Use dedicated user stack top Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 14/19] ARC: [plat-eznps] Use dedicated atomic/bitops/cmpxchg Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 15/19] ARC: [plat-eznps] Use dedicated SMP barriers Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 16/19] ARC: [plat-eznps] Use dedicated identity auxiliary register Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 17/19] ARC: [plat-eznps] Use dedicated cpu_relax() Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 18/19] ARC: [plat-eznps] Use dedicated COMMAND_LINE_SIZE Noam Camus
2015-12-16  1:10   ` Noam Camus
2015-12-16  1:10 ` [PATCH v4 19/19] ARC: Add eznps platform to Kconfig and Makefile Noam Camus
2015-12-16  1:10   ` Noam Camus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=HE1PR02MB1387F61AE58E7011D744E564D6DB0@HE1PR02MB1387.eurprd02.prod.outlook.com \
    --to=noamc@ezchip.com \
    --cc=Vineet.Gupta1@synopsys.com \
    --cc=cmetcalf@ezchip.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=jason@lakedaemon.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-snps-arc@lists.infradead.org \
    --cc=marc.zyngier@arm.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.