This function was restructured by two recent patches:
    drm/i915: Add explicit request management to i915_gem_init_hw()
    drm/i915: Moved the for_each_ring loop outside of i915_gem_context_enable()

Now we need to move the entire loop into a separate function
i915_gem_init_hw_late(), replacing the inline loop with a call.
This will allow a future patch to add a call from another
locations (for now, there are no other calls).

Signed-off-by: Dave Gordon <david.s.gor...@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h |    1 +
 drivers/gpu/drm/i915/i915_gem.c |   85 ++++++++++++++++++++++-----------------
 2 files changed, 50 insertions(+), 36 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index a3d2fd9..d0ea74e 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2897,6 +2897,7 @@ bool i915_gem_clflush_object(struct drm_i915_gem_object 
*obj, bool force);
 int __must_check i915_gem_init(struct drm_device *dev);
 int i915_gem_init_rings(struct drm_device *dev);
 int __must_check i915_gem_init_hw(struct drm_device *dev);
+int __must_check i915_gem_init_hw_late(struct drm_device *dev);
 int i915_gem_l3_remap(struct drm_i915_gem_request *req, int slice);
 void i915_gem_init_swizzling(struct drm_device *dev);
 void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 302d1bc..b7b22e3 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -5017,11 +5017,58 @@ cleanup_render_ring:
 }
 
 int
+i915_gem_init_hw_late(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_engine_cs *ring;
+       int i, j, ret = 0;
+
+       /* Now it is safe to go back round and do everything else: */
+       for_each_ring(ring, dev_priv, i) {
+               struct drm_i915_gem_request *req;
+
+               WARN_ON(!ring->default_context);
+
+               ret = i915_gem_request_alloc(ring, ring->default_context, &req);
+               if (ret) {
+                       i915_gem_cleanup_ringbuffer(dev);
+                       goto out;
+               }
+
+               if (ring->id == RCS) {
+                       for (j = 0; j < NUM_L3_SLICES(dev); j++)
+                               i915_gem_l3_remap(req, j);
+               }
+
+               ret = i915_ppgtt_init_ring(req);
+               if (ret && ret != -EIO) {
+                       DRM_ERROR("PPGTT enable ring #%d failed %d\n", i, ret);
+                       i915_gem_request_cancel(req);
+                       i915_gem_cleanup_ringbuffer(dev);
+                       goto out;
+               }
+
+               ret = i915_gem_context_enable(req);
+               if (ret && ret != -EIO) {
+                       DRM_ERROR("Context enable ring #%d failed %d\n", i, 
ret);
+                       i915_gem_request_cancel(req);
+                       i915_gem_cleanup_ringbuffer(dev);
+                       goto out;
+               }
+
+               i915_add_request_no_flush(req);
+       }
+
+out:
+       return ret;
+}
+
+int
 i915_gem_init_hw(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_engine_cs *ring;
-       int ret, i, j;
+       int i, ret;
 
        if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt())
                return -EIO;
@@ -5076,41 +5123,7 @@ i915_gem_init_hw(struct drm_device *dev)
        /* We can't enable contexts until all firmware is loaded */
        ret = intel_guc_ucode_load(dev, true);
 
-       /* Now it is safe to go back round and do everything else: */
-       for_each_ring(ring, dev_priv, i) {
-               struct drm_i915_gem_request *req;
-
-               WARN_ON(!ring->default_context);
-
-               ret = i915_gem_request_alloc(ring, ring->default_context, &req);
-               if (ret) {
-                       i915_gem_cleanup_ringbuffer(dev);
-                       goto out;
-               }
-
-               if (ring->id == RCS) {
-                       for (j = 0; j < NUM_L3_SLICES(dev); j++)
-                               i915_gem_l3_remap(req, j);
-               }
-
-               ret = i915_ppgtt_init_ring(req);
-               if (ret && ret != -EIO) {
-                       DRM_ERROR("PPGTT enable ring #%d failed %d\n", i, ret);
-                       i915_gem_request_cancel(req);
-                       i915_gem_cleanup_ringbuffer(dev);
-                       goto out;
-               }
-
-               ret = i915_gem_context_enable(req);
-               if (ret && ret != -EIO) {
-                       DRM_ERROR("Context enable ring #%d failed %d\n", i, 
ret);
-                       i915_gem_request_cancel(req);
-                       i915_gem_cleanup_ringbuffer(dev);
-                       goto out;
-               }
-
-               i915_add_request_no_flush(req);
-       }
+       ret = i915_gem_init_hw_late(dev);
 
 out:
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
-- 
1.7.9.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to