| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Ivan Mikhaylov <ivan@de.ibm.com> |
| Date: Fri, 19 May 2017 18:47:05 +0300 |
| Subject: powerpc/[booke|4xx]: Don't clobber TCR[WP] when setting TCR[DIE] |
| |
| From: Ivan Mikhaylov <ivan@de.ibm.com> |
| |
| |
| [ Upstream commit 6e2f03e292ef46eed2b31b0a344a91d514f9cd81 ] |
| |
| Prevent a kernel panic caused by unintentionally clearing TCR watchdog |
| bits. At this point in the kernel boot, the watchdog may have already |
| been enabled by u-boot. The original code's attempt to write to the TCR |
| register results in an inadvertent clearing of the watchdog |
| configuration bits, causing the 476 to reset. |
| |
| Signed-off-by: Ivan Mikhaylov <ivan@de.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/powerpc/kernel/time.c | 14 +++++++++++--- |
| 1 file changed, 11 insertions(+), 3 deletions(-) |
| |
| --- a/arch/powerpc/kernel/time.c |
| +++ b/arch/powerpc/kernel/time.c |
| @@ -719,12 +719,20 @@ static int __init get_freq(char *name, i |
| static void start_cpu_decrementer(void) |
| { |
| #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) |
| + unsigned int tcr; |
| + |
| /* Clear any pending timer interrupts */ |
| mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS); |
| |
| - /* Enable decrementer interrupt */ |
| - mtspr(SPRN_TCR, TCR_DIE); |
| -#endif /* defined(CONFIG_BOOKE) || defined(CONFIG_40x) */ |
| + tcr = mfspr(SPRN_TCR); |
| + /* |
| + * The watchdog may have already been enabled by u-boot. So leave |
| + * TRC[WP] (Watchdog Period) alone. |
| + */ |
| + tcr &= TCR_WP_MASK; /* Clear all bits except for TCR[WP] */ |
| + tcr |= TCR_DIE; /* Enable decrementer */ |
| + mtspr(SPRN_TCR, tcr); |
| +#endif |
| } |
| |
| void __init generic_calibrate_decr(void) |