119 lines
4.4 KiB
Diff
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
|
||
|
|