Commit b61e54cb authored by Rex Zhu's avatar Rex Zhu Committed by Alex Deucher
Browse files

drm/amd/pp: Lock pm_funcs when set pp table



unlock mutex until set pp table completely to avoid
conflict if other pp functions were called simultaneously.

use hwmgr_handle_task instand of pp_dpm_dispatch_tasks.
It is not make sense that call pp_functions in ip_functions.

Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarRex Zhu <Rex.Zhu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ba8ab90e
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -31,8 +31,6 @@
#include "amdgpu.h"
#include "hwmgr.h"

static int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_task task_id,
		enum amd_pm_state_type *user_state);

static const struct amd_pm_funcs pp_dpm_funcs;

@@ -146,10 +144,12 @@ static int pp_late_init(void *handle)
	struct amdgpu_device *adev = handle;
	struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;

	if (hwmgr && hwmgr->pm_en)
		pp_dpm_dispatch_tasks(hwmgr,
	if (hwmgr && hwmgr->pm_en) {
		mutex_lock(&hwmgr->smu_lock);
		hwmgr_handle_task(hwmgr,
					AMD_PP_TASK_COMPLETE_INIT, NULL);

		mutex_unlock(&hwmgr->smu_lock);
	}
	return 0;
}

@@ -620,7 +620,7 @@ static int amd_powerplay_reset(void *handle)
static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)
{
	struct pp_hwmgr *hwmgr = handle;
	int ret = 0;
	int ret = -ENOMEM;

	if (!hwmgr || !hwmgr->pm_en)
		return -EINVAL;
@@ -630,28 +630,28 @@ static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)
		hwmgr->hardcode_pp_table = kmemdup(hwmgr->soft_pp_table,
						   hwmgr->soft_pp_table_size,
						   GFP_KERNEL);
		if (!hwmgr->hardcode_pp_table) {
			mutex_unlock(&hwmgr->smu_lock);
			return -ENOMEM;
		}
		if (!hwmgr->hardcode_pp_table)
			goto err;
	}

	memcpy(hwmgr->hardcode_pp_table, buf, size);

	hwmgr->soft_pp_table = hwmgr->hardcode_pp_table;
	mutex_unlock(&hwmgr->smu_lock);

	ret = amd_powerplay_reset(handle);
	if (ret)
		return ret;
		goto err;

	if (hwmgr->hwmgr_func->avfs_control) {
		ret = hwmgr->hwmgr_func->avfs_control(hwmgr, false);
		if (ret)
			return ret;
			goto err;
	}

	mutex_unlock(&hwmgr->smu_lock);
	return 0;
err:
	mutex_unlock(&hwmgr->smu_lock);
	return ret;
}

static int pp_dpm_force_clock_level(void *handle,