[NOMERGE v3] Add debugging for failed GuC firmware load

Dave Gordon david.s.gordon at intel.com
Fri Jul 22 16:47:54 UTC 2016


Signed-off-by: Dave Gordon <david.s.gordon at intel.com>
---
 drivers/gpu/drm/i915/intel_guc_loader.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c
index b9c9f15..9b72aaa 100644
--- a/drivers/gpu/drm/i915/intel_guc_loader.c
+++ b/drivers/gpu/drm/i915/intel_guc_loader.c
@@ -559,10 +559,34 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
 	size_t size;
 	int err;
 
+	unsigned int save_debug = drm_debug;
+	drm_debug |= DRM_UT_DRIVER;
+
 	DRM_DEBUG_DRIVER("before requesting firmware: GuC fw fetch status %s\n",
 		intel_guc_fw_status_repr(guc_fw->guc_fw_fetch_status));
 
 	err = request_firmware(&fw, guc_fw->guc_fw_path, &dev->pdev->dev);
+
+	if (WARN_ON(err == -ENOENT)) {
+		struct drm_i915_private *dev_priv = to_i915(dev);
+
+		DRM_DEBUG_DRIVER("GuC firmware NOT FOUND at '%s'\n", guc_fw->guc_fw_path);
+
+		err = request_firmware(&fw, dev_priv->csr.fw_path, &dev_priv->drm.pdev->dev);
+		if (err)
+			DRM_DEBUG_DRIVER("CSR firmware NOT FOUND at '%s'\n", dev_priv->csr.fw_path);
+		else
+			DRM_DEBUG_DRIVER("CSR firmware found at '%s'\n", dev_priv->csr.fw_path);
+		release_firmware(fw);
+
+		msleep(3000);
+		err = request_firmware(&fw, guc_fw->guc_fw_path, &dev_priv->drm.pdev->dev);
+		if (err)
+			DRM_DEBUG_DRIVER("GuC firmware still NOT FOUND at '%s'\n", guc_fw->guc_fw_path);
+		else
+			DRM_DEBUG_DRIVER("GuC firmware FOUND at '%s' after retry!\n", guc_fw->guc_fw_path);
+	}
+
 	if (err)
 		goto fail;
 	if (!fw)
@@ -653,12 +677,13 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
 
 	release_firmware(fw);
 	guc_fw->guc_fw_fetch_status = GUC_FIRMWARE_SUCCESS;
+	drm_debug = save_debug;
 	return;
 
 fail:
 	DRM_DEBUG_DRIVER("GuC fw fetch status FAIL; err %d, fw %p, obj %p\n",
 		err, fw, guc_fw->guc_fw_obj);
-	DRM_ERROR("Failed to fetch GuC firmware from %s (error %d)\n",
+	DRM_ERROR("Failed to fetch GuC firmware from '%s' (error %d)\n",
 		  guc_fw->guc_fw_path, err);
 
 	mutex_lock(&dev->struct_mutex);
@@ -670,6 +695,7 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
 
 	release_firmware(fw);		/* OK even if fw is NULL */
 	guc_fw->guc_fw_fetch_status = GUC_FIRMWARE_FAIL;
+	drm_debug = save_debug;
 }
 
 /**
-- 
1.9.1



More information about the Intel-gfx-trybot mailing list