|
@@ -2233,6 +2233,15 @@ intel_pin_and_fence_fb_obj(struct drm_device *dev,
|
|
|
if (need_vtd_wa(dev) && alignment < 256 * 1024)
|
|
|
alignment = 256 * 1024;
|
|
|
|
|
|
+ /*
|
|
|
+ * Global gtt pte registers are special registers which actually forward
|
|
|
+ * writes to a chunk of system memory. Which means that there is no risk
|
|
|
+ * that the register values disappear as soon as we call
|
|
|
+ * intel_runtime_pm_put(), so it is correct to wrap only the
|
|
|
+ * pin/unpin/fence and not more.
|
|
|
+ */
|
|
|
+ intel_runtime_pm_get(dev_priv);
|
|
|
+
|
|
|
dev_priv->mm.interruptible = false;
|
|
|
ret = i915_gem_object_pin_to_display_plane(obj, alignment, pipelined);
|
|
|
if (ret)
|
|
@@ -2250,12 +2259,14 @@ intel_pin_and_fence_fb_obj(struct drm_device *dev,
|
|
|
i915_gem_object_pin_fence(obj);
|
|
|
|
|
|
dev_priv->mm.interruptible = true;
|
|
|
+ intel_runtime_pm_put(dev_priv);
|
|
|
return 0;
|
|
|
|
|
|
err_unpin:
|
|
|
i915_gem_object_unpin_from_display_plane(obj);
|
|
|
err_interruptible:
|
|
|
dev_priv->mm.interruptible = true;
|
|
|
+ intel_runtime_pm_put(dev_priv);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -8240,6 +8251,15 @@ static int intel_crtc_cursor_set_obj(struct drm_crtc *crtc,
|
|
|
goto fail_locked;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Global gtt pte registers are special registers which actually
|
|
|
+ * forward writes to a chunk of system memory. Which means that
|
|
|
+ * there is no risk that the register values disappear as soon
|
|
|
+ * as we call intel_runtime_pm_put(), so it is correct to wrap
|
|
|
+ * only the pin/unpin/fence and not more.
|
|
|
+ */
|
|
|
+ intel_runtime_pm_get(dev_priv);
|
|
|
+
|
|
|
/* Note that the w/a also requires 2 PTE of padding following
|
|
|
* the bo. We currently fill all unused PTE with the shadow
|
|
|
* page and so we should always have valid PTE following the
|
|
@@ -8252,16 +8272,20 @@ static int intel_crtc_cursor_set_obj(struct drm_crtc *crtc,
|
|
|
ret = i915_gem_object_pin_to_display_plane(obj, alignment, NULL);
|
|
|
if (ret) {
|
|
|
DRM_DEBUG_KMS("failed to move cursor bo into the GTT\n");
|
|
|
+ intel_runtime_pm_put(dev_priv);
|
|
|
goto fail_locked;
|
|
|
}
|
|
|
|
|
|
ret = i915_gem_object_put_fence(obj);
|
|
|
if (ret) {
|
|
|
DRM_DEBUG_KMS("failed to release fence for cursor");
|
|
|
+ intel_runtime_pm_put(dev_priv);
|
|
|
goto fail_unpin;
|
|
|
}
|
|
|
|
|
|
addr = i915_gem_obj_ggtt_offset(obj);
|
|
|
+
|
|
|
+ intel_runtime_pm_put(dev_priv);
|
|
|
} else {
|
|
|
int align = IS_I830(dev) ? 16 * 1024 : 256;
|
|
|
ret = i915_gem_object_attach_phys(obj, align);
|