[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