OSDN Git Service

drm/amdgpu: toggle DF-Cstate to protect DF reg access
authorHawking Zhang <Hawking.Zhang@amd.com>
Mon, 24 Feb 2020 08:47:23 +0000 (16:47 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 26 Feb 2020 19:17:32 +0000 (14:17 -0500)
driver needs to take DF out Cstate before any DF register
access. otherwise, the DF register may not be accessible.

Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Acked-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c

index b58f725..7a89c91 100644 (file)
@@ -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;
 }