* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
@ 2010-11-22 8:26 Eric Miao
2010-12-05 9:23 ` Russell King - ARM Linux
0 siblings, 1 reply; 14+ messages in thread
From: Eric Miao @ 2010-11-22 8:26 UTC (permalink / raw)
To: linux-arm-kernel
Russell,
I wonder if it's still acceptable for a patch like below to have a dynamic IRQ
handler at run-time. There is some changes to the irq_handler, esp. some
SMP changes.
Magnus had some similar patches to have a run-time irq_handler, which is
a bit more complicated, but I'm also very happy with.
commit d57e464929c9b2b50cda07e8683679583adf0fee
Author: Eric Miao <eric.y.miao@gmail.com>
Date: Mon Nov 22 16:13:51 2010 +0800
ARM: Allow machine to specify it's own IRQ handlers at run-time
Normally different ARM platform has different way to decode the IRQ
hardware status and demultiplex to the corresponding IRQ handler.
This is highly optimized by macro irq_handler in entry-armv.S, and
each machine class defines their own macro to decode the IRQ number.
However, this prevents multiple machine classes to be built into a
single kernel.
By allowing each machine to specify thier own handler, and making
function pointer 'handle_arch_irq' to point to it at run time, this
can be solved. And introduce CONFIG_MULTI_IRQ_HANDLER to allow both
solutions to work.
Comparing with the highly optimized macro of irq_handler, the new
function must be written with care not to lose too much performance.
And the IPI stuff on SMP is expected to move to the provided arch
IRQ handler as well.
Signed-off-by: Eric Miao <eric.miao@canonical.com>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index a19a526..c2c9838 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1017,6 +1017,11 @@ config CPU_HAS_PMU
default y
bool
+config MULTI_IRQ_HANDLER
+ bool
+ help
+ Allow each machine to specify it's own IRQ handler at run time.
+
if !MMU
source "arch/arm/Kconfig-nommu"
endif
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index d97a964..7d55356 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -40,6 +40,9 @@ struct machine_desc {
void (*init_irq)(void);
struct sys_timer *timer; /* system tick timer */
void (*init_machine)(void);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ void (*handle_irq)(struct pt_regs *);
+#endif
};
/*
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
index ce3eee9..6ecdad9 100644
--- a/arch/arm/include/asm/mach/irq.h
+++ b/arch/arm/include/asm/mach/irq.h
@@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
extern void init_FIQ(void);
extern int show_fiq_list(struct seq_file *, void *);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+extern void (*handle_arch_irq)(struct pt_regs *);
+#endif
+
/*
* This is for easy migration, but should be changed in the source
*/
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index c09e357..8ed4f7c 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -29,6 +29,7 @@
/*
* Interrupt handling. Preserves r7, r8, r9
*/
+#ifndef CONFIG_MULTI_IRQ_HANDLER
.macro irq_handler
get_irqnr_preamble r5, lr
1: get_irqnr_and_base r0, r6, r5, lr
@@ -62,6 +63,14 @@
#endif
.endm
+#else
+ .macro irq_handler
+ ldr r4, =handle_arch_irq
+ mov r0, sp
+ mov lr, pc
+ ldr pc, [r4]
+ .endm
+#endif /* CONFIG_MULTI_IRQ_HANDLER */
#ifdef CONFIG_KPROBES
.section .kprobes.text,"ax",%progbits
@@ -1245,3 +1254,9 @@ cr_alignment:
.space 4
cr_no_alignment:
.space 4
+
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ .globl handle_arch_irq
+handle_arch_irq:
+ .long 0
+#endif
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 336f14e..a834c6c 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -876,6 +876,12 @@ void __init setup_arch(char **cmdline_p)
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ handle_arch_irq = class ? class->handle_irq : NULL;
+ if (!handle_arch_irq)
+ panic("No machine class specific IRQ handler defined\n");
+#endif
+
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
conswitchp = &vga_con;
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-11-22 8:26 [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time Eric Miao
@ 2010-12-05 9:23 ` Russell King - ARM Linux
2010-12-06 6:12 ` Eric Miao
0 siblings, 1 reply; 14+ messages in thread
From: Russell King - ARM Linux @ 2010-12-05 9:23 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Nov 22, 2010 at 04:26:50PM +0800, Eric Miao wrote:
> I wonder if it's still acceptable for a patch like below to have a dynamic IRQ
> handler at run-time. There is some changes to the irq_handler, esp. some
> SMP changes.
>
> Magnus had some similar patches to have a run-time irq_handler, which is
> a bit more complicated, but I'm also very happy with.
I'd prefer a simple but efficient approach. I am worried about
unnecessarily increasing the IRQ latency - and IRQ latency is something
that we should be concerned about. It has the ability to make platforms
useless.
Eg, we know that SMC91x net interfaces are sensitive to IRQ latency, and
the same is true of serial ports with small FIFOs.
Any attempt to support multiple IRQ handlers is going to increase IRQ
handling latency - I don't think that's something which can be avoided,
and I'm wondering what effect this and the recent genirq changes is going
to have. Has anyone been keeping an eye on IRQ handling latency?
Lastly, this patch is dependent on your machine class patches, which makes
it unsuitable as-is for mainline.
> commit d57e464929c9b2b50cda07e8683679583adf0fee
> Author: Eric Miao <eric.y.miao@gmail.com>
> Date: Mon Nov 22 16:13:51 2010 +0800
>
> ARM: Allow machine to specify it's own IRQ handlers at run-time
>
> Normally different ARM platform has different way to decode the IRQ
> hardware status and demultiplex to the corresponding IRQ handler.
> This is highly optimized by macro irq_handler in entry-armv.S, and
> each machine class defines their own macro to decode the IRQ number.
> However, this prevents multiple machine classes to be built into a
> single kernel.
>
> By allowing each machine to specify thier own handler, and making
> function pointer 'handle_arch_irq' to point to it at run time, this
> can be solved. And introduce CONFIG_MULTI_IRQ_HANDLER to allow both
> solutions to work.
>
> Comparing with the highly optimized macro of irq_handler, the new
> function must be written with care not to lose too much performance.
> And the IPI stuff on SMP is expected to move to the provided arch
> IRQ handler as well.
>
> Signed-off-by: Eric Miao <eric.miao@canonical.com>
> Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index a19a526..c2c9838 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1017,6 +1017,11 @@ config CPU_HAS_PMU
> default y
> bool
>
> +config MULTI_IRQ_HANDLER
> + bool
> + help
> + Allow each machine to specify it's own IRQ handler at run time.
> +
> if !MMU
> source "arch/arm/Kconfig-nommu"
> endif
> diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
> index d97a964..7d55356 100644
> --- a/arch/arm/include/asm/mach/arch.h
> +++ b/arch/arm/include/asm/mach/arch.h
> @@ -40,6 +40,9 @@ struct machine_desc {
> void (*init_irq)(void);
> struct sys_timer *timer; /* system tick timer */
> void (*init_machine)(void);
> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> + void (*handle_irq)(struct pt_regs *);
> +#endif
> };
>
> /*
> diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
> index ce3eee9..6ecdad9 100644
> --- a/arch/arm/include/asm/mach/irq.h
> +++ b/arch/arm/include/asm/mach/irq.h
> @@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
> extern void init_FIQ(void);
> extern int show_fiq_list(struct seq_file *, void *);
>
> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> +extern void (*handle_arch_irq)(struct pt_regs *);
> +#endif
> +
> /*
> * This is for easy migration, but should be changed in the source
> */
> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
> index c09e357..8ed4f7c 100644
> --- a/arch/arm/kernel/entry-armv.S
> +++ b/arch/arm/kernel/entry-armv.S
> @@ -29,6 +29,7 @@
> /*
> * Interrupt handling. Preserves r7, r8, r9
> */
> +#ifndef CONFIG_MULTI_IRQ_HANDLER
> .macro irq_handler
> get_irqnr_preamble r5, lr
> 1: get_irqnr_and_base r0, r6, r5, lr
> @@ -62,6 +63,14 @@
> #endif
>
> .endm
> +#else
> + .macro irq_handler
> + ldr r4, =handle_arch_irq
> + mov r0, sp
> + mov lr, pc
> + ldr pc, [r4]
> + .endm
> +#endif /* CONFIG_MULTI_IRQ_HANDLER */
>
> #ifdef CONFIG_KPROBES
> .section .kprobes.text,"ax",%progbits
> @@ -1245,3 +1254,9 @@ cr_alignment:
> .space 4
> cr_no_alignment:
> .space 4
> +
> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> + .globl handle_arch_irq
> +handle_arch_irq:
> + .long 0
> +#endif
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index 336f14e..a834c6c 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -876,6 +876,12 @@ void __init setup_arch(char **cmdline_p)
> system_timer = mdesc->timer;
> init_machine = mdesc->init_machine;
>
> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> + handle_arch_irq = class ? class->handle_irq : NULL;
> + if (!handle_arch_irq)
> + panic("No machine class specific IRQ handler defined\n");
> +#endif
> +
> #ifdef CONFIG_VT
> #if defined(CONFIG_VGA_CONSOLE)
> conswitchp = &vga_con;
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-05 9:23 ` Russell King - ARM Linux
@ 2010-12-06 6:12 ` Eric Miao
2010-12-06 8:06 ` Russell King - ARM Linux
0 siblings, 1 reply; 14+ messages in thread
From: Eric Miao @ 2010-12-06 6:12 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Dec 5, 2010 at 5:23 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Mon, Nov 22, 2010 at 04:26:50PM +0800, Eric Miao wrote:
>> I wonder if it's still acceptable for a patch like below to have a dynamic IRQ
>> handler at run-time. There is some changes to the irq_handler, esp. some
>> SMP changes.
>>
>> Magnus had some similar patches to have a run-time irq_handler, which is
>> a bit more complicated, but I'm also very happy with.
>
> I'd prefer a simple but efficient approach. ?I am worried about
> unnecessarily increasing the IRQ latency - and IRQ latency is something
> that we should be concerned about. ?It has the ability to make platforms
> useless.
>
> Eg, we know that SMC91x net interfaces are sensitive to IRQ latency, and
> the same is true of serial ports with small FIFOs.
>
> Any attempt to support multiple IRQ handlers is going to increase IRQ
> handling latency - I don't think that's something which can be avoided,
> and I'm wondering what effect this and the recent genirq changes is going
> to have. ?Has anyone been keeping an eye on IRQ handling latency?
>
> Lastly, this patch is dependent on your machine class patches, which makes
> it unsuitable as-is for mainline.
>
This one isn't. I've rebased this on top of v2.6.37-rc1.
>> commit d57e464929c9b2b50cda07e8683679583adf0fee
>> Author: Eric Miao <eric.y.miao@gmail.com>
>> Date: ? Mon Nov 22 16:13:51 2010 +0800
>>
>> ? ? ARM: Allow machine to specify it's own IRQ handlers at run-time
>>
>> ? ? Normally different ARM platform has different way to decode the IRQ
>> ? ? hardware status and demultiplex to the corresponding IRQ handler.
>> ? ? This is highly optimized by macro irq_handler in entry-armv.S, and
>> ? ? each machine class defines their own macro to decode the IRQ number.
>> ? ? However, this prevents multiple machine classes to be built into a
>> ? ? single kernel.
>>
>> ? ? By allowing each machine to specify thier own handler, and making
>> ? ? function pointer 'handle_arch_irq' to point to it at run time, this
>> ? ? can be solved. And introduce CONFIG_MULTI_IRQ_HANDLER to allow both
>> ? ? solutions to work.
>>
>> ? ? Comparing with the highly optimized macro of irq_handler, the new
>> ? ? function must be written with care not to lose too much performance.
>> ? ? And the IPI stuff on SMP is expected to move to the provided arch
>> ? ? IRQ handler as well.
>>
>> ? ? Signed-off-by: Eric Miao <eric.miao@canonical.com>
>> ? ? Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
>>
>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
>> index a19a526..c2c9838 100644
>> --- a/arch/arm/Kconfig
>> +++ b/arch/arm/Kconfig
>> @@ -1017,6 +1017,11 @@ config CPU_HAS_PMU
>> ? ? ? default y
>> ? ? ? bool
>>
>> +config MULTI_IRQ_HANDLER
>> + ? ? bool
>> + ? ? help
>> + ? ? ? Allow each machine to specify it's own IRQ handler at run time.
>> +
>> ?if !MMU
>> ?source "arch/arm/Kconfig-nommu"
>> ?endif
>> diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
>> index d97a964..7d55356 100644
>> --- a/arch/arm/include/asm/mach/arch.h
>> +++ b/arch/arm/include/asm/mach/arch.h
>> @@ -40,6 +40,9 @@ struct machine_desc {
>> ? ? ? void ? ? ? ? ? ? ? ? ? ?(*init_irq)(void);
>> ? ? ? struct sys_timer ? ? ? ?*timer; ? ? ? ? /* system tick timer ? ?*/
>> ? ? ? void ? ? ? ? ? ? ? ? ? ?(*init_machine)(void);
>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> + ? ? void ? ? ? ? ? ? ? ? ? ?(*handle_irq)(struct pt_regs *);
>> +#endif
>> ?};
>>
>> ?/*
>> diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
>> index ce3eee9..6ecdad9 100644
>> --- a/arch/arm/include/asm/mach/irq.h
>> +++ b/arch/arm/include/asm/mach/irq.h
>> @@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
>> ?extern void init_FIQ(void);
>> ?extern int show_fiq_list(struct seq_file *, void *);
>>
>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> +extern void (*handle_arch_irq)(struct pt_regs *);
>> +#endif
>> +
>> ?/*
>> ? * This is for easy migration, but should be changed in the source
>> ? */
>> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
>> index c09e357..8ed4f7c 100644
>> --- a/arch/arm/kernel/entry-armv.S
>> +++ b/arch/arm/kernel/entry-armv.S
>> @@ -29,6 +29,7 @@
>> ?/*
>> ? * Interrupt handling. ?Preserves r7, r8, r9
>> ? */
>> +#ifndef CONFIG_MULTI_IRQ_HANDLER
>> ? ? ? .macro ?irq_handler
>> ? ? ? get_irqnr_preamble r5, lr
>> ?1: ? get_irqnr_and_base r0, r6, r5, lr
>> @@ -62,6 +63,14 @@
>> ?#endif
>>
>> ? ? ? .endm
>> +#else
>> + ? ? .macro ?irq_handler
>> + ? ? ldr ? ? r4, =handle_arch_irq
>> + ? ? mov ? ? r0, sp
>> + ? ? mov ? ? lr, pc
>> + ? ? ldr ? ? pc, [r4]
>> + ? ? .endm
>> +#endif ? ? ? /* CONFIG_MULTI_IRQ_HANDLER */
>>
>> ?#ifdef CONFIG_KPROBES
>> ? ? ? .section ? ? ? ?.kprobes.text,"ax",%progbits
>> @@ -1245,3 +1254,9 @@ cr_alignment:
>> ? ? ? .space ?4
>> ?cr_no_alignment:
>> ? ? ? .space ?4
>> +
>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> + ? ? .globl ?handle_arch_irq
>> +handle_arch_irq:
>> + ? ? .long ? 0
>> +#endif
>> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
>> index 336f14e..a834c6c 100644
>> --- a/arch/arm/kernel/setup.c
>> +++ b/arch/arm/kernel/setup.c
>> @@ -876,6 +876,12 @@ void __init setup_arch(char **cmdline_p)
>> ? ? ? system_timer = mdesc->timer;
>> ? ? ? init_machine = mdesc->init_machine;
>>
>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> + ? ? handle_arch_irq = class ? class->handle_irq : NULL;
>> + ? ? if (!handle_arch_irq)
>> + ? ? ? ? ? ? panic("No machine class specific IRQ handler defined\n");
>> +#endif
>> +
>> ?#ifdef CONFIG_VT
>> ?#if defined(CONFIG_VGA_CONSOLE)
>> ? ? ? conswitchp = &vga_con;
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-06 6:12 ` Eric Miao
@ 2010-12-06 8:06 ` Russell King - ARM Linux
2010-12-06 9:31 ` Eric Miao
0 siblings, 1 reply; 14+ messages in thread
From: Russell King - ARM Linux @ 2010-12-06 8:06 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Dec 06, 2010 at 02:12:54PM +0800, Eric Miao wrote:
> On Sun, Dec 5, 2010 at 5:23 PM, Russell King - ARM Linux
> <linux@arm.linux.org.uk> wrote:
> > On Mon, Nov 22, 2010 at 04:26:50PM +0800, Eric Miao wrote:
> >> I wonder if it's still acceptable for a patch like below to have a dynamic IRQ
> >> handler at run-time. There is some changes to the irq_handler, esp. some
> >> SMP changes.
> >>
> >> Magnus had some similar patches to have a run-time irq_handler, which is
> >> a bit more complicated, but I'm also very happy with.
> >
> > I'd prefer a simple but efficient approach. ?I am worried about
> > unnecessarily increasing the IRQ latency - and IRQ latency is something
> > that we should be concerned about. ?It has the ability to make platforms
> > useless.
> >
> > Eg, we know that SMC91x net interfaces are sensitive to IRQ latency, and
> > the same is true of serial ports with small FIFOs.
> >
> > Any attempt to support multiple IRQ handlers is going to increase IRQ
> > handling latency - I don't think that's something which can be avoided,
> > and I'm wondering what effect this and the recent genirq changes is going
> > to have. ?Has anyone been keeping an eye on IRQ handling latency?
> >
> > Lastly, this patch is dependent on your machine class patches, which makes
> > it unsuitable as-is for mainline.
> >
>
> This one isn't. I've rebased this on top of v2.6.37-rc1.
>
> >> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> >> + ? ? handle_arch_irq = class ? class->handle_irq : NULL;
^^^^^^^^^^^^^^^^^^^^^^^^^
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-06 8:06 ` Russell King - ARM Linux
@ 2010-12-06 9:31 ` Eric Miao
2010-12-06 10:11 ` Russell King - ARM Linux
0 siblings, 1 reply; 14+ messages in thread
From: Eric Miao @ 2010-12-06 9:31 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Dec 6, 2010 at 4:06 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Mon, Dec 06, 2010 at 02:12:54PM +0800, Eric Miao wrote:
>> On Sun, Dec 5, 2010 at 5:23 PM, Russell King - ARM Linux
>> <linux@arm.linux.org.uk> wrote:
>> > On Mon, Nov 22, 2010 at 04:26:50PM +0800, Eric Miao wrote:
>> >> I wonder if it's still acceptable for a patch like below to have a dynamic IRQ
>> >> handler at run-time. There is some changes to the irq_handler, esp. some
>> >> SMP changes.
>> >>
>> >> Magnus had some similar patches to have a run-time irq_handler, which is
>> >> a bit more complicated, but I'm also very happy with.
>> >
>> > I'd prefer a simple but efficient approach. ?I am worried about
>> > unnecessarily increasing the IRQ latency - and IRQ latency is something
>> > that we should be concerned about. ?It has the ability to make platforms
>> > useless.
>> >
>> > Eg, we know that SMC91x net interfaces are sensitive to IRQ latency, and
>> > the same is true of serial ports with small FIFOs.
>> >
>> > Any attempt to support multiple IRQ handlers is going to increase IRQ
>> > handling latency - I don't think that's something which can be avoided,
>> > and I'm wondering what effect this and the recent genirq changes is going
>> > to have. ?Has anyone been keeping an eye on IRQ handling latency?
>> >
>> > Lastly, this patch is dependent on your machine class patches, which makes
>> > it unsuitable as-is for mainline.
>> >
>>
>> This one isn't. I've rebased this on top of v2.6.37-rc1.
>>
>> >> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> >> + ? ? handle_arch_irq = class ? class->handle_irq : NULL;
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ^^^^^^^^^^^^^^^^^^^^^^^^^
>
Grrrr... wrong copy indeed. Corrected version below, I also made it less
intrusive by judging on handle_arch_irq being NULL or not so to fall back
to the original way of handling.
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index db524e7..0cecffb 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1017,6 +1017,11 @@ config CPU_HAS_PMU
default y
bool
+config MULTI_IRQ_HANDLER
+ bool
+ help
+ Allow each machine to specify it's own IRQ handler at run time.
+
if !MMU
source "arch/arm/Kconfig-nommu"
endif
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index d97a964..7d55356 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -40,6 +40,9 @@ struct machine_desc {
void (*init_irq)(void);
struct sys_timer *timer; /* system tick timer */
void (*init_machine)(void);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ void (*handle_irq)(struct pt_regs *);
+#endif
};
/*
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
index ce3eee9..6ecdad9 100644
--- a/arch/arm/include/asm/mach/irq.h
+++ b/arch/arm/include/asm/mach/irq.h
@@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
extern void init_FIQ(void);
extern int show_fiq_list(struct seq_file *, void *);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+extern void (*handle_arch_irq)(struct pt_regs *);
+#endif
+
/*
* This is for easy migration, but should be changed in the source
*/
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index c09e357..4f446a2 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -30,6 +30,13 @@
* Interrupt handling. Preserves r7, r8, r9
*/
.macro irq_handler
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ ldr r1, =handle_arch_irq
+ cmp r1, #0
+ movne r0, sp
+ adrne lr, BSYM(9997f)
+ ldrne pc, [r1]
+#endif
get_irqnr_preamble r5, lr
1: get_irqnr_and_base r0, r6, r5, lr
movne r1, sp
@@ -1245,3 +1252,9 @@ cr_alignment:
.space 4
cr_no_alignment:
.space 4
+
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ .globl handle_arch_irq
+handle_arch_irq:
+ .long 0
+#endif
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 336f14e..b809521 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -875,6 +875,9 @@ void __init setup_arch(char **cmdline_p)
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ handle_arch_irq = mdesc->handle_irq;
+#endif
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-06 9:31 ` Eric Miao
@ 2010-12-06 10:11 ` Russell King - ARM Linux
2010-12-07 13:31 ` Eric Miao
0 siblings, 1 reply; 14+ messages in thread
From: Russell King - ARM Linux @ 2010-12-06 10:11 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Dec 06, 2010 at 05:31:46PM +0800, Eric Miao wrote:
> Grrrr... wrong copy indeed. Corrected version below, I also made it less
> intrusive by judging on handle_arch_irq being NULL or not so to fall back
> to the original way of handling.
...
> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
> index c09e357..4f446a2 100644
> --- a/arch/arm/kernel/entry-armv.S
> +++ b/arch/arm/kernel/entry-armv.S
> @@ -30,6 +30,13 @@
> * Interrupt handling. Preserves r7, r8, r9
> */
> .macro irq_handler
> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> + ldr r1, =handle_arch_irq
> + cmp r1, #0
> + movne r0, sp
> + adrne lr, BSYM(9997f)
> + ldrne pc, [r1]
> +#endif
Except this won't - you're testing the address of handle_arch_irq for
NULL, which it'll never be.
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-06 10:11 ` Russell King - ARM Linux
@ 2010-12-07 13:31 ` Eric Miao
2010-12-08 13:41 ` Russell King - ARM Linux
0 siblings, 1 reply; 14+ messages in thread
From: Eric Miao @ 2010-12-07 13:31 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Dec 6, 2010 at 6:11 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Mon, Dec 06, 2010 at 05:31:46PM +0800, Eric Miao wrote:
>> Grrrr... wrong copy indeed. Corrected version below, I also made it less
>> intrusive by judging on handle_arch_irq being NULL or not so to fall back
>> to the original way of handling.
> ...
>> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
>> index c09e357..4f446a2 100644
>> --- a/arch/arm/kernel/entry-armv.S
>> +++ b/arch/arm/kernel/entry-armv.S
>> @@ -30,6 +30,13 @@
>> ? * Interrupt handling. ?Preserves r7, r8, r9
>> ? */
>> ? ? ? .macro ?irq_handler
>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> + ? ? ldr ? ? r1, =handle_arch_irq
>> + ? ? cmp ? ? r1, #0
>> + ? ? movne ? r0, sp
>> + ? ? adrne ? lr, BSYM(9997f)
>> + ? ? ldrne ? pc, [r1]
>> +#endif
>
> Except this won't - you're testing the address of handle_arch_irq for
> NULL, which it'll never be.
>
Ah silly me, the patch below fixed this, and tested on Marvell Dove:
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index db524e7..0cecffb 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1017,6 +1017,11 @@ config CPU_HAS_PMU
default y
bool
+config MULTI_IRQ_HANDLER
+ bool
+ help
+ Allow each machine to specify it's own IRQ handler at run time.
+
if !MMU
source "arch/arm/Kconfig-nommu"
endif
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index d97a964..7d55356 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -40,6 +40,9 @@ struct machine_desc {
void (*init_irq)(void);
struct sys_timer *timer; /* system tick timer */
void (*init_machine)(void);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ void (*handle_irq)(struct pt_regs *);
+#endif
};
/*
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
index ce3eee9..6ecdad9 100644
--- a/arch/arm/include/asm/mach/irq.h
+++ b/arch/arm/include/asm/mach/irq.h
@@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
extern void init_FIQ(void);
extern int show_fiq_list(struct seq_file *, void *);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+extern void (*handle_arch_irq)(struct pt_regs *);
+#endif
+
/*
* This is for easy migration, but should be changed in the source
*/
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index c09e357..d29e31b 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -30,6 +30,14 @@
* Interrupt handling. Preserves r7, r8, r9
*/
.macro irq_handler
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ ldr r1, =handle_arch_irq
+ ldr r0, [r1]
+ cmp r0, #0
+ movne r0, sp
+ adrne lr, BSYM(9997f)
+ ldrne pc, [r1]
+#endif
get_irqnr_preamble r5, lr
1: get_irqnr_and_base r0, r6, r5, lr
movne r1, sp
@@ -58,9 +66,8 @@
adrne lr, BSYM(1b)
bne do_local_timer
#endif
-9997:
#endif
-
+9997:
.endm
#ifdef CONFIG_KPROBES
@@ -1245,3 +1252,9 @@ cr_alignment:
.space 4
cr_no_alignment:
.space 4
+
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ .globl handle_arch_irq
+handle_arch_irq:
+ .long 0
+#endif
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 336f14e..b809521 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -875,6 +875,9 @@ void __init setup_arch(char **cmdline_p)
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ handle_arch_irq = mdesc->handle_irq;
+#endif
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-07 13:31 ` Eric Miao
@ 2010-12-08 13:41 ` Russell King - ARM Linux
2010-12-12 14:33 ` Eric Miao
0 siblings, 1 reply; 14+ messages in thread
From: Russell King - ARM Linux @ 2010-12-08 13:41 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, Dec 07, 2010 at 09:31:11PM +0800, Eric Miao wrote:
> Ah silly me, the patch below fixed this, and tested on Marvell Dove:
...
> diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
> index ce3eee9..6ecdad9 100644
> --- a/arch/arm/include/asm/mach/irq.h
> +++ b/arch/arm/include/asm/mach/irq.h
> @@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
> extern void init_FIQ(void);
> extern int show_fiq_list(struct seq_file *, void *);
>
> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> +extern void (*handle_arch_irq)(struct pt_regs *);
> +#endif
> +
> /*
> * This is for easy migration, but should be changed in the source
> */
> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
> index c09e357..d29e31b 100644
> --- a/arch/arm/kernel/entry-armv.S
> +++ b/arch/arm/kernel/entry-armv.S
> @@ -30,6 +30,14 @@
> * Interrupt handling. Preserves r7, r8, r9
> */
> .macro irq_handler
> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> + ldr r1, =handle_arch_irq
> + ldr r0, [r1]
> + cmp r0, #0
> + movne r0, sp
> + adrne lr, BSYM(9997f)
> + ldrne pc, [r1]
> +#endif
You might as well do this:
ldr r5, =handle_arch_irq
mov r0, sp
ldr r5, [r5]
adr lr, BSYM(9997f)
teq r5, #0
movne pc, r5
which also helps to fill the load delay slots with useful work.
> get_irqnr_preamble r5, lr
> 1: get_irqnr_and_base r0, r6, r5, lr
> movne r1, sp
> @@ -58,9 +66,8 @@
> adrne lr, BSYM(1b)
> bne do_local_timer
> #endif
> -9997:
> #endif
> -
> +9997:
> .endm
>
> #ifdef CONFIG_KPROBES
> @@ -1245,3 +1252,9 @@ cr_alignment:
> .space 4
> cr_no_alignment:
> .space 4
> +
> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> + .globl handle_arch_irq
> +handle_arch_irq:
> + .long 0
.space 4
as above please
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-08 13:41 ` Russell King - ARM Linux
@ 2010-12-12 14:33 ` Eric Miao
2010-12-12 14:49 ` Russell King - ARM Linux
2010-12-12 14:50 ` Eric Miao
0 siblings, 2 replies; 14+ messages in thread
From: Eric Miao @ 2010-12-12 14:33 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Dec 8, 2010 at 9:41 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Tue, Dec 07, 2010 at 09:31:11PM +0800, Eric Miao wrote:
>> Ah silly me, the patch below fixed this, and tested on Marvell Dove:
> ...
>> diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
>> index ce3eee9..6ecdad9 100644
>> --- a/arch/arm/include/asm/mach/irq.h
>> +++ b/arch/arm/include/asm/mach/irq.h
>> @@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
>> ?extern void init_FIQ(void);
>> ?extern int show_fiq_list(struct seq_file *, void *);
>>
>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> +extern void (*handle_arch_irq)(struct pt_regs *);
>> +#endif
>> +
>> ?/*
>> ? * This is for easy migration, but should be changed in the source
>> ? */
>> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
>> index c09e357..d29e31b 100644
>> --- a/arch/arm/kernel/entry-armv.S
>> +++ b/arch/arm/kernel/entry-armv.S
>> @@ -30,6 +30,14 @@
>> ? * Interrupt handling. ?Preserves r7, r8, r9
>> ? */
>> ? ? ? .macro ?irq_handler
>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> + ? ? ldr ? ? r1, =handle_arch_irq
>> + ? ? ldr ? ? r0, [r1]
>> + ? ? cmp ? ? r0, #0
>> + ? ? movne ? r0, sp
>> + ? ? adrne ? lr, BSYM(9997f)
>> + ? ? ldrne ? pc, [r1]
>> +#endif
>
> You might as well do this:
>
> ? ? ? ?ldr ? ? r5, =handle_arch_irq
> ? ? ? ?mov ? ? r0, sp
> ? ? ? ?ldr ? ? r5, [r5]
> ? ? ? ?adr ? ? lr, BSYM(9997f)
> ? ? ? ?teq ? ? r5, #0
> ? ? ? ?movne ? pc, r5
>
> which also helps to fill the load delay slots with useful work.
>
>> ? ? ? get_irqnr_preamble r5, lr
>> ?1: ? get_irqnr_and_base r0, r6, r5, lr
>> ? ? ? movne ? r1, sp
>> @@ -58,9 +66,8 @@
>> ? ? ? adrne ? lr, BSYM(1b)
>> ? ? ? bne ? ? do_local_timer
>> ?#endif
>> -9997:
>> ?#endif
>> -
>> +9997:
>> ? ? ? .endm
>>
>> ?#ifdef CONFIG_KPROBES
>> @@ -1245,3 +1252,9 @@ cr_alignment:
>> ? ? ? .space ?4
>> ?cr_no_alignment:
>> ? ? ? .space ?4
>> +
>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> + ? ? .globl ?handle_arch_irq
>> +handle_arch_irq:
>> + ? ? .long ? 0
>
> ? ? ? ?.space 4
>
> as above please
>
Updated the patch following your suggestions, verified on Marvell Dove
platform and it worked all right. Do you want me to submit this to the
patch tracking system?
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index db524e7..0cecffb 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1017,6 +1017,11 @@ config CPU_HAS_PMU
default y
bool
+config MULTI_IRQ_HANDLER
+ bool
+ help
+ Allow each machine to specify it's own IRQ handler at run time.
+
if !MMU
source "arch/arm/Kconfig-nommu"
endif
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index d97a964..7d55356 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -40,6 +40,9 @@ struct machine_desc {
void (*init_irq)(void);
struct sys_timer *timer; /* system tick timer */
void (*init_machine)(void);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ void (*handle_irq)(struct pt_regs *);
+#endif
};
/*
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
index ce3eee9..6ecdad9 100644
--- a/arch/arm/include/asm/mach/irq.h
+++ b/arch/arm/include/asm/mach/irq.h
@@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
extern void init_FIQ(void);
extern int show_fiq_list(struct seq_file *, void *);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+extern void (*handle_arch_irq)(struct pt_regs *);
+#endif
+
/*
* This is for easy migration, but should be changed in the source
*/
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index c09e357..d29e31b 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -30,6 +30,14 @@
* Interrupt handling. Preserves r7, r8, r9
*/
.macro irq_handler
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ ldr r1, =handle_arch_irq
+ ldr r0, [r1]
+ cmp r0, #0
+ movne r0, sp
+ adrne lr, BSYM(9997f)
+ ldrne pc, [r1]
+#endif
get_irqnr_preamble r5, lr
1: get_irqnr_and_base r0, r6, r5, lr
movne r1, sp
@@ -58,9 +66,8 @@
adrne lr, BSYM(1b)
bne do_local_timer
#endif
-9997:
#endif
-
+9997:
.endm
#ifdef CONFIG_KPROBES
@@ -1245,3 +1252,9 @@ cr_alignment:
.space 4
cr_no_alignment:
.space 4
+
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ .globl handle_arch_irq
+handle_arch_irq:
+ .long 0
+#endif
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 336f14e..b809521 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -875,6 +875,9 @@ void __init setup_arch(char **cmdline_p)
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ handle_arch_irq = mdesc->handle_irq;
+#endif
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-12 14:33 ` Eric Miao
@ 2010-12-12 14:49 ` Russell King - ARM Linux
2010-12-12 14:50 ` Eric Miao
2010-12-12 14:50 ` Eric Miao
1 sibling, 1 reply; 14+ messages in thread
From: Russell King - ARM Linux @ 2010-12-12 14:49 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Dec 12, 2010 at 10:33:01PM +0800, Eric Miao wrote:
> On Wed, Dec 8, 2010 at 9:41 PM, Russell King - ARM Linux
> <linux@arm.linux.org.uk> wrote:
> > On Tue, Dec 07, 2010 at 09:31:11PM +0800, Eric Miao wrote:
> >> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> >> + ? ? ldr ? ? r1, =handle_arch_irq
> >> + ? ? ldr ? ? r0, [r1]
> >> + ? ? cmp ? ? r0, #0
> >> + ? ? movne ? r0, sp
> >> + ? ? adrne ? lr, BSYM(9997f)
> >> + ? ? ldrne ? pc, [r1]
> >> +#endif
> >
> > You might as well do this:
> > ...
> +#ifdef CONFIG_MULTI_IRQ_HANDLER
> + ldr r1, =handle_arch_irq
> + ldr r0, [r1]
> + cmp r0, #0
> + movne r0, sp
> + adrne lr, BSYM(9997f)
> + ldrne pc, [r1]
> +#endif
This looks suspiciously like the old version to me.
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-12 14:33 ` Eric Miao
2010-12-12 14:49 ` Russell King - ARM Linux
@ 2010-12-12 14:50 ` Eric Miao
1 sibling, 0 replies; 14+ messages in thread
From: Eric Miao @ 2010-12-12 14:50 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Dec 12, 2010 at 10:33 PM, Eric Miao <eric.y.miao@gmail.com> wrote:
> On Wed, Dec 8, 2010 at 9:41 PM, Russell King - ARM Linux
> <linux@arm.linux.org.uk> wrote:
>> On Tue, Dec 07, 2010 at 09:31:11PM +0800, Eric Miao wrote:
>>> Ah silly me, the patch below fixed this, and tested on Marvell Dove:
>> ...
>>> diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
>>> index ce3eee9..6ecdad9 100644
>>> --- a/arch/arm/include/asm/mach/irq.h
>>> +++ b/arch/arm/include/asm/mach/irq.h
>>> @@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
>>> ?extern void init_FIQ(void);
>>> ?extern int show_fiq_list(struct seq_file *, void *);
>>>
>>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>>> +extern void (*handle_arch_irq)(struct pt_regs *);
>>> +#endif
>>> +
>>> ?/*
>>> ? * This is for easy migration, but should be changed in the source
>>> ? */
>>> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
>>> index c09e357..d29e31b 100644
>>> --- a/arch/arm/kernel/entry-armv.S
>>> +++ b/arch/arm/kernel/entry-armv.S
>>> @@ -30,6 +30,14 @@
>>> ? * Interrupt handling. ?Preserves r7, r8, r9
>>> ? */
>>> ? ? ? .macro ?irq_handler
>>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>>> + ? ? ldr ? ? r1, =handle_arch_irq
>>> + ? ? ldr ? ? r0, [r1]
>>> + ? ? cmp ? ? r0, #0
>>> + ? ? movne ? r0, sp
>>> + ? ? adrne ? lr, BSYM(9997f)
>>> + ? ? ldrne ? pc, [r1]
>>> +#endif
>>
>> You might as well do this:
>>
>> ? ? ? ?ldr ? ? r5, =handle_arch_irq
>> ? ? ? ?mov ? ? r0, sp
>> ? ? ? ?ldr ? ? r5, [r5]
>> ? ? ? ?adr ? ? lr, BSYM(9997f)
>> ? ? ? ?teq ? ? r5, #0
>> ? ? ? ?movne ? pc, r5
>>
>> which also helps to fill the load delay slots with useful work.
>>
>>> ? ? ? get_irqnr_preamble r5, lr
>>> ?1: ? get_irqnr_and_base r0, r6, r5, lr
>>> ? ? ? movne ? r1, sp
>>> @@ -58,9 +66,8 @@
>>> ? ? ? adrne ? lr, BSYM(1b)
>>> ? ? ? bne ? ? do_local_timer
>>> ?#endif
>>> -9997:
>>> ?#endif
>>> -
>>> +9997:
>>> ? ? ? .endm
>>>
>>> ?#ifdef CONFIG_KPROBES
>>> @@ -1245,3 +1252,9 @@ cr_alignment:
>>> ? ? ? .space ?4
>>> ?cr_no_alignment:
>>> ? ? ? .space ?4
>>> +
>>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>>> + ? ? .globl ?handle_arch_irq
>>> +handle_arch_irq:
>>> + ? ? .long ? 0
>>
>> ? ? ? ?.space 4
>>
>> as above please
>>
>
> Updated the patch following your suggestions, verified on Marvell Dove
> platform and it worked all right. Do you want me to submit this to the
> patch tracking system?
>
(ignore my last mail with the wrong patch, my brain short circuited today,
here's the updated one):
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index db524e7..0cecffb 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1017,6 +1017,11 @@ config CPU_HAS_PMU
default y
bool
+config MULTI_IRQ_HANDLER
+ bool
+ help
+ Allow each machine to specify it's own IRQ handler at run time.
+
if !MMU
source "arch/arm/Kconfig-nommu"
endif
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index d97a964..7d55356 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -40,6 +40,9 @@ struct machine_desc {
void (*init_irq)(void);
struct sys_timer *timer; /* system tick timer */
void (*init_machine)(void);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ void (*handle_irq)(struct pt_regs *);
+#endif
};
/*
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
index ce3eee9..6ecdad9 100644
--- a/arch/arm/include/asm/mach/irq.h
+++ b/arch/arm/include/asm/mach/irq.h
@@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void);
extern void init_FIQ(void);
extern int show_fiq_list(struct seq_file *, void *);
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+extern void (*handle_arch_irq)(struct pt_regs *);
+#endif
+
/*
* This is for easy migration, but should be changed in the source
*/
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index c09e357..e6c08ac 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -30,6 +30,14 @@
* Interrupt handling. Preserves r7, r8, r9
*/
.macro irq_handler
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ ldr r5, =handle_arch_irq
+ mov r0, sp
+ ldr r5, [r5]
+ adr lr, BSYM(9997f)
+ teq r5, #0
+ movne pc, r5
+#endif
get_irqnr_preamble r5, lr
1: get_irqnr_and_base r0, r6, r5, lr
movne r1, sp
@@ -58,9 +66,8 @@
adrne lr, BSYM(1b)
bne do_local_timer
#endif
-9997:
#endif
-
+9997:
.endm
#ifdef CONFIG_KPROBES
@@ -1245,3 +1252,9 @@ cr_alignment:
.space 4
cr_no_alignment:
.space 4
+
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ .globl handle_arch_irq
+handle_arch_irq:
+ .space 4
+#endif
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 336f14e..b809521 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -875,6 +875,9 @@ void __init setup_arch(char **cmdline_p)
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+ handle_arch_irq = mdesc->handle_irq;
+#endif
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-12 14:49 ` Russell King - ARM Linux
@ 2010-12-12 14:50 ` Eric Miao
2010-12-13 8:45 ` Eric Miao
0 siblings, 1 reply; 14+ messages in thread
From: Eric Miao @ 2010-12-12 14:50 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Dec 12, 2010 at 10:49 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Sun, Dec 12, 2010 at 10:33:01PM +0800, Eric Miao wrote:
>> On Wed, Dec 8, 2010 at 9:41 PM, Russell King - ARM Linux
>> <linux@arm.linux.org.uk> wrote:
>> > On Tue, Dec 07, 2010 at 09:31:11PM +0800, Eric Miao wrote:
>> >> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> >> + ? ? ldr ? ? r1, =handle_arch_irq
>> >> + ? ? ldr ? ? r0, [r1]
>> >> + ? ? cmp ? ? r0, #0
>> >> + ? ? movne ? r0, sp
>> >> + ? ? adrne ? lr, BSYM(9997f)
>> >> + ? ? ldrne ? pc, [r1]
>> >> +#endif
>> >
>> > You might as well do this:
>> > ...
>
>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>> + ? ? ldr ? ? r1, =handle_arch_irq
>> + ? ? ldr ? ? r0, [r1]
>> + ? ? cmp ? ? r0, #0
>> + ? ? movne ? r0, sp
>> + ? ? adrne ? lr, BSYM(9997f)
>> + ? ? ldrne ? pc, [r1]
>> +#endif
>
> This looks suspiciously like the old version to me.
>
Yeah, my brain malfunctioned. :-)
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-12 14:50 ` Eric Miao
@ 2010-12-13 8:45 ` Eric Miao
2010-12-13 12:55 ` Magnus Damm
0 siblings, 1 reply; 14+ messages in thread
From: Eric Miao @ 2010-12-13 8:45 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Dec 12, 2010 at 10:50 PM, Eric Miao <eric.y.miao@gmail.com> wrote:
> On Sun, Dec 12, 2010 at 10:49 PM, Russell King - ARM Linux
> <linux@arm.linux.org.uk> wrote:
>> On Sun, Dec 12, 2010 at 10:33:01PM +0800, Eric Miao wrote:
>>> On Wed, Dec 8, 2010 at 9:41 PM, Russell King - ARM Linux
>>> <linux@arm.linux.org.uk> wrote:
>>> > On Tue, Dec 07, 2010 at 09:31:11PM +0800, Eric Miao wrote:
>>> >> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>>> >> + ? ? ldr ? ? r1, =handle_arch_irq
>>> >> + ? ? ldr ? ? r0, [r1]
>>> >> + ? ? cmp ? ? r0, #0
>>> >> + ? ? movne ? r0, sp
>>> >> + ? ? adrne ? lr, BSYM(9997f)
>>> >> + ? ? ldrne ? pc, [r1]
>>> >> +#endif
>>> >
>>> > You might as well do this:
>>> > ...
>>
>>> +#ifdef CONFIG_MULTI_IRQ_HANDLER
>>> + ? ? ldr ? ? r1, =handle_arch_irq
>>> + ? ? ldr ? ? r0, [r1]
>>> + ? ? cmp ? ? r0, #0
>>> + ? ? movne ? r0, sp
>>> + ? ? adrne ? lr, BSYM(9997f)
>>> + ? ? ldrne ? pc, [r1]
>>> +#endif
>>
>> This looks suspiciously like the old version to me.
>>
>
> Yeah, my brain malfunctioned. :-)
>
Hi Russell,
I've submitted the patch to your patch tracking system with the line
below:
The assembly code to invoke handle_arch_irq is optimized by Russell
King.
Shame that it now looks I did almost nothing to this patch :-)
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time
2010-12-13 8:45 ` Eric Miao
@ 2010-12-13 12:55 ` Magnus Damm
0 siblings, 0 replies; 14+ messages in thread
From: Magnus Damm @ 2010-12-13 12:55 UTC (permalink / raw)
To: linux-arm-kernel
Hi Eric,
On Mon, Dec 13, 2010 at 5:45 PM, Eric Miao <eric.y.miao@gmail.com> wrote:
> Hi Russell,
>
> I've submitted the patch to your patch tracking system with the line
> below:
>
> The assembly code to invoke handle_arch_irq is optimized by Russell
> King.
>
> Shame that it now looks I did almost nothing to this patch :-)
Thanks for your work on this. I've tried out your patch on real
hardware today and it works well. Sorry for not giving you more
feedback earlier. No need to rip the patch out of the tracker or
anything, but feel free to add my acked-by if you happen to resubmit
in the future.
Acked-by: Magnus Damm <damm@opensource.se>
Cheers,
/ magnus
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2010-12-13 12:55 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-22 8:26 [PATCH] ARM: Allow machine to specify it's own IRQ handlers at run-time Eric Miao
2010-12-05 9:23 ` Russell King - ARM Linux
2010-12-06 6:12 ` Eric Miao
2010-12-06 8:06 ` Russell King - ARM Linux
2010-12-06 9:31 ` Eric Miao
2010-12-06 10:11 ` Russell King - ARM Linux
2010-12-07 13:31 ` Eric Miao
2010-12-08 13:41 ` Russell King - ARM Linux
2010-12-12 14:33 ` Eric Miao
2010-12-12 14:49 ` Russell King - ARM Linux
2010-12-12 14:50 ` Eric Miao
2010-12-13 8:45 ` Eric Miao
2010-12-13 12:55 ` Magnus Damm
2010-12-12 14:50 ` Eric Miao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).