Commit 4a6f8f01 authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher
Browse files

drm/amd/powerplay: handle features disablement for baco reset in SMU FW



SMU FW will handle the features disablement for baco reset
on Arcturus.

Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 86b93fd6
Loading
Loading
Loading
Loading
+45 −14
Original line number Diff line number Diff line
@@ -1454,34 +1454,65 @@ int smu_reset(struct smu_context *smu)
	return ret;
}

static int smu_suspend(void *handle)
static int smu_disabled_dpms(struct smu_context *smu)
{
	int ret;
	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
	struct smu_context *smu = &adev->smu;
	bool baco_feature_is_enabled = false;
	struct amdgpu_device *adev = smu->adev;
	uint32_t smu_version;
	int ret = 0;

	if (amdgpu_sriov_vf(adev)&& !amdgpu_sriov_is_pp_one_vf(adev))
		return 0;
	ret = smu_get_smc_version(smu, NULL, &smu_version);
	if (ret) {
		pr_err("Failed to get smu version.\n");
		return ret;
	}

	if (!smu->pm_enabled)
	/*
	 * For baco reset on Arcturus, this operation
	 * (disable all smu feature) will be handled by SMU FW.
	 */
	if (adev->in_gpu_reset &&
	    (amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) &&
	    (adev->asic_type == CHIP_ARCTURUS && smu_version > 0x360e00))
		return 0;

	if(!smu->is_apu)
		baco_feature_is_enabled = smu_feature_is_enabled(smu, SMU_FEATURE_BACO_BIT);

	if(!amdgpu_sriov_vf(adev)) {
	/* Disable all enabled SMU features */
	ret = smu_system_features_control(smu, false);
		if (ret)
	if (ret) {
		pr_err("Failed to disable smu features.\n");
		return ret;
	}

		if (baco_feature_is_enabled) {
	/* For baco reset, need to leave BACO feature enabled */
	if (adev->in_gpu_reset &&
	    (amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) &&
	    !smu->is_apu &&
	    smu_feature_is_enabled(smu, SMU_FEATURE_BACO_BIT)) {
		ret = smu_feature_set_enabled(smu, SMU_FEATURE_BACO_BIT, true);
		if (ret) {
			pr_warn("set BACO feature enabled failed, return %d\n", ret);
			return ret;
		}
	}

	return ret;
}

static int smu_suspend(void *handle)
{
	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
	struct smu_context *smu = &adev->smu;
	int ret;

	if (amdgpu_sriov_vf(adev)&& !amdgpu_sriov_is_pp_one_vf(adev))
		return 0;

	if (!smu->pm_enabled)
		return 0;

	if(!amdgpu_sriov_vf(adev)) {
		ret = smu_disabled_dpms(smu);
		if (ret)
			return ret;
	}

	smu->watermarks_bitmap &= ~(WATERMARKS_LOADED);