aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>2019-09-23 23:52:51 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2019-09-24 06:57:50 -0400
commit677733e296b5c7a37c47da391fc70a43dc40bd67 (patch)
treee8ecbf64fb80bed9fe686ee0c44e278b25b777f0
parent59545ebe331917afcb1ebbd6f3e5dc3ed51beb05 (diff)
powerpc/book3s64/mm: Don't do tlbie fixup for some hardware revisions
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
-rw-r--r--arch/powerpc/kernel/dt_cpu_ftrs.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/dt_cpu_ftrs.c b/arch/powerpc/kernel/dt_cpu_ftrs.c
index bceee2fde885..5fc1b527de46 100644
--- a/arch/powerpc/kernel/dt_cpu_ftrs.c
+++ b/arch/powerpc/kernel/dt_cpu_ftrs.c
@@ -692,9 +692,35 @@ static bool __init cpufeatures_process_feature(struct dt_cpu_feature *f)
692 return true; 692 return true;
693} 693}
694 694
695/*
696 * Handle POWER9 broadcast tlbie invalidation issue using
697 * cpu feature flag.
698 */
699static __init void update_tlbie_feature_flag(unsigned long pvr)
700{
701 if (PVR_VER(pvr) == PVR_POWER9) {
702 /*
703 * Set the tlbie feature flag for anything below
704 * Nimbus DD 2.3 and Cumulus DD 1.3
705 */
706 if ((pvr & 0xe000) == 0) {
707 /* Nimbus */
708 if ((pvr & 0xfff) < 0x203)
709 cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG;
710 } else if ((pvr & 0xc000) == 0) {
711 /* Cumulus */
712 if ((pvr & 0xfff) < 0x103)
713 cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG;
714 } else {
715 WARN_ONCE(1, "Unknown PVR");
716 cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG;
717 }
718 }
719}
720
695static __init void cpufeatures_cpu_quirks(void) 721static __init void cpufeatures_cpu_quirks(void)
696{ 722{
697 int version = mfspr(SPRN_PVR); 723 unsigned long version = mfspr(SPRN_PVR);
698 724
699 /* 725 /*
700 * Not all quirks can be derived from the cpufeatures device tree. 726 * Not all quirks can be derived from the cpufeatures device tree.
@@ -713,10 +739,10 @@ static __init void cpufeatures_cpu_quirks(void)
713 739
714 if ((version & 0xffff0000) == 0x004e0000) { 740 if ((version & 0xffff0000) == 0x004e0000) {
715 cur_cpu_spec->cpu_features &= ~(CPU_FTR_DAWR); 741 cur_cpu_spec->cpu_features &= ~(CPU_FTR_DAWR);
716 cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG;
717 cur_cpu_spec->cpu_features |= CPU_FTR_P9_TIDR; 742 cur_cpu_spec->cpu_features |= CPU_FTR_P9_TIDR;
718 } 743 }
719 744
745 update_tlbie_feature_flag(version);
720 /* 746 /*
721 * PKEY was not in the initial base or feature node 747 * PKEY was not in the initial base or feature node
722 * specification, but it should become optional in the next 748 * specification, but it should become optional in the next