iommu/ipmmu-vmsa: Convert to read_poll_timeout_atomic()
authorGeert Uytterhoeven <geert+renesas@glider.be>
Mon, 17 Jul 2023 13:14:40 +0000 (15:14 +0200)
committerJoerg Roedel <jroedel@suse.de>
Mon, 7 Aug 2023 12:25:34 +0000 (14:25 +0200)
Use read_poll_timeout_atomic() instead of open-coding the same
operation.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/r/649c7e09841b998c5c8d7fc274884a85e4b5bfe9.1689599528.git.geert+renesas@glider.be
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/ipmmu-vmsa.c

index 9f64c5c9f5b90ace00aff6ec7b7281bfd68d22eb..3b58a8ea3bdef190a6e93cfa41f756868f37a763 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/iopoll.h>
 #include <linux/io-pgtable.h>
 #include <linux/iommu.h>
 #include <linux/of.h>
@@ -253,17 +254,13 @@ static void ipmmu_imuctr_write(struct ipmmu_vmsa_device *mmu,
 /* Wait for any pending TLB invalidations to complete */
 static void ipmmu_tlb_sync(struct ipmmu_vmsa_domain *domain)
 {
-       unsigned int count = 0;
+       u32 val;
 
-       while (ipmmu_ctx_read_root(domain, IMCTR) & IMCTR_FLUSH) {
-               cpu_relax();
-               if (++count == TLB_LOOP_TIMEOUT) {
-                       dev_err_ratelimited(domain->mmu->dev,
+       if (read_poll_timeout_atomic(ipmmu_ctx_read_root, val,
+                                    !(val & IMCTR_FLUSH), 1, TLB_LOOP_TIMEOUT,
+                                    false, domain, IMCTR))
+               dev_err_ratelimited(domain->mmu->dev,
                        "TLB sync timed out -- MMU may be deadlocked\n");
-                       return;
-               }
-               udelay(1);
-       }
 }
 
 static void ipmmu_tlb_invalidate(struct ipmmu_vmsa_domain *domain)