[Intel-gfx] [PATCH v2 2/3] drm/i915: Move the scheduler feature bits into the purview of the engines

Mika Kuoppala mika.kuoppala at linux.intel.com
Wed Jan 31 13:58:17 UTC 2018


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

> Rather than having the high level ioctl interface guess the underlying
> implementation details, having the implementation declare what
> capabilities it exports. We define an intel_driver_caps, similar to the
> intel_device_info, which instead of trying to describe the HW gives
> details on what the driver itself supports. This is then populated by
> the engine backend for the new scheduler capability field for use
> elsewhere.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tomasz Lis <tomasz.lis at intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.c          | 8 +-------
>  drivers/gpu/drm/i915/i915_drv.h          | 2 ++
>  drivers/gpu/drm/i915/i915_gem.c          | 3 +++
>  drivers/gpu/drm/i915/i915_gpu_error.c    | 7 +++++--
>  drivers/gpu/drm/i915/intel_device_info.c | 6 ++++++
>  drivers/gpu/drm/i915/intel_device_info.h | 7 +++++++
>  drivers/gpu/drm/i915/intel_lrc.c         | 6 ++++++
>  7 files changed, 30 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 1ec12add34b2..733f71637914 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -372,13 +372,7 @@ static int i915_getparam(struct drm_device *dev, void *data,
>  		value = i915_gem_mmap_gtt_version();
>  		break;
>  	case I915_PARAM_HAS_SCHEDULER:
> -		value = 0;
> -		if (dev_priv->engine[RCS] && dev_priv->engine[RCS]->schedule) {
> -			value |= I915_SCHEDULER_CAP_ENABLED;
> -			value |= I915_SCHEDULER_CAP_PRIORITY;
> -			if (HAS_LOGICAL_RING_PREEMPTION(dev_priv))
> -				value |= I915_SCHEDULER_CAP_PREEMPTION;
> -		}
> +		value = dev_priv->caps.scheduler;

Use the shiny CAP_PRIORITY instead of rcs->schedule on the
I915_CONTEXT_PARAM_PRIORITY validation?

-Mika

>  		break;
>  
>  	case I915_PARAM_MMAP_VERSION:
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 388b72cccde4..ae434c9d2b4f 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -468,6 +468,7 @@ struct i915_gpu_state {
>  	u32 reset_count;
>  	u32 suspend_count;
>  	struct intel_device_info device_info;
> +	struct intel_driver_caps driver_caps;
>  	struct i915_params params;
>  
>  	struct i915_error_uc {
> @@ -1808,6 +1809,7 @@ struct drm_i915_private {
>  	struct kmem_cache *priorities;
>  
>  	const struct intel_device_info info;
> +	struct intel_driver_caps caps;
>  
>  	/**
>  	 * Data Stolen Memory - aka "i915 stolen memory" gives us the start and
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 062b21408698..ad7bd0dc57ee 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -3223,8 +3223,11 @@ void i915_gem_set_wedged(struct drm_i915_private *i915)
>  		 * start to complete all requests.
>  		 */
>  		engine->submit_request = nop_complete_submit_request;
> +		engine->schedule = NULL;
>  	}
>  
> +	i915->caps.scheduler = 0;
> +
>  	/*
>  	 * Make sure no request can slip through without getting completed by
>  	 * either this call here to intel_engine_init_global_seqno, or the one
> diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
> index a81351d9e3a6..a92b0c0377c7 100644
> --- a/drivers/gpu/drm/i915/i915_gpu_error.c
> +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
> @@ -573,11 +573,13 @@ static void print_error_obj(struct drm_i915_error_state_buf *m,
>  }
>  
>  static void err_print_capabilities(struct drm_i915_error_state_buf *m,
> -				   const struct intel_device_info *info)
> +				   const struct intel_device_info *info,
> +				   const struct intel_driver_caps *caps)
>  {
>  	struct drm_printer p = i915_error_printer(m);
>  
>  	intel_device_info_dump_flags(info, &p);
> +	intel_driver_caps_print(caps, &p);
>  }
>  
>  static void err_print_params(struct drm_i915_error_state_buf *m,
> @@ -800,7 +802,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
>  	if (error->display)
>  		intel_display_print_error_state(m, error->display);
>  
> -	err_print_capabilities(m, &error->device_info);
> +	err_print_capabilities(m, &error->device_info, &error->driver_caps);
>  	err_print_params(m, &error->params);
>  	err_print_uc(m, &error->uc);
>  
> @@ -1731,6 +1733,7 @@ static void i915_capture_gen_state(struct drm_i915_private *dev_priv,
>  	memcpy(&error->device_info,
>  	       INTEL_INFO(dev_priv),
>  	       sizeof(error->device_info));
> +	error->driver_caps = dev_priv->caps;
>  }
>  
>  static __always_inline void dup_param(const char *type, void *x)
> diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
> index a2c16140169f..298f8996cc54 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.c
> +++ b/drivers/gpu/drm/i915/intel_device_info.c
> @@ -586,3 +586,9 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
>  	/* Initialize command stream timestamp frequency */
>  	info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv);
>  }
> +
> +void intel_driver_caps_print(const struct intel_driver_caps *caps,
> +			     struct drm_printer *p)
> +{
> +	drm_printf(p, "scheduler: %x\n", caps->scheduler);
> +}
> diff --git a/drivers/gpu/drm/i915/intel_device_info.h b/drivers/gpu/drm/i915/intel_device_info.h
> index 9542018d11d0..71fdfb0451ef 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.h
> +++ b/drivers/gpu/drm/i915/intel_device_info.h
> @@ -167,6 +167,10 @@ struct intel_device_info {
>  	} color;
>  };
>  
> +struct intel_driver_caps {
> +	unsigned int scheduler;
> +};
> +
>  static inline unsigned int sseu_subslice_total(const struct sseu_dev_info *sseu)
>  {
>  	return hweight8(sseu->slice_mask) * hweight8(sseu->subslice_mask);
> @@ -182,4 +186,7 @@ void intel_device_info_dump_flags(const struct intel_device_info *info,
>  void intel_device_info_dump_runtime(const struct intel_device_info *info,
>  				    struct drm_printer *p);
>  
> +void intel_driver_caps_print(const struct intel_driver_caps *caps,
> +			     struct drm_printer *p);
> +
>  #endif
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 2fa328d512fc..5390894001f0 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -1906,6 +1906,12 @@ static void execlists_set_default_submission(struct intel_engine_cs *engine)
>  	engine->unpark = NULL;
>  
>  	engine->flags |= I915_ENGINE_SUPPORTS_STATS;
> +
> +	engine->i915->caps.scheduler =
> +		I915_SCHEDULER_CAP_ENABLED |
> +		I915_SCHEDULER_CAP_PRIORITY;
> +	if (HAS_LOGICAL_RING_PREEMPTION(engine->i915))
> +		engine->i915->caps.scheduler |= I915_SCHEDULER_CAP_PREEMPTION;
>  }
>  
>  static void
> -- 
> 2.15.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list