linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/8] Loading optional firmware v2
@ 2018-04-16 22:24 Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 1/8] firmware: some documentation fixes Andres Rodriguez
                   ` (7 more replies)
  0 siblings, 8 replies; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-16 22:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken,
	kvalo, arend.vanspriel

Hey Everyone,

Thanks everyone for the feedback on the RFC:
https://lkml.org/lkml/2018/3/9/903

Seems like there is a general interest in this feature, so here
is a V2 of the proposal with the comments I received.

Please provide comments on the _nowait2() API. It is not my favorite,
but it seems like the ship on exposing fw_opts directly to the caller
has sailed. If anyone has a better suggestion let me know.

Also, if anyone has better suggestions for the fw_opt enum documentation
please let me know. I may have botched some of the details since I'm not
super familiar with them.

I've also included patches for the following consumer drivers:
   - amdgpu
   - ath10k
   - brcmfmac

Thanks again for your feedback.

Regards,
Andres


Andres Rodriguez (8):
  firmware: some documentation fixes
  firmware: wrap FW_OPT_* into an enum
  firmware: add kernel-doc for enum fw_opt
  firmware: add functions to load firmware without warnings v3
  firmware: print firmware name on fallback path
  drm/amdgpu: use firmware_request_nowarn to load firmware
  ath10k: use request_firmware_nowarn to load firmware
  brcmfmac: use request_firmware_nowait2 to load firmware without
    warnings

 .../driver-api/firmware/request_firmware.rst       | 29 ++++++-----
 drivers/base/firmware_loader/fallback.c            | 18 +++----
 drivers/base/firmware_loader/fallback.h            |  8 +--
 drivers/base/firmware_loader/firmware.h            | 28 ++++++++---
 drivers/base/firmware_loader/main.c                | 58 +++++++++++++++++++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c            |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c         |  4 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h          |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c            |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c            |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c            |  2 +-
 drivers/gpu/drm/amd/amdgpu/ci_dpm.c                |  2 +-
 drivers/gpu/drm/amd/amdgpu/cik_sdma.c              |  2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c              |  8 +--
 drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c              | 12 ++---
 drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c              | 32 ++++++------
 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c              | 12 ++---
 drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c              |  2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c              |  2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c              |  2 +-
 drivers/gpu/drm/amd/amdgpu/psp_v10_0.c             |  2 +-
 drivers/gpu/drm/amd/amdgpu/psp_v3_1.c              |  4 +-
 drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c             |  2 +-
 drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c             |  2 +-
 drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c             |  2 +-
 drivers/gpu/drm/amd/amdgpu/si_dpm.c                |  2 +-
 drivers/net/wireless/ath/ath10k/core.c             |  2 +-
 .../broadcom/brcm80211/brcmfmac/firmware.c         |  7 +--
 include/linux/firmware.h                           |  6 +++
 29 files changed, 164 insertions(+), 94 deletions(-)

-- 
2.14.1

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/8] firmware: some documentation fixes
  2018-04-16 22:24 [PATCH 0/8] Loading optional firmware v2 Andres Rodriguez
@ 2018-04-16 22:24 ` Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 2/8] firmware: wrap FW_OPT_* into an enum Andres Rodriguez
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-16 22:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken,
	kvalo, arend.vanspriel

Including:
 - Fixup outdated kernel-doc paths
 - Slightly too short title underline
 - Some typos

Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
---
 Documentation/driver-api/firmware/request_firmware.rst | 16 ++++++++--------
 drivers/base/firmware_loader/fallback.c                |  4 ++--
 drivers/base/firmware_loader/fallback.h                |  2 +-
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/Documentation/driver-api/firmware/request_firmware.rst b/Documentation/driver-api/firmware/request_firmware.rst
index 9305bf4db38e..7632f8807472 100644
--- a/Documentation/driver-api/firmware/request_firmware.rst
+++ b/Documentation/driver-api/firmware/request_firmware.rst
@@ -17,17 +17,17 @@ an error is returned.
 
 firmware_request
 ----------------
-.. kernel-doc:: drivers/base/firmware_class.c
+.. kernel-doc:: drivers/base/firmware_loader/main.c
    :functions: firmware_request
 
 firmware_request_direct
 -----------------------
-.. kernel-doc:: drivers/base/firmware_class.c
+.. kernel-doc:: drivers/base/firmware_loader/main.c
    :functions: firmware_request_direct
 
 firmware_request_into_buf
 -------------------------
-.. kernel-doc:: drivers/base/firmware_class.c
+.. kernel-doc:: drivers/base/firmware_loader/main.c
    :functions: firmware_request_into_buf
 
 Asynchronous firmware requests
@@ -41,7 +41,7 @@ in atomic contexts.
 
 firmware_request_nowait
 -----------------------
-.. kernel-doc:: drivers/base/firmware_class.c
+.. kernel-doc:: drivers/base/firmware_loader/main.c
    :functions: firmware_request_nowait
 
 Special optimizations on reboot
@@ -50,12 +50,12 @@ Special optimizations on reboot
 Some devices have an optimization in place to enable the firmware to be
 retained during system reboot. When such optimizations are used the driver
 author must ensure the firmware is still available on resume from suspend,
-this can be done with firmware_request_cache() insted of requesting for the
-firmare to be loaded.
+this can be done with firmware_request_cache() instead of requesting for the
+firmware to be loaded.
 
 firmware_request_cache()
------------------------
-.. kernel-doc:: drivers/base/firmware_class.c
+------------------------
+.. kernel-doc:: drivers/base/firmware_loader/main.c
    :functions: firmware_request_cache
 
 request firmware API expected driver use
diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c
index 71f529de5243..da97fc26119c 100644
--- a/drivers/base/firmware_loader/fallback.c
+++ b/drivers/base/firmware_loader/fallback.c
@@ -536,8 +536,8 @@ fw_create_instance(struct firmware *firmware, const char *fw_name,
 }
 
 /**
- * fw_load_sysfs_fallback - load a firmware via the syfs fallback mechanism
- * @fw_sysfs: firmware syfs information for the firmware to load
+ * fw_load_sysfs_fallback - load a firmware via the sysfs fallback mechanism
+ * @fw_sysfs: firmware sysfs information for the firmware to load
  * @opt_flags: flags of options, FW_OPT_*
  * @timeout: timeout to wait for the load
  *
diff --git a/drivers/base/firmware_loader/fallback.h b/drivers/base/firmware_loader/fallback.h
index dfebc644ed35..f8255670a663 100644
--- a/drivers/base/firmware_loader/fallback.h
+++ b/drivers/base/firmware_loader/fallback.h
@@ -6,7 +6,7 @@
 #include <linux/device.h>
 
 /**
- * struct firmware_fallback_config - firmware fallback configuratioon settings
+ * struct firmware_fallback_config - firmware fallback configuration settings
  *
  * Helps describe and fine tune the fallback mechanism.
  *
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 2/8] firmware: wrap FW_OPT_* into an enum
  2018-04-16 22:24 [PATCH 0/8] Loading optional firmware v2 Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 1/8] firmware: some documentation fixes Andres Rodriguez
@ 2018-04-16 22:24 ` Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 3/8] firmware: add kernel-doc for enum fw_opt Andres Rodriguez
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-16 22:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken,
	kvalo, arend.vanspriel

This should let us associate enum kdoc to these values.

Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
---
 drivers/base/firmware_loader/fallback.c | 12 ++++++------
 drivers/base/firmware_loader/fallback.h |  6 ++++--
 drivers/base/firmware_loader/firmware.h | 17 +++++++++--------
 drivers/base/firmware_loader/main.c     |  6 +++---
 4 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c
index da97fc26119c..ecc49a619298 100644
--- a/drivers/base/firmware_loader/fallback.c
+++ b/drivers/base/firmware_loader/fallback.c
@@ -511,7 +511,7 @@ static const struct attribute_group *fw_dev_attr_groups[] = {
 
 static struct fw_sysfs *
 fw_create_instance(struct firmware *firmware, const char *fw_name,
-		   struct device *device, unsigned int opt_flags)
+		   struct device *device, enum fw_opt opt_flags)
 {
 	struct fw_sysfs *fw_sysfs;
 	struct device *f_dev;
@@ -544,7 +544,7 @@ fw_create_instance(struct firmware *firmware, const char *fw_name,
  * In charge of constructing a sysfs fallback interface for firmware loading.
  **/
 static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs,
