drm/i915: Record logical context support in driver caps
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 6 Jul 2018 10:14:41 +0000 (11:14 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 6 Jul 2018 13:05:23 +0000 (14:05 +0100)
Avoid looking at the magical engines[RCS] to decide if the HW and driver
supports logical contexts, and instead record that knowledge during
initialisation.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180706101442.21279-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem_context.c
drivers/gpu/drm/i915/intel_device_info.c
drivers/gpu/drm/i915/intel_device_info.h
drivers/gpu/drm/i915/intel_engine_cs.c

index 8a2196e..c1c637e 100644 (file)
@@ -2306,6 +2306,7 @@ intel_info(const struct drm_i915_private *dev_priv)
 }
 
 #define INTEL_INFO(dev_priv)   intel_info((dev_priv))
+#define DRIVER_CAPS(dev_priv)  (&(dev_priv)->caps)
 
 #define INTEL_GEN(dev_priv)    ((dev_priv)->info.gen)
 #define INTEL_DEVID(dev_priv)  ((dev_priv)->info.device_id)
index 985ef70..b10770c 100644 (file)
@@ -512,8 +512,8 @@ int i915_gem_contexts_init(struct drm_i915_private *dev_priv)
        }
 
        DRM_DEBUG_DRIVER("%s context support initialized\n",
-                        dev_priv->engine[RCS]->context_size ? "logical" :
-                        "fake");
+                        DRIVER_CAPS(dev_priv)->has_logical_contexts ?
+                        "logical" : "fake");
        return 0;
 }
 
@@ -720,7 +720,7 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
        struct i915_gem_context *ctx;
        int ret;
 
-       if (!dev_priv->engine[RCS]->context_size)
+       if (!DRIVER_CAPS(dev_priv)->has_logical_contexts)
                return -ENODEV;
 
        if (args->pad != 0)
index 0fd13df..0ef0c64 100644 (file)
@@ -858,6 +858,8 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
 void intel_driver_caps_print(const struct intel_driver_caps *caps,
                             struct drm_printer *p)
 {
+       drm_printf(p, "Has logical contexts? %s\n",
+                  yesno(caps->has_logical_contexts));
        drm_printf(p, "scheduler: %x\n", caps->scheduler);
 }
 
index 933e316..633f9fb 100644 (file)
@@ -186,6 +186,7 @@ struct intel_device_info {
 
 struct intel_driver_caps {
        unsigned int scheduler;
+       bool has_logical_contexts:1;
 };
 
 static inline unsigned int sseu_subslice_total(const struct sseu_dev_info *sseu)
index 478c928..e2f5628 100644 (file)
@@ -302,6 +302,8 @@ intel_engine_setup(struct drm_i915_private *dev_priv,
                                                           engine->class);
        if (WARN_ON(engine->context_size > BIT(20)))
                engine->context_size = 0;
+       if (engine->context_size)
+               DRIVER_CAPS(dev_priv)->has_logical_contexts = true;
 
        /* Nothing to do here, execute in order of dependencies */
        engine->schedule = NULL;