drm/i915/guc: Wait for ucode DMA transfer completion
authorMichal Wajdeczko <[email protected]>
Fri, 3 Nov 2017 15:18:13 +0000 (15:18 +0000)
committerChris Wilson <[email protected]>
Wed, 8 Nov 2017 21:34:13 +0000 (21:34 +0000)
We silently assumed that DMA transfer will be completed
within assumed timeout and thus we were waiting only at
last step for GuC to become ready. Add intermediate wait
to catch unexpected delays in DMA transfer.

Signed-off-by: Michal Wajdeczko <[email protected]>
Cc: Chris Wilson <[email protected]>
Cc: Joonas Lahtinen <[email protected]>
Cc: Sagar Arun Kamble <[email protected]>
Reviewed-by: Sagar Arun Kamble <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
Signed-off-by: Chris Wilson <[email protected]>
drivers/gpu/drm/i915/intel_guc_fw.c

index c4f4526e3b770355cb4801866072eeb2a29ea8d5..74a61fe9448cc8a68165148b1b27733a447e6883 100644 (file)
@@ -160,6 +160,8 @@ static int guc_xfer_ucode(struct intel_guc *guc, struct i915_vma *vma)
        struct drm_i915_private *dev_priv = guc_to_i915(guc);
        struct intel_uc_fw *guc_fw = &guc->fw;
        unsigned long offset;
+       u32 status;
+       int ret;
 
        /*
         * The header plus uCode will be copied to WOPCM via DMA, excluding any
@@ -182,7 +184,12 @@ static int guc_xfer_ucode(struct intel_guc *guc, struct i915_vma *vma)
        /* Finally start the DMA */
        I915_WRITE(DMA_CTRL, _MASKED_BIT_ENABLE(UOS_MOVE | START_DMA));
 
-       return 0;
+       /* Wait for DMA to finish */
+       ret = __intel_wait_for_register_fw(dev_priv, DMA_CTRL, START_DMA, 0,
+                                          2, 100, &status);
+       DRM_DEBUG_DRIVER("GuC DMA status %#x\n", status);
+
+       return ret;
 }
 
 /*