-				  unsigned int opt_flags, long timeout)
+				  enum fw_opt opt_flags, long timeout)
 {
 	int retval = 0;
 	struct device *f_dev = &fw_sysfs->dev;
@@ -598,7 +598,7 @@ static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs,
 
 static int fw_load_from_user_helper(struct firmware *firmware,
 				    const char *name, struct device *device,
-				    unsigned int opt_flags)
+				    enum fw_opt opt_flags)
 {
 	struct fw_sysfs *fw_sysfs;
 	long timeout;
@@ -639,7 +639,7 @@ static int fw_load_from_user_helper(struct firmware *firmware,
 	return ret;
 }
 
-static bool fw_force_sysfs_fallback(unsigned int opt_flags)
+static bool fw_force_sysfs_fallback(enum fw_opt opt_flags)
 {
 	if (fw_fallback_config.force_sysfs_fallback)
 		return true;
@@ -648,7 +648,7 @@ static bool fw_force_sysfs_fallback(unsigned int opt_flags)
 	return true;
 }
 
-static bool fw_run_sysfs_fallback(unsigned int opt_flags)
+static bool fw_run_sysfs_fallback(enum fw_opt opt_flags)
 {
 	if (fw_fallback_config.ignore_sysfs_fallback) {
 		pr_info_once("Ignoring firmware sysfs fallback due to sysctl knob\n");
@@ -663,7 +663,7 @@ static bool fw_run_sysfs_fallback(unsigned int opt_flags)
 
 int fw_sysfs_fallback(struct firmware *fw, const char *name,
 		      struct device *device,
-		      unsigned int opt_flags,
+		      enum fw_opt opt_flags,
 		      int ret)
 {
 	if (!fw_run_sysfs_fallback(opt_flags))
diff --git a/drivers/base/firmware_loader/fallback.h b/drivers/base/firmware_loader/fallback.h
index f8255670a663..a3b73a09db6c 100644
--- a/drivers/base/firmware_loader/fallback.h
+++ b/drivers/base/firmware_loader/fallback.h
@@ -5,6 +5,8 @@
 #include <linux/firmware.h>
 #include <linux/device.h>
 
+#include "firmware.h"
+
 /**
  * struct firmware_fallback_config - firmware fallback configuration settings
  *
@@ -31,7 +33,7 @@ struct firmware_fallback_config {
 #ifdef CONFIG_FW_LOADER_USER_HELPER
 int fw_sysfs_fallback(struct firmware *fw, const char *name,
 		      struct device *device,
-		      unsigned int opt_flags,
+		      enum fw_opt opt_flags,
 		      int ret);
 void kill_pending_fw_fallback_reqs(bool only_kill_custom);
 
@@ -43,7 +45,7 @@ void unregister_sysfs_loader(void);
 #else /* CONFIG_FW_LOADER_USER_HELPER */
 static inline int fw_sysfs_fallback(struct firmware *fw, const char *name,
 				    struct device *device,
-				    unsigned int opt_flags,
+				    enum fw_opt opt_flags,
 				    int ret)
 {
 	/* Keep carrying over the same error */
diff --git a/drivers/base/firmware_loader/firmware.h b/drivers/base/firmware_loader/firmware.h
index d11d37db370b..957396293b92 100644
--- a/drivers/base/firmware_loader/firmware.h
+++ b/drivers/base/firmware_loader/firmware.h
@@ -10,13 +10,14 @@
 
 #include <generated/utsrelease.h>
 
-/* firmware behavior options */
-#define FW_OPT_UEVENT			(1U << 0)
-#define FW_OPT_NOWAIT			(1U << 1)
-#define FW_OPT_USERHELPER		(1U << 2)
-#define FW_OPT_NO_WARN			(1U << 3)
-#define FW_OPT_NOCACHE			(1U << 4)
-#define FW_OPT_NOFALLBACK		(1U << 5)
+enum fw_opt {
+	FW_OPT_UEVENT =         (1U << 0),
+	FW_OPT_NOWAIT =         (1U << 1),
+	FW_OPT_USERHELPER =     (1U << 2),
+	FW_OPT_NO_WARN =        (1U << 3),
+	FW_OPT_NOCACHE =        (1U << 4),
+	FW_OPT_NOFALLBACK =     (1U << 5),
+};
 
 enum fw_status {
 	FW_STATUS_UNKNOWN,
@@ -110,6 +111,6 @@ static inline void fw_state_done(struct fw_priv *fw_priv)
 }
 
 int assign_fw(struct firmware *fw, struct device *device,
-	      unsigned int opt_flags);
+	      enum fw_opt opt_flags);
 
 #endif /* __FIRMWARE_LOADER_H */
diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
index 5812148694b6..5baadad3012d 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -443,7 +443,7 @@ static int fw_add_devm_name(struct device *dev, const char *name)
 #endif
 
 int assign_fw(struct firmware *fw, struct device *device,
-	      unsigned int opt_flags)
+	      enum fw_opt opt_flags)
 {
 	struct fw_priv *fw_priv = fw->priv;
 	int ret;
@@ -558,7 +558,7 @@ static void fw_abort_batch_reqs(struct firmware *fw)
 static int
 _firmware_request(const struct firmware **firmware_p, const char *name,
 		  struct device *device, void *buf, size_t size,
-		  unsigned int opt_flags)
+		  enum fw_opt opt_flags)
 {
 	struct firmware *fw = NULL;
 	int ret;
@@ -734,7 +734,7 @@ struct firmware_work {
 	struct device *device;
 	void *context;
 	void (*cont)(const struct firmware *fw, void *context);
-	unsigned int opt_flags;
+	enum fw_opt opt_flags;
 };
 
 static void firmware_request_work_func(struct work_struct *work)
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 3/8] firmware: add kernel-doc for enum fw_opt
  2018-04-16 22:24 [PATCH 0/8] Loading optional firmware v2 Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 1/8] firmware: some documentation fixes Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 2/8] firmware: wrap FW_OPT_* into an enum Andres Rodriguez
@ 2018-04-16 22:24 ` Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 4/8] firmware: add functions to load firmware without warnings v3 Andres Rodriguez
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-16 22:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken,
	kvalo, arend.vanspriel

Some basic definitions for the FW_OPT_* values

Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
---
 drivers/base/firmware_loader/firmware.h | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/base/firmware_loader/firmware.h b/drivers/base/firmware_loader/firmware.h
index 957396293b92..8ef23c334135 100644
--- a/drivers/base/firmware_loader/firmware.h
+++ b/drivers/base/firmware_loader/firmware.h
@@ -10,6 +10,17 @@
 
 #include <generated/utsrelease.h>
 
+/**
+ * enum fw_opt - options to control firmware loading behaviour
+ *
+ * @FW_OPT_UEVENT: Enable the uevent fallback path.
+ * @FW_OPT_NOWAIT: Executing inside an asynchronous firmware request.
+ * @FW_OPT_USERHELPER: Enable the usermode fallback path.
+ * @FW_OPT_NO_WARN: Quiet, avoid printing warning messages.
+ * @FW_OPT_NOCACHE: Firmware caching will be disabled for this request.
+ * @FW_OPT_NOFALLBACK: Disable the fallback path. Takes precedence over
+ *                     &FW_OPT_UEVENT and &FW_OPT_USERHELPER.
+ */
 enum fw_opt {
 	FW_OPT_UEVENT =         (1U << 0),
 	FW_OPT_NOWAIT =         (1U << 1),
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 4/8] firmware: add functions to load firmware without warnings v3
  2018-04-16 22:24 [PATCH 0/8] Loading optional firmware v2 Andres Rodriguez
                   ` (2 preceding siblings ...)
  2018-04-16 22:24 ` [PATCH 3/8] firmware: add kernel-doc for enum fw_opt Andres Rodriguez
@ 2018-04-16 22:24 ` Andres Rodriguez
  2018-04-16 22:52   ` Randy Dunlap
  2018-04-16 22:24 ` [PATCH 5/8] firmware: print firmware name on fallback path Andres Rodriguez
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-16 22:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken,
	kvalo, arend.vanspriel

Currently the firmware loader only exposes one silent path for querying
optional firmware, and that is firmware_request_direct(). This function
also disables the fallback path, which might not always be the
desired behaviour. [0]

This patch introduces variations of firmware_request() and
firmware_request_nowait() that enable the caller to disable the
undesired warning messages. This is equivalent to adding FW_OPT_NO_WARN,
to the old behaviour.

v2: add header prototype, use updated opt_flags
v3: split debug message to separate patch
    added _nowait variant
    added documentation

[0]: https://git.kernel.org/linus/c0cc00f250e1

Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
---
 .../driver-api/firmware/request_firmware.rst       | 13 ++++--
 drivers/base/firmware_loader/main.c                | 52 ++++++++++++++++++++--
 include/linux/firmware.h                           |  6 +++
 3 files changed, 63 insertions(+), 8 deletions(-)

diff --git a/Documentation/driver-api/firmware/request_firmware.rst b/Documentation/driver-api/firmware/request_firmware.rst
index 7632f8807472..913e7d2e0cb7 100644
--- a/Documentation/driver-api/firmware/request_firmware.rst
+++ b/Documentation/driver-api/firmware/request_firmware.rst
@@ -20,6 +20,11 @@ firmware_request
 .. kernel-doc:: drivers/base/firmware_loader/main.c
    :functions: firmware_request
 
+firmware_request_nowarn
+-----------------------
+.. kernel-doc:: drivers/base/firmware_loader/main.c
+   :functions: firmware_request_nowarn
+
 firmware_request_direct
 -----------------------
 .. kernel-doc:: drivers/base/firmware_loader/main.c
@@ -36,13 +41,13 @@ Asynchronous firmware requests
 Asynchronous firmware requests allow driver code to not have to wait
 until the firmware or an error is returned. Function callbacks are
 provided so that when the firmware or an error is found the driver is
-informed through the callback. firmware_request_nowait() cannot be called
+informed through the callback. firmware_request_nowait2() cannot be called
 in atomic contexts.
 
-firmware_request_nowait
------------------------
+firmware_request_nowait2
+------------------------
 .. kernel-doc:: drivers/base/firmware_loader/main.c
-   :functions: firmware_request_nowait
+   :functions: firmware_request_nowait2
 
 Special optimizations on reboot
 ===============================
diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
index 5baadad3012d..14ded1de84bf 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -631,6 +631,30 @@ firmware_request(const struct firmware **firmware_p, const char *name,
 }
 EXPORT_SYMBOL(firmware_request);
 
+/**
+ * firmware_request_nowarn: - request for an optional fw module
+ * @firmware: pointer to firmware image
+ * @name: name of firmware file
+ * @device: device for which firmware is being loaded
+ *
+ * This function is similar in behaviour to firmware_request(), except
+ * it doesn't produce warning messages when the file is not found.
+ **/
+int
+firmware_request_nowarn(const struct firmware **firmware, const char *name,
+			struct device *device)
+{
+	int ret;
+
+	/* Need to pin this module until return */
+	__module_get(THIS_MODULE);
+	ret = _firmware_request(firmware, name, device, NULL, 0,
+				FW_OPT_UEVENT | FW_OPT_NO_WARN);
+	module_put(THIS_MODULE);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(firmware_request_nowarn);
+
 /**
  * firmware_request_direct: - load firmware directly without usermode helper
  * @firmware_p: pointer to firmware image
@@ -755,10 +779,11 @@ static void firmware_request_work_func(struct work_struct *work)
 }
 
 /**
- * firmware_request_nowait - asynchronous version of firmware_request
+ * firmware_request_nowait2 - asynchronous version of firmware_request
  * @module: module requesting the firmware
  * @uevent: sends uevent to copy the firmware image if this flag
  *	is non-zero else the firmware copy must be done manually.
+ * @warn: enable warnings
  * @name: name of firmware file
  * @device: device for which firmware is being loaded
  * @gfp: allocation flags
@@ -778,8 +803,8 @@ static void firmware_request_work_func(struct work_struct *work)
  *		- can't sleep at all if @gfp is GFP_ATOMIC.
  **/
 int
-firmware_request_nowait(
-	struct module *module, bool uevent,
+firmware_request_nowait2(
+	struct module *module, bool uevent, bool warn,
 	const char *name, struct device *device, gfp_t gfp, void *context,
 	void (*cont)(const struct firmware *fw, void *context))
 {
@@ -799,7 +824,8 @@ firmware_request_nowait(
 	fw_work->context = context;
 	fw_work->cont = cont;
 	fw_work->opt_flags = FW_OPT_NOWAIT |
-		(uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER);
+		(uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER) |
+		(warn ? 0 : FW_OPT_NO_WARN);
 
 	if (!uevent && fw_cache_is_setup(device, name)) {
 		kfree_const(fw_work->name);
@@ -818,6 +844,24 @@ firmware_request_nowait(
 	schedule_work(&fw_work->work);
 	return 0;
 }
+EXPORT_SYMBOL_GPL(firmware_request_nowait2);
+
+/**
+ * firmware_request_nowait - compatibility version of firmware_request_nowait2
+ *
+ * This is equivalent to calling firmware_request_nowait2 with warnings enabled.
+ *
+ * Refer to firmware_request_nowait2 for further details.
+ **/
+int
+firmware_request_nowait(
+	struct module *module, bool uevent,
+	const char *name, struct device *device, gfp_t gfp, void *context,
+	void (*cont)(const struct firmware *fw, void *context))
+{
+	return firmware_request_nowait2(module, uevent, true, name, device,
+					gfp, context, cont);
+}
 EXPORT_SYMBOL(firmware_request_nowait);
 
 #ifdef CONFIG_PM_SLEEP
diff --git a/include/linux/firmware.h b/include/linux/firmware.h
index db8351a42405..2623d3f853ba 100644
--- a/include/linux/firmware.h
+++ b/include/linux/firmware.h
@@ -42,6 +42,12 @@ struct builtin_fw {
 #if defined(CONFIG_FW_LOADER) || (defined(CONFIG_FW_LOADER_MODULE) && defined(MODULE))
 int firmware_request(const struct firmware **fw, const char *name,
 		     struct device *device);
+int firmware_request_nowarn(const struct firmware **fw, const char *name,
+			    struct device *device);
+int firmware_request_nowait2(
+	struct module *module, bool uevent, bool warn,
+	const char *name, struct device *device, gfp_t gfp, void *context,
+	void (*cont)(const struct firmware *fw, void *context));
 int firmware_request_nowait(
 	struct module *module, bool uevent,
 	const char *name, struct device *device, gfp_t gfp, void *context,
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 5/8] firmware: print firmware name on fallback path
  2018-04-16 22:24 [PATCH 0/8] Loading optional firmware v2 Andres Rodriguez
                   ` (3 preceding siblings ...)
  2018-04-16 22:24 ` [PATCH 4/8] firmware: add functions to load firmware without warnings v3 Andres Rodriguez
@ 2018-04-16 22:24 ` Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware Andres Rodriguez
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-16 22:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken,
	kvalo, arend.vanspriel

Previously, one could assume the firmware name from the preceding
message: "Direct firmware load for {name} failed with error %d".

However, with the new firmware_request_nowarn() entrypoint, the message
outlined above will not always be printed.

Therefore, we add the firmware name to the fallback path spew in order
to associate it with the appropriate request.

Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
---
 drivers/base/firmware_loader/fallback.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c
index ecc49a619298..e5b0a96ae781 100644
--- a/drivers/base/firmware_loader/fallback.c
+++ b/drivers/base/firmware_loader/fallback.c
@@ -669,6 +669,6 @@ int fw_sysfs_fallback(struct firmware *fw, const char *name,
 	if (!fw_run_sysfs_fallback(opt_flags))
 		return ret;
 
-	dev_warn(device, "Falling back to user helper\n");
+	dev_warn(device, "Falling back to user helper for %s\n", name);
 	return fw_load_from_user_helper(fw, name, device, opt_flags);
 }
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware
  2018-04-16 22:24 [PATCH 0/8] Loading optional firmware v2 Andres Rodriguez
                   ` (4 preceding siblings ...)
  2018-04-16 22:24 ` [PATCH 5/8] firmware: print firmware name on fallback path Andres Rodriguez
@ 2018-04-16 22:24 ` Andres Rodriguez
  2018-04-17  8:48   ` Christian König
  2018-04-16 22:24 ` [PATCH 7/8] ath10k: use request_firmware_nowarn " Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 8/8] brcmfmac: use request_firmware_nowait2 to load firmware without warnings Andres Rodriguez
  7 siblings, 1 reply; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-16 22:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken,
	kvalo, arend.vanspriel

Currently, during the normal boot process the amdgpu driver will produce
spew like the following in dmesg:
Direct firmware load for amdgpu/polaris10_mec_2.bin failed with error -2

This happens when amdgpu tries to load optional firmware files. So the
error does not affect the startup sequence.

This patch switches the amdgpu to use firmware_request_nowarn(), which
will not produce the warnings mentioned above. Hopefully resulting in a
cleaner bootup log.

Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c    |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h  |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c    |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c    |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c    |  2 +-
 drivers/gpu/drm/amd/amdgpu/ci_dpm.c        |  2 +-
 drivers/gpu/drm/amd/amdgpu/cik_sdma.c      |  2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c      |  8 ++++----
 drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c      | 12 +++++------
 drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c      | 32 +++++++++++++++---------------
 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c      | 12 +++++------
 drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c      |  2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c      |  2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c      |  2 +-
 drivers/gpu/drm/amd/amdgpu/psp_v10_0.c     |  2 +-
 drivers/gpu/drm/amd/amdgpu/psp_v3_1.c      |  4 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c     |  2 +-
 drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c     |  2 +-
 drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c     |  2 +-
 drivers/gpu/drm/amd/amdgpu/si_dpm.c        |  2 +-
 21 files changed, 51 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
index 4466f3535e2d..6c950811c0a5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
@@ -811,7 +811,7 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
 				return -EINVAL;
 			}
 
-			err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
+			err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
 			if (err) {
 				DRM_ERROR("Failed to request firmware\n");
 				return err;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index af1b879a9ee9..d6225619e69f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -696,7 +696,7 @@ bool amdgpu_device_need_post(struct amdgpu_device *adev)
 		if (adev->asic_type == CHIP_FIJI) {
 			int err;
 			uint32_t fw_ver;
-			err = request_firmware(&adev->pm.fw, "amdgpu/fiji_smc.bin", adev->dev);
+			err = firmware_request_nowarn(&adev->pm.fw, "amdgpu/fiji_smc.bin", adev->dev);
 			/* force vPost if error occured */
 			if (err)
 				return true;
@@ -1133,7 +1133,7 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", chip_name);
-	err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->firmware.gpu_info_fw, fw_name, adev->dev);
 	if (err) {
 		dev_err(adev->dev,
 			"Failed to load gpu_info firmware \"%s\"\n",
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
index 30b5500dc152..0acd1f3d14c8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
@@ -196,7 +196,7 @@ enum AMDGPU_UCODE_STATUS {
 struct amdgpu_firmware_info {
 	/* ucode ID */
 	enum AMDGPU_UCODE_ID ucode_id;
-	/* request_firmware */
+	/* firmware_request */
 	const struct firmware *fw;
 	/* starting mc address */
 	uint64_t mc_addr;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index b2eae86bf906..4de018d45081 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -171,7 +171,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
 		return -EINVAL;
 	}
 
-	r = request_firmware(&adev->uvd.fw, fw_name, adev->dev);
+	r = firmware_request_nowarn(&adev->uvd.fw, fw_name, adev->dev);
 	if (r) {
 		dev_err(adev->dev, "amdgpu_uvd: Can't load firmware \"%s\"\n",
 			fw_name);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index d274ae535530..b6af824a2f44 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -138,7 +138,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
 		return -EINVAL;
 	}
 
-	r = request_firmware(&adev->vce.fw, fw_name, adev->dev);
+	r = firmware_request_nowarn(&adev->vce.fw, fw_name, adev->dev);
 	if (r) {
 		dev_err(adev->dev, "amdgpu_vce: Can't load firmware \"%s\"\n",
 			fw_name);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 837962118dbc..bd650b87e281 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -67,7 +67,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
 		return -EINVAL;
 	}
 
-	r = request_firmware(&adev->vcn.fw, fw_name, adev->dev);
+	r = firmware_request_nowarn(&adev->vcn.fw, fw_name, adev->dev);
 	if (r) {
 		dev_err(adev->dev, "amdgpu_vcn: Can't load firmware \"%s\"\n",
 			fw_name);
diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
index a0943aa8d1d3..95e1edc1311d 100644
--- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
@@ -5849,7 +5849,7 @@ static int ci_dpm_init_microcode(struct amdgpu_device *adev)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
-	err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->pm.fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index 6e8278e689b1..93c8acca0360 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -135,7 +135,7 @@ static int cik_sdma_init_microcode(struct amdgpu_device *adev)
 			snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name);
 		else
 			snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma1.bin", chip_name);
-		err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, adev->dev);
 		if (err)
 			goto out;
 		err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
index 9870d83b68c1..8aebab5edf15 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -335,7 +335,7 @@ static int gfx_v6_0_init_microcode(struct amdgpu_device *adev)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
-	err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
@@ -346,7 +346,7 @@ static int gfx_v6_0_init_microcode(struct amdgpu_device *adev)
 	adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
-	err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.me_fw);
@@ -357,7 +357,7 @@ static int gfx_v6_0_init_microcode(struct amdgpu_device *adev)
 	adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
-	err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.ce_fw);
@@ -368,7 +368,7 @@ static int gfx_v6_0_init_microcode(struct amdgpu_device *adev)
 	adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
-	err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index a066c5eda135..35a0e46464a5 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -926,7 +926,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
-	err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
@@ -934,7 +934,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
 		goto out;
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
-	err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.me_fw);
@@ -942,7 +942,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
 		goto out;
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
-	err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.ce_fw);
@@ -950,7 +950,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
 		goto out;
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name);
-	err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.mec_fw);
@@ -959,7 +959,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
 
 	if (adev->asic_type == CHIP_KAVERI) {
 		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", chip_name);
-		err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
 		if (err)
 			goto out;
 		err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
@@ -968,7 +968,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
-	err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 4e694ae9f308..c16cd96a1557 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -936,14 +936,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
 
 	if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp_2.bin", chip_name);
-		err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
 		if (err == -ENOENT) {
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name);
-			err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
+			err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
 		}
 	} else {
 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name);
-		err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
 	}
 	if (err)
 		goto out;
@@ -956,14 +956,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
 
 	if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me_2.bin", chip_name);
-		err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
 		if (err == -ENOENT) {
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
-			err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
+			err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
 		}
 	} else {
 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
-		err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
 	}
 	if (err)
 		goto out;
@@ -977,14 +977,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
 
 	if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce_2.bin", chip_name);
-		err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
 		if (err == -ENOENT) {
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
-			err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
+			err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
 		}
 	} else {
 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
-		err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
 	}
 	if (err)
 		goto out;
@@ -1007,7 +1007,7 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
 		adev->virt.chained_ib_support = false;
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name);
-	err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
@@ -1057,14 +1057,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
 
 	if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec_2.bin", chip_name);
-		err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
 		if (err == -ENOENT) {
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
-			err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
+			err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
 		}
 	} else {
 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
-		err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
 	}
 	if (err)
 		goto out;
@@ -1079,14 +1079,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
 	    (adev->asic_type != CHIP_TOPAZ)) {
 		if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2_2.bin", chip_name);
-			err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
+			err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
 			if (err == -ENOENT) {
 				snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
-				err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
+				err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
 			}
 		} else {
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
-			err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
+			err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
 		}
 		if (!err) {
 			err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
index c06479615e8a..9f70012c81ad 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
@@ -370,7 +370,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name);
-	err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
@@ -381,7 +381,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
 	adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
-	err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.me_fw);
@@ -392,7 +392,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
 	adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
-	err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.ce_fw);
@@ -403,7 +403,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
 	adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name);
-	err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
@@ -449,7 +449,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
 		adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
-	err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->gfx.mec_fw);
@@ -461,7 +461,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
 
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
-	err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
 	if (!err) {
 		err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
 		if (err)
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
index 8e28270d1ea9..4192a5a0c444 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
@@ -136,7 +136,7 @@ static int gmc_v6_0_init_microcode(struct amdgpu_device *adev)
 		snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin");
 	else
 		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
-	err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 86e9d682c59e..06deba7f707d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -151,7 +151,7 @@ static int gmc_v7_0_init_microcode(struct amdgpu_device *adev)
 	else
 		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
 
-	err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->mc.fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 9a813d834f1a..cbce96198dbc 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -235,7 +235,7 @@ static int gmc_v8_0_init_microcode(struct amdgpu_device *adev)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name);
-	err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->mc.fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
index 5a9fe24697f9..718722ef1835 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
@@ -105,7 +105,7 @@ int psp_v10_0_init_microcode(struct psp_context *psp)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
-	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
index 19bd1934e63d..dd5261577d9b 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
@@ -111,7 +111,7 @@ int psp_v3_1_init_microcode(struct psp_context *psp)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name);
-	err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->psp.sos_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 
@@ -131,7 +131,7 @@ int psp_v3_1_init_microcode(struct psp_context *psp)
 				le32_to_cpu(hdr->sos_offset_bytes);
 
 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
-	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index d4787ad4d346..a2afbaacc7e5 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -146,7 +146,7 @@ static int sdma_v2_4_init_microcode(struct amdgpu_device *adev)
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name);
 		else
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name);
-		err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, adev->dev);
 		if (err)
 			goto out;
 		err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 521978c40537..75d2a9cc9268 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -298,7 +298,7 @@ static int sdma_v3_0_init_microcode(struct amdgpu_device *adev)
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name);
 		else
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name);
-		err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, adev->dev);
 		if (err)
 			goto out;
 		err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
index 91cf95a8c39c..e1ebfb9e2650 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
@@ -176,7 +176,7 @@ static int sdma_v4_0_init_microcode(struct amdgpu_device *adev)
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name);
 		else
 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name);
-		err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
+		err = firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, adev->dev);
 		if (err)
 			goto out;
 		err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
index ce675a7f179a..5538a5269417 100644
--- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
@@ -7687,7 +7687,7 @@ static int si_dpm_init_microcode(struct amdgpu_device *adev)
 	}
 
 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
-	err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
+	err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
 	if (err)
 		goto out;
 	err = amdgpu_ucode_validate(adev->pm.fw);
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 7/8] ath10k: use request_firmware_nowarn to load firmware
  2018-04-16 22:24 [PATCH 0/8] Loading optional firmware v2 Andres Rodriguez
                   ` (5 preceding siblings ...)
  2018-04-16 22:24 ` [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware Andres Rodriguez
@ 2018-04-16 22:24 ` Andres Rodriguez
  2018-04-16 22:24 ` [PATCH 8/8] brcmfmac: use request_firmware_nowait2 to load firmware without warnings Andres Rodriguez
  7 siblings, 0 replies; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-16 22:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken,
	kvalo, arend.vanspriel

This reduces the unnecessary spew when trying to load optional firmware:
"Direct firmware load for ... failed with error -2"

Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
---
 drivers/net/wireless/ath/ath10k/core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index f3ec13b80b20..9a225b7ad2d7 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -652,7 +652,7 @@ static const struct firmware *ath10k_fetch_fw_file(struct ath10k *ar,
 		dir = ".";
 
 	snprintf(filename, sizeof(filename), "%s/%s", dir, file);
-	ret = request_firmware(&fw, filename, ar->dev);
+	ret = request_firmware_nowarn(&fw, filename, ar->dev);
 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot fw request '%s': %d\n",
 		   filename, ret);
 
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 8/8] brcmfmac: use request_firmware_nowait2 to load firmware without warnings
  2018-04-16 22:24 [PATCH 0/8] Loading optional firmware v2 Andres Rodriguez
                   ` (6 preceding siblings ...)
  2018-04-16 22:24 ` [PATCH 7/8] ath10k: use request_firmware_nowarn " Andres Rodriguez
@ 2018-04-16 22:24 ` Andres Rodriguez
  7 siblings, 0 replies; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-16 22:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken,
	kvalo, arend.vanspriel

This reduces the unnecessary spew when trying to load optional firmware:
"Direct firmware load for ... failed with error -2"

Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
index 091b52979e03..26db3ebd52dc 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
@@ -503,8 +503,9 @@ static void brcmf_fw_request_code_done(const struct firmware *fw, void *ctx)
 		goto done;
 
 	fwctx->code = fw;
-	ret = request_firmware_nowait(THIS_MODULE, true, fwctx->nvram_name,
-				      fwctx->dev, GFP_KERNEL, fwctx,
+	ret = request_firmware_nowait(THIS_MODULE, true, false,
+				      fwctx->nvram_name, fwctx->dev,
+				      GFP_KERNEL, fwctx,
 				      brcmf_fw_request_nvram_done);
 
 	/* pass NULL to nvram callback for bcm47xx fallback */
@@ -547,7 +548,7 @@ int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags,
 	fwctx->domain_nr = domain_nr;
 	fwctx->bus_nr = bus_nr;
 
-	return request_firmware_nowait(THIS_MODULE, true, code, dev,
+	return request_firmware_nowait2(THIS_MODULE, true, false, code, dev,
 				       GFP_KERNEL, fwctx,
 				       brcmf_fw_request_code_done);
 }
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 4/8] firmware: add functions to load firmware without warnings v3
  2018-04-16 22:24 ` [PATCH 4/8] firmware: add functions to load firmware without warnings v3 Andres Rodriguez
