[PATCH 1/2] drm/i915/lrc: Clarify the format of the context image

Chris Wilson chris at chris-wilson.co.uk
Wed Jul 12 19:45:50 UTC 2017


Quoting Michel Thierry (2017-07-12 20:30:31)
> Not only the context image consist of two parts (the PPHWSP, and the
> logical context state), but we also allocate a header at the start of
> for sharing data with GuC. Thus every lrc looks like this:
> 
>   | [guc]          | [hwsp] [logical state] |
>   |<- our header ->|<- context image      ->|
> 
> So far, we have oversimplified whenever we use each of these parts of the
> context, just because the GuC header happens to be in page 0, and the
> (PP)HWSP is in page 1. But this had led to using the same define for more
> than one meaning (as a page index in the lrc and as 1 page).
> 
> This patch adds defines for the GuC shared page, the PPHWSP page and the
> start of the logical state. It also updated the places where the old
> define was being used. Since we are not changing the size (or format) of
> the context, there are no functional changes.
> 
> Suggested-by: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Michel Thierry <michel.thierry at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
> Cc: Oscar Mateo <oscar.mateo at intel.com>
> Cc: intel-gvt-dev at lists.freedesktop.org
> ---
>  drivers/gpu/drm/i915/gvt/scheduler.c       |  4 ++--
>  drivers/gpu/drm/i915/i915_guc_submission.c |  4 ++--
>  drivers/gpu/drm/i915/intel_lrc.c           | 11 +++++++----
>  drivers/gpu/drm/i915/intel_lrc.h           | 25 ++++++++++++++++++++++---
>  4 files changed, 33 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
> index 0e2e36ad6196..8e9eeff156f6 100644
> --- a/drivers/gpu/drm/i915/gvt/scheduler.c
> +++ b/drivers/gpu/drm/i915/gvt/scheduler.c
> @@ -87,7 +87,7 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload)
>                         return -EINVAL;
>                 }
>  
> -               page = i915_gem_object_get_page(ctx_obj, LRC_PPHWSP_PN + i);
> +               page = i915_gem_object_get_page(ctx_obj, LRC_HEADER_PAGES + i);

Ah, that makes much more sense.

>                 dst = kmap(page);
>                 intel_gvt_hypervisor_read_gpa(vgpu, context_gpa, dst,
>                                 GTT_PAGE_SIZE);

> diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
> index 48a1e9349a2c..b7ca13860677 100644
> --- a/drivers/gpu/drm/i915/i915_guc_submission.c
> +++ b/drivers/gpu/drm/i915/i915_guc_submission.c
> @@ -1310,7 +1310,7 @@ int intel_guc_suspend(struct drm_i915_private *dev_priv)
>         /* any value greater than GUC_POWER_D0 */
>         data[1] = GUC_POWER_D1;
>         /* first page is shared data with GuC */
> -       data[2] = guc_ggtt_offset(ctx->engine[RCS].state);
> +       data[2] = guc_ggtt_offset(ctx->engine[RCS].state) + LRC_GUCSHR_PN * PAGE_SIZE;
>  
>         return intel_guc_send(guc, data, ARRAY_SIZE(data));
>  }
> @@ -1336,7 +1336,7 @@ int intel_guc_resume(struct drm_i915_private *dev_priv)
>         data[0] = INTEL_GUC_ACTION_EXIT_S_STATE;
>         data[1] = GUC_POWER_D0;
>         /* first page is shared data with GuC */
> -       data[2] = guc_ggtt_offset(ctx->engine[RCS].state);
> +       data[2] = guc_ggtt_offset(ctx->engine[RCS].state) + LRC_GUCSHR_PN * PAGE_SIZE;

Could spot any others, so lgtm.

>         return intel_guc_send(guc, data, ARRAY_SIZE(data));
>  }
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 699868d81de8..67a1187b0afe 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -279,7 +279,7 @@ intel_lr_context_descriptor_update(struct i915_gem_context *ctx,
>         BUILD_BUG_ON(MAX_CONTEXT_HW_ID > (1<<GEN8_CTX_ID_WIDTH));
>  
>         desc = ctx->desc_template;                              /* bits  0-11 */
> -       desc |= i915_ggtt_offset(ce->state) + LRC_PPHWSP_PN * PAGE_SIZE;

Arguable that this could be PPHWSP since that is the start of the
context image for execlists. HEADER is also an apt description, so 50/50.
Actually favouring using HEADER, so keep the change.

> +       desc |= i915_ggtt_offset(ce->state) + LRC_HEADER_PAGES * PAGE_SIZE;
>                                                                 /* bits 12-31 */
>         desc |= (u64)ctx->hw_id << GEN8_CTX_ID_SHIFT;           /* bits 32-52 */
>  
> @@ -1695,7 +1695,7 @@ logical_ring_default_irqs(struct intel_engine_cs *engine)
>  static int
>  lrc_setup_hws(struct intel_engine_cs *engine, struct i915_vma *vma)
>  {
> -       const int hws_offset = LRC_PPHWSP_PN * PAGE_SIZE;
> +       const int hws_offset = LRC_HEADER_PAGES * PAGE_SIZE;

This should be PPHWSP_PN since we explicitly want the pointer tot he
pphwsp.

>         void *hws;
>  
>         /* The HWSP is part of the default context object in LRC mode. */
> @@ -2015,8 +2015,11 @@ static int execlists_context_deferred_alloc(struct i915_gem_context *ctx,
>  
>         context_size = round_up(engine->context_size, I915_GTT_PAGE_SIZE);
>  
> -       /* One extra page as the sharing data between driver and GuC */
> -       context_size += PAGE_SIZE * LRC_PPHWSP_PN;
> +       /*
> +        * Before the actual start of the context image, we insert a few pages
> +        * for our own use and for sharing with the GuC.
> +        */
> +       context_size += LRC_HEADER_PAGES * PAGE_SIZE;

Good riddance, that LRC_PPHWSP_PN has left me quite confused for some
time.

With the change to lrc_setup_hws,
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris


More information about the intel-gvt-dev mailing list