The jcore-aic irqchip does not have separate interrupt numbers reserved
for cpu-local vs global interrupts. Instead, the task of selecting this
property is being delegated to the device drivers requesting the given
irq.
This quirk has not been taken into account while migrating jcore-pit to
request_percpu_irq(), resulting in a failure to register PIT interrupts.
Fix this behavior by making the following changes:
1) Explicitly register irq_set_percpu_devid() in jcore-pit.
2) Provide enable_percpu_irq()/disable_percpu_irq() calls in jcore-pit.
3) Make jcore-aic pass the correct per-cpu cookie to the irq handler by
using handle_percpu_devid_irq() instead of handle_percpu_irq().
Fixes: 69a9dcbd2d65 ("clocksource/drivers/jcore: Use request_percpu_irq()")
Signed-off-by: Artur Rojek <contact@artur-rojek.eu>
---
drivers/clocksource/jcore-pit.c | 15 ++++++++++++++-
drivers/irqchip/irq-jcore-aic.c | 2 +-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/drivers/clocksource/jcore-pit.c b/drivers/clocksource/jcore-pit.c
index a3fe98cd3838..82815428f8f9 100644
--- a/drivers/clocksource/jcore-pit.c
+++ b/drivers/clocksource/jcore-pit.c
@@ -114,6 +114,18 @@ static int jcore_pit_local_init(unsigned cpu)
pit->periodic_delta = DIV_ROUND_CLOSEST(NSEC_PER_SEC, HZ * buspd);
clockevents_config_and_register(&pit->ced, freq, 1, ULONG_MAX);
+ enable_percpu_irq(pit->ced.irq, IRQ_TYPE_NONE);
+
+ return 0;
+}
+
+static int jcore_pit_local_teardown(unsigned cpu)
+{
+ struct jcore_pit *pit = this_cpu_ptr(jcore_pit_percpu);
+
+ pr_info("Local J-Core PIT teardown on cpu %u\n", cpu);
+
+ disable_percpu_irq(pit->ced.irq);
return 0;
}
@@ -168,6 +180,7 @@ static int __init jcore_pit_init(struct device_node *node)
return -ENOMEM;
}
+ irq_set_percpu_devid(pit_irq);
err = request_percpu_irq(pit_irq, jcore_timer_interrupt,
"jcore_pit", jcore_pit_percpu);
if (err) {
@@ -237,7 +250,7 @@ static int __init jcore_pit_init(struct device_node *node)
cpuhp_setup_state(CPUHP_AP_JCORE_TIMER_STARTING,
"clockevents/jcore:starting",
- jcore_pit_local_init, NULL);
+ jcore_pit_local_init, jcore_pit_local_teardown);
return 0;
}
diff --git a/drivers/irqchip/irq-jcore-aic.c b/drivers/irqchip/irq-jcore-aic.c
index b9dcc8e78c75..1f613eb7b7f0 100644
--- a/drivers/irqchip/irq-jcore-aic.c
+++ b/drivers/irqchip/irq-jcore-aic.c
@@ -38,7 +38,7 @@ static struct irq_chip jcore_aic;
static void handle_jcore_irq(struct irq_desc *desc)
{
if (irqd_is_per_cpu(irq_desc_get_irq_data(desc)))
- handle_percpu_irq(desc);
+ handle_percpu_devid_irq(desc);
else
handle_simple_irq(desc);
}
--
2.48.1
On 16/02/2025 18:55, Artur Rojek wrote:
> The jcore-aic irqchip does not have separate interrupt numbers reserved
> for cpu-local vs global interrupts. Instead, the task of selecting this
> property is being delegated to the device drivers requesting the given
> irq.
>
> This quirk has not been taken into account while migrating jcore-pit to
> request_percpu_irq(), resulting in a failure to register PIT interrupts.
>
> Fix this behavior by making the following changes:
> 1) Explicitly register irq_set_percpu_devid() in jcore-pit.
> 2) Provide enable_percpu_irq()/disable_percpu_irq() calls in jcore-pit.
> 3) Make jcore-aic pass the correct per-cpu cookie to the irq handler by
> using handle_percpu_devid_irq() instead of handle_percpu_irq().
>
> Fixes: 69a9dcbd2d65 ("clocksource/drivers/jcore: Use request_percpu_irq()")
>
> Signed-off-by: Artur Rojek <contact@artur-rojek.eu>
> ---
How this patch should be merged ?
It is touching irqchip and clocksource at the same time.
May I pick it in the clocksource tree ?
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
Hi Daniel,
On Wed, 19 Feb 2025 at 15:43, Daniel Lezcano <daniel.lezcano@linaro.org> wrote:
> On 16/02/2025 18:55, Artur Rojek wrote:
> > The jcore-aic irqchip does not have separate interrupt numbers reserved
> > for cpu-local vs global interrupts. Instead, the task of selecting this
> > property is being delegated to the device drivers requesting the given
> > irq.
> >
> > This quirk has not been taken into account while migrating jcore-pit to
> > request_percpu_irq(), resulting in a failure to register PIT interrupts.
> >
> > Fix this behavior by making the following changes:
> > 1) Explicitly register irq_set_percpu_devid() in jcore-pit.
> > 2) Provide enable_percpu_irq()/disable_percpu_irq() calls in jcore-pit.
> > 3) Make jcore-aic pass the correct per-cpu cookie to the irq handler by
> > using handle_percpu_devid_irq() instead of handle_percpu_irq().
> >
> > Fixes: 69a9dcbd2d65 ("clocksource/drivers/jcore: Use request_percpu_irq()")
> >
> > Signed-off-by: Artur Rojek <contact@artur-rojek.eu>
> > ---
>
> How this patch should be merged ?
>
> It is touching irqchip and clocksource at the same time.
>
> May I pick it in the clocksource tree ?
Thomas already took it, cfr. commit d7e3fd658248f257
("irqchip/jcore-aic, clocksource/drivers/jcore: Fix jcore-pit interrupt
request") in next-20250219.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
On 19/02/2025 15:50, Geert Uytterhoeven wrote:
> Hi Daniel,
>
> On Wed, 19 Feb 2025 at 15:43, Daniel Lezcano <daniel.lezcano@linaro.org> wrote:
>> On 16/02/2025 18:55, Artur Rojek wrote:
>>> The jcore-aic irqchip does not have separate interrupt numbers reserved
>>> for cpu-local vs global interrupts. Instead, the task of selecting this
>>> property is being delegated to the device drivers requesting the given
>>> irq.
>>>
>>> This quirk has not been taken into account while migrating jcore-pit to
>>> request_percpu_irq(), resulting in a failure to register PIT interrupts.
>>>
>>> Fix this behavior by making the following changes:
>>> 1) Explicitly register irq_set_percpu_devid() in jcore-pit.
>>> 2) Provide enable_percpu_irq()/disable_percpu_irq() calls in jcore-pit.
>>> 3) Make jcore-aic pass the correct per-cpu cookie to the irq handler by
>>> using handle_percpu_devid_irq() instead of handle_percpu_irq().
>>>
>>> Fixes: 69a9dcbd2d65 ("clocksource/drivers/jcore: Use request_percpu_irq()")
>>>
>>> Signed-off-by: Artur Rojek <contact@artur-rojek.eu>
>>> ---
>>
>> How this patch should be merged ?
>>
>> It is touching irqchip and clocksource at the same time.
>>
>> May I pick it in the clocksource tree ?
>
> Thomas already took it, cfr. commit d7e3fd658248f257
> ("irqchip/jcore-aic, clocksource/drivers/jcore: Fix jcore-pit interrupt
> request") in next-20250219.
Oh, ok, thanks for letting me know
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
On 2/16/25 11:55, Artur Rojek wrote:
> The jcore-aic irqchip does not have separate interrupt numbers reserved
> for cpu-local vs global interrupts. Instead, the task of selecting this
> property is being delegated to the device drivers requesting the given
> irq.
>
> This quirk has not been taken into account while migrating jcore-pit to
> request_percpu_irq(), resulting in a failure to register PIT interrupts.
>
> Fix this behavior by making the following changes:
> 1) Explicitly register irq_set_percpu_devid() in jcore-pit.
> 2) Provide enable_percpu_irq()/disable_percpu_irq() calls in jcore-pit.
> 3) Make jcore-aic pass the correct per-cpu cookie to the irq handler by
> using handle_percpu_devid_irq() instead of handle_percpu_irq().
>
> Fixes: 69a9dcbd2d65 ("clocksource/drivers/jcore: Use request_percpu_irq()")
>
> Signed-off-by: Artur Rojek <contact@artur-rojek.eu>
Tested-by: Rob Landley <rob@landley.net>
Rob
On Sun, Feb 16, 2025 at 6:56 PM Artur Rojek <contact@artur-rojek.eu> wrote:
>
> The jcore-aic irqchip does not have separate interrupt numbers reserved
> for cpu-local vs global interrupts. Instead, the task of selecting this
> property is being delegated to the device drivers requesting the given
> irq.
>
> This quirk has not been taken into account while migrating jcore-pit to
> request_percpu_irq(), resulting in a failure to register PIT interrupts.
>
> Fix this behavior by making the following changes:
> 1) Explicitly register irq_set_percpu_devid() in jcore-pit.
> 2) Provide enable_percpu_irq()/disable_percpu_irq() calls in jcore-pit.
> 3) Make jcore-aic pass the correct per-cpu cookie to the irq handler by
> using handle_percpu_devid_irq() instead of handle_percpu_irq().
>
> Fixes: 69a9dcbd2d65 ("clocksource/drivers/jcore: Use request_percpu_irq()")
>
> Signed-off-by: Artur Rojek <contact@artur-rojek.eu>
I can confirm that this change compiles OK with strict percpu address
space checks on x86 [1].
Acked-by: Uros Bizjak <ubizjak@gmail.com>
[1] https://lore.kernel.org/lkml/20250127160709.80604-1-ubizjak@gmail.com/
Uros.
> ---
> drivers/clocksource/jcore-pit.c | 15 ++++++++++++++-
> drivers/irqchip/irq-jcore-aic.c | 2 +-
> 2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/clocksource/jcore-pit.c b/drivers/clocksource/jcore-pit.c
> index a3fe98cd3838..82815428f8f9 100644
> --- a/drivers/clocksource/jcore-pit.c
> +++ b/drivers/clocksource/jcore-pit.c
> @@ -114,6 +114,18 @@ static int jcore_pit_local_init(unsigned cpu)
> pit->periodic_delta = DIV_ROUND_CLOSEST(NSEC_PER_SEC, HZ * buspd);
>
> clockevents_config_and_register(&pit->ced, freq, 1, ULONG_MAX);
> + enable_percpu_irq(pit->ced.irq, IRQ_TYPE_NONE);
> +
> + return 0;
> +}
> +
> +static int jcore_pit_local_teardown(unsigned cpu)
> +{
> + struct jcore_pit *pit = this_cpu_ptr(jcore_pit_percpu);
> +
> + pr_info("Local J-Core PIT teardown on cpu %u\n", cpu);
> +
> + disable_percpu_irq(pit->ced.irq);
>
> return 0;
> }
> @@ -168,6 +180,7 @@ static int __init jcore_pit_init(struct device_node *node)
> return -ENOMEM;
> }
>
> + irq_set_percpu_devid(pit_irq);
> err = request_percpu_irq(pit_irq, jcore_timer_interrupt,
> "jcore_pit", jcore_pit_percpu);
> if (err) {
> @@ -237,7 +250,7 @@ static int __init jcore_pit_init(struct device_node *node)
>
> cpuhp_setup_state(CPUHP_AP_JCORE_TIMER_STARTING,
> "clockevents/jcore:starting",
> - jcore_pit_local_init, NULL);
> + jcore_pit_local_init, jcore_pit_local_teardown);
>
> return 0;
> }
> diff --git a/drivers/irqchip/irq-jcore-aic.c b/drivers/irqchip/irq-jcore-aic.c
> index b9dcc8e78c75..1f613eb7b7f0 100644
> --- a/drivers/irqchip/irq-jcore-aic.c
> +++ b/drivers/irqchip/irq-jcore-aic.c
> @@ -38,7 +38,7 @@ static struct irq_chip jcore_aic;
> static void handle_jcore_irq(struct irq_desc *desc)
> {
> if (irqd_is_per_cpu(irq_desc_get_irq_data(desc)))
> - handle_percpu_irq(desc);
> + handle_percpu_devid_irq(desc);
> else
> handle_simple_irq(desc);
> }
> --
> 2.48.1
>
The following commit has been merged into the irq/urgent branch of tip:
Commit-ID: d7e3fd658248f257006227285095d190e70ee73a
Gitweb: https://git.kernel.org/tip/d7e3fd658248f257006227285095d190e70ee73a
Author: Artur Rojek <contact@artur-rojek.eu>
AuthorDate: Sun, 16 Feb 2025 18:55:45 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Mon, 17 Feb 2025 23:27:49 +01:00
irqchip/jcore-aic, clocksource/drivers/jcore: Fix jcore-pit interrupt request
The jcore-aic irqchip does not have separate interrupt numbers reserved for
cpu-local vs global interrupts. Therefore the device drivers need to
request the given interrupt as per CPU interrupt.
69a9dcbd2d65 ("clocksource/drivers/jcore: Use request_percpu_irq()")
converted the clocksource driver over to request_percpu_irq(), but failed
to do add all the required changes, resulting in a failure to register PIT
interrupts.
Fix this by:
1) Explicitly mark the interrupt via irq_set_percpu_devid() in
jcore_pit_init().
2) Enable and disable the per CPU interrupt in the CPU hotplug callbacks.
3) Pass the correct per-cpu cookie to the irq handler by using
handle_percpu_devid_irq() instead of handle_percpu_irq() in
handle_jcore_irq().
[ tglx: Massage change log ]
Fixes: 69a9dcbd2d65 ("clocksource/drivers/jcore: Use request_percpu_irq()")
Signed-off-by: Artur Rojek <contact@artur-rojek.eu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Uros Bizjak <ubizjak@gmail.com>
Link: https://lore.kernel.org/all/20250216175545.35079-3-contact@artur-rojek.eu
---
drivers/clocksource/jcore-pit.c | 15 ++++++++++++++-
drivers/irqchip/irq-jcore-aic.c | 2 +-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/drivers/clocksource/jcore-pit.c b/drivers/clocksource/jcore-pit.c
index a3fe98c..8281542 100644
--- a/drivers/clocksource/jcore-pit.c
+++ b/drivers/clocksource/jcore-pit.c
@@ -114,6 +114,18 @@ static int jcore_pit_local_init(unsigned cpu)
pit->periodic_delta = DIV_ROUND_CLOSEST(NSEC_PER_SEC, HZ * buspd);
clockevents_config_and_register(&pit->ced, freq, 1, ULONG_MAX);
+ enable_percpu_irq(pit->ced.irq, IRQ_TYPE_NONE);
+
+ return 0;
+}
+
+static int jcore_pit_local_teardown(unsigned cpu)
+{
+ struct jcore_pit *pit = this_cpu_ptr(jcore_pit_percpu);
+
+ pr_info("Local J-Core PIT teardown on cpu %u\n", cpu);
+
+ disable_percpu_irq(pit->ced.irq);
return 0;
}
@@ -168,6 +180,7 @@ static int __init jcore_pit_init(struct device_node *node)
return -ENOMEM;
}
+ irq_set_percpu_devid(pit_irq);
err = request_percpu_irq(pit_irq, jcore_timer_interrupt,
"jcore_pit", jcore_pit_percpu);
if (err) {
@@ -237,7 +250,7 @@ static int __init jcore_pit_init(struct device_node *node)
cpuhp_setup_state(CPUHP_AP_JCORE_TIMER_STARTING,
"clockevents/jcore:starting",
- jcore_pit_local_init, NULL);
+ jcore_pit_local_init, jcore_pit_local_teardown);
return 0;
}
diff --git a/drivers/irqchip/irq-jcore-aic.c b/drivers/irqchip/irq-jcore-aic.c
index b9dcc8e..1f613eb 100644
--- a/drivers/irqchip/irq-jcore-aic.c
+++ b/drivers/irqchip/irq-jcore-aic.c
@@ -38,7 +38,7 @@ static struct irq_chip jcore_aic;
static void handle_jcore_irq(struct irq_desc *desc)
{
if (irqd_is_per_cpu(irq_desc_get_irq_data(desc)))
- handle_percpu_irq(desc);
+ handle_percpu_devid_irq(desc);
else
handle_simple_irq(desc);
}
© 2016 - 2025 Red Hat, Inc.