* [PATCH] common: board_r: Initialize interrupts before watchdog
@ 2025-02-18 15:55 J. Neuschäfer via B4 Relay
2025-02-20 13:49 ` Simon Glass
0 siblings, 1 reply; 5+ messages in thread
From: J. Neuschäfer via B4 Relay @ 2025-02-18 15:55 UTC (permalink / raw)
To: Tom Rini; +Cc: u-boot, J. Neuschäfer
From: "J. Neuschäfer" <j.ne@posteo.net>
On some platforms, initializing the watchdog driver enables a timer
interrupt. This of course requires the interrupt handlers to be
properly initialized, otherwise U-Boot may crash or run the timer
interrupt handler of a previous bootloader stage.
To account for such systems, always initialize interrupts
(arch_initr_trap) before the watchdog (initr_watchdog).
This problem was observed on a PowerPC MPC83xx board.
Signed-off-by: J. Neuschäfer <j.ne@posteo.net>
---
NOTE: This approach seems safe and fine to me, but an argument could be
made that this should be fixed in the platform-specific drivers
instead. Please let me know what you think.
Rough stack trace (not sure if it should be part of the commit message):
initr_watchdog (drivers/watchdog/wdt-uclass.c)
device_probe(wdt@200)
device_probe(timer)
mpc8xxx_wdt_start (drivers/watchdog/mpc8xxx_wdt.c)
set_msr(get_msr() | MSR_EE);
arch_initr_trap (arch/powerpc/lib/traps.c)
trap_init (arch/powerpc/cpu/mpc83xx/start.S)
---
common/board_r.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/common/board_r.c b/common/board_r.c
index 179259b00de81f7ba9802fc5288e7c2b6e6f381a..f711cd237ae76d80ca2413017bfe131656f44180 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -652,11 +652,11 @@ static init_fnc_t init_sequence_r[] = {
serial_initialize,
initr_announce,
dm_announce,
+ arch_initr_trap,
#if CONFIG_IS_ENABLED(WDT)
initr_watchdog,
#endif
INIT_FUNC_WATCHDOG_RESET
- arch_initr_trap,
#if defined(CONFIG_BOARD_EARLY_INIT_R)
board_early_init_r,
#endif
---
base-commit: 064556910e61044f1295162ceaad600582b66cda
change-id: 20250218-init-dab1fc72abd2
Best regards,
--
J. Neuschäfer <j.ne@posteo.net>
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH] common: board_r: Initialize interrupts before watchdog 2025-02-18 15:55 [PATCH] common: board_r: Initialize interrupts before watchdog J. Neuschäfer via B4 Relay @ 2025-02-20 13:49 ` Simon Glass 2025-02-22 18:58 ` J. Neuschäfer 0 siblings, 1 reply; 5+ messages in thread From: Simon Glass @ 2025-02-20 13:49 UTC (permalink / raw) To: j.ne; +Cc: Tom Rini, u-boot Hi J, On Tue, 18 Feb 2025 at 08:55, J. Neuschäfer via B4 Relay <devnull+j.ne.posteo.net@kernel.org> wrote: > > From: "J. Neuschäfer" <j.ne@posteo.net> > > On some platforms, initializing the watchdog driver enables a timer > interrupt. This of course requires the interrupt handlers to be > properly initialized, otherwise U-Boot may crash or run the timer > interrupt handler of a previous bootloader stage. > > To account for such systems, always initialize interrupts > (arch_initr_trap) before the watchdog (initr_watchdog). > > This problem was observed on a PowerPC MPC83xx board. > > Signed-off-by: J. Neuschäfer <j.ne@posteo.net> > --- > NOTE: This approach seems safe and fine to me, but an argument could be > made that this should be fixed in the platform-specific drivers > instead. Please let me know what you think. > > > Rough stack trace (not sure if it should be part of the commit message): > > initr_watchdog (drivers/watchdog/wdt-uclass.c) > device_probe(wdt@200) > device_probe(timer) > mpc8xxx_wdt_start (drivers/watchdog/mpc8xxx_wdt.c) > set_msr(get_msr() | MSR_EE); > > arch_initr_trap (arch/powerpc/lib/traps.c) > trap_init (arch/powerpc/cpu/mpc83xx/start.S) > --- > common/board_r.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/common/board_r.c b/common/board_r.c > index 179259b00de81f7ba9802fc5288e7c2b6e6f381a..f711cd237ae76d80ca2413017bfe131656f44180 100644 > --- a/common/board_r.c > +++ b/common/board_r.c > @@ -652,11 +652,11 @@ static init_fnc_t init_sequence_r[] = { > serial_initialize, > initr_announce, > dm_announce, > + arch_initr_trap, > #if CONFIG_IS_ENABLED(WDT) > initr_watchdog, > #endif > INIT_FUNC_WATCHDOG_RESET > - arch_initr_trap, > #if defined(CONFIG_BOARD_EARLY_INIT_R) > board_early_init_r, > #endif > > --- > base-commit: 064556910e61044f1295162ceaad600582b66cda > change-id: 20250218-init-dab1fc72abd2 > > Best regards, > -- > J. Neuschäfer <j.ne@posteo.net> > > The driver model way of doing this would be that your UCLASS_WDT driver calls uclass_first_device(UCLASS_IRQ) to make sure interrupts are ready. The arch_initr_trap thing should probably not be used in new code. Also, we have interrupt_init() which sounds like it is similar? Regards, Simon ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] common: board_r: Initialize interrupts before watchdog 2025-02-20 13:49 ` Simon Glass @ 2025-02-22 18:58 ` J. Neuschäfer 2025-02-24 17:54 ` Simon Glass 0 siblings, 1 reply; 5+ messages in thread From: J. Neuschäfer @ 2025-02-22 18:58 UTC (permalink / raw) To: Simon Glass; +Cc: j.ne, Tom Rini, u-boot, mario.six (CC'ing Mario Six regarding MPC83xx timer driver in U-Boot) On Thu, Feb 20, 2025 at 06:49:58AM -0700, Simon Glass wrote: > Hi J, > > On Tue, 18 Feb 2025 at 08:55, J. Neuschäfer via B4 Relay > <devnull+j.ne.posteo.net@kernel.org> wrote: > > > > From: "J. Neuschäfer" <j.ne@posteo.net> > > > > On some platforms, initializing the watchdog driver enables a timer > > interrupt. This of course requires the interrupt handlers to be > > properly initialized, otherwise U-Boot may crash or run the timer > > interrupt handler of a previous bootloader stage. > > > > To account for such systems, always initialize interrupts > > (arch_initr_trap) before the watchdog (initr_watchdog). > > > > This problem was observed on a PowerPC MPC83xx board. > > > > Signed-off-by: J. Neuschäfer <j.ne@posteo.net> > > --- > > NOTE: This approach seems safe and fine to me, but an argument could be > > made that this should be fixed in the platform-specific drivers > > instead. Please let me know what you think. > > > > > > Rough stack trace (not sure if it should be part of the commit message): > > > > initr_watchdog (drivers/watchdog/wdt-uclass.c) > > device_probe(wdt@200) > > device_probe(timer) > > mpc8xxx_wdt_start (drivers/watchdog/mpc8xxx_wdt.c) > > set_msr(get_msr() | MSR_EE); > > > > arch_initr_trap (arch/powerpc/lib/traps.c) > > trap_init (arch/powerpc/cpu/mpc83xx/start.S) > > --- > > common/board_r.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/common/board_r.c b/common/board_r.c > > index 179259b00de81f7ba9802fc5288e7c2b6e6f381a..f711cd237ae76d80ca2413017bfe131656f44180 100644 > > --- a/common/board_r.c > > +++ b/common/board_r.c > > @@ -652,11 +652,11 @@ static init_fnc_t init_sequence_r[] = { > > serial_initialize, > > initr_announce, > > dm_announce, > > + arch_initr_trap, > > #if CONFIG_IS_ENABLED(WDT) > > initr_watchdog, > > #endif > > INIT_FUNC_WATCHDOG_RESET > > - arch_initr_trap, > > #if defined(CONFIG_BOARD_EARLY_INIT_R) > > board_early_init_r, > > #endif > > > > --- > > base-commit: 064556910e61044f1295162ceaad600582b66cda > > change-id: 20250218-init-dab1fc72abd2 > > > > Best regards, > > -- > > J. Neuschäfer <j.ne@posteo.net> > > > > > > The driver model way of doing this would be that your UCLASS_WDT > driver calls uclass_first_device(UCLASS_IRQ) to make sure interrupts > are ready. This sounds good in principle, but would require some reworking of the MPC83xx interrupt infrastructure, because it currently doesn't declare a UCLASS_IRQ driver. > The arch_initr_trap thing should probably not be used in new code. > Also, we have interrupt_init() which sounds like it is similar? This isn't really *new* code, the MPC83xx platform support has been in U-Boot for a long time (I am touching it now due to a newly to be added board, though). I see various functions called interrupt_init(), one of them in mpc83xx_timer.c (i.e. relevant to my problems): /* * TODO(mario.six@gdsys.cc): This should really be done by timer_init, and the * interrupt init should go into a interrupt driver. */ int interrupt_init(void) { ... } it seems someone has stumbled on this oddity before. Another version of interrupt_init is in arch/powerpc/lib/interrupts.c. Fortunately, as I just found out, my PowerPC MPC8314E board works fine with the generic timer/interrupt support in arch/powerpc, with CONFIG_TIMER=n. In other words, the problem is localized to CONFIG_MPC83XX_TIMER. J. Neuschäfer ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] common: board_r: Initialize interrupts before watchdog 2025-02-22 18:58 ` J. Neuschäfer @ 2025-02-24 17:54 ` Simon Glass 2025-02-24 18:48 ` PowerPC MPC83XX timer issues (Re: [PATCH] common: board_r: Initialize interrupts before watchdog) J. Neuschäfer 0 siblings, 1 reply; 5+ messages in thread From: Simon Glass @ 2025-02-24 17:54 UTC (permalink / raw) To: J. Neuschäfer; +Cc: Tom Rini, u-boot, mario.six Hi J, On Sat, 22 Feb 2025 at 11:58, J. Neuschäfer <j.ne@posteo.net> wrote: > > (CC'ing Mario Six regarding MPC83xx timer driver in U-Boot) > > On Thu, Feb 20, 2025 at 06:49:58AM -0700, Simon Glass wrote: > > Hi J, > > > > On Tue, 18 Feb 2025 at 08:55, J. Neuschäfer via B4 Relay > > <devnull+j.ne.posteo.net@kernel.org> wrote: > > > > > > From: "J. Neuschäfer" <j.ne@posteo.net> > > > > > > On some platforms, initializing the watchdog driver enables a timer > > > interrupt. This of course requires the interrupt handlers to be > > > properly initialized, otherwise U-Boot may crash or run the timer > > > interrupt handler of a previous bootloader stage. > > > > > > To account for such systems, always initialize interrupts > > > (arch_initr_trap) before the watchdog (initr_watchdog). > > > > > > This problem was observed on a PowerPC MPC83xx board. > > > > > > Signed-off-by: J. Neuschäfer <j.ne@posteo.net> > > > --- > > > NOTE: This approach seems safe and fine to me, but an argument could be > > > made that this should be fixed in the platform-specific drivers > > > instead. Please let me know what you think. > > > > > > > > > Rough stack trace (not sure if it should be part of the commit message): > > > > > > initr_watchdog (drivers/watchdog/wdt-uclass.c) > > > device_probe(wdt@200) > > > device_probe(timer) > > > mpc8xxx_wdt_start (drivers/watchdog/mpc8xxx_wdt.c) > > > set_msr(get_msr() | MSR_EE); > > > > > > arch_initr_trap (arch/powerpc/lib/traps.c) > > > trap_init (arch/powerpc/cpu/mpc83xx/start.S) > > > --- > > > common/board_r.c | 2 +- > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > diff --git a/common/board_r.c b/common/board_r.c > > > index 179259b00de81f7ba9802fc5288e7c2b6e6f381a..f711cd237ae76d80ca2413017bfe131656f44180 100644 > > > --- a/common/board_r.c > > > +++ b/common/board_r.c > > > @@ -652,11 +652,11 @@ static init_fnc_t init_sequence_r[] = { > > > serial_initialize, > > > initr_announce, > > > dm_announce, > > > + arch_initr_trap, > > > #if CONFIG_IS_ENABLED(WDT) > > > initr_watchdog, > > > #endif > > > INIT_FUNC_WATCHDOG_RESET > > > - arch_initr_trap, > > > #if defined(CONFIG_BOARD_EARLY_INIT_R) > > > board_early_init_r, > > > #endif > > > > > > --- > > > base-commit: 064556910e61044f1295162ceaad600582b66cda > > > change-id: 20250218-init-dab1fc72abd2 > > > > > > Best regards, > > > -- > > > J. Neuschäfer <j.ne@posteo.net> > > > > > > > > > > The driver model way of doing this would be that your UCLASS_WDT > > driver calls uclass_first_device(UCLASS_IRQ) to make sure interrupts > > are ready. > > This sounds good in principle, but would require some reworking of the > MPC83xx interrupt infrastructure, because it currently doesn't declare a > UCLASS_IRQ driver. > > > The arch_initr_trap thing should probably not be used in new code. > > Also, we have interrupt_init() which sounds like it is similar? > > This isn't really *new* code, the MPC83xx platform support has been in > U-Boot for a long time (I am touching it now due to a newly to be added > board, though). > > I see various functions called interrupt_init(), one of them in > mpc83xx_timer.c (i.e. relevant to my problems): > > /* > * TODO(mario.six@gdsys.cc): This should really be done by timer_init, and the > * interrupt init should go into a interrupt driver. > */ > int interrupt_init(void) > { ... } > > it seems someone has stumbled on this oddity before. > > Another version of interrupt_init is in arch/powerpc/lib/interrupts.c. > Fortunately, as I just found out, my PowerPC MPC8314E board works fine > with the generic timer/interrupt support in arch/powerpc, with > CONFIG_TIMER=n. In other words, the problem is localized to > CONFIG_MPC83XX_TIMER. Thanks for all the info. So do you think you could clean this up in PowerPC? Regards, Simon ^ permalink raw reply [flat|nested] 5+ messages in thread
* PowerPC MPC83XX timer issues (Re: [PATCH] common: board_r: Initialize interrupts before watchdog) 2025-02-24 17:54 ` Simon Glass @ 2025-02-24 18:48 ` J. Neuschäfer 0 siblings, 0 replies; 5+ messages in thread From: J. Neuschäfer @ 2025-02-24 18:48 UTC (permalink / raw) To: Simon Glass; +Cc: J. Neuschäfer, Tom Rini, u-boot, mario.six On Mon, Feb 24, 2025 at 10:54:05AM -0700, Simon Glass wrote: > Hi J, > > On Sat, 22 Feb 2025 at 11:58, J. Neuschäfer <j.ne@posteo.net> wrote: > > > > (CC'ing Mario Six regarding MPC83xx timer driver in U-Boot) > > > > On Thu, Feb 20, 2025 at 06:49:58AM -0700, Simon Glass wrote: > > > Hi J, > > > > > > On Tue, 18 Feb 2025 at 08:55, J. Neuschäfer via B4 Relay > > > <devnull+j.ne.posteo.net@kernel.org> wrote: > > > > > > > > From: "J. Neuschäfer" <j.ne@posteo.net> > > > > > > > > On some platforms, initializing the watchdog driver enables a timer > > > > interrupt. This of course requires the interrupt handlers to be > > > > properly initialized, otherwise U-Boot may crash or run the timer > > > > interrupt handler of a previous bootloader stage. > > > > > > > > To account for such systems, always initialize interrupts > > > > (arch_initr_trap) before the watchdog (initr_watchdog). > > > > > > > > This problem was observed on a PowerPC MPC83xx board. > > > > > > > > Signed-off-by: J. Neuschäfer <j.ne@posteo.net> > > > > --- > > > > NOTE: This approach seems safe and fine to me, but an argument could be > > > > made that this should be fixed in the platform-specific drivers > > > > instead. Please let me know what you think. > > > > > > > > > > > > Rough stack trace (not sure if it should be part of the commit message): > > > > > > > > initr_watchdog (drivers/watchdog/wdt-uclass.c) > > > > device_probe(wdt@200) > > > > device_probe(timer) > > > > mpc8xxx_wdt_start (drivers/watchdog/mpc8xxx_wdt.c) > > > > set_msr(get_msr() | MSR_EE); > > > > > > > > arch_initr_trap (arch/powerpc/lib/traps.c) > > > > trap_init (arch/powerpc/cpu/mpc83xx/start.S) > > > > --- > > > > common/board_r.c | 2 +- > > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > > > diff --git a/common/board_r.c b/common/board_r.c > > > > index 179259b00de81f7ba9802fc5288e7c2b6e6f381a..f711cd237ae76d80ca2413017bfe131656f44180 100644 > > > > --- a/common/board_r.c > > > > +++ b/common/board_r.c > > > > @@ -652,11 +652,11 @@ static init_fnc_t init_sequence_r[] = { > > > > serial_initialize, > > > > initr_announce, > > > > dm_announce, > > > > + arch_initr_trap, > > > > #if CONFIG_IS_ENABLED(WDT) > > > > initr_watchdog, > > > > #endif > > > > INIT_FUNC_WATCHDOG_RESET > > > > - arch_initr_trap, > > > > #if defined(CONFIG_BOARD_EARLY_INIT_R) > > > > board_early_init_r, > > > > #endif > > > > > > > > --- > > > > base-commit: 064556910e61044f1295162ceaad600582b66cda > > > > change-id: 20250218-init-dab1fc72abd2 > > > > > > > > Best regards, > > > > -- > > > > J. Neuschäfer <j.ne@posteo.net> > > > > > > > > > > > > > > The driver model way of doing this would be that your UCLASS_WDT > > > driver calls uclass_first_device(UCLASS_IRQ) to make sure interrupts > > > are ready. > > > > This sounds good in principle, but would require some reworking of the > > MPC83xx interrupt infrastructure, because it currently doesn't declare a > > UCLASS_IRQ driver. > > > > > The arch_initr_trap thing should probably not be used in new code. > > > Also, we have interrupt_init() which sounds like it is similar? > > > > This isn't really *new* code, the MPC83xx platform support has been in > > U-Boot for a long time (I am touching it now due to a newly to be added > > board, though). > > > > I see various functions called interrupt_init(), one of them in > > mpc83xx_timer.c (i.e. relevant to my problems): > > > > /* > > * TODO(mario.six@gdsys.cc): This should really be done by timer_init, and the > > * interrupt init should go into a interrupt driver. > > */ > > int interrupt_init(void) > > { ... } > > > > it seems someone has stumbled on this oddity before. > > > > Another version of interrupt_init is in arch/powerpc/lib/interrupts.c. > > Fortunately, as I just found out, my PowerPC MPC8314E board works fine > > with the generic timer/interrupt support in arch/powerpc, with > > CONFIG_TIMER=n. In other words, the problem is localized to > > CONFIG_MPC83XX_TIMER. > > Thanks for all the info. So do you think you could clean this up in PowerPC? At the current moment, I'll rather use the the generic (non-MPC83xx) timer/irq support, for two reasons: 1. it works, and 2. I'm not familiar enough with U-Boot architecture and internals to come up with with a fix, without further research. Best regards, J. Neuschäfer ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-02-24 18:48 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-02-18 15:55 [PATCH] common: board_r: Initialize interrupts before watchdog J. Neuschäfer via B4 Relay 2025-02-20 13:49 ` Simon Glass 2025-02-22 18:58 ` J. Neuschäfer 2025-02-24 17:54 ` Simon Glass 2025-02-24 18:48 ` PowerPC MPC83XX timer issues (Re: [PATCH] common: board_r: Initialize interrupts before watchdog) J. Neuschäfer
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox