Chris Wilson <[email protected]> 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 <[email protected]>
> Cc: Tomasz Lis <[email protected]>
> Cc: Joonas Lahtinen <[email protected]>
> Cc: Tvrtko Ursulin <[email protected]>
> Cc: Michal Wajdeczko <[email protected]>
> ---
>  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
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to