Commit 3fed1808 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Move the scheduler feature bits into the purview of the engines

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tomasz Lis <tomasz.lis@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarTomasz Lis <tomasz.lis@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180207210544.26351-2-chris@chris-wilson.co.ukReviewed-by: default avatarMichel Thierry <michel.thierry@intel.com>
parent e78c9175
...@@ -49,6 +49,7 @@ static int i915_capabilities(struct seq_file *m, void *data) ...@@ -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_flags(info, &p);
intel_device_info_dump_runtime(info, &p); intel_device_info_dump_runtime(info, &p);
intel_driver_caps_print(&dev_priv->caps, &p);
kernel_param_lock(THIS_MODULE); kernel_param_lock(THIS_MODULE);
i915_params_dump(&i915_modparams, &p); i915_params_dump(&i915_modparams, &p);
......
...@@ -381,13 +381,7 @@ static int i915_getparam(struct drm_device *dev, void *data, ...@@ -381,13 +381,7 @@ static int i915_getparam(struct drm_device *dev, void *data,
value = i915_gem_mmap_gtt_version(); value = i915_gem_mmap_gtt_version();
break; break;
case I915_PARAM_HAS_SCHEDULER: case I915_PARAM_HAS_SCHEDULER:
value = 0; value = dev_priv->caps.scheduler;
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;
}
break; break;
case I915_PARAM_MMAP_VERSION: case I915_PARAM_MMAP_VERSION:
......
...@@ -472,6 +472,7 @@ struct i915_gpu_state { ...@@ -472,6 +472,7 @@ struct i915_gpu_state {
u32 reset_count; u32 reset_count;
u32 suspend_count; u32 suspend_count;
struct intel_device_info device_info; struct intel_device_info device_info;
struct intel_driver_caps driver_caps;
struct i915_params params; struct i915_params params;
struct i915_error_uc { struct i915_error_uc {
...@@ -1815,6 +1816,7 @@ struct drm_i915_private { ...@@ -1815,6 +1816,7 @@ struct drm_i915_private {
struct kmem_cache *priorities; struct kmem_cache *priorities;
const struct intel_device_info info; const struct intel_device_info info;
struct intel_driver_caps caps;
/** /**
* Data Stolen Memory - aka "i915 stolen memory" gives us the start and * Data Stolen Memory - aka "i915 stolen memory" gives us the start and
......
...@@ -3229,8 +3229,11 @@ void i915_gem_set_wedged(struct drm_i915_private *i915) ...@@ -3229,8 +3229,11 @@ void i915_gem_set_wedged(struct drm_i915_private *i915)
* start to complete all requests. * start to complete all requests.
*/ */
engine->submit_request = nop_complete_submit_request; 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 * Make sure no request can slip through without getting completed by
* either this call here to intel_engine_init_global_seqno, or the one * either this call here to intel_engine_init_global_seqno, or the one
......
...@@ -807,7 +807,7 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data, ...@@ -807,7 +807,7 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
if (args->size) if (args->size)
ret = -EINVAL; ret = -EINVAL;
else if (!to_i915(dev)->engine[RCS]->schedule) else if (!(to_i915(dev)->caps.scheduler & I915_SCHEDULER_CAP_PRIORITY))
ret = -ENODEV; ret = -ENODEV;
else if (priority > I915_CONTEXT_MAX_USER_PRIORITY || else if (priority > I915_CONTEXT_MAX_USER_PRIORITY ||
priority < I915_CONTEXT_MIN_USER_PRIORITY) priority < I915_CONTEXT_MIN_USER_PRIORITY)
......
...@@ -579,11 +579,13 @@ static void print_error_obj(struct drm_i915_error_state_buf *m, ...@@ -579,11 +579,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, 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); struct drm_printer p = i915_error_printer(m);
intel_device_info_dump_flags(info, &p); 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, static void err_print_params(struct drm_i915_error_state_buf *m,
...@@ -808,7 +810,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m, ...@@ -808,7 +810,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
if (error->display) if (error->display)
intel_display_print_error_state(m, 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_params(m, &error->params);
err_print_uc(m, &error->uc); err_print_uc(m, &error->uc);
...@@ -1740,6 +1742,7 @@ static void i915_capture_gen_state(struct drm_i915_private *dev_priv, ...@@ -1740,6 +1742,7 @@ static void i915_capture_gen_state(struct drm_i915_private *dev_priv,
memcpy(&error->device_info, memcpy(&error->device_info,
INTEL_INFO(dev_priv), INTEL_INFO(dev_priv),
sizeof(error->device_info)); sizeof(error->device_info));
error->driver_caps = dev_priv->caps;
} }
static __always_inline void dup_param(const char *type, void *x) static __always_inline void dup_param(const char *type, void *x)
......
...@@ -586,3 +586,9 @@ void intel_device_info_runtime_init(struct intel_device_info *info) ...@@ -586,3 +586,9 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
/* Initialize command stream timestamp frequency */ /* Initialize command stream timestamp frequency */
info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv); 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);
}
...@@ -167,6 +167,10 @@ struct intel_device_info { ...@@ -167,6 +167,10 @@ struct intel_device_info {
} color; } color;
}; };
struct intel_driver_caps {
unsigned int scheduler;
};
static inline unsigned int sseu_subslice_total(const struct sseu_dev_info *sseu) static inline unsigned int sseu_subslice_total(const struct sseu_dev_info *sseu)
{ {
return hweight8(sseu->slice_mask) * hweight8(sseu->subslice_mask); 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, ...@@ -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, void intel_device_info_dump_runtime(const struct intel_device_info *info,
struct drm_printer *p); struct drm_printer *p);
void intel_driver_caps_print(const struct intel_driver_caps *caps,
struct drm_printer *p);
#endif #endif
...@@ -1963,6 +1963,12 @@ static void execlists_set_default_submission(struct intel_engine_cs *engine) ...@@ -1963,6 +1963,12 @@ static void execlists_set_default_submission(struct intel_engine_cs *engine)
engine->unpark = NULL; engine->unpark = NULL;
engine->flags |= I915_ENGINE_SUPPORTS_STATS; 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 static void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment