68 lines
2.2 KiB
Diff
68 lines
2.2 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Min He <min.he@intel.com>
|
||
|
Date: Thu, 13 Jun 2019 03:27:22 +0000
|
||
|
Subject: [PATCH] drm/i915/gvt: fix some garbage display issue in plane
|
||
|
restriction
|
||
|
|
||
|
In plane restriction case, when ServiceOS updates the plane wm
|
||
|
registers, sometimes there's garbage appears because the guest doesn't
|
||
|
update its plane registers in the same vblank period after plane wm
|
||
|
registers updated.
|
||
|
This patch will force refresh the plane registers (PLANE_CTL and
|
||
|
PLANE_SURF) owned by guests, after the wm registers updated.
|
||
|
|
||
|
Signed-off-by: Min He <min.he@intel.com>
|
||
|
Reviewed-by: Zhao Yakui <yakui.zhao@intel.com>
|
||
|
---
|
||
|
drivers/gpu/drm/i915/intel_pm.c | 27 +++++++++++++++++++++++++++
|
||
|
1 file changed, 27 insertions(+)
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
|
||
|
index da62058..e14a0ce 100644
|
||
|
--- a/drivers/gpu/drm/i915/intel_pm.c
|
||
|
+++ b/drivers/gpu/drm/i915/intel_pm.c
|
||
|
@@ -5591,6 +5591,28 @@ skl_compute_wm(struct drm_atomic_state *state)
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+#if IS_ENABLED(CONFIG_DRM_I915_GVT)
|
||
|
+/*
|
||
|
+ * when SOS updates plane wm registers, we need to refresh the planes owned by
|
||
|
+ * GVT-g guests, to avoid some garbage display on the screen
|
||
|
+ */
|
||
|
+static void update_gvt_guest_plane(struct drm_i915_private *dev_priv,
|
||
|
+ int pipe,
|
||
|
+ int plane_id)
|
||
|
+{
|
||
|
+ unsigned long value, irqflags;
|
||
|
+
|
||
|
+ spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
|
||
|
+
|
||
|
+ value = I915_READ_FW(PLANE_CTL(pipe, plane_id));
|
||
|
+ I915_WRITE_FW(PLANE_CTL(pipe, plane_id), value);
|
||
|
+ value = I915_READ_FW(PLANE_SURF(pipe, plane_id));
|
||
|
+ I915_WRITE_FW(PLANE_SURF(pipe, plane_id), value);
|
||
|
+
|
||
|
+ spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
|
||
|
+}
|
||
|
+#endif
|
||
|
+
|
||
|
static void skl_atomic_update_crtc_wm(struct intel_atomic_state *state,
|
||
|
struct intel_crtc_state *cstate)
|
||
|
{
|
||
|
@@ -5613,6 +5635,11 @@ static void skl_atomic_update_crtc_wm(struct intel_atomic_state *state,
|
||
|
for_each_universal_plane(dev_priv, pipe, plane_id) {
|
||
|
skl_write_plane_wm(crtc, &pipe_wm->planes[plane_id],
|
||
|
ddb, plane_id);
|
||
|
+#if IS_ENABLED(CONFIG_DRM_I915_GVT)
|
||
|
+ if (dev_priv->gvt &&
|
||
|
+ dev_priv->gvt->pipe_info[pipe].plane_owner[plane_id])
|
||
|
+ update_gvt_guest_plane(dev_priv, pipe, plane_id);
|
||
|
+#endif
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
--
|
||
|
https://clearlinux.org
|
||
|
|