[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