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. > > 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) >