clear-pkgs-linux-iot-lts2018/1106-drm-i915-gvt-fix-some-...

68 lines
2.3 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 39cef1485a2e..57a676e8dfe5 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5599,6 +5599,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)
{
@@ -5621,6 +5643,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