@ 2018-04-16 22:52   ` Randy Dunlap
  0 siblings, 0 replies; 17+ messages in thread
From: Randy Dunlap @ 2018-04-16 22:52 UTC (permalink / raw)
  To: Andres Rodriguez, linux-kernel
  Cc: gregkh, mcgrof, alexdeucher, ckoenig.leichtzumerken, kvalo,
	arend.vanspriel

On 04/16/18 15:24, Andres Rodriguez wrote:
> Currently the firmware loader only exposes one silent path for querying
> optional firmware, and that is firmware_request_direct(). This function
> also disables the fallback path, which might not always be the
> desired behaviour. [0]
> 
> This patch introduces variations of firmware_request() and
> firmware_request_nowait() that enable the caller to disable the
> undesired warning messages. This is equivalent to adding FW_OPT_NO_WARN,
> to the old behaviour.
> 
> v2: add header prototype, use updated opt_flags
> v3: split debug message to separate patch
>     added _nowait variant
>     added documentation
> 
> [0]: https://git.kernel.org/linus/c0cc00f250e1
> 
> Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
> ---
>  .../driver-api/firmware/request_firmware.rst       | 13 ++++--
>  drivers/base/firmware_loader/main.c                | 52 ++++++++++++++++++++--
>  include/linux/firmware.h                           |  6 +++
>  3 files changed, 63 insertions(+), 8 deletions(-)

> diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
> index 5baadad3012d..14ded1de84bf 100644
> --- a/drivers/base/firmware_loader/main.c
> +++ b/drivers/base/firmware_loader/main.c
> @@ -631,6 +631,30 @@ firmware_request(const struct firmware **firmware_p, const char *name,
>  }
>  EXPORT_SYMBOL(firmware_request);
>  

Please see/use Documentation/doc-guide/kernel-doc.rst:
  /**
   * function_name() - Brief description of function.
   * @arg1: Describe the first argument.
   * @arg2: Describe the second argument.
   *        One can provide multiple line descriptions
   *        for arguments.
...

> +/**
> + * firmware_request_nowarn: - request for an optional fw module

no ':' above.

> + * @firmware: pointer to firmware image
> + * @name: name of firmware file
> + * @device: device for which firmware is being loaded
> + *
> + * This function is similar in behaviour to firmware_request(), except
> + * it doesn't produce warning messages when the file is not found.
> + **/
> +int
> +firmware_request_nowarn(const struct firmware **firmware, const char *name,
> +			struct device *device)
> +{
> +	int ret;
> +
> +	/* Need to pin this module until return */
> +	__module_get(THIS_MODULE);
> +	ret = _firmware_request(firmware, name, device, NULL, 0,
> +				FW_OPT_UEVENT | FW_OPT_NO_WARN);
> +	module_put(THIS_MODULE);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(firmware_request_nowarn);
> +
>  /**
>   * firmware_request_direct: - load firmware directly without usermode helper

No ':' above.

>   * @firmware_p: pointer to firmware image
> @@ -755,10 +779,11 @@ static void firmware_request_work_func(struct work_struct *work)
>  }
>  
>  /**
> - * firmware_request_nowait - asynchronous version of firmware_request
> + * firmware_request_nowait2 - asynchronous version of firmware_request
>   * @module: module requesting the firmware
>   * @uevent: sends uevent to copy the firmware image if this flag
>   *	is non-zero else the firmware copy must be done manually.
> + * @warn: enable warnings
>   * @name: name of firmware file
>   * @device: device for which firmware is being loaded
>   * @gfp: allocation flags
> @@ -778,8 +803,8 @@ static void firmware_request_work_func(struct work_struct *work)
>   *		- can't sleep at all if @gfp is GFP_ATOMIC.
>   **/
>  int
> -firmware_request_nowait(
> -	struct module *module, bool uevent,
> +firmware_request_nowait2(
> +	struct module *module, bool uevent, bool warn,
>  	const char *name, struct device *device, gfp_t gfp, void *context,
>  	void (*cont)(const struct firmware *fw, void *context))
>  {
> @@ -799,7 +824,8 @@ firmware_request_nowait(
>  	fw_work->context = context;
>  	fw_work->cont = cont;
>  	fw_work->opt_flags = FW_OPT_NOWAIT |
> -		(uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER);
> +		(uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER) |
> +		(warn ? 0 : FW_OPT_NO_WARN);
>  
>  	if (!uevent && fw_cache_is_setup(device, name)) {
>  		kfree_const(fw_work->name);
> @@ -818,6 +844,24 @@ firmware_request_nowait(
>  	schedule_work(&fw_work->work);
>  	return 0;
>  }
> +EXPORT_SYMBOL_GPL(firmware_request_nowait2);
> +
> +/**
> + * firmware_request_nowait - compatibility version of firmware_request_nowait2
> + *
> + * This is equivalent to calling firmware_request_nowait2 with warnings enabled.
> + *
> + * Refer to firmware_request_nowait2 for further details.
> + **/
> +int
> +firmware_request_nowait(
> +	struct module *module, bool uevent,
> +	const char *name, struct device *device, gfp_t gfp, void *context,
> +	void (*cont)(const struct firmware *fw, void *context))
> +{
> +	return firmware_request_nowait2(module, uevent, true, name, device,
> +					gfp, context, cont);
> +}
>  EXPORT_SYMBOL(firmware_request_nowait);
>  
>  #ifdef CONFIG_PM_SLEEP


-- 
~Randy

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware
  2018-04-16 22:24 ` [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware Andres Rodriguez
@ 2018-04-17  8:48   ` Christian König
  2018-04-17 15:07     ` Andres Rodriguez
  0 siblings, 1 reply; 17+ messages in thread
From: Christian König @ 2018-04-17  8:48 UTC (permalink / raw)
  To: Andres Rodriguez, linux-kernel
  Cc: gregkh, mcgrof, alexdeucher, kvalo, arend.vanspriel

Well this is a rather big NAK for this patch.

Only a small fraction of the firmware files amdgpu uses are actually 
optional (the ones with the *_2.bin name). All other files are mandatory 
for correct driver operation.

There is a fallback when actually no firmware files at all are found, in 
this case we at least try to get a picture on the screen so that the 
user gets a hint on what is wrong. But this path isn't tested well and 
breaks from time to time.

So when you get a message like "Direct firmware load for * failed with 
error -2" even if it's one of the "*_2.bin" files that is a clear hint 
that you should update your firmware package.

Regards,
Christian.

Am 17.04.2018 um 00:24 schrieb Andres Rodriguez:
> Currently, during the normal boot process the amdgpu driver will produce
> spew like the following in dmesg:
> Direct firmware load for amdgpu/polaris10_mec_2.bin failed with error -2
>
> This happens when amdgpu tries to load optional firmware files. So the
> error does not affect the startup sequence.
>
> This patch switches the amdgpu to use firmware_request_nowarn(), which
> will not produce the warnings mentioned above. Hopefully resulting in a
> cleaner bootup log.
>
> Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c    |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h  |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c    |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c    |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c    |  2 +-
>   drivers/gpu/drm/amd/amdgpu/ci_dpm.c        |  2 +-
>   drivers/gpu/drm/amd/amdgpu/cik_sdma.c      |  2 +-
>   drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c      |  8 ++++----
>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c      | 12 +++++------
>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c      | 32 +++++++++++++++---------------
>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c      | 12 +++++------
>   drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c      |  2 +-
>   drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c      |  2 +-
>   drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c      |  2 +-
>   drivers/gpu/drm/amd/amdgpu/psp_v10_0.c     |  2 +-
>   drivers/gpu/drm/amd/amdgpu/psp_v3_1.c      |  4 ++--
>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c     |  2 +-
>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c     |  2 +-
>   drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c     |  2 +-
>   drivers/gpu/drm/amd/amdgpu/si_dpm.c        |  2 +-
>   21 files changed, 51 insertions(+), 51 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
> index 4466f3535e2d..6c950811c0a5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
> @@ -811,7 +811,7 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
>   				return -EINVAL;
>   			}
>   
> -			err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
> +			err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>   			if (err) {
>   				DRM_ERROR("Failed to request firmware\n");
>   				return err;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index af1b879a9ee9..d6225619e69f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -696,7 +696,7 @@ bool amdgpu_device_need_post(struct amdgpu_device *adev)
>   		if (adev->asic_type == CHIP_FIJI) {
>   			int err;
>   			uint32_t fw_ver;
> -			err = request_firmware(&adev->pm.fw, "amdgpu/fiji_smc.bin", adev->dev);
> +			err = firmware_request_nowarn(&adev->pm.fw, "amdgpu/fiji_smc.bin", adev->dev);
>   			/* force vPost if error occured */
>   			if (err)
>   				return true;
> @@ -1133,7 +1133,7 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", chip_name);
> -	err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->firmware.gpu_info_fw, fw_name, adev->dev);
>   	if (err) {
>   		dev_err(adev->dev,
>   			"Failed to load gpu_info firmware \"%s\"\n",
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
> index 30b5500dc152..0acd1f3d14c8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
> @@ -196,7 +196,7 @@ enum AMDGPU_UCODE_STATUS {
>   struct amdgpu_firmware_info {
>   	/* ucode ID */
>   	enum AMDGPU_UCODE_ID ucode_id;
> -	/* request_firmware */
> +	/* firmware_request */
>   	const struct firmware *fw;
>   	/* starting mc address */
>   	uint64_t mc_addr;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> index b2eae86bf906..4de018d45081 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> @@ -171,7 +171,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
>   		return -EINVAL;
>   	}
>   
> -	r = request_firmware(&adev->uvd.fw, fw_name, adev->dev);
> +	r = firmware_request_nowarn(&adev->uvd.fw, fw_name, adev->dev);
>   	if (r) {
>   		dev_err(adev->dev, "amdgpu_uvd: Can't load firmware \"%s\"\n",
>   			fw_name);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> index d274ae535530..b6af824a2f44 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> @@ -138,7 +138,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
>   		return -EINVAL;
>   	}
>   
> -	r = request_firmware(&adev->vce.fw, fw_name, adev->dev);
> +	r = firmware_request_nowarn(&adev->vce.fw, fw_name, adev->dev);
>   	if (r) {
>   		dev_err(adev->dev, "amdgpu_vce: Can't load firmware \"%s\"\n",
>   			fw_name);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> index 837962118dbc..bd650b87e281 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> @@ -67,7 +67,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
>   		return -EINVAL;
>   	}
>   
> -	r = request_firmware(&adev->vcn.fw, fw_name, adev->dev);
> +	r = firmware_request_nowarn(&adev->vcn.fw, fw_name, adev->dev);
>   	if (r) {
>   		dev_err(adev->dev, "amdgpu_vcn: Can't load firmware \"%s\"\n",
>   			fw_name);
> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
> index a0943aa8d1d3..95e1edc1311d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
> @@ -5849,7 +5849,7 @@ static int ci_dpm_init_microcode(struct amdgpu_device *adev)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
> -	err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->pm.fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> index 6e8278e689b1..93c8acca0360 100644
> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> @@ -135,7 +135,7 @@ static int cik_sdma_init_microcode(struct amdgpu_device *adev)
>   			snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name);
>   		else
>   			snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma1.bin", chip_name);
> -		err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, adev->dev);
>   		if (err)
>   			goto out;
>   		err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
> index 9870d83b68c1..8aebab5edf15 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
> @@ -335,7 +335,7 @@ static int gfx_v6_0_init_microcode(struct amdgpu_device *adev)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
> -	err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
> @@ -346,7 +346,7 @@ static int gfx_v6_0_init_microcode(struct amdgpu_device *adev)
>   	adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
> -	err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.me_fw);
> @@ -357,7 +357,7 @@ static int gfx_v6_0_init_microcode(struct amdgpu_device *adev)
>   	adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
> -	err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.ce_fw);
> @@ -368,7 +368,7 @@ static int gfx_v6_0_init_microcode(struct amdgpu_device *adev)
>   	adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
> -	err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> index a066c5eda135..35a0e46464a5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> @@ -926,7 +926,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
> -	err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
> @@ -934,7 +934,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
>   		goto out;
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
> -	err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.me_fw);
> @@ -942,7 +942,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
>   		goto out;
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
> -	err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.ce_fw);
> @@ -950,7 +950,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
>   		goto out;
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name);
> -	err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.mec_fw);
> @@ -959,7 +959,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
>   
>   	if (adev->asic_type == CHIP_KAVERI) {
>   		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", chip_name);
> -		err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
>   		if (err)
>   			goto out;
>   		err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
> @@ -968,7 +968,7 @@ static int gfx_v7_0_init_microcode(struct amdgpu_device *adev)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
> -	err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> index 4e694ae9f308..c16cd96a1557 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> @@ -936,14 +936,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
>   
>   	if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
>   		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp_2.bin", chip_name);
> -		err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
>   		if (err == -ENOENT) {
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name);
> -			err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
> +			err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
>   		}
>   	} else {
>   		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name);
> -		err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
>   	}
>   	if (err)
>   		goto out;
> @@ -956,14 +956,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
>   
>   	if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
>   		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me_2.bin", chip_name);
> -		err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
>   		if (err == -ENOENT) {
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
> -			err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
> +			err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
>   		}
>   	} else {
>   		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
> -		err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
>   	}
>   	if (err)
>   		goto out;
> @@ -977,14 +977,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
>   
>   	if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
>   		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce_2.bin", chip_name);
> -		err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
>   		if (err == -ENOENT) {
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
> -			err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
> +			err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
>   		}
>   	} else {
>   		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
> -		err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
>   	}
>   	if (err)
>   		goto out;
> @@ -1007,7 +1007,7 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
>   		adev->virt.chained_ib_support = false;
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name);
> -	err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
> @@ -1057,14 +1057,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
>   
>   	if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
>   		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec_2.bin", chip_name);
> -		err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
>   		if (err == -ENOENT) {
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
> -			err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
> +			err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
>   		}
>   	} else {
>   		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
> -		err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
>   	}
>   	if (err)
>   		goto out;
> @@ -1079,14 +1079,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
>   	    (adev->asic_type != CHIP_TOPAZ)) {
>   		if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2_2.bin", chip_name);
> -			err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
> +			err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
>   			if (err == -ENOENT) {
>   				snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
> -				err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
> +				err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
>   			}
>   		} else {
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
> -			err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
> +			err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
>   		}
>   		if (!err) {
>   			err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> index c06479615e8a..9f70012c81ad 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> @@ -370,7 +370,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name);
> -	err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
> @@ -381,7 +381,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
>   	adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
> -	err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.me_fw);
> @@ -392,7 +392,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
>   	adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
> -	err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.ce_fw);
> @@ -403,7 +403,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
>   	adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name);
> -	err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
> @@ -449,7 +449,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
>   		adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
> -	err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->gfx.mec_fw);
> @@ -461,7 +461,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
>   
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
> -	err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
>   	if (!err) {
>   		err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>   		if (err)
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> index 8e28270d1ea9..4192a5a0c444 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> @@ -136,7 +136,7 @@ static int gmc_v6_0_init_microcode(struct amdgpu_device *adev)
>   		snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin");
>   	else
>   		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
> -	err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> index 86e9d682c59e..06deba7f707d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> @@ -151,7 +151,7 @@ static int gmc_v7_0_init_microcode(struct amdgpu_device *adev)
>   	else
>   		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
>   
> -	err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->mc.fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> index 9a813d834f1a..cbce96198dbc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> @@ -235,7 +235,7 @@ static int gmc_v8_0_init_microcode(struct amdgpu_device *adev)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name);
> -	err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->mc.fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
> index 5a9fe24697f9..718722ef1835 100644
> --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
> @@ -105,7 +105,7 @@ int psp_v10_0_init_microcode(struct psp_context *psp)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
> -	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
> index 19bd1934e63d..dd5261577d9b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
> @@ -111,7 +111,7 @@ int psp_v3_1_init_microcode(struct psp_context *psp)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name);
> -	err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->psp.sos_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   
> @@ -131,7 +131,7 @@ int psp_v3_1_init_microcode(struct psp_context *psp)
>   				le32_to_cpu(hdr->sos_offset_bytes);
>   
>   	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
> -	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> index d4787ad4d346..a2afbaacc7e5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> @@ -146,7 +146,7 @@ static int sdma_v2_4_init_microcode(struct amdgpu_device *adev)
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name);
>   		else
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name);
> -		err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, adev->dev);
>   		if (err)
>   			goto out;
>   		err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> index 521978c40537..75d2a9cc9268 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> @@ -298,7 +298,7 @@ static int sdma_v3_0_init_microcode(struct amdgpu_device *adev)
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name);
>   		else
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name);
> -		err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, adev->dev);
>   		if (err)
>   			goto out;
>   		err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> index 91cf95a8c39c..e1ebfb9e2650 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> @@ -176,7 +176,7 @@ static int sdma_v4_0_init_microcode(struct amdgpu_device *adev)
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name);
>   		else
>   			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name);
> -		err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
> +		err = firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, adev->dev);
>   		if (err)
>   			goto out;
>   		err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
> index ce675a7f179a..5538a5269417 100644
> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
> @@ -7687,7 +7687,7 @@ static int si_dpm_init_microcode(struct amdgpu_device *adev)
>   	}
>   
>   	snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
> -	err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
> +	err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>   	if (err)
>   		goto out;
>   	err = amdgpu_ucode_validate(adev->pm.fw);

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware
  2018-04-17  8:48   ` Christian König
@ 2018-04-17 15:07     ` Andres Rodriguez
  2018-04-17 15:33       ` Christian König
  0 siblings, 1 reply; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-17 15:07 UTC (permalink / raw)
  To: Christian König, linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, kvalo, arend.vanspriel



On 2018-04-17 04:48 AM, Christian König wrote:
> Well this is a rather big NAK for this patch.
> 
> Only a small fraction of the firmware files amdgpu uses are actually 
> optional (the ones with the *_2.bin name). All other files are mandatory 
> for correct driver operation.
> 
> There is a fallback when actually no firmware files at all are found, in 
> this case we at least try to get a picture on the screen so that the 
> user gets a hint on what is wrong. But this path isn't tested well and 
> breaks from time to time.
> 
> So when you get a message like "Direct firmware load for * failed with 
> error -2" even if it's one of the "*_2.bin" files that is a clear hint 
> that you should update your firmware package.

The amdgpu driver already provides clear messages when a required 
firmware file is not found. After request_firmware() returns an error, 
we will print:
"{ip_name}: Failed to load firmware {fw_name}"

When the firmware is optional, we won't print that message, and handle 
the firmware load in an appropriate way (re-use _1 firmware for_2 etc.)

Note that we care about informing the user *only* if the firmware was 
not found. If the firmware ends up coming from the fallback loader, but 
we do receive it, then we don't really care.

This is specially important since we don't print a success message on 
firmware load. So if we hit the fallback loader, the user will see a 
warning followed by silence, so it could cause confusion on whether the 
firmware load succeed or not.

These are my 2c in the matter.

Regards,
Andres


> 
> Regards,
> Christian.
> 
> Am 17.04.2018 um 00:24 schrieb Andres Rodriguez:
>> Currently, during the normal boot process the amdgpu driver will produce
>> spew like the following in dmesg:
>> Direct firmware load for amdgpu/polaris10_mec_2.bin failed with error -2
>>
>> This happens when amdgpu tries to load optional firmware files. So the
>> error does not affect the startup sequence.
>>
>> This patch switches the amdgpu to use firmware_request_nowarn(), which
>> will not produce the warnings mentioned above. Hopefully resulting in a
>> cleaner bootup log.
>>
>> Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c    |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h  |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c    |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c    |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c    |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/ci_dpm.c        |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/cik_sdma.c      |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c      |  8 ++++----
>>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c      | 12 +++++------
>>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c      | 32 
>> +++++++++++++++---------------
>>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c      | 12 +++++------
>>   drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c      |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c      |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c      |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/psp_v10_0.c     |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/psp_v3_1.c      |  4 ++--
>>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c     |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c     |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c     |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/si_dpm.c        |  2 +-
>>   21 files changed, 51 insertions(+), 51 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>> index 4466f3535e2d..6c950811c0a5 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>> @@ -811,7 +811,7 @@ static int amdgpu_cgs_get_firmware_info(struct 
>> cgs_device *cgs_device,
>>                   return -EINVAL;
>>               }
>> -            err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>> +            err = firmware_request_nowarn(&adev->pm.fw, fw_name, 
>> adev->dev);
>>               if (err) {
>>                   DRM_ERROR("Failed to request firmware\n");
>>                   return err;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> index af1b879a9ee9..d6225619e69f 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> @@ -696,7 +696,7 @@ bool amdgpu_device_need_post(struct amdgpu_device 
>> *adev)
>>           if (adev->asic_type == CHIP_FIJI) {
>>               int err;
>>               uint32_t fw_ver;
>> -            err = request_firmware(&adev->pm.fw, 
>> "amdgpu/fiji_smc.bin", adev->dev);
>> +            err = firmware_request_nowarn(&adev->pm.fw, 
>> "amdgpu/fiji_smc.bin", adev->dev);
>>               /* force vPost if error occured */
>>               if (err)
>>                   return true;
>> @@ -1133,7 +1133,7 @@ static int 
>> amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", 
>> chip_name);
>> -    err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, 
>> adev->dev);
>> +    err = firmware_request_nowarn(&adev->firmware.gpu_info_fw, 
>> fw_name, adev->dev);
>>       if (err) {
>>           dev_err(adev->dev,
>>               "Failed to load gpu_info firmware \"%s\"\n",
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>> index 30b5500dc152..0acd1f3d14c8 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>> @@ -196,7 +196,7 @@ enum AMDGPU_UCODE_STATUS {
>>   struct amdgpu_firmware_info {
>>       /* ucode ID */
>>       enum AMDGPU_UCODE_ID ucode_id;
>> -    /* request_firmware */
>> +    /* firmware_request */
>>       const struct firmware *fw;
>>       /* starting mc address */
>>       uint64_t mc_addr;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>> index b2eae86bf906..4de018d45081 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>> @@ -171,7 +171,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
>>           return -EINVAL;
>>       }
>> -    r = request_firmware(&adev->uvd.fw, fw_name, adev->dev);
>> +    r = firmware_request_nowarn(&adev->uvd.fw, fw_name, adev->dev);
>>       if (r) {
>>           dev_err(adev->dev, "amdgpu_uvd: Can't load firmware \"%s\"\n",
>>               fw_name);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>> index d274ae535530..b6af824a2f44 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>> @@ -138,7 +138,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, 
>> unsigned long size)
>>           return -EINVAL;
>>       }
>> -    r = request_firmware(&adev->vce.fw, fw_name, adev->dev);
>> +    r = firmware_request_nowarn(&adev->vce.fw, fw_name, adev->dev);
>>       if (r) {
>>           dev_err(adev->dev, "amdgpu_vce: Can't load firmware \"%s\"\n",
>>               fw_name);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>> index 837962118dbc..bd650b87e281 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>> @@ -67,7 +67,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
>>           return -EINVAL;
>>       }
>> -    r = request_firmware(&adev->vcn.fw, fw_name, adev->dev);
>> +    r = firmware_request_nowarn(&adev->vcn.fw, fw_name, adev->dev);
>>       if (r) {
>>           dev_err(adev->dev, "amdgpu_vcn: Can't load firmware \"%s\"\n",
>>               fw_name);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c 
>> b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>> index a0943aa8d1d3..95e1edc1311d 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>> @@ -5849,7 +5849,7 @@ static int ci_dpm_init_microcode(struct 
>> amdgpu_device *adev)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->pm.fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c 
>> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>> index 6e8278e689b1..93c8acca0360 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>> @@ -135,7 +135,7 @@ static int cik_sdma_init_microcode(struct 
>> amdgpu_device *adev)
>>               snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", 
>> chip_name);
>>           else
>>               snprintf(fw_name, sizeof(fw_name), 
>> "radeon/%s_sdma1.bin", chip_name);
>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>> adev->dev);
>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>> fw_name, adev->dev);
>>           if (err)
>>               goto out;
>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>> index 9870d83b68c1..8aebab5edf15 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>> @@ -335,7 +335,7 @@ static int gfx_v6_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>> @@ -346,7 +346,7 @@ static int gfx_v6_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       adev->gfx.pfp_feature_version = 
>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>> @@ -357,7 +357,7 @@ static int gfx_v6_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       adev->gfx.me_feature_version = 
>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>> @@ -368,7 +368,7 @@ static int gfx_v6_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       adev->gfx.ce_feature_version = 
>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>> index a066c5eda135..35a0e46464a5 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>> @@ -926,7 +926,7 @@ static int gfx_v7_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>> @@ -934,7 +934,7 @@ static int gfx_v7_0_init_microcode(struct 
>> amdgpu_device *adev)
>>           goto out;
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>> @@ -942,7 +942,7 @@ static int gfx_v7_0_init_microcode(struct 
>> amdgpu_device *adev)
>>           goto out;
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>> @@ -950,7 +950,7 @@ static int gfx_v7_0_init_microcode(struct 
>> amdgpu_device *adev)
>>           goto out;
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>> @@ -959,7 +959,7 @@ static int gfx_v7_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       if (adev->asic_type == CHIP_KAVERI) {
>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", 
>> chip_name);
>> -        err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
>> +        err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, 
>> adev->dev);
>>           if (err)
>>               goto out;
>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>> @@ -968,7 +968,7 @@ static int gfx_v7_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>> index 4e694ae9f308..c16cd96a1557 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>> @@ -936,14 +936,14 @@ static int gfx_v8_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>> CHIP_POLARIS12) {
>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp_2.bin", 
>> chip_name);
>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>> adev->dev);
>>           if (err == -ENOENT) {
>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>> chip_name);
>> -            err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>> adev->dev);
>> +            err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>> adev->dev);
>>           }
>>       } else {
>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>> chip_name);
>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>> adev->dev);
>>       }
>>       if (err)
>>           goto out;
>> @@ -956,14 +956,14 @@ static int gfx_v8_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>> CHIP_POLARIS12) {
>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me_2.bin", 
>> chip_name);
>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>> adev->dev);
>>           if (err == -ENOENT) {
>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>> chip_name);
>> -            err = request_firmware(&adev->gfx.me_fw, fw_name, 
>> adev->dev);
>> +            err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>> adev->dev);
>>           }
>>       } else {
>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>> chip_name);
>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>> adev->dev);
>>       }
>>       if (err)
>>           goto out;
>> @@ -977,14 +977,14 @@ static int gfx_v8_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>> CHIP_POLARIS12) {
>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce_2.bin", 
>> chip_name);
>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>> adev->dev);
>>           if (err == -ENOENT) {
>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>> chip_name);
>> -            err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>> adev->dev);
>> +            err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>> adev->dev);
>>           }
>>       } else {
>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>> chip_name);
>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>> adev->dev);
>>       }
>>       if (err)
>>           goto out;
>> @@ -1007,7 +1007,7 @@ static int gfx_v8_0_init_microcode(struct 
>> amdgpu_device *adev)
>>           adev->virt.chained_ib_support = false;
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>> @@ -1057,14 +1057,14 @@ static int gfx_v8_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>> CHIP_POLARIS12) {
>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec_2.bin", 
>> chip_name);
>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>> adev->dev);
>>           if (err == -ENOENT) {
>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>> chip_name);
>> -            err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>> adev->dev);
>> +            err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>> adev->dev);
>>           }
>>       } else {
>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>> chip_name);
>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>> adev->dev);
>>       }
>>       if (err)
>>           goto out;
>> @@ -1079,14 +1079,14 @@ static int gfx_v8_0_init_microcode(struct 
>> amdgpu_device *adev)
>>           (adev->asic_type != CHIP_TOPAZ)) {
>>           if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>> CHIP_POLARIS12) {
>>               snprintf(fw_name, sizeof(fw_name), 
>> "amdgpu/%s_mec2_2.bin", chip_name);
>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>> adev->dev);
>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>> fw_name, adev->dev);
>>               if (err == -ENOENT) {
>>                   snprintf(fw_name, sizeof(fw_name), 
>> "amdgpu/%s_mec2.bin", chip_name);
>> -                err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>> adev->dev);
>> +                err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>> fw_name, adev->dev);
>>               }
>>           } else {
>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", 
>> chip_name);
>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>> adev->dev);
>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>> fw_name, adev->dev);
>>           }
>>           if (!err) {
>>               err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>> index c06479615e8a..9f70012c81ad 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>> @@ -370,7 +370,7 @@ static int gfx_v9_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>> @@ -381,7 +381,7 @@ static int gfx_v9_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       adev->gfx.pfp_feature_version = 
>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>> @@ -392,7 +392,7 @@ static int gfx_v9_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       adev->gfx.me_feature_version = 
>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>> @@ -403,7 +403,7 @@ static int gfx_v9_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       adev->gfx.ce_feature_version = 
>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>> @@ -449,7 +449,7 @@ static int gfx_v9_0_init_microcode(struct 
>> amdgpu_device *adev)
>>           adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>> @@ -461,7 +461,7 @@ static int gfx_v9_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", 
>> chip_name);
>> -    err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, 
>> adev->dev);
>>       if (!err) {
>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>           if (err)
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> index 8e28270d1ea9..4192a5a0c444 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> @@ -136,7 +136,7 @@ static int gmc_v6_0_init_microcode(struct 
>> amdgpu_device *adev)
>>           snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin");
>>       else
>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>> chip_name);
>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> index 86e9d682c59e..06deba7f707d 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> @@ -151,7 +151,7 @@ static int gmc_v7_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       else
>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>> chip_name);
>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->mc.fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> index 9a813d834f1a..cbce96198dbc 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> @@ -235,7 +235,7 @@ static int gmc_v8_0_init_microcode(struct 
>> amdgpu_device *adev)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name);
>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->mc.fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>> index 5a9fe24697f9..718722ef1835 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>> @@ -105,7 +105,7 @@ int psp_v10_0_init_microcode(struct psp_context *psp)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c 
>> b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>> index 19bd1934e63d..dd5261577d9b 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>> @@ -111,7 +111,7 @@ int psp_v3_1_init_microcode(struct psp_context *psp)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name);
>> -    err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->psp.sos_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>> @@ -131,7 +131,7 @@ int psp_v3_1_init_microcode(struct psp_context *psp)
>>                   le32_to_cpu(hdr->sos_offset_bytes);
>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>> adev->dev);
>>       if (err)
>>           goto out;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c 
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>> index d4787ad4d346..a2afbaacc7e5 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>> @@ -146,7 +146,7 @@ static int sdma_v2_4_init_microcode(struct 
>> amdgpu_device *adev)
>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", 
>> chip_name);
>>           else
>>               snprintf(fw_name, sizeof(fw_name), 
>> "amdgpu/%s_sdma1.bin", chip_name);
>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>> adev->dev);
>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>> fw_name, adev->dev);
>>           if (err)
>>               goto out;
>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>> index 521978c40537..75d2a9cc9268 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>> @@ -298,7 +298,7 @@ static int sdma_v3_0_init_microcode(struct 
>> amdgpu_device *adev)
>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", 
>> chip_name);
>>           else
>>               snprintf(fw_name, sizeof(fw_name), 
>> "amdgpu/%s_sdma1.bin", chip_name);
>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>> adev->dev);
>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>> fw_name, adev->dev);
>>           if (err)
>>               goto out;
>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c 
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>> index 91cf95a8c39c..e1ebfb9e2650 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>> @@ -176,7 +176,7 @@ static int sdma_v4_0_init_microcode(struct 
>> amdgpu_device *adev)
>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", 
>> chip_name);
>>           else
>>               snprintf(fw_name, sizeof(fw_name), 
>> "amdgpu/%s_sdma1.bin", chip_name);
>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>> adev->dev);
>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>> fw_name, adev->dev);
>>           if (err)
>>               goto out;
>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c 
>> b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>> index ce675a7f179a..5538a5269417 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>> @@ -7687,7 +7687,7 @@ static int si_dpm_init_microcode(struct 
>> amdgpu_device *adev)
>>       }
>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>       if (err)
>>           goto out;
>>       err = amdgpu_ucode_validate(adev->pm.fw);
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware
  2018-04-17 15:07     ` Andres Rodriguez
