| From 618d7c58521a3f7a80beb4f76830ecaaa661fd1c Mon Sep 17 00:00:00 2001 |
| From: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com> |
| Date: Tue, 24 Sep 2019 09:22:51 +0530 |
| Subject: [PATCH] powerpc/book3s64/mm: Don't do tlbie fixup for some hardware |
| revisions |
| |
| 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 |
| |
| Fixes: a5d4b5891c2f ("powerpc/mm: Fixup tlbie vs store ordering issue on POWER9") |
| Cc: stable@vger.kernel.org # v4.16+ |
| 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 |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/powerpc/kernel/dt_cpu_ftrs.c b/arch/powerpc/kernel/dt_cpu_ftrs.c |
| index bd95318d2202..eeaff2085120 100644 |
| --- a/arch/powerpc/kernel/dt_cpu_ftrs.c |
| +++ b/arch/powerpc/kernel/dt_cpu_ftrs.c |
| @@ -691,9 +691,35 @@ static bool __init cpufeatures_process_feature(struct dt_cpu_feature *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. |
| @@ -712,10 +738,10 @@ static __init void cpufeatures_cpu_quirks(void) |
| |
| if ((version & 0xffff0000) == 0x004e0000) { |
| cur_cpu_spec->cpu_features &= ~(CPU_FTR_DAWR); |
| - cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG; |
| cur_cpu_spec->cpu_features |= CPU_FTR_P9_TIDR; |
| } |
| |
| + update_tlbie_feature_flag(version); |
| /* |
| * PKEY was not in the initial base or feature node |
| * specification, but it should become optional in the next |
| -- |
| 2.7.4 |
| |