|
@@ -2139,7 +2139,8 @@ static const struct engine_info {
|
|
|
unsigned guc_id;
|
|
|
u32 mmio_base;
|
|
|
unsigned irq_shift;
|
|
|
- int (*init)(struct intel_engine_cs *engine);
|
|
|
+ int (*init_legacy)(struct intel_engine_cs *engine);
|
|
|
+ int (*init_execlists)(struct intel_engine_cs *engine);
|
|
|
} intel_engines[] = {
|
|
|
[RCS] = {
|
|
|
.name = "render ring",
|
|
@@ -2147,7 +2148,8 @@ static const struct engine_info {
|
|
|
.guc_id = GUC_RENDER_ENGINE,
|
|
|
.mmio_base = RENDER_RING_BASE,
|
|
|
.irq_shift = GEN8_RCS_IRQ_SHIFT,
|
|
|
- .init = logical_render_ring_init,
|
|
|
+ .init_execlists = logical_render_ring_init,
|
|
|
+ .init_legacy = intel_init_render_ring_buffer,
|
|
|
},
|
|
|
[BCS] = {
|
|
|
.name = "blitter ring",
|
|
@@ -2155,7 +2157,8 @@ static const struct engine_info {
|
|
|
.guc_id = GUC_BLITTER_ENGINE,
|
|
|
.mmio_base = BLT_RING_BASE,
|
|
|
.irq_shift = GEN8_BCS_IRQ_SHIFT,
|
|
|
- .init = logical_xcs_ring_init,
|
|
|
+ .init_execlists = logical_xcs_ring_init,
|
|
|
+ .init_legacy = intel_init_blt_ring_buffer,
|
|
|
},
|
|
|
[VCS] = {
|
|
|
.name = "bsd ring",
|
|
@@ -2163,7 +2166,8 @@ static const struct engine_info {
|
|
|
.guc_id = GUC_VIDEO_ENGINE,
|
|
|
.mmio_base = GEN6_BSD_RING_BASE,
|
|
|
.irq_shift = GEN8_VCS1_IRQ_SHIFT,
|
|
|
- .init = logical_xcs_ring_init,
|
|
|
+ .init_execlists = logical_xcs_ring_init,
|
|
|
+ .init_legacy = intel_init_bsd_ring_buffer,
|
|
|
},
|
|
|
[VCS2] = {
|
|
|
.name = "bsd2 ring",
|
|
@@ -2171,7 +2175,8 @@ static const struct engine_info {
|
|
|
.guc_id = GUC_VIDEO_ENGINE2,
|
|
|
.mmio_base = GEN8_BSD2_RING_BASE,
|
|
|
.irq_shift = GEN8_VCS2_IRQ_SHIFT,
|
|
|
- .init = logical_xcs_ring_init,
|
|
|
+ .init_execlists = logical_xcs_ring_init,
|
|
|
+ .init_legacy = intel_init_bsd2_ring_buffer,
|
|
|
},
|
|
|
[VECS] = {
|
|
|
.name = "video enhancement ring",
|
|
@@ -2179,7 +2184,8 @@ static const struct engine_info {
|
|
|
.guc_id = GUC_VIDEOENHANCE_ENGINE,
|
|
|
.mmio_base = VEBOX_RING_BASE,
|
|
|
.irq_shift = GEN8_VECS_IRQ_SHIFT,
|
|
|
- .init = logical_xcs_ring_init,
|
|
|
+ .init_execlists = logical_xcs_ring_init,
|
|
|
+ .init_legacy = intel_init_vebox_ring_buffer,
|
|
|
},
|
|
|
};
|
|
|
|
|
@@ -2202,20 +2208,16 @@ intel_engine_setup(struct drm_i915_private *dev_priv,
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * intel_logical_rings_init() - allocate, populate and init the Engine Command Streamers
|
|
|
+ * intel_engines_init() - allocate, populate and init the Engine Command Streamers
|
|
|
* @dev: DRM device.
|
|
|
*
|
|
|
- * This function inits the engines for an Execlists submission style (the
|
|
|
- * equivalent in the legacy ringbuffer submission world would be
|
|
|
- * i915_gem_init_engines). It does it only for those engines that are present in
|
|
|
- * the hardware.
|
|
|
- *
|
|
|
* Return: non-zero if the initialization failed.
|
|
|
*/
|
|
|
-int intel_logical_rings_init(struct drm_device *dev)
|
|
|
+int intel_engines_init(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = to_i915(dev);
|
|
|
unsigned int mask = 0;
|
|
|
+ int (*init)(struct intel_engine_cs *engine);
|
|
|
unsigned int i;
|
|
|
int ret;
|
|
|
|
|
@@ -2226,10 +2228,15 @@ int intel_logical_rings_init(struct drm_device *dev)
|
|
|
if (!HAS_ENGINE(dev_priv, i))
|
|
|
continue;
|
|
|
|
|
|
- if (!intel_engines[i].init)
|
|
|
+ if (i915.enable_execlists)
|
|
|
+ init = intel_engines[i].init_execlists;
|
|
|
+ else
|
|
|
+ init = intel_engines[i].init_legacy;
|
|
|
+
|
|
|
+ if (!init)
|
|
|
continue;
|
|
|
|
|
|
- ret = intel_engines[i].init(intel_engine_setup(dev_priv, i));
|
|
|
+ ret = init(intel_engine_setup(dev_priv, i));
|
|
|
if (ret)
|
|
|
goto cleanup;
|
|
|
|
|
@@ -2250,8 +2257,12 @@ int intel_logical_rings_init(struct drm_device *dev)
|
|
|
return 0;
|
|
|
|
|
|
cleanup:
|
|
|
- for (i = 0; i < I915_NUM_ENGINES; i++)
|
|
|
- intel_logical_ring_cleanup(&dev_priv->engine[i]);
|
|
|
+ for (i = 0; i < I915_NUM_ENGINES; i++) {
|
|
|
+ if (i915.enable_execlists)
|
|
|
+ intel_logical_ring_cleanup(&dev_priv->engine[i]);
|
|
|
+ else
|
|
|
+ intel_cleanup_engine(&dev_priv->engine[i]);
|
|
|
+ }
|
|
|
|
|
|
return ret;
|
|
|
}
|