Backport another Broadwell fix from Linux 3.15
authorkettenis <kettenis@openbsd.org>
Sun, 18 Oct 2015 18:00:45 +0000 (18:00 +0000)
committerkettenis <kettenis@openbsd.org>
Sun, 18 Oct 2015 18:00:45 +0000 (18:00 +0000)
Ben Widawsky
drm/i915: Provide PDP updates via MMIO
e178f7057b81c87a7ceaae0ca204487b6f7eedcf

Doesn't make resume work, but at least it prevents the machine from hanging
and/or resetting.

sys/dev/pci/drm/i915/i915_gem_gtt.c

index d2d5d2b..9372f97 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: i915_gem_gtt.c,v 1.13 2015/09/26 13:15:25 kettenis Exp $      */
+/*     $OpenBSD: i915_gem_gtt.c,v 1.14 2015/10/18 18:00:45 kettenis Exp $      */
 /*
  * Copyright © 2010 Daniel Vetter
  *
@@ -209,12 +209,19 @@ static gen6_gtt_pte_t iris_pte_encode(dma_addr_t addr,
 
 /* Broadwell Page Directory Pointer Descriptors */
 static int gen8_write_pdp(struct intel_ring_buffer *ring, unsigned entry,
-                          uint64_t val)
+                          uint64_t val, bool synchronous)
 {
+       struct drm_i915_private *dev_priv = ring->dev->dev_private;
        int ret;
 
        BUG_ON(entry >= 4);
 
+       if (synchronous) {
+               I915_WRITE(GEN8_RING_PDP_UDW(ring, entry), val >> 32);
+               I915_WRITE(GEN8_RING_PDP_LDW(ring, entry), (u32)val);
+               return 0;
+       }
+
        ret = intel_ring_begin(ring, 6);
        if (ret)
                return ret;
@@ -248,7 +255,8 @@ static int gen8_ppgtt_enable(struct drm_device *dev)
        for (i = used_pd - 1; i >= 0; i--) {
                dma_addr_t addr = ppgtt->pd_dma_addr[i];
                for_each_ring(ring, dev_priv, j) {
-                       ret = gen8_write_pdp(ring, i, addr);
+                       ret = gen8_write_pdp(ring, i, addr,
+                                            i915_reset_in_progress(&dev_priv->gpu_error));
                        if (ret)
                                goto err_out;
                }