diff options
| author | Monk Liu <Monk.Liu@amd.com> | 2016-05-31 13:44:30 +0800 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2016-06-09 10:49:13 -0400 | 
| commit | a392746a8c38de494a1a2d00c5cfd34a05449e35 (patch) | |
| tree | a139ea9f9034bf7072e5e13fd5022d86ca5678e3 /drivers/gpu | |
| parent | 86e4cdd675f489e0b3deaa3d6b75cddadd16e71c (diff) | |
drm/amdgpu: add release firmware for cgs
Powerplay uses cgs to load the firmware so add a function
to release it as well to avoid leaking it on driver unload.
Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/include/cgs_common.h | 6 | 
2 files changed, 18 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index 199f76baf22c..8943099eb135 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c @@ -696,6 +696,17 @@ static uint32_t fw_type_convert(struct cgs_device *cgs_device, uint32_t fw_type)  	return result;  } +static int amdgpu_cgs_rel_firmware(struct cgs_device *cgs_device, enum cgs_ucode_id type) +{ +	CGS_FUNC_ADEV; +	if ((CGS_UCODE_ID_SMU == type) || (CGS_UCODE_ID_SMU_SK == type)) { +		release_firmware(adev->pm.fw); +		return 0; +	} +	/* cannot release other firmware because they are not created by cgs */ +	return -EINVAL; +} +  static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,  					enum cgs_ucode_id type,  					struct cgs_firmware_info *info) @@ -1125,6 +1136,7 @@ static const struct cgs_ops amdgpu_cgs_ops = {  	amdgpu_cgs_pm_query_clock_limits,  	amdgpu_cgs_set_camera_voltages,  	amdgpu_cgs_get_firmware_info, +	amdgpu_cgs_rel_firmware,  	amdgpu_cgs_set_powergating_state,  	amdgpu_cgs_set_clockgating_state,  	amdgpu_cgs_get_active_displays_info, diff --git a/drivers/gpu/drm/amd/include/cgs_common.h b/drivers/gpu/drm/amd/include/cgs_common.h index a461e155a160..7464daf89ca1 100644 --- a/drivers/gpu/drm/amd/include/cgs_common.h +++ b/drivers/gpu/drm/amd/include/cgs_common.h @@ -581,6 +581,9 @@ typedef int (*cgs_get_firmware_info)(struct cgs_device *cgs_device,  				     enum cgs_ucode_id type,  				     struct cgs_firmware_info *info); +typedef int (*cgs_rel_firmware)(struct cgs_device *cgs_device, +					 enum cgs_ucode_id type); +  typedef int(*cgs_set_powergating_state)(struct cgs_device *cgs_device,  				  enum amd_ip_block_type block_type,  				  enum amd_powergating_state state); @@ -645,6 +648,7 @@ struct cgs_ops {  	cgs_set_camera_voltages_t set_camera_voltages;  	/* Firmware Info */  	cgs_get_firmware_info get_firmware_info; +	cgs_rel_firmware rel_firmware;  	/* cg pg interface*/  	cgs_set_powergating_state set_powergating_state;  	cgs_set_clockgating_state set_clockgating_state; @@ -738,6 +742,8 @@ struct cgs_device  	CGS_CALL(set_camera_voltages,dev,mask,voltages)  #define cgs_get_firmware_info(dev, type, info)	\  	CGS_CALL(get_firmware_info, dev, type, info) +#define cgs_rel_firmware(dev, type)	\ +	CGS_CALL(rel_firmware, dev, type)  #define cgs_set_powergating_state(dev, block_type, state)	\  	CGS_CALL(set_powergating_state, dev, block_type, state)  #define cgs_set_clockgating_state(dev, block_type, state)	\ | 
