Commit 938065d4 authored by Hawking Zhang's avatar Hawking Zhang Committed by Alex Deucher
Browse files

drm/amdgpu: toggle DF-Cstate to protect DF reg access



driver needs to take DF out Cstate before any DF register
access. otherwise, the DF register may not be accessible.

Signed-off-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Acked-by: default avatarEvan Quan <evan.quan@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 19744f5f
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -535,13 +535,28 @@ uint64_t amdgpu_xgmi_get_relative_phy_addr(struct amdgpu_device *adev,
					   uint64_t addr)
{
	uint32_t df_inst_id;
	uint64_t dram_base_addr = 0;
	const struct amdgpu_df_funcs *df_funcs = adev->df.funcs;

	if ((!df_funcs)                 ||
	    (!df_funcs->get_df_inst_id) ||
	    (!df_funcs->get_dram_base_addr)) {
		dev_warn(adev->dev,
			 "XGMI: relative phy_addr algorithm is not supported\n");
		return addr;
	}

	if ((!adev->df.funcs)                 ||
	    (!adev->df.funcs->get_df_inst_id) ||
	    (!adev->df.funcs->get_dram_base_addr))
	if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_DISALLOW)) {
		dev_warn(adev->dev,
			 "failed to disable DF-Cstate, DF register may not be accessible\n");
		return addr;
	}

	df_inst_id = df_funcs->get_df_inst_id(adev);
	dram_base_addr = df_funcs->get_dram_base_addr(adev, df_inst_id);

	df_inst_id = adev->df.funcs->get_df_inst_id(adev);
	if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_ALLOW))
		dev_warn(adev->dev, "failed to enable DF-Cstate\n");

	return addr + adev->df.funcs->get_dram_base_addr(adev, df_inst_id);
	return addr + dram_base_addr;
}