struct drm_device *ddev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = ddev->dev_private;
        struct pp_states_info data;
+       struct smu_context *smu = &adev->smu;
        enum amd_pm_state_type pm = 0;
-       int i = 0;
+       int i = 0, ret = 0;
 
-       if (adev->powerplay.pp_funcs->get_current_power_state
+       if (is_support_sw_smu(adev)) {
+               pm = smu_get_current_power_state(smu);
+               ret = smu_get_power_num_states(smu, &data);
+               if (ret)
+                       return ret;
+       } else if (adev->powerplay.pp_funcs->get_current_power_state
                 && adev->powerplay.pp_funcs->get_pp_num_states) {
                pm = amdgpu_dpm_get_current_power_state(adev);
                amdgpu_dpm_get_pp_num_states(adev, &data);
+       }
 
-               for (i = 0; i < data.nums; i++) {
-                       if (pm == data.states[i])
-                               break;
-               }
-
-               if (i == data.nums)
-                       i = -EINVAL;
+       for (i = 0; i < data.nums; i++) {
+               if (pm == data.states[i])
+                       break;
        }
 
+       if (i == data.nums)
+               i = -EINVAL;
+
        return snprintf(buf, PAGE_SIZE, "%d\n", i);
 }
 
 
 #include "smu_v11_0.h"
 #include "atom.h"
 
+enum amd_pm_state_type smu_get_current_power_state(struct smu_context *smu)
+{
+       /* not support power state */
+       return POWER_STATE_TYPE_DEFAULT;
+}
+
 int smu_get_power_num_states(struct smu_context *smu,
                             struct pp_states_info *state_info)
 {
 
 int smu_sys_get_pp_table(struct smu_context *smu, void **table);
 int smu_sys_set_pp_table(struct smu_context *smu,  void *buf, size_t size);
 int smu_get_power_num_states(struct smu_context *smu, struct pp_states_info *state_info);
+enum amd_pm_state_type smu_get_current_power_state(struct smu_context *smu);
 
 #endif