@ 2018-04-17 15:33       ` Christian König
  2018-04-17 15:41         ` Andres Rodriguez
  0 siblings, 1 reply; 17+ messages in thread
From: Christian König @ 2018-04-17 15:33 UTC (permalink / raw)
  To: Andres Rodriguez, linux-kernel
  Cc: gregkh, mcgrof, alexdeucher, kvalo, arend.vanspriel

Am 17.04.2018 um 17:07 schrieb Andres Rodriguez:
>
>
> On 2018-04-17 04:48 AM, Christian König wrote:
>> Well this is a rather big NAK for this patch.
>>
>> Only a small fraction of the firmware files amdgpu uses are actually 
>> optional (the ones with the *_2.bin name). All other files are 
>> mandatory for correct driver operation.
>>
>> There is a fallback when actually no firmware files at all are found, 
>> in this case we at least try to get a picture on the screen so that 
>> the user gets a hint on what is wrong. But this path isn't tested 
>> well and breaks from time to time.
>>
>> So when you get a message like "Direct firmware load for * failed 
>> with error -2" even if it's one of the "*_2.bin" files that is a 
>> clear hint that you should update your firmware package.
>
> The amdgpu driver already provides clear messages when a required 
> firmware file is not found. After request_firmware() returns an error, 
> we will print:
> "{ip_name}: Failed to load firmware {fw_name}"
>
> When the firmware is optional, we won't print that message, and handle 
> the firmware load in an appropriate way (re-use _1 firmware for_2 etc.)
>
> Note that we care about informing the user *only* if the firmware was 
> not found. If the firmware ends up coming from the fallback loader, 
> but we do receive it, then we don't really care.

And that is exactly what I disagree on. Even when we used the fallback 
there should definitely be an error message that the real firmware 
wasn't found.

We should probably add a message that the fallback is used and remove 
the error message that the firmware couldn't be loaded.

Regards,
Christian.

