clear-pkgs-linux-iot-lts2018/1270-drm-i915-gvt-Allow-Sos...

138 lines
4.6 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Zhao Yakui <yakui.zhao@intel.com>
Date: Tue, 31 Mar 2020 16:25:15 +0800
Subject: [PATCH] drm/i915/gvt: Allow Sos to access the plane owned by Guest
before guest is booted
Currently when one plane is assigned to UOS, it will block all the
access to plane register in SOS. In such case it will cause that nothing
is displayed on some display in course of sos booting. This is not
expected. Before it is assigned to guest, it will still allow the SOS
to access the plane register.
Tracked-On:projectacrn/acrn-hypervisor#4572
Reviewed-by: Liu Xinyun <xinyun.liu@intel.com>
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
---
drivers/gpu/drm/i915/gvt/acrngt.c | 5 +++++
drivers/gpu/drm/i915/gvt/gvt.h | 1 +
drivers/gpu/drm/i915/intel_display.c | 16 +++++++++++-----
drivers/gpu/drm/i915/intel_sprite.c | 20 ++++++++++++++++----
4 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/i915/gvt/acrngt.c b/drivers/gpu/drm/i915/gvt/acrngt.c
index bdec6b7daa29..f2833ae17ef2 100644
--- a/drivers/gpu/drm/i915/gvt/acrngt.c
+++ b/drivers/gpu/drm/i915/gvt/acrngt.c
@@ -81,6 +81,8 @@ void acrngt_instance_destroy(struct intel_vgpu *vgpu)
struct intel_gvt *gvt = acrngt_priv.gvt;
if (vgpu) {
+ int domain_id = vgpu->id;
+
info = (struct acrngt_hvm_dev *)vgpu->handle;
if (info && info->emulation_thread != NULL)
@@ -97,6 +99,7 @@ void acrngt_instance_destroy(struct intel_vgpu *vgpu)
intel_gvt_ops->vgpu_release(vgpu);
intel_gvt_ops->vgpu_destroy(vgpu);
+ gvt->domain_ready[domain_id] = false;
}
if (info) {
@@ -304,6 +307,8 @@ struct intel_vgpu *acrngt_instance_create(domid_t vm_id,
gvt_err("failed to create vgpu\n");
return NULL;
}
+ /* after the VGPU is created, the domain owner is ready */
+ acrngt_priv.gvt->domain_ready[vgpu->id] = true;
info = kzalloc(sizeof(struct acrngt_hvm_dev), GFP_KERNEL);
if (info == NULL) {
diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index e881bbdd87f8..682711266672 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -383,6 +383,7 @@ struct intel_gvt {
void *intel_gvt_vreg_pool[GVT_MAX_VGPU];
bool intel_gvt_vreg_allocated[GVT_MAX_VGPU];
+ bool domain_ready[1 << 4];
};
static inline struct intel_gvt *to_gvt(struct drm_i915_private *i915)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index b62645c050f5..418222147600 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3473,16 +3473,22 @@ static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
{
struct drm_device *dev = intel_crtc->base.dev;
struct drm_i915_private *dev_priv = to_i915(dev);
+ int pipe = intel_crtc->pipe;
#if IS_ENABLED(CONFIG_DRM_I915_GVT)
if (intel_gvt_active(dev_priv) &&
- dev_priv->gvt->pipe_info[intel_crtc->pipe].scaler_owner[id] != 0)
- return;
+ dev_priv->gvt->pipe_info[pipe].scaler_owner[id] != 0) {
+ int domain_id;
+
+ domain_id = dev_priv->gvt->pipe_info[pipe].scaler_owner[id];
+ if (dev_priv->gvt->domain_ready[domain_id])
+ return;
+ }
#endif
- I915_WRITE(SKL_PS_CTRL(intel_crtc->pipe, id), 0);
- I915_WRITE(SKL_PS_WIN_POS(intel_crtc->pipe, id), 0);
- I915_WRITE(SKL_PS_WIN_SZ(intel_crtc->pipe, id), 0);
+ I915_WRITE(SKL_PS_CTRL(pipe, id), 0);
+ I915_WRITE(SKL_PS_WIN_POS(pipe, id), 0);
+ I915_WRITE(SKL_PS_WIN_SZ(pipe, id), 0);
}
/*
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index b388a6b5b402..2d69914fdd55 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -323,8 +323,14 @@ skl_update_plane(struct intel_plane *plane,
#if IS_ENABLED(CONFIG_DRM_I915_GVT)
if (dev_priv->gvt &&
- dev_priv->gvt->pipe_info[pipe].plane_owner[plane_id])
- return;
+ dev_priv->gvt->pipe_info[pipe].plane_owner[plane_id]) {
+ int domain_id;
+
+ domain_id =
+ dev_priv->gvt->pipe_info[pipe].plane_owner[plane_id];
+ if (dev_priv->gvt->domain_ready[domain_id])
+ return;
+ }
#endif
/* Sizes are 0 based */
src_w--;
@@ -434,8 +440,14 @@ skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)
#if IS_ENABLED(CONFIG_DRM_I915_GVT)
if (dev_priv->gvt &&
- dev_priv->gvt->pipe_info[pipe].plane_owner[plane_id])
- return;
+ dev_priv->gvt->pipe_info[pipe].plane_owner[plane_id]) {
+ int domain_id;
+
+ domain_id =
+ dev_priv->gvt->pipe_info[pipe].plane_owner[plane_id];
+ if (dev_priv->gvt->domain_ready[domain_id])
+ return;
+ }
#endif
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
--
https://clearlinux.org