Commit 6b6706cd authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher
Browse files

drm/amd/powerplay: added mutex protection on msg issuing



This could avoid the possible race condition.

Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarKenneth Feng <kenneth.feng@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a0ec2256
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ static int amd_powerplay_create(struct amdgpu_device *adev)
	hwmgr->not_vf = !amdgpu_sriov_vf(adev);
	hwmgr->device = amdgpu_cgs_create_device(adev);
	mutex_init(&hwmgr->smu_lock);
	mutex_init(&hwmgr->msg_lock);
	hwmgr->chip_family = adev->family;
	hwmgr->chip_id = adev->asic_type;
	hwmgr->feature_mask = adev->pm.pp_feature;
@@ -64,6 +65,8 @@ static void amd_powerplay_destroy(struct amdgpu_device *adev)
{
	struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;

	mutex_destroy(&hwmgr->msg_lock);

	kfree(hwmgr->hardcode_pp_table);
	hwmgr->hardcode_pp_table = NULL;

+1 −0
Original line number Diff line number Diff line
@@ -743,6 +743,7 @@ struct pp_hwmgr {
	bool pm_en;
	bool pp_one_vf;
	struct mutex smu_lock;
	struct mutex msg_lock;

	uint32_t pp_table_version;
	void *device;
+14 −2
Original line number Diff line number Diff line
@@ -136,13 +136,19 @@ int smum_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg, uint32_t *resp)
	    (resp && !hwmgr->smumgr_funcs->get_argument))
		return -EINVAL;

	mutex_lock(&hwmgr->msg_lock);

	ret = hwmgr->smumgr_funcs->send_msg_to_smc(hwmgr, msg);
	if (ret)
	if (ret) {
		mutex_unlock(&hwmgr->msg_lock);
		return ret;
	}

	if (resp)
		*resp = hwmgr->smumgr_funcs->get_argument(hwmgr);

	mutex_unlock(&hwmgr->msg_lock);

	return ret;
}

@@ -158,14 +164,20 @@ int smum_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
	    (resp && !hwmgr->smumgr_funcs->get_argument))
		return -EINVAL;

	mutex_lock(&hwmgr->msg_lock);

	ret = hwmgr->smumgr_funcs->send_msg_to_smc_with_parameter(
						hwmgr, msg, parameter);
	if (ret)
	if (ret) {
		mutex_unlock(&hwmgr->msg_lock);
		return ret;
	}

	if (resp)
		*resp = hwmgr->smumgr_funcs->get_argument(hwmgr);

	mutex_unlock(&hwmgr->msg_lock);

	return ret;
}