>
> This is specially important since we don't print a success message on 
> firmware load. So if we hit the fallback loader, the user will see a 
> warning followed by silence, so it could cause confusion on whether 
> the firmware load succeed or not.
>
> These are my 2c in the matter.
>
> Regards,
> Andres
>
>
>>
>> Regards,
>> Christian.
>>
>> Am 17.04.2018 um 00:24 schrieb Andres Rodriguez:
>>> Currently, during the normal boot process the amdgpu driver will 
>>> produce
>>> spew like the following in dmesg:
>>> Direct firmware load for amdgpu/polaris10_mec_2.bin failed with 
>>> error -2
>>>
>>> This happens when amdgpu tries to load optional firmware files. So the
>>> error does not affect the startup sequence.
>>>
>>> This patch switches the amdgpu to use firmware_request_nowarn(), which
>>> will not produce the warnings mentioned above. Hopefully resulting in a
>>> cleaner bootup log.
>>>
>>> Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
>>> ---
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c    |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h  |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c    |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c    |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c    |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/ci_dpm.c        |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/cik_sdma.c      |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c      |  8 ++++----
>>>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c      | 12 +++++------
>>>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c      | 32 
>>> +++++++++++++++---------------
>>>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c      | 12 +++++------
>>>   drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c      |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c      |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c      |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/psp_v10_0.c     |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/psp_v3_1.c      |  4 ++--
>>>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c     |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c     |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c     |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/si_dpm.c        |  2 +-
>>>   21 files changed, 51 insertions(+), 51 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c 
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>> index 4466f3535e2d..6c950811c0a5 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>> @@ -811,7 +811,7 @@ static int amdgpu_cgs_get_firmware_info(struct 
>>> cgs_device *cgs_device,
>>>                   return -EINVAL;
>>>               }
>>> -            err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>> +            err = firmware_request_nowarn(&adev->pm.fw, fw_name, 
>>> adev->dev);
>>>               if (err) {
>>>                   DRM_ERROR("Failed to request firmware\n");
>>>                   return err;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>> index af1b879a9ee9..d6225619e69f 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>> @@ -696,7 +696,7 @@ bool amdgpu_device_need_post(struct 
>>> amdgpu_device *adev)
>>>           if (adev->asic_type == CHIP_FIJI) {
>>>               int err;
>>>               uint32_t fw_ver;
>>> -            err = request_firmware(&adev->pm.fw, 
>>> "amdgpu/fiji_smc.bin", adev->dev);
>>> +            err = firmware_request_nowarn(&adev->pm.fw, 
>>> "amdgpu/fiji_smc.bin", adev->dev);
>>>               /* force vPost if error occured */
>>>               if (err)
>>>                   return true;
>>> @@ -1133,7 +1133,7 @@ static int 
>>> amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, 
>>> adev->dev);
>>> +    err = firmware_request_nowarn(&adev->firmware.gpu_info_fw, 
>>> fw_name, adev->dev);
>>>       if (err) {
>>>           dev_err(adev->dev,
>>>               "Failed to load gpu_info firmware \"%s\"\n",
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h 
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>> index 30b5500dc152..0acd1f3d14c8 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>> @@ -196,7 +196,7 @@ enum AMDGPU_UCODE_STATUS {
>>>   struct amdgpu_firmware_info {
>>>       /* ucode ID */
>>>       enum AMDGPU_UCODE_ID ucode_id;
>>> -    /* request_firmware */
>>> +    /* firmware_request */
>>>       const struct firmware *fw;
>>>       /* starting mc address */
>>>       uint64_t mc_addr;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>> index b2eae86bf906..4de018d45081 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>> @@ -171,7 +171,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
>>>           return -EINVAL;
>>>       }
>>> -    r = request_firmware(&adev->uvd.fw, fw_name, adev->dev);
>>> +    r = firmware_request_nowarn(&adev->uvd.fw, fw_name, adev->dev);
>>>       if (r) {
>>>           dev_err(adev->dev, "amdgpu_uvd: Can't load firmware 
>>> \"%s\"\n",
>>>               fw_name);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c 
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>> index d274ae535530..b6af824a2f44 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>> @@ -138,7 +138,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device 
>>> *adev, unsigned long size)
>>>           return -EINVAL;
>>>       }
>>> -    r = request_firmware(&adev->vce.fw, fw_name, adev->dev);
>>> +    r = firmware_request_nowarn(&adev->vce.fw, fw_name, adev->dev);
>>>       if (r) {
>>>           dev_err(adev->dev, "amdgpu_vce: Can't load firmware 
>>> \"%s\"\n",
>>>               fw_name);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>> index 837962118dbc..bd650b87e281 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>> @@ -67,7 +67,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
>>>           return -EINVAL;
>>>       }
>>> -    r = request_firmware(&adev->vcn.fw, fw_name, adev->dev);
>>> +    r = firmware_request_nowarn(&adev->vcn.fw, fw_name, adev->dev);
>>>       if (r) {
>>>           dev_err(adev->dev, "amdgpu_vcn: Can't load firmware 
>>> \"%s\"\n",
>>>               fw_name);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c 
>>> b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>> index a0943aa8d1d3..95e1edc1311d 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>> @@ -5849,7 +5849,7 @@ static int ci_dpm_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c 
>>> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>> index 6e8278e689b1..93c8acca0360 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>> @@ -135,7 +135,7 @@ static int cik_sdma_init_microcode(struct 
>>> amdgpu_device *adev)
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "radeon/%s_sdma.bin", chip_name);
>>>           else
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "radeon/%s_sdma1.bin", chip_name);
>>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>>> adev->dev);
>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>> fw_name, adev->dev);
>>>           if (err)
>>>               goto out;
>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>> index 9870d83b68c1..8aebab5edf15 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>> @@ -335,7 +335,7 @@ static int gfx_v6_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>> @@ -346,7 +346,7 @@ static int gfx_v6_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       adev->gfx.pfp_feature_version = 
>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>> @@ -357,7 +357,7 @@ static int gfx_v6_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       adev->gfx.me_feature_version = 
>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>> @@ -368,7 +368,7 @@ static int gfx_v6_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       adev->gfx.ce_feature_version = 
>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>> index a066c5eda135..35a0e46464a5 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>> @@ -926,7 +926,7 @@ static int gfx_v7_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>> @@ -934,7 +934,7 @@ static int gfx_v7_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>           goto out;
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>> @@ -942,7 +942,7 @@ static int gfx_v7_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>           goto out;
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>> @@ -950,7 +950,7 @@ static int gfx_v7_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>           goto out;
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>> @@ -959,7 +959,7 @@ static int gfx_v7_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       if (adev->asic_type == CHIP_KAVERI) {
>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", 
>>> chip_name);
>>> -        err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>> adev->dev);
>>> +        err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, 
>>> adev->dev);
>>>           if (err)
>>>               goto out;
>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>> @@ -968,7 +968,7 @@ static int gfx_v7_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>> index 4e694ae9f308..c16cd96a1557 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>> @@ -936,14 +936,14 @@ static int gfx_v8_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>> CHIP_POLARIS12) {
>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp_2.bin", 
>>> chip_name);
>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>> adev->dev);
>>>           if (err == -ENOENT) {
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_pfp.bin", chip_name);
>>> -            err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>> adev->dev);
>>> +            err = firmware_request_nowarn(&adev->gfx.pfp_fw, 
>>> fw_name, adev->dev);
>>>           }
>>>       } else {
>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>> chip_name);
>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>> adev->dev);
>>>       }
>>>       if (err)
>>>           goto out;
>>> @@ -956,14 +956,14 @@ static int gfx_v8_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>> CHIP_POLARIS12) {
>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me_2.bin", 
>>> chip_name);
>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>> adev->dev);
>>>           if (err == -ENOENT) {
>>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>> chip_name);
>>> -            err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>> adev->dev);
>>> +            err = firmware_request_nowarn(&adev->gfx.me_fw, 
>>> fw_name, adev->dev);
>>>           }
>>>       } else {
>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>> chip_name);
>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>> adev->dev);
>>>       }
>>>       if (err)
>>>           goto out;
>>> @@ -977,14 +977,14 @@ static int gfx_v8_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>> CHIP_POLARIS12) {
>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce_2.bin", 
>>> chip_name);
>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>> adev->dev);
>>>           if (err == -ENOENT) {
>>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>> chip_name);
>>> -            err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>> adev->dev);
>>> +            err = firmware_request_nowarn(&adev->gfx.ce_fw, 
>>> fw_name, adev->dev);
>>>           }
>>>       } else {
>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>> chip_name);
>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>> adev->dev);
>>>       }
>>>       if (err)
>>>           goto out;
>>> @@ -1007,7 +1007,7 @@ static int gfx_v8_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>           adev->virt.chained_ib_support = false;
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>> @@ -1057,14 +1057,14 @@ static int gfx_v8_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>> CHIP_POLARIS12) {
>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec_2.bin", 
>>> chip_name);
>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>> adev->dev);
>>>           if (err == -ENOENT) {
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_mec.bin", chip_name);
>>> -            err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>> adev->dev);
>>> +            err = firmware_request_nowarn(&adev->gfx.mec_fw, 
>>> fw_name, adev->dev);
>>>           }
>>>       } else {
>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>> chip_name);
>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>> adev->dev);
>>>       }
>>>       if (err)
>>>           goto out;
>>> @@ -1079,14 +1079,14 @@ static int gfx_v8_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>           (adev->asic_type != CHIP_TOPAZ)) {
>>>           if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type 
>>> <= CHIP_POLARIS12) {
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_mec2_2.bin", chip_name);
>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>> adev->dev);
>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>> fw_name, adev->dev);
>>>               if (err == -ENOENT) {
>>>                   snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_mec2.bin", chip_name);
>>> -                err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>> adev->dev);
>>> +                err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>> fw_name, adev->dev);
>>>               }
>>>           } else {
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_mec2.bin", chip_name);
>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>> adev->dev);
>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>> fw_name, adev->dev);
>>>           }
>>>           if (!err) {
>>>               err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>> index c06479615e8a..9f70012c81ad 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>> @@ -370,7 +370,7 @@ static int gfx_v9_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>> @@ -381,7 +381,7 @@ static int gfx_v9_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       adev->gfx.pfp_feature_version = 
>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>> @@ -392,7 +392,7 @@ static int gfx_v9_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       adev->gfx.me_feature_version = 
>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>> @@ -403,7 +403,7 @@ static int gfx_v9_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       adev->gfx.ce_feature_version = 
>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>> @@ -449,7 +449,7 @@ static int gfx_v9_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>           adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>> @@ -461,7 +461,7 @@ static int gfx_v9_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, 
>>> adev->dev);
>>>       if (!err) {
>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>           if (err)
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>> index 8e28270d1ea9..4192a5a0c444 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>> @@ -136,7 +136,7 @@ static int gmc_v6_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>           snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin");
>>>       else
>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>       if (err)
>>>           goto out;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>> index 86e9d682c59e..06deba7f707d 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>> @@ -151,7 +151,7 @@ static int gmc_v7_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       else
>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>> index 9a813d834f1a..cbce96198dbc 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>> @@ -235,7 +235,7 @@ static int gmc_v8_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>> index 5a9fe24697f9..718722ef1835 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>> @@ -105,7 +105,7 @@ int psp_v10_0_init_microcode(struct psp_context 
>>> *psp)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c 
>>> b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>> index 19bd1934e63d..dd5261577d9b 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>> @@ -111,7 +111,7 @@ int psp_v3_1_init_microcode(struct psp_context 
>>> *psp)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->psp.sos_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>> @@ -131,7 +131,7 @@ int psp_v3_1_init_microcode(struct psp_context 
>>> *psp)
>>>                   le32_to_cpu(hdr->sos_offset_bytes);
>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>> adev->dev);
>>>       if (err)
>>>           goto out;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c 
>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>> index d4787ad4d346..a2afbaacc7e5 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>> @@ -146,7 +146,7 @@ static int sdma_v2_4_init_microcode(struct 
>>> amdgpu_device *adev)
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_sdma.bin", chip_name);
>>>           else
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_sdma1.bin", chip_name);
>>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>>> adev->dev);
>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>> fw_name, adev->dev);
>>>           if (err)
>>>               goto out;
>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>> index 521978c40537..75d2a9cc9268 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>> @@ -298,7 +298,7 @@ static int sdma_v3_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_sdma.bin", chip_name);
>>>           else
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_sdma1.bin", chip_name);
>>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>>> adev->dev);
>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>> fw_name, adev->dev);
>>>           if (err)
>>>               goto out;
>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>> index 91cf95a8c39c..e1ebfb9e2650 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>> @@ -176,7 +176,7 @@ static int sdma_v4_0_init_microcode(struct 
>>> amdgpu_device *adev)
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_sdma.bin", chip_name);
>>>           else
>>>               snprintf(fw_name, sizeof(fw_name), 
>>> "amdgpu/%s_sdma1.bin", chip_name);
>>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>>> adev->dev);
>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>> fw_name, adev->dev);
>>>           if (err)
>>>               goto out;
>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c 
>>> b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>> index ce675a7f179a..5538a5269417 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>> @@ -7687,7 +7687,7 @@ static int si_dpm_init_microcode(struct 
>>> amdgpu_device *adev)
>>>       }
>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>> chip_name);
>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>>       if (err)
>>>           goto out;
>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware
  2018-04-17 15:33       ` Christian König
@ 2018-04-17 15:41         ` Andres Rodriguez
  2018-04-17 15:52           ` Christian König
  0 siblings, 1 reply; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-17 15:41 UTC (permalink / raw)
  To: Christian König, linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, kvalo, arend.vanspriel



On 2018-04-17 11:33 AM, Christian König wrote:
> Am 17.04.2018 um 17:07 schrieb Andres Rodriguez:
>>
>>
>> On 2018-04-17 04:48 AM, Christian König wrote:
>>> Well this is a rather big NAK for this patch.
>>>
>>> Only a small fraction of the firmware files amdgpu uses are actually 
>>> optional (the ones with the *_2.bin name). All other files are 
>>> mandatory for correct driver operation.
>>>
>>> There is a fallback when actually no firmware files at all are found, 
>>> in this case we at least try to get a picture on the screen so that 
>>> the user gets a hint on what is wrong. But this path isn't tested 
>>> well and breaks from time to time.
>>>
>>> So when you get a message like "Direct firmware load for * failed 
>>> with error -2" even if it's one of the "*_2.bin" files that is a 
>>> clear hint that you should update your firmware package.
>>
>> The amdgpu driver already provides clear messages when a required 
>> firmware file is not found. After request_firmware() returns an error, 
>> we will print:
>> "{ip_name}: Failed to load firmware {fw_name}"
>>
>> When the firmware is optional, we won't print that message, and handle 
>> the firmware load in an appropriate way (re-use _1 firmware for_2 etc.)
>>
>> Note that we care about informing the user *only* if the firmware was 
>> not found. If the firmware ends up coming from the fallback loader, 
>> but we do receive it, then we don't really care.
> 
> And that is exactly what I disagree on. Even when we used the fallback 
> there should definitely be an error message that the real firmware 
> wasn't found

The request_firmware() fallback does fetch the real firmware. Why should 
a user configuration knob produce an error message if the behaviour is 
valid?

Regards,
Andres


> 
> We should probably add a message that the fallback is used and remove 
> the error message that the firmware couldn't be loaded.
> 
> Regards,
> Christian.
> 
>>
>> This is specially important since we don't print a success message on 
>> firmware load. So if we hit the fallback loader, the user will see a 
>> warning followed by silence, so it could cause confusion on whether 
>> the firmware load succeed or not.
>>
>> These are my 2c in the matter.
>>
>> Regards,
>> Andres
>>
>>
>>>
>>> Regards,
>>> Christian.
>>>
>>> Am 17.04.2018 um 00:24 schrieb Andres Rodriguez:
>>>> Currently, during the normal boot process the amdgpu driver will 
>>>> produce
>>>> spew like the following in dmesg:
>>>> Direct firmware load for amdgpu/polaris10_mec_2.bin failed with 
>>>> error -2
>>>>
>>>> This happens when amdgpu tries to load optional firmware files. So the
>>>> error does not affect the startup sequence.
>>>>
>>>> This patch switches the amdgpu to use firmware_request_nowarn(), which
>>>> will not produce the warnings mentioned above. Hopefully resulting in a
>>>> cleaner bootup log.
>>>>
>>>> Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
>>>> ---
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c    |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h  |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c    |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c    |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c    |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/ci_dpm.c        |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/cik_sdma.c      |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c      |  8 ++++----
>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c      | 12 +++++------
>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c      | 32 
>>>> +++++++++++++++---------------
>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c      | 12 +++++------
>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c      |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c      |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c      |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/psp_v10_0.c     |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/psp_v3_1.c      |  4 ++--
>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c     |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c     |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c     |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/si_dpm.c        |  2 +-
>>>>   21 files changed, 51 insertions(+), 51 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>> index 4466f3535e2d..6c950811c0a5 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>> @@ -811,7 +811,7 @@ static int amdgpu_cgs_get_firmware_info(struct 
>>>> cgs_device *cgs_device,
>>>>                   return -EINVAL;
>>>>               }
>>>> -            err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>>> +            err = firmware_request_nowarn(&adev->pm.fw, fw_name, 
>>>> adev->dev);
>>>>               if (err) {
>>>>                   DRM_ERROR("Failed to request firmware\n");
>>>>                   return err;
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>> index af1b879a9ee9..d6225619e69f 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>> @@ -696,7 +696,7 @@ bool amdgpu_device_need_post(struct 
>>>> amdgpu_device *adev)
>>>>           if (adev->asic_type == CHIP_FIJI) {
>>>>               int err;
>>>>               uint32_t fw_ver;
>>>> -            err = request_firmware(&adev->pm.fw, 
>>>> "amdgpu/fiji_smc.bin", adev->dev);
>>>> +            err = firmware_request_nowarn(&adev->pm.fw, 
>>>> "amdgpu/fiji_smc.bin", adev->dev);
>>>>               /* force vPost if error occured */
>>>>               if (err)
>>>>                   return true;
>>>> @@ -1133,7 +1133,7 @@ static int 
>>>> amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, 
>>>> adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->firmware.gpu_info_fw, 
>>>> fw_name, adev->dev);
>>>>       if (err) {
>>>>           dev_err(adev->dev,
>>>>               "Failed to load gpu_info firmware \"%s\"\n",
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>> index 30b5500dc152..0acd1f3d14c8 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>> @@ -196,7 +196,7 @@ enum AMDGPU_UCODE_STATUS {
>>>>   struct amdgpu_firmware_info {
>>>>       /* ucode ID */
>>>>       enum AMDGPU_UCODE_ID ucode_id;
>>>> -    /* request_firmware */
>>>> +    /* firmware_request */
>>>>       const struct firmware *fw;
>>>>       /* starting mc address */
>>>>       uint64_t mc_addr;
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>> index b2eae86bf906..4de018d45081 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>> @@ -171,7 +171,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
>>>>           return -EINVAL;
>>>>       }
>>>> -    r = request_firmware(&adev->uvd.fw, fw_name, adev->dev);
>>>> +    r = firmware_request_nowarn(&adev->uvd.fw, fw_name, adev->dev);
>>>>       if (r) {
>>>>           dev_err(adev->dev, "amdgpu_uvd: Can't load firmware 
>>>> \"%s\"\n",
>>>>               fw_name);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>> index d274ae535530..b6af824a2f44 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>> @@ -138,7 +138,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device 
>>>> *adev, unsigned long size)
>>>>           return -EINVAL;
>>>>       }
>>>> -    r = request_firmware(&adev->vce.fw, fw_name, adev->dev);
>>>> +    r = firmware_request_nowarn(&adev->vce.fw, fw_name, adev->dev);
>>>>       if (r) {
>>>>           dev_err(adev->dev, "amdgpu_vce: Can't load firmware 
>>>> \"%s\"\n",
>>>>               fw_name);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>> index 837962118dbc..bd650b87e281 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>> @@ -67,7 +67,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
>>>>           return -EINVAL;
>>>>       }
>>>> -    r = request_firmware(&adev->vcn.fw, fw_name, adev->dev);
>>>> +    r = firmware_request_nowarn(&adev->vcn.fw, fw_name, adev->dev);
>>>>       if (r) {
>>>>           dev_err(adev->dev, "amdgpu_vcn: Can't load firmware 
>>>> \"%s\"\n",
>>>>               fw_name);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>> index a0943aa8d1d3..95e1edc1311d 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>> @@ -5849,7 +5849,7 @@ static int ci_dpm_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>> index 6e8278e689b1..93c8acca0360 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>> @@ -135,7 +135,7 @@ static int cik_sdma_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "radeon/%s_sdma.bin", chip_name);
>>>>           else
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "radeon/%s_sdma1.bin", chip_name);
>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>>>> adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>> fw_name, adev->dev);
>>>>           if (err)
>>>>               goto out;
>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>> index 9870d83b68c1..8aebab5edf15 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>> @@ -335,7 +335,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>> @@ -346,7 +346,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       adev->gfx.pfp_feature_version = 
>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>> @@ -357,7 +357,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       adev->gfx.me_feature_version = 
>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>> @@ -368,7 +368,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       adev->gfx.ce_feature_version = 
>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>> index a066c5eda135..35a0e46464a5 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>> @@ -926,7 +926,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>> @@ -934,7 +934,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>           goto out;
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>> @@ -942,7 +942,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>           goto out;
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>> @@ -950,7 +950,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>           goto out;
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>>> @@ -959,7 +959,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       if (adev->asic_type == CHIP_KAVERI) {
>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", 
>>>> chip_name);
>>>> -        err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>> adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, 
>>>> adev->dev);
>>>>           if (err)
>>>>               goto out;
>>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>> @@ -968,7 +968,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>> index 4e694ae9f308..c16cd96a1557 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>> @@ -936,14 +936,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>> CHIP_POLARIS12) {
>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp_2.bin", 
>>>> chip_name);
>>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>> adev->dev);
>>>>           if (err == -ENOENT) {
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_pfp.bin", chip_name);
>>>> -            err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>> adev->dev);
>>>> +            err = firmware_request_nowarn(&adev->gfx.pfp_fw, 
>>>> fw_name, adev->dev);
>>>>           }
>>>>       } else {
>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>>> chip_name);
>>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>> adev->dev);
>>>>       }
>>>>       if (err)
>>>>           goto out;
>>>> @@ -956,14 +956,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>> CHIP_POLARIS12) {
>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me_2.bin", 
>>>> chip_name);
>>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>> adev->dev);
>>>>           if (err == -ENOENT) {
>>>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>>> chip_name);
>>>> -            err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>> adev->dev);
>>>> +            err = firmware_request_nowarn(&adev->gfx.me_fw, 
>>>> fw_name, adev->dev);
>>>>           }
>>>>       } else {
>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>>> chip_name);
>>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>> adev->dev);
>>>>       }
>>>>       if (err)
>>>>           goto out;
>>>> @@ -977,14 +977,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>> CHIP_POLARIS12) {
>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce_2.bin", 
>>>> chip_name);
>>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>> adev->dev);
>>>>           if (err == -ENOENT) {
>>>>               snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>>> chip_name);
>>>> -            err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>> adev->dev);
>>>> +            err = firmware_request_nowarn(&adev->gfx.ce_fw, 
>>>> fw_name, adev->dev);
>>>>           }
>>>>       } else {
>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>>> chip_name);
>>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>> adev->dev);
>>>>       }
>>>>       if (err)
>>>>           goto out;
>>>> @@ -1007,7 +1007,7 @@ static int gfx_v8_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>           adev->virt.chained_ib_support = false;
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>> @@ -1057,14 +1057,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>> CHIP_POLARIS12) {
>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec_2.bin", 
>>>> chip_name);
>>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>> adev->dev);
>>>>           if (err == -ENOENT) {
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_mec.bin", chip_name);
>>>> -            err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>> adev->dev);
>>>> +            err = firmware_request_nowarn(&adev->gfx.mec_fw, 
>>>> fw_name, adev->dev);
>>>>           }
>>>>       } else {
>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>>> chip_name);
>>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>> adev->dev);
>>>>       }
>>>>       if (err)
>>>>           goto out;
>>>> @@ -1079,14 +1079,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>           (adev->asic_type != CHIP_TOPAZ)) {
>>>>           if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type 
>>>> <= CHIP_POLARIS12) {
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_mec2_2.bin", chip_name);
>>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>> adev->dev);
>>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>> fw_name, adev->dev);
>>>>               if (err == -ENOENT) {
>>>>                   snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_mec2.bin", chip_name);
>>>> -                err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>> adev->dev);
>>>> +                err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>> fw_name, adev->dev);
>>>>               }
>>>>           } else {
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_mec2.bin", chip_name);
>>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>> adev->dev);
>>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>> fw_name, adev->dev);
>>>>           }
>>>>           if (!err) {
>>>>               err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>> index c06479615e8a..9f70012c81ad 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>> @@ -370,7 +370,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>> @@ -381,7 +381,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       adev->gfx.pfp_feature_version = 
>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>> @@ -392,7 +392,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       adev->gfx.me_feature_version = 
>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>> @@ -403,7 +403,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       adev->gfx.ce_feature_version = 
>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>> @@ -449,7 +449,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>           adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>>> @@ -461,7 +461,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, 
>>>> adev->dev);
>>>>       if (!err) {
>>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>           if (err)
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>> index 8e28270d1ea9..4192a5a0c444 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>> @@ -136,7 +136,7 @@ static int gmc_v6_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin");
>>>>       else
>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>> index 86e9d682c59e..06deba7f707d 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>> @@ -151,7 +151,7 @@ static int gmc_v7_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       else
>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>> index 9a813d834f1a..cbce96198dbc 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>> @@ -235,7 +235,7 @@ static int gmc_v8_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>> index 5a9fe24697f9..718722ef1835 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>> @@ -105,7 +105,7 @@ int psp_v10_0_init_microcode(struct psp_context 
>>>> *psp)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>> index 19bd1934e63d..dd5261577d9b 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>> @@ -111,7 +111,7 @@ int psp_v3_1_init_microcode(struct psp_context 
>>>> *psp)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->psp.sos_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>> @@ -131,7 +131,7 @@ int psp_v3_1_init_microcode(struct psp_context 
>>>> *psp)
>>>>                   le32_to_cpu(hdr->sos_offset_bytes);
>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>>> adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>> index d4787ad4d346..a2afbaacc7e5 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>> @@ -146,7 +146,7 @@ static int sdma_v2_4_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>           else
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>>>> adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>> fw_name, adev->dev);
>>>>           if (err)
>>>>               goto out;
>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>> index 521978c40537..75d2a9cc9268 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>> @@ -298,7 +298,7 @@ static int sdma_v3_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>           else
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>>>> adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>> fw_name, adev->dev);
>>>>           if (err)
>>>>               goto out;
>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>> index 91cf95a8c39c..e1ebfb9e2650 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>> @@ -176,7 +176,7 @@ static int sdma_v4_0_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>           else
>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, fw_name, 
>>>> adev->dev);
>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>> fw_name, adev->dev);
>>>>           if (err)
>>>>               goto out;
>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>> index ce675a7f179a..5538a5269417 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>> @@ -7687,7 +7687,7 @@ static int si_dpm_init_microcode(struct 
>>>> amdgpu_device *adev)
>>>>       }
>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>>> chip_name);
>>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>>>       if (err)
>>>>           goto out;
>>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>>
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware
  2018-04-17 15:41         ` Andres Rodriguez
