[PATCH 5/5] DEBUG: Add debugging to both generic & GuC firmware loading code

Dave Gordon david.s.gordon at intel.com
Tue Jul 26 14:47:59 UTC 2016


Specifically to the generic ABORT case & the GuC "not found"

Signed-off-by: Dave Gordon <david.s.gordon at intel.com>
---
 drivers/base/firmware_class.c           | 27 +++++++++++++++++++--------
 drivers/gpu/drm/i915/intel_guc_loader.c | 23 ++++++++++++++++++++++-
 2 files changed, 41 insertions(+), 9 deletions(-)

diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index 773fc30..b55e217 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -330,14 +330,14 @@ static int fw_get_filesystem_firmware(struct device *device,
 						INT_MAX, READING_FIRMWARE);
 		if (rc) {
 			if (rc == -ENOENT)
-				dev_dbg(device, "loading %s failed with error %d\n",
+				dev_warn(device, "loading %s failed with error %d\n",
 					 path, rc);
 			else
 				dev_warn(device, "loading %s failed with error %d\n",
 					 path, rc);
 			continue;
 		}
-		dev_dbg(device, "direct-loading %s\n", buf->fw_id);
+		dev_notice(device, "direct-loading %s\n", path);
 		buf->size = size;
 		fw_finish_direct_load(device, buf);
 		break;
@@ -453,6 +453,9 @@ static struct firmware_priv *to_firmware_priv(struct device *dev)
 
 static void __fw_load_abort(struct firmware_buf *buf)
 {
+	pr_warn("aborting load of %s, status was 0x%lx\n",
+		 buf->fw_id, buf->status);
+
 	/*
 	 * There is a small window in which user can write to 'loading'
 	 * between loading done and disappearance of 'loading'
@@ -462,6 +465,7 @@ static void __fw_load_abort(struct firmware_buf *buf)
 
 	list_del_init(&buf->pending_list);
 	set_bit(FW_STATUS_ABORT, &buf->status);
+
 	complete_all(&buf->completion);
 }
 
@@ -670,6 +674,9 @@ static ssize_t firmware_loading_store(struct device *dev,
 			 */
 			list_del_init(&fw_buf->pending_list);
 			if (rc) {
+				pr_warn("aborting load of %s, status was 0x%lx\n",
+					 fw_buf->fw_id, fw_buf->status);
+
 				set_bit(FW_STATUS_ABORT, &fw_buf->status);
 				written = rc;
 			}
@@ -911,7 +918,7 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
 	if (opt_flags & FW_OPT_UEVENT) {
 		buf->need_uevent = true;
 		dev_set_uevent_suppress(f_dev, false);
-		dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id);
+		dev_notice(f_dev, "firmware: requesting %s\n", buf->fw_id);
 		kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD);
 	} else {
 		timeout = MAX_JIFFY_OFFSET;
@@ -974,7 +981,7 @@ static void kill_requests_without_uevent(void)
 			 struct device *device, unsigned int opt_flags,
 			 long timeout)
 {
-	return -ENOENT;
+	return -ETXTBSY;
 }
 
 /* No abort during direct loading */
@@ -995,7 +1002,9 @@ static int sync_cached_firmware_buf(struct firmware_buf *buf)
 	mutex_lock(&fw_lock);
 	while (!test_bit(FW_STATUS_DONE, &buf->status)) {
 		if (is_fw_load_aborted(buf)) {
-			ret = -ENOENT;
+			pr_warn("load of %s was aborted, status 0x%lx\n",
+				 buf->fw_id, buf->status);
+			ret = -ETXTBSY;
 			break;
 		}
 		mutex_unlock(&fw_lock);
@@ -1026,7 +1035,7 @@ static int sync_cached_firmware_buf(struct firmware_buf *buf)
 	}
 
 	if (fw_get_builtin_firmware(firmware, name)) {
-		dev_dbg(device, "using built-in %s\n", name);
+		dev_notice(device, "using built-in %s\n", name);
 		return 0; /* assigned */
 	}
 
@@ -1058,8 +1067,10 @@ static int assign_firmware_buf(struct firmware *fw, struct device *device,
 
 	mutex_lock(&fw_lock);
 	if (!buf->size || is_fw_load_aborted(buf)) {
+		pr_warn("can't assign fw buf for %s, size %zu, status 0x%lx\n",
+			 buf->fw_id, buf->size, buf->status);
 		mutex_unlock(&fw_lock);
-		return -ENOENT;
+		return -ETXTBSY;
 	}
 
 	/*
@@ -1114,7 +1125,7 @@ static int assign_firmware_buf(struct firmware *fw, struct device *device,
 	if (opt_flags & FW_OPT_NOWAIT) {
 		timeout = usermodehelper_read_lock_wait(timeout);
 		if (!timeout) {
-			dev_dbg(device, "firmware: %s loading timed out\n",
+			dev_warn(device, "firmware: %s loading timed out\n",
 				name);
 			ret = -EBUSY;
 			goto out;
diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c
index 61bbf20..622c863 100644
--- a/drivers/gpu/drm/i915/intel_guc_loader.c
+++ b/drivers/gpu/drm/i915/intel_guc_loader.c
@@ -563,6 +563,27 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
 		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 || err == -ETXTBSY)) {
+		struct drm_i915_private *dev_priv = to_i915(dev);
+
+		DRM_INFO("GuC firmware NOT FOUND at '%s', err %d\n", guc_fw->guc_fw_path, err);
+
+		err = request_firmware(&fw, dev_priv->csr.fw_path, &dev_priv->drm.pdev->dev);
+		if (err)
+			DRM_INFO("CSR firmware also NOT FOUND at '%s'\n", dev_priv->csr.fw_path);
+		else
+			DRM_INFO("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_INFO("GuC firmware still NOT FOUND at '%s'\n", guc_fw->guc_fw_path);
+		else
+			DRM_INFO("GuC firmware FOUND at '%s' after RETRY!\n", guc_fw->guc_fw_path);
+	}
+
 	if (err)
 		goto fail;
 	if (!fw)
@@ -656,7 +677,7 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
 	return;
 
 fail:
-	DRM_WARN("Failed to fetch valid GuC firmware from %s (error %d)\n",
+	DRM_WARN("Failed to fetch valid GuC firmware from '%s' (error %d)\n",
 		 guc_fw->guc_fw_path, err);
 	DRM_DEBUG_DRIVER("GuC fw fetch status FAIL; err %d, fw %p, obj %p\n",
 		err, fw, guc_fw->guc_fw_obj);
-- 
1.9.1



More information about the Intel-gfx-trybot mailing list