#include <linux/pm_runtime.h>
 
 #define FORCEWAKE_ACK_TIMEOUT_MS 50
+#define GT_FIFO_TIMEOUT_MS      10
 
 #define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32((dev_priv__), (reg__))
 
        return count & GT_FIFO_FREE_ENTRIES_MASK;
 }
 
-static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
+static void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
 {
-       int ret = 0;
+       u32 n;
 
        /* On VLV, FIFO will be shared by both SW and HW.
         * So, we need to read the FREE_ENTRIES everytime */
        if (IS_VALLEYVIEW(dev_priv))
-               dev_priv->uncore.fifo_count = fifo_free_entries(dev_priv);
-
-       if (dev_priv->uncore.fifo_count < GT_FIFO_NUM_RESERVED_ENTRIES) {
-               int loop = 500;
-               u32 fifo = fifo_free_entries(dev_priv);
-
-               while (fifo <= GT_FIFO_NUM_RESERVED_ENTRIES && loop--) {
-                       udelay(10);
-                       fifo = fifo_free_entries(dev_priv);
+               n = fifo_free_entries(dev_priv);
+       else
+               n = dev_priv->uncore.fifo_count;
+
+       if (n <= GT_FIFO_NUM_RESERVED_ENTRIES) {
+               if (wait_for_atomic((n = fifo_free_entries(dev_priv)) >
+                                   GT_FIFO_NUM_RESERVED_ENTRIES,
+                                   GT_FIFO_TIMEOUT_MS)) {
+                       DRM_DEBUG("GT_FIFO timeout, entries: %u\n", n);
+                       return;
                }
-               if (WARN_ON(loop < 0 && fifo <= GT_FIFO_NUM_RESERVED_ENTRIES))
-                       ++ret;
-               dev_priv->uncore.fifo_count = fifo;
        }
-       dev_priv->uncore.fifo_count--;
 
-       return ret;
+       dev_priv->uncore.fifo_count = n - 1;
 }
 
 static enum hrtimer_restart