@ 2018-04-17 15:52           ` Christian König
  2018-04-17 16:41             ` Andres Rodriguez
  0 siblings, 1 reply; 17+ messages in thread
From: Christian König @ 2018-04-17 15:52 UTC (permalink / raw)
  To: Andres Rodriguez, linux-kernel
  Cc: gregkh, mcgrof, alexdeucher, kvalo, arend.vanspriel

Am 17.04.2018 um 17:41 schrieb Andres Rodriguez:
>
>
> On 2018-04-17 11:33 AM, Christian König wrote:
>> Am 17.04.2018 um 17:07 schrieb Andres Rodriguez:
>>>
>>>
>>> On 2018-04-17 04:48 AM, Christian König wrote:
>>>> Well this is a rather big NAK for this patch.
>>>>
>>>> Only a small fraction of the firmware files amdgpu uses are 
>>>> actually optional (the ones with the *_2.bin name). All other files 
>>>> are mandatory for correct driver operation.
>>>>
>>>> There is a fallback when actually no firmware files at all are 
>>>> found, in this case we at least try to get a picture on the screen 
>>>> so that the user gets a hint on what is wrong. But this path isn't 
>>>> tested well and breaks from time to time.
>>>>
>>>> So when you get a message like "Direct firmware load for * failed 
>>>> with error -2" even if it's one of the "*_2.bin" files that is a 
>>>> clear hint that you should update your firmware package.
>>>
>>> The amdgpu driver already provides clear messages when a required 
>>> firmware file is not found. After request_firmware() returns an 
>>> error, we will print:
>>> "{ip_name}: Failed to load firmware {fw_name}"
>>>
>>> When the firmware is optional, we won't print that message, and 
>>> handle the firmware load in an appropriate way (re-use _1 firmware 
>>> for_2 etc.)
>>>
>>> Note that we care about informing the user *only* if the firmware 
>>> was not found. If the firmware ends up coming from the fallback 
>>> loader, but we do receive it, then we don't really care.
>>
>> And that is exactly what I disagree on. Even when we used the 
>> fallback there should definitely be an error message that the real 
>> firmware wasn't found
>
> The request_firmware() fallback does fetch the real firmware. Why 
> should a user configuration knob produce an error message if the 
> behaviour is valid?

Because the behavior isn't valid.

We ran the fallback path which is not optimal and the user should 
consider installing the missing firmware. There definitely should be a 
message about that.

I agree that it's also a good idea to note that we hit the fallback and 
not only that the firmware was missing, but that is a different issue.

Additional to that it isn't the job of the driver to print messages 
about missing firmware, so the extra message about that should be removed.

Regards,
Christian.

