[PATCH] drm/amdgpu: cleanup firmware requests v2

Christian König christian.koenig at amd.com
Wed May 2 11:59:03 UTC 2018


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



More information about the amd-gfx mailing list