Hi Andres, sorry for the delayed response. First on vacation and now on sick leave :( Please see below. Am 20.04.2018 um 21:35 schrieb Andres Rodriguez: > Ping. > > On 2018-04-17 06:12 PM, Andres Rodriguez wrote: >> Add a new function amdgpu_ucode_request_firmware() that encapsulates a >> lot of the common behaviour we have around firmware requests. >> >> This is the first step in my quest to get rid of the following annoying >> messages when my polaris10 boots up: >> [   0.558537] amdgpu 0000:01:00.0: Direct firmware load for >> amdgpu/polaris10_pfp_2.bin failed with error -2 >> [   0.558551] amdgpu 0000:01:00.0: Direct firmware load for >> amdgpu/polaris10_me_2.bin failed with error -2 >> [   0.558562] amdgpu 0000:01:00.0: Direct firmware load for >> amdgpu/polaris10_ce_2.bin failed with error -2 >> [   0.558580] amdgpu 0000:01:00.0: Direct firmware load for >> amdgpu/polaris10_mec_2.bin failed with error -2 >> [   0.558619] amdgpu 0000:01:00.0: Direct firmware load for >> amdgpu/polaris10_mec2_2.bin failed with error -2 >> >> v2: make amdgpu_ucode_validate file scope only >>     add kernel-doc for amdgpu_ucode_request_firmware() >> >> Signed-off-by: Andres Rodriguez <andresx7 at gmail.com> >> --- >> >> Sorry for the quick V2, noticed some docs might help and that >> _validate() could be reduced in scope. Pasting my old message >> again just in case. >> >> Hey Christian, >> >> Wanted to go through a cleanup of the ucode loading in amdgpu >> to facilitate some of our heated discussions :) >> >> For now, functionality should remain the same. Once _nowarn() >> lands we can change amdgpu_ucode_request_firmware() with either: >> >> Alternative A: >> -      err = request_firmware(&loaded_fw, name, adev->dev); >> +      err = request_firmware_nowarn(&loaded_fw, name, adev->dev); >> >> Alternative B: >> -      err = request_firmware(&loaded_fw, name, adev->dev); >> +      if (optional) >> +              err = request_firmware_nowarn(&loaded_fw, name, >> adev->dev); >> +      else >> +              err = request_firmware(&loaded_fw, name, adev->dev); >> >> I prefer A, but I'm not opposed to B. I'll leave it up to you. Both would work for me. I just have two rather simple requirements on the handling: 1. If we fail to load a firmware and don't have a fallback we print a big error message. Preferable that comes from the request_firmware() call (so prefers solution B). 2. If we fail to load a firmware, but have a fallback which loads fine we print a warning that this might not be the desired behavior. I'm perfectly fine if we use request_firmware_nowarn() for the optional firmware, but when that fails amdgpu should then print the warning. Thanks, Christian. >> >> Regards, >> Andres >> >>  drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c   | 14 +--- >>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 16 +---- >>  drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 74 ++++++++++++++++--- >>  drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h |  4 +- >>  drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c   | 16 +---- >>  drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c   | 16 +---- >>  drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c   | 16 +---- >>  drivers/gpu/drm/amd/amdgpu/ci_dpm.c       | 15 +--- >>  drivers/gpu/drm/amd/amdgpu/cik_sdma.c     |  5 +- >>  drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c     | 19 ++--- >>  drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c     | 30 ++------ >>  drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c     | 112 >> +++++++++++++---------------- >>  drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c     | 39 +++------- >>  drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c     | 17 +---- >>  drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c     | 14 +--- >>  drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c     | 14 +--- >>  drivers/gpu/drm/amd/amdgpu/psp_v10_0.c    | 18 +---- >>  drivers/gpu/drm/amd/amdgpu/psp_v3_1.c     | 15 +--- >>  drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c    |  6 +- >>  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c    |  6 +- >>  drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c    |  7 +- >>  drivers/gpu/drm/amd/amdgpu/si_dpm.c       | 16 +---- >>  22 files changed, 164 insertions(+), 325 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c >> index a8a942c60ea2..347ab1710523 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c >> @@ -402,19 +402,9 @@ static int amdgpu_cgs_get_firmware_info(struct >> cgs_device *cgs_device, >>                  return -EINVAL; >>              } >>  -           err = request_firmware(&adev->pm.fw, fw_name, adev->dev); >> -           if (err) { >> -               DRM_ERROR("Failed to request firmware\n"); >> +           err = amdgpu_ucode_request_firmware(adev, &adev->pm.fw, >> fw_name, false); >> +           if (err) >>                  return err; >> -           } >> - >> -           err = amdgpu_ucode_validate(adev->pm.fw); >> -           if (err) { >> -               DRM_ERROR("Failed to load firmware \"%s\"", fw_name); >> -               release_firmware(adev->pm.fw); >> -               adev->pm.fw = NULL; >> -               return err; >> -           } >>               if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { >>                  ucode = &adev->firmware.ucode[AMDGPU_UCODE_ID_SMC]; >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> index abc33464959e..967e14f14abc 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> @@ -1355,20 +1355,10 @@ 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); >> -   if (err) { >> -       dev_err(adev->dev, >> -           "Failed to load gpu_info firmware \"%s\"\n", >> -           fw_name); >> +   err = amdgpu_ucode_request_firmware(adev, >> &adev->firmware.gpu_info_fw, >> +                       fw_name, false); >> +   if (err) >>          goto out; >> -   } >> -   err = amdgpu_ucode_validate(adev->firmware.gpu_info_fw); >> -   if (err) { >> -       dev_err(adev->dev, >> -           "Failed to validate gpu_info firmware \"%s\"\n", >> -           fw_name); >> -       goto out; >> -   } >>       hdr = (const struct gpu_info_firmware_header_v1_0 >> *)adev->firmware.gpu_info_fw->data; >>      amdgpu_ucode_print_gpu_info_hdr(&hdr->header); >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c >> index dd6f98921918..b9cb8a488d3e 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c >> @@ -28,6 +28,70 @@ >>  #include "amdgpu.h" >>  #include "amdgpu_ucode.h" >>  +static int amdgpu_ucode_validate(const struct firmware *fw) >> +{ >> +   const struct common_firmware_header *hdr = >> +       (const struct common_firmware_header *)fw->data; >> + >> +   if (fw->size == le32_to_cpu(hdr->size_bytes)) >> +       return 0; >> + >> +   return -EINVAL; >> +} >> + >> +/** >> + * amdgpu_ucode_request_firmware() - request a firmware binary file >> + * >> + * @adev: amdgpu_device pointer >> + * @fw: will be populated with the firmware on success, NULL on failure >> + * @name: name of the firmware file to load >> + * @optional: signal we are loading a non-essential fw file. >> + * >> + * When loading optional firmware, if the file is not found it will not >> + * be treated as an error. However, if the file is found, but we >> encounter >> + * validation or other errors, this function will return failure. >> + * >> + * Returns 0 on success, errno on failure >> + */ >> +int amdgpu_ucode_request_firmware(struct amdgpu_device *adev, >> +                 const struct firmware **fw, >> +                 const char *name, bool optional) >> +{ >> +   int err; >> +   const struct firmware *loaded_fw = NULL; >> + >> +   if (!fw) >> +       return -EINVAL; >> + >> +   err = request_firmware(&loaded_fw, name, adev->dev); >> +   if (err) >> +       goto error; >> + >> +   err = amdgpu_ucode_validate(loaded_fw); >> +   if (err) >> +       goto error; >> + >> +   *fw = loaded_fw; >> +   return err; >> + >> +error: >> +   if (loaded_fw) >> +       release_firmware(loaded_fw); >> + >> +   if (!optional) >> +       dev_err(adev->dev, "failed to load firmware %s\n", name); >> + >> +   // Nothing useful was loaded >> +   *fw = NULL; >> + >> +   // If we can't find optional FW, don't return an error >> +   if (optional && !loaded_fw) >> +       err = 0; >> + >> +   return err; >> +} >> + >> + >>  static void amdgpu_ucode_print_common_hdr(const struct >> common_firmware_header *hdr) >>  { >>      DRM_DEBUG("size_bytes: %u\n", le32_to_cpu(hdr->size_bytes)); >> @@ -218,16 +282,6 @@ void amdgpu_ucode_print_gpu_info_hdr(const >> struct common_firmware_header *hdr) >>      } >>  } >>  -int amdgpu_ucode_validate(const struct firmware *fw) >> -{ >> -   const struct common_firmware_header *hdr = >> -       (const struct common_firmware_header *)fw->data; >> - >> -   if (fw->size == le32_to_cpu(hdr->size_bytes)) >> -       return 0; >> - >> -   return -EINVAL; >> -} >>   bool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr, >>                  uint16_t hdr_major, uint16_t hdr_minor) >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h >> index 30b5500dc152..0893bcf686e8 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h >> @@ -206,13 +206,15 @@ struct amdgpu_firmware_info { >>      uint32_t ucode_size; >>  }; >>  +int amdgpu_ucode_request_firmware(struct amdgpu_device *adev, >> +                 const struct firmware **fw, >> +                 const char *name, bool optional); >>  void amdgpu_ucode_print_mc_hdr(const struct common_firmware_header >> *hdr); >>  void amdgpu_ucode_print_smc_hdr(const struct common_firmware_header >> *hdr); >>  void amdgpu_ucode_print_gfx_hdr(const struct common_firmware_header >> *hdr); >>  void amdgpu_ucode_print_rlc_hdr(const struct common_firmware_header >> *hdr); >>  void amdgpu_ucode_print_sdma_hdr(const struct >> common_firmware_header *hdr); >>  void amdgpu_ucode_print_gpu_info_hdr(const struct >> common_firmware_header *hdr); >> -int amdgpu_ucode_validate(const struct firmware *fw); >>  bool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr, >>                  uint16_t hdr_major, uint16_t hdr_minor); >>  int amdgpu_ucode_init_bo(struct amdgpu_device *adev); >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c >> index 627542b22ae4..fb3c7595ad09 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c >> @@ -176,21 +176,9 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev) >>          return -EINVAL; >>      } >>  -   r = request_firmware(&adev->uvd.fw, fw_name, adev->dev); >> -   if (r) { >> -       dev_err(adev->dev, "amdgpu_uvd: Can't load firmware \"%s\"\n", >> -           fw_name); >> -       return r; >> -   } >> - >> -   r = amdgpu_ucode_validate(adev->uvd.fw); >> -   if (r) { >> -       dev_err(adev->dev, "amdgpu_uvd: Can't validate firmware >> \"%s\"\n", >> -           fw_name); >> -       release_firmware(adev->uvd.fw); >> -       adev->uvd.fw = NULL; >> +   r = amdgpu_ucode_request_firmware(adev, &adev->uvd.fw, fw_name, >> false); >> +   if (r) >>          return r; >> -   } >>       /* Set the default UVD handles that the firmware can handle */ >>      adev->uvd.max_handles = AMDGPU_DEFAULT_UVD_HANDLES; >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >> index a33804bd3314..4f41f3fd2786 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >> @@ -143,21 +143,9 @@ int amdgpu_vce_sw_init(struct amdgpu_device >> *adev, unsigned long size) >>          return -EINVAL; >>      } >>  -   r = request_firmware(&adev->vce.fw, fw_name, adev->dev); >> -   if (r) { >> -       dev_err(adev->dev, "amdgpu_vce: Can't load firmware \"%s\"\n", >> -           fw_name); >> -       return r; >> -   } >> - >> -   r = amdgpu_ucode_validate(adev->vce.fw); >> -   if (r) { >> -       dev_err(adev->dev, "amdgpu_vce: Can't validate firmware >> \"%s\"\n", >> -           fw_name); >> -       release_firmware(adev->vce.fw); >> -       adev->vce.fw = NULL; >> +   r = amdgpu_ucode_request_firmware(adev, &adev->vce.fw, fw_name, >> false); >> +   if (r) >>          return r; >> -   } >>       hdr = (const struct common_firmware_header *)adev->vce.fw->data; >>  diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c >> index 58e495330b38..07f399a64cb2 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c >> @@ -67,21 +67,9 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev) >>          return -EINVAL; >>      } >>  -   r = request_firmware(&adev->vcn.fw, fw_name, adev->dev); >> -   if (r) { >> -       dev_err(adev->dev, "amdgpu_vcn: Can't load firmware \"%s\"\n", >> -           fw_name); >> -       return r; >> -   } >> - >> -   r = amdgpu_ucode_validate(adev->vcn.fw); >> -   if (r) { >> -       dev_err(adev->dev, "amdgpu_vcn: Can't validate firmware >> \"%s\"\n", >> -           fw_name); >> -       release_firmware(adev->vcn.fw); >> -       adev->vcn.fw = NULL; >> +   r = amdgpu_ucode_request_firmware(adev, &adev->vcn.fw, fw_name, >> false); >> +   if (r) >>          return r; >> -   } >>       hdr = (const struct common_firmware_header *)adev->vcn.fw->data; >>      family_id = le32_to_cpu(hdr->ucode_version) & 0xff; >> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c >> b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c >> index be6b19951e6a..3411803188aa 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c >> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c >> @@ -5789,7 +5789,6 @@ static int ci_dpm_init_microcode(struct >> amdgpu_device *adev) >>  { >>      const char *chip_name; >>      char fw_name[30]; >> -   int err; >>       DRM_DEBUG("\n"); >>  @@ -5815,18 +5814,8 @@ 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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->pm.fw); >> - >> -out: >> -   if (err) { >> -       pr_err("cik_smc: Failed to load firmware \"%s\"\n", fw_name); >> -       release_firmware(adev->pm.fw); >> -       adev->pm.fw = NULL; >> -   } >> -   return err; >> +   return amdgpu_ucode_request_firmware(adev, &adev->pm.fw, fw_name, >> +                        false); >>  } >>   static int ci_dpm_init(struct amdgpu_device *adev) >> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c >> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c >> index a7576255cc30..774d9aecab02 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c >> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c >> @@ -135,14 +135,13 @@ 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 = amdgpu_ucode_request_firmware(adev, >> &adev->sdma.instance[i].fw, >> +                           fw_name, false); >>          if (err) >>              goto out; >> -       err = amdgpu_ucode_validate(adev->sdma.instance[i].fw); >>      } >>  out: >>      if (err) { >> -       pr_err("cik_sdma: Failed to load firmware \"%s\"\n", fw_name); >>          for (i = 0; i < adev->sdma.num_instances; i++) { >>              release_firmware(adev->sdma.instance[i].fw); >>              adev->sdma.instance[i].fw = NULL; >> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c >> b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c >> index cd6bf291a853..e5bcbec41a1e 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c >> @@ -336,10 +336,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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.pfp_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.pfp_fw, >> fw_name, false); >>      if (err) >>          goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.pfp_fw->data; >> @@ -347,10 +344,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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.me_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.me_fw, >> fw_name, false); >>      if (err) >>          goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.me_fw->data; >> @@ -358,10 +352,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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.ce_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.ce_fw, >> fw_name, false); >>      if (err) >>          goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.ce_fw->data; >> @@ -369,17 +360,15 @@ 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 = amdgpu_ucode_request_firmware(adev, &adev->gfx.rlc_fw, >> fw_name, false); >>      if (err) >>          goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.rlc_fw); >>      rlc_hdr = (const struct rlc_firmware_header_v1_0 >> *)adev->gfx.rlc_fw->data; >>      adev->gfx.rlc_fw_version = >> le32_to_cpu(rlc_hdr->header.ucode_version); >>      adev->gfx.rlc_feature_version = >> le32_to_cpu(rlc_hdr->ucode_feature_version); >>   out: >>      if (err) { >> -       pr_err("gfx6: Failed to load firmware \"%s\"\n", fw_name); >>          release_firmware(adev->gfx.pfp_fw); >>          adev->gfx.pfp_fw = NULL; >>          release_firmware(adev->gfx.me_fw); >> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c >> b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c >> index 42b6144c1fd5..9aed1be1c9b4 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c >> @@ -926,56 +926,40 @@ 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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.pfp_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.pfp_fw, >> fw_name, false); >>      if (err) >>          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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.me_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.me_fw, >> fw_name, false); >>      if (err) >>          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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.ce_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.ce_fw, >> fw_name, false); >>      if (err) >>          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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.mec_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.mec_fw, >> fw_name, false); >>      if (err) >>          goto out; >>       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); >> -       if (err) >> -           goto out; >> -       err = amdgpu_ucode_validate(adev->gfx.mec2_fw); >> +       err = amdgpu_ucode_request_firmware(adev, >> &adev->gfx.mec2_fw, fw_name, >> +                           false); >>          if (err) >>              goto out; >>      } >>       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", >> chip_name); >> -   err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.rlc_fw, >> fw_name, false); >>      if (err) >>          goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.rlc_fw); >>   out: >>      if (err) { >> -       pr_err("gfx7: Failed to load firmware \"%s\"\n", fw_name); >>          release_firmware(adev->gfx.pfp_fw); >>          adev->gfx.pfp_fw = NULL; >>          release_firmware(adev->gfx.me_fw); >> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> index b0e591eaa71a..b10ce4786b8f 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> @@ -934,63 +934,57 @@ static int gfx_v8_0_init_microcode(struct >> amdgpu_device *adev) >>          BUG(); >>      } >>  +   adev->gfx.pfp_fw = NULL; >>      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); >> -       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); >> -       } >> -   } else { >> +       err = amdgpu_ucode_request_firmware(adev, &adev->gfx.pfp_fw, >> fw_name, true); >> +       if (err) >> +           goto out; >> +   } >> + >> +   if (!adev->gfx.pfp_fw) { >>          snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", >> chip_name); >> -       err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); >> +       err = amdgpu_ucode_request_firmware(adev, &adev->gfx.pfp_fw, >> fw_name, false); >> +       if (err) >> +           goto out; >>      } >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.pfp_fw); >> -   if (err) >> -       goto out; >> + >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.pfp_fw->data; >>      adev->gfx.pfp_fw_version = >> le32_to_cpu(cp_hdr->header.ucode_version); >>      adev->gfx.pfp_feature_version = >> le32_to_cpu(cp_hdr->ucode_feature_version); >>  +   adev->gfx.me_fw = NULL; >>      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); >> -       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); >> -       } >> -   } else { >> +       err = amdgpu_ucode_request_firmware(adev, &adev->gfx.me_fw, >> fw_name, true); >> +       if (err) >> +           goto out; >> +   } >> + >> +   if (!adev->gfx.me_fw) { >>          snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", >> chip_name); >> -       err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); >> +       err = amdgpu_ucode_request_firmware(adev, &adev->gfx.me_fw, >> fw_name, false); >> +       if (err) >> +           goto out; >>      } >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.me_fw); >> -   if (err) >> -       goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.me_fw->data; >>      adev->gfx.me_fw_version = >> le32_to_cpu(cp_hdr->header.ucode_version); >>       adev->gfx.me_feature_version = >> le32_to_cpu(cp_hdr->ucode_feature_version); >>  +   adev->gfx.ce_fw = NULL; >>      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); >> -       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); >> -       } >> -   } else { >> +       err = amdgpu_ucode_request_firmware(adev, &adev->gfx.ce_fw, >> fw_name, true); >> +       if (err) >> +           goto out; >> +   } >> +   if (!adev->gfx.ce_fw) { >>          snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", >> chip_name); >> -       err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); >> +       err = amdgpu_ucode_request_firmware(adev, &adev->gfx.ce_fw, >> fw_name, false); >> +       if (err) >> +           goto out; >>      } >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.ce_fw); >> -   if (err) >> -       goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.ce_fw->data; >>      adev->gfx.ce_fw_version = >> le32_to_cpu(cp_hdr->header.ucode_version); >>      adev->gfx.ce_feature_version = >> le32_to_cpu(cp_hdr->ucode_feature_version); >> @@ -1007,10 +1001,9 @@ 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 = amdgpu_ucode_request_firmware(adev, &adev->gfx.rlc_fw, >> fw_name, false); >>      if (err) >>          goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.rlc_fw); >>      rlc_hdr = (const struct rlc_firmware_header_v2_0 >> *)adev->gfx.rlc_fw->data; >>      adev->gfx.rlc_fw_version = >> le32_to_cpu(rlc_hdr->header.ucode_version); >>      adev->gfx.rlc_feature_version = >> le32_to_cpu(rlc_hdr->ucode_feature_version); >> @@ -1055,43 +1048,39 @@ static int gfx_v8_0_init_microcode(struct >> amdgpu_device *adev) >>      for (i = 0 ; i < (rlc_hdr->reg_list_size_bytes >> 2); i++) >>          adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]); >>  +   adev->gfx.mec_fw = NULL; >>      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); >> -       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); >> -       } >> -   } else { >> +       err = amdgpu_ucode_request_firmware(adev, &adev->gfx.mec_fw, >> fw_name, true); >> +       if (err) >> +           goto out; >> +   } >> +   if (!adev->gfx.mec_fw) { >>          snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", >> chip_name); >> -       err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); >> +       err = amdgpu_ucode_request_firmware(adev, &adev->gfx.mec_fw, >> fw_name, false); >> +       if (err) >> +           goto out; >>      } >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.mec_fw); >> -   if (err) >> -       goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.mec_fw->data; >>      adev->gfx.mec_fw_version = >> le32_to_cpu(cp_hdr->header.ucode_version); >>      adev->gfx.mec_feature_version = >> le32_to_cpu(cp_hdr->ucode_feature_version); >>       if ((adev->asic_type != CHIP_STONEY) && >>          (adev->asic_type != CHIP_TOPAZ)) { >> +       adev->gfx.mec2_fw = NULL; >>          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); >> -           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); >> -           } >> -       } 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 = amdgpu_ucode_request_firmware(adev, >> &adev->gfx.mec2_fw, fw_name, true); >> +           if (err) >> +               goto out; >>          } >> -       if (!err) { >> -           err = amdgpu_ucode_validate(adev->gfx.mec2_fw); >> +       if (!adev->gfx.mec2_fw) { >> +           snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", >> chip_name); >> +           err = amdgpu_ucode_request_firmware(adev, >> &adev->gfx.mec2_fw, fw_name, true); >>              if (err) >>                  goto out; >> +       } >> +       if (!err) { >>              cp_hdr = (const struct gfx_firmware_header_v1_0 *) >>                  adev->gfx.mec2_fw->data; >>              adev->gfx.mec2_fw_version = >> @@ -1166,9 +1155,6 @@ static int gfx_v8_0_init_microcode(struct >> amdgpu_device *adev) >>   out: >>      if (err) { >> -       dev_err(adev->dev, >> -           "gfx8: Failed to load firmware \"%s\"\n", >> -           fw_name); >>          release_firmware(adev->gfx.pfp_fw); >>          adev->gfx.pfp_fw = NULL; >>          release_firmware(adev->gfx.me_fw); >> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> index 9d39fd5b1822..da2a829d7725 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> @@ -430,10 +430,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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.pfp_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.pfp_fw, >> fw_name, false); >>      if (err) >>          goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.pfp_fw->data; >> @@ -441,10 +438,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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.me_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.me_fw, >> fw_name, false); >>      if (err) >>          goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.me_fw->data; >> @@ -452,10 +446,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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.ce_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.ce_fw, >> fw_name, false); >>      if (err) >>          goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.ce_fw->data; >> @@ -463,10 +454,9 @@ 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 = amdgpu_ucode_request_firmware(adev, &adev->gfx.rlc_fw, >> fw_name, false); >>      if (err) >>          goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.rlc_fw); >>      rlc_hdr = (const struct rlc_firmware_header_v2_0 >> *)adev->gfx.rlc_fw->data; >>      adev->gfx.rlc_fw_version = >> le32_to_cpu(rlc_hdr->header.ucode_version); >>      adev->gfx.rlc_feature_version = >> le32_to_cpu(rlc_hdr->ucode_feature_version); >> @@ -509,10 +499,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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gfx.mec_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.mec_fw, >> fw_name, false); >>      if (err) >>          goto out; >>      cp_hdr = (const struct gfx_firmware_header_v1_0 >> *)adev->gfx.mec_fw->data; >> @@ -521,20 +508,17 @@ 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); >> -   if (!err) { >> -       err = amdgpu_ucode_validate(adev->gfx.mec2_fw); >> -       if (err) >> -           goto out; >> +   err = amdgpu_ucode_request_firmware(adev, &adev->gfx.mec2_fw, >> fw_name, true); >> +   if (err) >> +       goto out; >> + >> +   if (adev->gfx.mec2_fw) { >>          cp_hdr = (const struct gfx_firmware_header_v1_0 *) >>          adev->gfx.mec2_fw->data; >>          adev->gfx.mec2_fw_version = >>          le32_to_cpu(cp_hdr->header.ucode_version); >>          adev->gfx.mec2_feature_version = >>          le32_to_cpu(cp_hdr->ucode_feature_version); >> -   } else { >> -       err = 0; >> -       adev->gfx.mec2_fw = NULL; >>      } >>       if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { >> @@ -599,9 +583,6 @@ static int gfx_v9_0_init_microcode(struct >> amdgpu_device *adev) >>   out: >>      if (err) { >> -       dev_err(adev->dev, >> -           "gfx9: Failed to load firmware \"%s\"\n", >> -           fw_name); >>          release_firmware(adev->gfx.pfp_fw); >>          adev->gfx.pfp_fw = NULL; >>          release_firmware(adev->gfx.me_fw); >> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c >> b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c >> index 5617cf62c566..b49ad21f5465 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c >> @@ -105,7 +105,6 @@ static int gmc_v6_0_init_microcode(struct >> amdgpu_device *adev) >>  { >>      const char *chip_name; >>      char fw_name[30]; >> -   int err; >>      bool is_58_fw = false; >>       DRM_DEBUG("\n"); >> @@ -137,21 +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->gmc.fw, fw_name, adev->dev); >> -   if (err) >> -       goto out; >> - >> -   err = amdgpu_ucode_validate(adev->gmc.fw); >> - >> -out: >> -   if (err) { >> -       dev_err(adev->dev, >> -              "si_mc: Failed to load firmware \"%s\"\n", >> -              fw_name); >> -       release_firmware(adev->gmc.fw); >> -       adev->gmc.fw = NULL; >> -   } >> -   return err; >> +   return amdgpu_ucode_request_firmware(adev, &adev->gmc.fw, >> fw_name, false); >>  } >>   static int gmc_v6_0_mc_load_microcode(struct amdgpu_device *adev) >> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c >> b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c >> index 80054f36e487..7b010fedb6ec 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c >> @@ -126,7 +126,6 @@ static int gmc_v7_0_init_microcode(struct >> amdgpu_device *adev) >>  { >>      const char *chip_name; >>      char fw_name[30]; >> -   int err; >>       DRM_DEBUG("\n"); >>  @@ -152,18 +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->gmc.fw, fw_name, adev->dev); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gmc.fw); >> - >> -out: >> -   if (err) { >> -       pr_err("cik_mc: Failed to load firmware \"%s\"\n", fw_name); >> -       release_firmware(adev->gmc.fw); >> -       adev->gmc.fw = NULL; >> -   } >> -   return err; >> +   return amdgpu_ucode_request_firmware(adev, &adev->gmc.fw, >> fw_name, false); >>  } >>   /** >> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c >> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c >> index d71d4cb68f9c..3693873ae647 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c >> @@ -211,7 +211,6 @@ static int gmc_v8_0_init_microcode(struct >> amdgpu_device *adev) >>  { >>      const char *chip_name; >>      char fw_name[30]; >> -   int err; >>       DRM_DEBUG("\n"); >>  @@ -236,18 +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->gmc.fw, fw_name, adev->dev); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->gmc.fw); >> - >> -out: >> -   if (err) { >> -       pr_err("mc: Failed to load firmware \"%s\"\n", fw_name); >> -       release_firmware(adev->gmc.fw); >> -       adev->gmc.fw = NULL; >> -   } >> -   return err; >> +   return amdgpu_ucode_request_firmware(adev, &adev->gmc.fw, >> fw_name, false); >>  } >>   /** >> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c >> b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c >> index 8873d833a7f7..9ad3bf6ebc54 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c >> @@ -105,13 +105,9 @@ static 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 = amdgpu_ucode_request_firmware(adev, &adev->psp.asd_fw, >> fw_name, false); >>      if (err) >> -       goto out; >> - >> -   err = amdgpu_ucode_validate(adev->psp.asd_fw); >> -   if (err) >> -       goto out; >> +       return err; >>       hdr = (const struct psp_firmware_header_v1_0 >> *)adev->psp.asd_fw->data; >>      adev->psp.asd_fw_version = le32_to_cpu(hdr->header.ucode_version); >> @@ -121,16 +117,6 @@ static int psp_v10_0_init_microcode(struct >> psp_context *psp) >> le32_to_cpu(hdr->header.ucode_array_offset_bytes); >>       return 0; >> -out: >> -   if (err) { >> -       dev_err(adev->dev, >> -           "psp v10.0: Failed to load firmware \"%s\"\n", >> -           fw_name); >> -       release_firmware(adev->psp.asd_fw); >> -       adev->psp.asd_fw = NULL; >> -   } >> - >> -   return err; >>  } >>   static int psp_v10_0_prep_cmd_buf(struct amdgpu_firmware_info >> *ucode, >> diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c >> b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c >> index 196e75def1f2..b91f7af1198b 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c >> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c >> @@ -116,11 +116,7 @@ static 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); >> -   if (err) >> -       goto out; >> - >> -   err = amdgpu_ucode_validate(adev->psp.sos_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->psp.sos_fw, >> fw_name, false); >>      if (err) >>          goto out; >>  @@ -136,11 +132,7 @@ static 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); >> -   if (err) >> -       goto out; >> - >> -   err = amdgpu_ucode_validate(adev->psp.asd_fw); >> +   err = amdgpu_ucode_request_firmware(adev, &adev->psp.asd_fw, >> fw_name, false); >>      if (err) >>          goto out; >>  @@ -154,9 +146,6 @@ static int psp_v3_1_init_microcode(struct >> psp_context *psp) >>      return 0; >>  out: >>      if (err) { >> -       dev_err(adev->dev, >> -           "psp v3.1: Failed to load firmware \"%s\"\n", >> -           fw_name); >>          release_firmware(adev->psp.sos_fw); >>          adev->psp.sos_fw = NULL; >>          release_firmware(adev->psp.asd_fw); >> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c >> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c >> index c7190c39c4f5..71e2d822e245 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c >> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c >> @@ -146,10 +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); >> -       if (err) >> -           goto out; >> -       err = amdgpu_ucode_validate(adev->sdma.instance[i].fw); >> +       err = amdgpu_ucode_request_firmware(adev, >> &adev->sdma.instance[i].fw, fw_name, false); >>          if (err) >>              goto out; >>          hdr = (const struct sdma_firmware_header_v1_0 >> *)adev->sdma.instance[i].fw->data; >> @@ -170,7 +167,6 @@ static int sdma_v2_4_init_microcode(struct >> amdgpu_device *adev) >>   out: >>      if (err) { >> -       pr_err("sdma_v2_4: Failed to load firmware \"%s\"\n", fw_name); >>          for (i = 0; i < adev->sdma.num_instances; i++) { >>              release_firmware(adev->sdma.instance[i].fw); >>              adev->sdma.instance[i].fw = NULL; >> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c >> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c >> index be20a387d961..de315baef30d 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c >> @@ -298,10 +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); >> -       if (err) >> -           goto out; >> -       err = amdgpu_ucode_validate(adev->sdma.instance[i].fw); >> +       err = amdgpu_ucode_request_firmware(adev, >> &adev->sdma.instance[i].fw, fw_name, false); >>          if (err) >>              goto out; >>          hdr = (const struct sdma_firmware_header_v1_0 >> *)adev->sdma.instance[i].fw->data; >> @@ -321,7 +318,6 @@ static int sdma_v3_0_init_microcode(struct >> amdgpu_device *adev) >>      } >>  out: >>      if (err) { >> -       pr_err("sdma_v3_0: Failed to load firmware \"%s\"\n", fw_name); >>          for (i = 0; i < adev->sdma.num_instances; i++) { >>              release_firmware(adev->sdma.instance[i].fw); >>              adev->sdma.instance[i].fw = NULL; >> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c >> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c >> index 2c618a1be03e..0776bf41078f 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c >> @@ -194,10 +194,8 @@ 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); >> -       if (err) >> -           goto out; >> -       err = amdgpu_ucode_validate(adev->sdma.instance[i].fw); >> +       err = amdgpu_ucode_request_firmware(adev, >> &adev->sdma.instance[i].fw, >> +                           fw_name, false); >>          if (err) >>              goto out; >>          hdr = (const struct sdma_firmware_header_v1_0 >> *)adev->sdma.instance[i].fw->data; >> @@ -219,7 +217,6 @@ static int sdma_v4_0_init_microcode(struct >> amdgpu_device *adev) >>      } >>  out: >>      if (err) { >> -       DRM_ERROR("sdma_v4_0: Failed to load firmware \"%s\"\n", >> fw_name); >>          for (i = 0; i < adev->sdma.num_instances; i++) { >>              release_firmware(adev->sdma.instance[i].fw); >>              adev->sdma.instance[i].fw = NULL; >> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c >> b/drivers/gpu/drm/amd/amdgpu/si_dpm.c >> index b12d7c9d42a0..bee2b0a5df5d 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c >> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c >> @@ -7605,7 +7605,6 @@ static int si_dpm_init_microcode(struct >> amdgpu_device *adev) >>  { >>      const char *chip_name; >>      char fw_name[30]; >> -   int err; >>       DRM_DEBUG("\n"); >>      switch (adev->asic_type) { >> @@ -7665,20 +7664,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); >> -   if (err) >> -       goto out; >> -   err = amdgpu_ucode_validate(adev->pm.fw); >> - >> -out: >> -   if (err) { >> -       DRM_ERROR("si_smc: Failed to load firmware. err = %d\"%s\"\n", >> -             err, fw_name); >> -       release_firmware(adev->pm.fw); >> -       adev->pm.fw = NULL; >> -   } >> -   return err; >> - >> +   return amdgpu_ucode_request_firmware(adev, &adev->pm.fw, >> fw_name, false); >>  } >>   static int si_dpm_sw_init(void *handle) >>