>
> Regards,
> Andres
>
>
>>
>> We should probably add a message that the fallback is used and remove 
>> the error message that the firmware couldn't be loaded.
>>
>> Regards,
>> Christian.
>>
>>>
>>> This is specially important since we don't print a success message 
>>> on firmware load. So if we hit the fallback loader, the user will 
>>> see a warning followed by silence, so it could cause confusion on 
>>> whether the firmware load succeed or not.
>>>
>>> These are my 2c in the matter.
>>>
>>> Regards,
>>> Andres
>>>
>>>
>>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>> Am 17.04.2018 um 00:24 schrieb Andres Rodriguez:
>>>>> Currently, during the normal boot process the amdgpu driver will 
>>>>> produce
>>>>> spew like the following in dmesg:
>>>>> Direct firmware load for amdgpu/polaris10_mec_2.bin failed with 
>>>>> error -2
>>>>>
>>>>> This happens when amdgpu tries to load optional firmware files. So 
>>>>> the
>>>>> error does not affect the startup sequence.
>>>>>
>>>>> This patch switches the amdgpu to use firmware_request_nowarn(), 
>>>>> which
>>>>> will not produce the warnings mentioned above. Hopefully resulting 
>>>>> in a
>>>>> cleaner bootup log.
>>>>>
>>>>> Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
>>>>> ---
>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c    |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--
>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h  |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c    |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c    |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c    |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/ci_dpm.c        |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/cik_sdma.c      |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c      |  8 ++++----
>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c      | 12 +++++------
>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c      | 32 
>>>>> +++++++++++++++---------------
>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c      | 12 +++++------
>>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c      |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c      |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c      |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/psp_v10_0.c     |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/psp_v3_1.c      |  4 ++--
>>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c     |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c     |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c     |  2 +-
>>>>>   drivers/gpu/drm/amd/amdgpu/si_dpm.c        |  2 +-
>>>>>   21 files changed, 51 insertions(+), 51 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>>> index 4466f3535e2d..6c950811c0a5 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>>> @@ -811,7 +811,7 @@ static int amdgpu_cgs_get_firmware_info(struct 
>>>>> cgs_device *cgs_device,
>>>>>                   return -EINVAL;
>>>>>               }
>>>>> -            err = request_firmware(&adev->pm.fw, fw_name, 
>>>>> adev->dev);
>>>>> +            err = firmware_request_nowarn(&adev->pm.fw, fw_name, 
>>>>> adev->dev);
>>>>>               if (err) {
>>>>>                   DRM_ERROR("Failed to request firmware\n");
>>>>>                   return err;
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>>> index af1b879a9ee9..d6225619e69f 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>>> @@ -696,7 +696,7 @@ bool amdgpu_device_need_post(struct 
>>>>> amdgpu_device *adev)
>>>>>           if (adev->asic_type == CHIP_FIJI) {
>>>>>               int err;
>>>>>               uint32_t fw_ver;
>>>>> -            err = request_firmware(&adev->pm.fw, 
>>>>> "amdgpu/fiji_smc.bin", adev->dev);
>>>>> +            err = firmware_request_nowarn(&adev->pm.fw, 
>>>>> "amdgpu/fiji_smc.bin", adev->dev);
>>>>>               /* force vPost if error occured */
>>>>>               if (err)
>>>>>                   return true;
>>>>> @@ -1133,7 +1133,7 @@ static int 
>>>>> amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, 
>>>>> adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->firmware.gpu_info_fw, 
>>>>> fw_name, adev->dev);
>>>>>       if (err) {
>>>>>           dev_err(adev->dev,
>>>>>               "Failed to load gpu_info firmware \"%s\"\n",
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h 
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>>> index 30b5500dc152..0acd1f3d14c8 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>>> @@ -196,7 +196,7 @@ enum AMDGPU_UCODE_STATUS {
>>>>>   struct amdgpu_firmware_info {
>>>>>       /* ucode ID */
>>>>>       enum AMDGPU_UCODE_ID ucode_id;
>>>>> -    /* request_firmware */
>>>>> +    /* firmware_request */
>>>>>       const struct firmware *fw;
>>>>>       /* starting mc address */
>>>>>       uint64_t mc_addr;
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>>> index b2eae86bf906..4de018d45081 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>>> @@ -171,7 +171,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device 
>>>>> *adev)
>>>>>           return -EINVAL;
>>>>>       }
>>>>> -    r = request_firmware(&adev->uvd.fw, fw_name, adev->dev);
>>>>> +    r = firmware_request_nowarn(&adev->uvd.fw, fw_name, adev->dev);
>>>>>       if (r) {
>>>>>           dev_err(adev->dev, "amdgpu_uvd: Can't load firmware 
>>>>> \"%s\"\n",
>>>>>               fw_name);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>>> index d274ae535530..b6af824a2f44 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>>> @@ -138,7 +138,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device 
>>>>> *adev, unsigned long size)
>>>>>           return -EINVAL;
>>>>>       }
>>>>> -    r = request_firmware(&adev->vce.fw, fw_name, adev->dev);
>>>>> +    r = firmware_request_nowarn(&adev->vce.fw, fw_name, adev->dev);
>>>>>       if (r) {
>>>>>           dev_err(adev->dev, "amdgpu_vce: Can't load firmware 
>>>>> \"%s\"\n",
>>>>>               fw_name);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>>> index 837962118dbc..bd650b87e281 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>>> @@ -67,7 +67,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
>>>>>           return -EINVAL;
>>>>>       }
>>>>> -    r = request_firmware(&adev->vcn.fw, fw_name, adev->dev);
>>>>> +    r = firmware_request_nowarn(&adev->vcn.fw, fw_name, adev->dev);
>>>>>       if (r) {
>>>>>           dev_err(adev->dev, "amdgpu_vcn: Can't load firmware 
>>>>> \"%s\"\n",
>>>>>               fw_name);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>>> index a0943aa8d1d3..95e1edc1311d 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>>> @@ -5849,7 +5849,7 @@ static int ci_dpm_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>>> index 6e8278e689b1..93c8acca0360 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>>> @@ -135,7 +135,7 @@ static int cik_sdma_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "radeon/%s_sdma.bin", chip_name);
>>>>>           else
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "radeon/%s_sdma1.bin", chip_name);
>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>> fw_name, adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>>> fw_name, adev->dev);
>>>>>           if (err)
>>>>>               goto out;
>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>>> index 9870d83b68c1..8aebab5edf15 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>>> @@ -335,7 +335,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>>> @@ -346,7 +346,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       adev->gfx.pfp_feature_version = 
>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>>> @@ -357,7 +357,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       adev->gfx.me_feature_version = 
>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>>> @@ -368,7 +368,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       adev->gfx.ce_feature_version = 
>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>>> index a066c5eda135..35a0e46464a5 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>>> @@ -926,7 +926,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>>> @@ -934,7 +934,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>           goto out;
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>>> @@ -942,7 +942,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>           goto out;
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>>> @@ -950,7 +950,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>           goto out;
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>>>> @@ -959,7 +959,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       if (adev->asic_type == CHIP_KAVERI) {
>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", 
>>>>> chip_name);
>>>>> -        err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>>> adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>> fw_name, adev->dev);
>>>>>           if (err)
>>>>>               goto out;
>>>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>> @@ -968,7 +968,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>>> index 4e694ae9f308..c16cd96a1557 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>>> @@ -936,14 +936,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>> CHIP_POLARIS12) {
>>>>>           snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_pfp_2.bin", chip_name);
>>>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>>> adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>> adev->dev);
>>>>>           if (err == -ENOENT) {
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_pfp.bin", chip_name);
>>>>> -            err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>>> adev->dev);
>>>>> +            err = firmware_request_nowarn(&adev->gfx.pfp_fw, 
>>>>> fw_name, adev->dev);
>>>>>           }
>>>>>       } else {
>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>>>> chip_name);
>>>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>>> adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>> adev->dev);
>>>>>       }
>>>>>       if (err)
>>>>>           goto out;
>>>>> @@ -956,14 +956,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>> CHIP_POLARIS12) {
>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me_2.bin", 
>>>>> chip_name);
>>>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>>> adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>> adev->dev);
>>>>>           if (err == -ENOENT) {
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_me.bin", chip_name);
>>>>> -            err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>>> adev->dev);
>>>>> +            err = firmware_request_nowarn(&adev->gfx.me_fw, 
>>>>> fw_name, adev->dev);
>>>>>           }
>>>>>       } else {
>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>>>> chip_name);
>>>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>>> adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>> adev->dev);
>>>>>       }
>>>>>       if (err)
>>>>>           goto out;
>>>>> @@ -977,14 +977,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>> CHIP_POLARIS12) {
>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce_2.bin", 
>>>>> chip_name);
>>>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>>> adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>> adev->dev);
>>>>>           if (err == -ENOENT) {
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_ce.bin", chip_name);
>>>>> -            err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>>> adev->dev);
>>>>> +            err = firmware_request_nowarn(&adev->gfx.ce_fw, 
>>>>> fw_name, adev->dev);
>>>>>           }
>>>>>       } else {
>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>>>> chip_name);
>>>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>>> adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>> adev->dev);
>>>>>       }
>>>>>       if (err)
>>>>>           goto out;
>>>>> @@ -1007,7 +1007,7 @@ static int gfx_v8_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>           adev->virt.chained_ib_support = false;
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>> @@ -1057,14 +1057,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>> CHIP_POLARIS12) {
>>>>>           snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_mec_2.bin", chip_name);
>>>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>>> adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>> adev->dev);
>>>>>           if (err == -ENOENT) {
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_mec.bin", chip_name);
>>>>> -            err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>>> adev->dev);
>>>>> +            err = firmware_request_nowarn(&adev->gfx.mec_fw, 
>>>>> fw_name, adev->dev);
>>>>>           }
>>>>>       } else {
>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>>>> chip_name);
>>>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>>> adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>> adev->dev);
>>>>>       }
>>>>>       if (err)
>>>>>           goto out;
>>>>> @@ -1079,14 +1079,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>           (adev->asic_type != CHIP_TOPAZ)) {
>>>>>           if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type 
>>>>> <= CHIP_POLARIS12) {
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_mec2_2.bin", chip_name);
>>>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>>> adev->dev);
>>>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>> fw_name, adev->dev);
>>>>>               if (err == -ENOENT) {
>>>>>                   snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_mec2.bin", chip_name);
>>>>> -                err = request_firmware(&adev->gfx.mec2_fw, 
>>>>> fw_name, adev->dev);
>>>>> +                err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>> fw_name, adev->dev);
>>>>>               }
>>>>>           } else {
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_mec2.bin", chip_name);
>>>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>>> adev->dev);
>>>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>> fw_name, adev->dev);
>>>>>           }
>>>>>           if (!err) {
>>>>>               err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>>> index c06479615e8a..9f70012c81ad 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>>> @@ -370,7 +370,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>>> @@ -381,7 +381,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       adev->gfx.pfp_feature_version = 
>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>>> @@ -392,7 +392,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       adev->gfx.me_feature_version = 
>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>>> @@ -403,7 +403,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       adev->gfx.ce_feature_version = 
>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>> @@ -449,7 +449,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>           adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>>>> @@ -461,7 +461,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (!err) {
>>>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>>           if (err)
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>>> index 8e28270d1ea9..4192a5a0c444 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>>> @@ -136,7 +136,7 @@ static int gmc_v6_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin");
>>>>>       else
>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>>> index 86e9d682c59e..06deba7f707d 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>>> @@ -151,7 +151,7 @@ static int gmc_v7_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       else
>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>>> index 9a813d834f1a..cbce96198dbc 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>>> @@ -235,7 +235,7 @@ static int gmc_v8_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>>> index 5a9fe24697f9..718722ef1835 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>>> @@ -105,7 +105,7 @@ int psp_v10_0_init_microcode(struct 
>>>>> psp_context *psp)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>>> index 19bd1934e63d..dd5261577d9b 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>>> @@ -111,7 +111,7 @@ int psp_v3_1_init_microcode(struct psp_context 
>>>>> *psp)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->psp.sos_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>> @@ -131,7 +131,7 @@ int psp_v3_1_init_microcode(struct psp_context 
>>>>> *psp)
>>>>>                   le32_to_cpu(hdr->sos_offset_bytes);
>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>>>> adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>>> index d4787ad4d346..a2afbaacc7e5 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>>> @@ -146,7 +146,7 @@ static int sdma_v2_4_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>>           else
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>> fw_name, adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>>> fw_name, adev->dev);
>>>>>           if (err)
>>>>>               goto out;
>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>>> index 521978c40537..75d2a9cc9268 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>>> @@ -298,7 +298,7 @@ static int sdma_v3_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>>           else
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>> fw_name, adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>>> fw_name, adev->dev);
>>>>>           if (err)
>>>>>               goto out;
>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>>> index 91cf95a8c39c..e1ebfb9e2650 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>>> @@ -176,7 +176,7 @@ static int sdma_v4_0_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>>           else
>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>> fw_name, adev->dev);
>>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>>> fw_name, adev->dev);
>>>>>           if (err)
>>>>>               goto out;
>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>>> index ce675a7f179a..5538a5269417 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>>> @@ -7687,7 +7687,7 @@ static int si_dpm_init_microcode(struct 
>>>>> amdgpu_device *adev)
>>>>>       }
>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>>>> chip_name);
>>>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>>>>       if (err)
>>>>>           goto out;
>>>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>>>
>>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware
  2018-04-17 15:52           ` Christian König
@ 2018-04-17 16:41             ` Andres Rodriguez
  2018-04-17 16:50               ` Andres Rodriguez
  0 siblings, 1 reply; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-17 16:41 UTC (permalink / raw)
  To: Christian König, linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, kvalo, arend.vanspriel



On 2018-04-17 11:52 AM, Christian König wrote:
> Am 17.04.2018 um 17:41 schrieb Andres Rodriguez:
>>
>>
>> On 2018-04-17 11:33 AM, Christian König wrote:
>>> Am 17.04.2018 um 17:07 schrieb Andres Rodriguez:
>>>>
>>>>
>>>> On 2018-04-17 04:48 AM, Christian König wrote:
>>>>> Well this is a rather big NAK for this patch.
>>>>>
>>>>> Only a small fraction of the firmware files amdgpu uses are 
>>>>> actually optional (the ones with the *_2.bin name). All other files 
>>>>> are mandatory for correct driver operation.
>>>>>
>>>>> There is a fallback when actually no firmware files at all are 
>>>>> found, in this case we at least try to get a picture on the screen 
>>>>> so that the user gets a hint on what is wrong. But this path isn't 
>>>>> tested well and breaks from time to time.
>>>>>
>>>>> So when you get a message like "Direct firmware load for * failed 
>>>>> with error -2" even if it's one of the "*_2.bin" files that is a 
>>>>> clear hint that you should update your firmware package.
>>>>
>>>> The amdgpu driver already provides clear messages when a required 
>>>> firmware file is not found. After request_firmware() returns an 
>>>> error, we will print:
>>>> "{ip_name}: Failed to load firmware {fw_name}"
>>>>
>>>> When the firmware is optional, we won't print that message, and 
>>>> handle the firmware load in an appropriate way (re-use _1 firmware 
>>>> for_2 etc.)
>>>>
>>>> Note that we care about informing the user *only* if the firmware 
>>>> was not found. If the firmware ends up coming from the fallback 
>>>> loader, but we do receive it, then we don't really care.
>>>
>>> And that is exactly what I disagree on. Even when we used the 
>>> fallback there should definitely be an error message that the real 
>>> firmware wasn't found
>>
>> The request_firmware() fallback does fetch the real firmware. Why 
>> should a user configuration knob produce an error message if the 
>> behaviour is valid?
> 
> Because the behavior isn't valid.
> 
> We ran the fallback path which is not optimal and the user should 
> consider installing the missing firmware. There definitely should be a 
> message about that.

I think I misused the word fallback and that has led to some confusion, 
sorry about that. There is the fallback path inside request_firmware() 
(formerly known as the usermode helper), and there is the fallback path 
in amdgpu.

The first, if request_firmware() can't find built-in firmware it can 
query the usermodehelper for the file and retrieve it. This will result 
in the real firmware file being retrieved and optimal behaviour from the 
amdgpu side. In this case request_firmware() returns success.

The second, if request_firmware() completely fails, we will try some 
strategies like loading the firmware of the primary engine into the 
secondary engine. Or disabling the engine, etc. This leads to less than 
optimal behaviour in some cases, and we should warn the user 
appropriately. We do produce errors where appropriate in this scenario 
inside amdgpu.

Maybe I'm going a bit overzealous here trying two kill two birds with 
one stone. There are two cases that I wanted to improve on the amdgpu side:

First case, Usermodehelper: disabled - Firmware: not found, but optional
------------------------------------------------------------------------

This was my main motivation for writing these changes. In this scenario 
we would get the "Direct firmware load failed with error..." message. 
And then the driver would self correct and load correctly.

For some combinations of ASICs + fw files this is expected behaviour, 
e.g. mec_2.bin on polaris10. And having that error message in the kernel 
log would lead users to think there is something wrong with their 
firmware install, when in reality everything is ok.

Second case, Usermodehelper: enabled - Firmware: found
------------------------------------------------------

This is where I might be overextending myself, but I think we do have an 
opportunity for a big improvement.

In this scenario we will produce the output:
"Direct firmware load for * failed with error -2"
"Falling back to user helper"

I don't think those messages are particularly useful in the amdgpu case. 
If the user configured their system to use the usermodehelper, why 
should we be producing two*n_firmware_files lines of spew for regular 
operation? That is a lot of message flooding, and I don't see the purpose.

If the intent of the message is to help the user know that they need to 
install/update their linux-firmware package, then we have the error message:
"{ip_name}: Failed to load firmware {fw_name}"

And that should point the user in the proper direction to fix their issue.

Regards,
Andres


> 
> I agree that it's also a good idea to note that we hit the fallback and 
> not only that the firmware was missing, but that is a different issue.
> 
> Additional to that it isn't the job of the driver to print messages 
> about missing firmware, so the extra message about that should be removed.
> 

> Regards,
> Christian.
> 
>>
>> Regards,
>> Andres
>>
>>
>>>
>>> We should probably add a message that the fallback is used and remove 
>>> the error message that the firmware couldn't be loaded.
>>>
>>> Regards,
>>> Christian.
>>>
>>>>
>>>> This is specially important since we don't print a success message 
>>>> on firmware load. So if we hit the fallback loader, the user will 
>>>> see a warning followed by silence, so it could cause confusion on 
>>>> whether the firmware load succeed or not.
>>>>
>>>> These are my 2c in the matter.
>>>>
>>>> Regards,
>>>> Andres
>>>>
>>>>
>>>>>
>>>>> Regards,
>>>>> Christian.
>>>>>
>>>>> Am 17.04.2018 um 00:24 schrieb Andres Rodriguez:
>>>>>> Currently, during the normal boot process the amdgpu driver will 
>>>>>> produce
>>>>>> spew like the following in dmesg:
>>>>>> Direct firmware load for amdgpu/polaris10_mec_2.bin failed with 
>>>>>> error -2
>>>>>>
>>>>>> This happens when amdgpu tries to load optional firmware files. So 
>>>>>> the
>>>>>> error does not affect the startup sequence.
>>>>>>
>>>>>> This patch switches the amdgpu to use firmware_request_nowarn(), 
>>>>>> which
>>>>>> will not produce the warnings mentioned above. Hopefully resulting 
>>>>>> in a
>>>>>> cleaner bootup log.
>>>>>>
>>>>>> Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
>>>>>> ---
>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c    |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--
>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h  |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c    |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c    |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c    |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/ci_dpm.c        |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/cik_sdma.c      |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c      |  8 ++++----
>>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c      | 12 +++++------
>>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c      | 32 
>>>>>> +++++++++++++++---------------
>>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c      | 12 +++++------
>>>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c      |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c      |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c      |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/psp_v10_0.c     |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/psp_v3_1.c      |  4 ++--
>>>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c     |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c     |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c     |  2 +-
>>>>>>   drivers/gpu/drm/amd/amdgpu/si_dpm.c        |  2 +-
>>>>>>   21 files changed, 51 insertions(+), 51 deletions(-)
>>>>>>
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>>>> index 4466f3535e2d..6c950811c0a5 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>>>> @@ -811,7 +811,7 @@ static int amdgpu_cgs_get_firmware_info(struct 
>>>>>> cgs_device *cgs_device,
>>>>>>                   return -EINVAL;
>>>>>>               }
>>>>>> -            err = request_firmware(&adev->pm.fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +            err = firmware_request_nowarn(&adev->pm.fw, fw_name, 
>>>>>> adev->dev);
>>>>>>               if (err) {
>>>>>>                   DRM_ERROR("Failed to request firmware\n");
>>>>>>                   return err;
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>>>> index af1b879a9ee9..d6225619e69f 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>>>> @@ -696,7 +696,7 @@ bool amdgpu_device_need_post(struct 
>>>>>> amdgpu_device *adev)
>>>>>>           if (adev->asic_type == CHIP_FIJI) {
>>>>>>               int err;
>>>>>>               uint32_t fw_ver;
>>>>>> -            err = request_firmware(&adev->pm.fw, 
>>>>>> "amdgpu/fiji_smc.bin", adev->dev);
>>>>>> +            err = firmware_request_nowarn(&adev->pm.fw, 
>>>>>> "amdgpu/fiji_smc.bin", adev->dev);
>>>>>>               /* force vPost if error occured */
>>>>>>               if (err)
>>>>>>                   return true;
>>>>>> @@ -1133,7 +1133,7 @@ static int 
>>>>>> amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->firmware.gpu_info_fw, 
>>>>>> fw_name, adev->dev);
>>>>>>       if (err) {
>>>>>>           dev_err(adev->dev,
>>>>>>               "Failed to load gpu_info firmware \"%s\"\n",
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>>>> index 30b5500dc152..0acd1f3d14c8 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>>>> @@ -196,7 +196,7 @@ enum AMDGPU_UCODE_STATUS {
>>>>>>   struct amdgpu_firmware_info {
>>>>>>       /* ucode ID */
>>>>>>       enum AMDGPU_UCODE_ID ucode_id;
>>>>>> -    /* request_firmware */
>>>>>> +    /* firmware_request */
>>>>>>       const struct firmware *fw;
>>>>>>       /* starting mc address */
>>>>>>       uint64_t mc_addr;
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>>>> index b2eae86bf906..4de018d45081 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>>>> @@ -171,7 +171,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device 
>>>>>> *adev)
>>>>>>           return -EINVAL;
>>>>>>       }
>>>>>> -    r = request_firmware(&adev->uvd.fw, fw_name, adev->dev);
>>>>>> +    r = firmware_request_nowarn(&adev->uvd.fw, fw_name, adev->dev);
>>>>>>       if (r) {
>>>>>>           dev_err(adev->dev, "amdgpu_uvd: Can't load firmware 
>>>>>> \"%s\"\n",
>>>>>>               fw_name);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>>>> index d274ae535530..b6af824a2f44 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>>>> @@ -138,7 +138,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device 
>>>>>> *adev, unsigned long size)
>>>>>>           return -EINVAL;
>>>>>>       }
>>>>>> -    r = request_firmware(&adev->vce.fw, fw_name, adev->dev);
>>>>>> +    r = firmware_request_nowarn(&adev->vce.fw, fw_name, adev->dev);
>>>>>>       if (r) {
>>>>>>           dev_err(adev->dev, "amdgpu_vce: Can't load firmware 
>>>>>> \"%s\"\n",
>>>>>>               fw_name);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>>>> index 837962118dbc..bd650b87e281 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>>>> @@ -67,7 +67,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
>>>>>>           return -EINVAL;
>>>>>>       }
>>>>>> -    r = request_firmware(&adev->vcn.fw, fw_name, adev->dev);
>>>>>> +    r = firmware_request_nowarn(&adev->vcn.fw, fw_name, adev->dev);
>>>>>>       if (r) {
>>>>>>           dev_err(adev->dev, "amdgpu_vcn: Can't load firmware 
>>>>>> \"%s\"\n",
>>>>>>               fw_name);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>>>> index a0943aa8d1d3..95e1edc1311d 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>>>> @@ -5849,7 +5849,7 @@ static int ci_dpm_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>>>> index 6e8278e689b1..93c8acca0360 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>>>> @@ -135,7 +135,7 @@ static int cik_sdma_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "radeon/%s_sdma.bin", chip_name);
>>>>>>           else
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "radeon/%s_sdma1.bin", chip_name);
>>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>>> fw_name, adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           if (err)
>>>>>>               goto out;
>>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>>>> index 9870d83b68c1..8aebab5edf15 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>>>> @@ -335,7 +335,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>>>> @@ -346,7 +346,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       adev->gfx.pfp_feature_version = 
>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>>>> @@ -357,7 +357,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       adev->gfx.me_feature_version = 
>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>>>> @@ -368,7 +368,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       adev->gfx.ce_feature_version = 
>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>>>> index a066c5eda135..35a0e46464a5 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>>>> @@ -926,7 +926,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>>>> @@ -934,7 +934,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>           goto out;
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>>>> @@ -942,7 +942,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>           goto out;
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>>>> @@ -950,7 +950,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>           goto out;
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>>>>> @@ -959,7 +959,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       if (adev->asic_type == CHIP_KAVERI) {
>>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", 
>>>>>> chip_name);
>>>>>> -        err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           if (err)
>>>>>>               goto out;
>>>>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>>> @@ -968,7 +968,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>>>> index 4e694ae9f308..c16cd96a1557 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>>>> @@ -936,14 +936,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>>> CHIP_POLARIS12) {
>>>>>>           snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_pfp_2.bin", chip_name);
>>>>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>           if (err == -ENOENT) {
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_pfp.bin", chip_name);
>>>>>> -            err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +            err = firmware_request_nowarn(&adev->gfx.pfp_fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           }
>>>>>>       } else {
>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>>>>> chip_name);
>>>>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       }
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>> @@ -956,14 +956,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>>> CHIP_POLARIS12) {
>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me_2.bin", 
>>>>>> chip_name);
>>>>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>           if (err == -ENOENT) {
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_me.bin", chip_name);
>>>>>> -            err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +            err = firmware_request_nowarn(&adev->gfx.me_fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           }
>>>>>>       } else {
>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>>>>> chip_name);
>>>>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       }
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>> @@ -977,14 +977,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>>> CHIP_POLARIS12) {
>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce_2.bin", 
>>>>>> chip_name);
>>>>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>           if (err == -ENOENT) {
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_ce.bin", chip_name);
>>>>>> -            err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +            err = firmware_request_nowarn(&adev->gfx.ce_fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           }
>>>>>>       } else {
>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>>>>> chip_name);
>>>>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       }
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>> @@ -1007,7 +1007,7 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>           adev->virt.chained_ib_support = false;
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>>> @@ -1057,14 +1057,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>>> CHIP_POLARIS12) {
>>>>>>           snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_mec_2.bin", chip_name);
>>>>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>           if (err == -ENOENT) {
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_mec.bin", chip_name);
>>>>>> -            err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +            err = firmware_request_nowarn(&adev->gfx.mec_fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           }
>>>>>>       } else {
>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>>>>> chip_name);
>>>>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       }
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>> @@ -1079,14 +1079,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>           (adev->asic_type != CHIP_TOPAZ)) {
>>>>>>           if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type 
>>>>>> <= CHIP_POLARIS12) {
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_mec2_2.bin", chip_name);
>>>>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>>> fw_name, adev->dev);
>>>>>>               if (err == -ENOENT) {
>>>>>>                   snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_mec2.bin", chip_name);
>>>>>> -                err = request_firmware(&adev->gfx.mec2_fw, 
>>>>>> fw_name, adev->dev);
>>>>>> +                err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>>> fw_name, adev->dev);
>>>>>>               }
>>>>>>           } else {
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_mec2.bin", chip_name);
>>>>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>>>> adev->dev);
>>>>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           }
>>>>>>           if (!err) {
>>>>>>               err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>>>> index c06479615e8a..9f70012c81ad 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>>>> @@ -370,7 +370,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>>>> @@ -381,7 +381,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       adev->gfx.pfp_feature_version = 
>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>>>> @@ -392,7 +392,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       adev->gfx.me_feature_version = 
>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>>>> @@ -403,7 +403,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       adev->gfx.ce_feature_version = 
>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>>> @@ -449,7 +449,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>           adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>>>>> @@ -461,7 +461,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (!err) {
>>>>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>>>           if (err)
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>>>> index 8e28270d1ea9..4192a5a0c444 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>>>> @@ -136,7 +136,7 @@ static int gmc_v6_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin");
>>>>>>       else
>>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>>>> index 86e9d682c59e..06deba7f707d 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>>>> @@ -151,7 +151,7 @@ static int gmc_v7_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       else
>>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>>>> index 9a813d834f1a..cbce96198dbc 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>>>> @@ -235,7 +235,7 @@ static int gmc_v8_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>>>> index 5a9fe24697f9..718722ef1835 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>>>> @@ -105,7 +105,7 @@ int psp_v10_0_init_microcode(struct 
>>>>>> psp_context *psp)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>>>> index 19bd1934e63d..dd5261577d9b 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>>>> @@ -111,7 +111,7 @@ int psp_v3_1_init_microcode(struct psp_context 
>>>>>> *psp)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->psp.sos_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>> @@ -131,7 +131,7 @@ int psp_v3_1_init_microcode(struct psp_context 
>>>>>> *psp)
>>>>>>                   le32_to_cpu(hdr->sos_offset_bytes);
>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>>>>> adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>>>> index d4787ad4d346..a2afbaacc7e5 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>>>> @@ -146,7 +146,7 @@ static int sdma_v2_4_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>>>           else
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>>> fw_name, adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           if (err)
>>>>>>               goto out;
>>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>>>> index 521978c40537..75d2a9cc9268 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>>>> @@ -298,7 +298,7 @@ static int sdma_v3_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>>>           else
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>>> fw_name, adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           if (err)
>>>>>>               goto out;
>>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>>>> index 91cf95a8c39c..e1ebfb9e2650 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>>>> @@ -176,7 +176,7 @@ static int sdma_v4_0_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>>>           else
>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>>> fw_name, adev->dev);
>>>>>> +        err = firmware_request_nowarn(&adev->sdma.instance[i].fw, 
>>>>>> fw_name, adev->dev);
>>>>>>           if (err)
>>>>>>               goto out;
>>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>>>> index ce675a7f179a..5538a5269417 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>>>> @@ -7687,7 +7687,7 @@ static int si_dpm_init_microcode(struct 
>>>>>> amdgpu_device *adev)
>>>>>>       }
>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>>>>> chip_name);
>>>>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>>>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, adev->dev);
>>>>>>       if (err)
>>>>>>           goto out;
>>>>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>>>>
>>>
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware
  2018-04-17 16:41             ` Andres Rodriguez
