| From dd9a8c5a87395b6f05552c3b44e42fdc95760552 Mon Sep 17 00:00:00 2001 |
| From: Michael Neuling <mikey@neuling.org> |
| Date: Tue, 11 Sep 2018 13:07:56 +1000 |
| Subject: powerpc/tm: Fix HFSCR bit for no suspend case |
| |
| From: Michael Neuling <mikey@neuling.org> |
| |
| commit dd9a8c5a87395b6f05552c3b44e42fdc95760552 upstream. |
| |
| Currently on P9N DD2.1 we end up taking infinite TM facility |
| unavailable exceptions on the first TM usage by userspace. |
| |
| In the special case of TM no suspend (P9N DD2.1), Linux is told TM is |
| off via CPU dt-ftrs but told to (partially) use it via |
| OPAL_REINIT_CPUS_TM_SUSPEND_DISABLED. So HFSCR[TM] will be off from |
| dt-ftrs but we need to turn it on for the no suspend case. |
| |
| This patch fixes this by enabling HFSCR TM in this case. |
| |
| Cc: stable@vger.kernel.org # 4.15+ |
| Signed-off-by: Michael Neuling <mikey@neuling.org> |
| Signed-off-by: Paul Mackerras <paulus@ozlabs.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/kernel/setup_64.c | 18 ++++++++++++------ |
| 1 file changed, 12 insertions(+), 6 deletions(-) |
| |
| --- a/arch/powerpc/kernel/setup_64.c |
| +++ b/arch/powerpc/kernel/setup_64.c |
| @@ -243,13 +243,19 @@ static void cpu_ready_for_interrupts(voi |
| } |
| |
| /* |
| - * Fixup HFSCR:TM based on CPU features. The bit is set by our |
| - * early asm init because at that point we haven't updated our |
| - * CPU features from firmware and device-tree. Here we have, |
| - * so let's do it. |
| + * Set HFSCR:TM based on CPU features: |
| + * In the special case of TM no suspend (P9N DD2.1), Linux is |
| + * told TM is off via the dt-ftrs but told to (partially) use |
| + * it via OPAL_REINIT_CPUS_TM_SUSPEND_DISABLED. So HFSCR[TM] |
| + * will be off from dt-ftrs but we need to turn it on for the |
| + * no suspend case. |
| */ |
| - if (cpu_has_feature(CPU_FTR_HVMODE) && !cpu_has_feature(CPU_FTR_TM_COMP)) |
| - mtspr(SPRN_HFSCR, mfspr(SPRN_HFSCR) & ~HFSCR_TM); |
| + if (cpu_has_feature(CPU_FTR_HVMODE)) { |
| + if (cpu_has_feature(CPU_FTR_TM_COMP)) |
| + mtspr(SPRN_HFSCR, mfspr(SPRN_HFSCR) | HFSCR_TM); |
| + else |
| + mtspr(SPRN_HFSCR, mfspr(SPRN_HFSCR) & ~HFSCR_TM); |
| + } |
| |
| /* Set IR and DR in PACA MSR */ |
| get_paca()->kernel_msr = MSR_KERNEL; |