Commit 9f7ce6a9 authored by Ruili Ji's avatar Ruili Ji Committed by Alex Deucher
Browse files

drm/amd/pm: implement dpm vcn reset function



Implement VCN engine reset by sending MSG_ResetVCN
on smu 13.0.6.

v2: fix format for code and message

Reviewed-by: default avatarSonny Jiang <sonny.jiang@amd.com>
Reviewed-by: default avatarLeo Liu <leo.liu@amd.com>
Signed-off-by: default avatarRuili Ji <ruiliji2@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent dd035239
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -789,6 +789,21 @@ int amdgpu_dpm_reset_sdma(struct amdgpu_device *adev, uint32_t inst_mask)
	return ret;
}

int amdgpu_dpm_reset_vcn(struct amdgpu_device *adev, uint32_t inst_mask)
{
	struct smu_context *smu = adev->powerplay.pp_handle;
	int ret;

	if (!is_support_sw_smu(adev))
		return -EOPNOTSUPP;

	mutex_lock(&adev->pm.mutex);
	ret = smu_reset_vcn(smu, inst_mask);
	mutex_unlock(&adev->pm.mutex);

	return ret;
}

int amdgpu_dpm_get_dpm_freq_range(struct amdgpu_device *adev,
				  enum pp_clock_type type,
				  uint32_t *min,
+1 −0
Original line number Diff line number Diff line
@@ -607,5 +607,6 @@ ssize_t amdgpu_dpm_get_pm_policy_info(struct amdgpu_device *adev,
				      enum pp_pm_policy p_type, char *buf);
int amdgpu_dpm_reset_sdma(struct amdgpu_device *adev, uint32_t inst_mask);
bool amdgpu_dpm_reset_sdma_is_supported(struct amdgpu_device *adev);
int amdgpu_dpm_reset_vcn(struct amdgpu_device *adev, uint32_t inst_mask);

#endif
+8 −0
Original line number Diff line number Diff line
@@ -3967,3 +3967,11 @@ int smu_reset_sdma(struct smu_context *smu, uint32_t inst_mask)

	return ret;
}

int smu_reset_vcn(struct smu_context *smu, uint32_t inst_mask)
{
	if (smu->ppt_funcs && smu->ppt_funcs->dpm_reset_vcn)
		smu->ppt_funcs->dpm_reset_vcn(smu, inst_mask);

	return 0;
}
+6 −0
Original line number Diff line number Diff line
@@ -1396,6 +1396,11 @@ struct pptable_funcs {
	 */
	bool (*reset_sdma_is_supported)(struct smu_context *smu);

	/**
	 * @reset_vcn: message SMU to soft reset vcn instance.
	 */
	int (*dpm_reset_vcn)(struct smu_context *smu, uint32_t inst_mask);

	/**
	 * @get_ecc_table:  message SMU to get ECC INFO table.
	 */
@@ -1659,6 +1664,7 @@ int smu_send_hbm_bad_channel_flag(struct smu_context *smu, uint32_t size);
int smu_send_rma_reason(struct smu_context *smu);
int smu_reset_sdma(struct smu_context *smu, uint32_t inst_mask);
bool smu_reset_sdma_is_supported(struct smu_context *smu);
int smu_reset_vcn(struct smu_context *smu, uint32_t inst_mask);
int smu_set_pm_policy(struct smu_context *smu, enum pp_pm_policy p_type,
		      int level);
ssize_t smu_get_pm_policy_info(struct smu_context *smu,
+2 −1
Original line number Diff line number Diff line
@@ -94,7 +94,8 @@
#define PPSMC_MSG_RmaDueToBadPageThreshold          0x43
#define PPSMC_MSG_SetThrottlingPolicy               0x44
#define PPSMC_MSG_ResetSDMA                         0x4D
#define PPSMC_Message_Count                         0x4E
#define PPSMC_MSG_ResetVCN                          0x4E
#define PPSMC_Message_Count                         0x4F

//PPSMC Reset Types for driver msg argument
#define PPSMC_RESET_TYPE_DRIVER_MODE_1_RESET        0x1
Loading