aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/gvt/scheduler.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/gvt/scheduler.c')
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
index ea34003d6dd2..b8fbe3fabea3 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
@@ -334,6 +334,28 @@ static void release_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
334 i915_gem_object_put(wa_ctx->indirect_ctx.obj); 334 i915_gem_object_put(wa_ctx->indirect_ctx.obj);
335} 335}
336 336
337static int set_context_ppgtt_from_shadow(struct intel_vgpu_workload *workload,
338 struct i915_gem_context *ctx)
339{
340 struct intel_vgpu_mm *mm = workload->shadow_mm;
341 struct i915_hw_ppgtt *ppgtt = ctx->ppgtt;
342 int i = 0;
343
344 if (mm->type != INTEL_GVT_MM_PPGTT || !mm->ppgtt_mm.shadowed)
345 return -1;
346
347 if (mm->ppgtt_mm.root_entry_type == GTT_TYPE_PPGTT_ROOT_L4_ENTRY) {
348 px_dma(&ppgtt->pml4) = mm->ppgtt_mm.shadow_pdps[0];
349 } else {
350 for (i = 0; i < GVT_RING_CTX_NR_PDPS; i++) {
351 px_dma(ppgtt->pdp.page_directory[i]) =
352 mm->ppgtt_mm.shadow_pdps[i];
353 }
354 }
355
356 return 0;
357}
358
337/** 359/**
338 * intel_gvt_scan_and_shadow_workload - audit the workload by scanning and 360 * intel_gvt_scan_and_shadow_workload - audit the workload by scanning and
339 * shadow it as well, include ringbuffer,wa_ctx and ctx. 361 * shadow it as well, include ringbuffer,wa_ctx and ctx.
@@ -358,6 +380,12 @@ int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload)
358 if (workload->req) 380 if (workload->req)
359 return 0; 381 return 0;
360 382
383 ret = set_context_ppgtt_from_shadow(workload, shadow_ctx);
384 if (ret < 0) {
385 gvt_vgpu_err("workload shadow ppgtt isn't ready\n");
386 return ret;
387 }
388
361 /* pin shadow context by gvt even the shadow context will be pinned 389 /* pin shadow context by gvt even the shadow context will be pinned
362 * when i915 alloc request. That is because gvt will update the guest 390 * when i915 alloc request. That is because gvt will update the guest
363 * context from shadow context when workload is completed, and at that 391 * context from shadow context when workload is completed, and at that