@ 2018-04-17 16:50               ` Andres Rodriguez
  0 siblings, 0 replies; 17+ messages in thread
From: Andres Rodriguez @ 2018-04-17 16:50 UTC (permalink / raw)
  To: Christian König, linux-kernel
  Cc: andresx7, gregkh, mcgrof, alexdeucher, kvalo, arend.vanspriel



On 2018-04-17 12:41 PM, Andres Rodriguez wrote:
> 
> 
> On 2018-04-17 11:52 AM, Christian König wrote:
>> Am 17.04.2018 um 17:41 schrieb Andres Rodriguez:
>>>
>>>
>>> On 2018-04-17 11:33 AM, Christian König wrote:
>>>> Am 17.04.2018 um 17:07 schrieb Andres Rodriguez:
>>>>>
>>>>>
>>>>> On 2018-04-17 04:48 AM, Christian König wrote:
>>>>>> Well this is a rather big NAK for this patch.
>>>>>>
>>>>>> Only a small fraction of the firmware files amdgpu uses are 
>>>>>> actually optional (the ones with the *_2.bin name). All other 
>>>>>> files are mandatory for correct driver operation.
>>>>>>
>>>>>> There is a fallback when actually no firmware files at all are 
>>>>>> found, in this case we at least try to get a picture on the screen 
>>>>>> so that the user gets a hint on what is wrong. But this path isn't 
>>>>>> tested well and breaks from time to time.
>>>>>>
>>>>>> So when you get a message like "Direct firmware load for * failed 
>>>>>> with error -2" even if it's one of the "*_2.bin" files that is a 
>>>>>> clear hint that you should update your firmware package.
>>>>>
>>>>> The amdgpu driver already provides clear messages when a required 
>>>>> firmware file is not found. After request_firmware() returns an 
>>>>> error, we will print:
>>>>> "{ip_name}: Failed to load firmware {fw_name}"
>>>>>
>>>>> When the firmware is optional, we won't print that message, and 
>>>>> handle the firmware load in an appropriate way (re-use _1 firmware 
>>>>> for_2 etc.)
>>>>>
>>>>> Note that we care about informing the user *only* if the firmware 
>>>>> was not found. If the firmware ends up coming from the fallback 
>>>>> loader, but we do receive it, then we don't really care.
>>>>
>>>> And that is exactly what I disagree on. Even when we used the 
>>>> fallback there should definitely be an error message that the real 
>>>> firmware wasn't found
>>>
>>> The request_firmware() fallback does fetch the real firmware. Why 
>>> should a user configuration knob produce an error message if the 
>>> behaviour is valid?
>>
>> Because the behavior isn't valid.
>>
>> We ran the fallback path which is not optimal and the user should 
>> consider installing the missing firmware. There definitely should be a 
>> message about that.
> 
> I think I misused the word fallback and that has led to some confusion, 
> sorry about that. There is the fallback path inside request_firmware() 
> (formerly known as the usermode helper), and there is the fallback path 
> in amdgpu.
> 
> The first, if request_firmware() can't find built-in firmware it can 
> query the usermodehelper for the file and retrieve it. This will result 
> in the real firmware file being retrieved and optimal behaviour from the 
> amdgpu side. In this case request_firmware() returns success.
> 
> The second, if request_firmware() completely fails, we will try some 
> strategies like loading the firmware of the primary engine into the 
> secondary engine. Or disabling the engine, etc. This leads to less than 
> optimal behaviour in some cases, and we should warn the user 
> appropriately. We do produce errors where appropriate in this scenario 
> inside amdgpu.
> 
> Maybe I'm going a bit overzealous here trying two kill two birds with 
> one stone. There are two cases that I wanted to improve on the amdgpu side:
> 
> First case, Usermodehelper: disabled - Firmware: not found, but optional
> ------------------------------------------------------------------------
> 
> This was my main motivation for writing these changes. In this scenario 
> we would get the "Direct firmware load failed with error..." message. 
> And then the driver would self correct and load correctly.
> 
> For some combinations of ASICs + fw files this is expected behaviour, 
> e.g. mec_2.bin on polaris10. And having that error message in the kernel 
> log would lead users to think there is something wrong with their 
> firmware install, when in reality everything is ok.
> 
> Second case, Usermodehelper: enabled - Firmware: found
> ------------------------------------------------------
> 
> This is where I might be overextending myself, but I think we do have an 
> opportunity for a big improvement.
> 
> In this scenario we will produce the output:
> "Direct firmware load for * failed with error -2"
> "Falling back to user helper"
> 
> I don't think those messages are particularly useful in the amdgpu case. 
> If the user configured their system to use the usermodehelper, why 
> should we be producing two*n_firmware_files lines of spew for regular 
> operation? That is a lot of message flooding, and I don't see the purpose.
> 
> If the intent of the message is to help the user know that they need to 
> install/update their linux-firmware package, then we have the error 
> message:
> "{ip_name}: Failed to load firmware {fw_name}"
> 
> And that should point the user in the proper direction to fix their issue.
> 

I should also point out, I'm not a user of the usermodehelper and I 
don't really like it much as a configuration option. I think most 
distros have phased it out (or are in the process of).

So, while I would prefer if we take the approach of switching everything 
to _nowarn(), I wouldn't be opposed to switching just the optional 
firmware files.

Regards,
Andres


> Regards,
> Andres
> 
> 
>>
>> I agree that it's also a good idea to note that we hit the fallback 
>> and not only that the firmware was missing, but that is a different 
>> issue.
>>
>> Additional to that it isn't the job of the driver to print messages 
>> about missing firmware, so the extra message about that should be 
>> removed.
>>
> 
>> Regards,
>> Christian.
>>
>>>
>>> Regards,
>>> Andres
>>>
>>>
>>>>
>>>> We should probably add a message that the fallback is used and 
>>>> remove the error message that the firmware couldn't be loaded.
>>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>>>
>>>>> This is specially important since we don't print a success message 
>>>>> on firmware load. So if we hit the fallback loader, the user will 
>>>>> see a warning followed by silence, so it could cause confusion on 
>>>>> whether the firmware load succeed or not.
>>>>>
>>>>> These are my 2c in the matter.
>>>>>
>>>>> Regards,
>>>>> Andres
>>>>>
>>>>>
>>>>>>
>>>>>> Regards,
>>>>>> Christian.
>>>>>>
>>>>>> Am 17.04.2018 um 00:24 schrieb Andres Rodriguez:
>>>>>>> Currently, during the normal boot process the amdgpu driver will 
>>>>>>> produce
>>>>>>> spew like the following in dmesg:
>>>>>>> Direct firmware load for amdgpu/polaris10_mec_2.bin failed with 
>>>>>>> error -2
>>>>>>>
>>>>>>> This happens when amdgpu tries to load optional firmware files. 
>>>>>>> So the
>>>>>>> error does not affect the startup sequence.
>>>>>>>
>>>>>>> This patch switches the amdgpu to use firmware_request_nowarn(), 
>>>>>>> which
>>>>>>> will not produce the warnings mentioned above. Hopefully 
>>>>>>> resulting in a
>>>>>>> cleaner bootup log.
>>>>>>>
>>>>>>> Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
>>>>>>> ---
>>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c    |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--
>>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h  |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c    |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c    |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c    |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/ci_dpm.c        |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/cik_sdma.c      |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c      |  8 ++++----
>>>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c      | 12 +++++------
>>>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c      | 32 
>>>>>>> +++++++++++++++---------------
>>>>>>>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c      | 12 +++++------
>>>>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c      |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c      |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c      |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/psp_v10_0.c     |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/psp_v3_1.c      |  4 ++--
>>>>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c     |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c     |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c     |  2 +-
>>>>>>>   drivers/gpu/drm/amd/amdgpu/si_dpm.c        |  2 +-
>>>>>>>   21 files changed, 51 insertions(+), 51 deletions(-)
>>>>>>>
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>>>>> index 4466f3535e2d..6c950811c0a5 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
>>>>>>> @@ -811,7 +811,7 @@ static int 
>>>>>>> amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
>>>>>>>                   return -EINVAL;
>>>>>>>               }
>>>>>>> -            err = request_firmware(&adev->pm.fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +            err = firmware_request_nowarn(&adev->pm.fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>               if (err) {
>>>>>>>                   DRM_ERROR("Failed to request firmware\n");
>>>>>>>                   return err;
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>>>>> index af1b879a9ee9..d6225619e69f 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>>>>>>> @@ -696,7 +696,7 @@ bool amdgpu_device_need_post(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>           if (adev->asic_type == CHIP_FIJI) {
>>>>>>>               int err;
>>>>>>>               uint32_t fw_ver;
>>>>>>> -            err = request_firmware(&adev->pm.fw, 
>>>>>>> "amdgpu/fiji_smc.bin", adev->dev);
>>>>>>> +            err = firmware_request_nowarn(&adev->pm.fw, 
>>>>>>> "amdgpu/fiji_smc.bin", adev->dev);
>>>>>>>               /* force vPost if error occured */
>>>>>>>               if (err)
>>>>>>>                   return true;
>>>>>>> @@ -1133,7 +1133,7 @@ static int 
>>>>>>> amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_gpu_info.bin", chip_name);
>>>>>>> -    err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->firmware.gpu_info_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>       if (err) {
>>>>>>>           dev_err(adev->dev,
>>>>>>>               "Failed to load gpu_info firmware \"%s\"\n",
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>>>>> index 30b5500dc152..0acd1f3d14c8 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
>>>>>>> @@ -196,7 +196,7 @@ enum AMDGPU_UCODE_STATUS {
>>>>>>>   struct amdgpu_firmware_info {
>>>>>>>       /* ucode ID */
>>>>>>>       enum AMDGPU_UCODE_ID ucode_id;
>>>>>>> -    /* request_firmware */
>>>>>>> +    /* firmware_request */
>>>>>>>       const struct firmware *fw;
>>>>>>>       /* starting mc address */
>>>>>>>       uint64_t mc_addr;
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>>>>> index b2eae86bf906..4de018d45081 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>>>>>> @@ -171,7 +171,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device 
>>>>>>> *adev)
>>>>>>>           return -EINVAL;
>>>>>>>       }
>>>>>>> -    r = request_firmware(&adev->uvd.fw, fw_name, adev->dev);
>>>>>>> +    r = firmware_request_nowarn(&adev->uvd.fw, fw_name, adev->dev);
>>>>>>>       if (r) {
>>>>>>>           dev_err(adev->dev, "amdgpu_uvd: Can't load firmware 
>>>>>>> \"%s\"\n",
>>>>>>>               fw_name);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>>>>> index d274ae535530..b6af824a2f44 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>>>>>>> @@ -138,7 +138,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device 
>>>>>>> *adev, unsigned long size)
>>>>>>>           return -EINVAL;
>>>>>>>       }
>>>>>>> -    r = request_firmware(&adev->vce.fw, fw_name, adev->dev);
>>>>>>> +    r = firmware_request_nowarn(&adev->vce.fw, fw_name, adev->dev);
>>>>>>>       if (r) {
>>>>>>>           dev_err(adev->dev, "amdgpu_vce: Can't load firmware 
>>>>>>> \"%s\"\n",
>>>>>>>               fw_name);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>>>>> index 837962118dbc..bd650b87e281 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>>>>>>> @@ -67,7 +67,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
>>>>>>>           return -EINVAL;
>>>>>>>       }
>>>>>>> -    r = request_firmware(&adev->vcn.fw, fw_name, adev->dev);
>>>>>>> +    r = firmware_request_nowarn(&adev->vcn.fw, fw_name, adev->dev);
>>>>>>>       if (r) {
>>>>>>>           dev_err(adev->dev, "amdgpu_vcn: Can't load firmware 
>>>>>>> \"%s\"\n",
>>>>>>>               fw_name);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>>>>> index a0943aa8d1d3..95e1edc1311d 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
>>>>>>> @@ -5849,7 +5849,7 @@ static int ci_dpm_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>>>>> index 6e8278e689b1..93c8acca0360 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>>>>>>> @@ -135,7 +135,7 @@ static int cik_sdma_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "radeon/%s_sdma.bin", chip_name);
>>>>>>>           else
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "radeon/%s_sdma1.bin", chip_name);
>>>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>> +        err = 
>>>>>>> firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>           if (err)
>>>>>>>               goto out;
>>>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>>>>> index 9870d83b68c1..8aebab5edf15 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>>>>>> @@ -335,7 +335,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>>>>> @@ -346,7 +346,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       adev->gfx.pfp_feature_version = 
>>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>>>>> @@ -357,7 +357,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       adev->gfx.me_feature_version = 
>>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>>>>> @@ -368,7 +368,7 @@ static int gfx_v6_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       adev->gfx.ce_feature_version = 
>>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>>>>> index a066c5eda135..35a0e46464a5 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>>>>>> @@ -926,7 +926,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>>>>> @@ -934,7 +934,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>           goto out;
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>>>>> @@ -942,7 +942,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>           goto out;
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>>>>> @@ -950,7 +950,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>           goto out;
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>>>>>> @@ -959,7 +959,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       if (adev->asic_type == CHIP_KAVERI) {
>>>>>>>           snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "radeon/%s_mec2.bin", chip_name);
>>>>>>> -        err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +        err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>           if (err)
>>>>>>>               goto out;
>>>>>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>>>> @@ -968,7 +968,7 @@ static int gfx_v7_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>>>>> index 4e694ae9f308..c16cd96a1557 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>>>>>> @@ -936,14 +936,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>>>> CHIP_POLARIS12) {
>>>>>>>           snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_pfp_2.bin", chip_name);
>>>>>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>           if (err == -ENOENT) {
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_pfp.bin", chip_name);
>>>>>>> -            err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +            err = firmware_request_nowarn(&adev->gfx.pfp_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>           }
>>>>>>>       } else {
>>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>>>>>> chip_name);
>>>>>>> -        err = request_firmware(&adev->gfx.pfp_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +        err = firmware_request_nowarn(&adev->gfx.pfp_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>       }
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>> @@ -956,14 +956,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>>>> CHIP_POLARIS12) {
>>>>>>>           snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_me_2.bin", chip_name);
>>>>>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>           if (err == -ENOENT) {
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_me.bin", chip_name);
>>>>>>> -            err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +            err = firmware_request_nowarn(&adev->gfx.me_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>           }
>>>>>>>       } else {
>>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>>>>>> chip_name);
>>>>>>> -        err = request_firmware(&adev->gfx.me_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +        err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       }
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>> @@ -977,14 +977,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>>>> CHIP_POLARIS12) {
>>>>>>>           snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_ce_2.bin", chip_name);
>>>>>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>           if (err == -ENOENT) {
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_ce.bin", chip_name);
>>>>>>> -            err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +            err = firmware_request_nowarn(&adev->gfx.ce_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>           }
>>>>>>>       } else {
>>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>>>>>> chip_name);
>>>>>>> -        err = request_firmware(&adev->gfx.ce_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +        err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       }
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>> @@ -1007,7 +1007,7 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>           adev->virt.chained_ib_support = false;
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>>>> @@ -1057,14 +1057,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= 
>>>>>>> CHIP_POLARIS12) {
>>>>>>>           snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_mec_2.bin", chip_name);
>>>>>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>           if (err == -ENOENT) {
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_mec.bin", chip_name);
>>>>>>> -            err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +            err = firmware_request_nowarn(&adev->gfx.mec_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>           }
>>>>>>>       } else {
>>>>>>>           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>>>>>> chip_name);
>>>>>>> -        err = request_firmware(&adev->gfx.mec_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +        err = firmware_request_nowarn(&adev->gfx.mec_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>       }
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>> @@ -1079,14 +1079,14 @@ static int gfx_v8_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>           (adev->asic_type != CHIP_TOPAZ)) {
>>>>>>>           if (adev->asic_type >= CHIP_POLARIS10 && 
>>>>>>> adev->asic_type <= CHIP_POLARIS12) {
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_mec2_2.bin", chip_name);
>>>>>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>               if (err == -ENOENT) {
>>>>>>>                   snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_mec2.bin", chip_name);
>>>>>>> -                err = request_firmware(&adev->gfx.mec2_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>> +                err = 
>>>>>>> firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, adev->dev);
>>>>>>>               }
>>>>>>>           } else {
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_mec2.bin", chip_name);
>>>>>>> -            err = request_firmware(&adev->gfx.mec2_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>> +            err = firmware_request_nowarn(&adev->gfx.mec2_fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>>           }
>>>>>>>           if (!err) {
>>>>>>>               err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>>>>> index c06479615e8a..9f70012c81ad 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>>>>>> @@ -370,7 +370,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.pfp_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
>>>>>>> @@ -381,7 +381,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       adev->gfx.pfp_feature_version = 
>>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.me_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.me_fw);
>>>>>>> @@ -392,7 +392,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       adev->gfx.me_feature_version = 
>>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.ce_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.ce_fw);
>>>>>>> @@ -403,7 +403,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       adev->gfx.ce_feature_version = 
>>>>>>> le32_to_cpu(cp_hdr->ucode_feature_version);
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.rlc_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
>>>>>>> @@ -449,7 +449,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>           adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.mec_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->gfx.mec_fw);
>>>>>>> @@ -461,7 +461,7 @@ static int gfx_v9_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->gfx.mec2_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (!err) {
>>>>>>>           err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
>>>>>>>           if (err)
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>>>>> index 8e28270d1ea9..4192a5a0c444 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>>>>>>> @@ -136,7 +136,7 @@ static int gmc_v6_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin");
>>>>>>>       else
>>>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>>>>> index 86e9d682c59e..06deba7f707d 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>>>>>>> @@ -151,7 +151,7 @@ static int gmc_v7_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       else
>>>>>>>           snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>>>>> index 9a813d834f1a..cbce96198dbc 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>>>>>>> @@ -235,7 +235,7 @@ static int gmc_v8_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->mc.fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->mc.fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>>>>> index 5a9fe24697f9..718722ef1835 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
>>>>>>> @@ -105,7 +105,7 @@ int psp_v10_0_init_microcode(struct 
>>>>>>> psp_context *psp)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>>>>> index 19bd1934e63d..dd5261577d9b 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
>>>>>>> @@ -111,7 +111,7 @@ int psp_v3_1_init_microcode(struct 
>>>>>>> psp_context *psp)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->psp.sos_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>> @@ -131,7 +131,7 @@ int psp_v3_1_init_microcode(struct 
>>>>>>> psp_context *psp)
>>>>>>>                   le32_to_cpu(hdr->sos_offset_bytes);
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->psp.asd_fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>>>>> index d4787ad4d346..a2afbaacc7e5 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>>>>>>> @@ -146,7 +146,7 @@ static int sdma_v2_4_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>>>>           else
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>> +        err = 
>>>>>>> firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>           if (err)
>>>>>>>               goto out;
>>>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>>>>> index 521978c40537..75d2a9cc9268 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>>>>>>> @@ -298,7 +298,7 @@ static int sdma_v3_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>>>>           else
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>> +        err = 
>>>>>>> firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>           if (err)
>>>>>>>               goto out;
>>>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>>>>> index 91cf95a8c39c..e1ebfb9e2650 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>>>>>>> @@ -176,7 +176,7 @@ static int sdma_v4_0_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_sdma.bin", chip_name);
>>>>>>>           else
>>>>>>>               snprintf(fw_name, sizeof(fw_name), 
>>>>>>> "amdgpu/%s_sdma1.bin", chip_name);
>>>>>>> -        err = request_firmware(&adev->sdma.instance[i].fw, 
>>>>>>> fw_name, adev->dev);
>>>>>>> +        err = 
>>>>>>> firmware_request_nowarn(&adev->sdma.instance[i].fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>           if (err)
>>>>>>>               goto out;
>>>>>>>           err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>>>>> index ce675a7f179a..5538a5269417 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
>>>>>>> @@ -7687,7 +7687,7 @@ static int si_dpm_init_microcode(struct 
>>>>>>> amdgpu_device *adev)
>>>>>>>       }
>>>>>>>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", 
>>>>>>> chip_name);
>>>>>>> -    err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
>>>>>>> +    err = firmware_request_nowarn(&adev->pm.fw, fw_name, 
>>>>>>> adev->dev);
>>>>>>>       if (err)
>>>>>>>           goto out;
>>>>>>>       err = amdgpu_ucode_validate(adev->pm.fw);
>>>>>>
>>>>
>>

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2018-04-17 16:50 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-16 22:24 [PATCH 0/8] Loading optional firmware v2 Andres Rodriguez
2018-04-16 22:24 ` [PATCH 1/8] firmware: some documentation fixes Andres Rodriguez
2018-04-16 22:24 ` [PATCH 2/8] firmware: wrap FW_OPT_* into an enum Andres Rodriguez
2018-04-16 22:24 ` [PATCH 3/8] firmware: add kernel-doc for enum fw_opt Andres Rodriguez
2018-04-16 22:24 ` [PATCH 4/8] firmware: add functions to load firmware without warnings v3 Andres Rodriguez
2018-04-16 22:52   ` Randy Dunlap
2018-04-16 22:24 ` [PATCH 5/8] firmware: print firmware name on fallback path Andres Rodriguez
2018-04-16 22:24 ` [PATCH 6/8] drm/amdgpu: use firmware_request_nowarn to load firmware Andres Rodriguez
2018-04-17  8:48   ` Christian König
2018-04-17 15:07     ` Andres Rodriguez
2018-04-17 15:33       ` Christian König
2018-04-17 15:41         ` Andres Rodriguez
2018-04-17 15:52           ` Christian König
2018-04-17 16:41             ` Andres Rodriguez
2018-04-17 16:50               ` Andres Rodriguez
2018-04-16 22:24 ` [PATCH 7/8] ath10k: use request_firmware_nowarn " Andres Rodriguez
2018-04-16 22:24 ` [PATCH 8/8] brcmfmac: use request_firmware_nowait2 to load firmware without warnings Andres Rodriguez

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).