diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 21 | 
1 files changed, 15 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c index 4c7b53648a50..cf700824b960 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c @@ -1434,6 +1434,7 @@ void amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type,   *   * @adev: amdgpu device   * @fw: pointer to load firmware to + * @required: whether the firmware is required   * @fmt: firmware name format string   * @...: variable arguments   * @@ -1442,7 +1443,7 @@ void amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type,   * the error code to -ENODEV, so that early_init functions will fail to load.   */  int amdgpu_ucode_request(struct amdgpu_device *adev, const struct firmware **fw, -			 const char *fmt, ...) +			 enum amdgpu_ucode_required required, const char *fmt, ...)  {  	char fname[AMDGPU_UCODE_NAME_MAX];  	va_list ap; @@ -1456,16 +1457,24 @@ int amdgpu_ucode_request(struct amdgpu_device *adev, const struct firmware **fw,  		return -EOVERFLOW;  	} -	r = request_firmware(fw, fname, adev->dev); +	if (required == AMDGPU_UCODE_REQUIRED) +		r = request_firmware(fw, fname, adev->dev); +	else { +		r = firmware_request_nowarn(fw, fname, adev->dev); +		if (r) +			drm_info(&adev->ddev, "Optional firmware \"%s\" was not found\n", fname); +	}  	if (r)  		return -ENODEV;  	r = amdgpu_ucode_validate(*fw); -	if (r) { +	if (r) +		/* +		 * The amdgpu_ucode_request() should be paired with amdgpu_ucode_release() +		 * regardless of success/failure, and the amdgpu_ucode_release() takes care of +		 * firmware release and need to avoid redundant release FW operation here. +		 */  		dev_dbg(adev->dev, "\"%s\" failed to validate\n", fname); -		release_firmware(*fw); -		*fw = NULL; -	}  	return r;  } | 
