Re: [PATCH v2] drm/i915: Move the scheduler feature bits into the purview of the engines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> 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.
>
> v2: Use caps.scheduler for validating CONTEXT_PARAM_SET_PRIORITY (Mika)
>     One less assumption of engine[RCS] \o/
>
> Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
> Cc: Tomasz Lis <tomasz.lis@xxxxxxxxx>
> Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>
> Cc: Michal Wajdeczko <michal.wajdeczko@xxxxxxxxx>
> Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx>

Reviewed-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx>

> ---
>  drivers/gpu/drm/i915/i915_debugfs.c      | 1 +
>  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_gem_context.c  | 2 +-
>  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 ++++++
>  9 files changed, 32 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 9e44adef30f0..2bdce9fea671 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -49,6 +49,7 @@ static int i915_capabilities(struct seq_file *m, void *data)
>  
>  	intel_device_info_dump_flags(info, &p);
>  	intel_device_info_dump_runtime(info, &p);
> +	intel_driver_caps_print(&dev_priv->caps, &p);
>  
>  	kernel_param_lock(THIS_MODULE);
>  	i915_params_dump(&i915_modparams, &p);
> 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;
>  		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 c676269ed843..24333042e1e9 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 {
> @@ -1809,6 +1810,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 c049496e8757..8d732f97e23e 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -3222,8 +3222,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_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index 648e7536ff51..8337d15bb0e5 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -807,7 +807,7 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
>  
>  			if (args->size)
>  				ret = -EINVAL;
> -			else if (!to_i915(dev)->engine[RCS]->schedule)
> +			else if (!(to_i915(dev)->caps.scheduler & I915_SCHEDULER_CAP_PRIORITY))
>  				ret = -ENODEV;
>  			else if (priority > I915_CONTEXT_MAX_USER_PRIORITY ||
>  				 priority < I915_CONTEXT_MIN_USER_PRIORITY)
> 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 41419f249fc2..a52bd2525398 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -1922,6 +1922,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@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux