diff options
Diffstat (limited to 'drivers/gpu/drm/i915/gvt/scheduler.c')
-rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.c | 28 |
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 | ||
337 | static 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 |