clear-pkgs-linux-iot-lts2018/1237-drm-i915-gvt-Add-param...

119 lines
4.4 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Liu Xinyun <xinyun.liu@intel.com>
Date: Sat, 12 Oct 2019 03:26:12 +0800
Subject: [PATCH] drm/i915/gvt: Add parameter to disable non-context reg
save/restore
When guest OS is Linux too, the non-context regs save/restore can be
bypassed to save time while doing GPU context switch
set `enable_context_restore` to false as the default value for Acrn
Tracked-On: projectacrn/acrn-hypervisor#3830
Signed-off-by: Liu Xinyun <xinyun.liu@intel.com>
Reviewed-by: Zhao Yakui <yakui.zhao@intel.com>
---
drivers/gpu/drm/i915/gvt/sched_policy.c | 6 ++++++
drivers/gpu/drm/i915/gvt/scheduler.c | 15 +++++++++++++--
drivers/gpu/drm/i915/i915_params.c | 3 +++
drivers/gpu/drm/i915/i915_params.h | 3 ++-
4 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c
index c32e7d5e8629..594070bcd7c1 100644
--- a/drivers/gpu/drm/i915/gvt/sched_policy.c
+++ b/drivers/gpu/drm/i915/gvt/sched_policy.c
@@ -465,6 +465,11 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu)
scheduler->current_vgpu = NULL;
}
+ if (!i915_modparams.enable_context_restore) {
+ mutex_unlock(&vgpu->gvt->sched_lock);
+ return;
+ }
+
intel_runtime_pm_get(dev_priv);
spin_lock_bh(&scheduler->mmio_context_lock);
for (ring_id = 0; ring_id < I915_NUM_ENGINES; ring_id++) {
@@ -475,5 +480,6 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu)
}
spin_unlock_bh(&scheduler->mmio_context_lock);
intel_runtime_pm_put(dev_priv);
+
mutex_unlock(&vgpu->gvt->sched_lock);
}
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
index 52df3600b835..0dd1815ee772 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
@@ -292,6 +292,9 @@ static int shadow_context_status_change(struct notifier_block *nb,
unsigned long flags;
if (!is_gvt_request(req)) {
+ if (!i915_modparams.enable_context_restore)
+ return NOTIFY_OK;
+
spin_lock_irqsave(&scheduler->mmio_context_lock, flags);
if (action == INTEL_CONTEXT_SCHEDULE_IN &&
scheduler->engine_owner[ring_id]) {
@@ -311,6 +314,12 @@ static int shadow_context_status_change(struct notifier_block *nb,
switch (action) {
case INTEL_CONTEXT_SCHEDULE_IN:
+ if (!i915_modparams.enable_context_restore) {
+ schedule_work(&gvt->active_hp_work);
+ atomic_set(&workload->shadow_ctx_active, 1);
+ break;
+ }
+
spin_lock_irqsave(&scheduler->mmio_context_lock, flags);
if (workload->vgpu != scheduler->engine_owner[ring_id]) {
/* Switch ring from host to vGPU or vGPU to vGPU. */
@@ -326,11 +335,13 @@ static int shadow_context_status_change(struct notifier_block *nb,
atomic_set(&workload->shadow_ctx_active, 1);
break;
case INTEL_CONTEXT_SCHEDULE_OUT:
- save_ring_hw_state(workload->vgpu, ring_id);
+ if (i915_modparams.enable_context_restore)
+ save_ring_hw_state(workload->vgpu, ring_id);
atomic_set(&workload->shadow_ctx_active, 0);
break;
case INTEL_CONTEXT_SCHEDULE_PREEMPTED:
- save_ring_hw_state(workload->vgpu, ring_id);
+ if (i915_modparams.enable_context_restore)
+ save_ring_hw_state(workload->vgpu, ring_id);
break;
default:
WARN_ON(1);
diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
index 308dba99c973..60ec862d2e36 100644
--- a/drivers/gpu/drm/i915/i915_params.c
+++ b/drivers/gpu/drm/i915/i915_params.c
@@ -258,6 +258,9 @@ i915_param_named_unsafe(domain_plane_owners, ullong, 0400,
planes owner: 3C:2 2C:2 1C:1 4B:1 3B:1 2B:1 1B:0 4A:0 3A:0 2A:1 1A:0 \
(0x0 - default value)");
+i915_param_named_unsafe(enable_context_restore, bool, 0400,
+ "To togger non-context regs save/restore feature(default:false)");
+
static __always_inline void _print_param(struct drm_printer *p,
const char *name,
const char *type,
diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h
index 1fbdfd9b8703..61d863ffa9d0 100644
--- a/drivers/gpu/drm/i915/i915_params.h
+++ b/drivers/gpu/drm/i915/i915_params.h
@@ -77,7 +77,8 @@ struct drm_printer;
| PVMMIO_GGTT_UPDATE ) \
param(int, gvt_workload_priority, 0) \
param(bool, enable_initial_modeset, false) \
- param(bool, enable_gvt, false)
+ param(bool, enable_gvt, false) \
+ param(bool, enable_context_restore, false)
#define MEMBER(T, member, ...) T member;
struct i915_params {
--
https://clearlinux.org