Signed-off-by: Aneesh Kumar K.V <aneesh.ku...@linux.vnet.ibm.com>
---
 arch/powerpc/platforms/pseries/lpar.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/arch/powerpc/platforms/pseries/lpar.c 
b/arch/powerpc/platforms/pseries/lpar.c
index cd5cf5bd53f1..41512aaa8c8e 100644
--- a/arch/powerpc/platforms/pseries/lpar.c
+++ b/arch/powerpc/platforms/pseries/lpar.c
@@ -454,6 +454,27 @@ static void pSeries_lpar_hpte_invalidate(unsigned long 
slot, unsigned long vpn,
        BUG_ON(lpar_rc != H_SUCCESS);
 }
 
+static void __pseries_lpar_hash_invalidate(unsigned long hash, unsigned long 
vpn,
+                                          int psize, int apsize,
+                                          int ssize, int local)
+{
+       unsigned long want_v;
+       unsigned long lpar_rc;
+       unsigned long dummy1, dummy2;
+
+       pr_devel("    inval : hash=%lx, vpn=%016lx, psize: %d, local: %d\n",
+                hash, vpn, psize, local);
+
+       want_v = hpte_encode_avpn(vpn, psize, ssize);
+       lpar_rc = plpar_pte_hash_remove(H_AVPN, hash, want_v, &dummy1, &dummy2);
+       if (lpar_rc == H_NOT_FOUND)
+               return;
+
+       BUG_ON(lpar_rc != H_SUCCESS);
+
+}
+
+
 static void pSeries_lpar_hash_invalidate(unsigned long hash, unsigned long vpn,
                                         int psize, int apsize,
                                         int ssize, int local)
@@ -466,6 +487,9 @@ static void pSeries_lpar_hash_invalidate(unsigned long 
hash, unsigned long vpn,
        pr_devel("    inval : hash=%lx, vpn=%016lx, psize: %d, local: %d\n",
                 hash, vpn, psize, local);
 
+       if (firmware_has_feature(FW_FEATURE_HASH_API))
+               return __pseries_lpar_hash_invalidate(hash, vpn, psize,
+                                                     apsize, ssize, local);
        want_v = hpte_encode_avpn(vpn, psize, ssize);
        slot = __pSeries_lpar_hpte_find(hash, want_v);
        if (slot < 0)
-- 
2.13.6

Reply via email to