| From foo@baz Fri 08 Nov 2019 05:55:09 PM CET |
| From: Sandipan Das <sandipan@linux.ibm.com> |
| Date: Thu, 17 Oct 2019 13:35:01 +0530 |
| Subject: powerpc/book3s64/mm: Don't do tlbie fixup for some hardware revisions |
| To: gregkh@linuxfoundation.org |
| Cc: stable@vger.kernel.org, aneesh.kumar@linux.ibm.com, mpe@ellerman.id.au, linuxppc-dev@lists.ozlabs.org |
| Message-ID: <20191017080505.8348-2-sandipan@linux.ibm.com> |
| |
| From: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com> |
| |
| commit 677733e296b5c7a37c47da391fc70a43dc40bd67 upstream. |
| |
| The store ordering vs tlbie issue mentioned in commit |
| a5d4b5891c2f ("powerpc/mm: Fixup tlbie vs store ordering issue on |
| POWER9") is fixed for Nimbus 2.3 and Cumulus 1.3 revisions. We don't |
| need to apply the fixup if we are running on them |
| |
| We can only do this on PowerNV. On pseries guest with kvm we still |
| don't support redoing the feature fixup after migration. So we should |
| be enabling all the workarounds needed, because whe can possibly |
| migrate between DD 2.3 and DD 2.2 |
| |
| Cc: stable@vger.kernel.org # v4.14 |
| Fixes: a5d4b5891c2f ("powerpc/mm: Fixup tlbie vs store ordering issue on POWER9") |
| Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20190924035254.24612-1-aneesh.kumar@linux.ibm.com |
| [sandipan: Backported to v4.14] |
| Signed-off-by: Sandipan Das <sandipan@linux.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/powerpc/kernel/dt_cpu_ftrs.c | 31 ++++++++++++++++++++++++++++--- |
| 1 file changed, 28 insertions(+), 3 deletions(-) |
| |
| --- a/arch/powerpc/kernel/dt_cpu_ftrs.c |
| +++ b/arch/powerpc/kernel/dt_cpu_ftrs.c |
| @@ -733,9 +733,35 @@ static bool __init cpufeatures_process_f |
| return true; |
| } |
| |
| +/* |
| + * Handle POWER9 broadcast tlbie invalidation issue using |
| + * cpu feature flag. |
| + */ |
| +static __init void update_tlbie_feature_flag(unsigned long pvr) |
| +{ |
| + if (PVR_VER(pvr) == PVR_POWER9) { |
| + /* |
| + * Set the tlbie feature flag for anything below |
| + * Nimbus DD 2.3 and Cumulus DD 1.3 |
| + */ |
| + if ((pvr & 0xe000) == 0) { |
| + /* Nimbus */ |
| + if ((pvr & 0xfff) < 0x203) |
| + cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG; |
| + } else if ((pvr & 0xc000) == 0) { |
| + /* Cumulus */ |
| + if ((pvr & 0xfff) < 0x103) |
| + cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG; |
| + } else { |
| + WARN_ONCE(1, "Unknown PVR"); |
| + cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG; |
| + } |
| + } |
| +} |
| + |
| static __init void cpufeatures_cpu_quirks(void) |
| { |
| - int version = mfspr(SPRN_PVR); |
| + unsigned long version = mfspr(SPRN_PVR); |
| |
| /* |
| * Not all quirks can be derived from the cpufeatures device tree. |
| @@ -743,8 +769,7 @@ static __init void cpufeatures_cpu_quirk |
| if ((version & 0xffffff00) == 0x004e0100) |
| cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD1; |
| |
| - if ((version & 0xffff0000) == 0x004e0000) |
| - cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG; |
| + update_tlbie_feature_flag(version); |
| } |
| |
| static void __init cpufeatures_setup_finished(void) |