[Intel-gfx] [PATCH] drm/i915: Use the size/type of address space to make decisions

Mika Kuoppala mika.kuoppala at linux.intel.com
Thu Feb 9 16:02:21 UTC 2017


Chris Wilson <chris at chris-wilson.co.uk> writes:

> Once the address space has been created (using 3 or 4 levels of page
> tables), we should use that to program the appropriate type into the
> contexts. This gives us the flexibility to handle different types of
> address spaces at runtime.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at intel.com>
> Cc: Matthew Auld <matthew.auld at intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
>  drivers/gpu/drm/i915/i915_gem_context.c | 19 ++++++++++++-------
>  drivers/gpu/drm/i915/i915_gem_gtt.h     |  6 ++++++
>  drivers/gpu/drm/i915/i915_reg.h         |  3 ---
>  drivers/gpu/drm/i915/intel_lrc.c        |  6 +++---
>  4 files changed, 21 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index 0c9acd29c4d1..b72301488a0b 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -236,16 +236,20 @@ static int assign_hw_id(struct drm_i915_private *dev_priv, unsigned *out)
>  	return 0;
>  }
>  
> -static u32 default_desc_template(const struct drm_i915_private *dev_priv)
> +static u32 default_desc_template(const struct drm_i915_private *i915,
> +				 const struct i915_hw_ppgtt *ppgtt)
>  {
> +	u32 address_mode;
>  	u32 desc;
>  
> -	desc = GEN8_CTX_VALID |
> -		GEN8_CTX_PRIVILEGE |
> -		GEN8_CTX_ADDRESSING_MODE(dev_priv) <<
> -		GEN8_CTX_ADDRESSING_MODE_SHIFT;
> +	desc = GEN8_CTX_VALID | GEN8_CTX_PRIVILEGE;
>  
> -	if (IS_GEN8(dev_priv))
> +	address_mode = INTEL_LEGACY_32B_CONTEXT;
> +	if (ppgtt && i915_vm_is_48bit(&ppgtt->base))
> +		address_mode = INTEL_LEGACY_64B_CONTEXT;
> +	desc |= address_mode << GEN8_CTX_ADDRESSING_MODE_SHIFT;
> +
> +	if (IS_GEN8(i915))
>  		desc |= GEN8_CTX_L3LLC_COHERENT;
>  
>  	/* TODO: WaDisableLiteRestore when we start using semaphore
> @@ -329,7 +333,7 @@ __create_hw_context(struct drm_i915_private *dev_priv,
>  
>  	i915_gem_context_set_bannable(ctx);
>  	ctx->ring_size = 4 * PAGE_SIZE;
> -	ctx->desc_template = default_desc_template(dev_priv);
> +	ctx->desc_template = default_desc_template(dev_priv, NULL);
>  	ATOMIC_INIT_NOTIFIER_HEAD(&ctx->status_notifier);
>  
>  	/* GuC requires the ring to be placed above GUC_WOPCM_TOP. If GuC is not
> @@ -387,6 +391,7 @@ i915_gem_create_context(struct drm_i915_private *dev_priv,
>  		}
>  
>  		ctx->ppgtt = ppgtt;
> +		ctx->desc_template = default_desc_template(dev_priv, ppgtt);
>  	}
>  
>  	trace_i915_context_create(ctx);
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index 3c5ef5358cef..7e678ce5a9c7 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -525,6 +525,12 @@ i915_vm_to_ggtt(struct i915_address_space *vm)
>  	return container_of(vm, struct i915_ggtt, base);
>  }
>  
> +static inline bool
> +i915_vm_is_48bit(const struct i915_address_space *vm)
> +{
> +	return (vm->total - 1) >> 32;

Works but I guess you had your reasons to avoid direct
comparison for size?

Reviewed-by: Mika Kuoppala <mika.kuoppala at intel.com>

> +}
> +
>  int i915_ggtt_probe_hw(struct drm_i915_private *dev_priv);
>  int i915_ggtt_init_hw(struct drm_i915_private *dev_priv);
>  int i915_ggtt_enable_hw(struct drm_i915_private *dev_priv);
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 07b1a2d67653..141a5c1e3895 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -3389,9 +3389,6 @@ enum {
>  #define GEN8_CTX_L3LLC_COHERENT (1<<5)
>  #define GEN8_CTX_PRIVILEGE (1<<8)
>  #define GEN8_CTX_ADDRESSING_MODE_SHIFT 3
> -#define GEN8_CTX_ADDRESSING_MODE(dev_priv) (USES_FULL_48BIT_PPGTT(dev_priv) ?\
> -				INTEL_LEGACY_64B_CONTEXT : \
> -				INTEL_LEGACY_32B_CONTEXT)
>  
>  #define GEN8_CTX_ID_SHIFT 32
>  #define GEN8_CTX_ID_WIDTH 21
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index e42990b56fa8..b21dbd44045e 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -332,7 +332,7 @@ static u64 execlists_update_context(struct drm_i915_gem_request *rq)
>  	 * PML4 is allocated during ppgtt init, so this is not needed
>  	 * in 48-bit mode.
>  	 */
> -	if (ppgtt && !USES_FULL_48BIT_PPGTT(ppgtt->base.dev))
> +	if (ppgtt && !i915_vm_is_48bit(&ppgtt->base))
>  		execlists_update_context_pdps(ppgtt, reg_state);
>  
>  	return ce->lrc_desc;
> @@ -1447,7 +1447,7 @@ static int gen8_emit_bb_start(struct drm_i915_gem_request *req,
>  	 * not needed in 48-bit.*/
>  	if (req->ctx->ppgtt &&
>  	    (intel_engine_flag(req->engine) & req->ctx->ppgtt->pd_dirty_rings)) {
> -		if (!USES_FULL_48BIT_PPGTT(req->i915) &&
> +		if (!i915_vm_is_48bit(&req->ctx->ppgtt->base) &&
>  		    !intel_vgpu_active(req->i915)) {
>  			ret = intel_logical_ring_emit_pdps(req);
>  			if (ret)
> @@ -2045,7 +2045,7 @@ static void execlists_init_reg_state(u32 *reg_state,
>  	ASSIGN_CTX_REG(reg_state, CTX_PDP0_LDW, GEN8_RING_PDP_LDW(engine, 0),
>  		       0);
>  
> -	if (ppgtt && USES_FULL_48BIT_PPGTT(ppgtt->base.dev)) {
> +	if (ppgtt && i915_vm_is_48bit(&ppgtt->base)) {
>  		/* 64b PPGTT (48bit canonical)
>  		 * PDP0_DESCRIPTOR contains the base address to PML4 and
>  		 * other PDP Descriptors are ignored.
> -- 
> 2.11.0


More information about the Intel-gfx mailing list