enum amd_pm_state_type pm;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                if (adev->smu.ppt_funcs->get_current_power_state)
                        pm = smu_get_current_power_state(&adev->smu);
                pm = adev->pm.dpm.user_state;
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        enum amd_pm_state_type  state;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        if (strncmp("battery", buf, strlen("battery")) == 0)
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                mutex_lock(&adev->pm.mutex);
                adev->pm.dpm.user_state = state;
 
                amdgpu_pm_compute_clocks(adev);
        }
+
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        enum amd_dpm_forced_level level = 0xff;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                level = smu_get_performance_level(&adev->smu);
        else if (adev->powerplay.pp_funcs->get_performance_level)
        else
                level = adev->pm.dpm.forced_level;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        enum amd_dpm_forced_level current_level = 0xff;
        int ret = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        if (strncmp("low", buf, strlen("low")) == 0) {
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                current_level = smu_get_performance_level(&adev->smu);
        else if (adev->powerplay.pp_funcs->get_performance_level)
        if (current_level == level) {
                pm_runtime_mark_last_busy(ddev->dev);
                pm_runtime_put_autosuspend(ddev->dev);
-               return count;
+               ret = count;
+               goto pro_end;
        }
 
        if (adev->asic_type == CHIP_RAVEN) {
                pr_err("Currently not in any profile mode!\n");
                pm_runtime_mark_last_busy(ddev->dev);
                pm_runtime_put_autosuspend(ddev->dev);
-               return -EINVAL;
+               ret = -EINVAL;
+               goto pro_end;
        }
 
        if (is_support_sw_smu(adev)) {
                if (ret) {
                        pm_runtime_mark_last_busy(ddev->dev);
                        pm_runtime_put_autosuspend(ddev->dev);
-                       return -EINVAL;
+                       ret = -EINVAL;
+                       goto pro_end;
                }
        } else if (adev->powerplay.pp_funcs->force_performance_level) {
                mutex_lock(&adev->pm.mutex);
                        mutex_unlock(&adev->pm.mutex);
                        pm_runtime_mark_last_busy(ddev->dev);
                        pm_runtime_put_autosuspend(ddev->dev);
-                       return -EINVAL;
+                       ret = -EINVAL;
+                       goto pro_end;
                }
                ret = amdgpu_dpm_force_performance_level(adev, level);
                if (ret) {
                        mutex_unlock(&adev->pm.mutex);
                        pm_runtime_mark_last_busy(ddev->dev);
                        pm_runtime_put_autosuspend(ddev->dev);
-                       return -EINVAL;
+                       ret = -EINVAL;
+                       goto pro_end;
                } else {
                        adev->pm.dpm.forced_level = level;
                }
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
-       return count;
+pro_end:
+       up_read(&adev->reset_sem);
+       return ret;
 }
 
 static ssize_t amdgpu_get_pp_num_states(struct device *dev,
        struct pp_states_info data;
        int i, buf_len, ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
        enum amd_pm_state_type pm = 0;
        int i = 0, ret = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
        struct drm_device *ddev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = ddev->dev_private;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        if (adev->pp_force_state_enabled)
        unsigned long idx;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        if (strlen(buf) == 1)
                        return ret;
                }
 
+               down_read(&adev->reset_sem);
                /* only set user selected power states */
                if (state != POWER_STATE_TYPE_INTERNAL_BOOT &&
                    state != POWER_STATE_TYPE_DEFAULT) {
                                        AMD_PP_TASK_ENABLE_USER_STATE, &state);
                        adev->pp_force_state_enabled = true;
                }
+               up_read(&adev->reset_sem);
+
                pm_runtime_mark_last_busy(ddev->dev);
                pm_runtime_put_autosuspend(ddev->dev);
        }
        char *table = NULL;
        int size, ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
        struct amdgpu_device *adev = ddev->dev_private;
        int ret = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                ret = smu_sys_set_pp_table(&adev->smu, (void *)buf, count);
                if (ret) {
                        pm_runtime_mark_last_busy(ddev->dev);
                        pm_runtime_put_autosuspend(ddev->dev);
+                       up_read(&adev->reset_sem);
                        return ret;
                }
        } else if (adev->powerplay.pp_funcs->set_pp_table)
                amdgpu_dpm_set_pp_table(adev, buf, count);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        const char delimiter[3] = {' ', '\n', '\0'};
        uint32_t type;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        if (count > 127)
                return ret;
        }
 
+       ret = count;
+
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                ret = smu_od_edit_dpm_table(&adev->smu, type,
                                            parameter, parameter_size);
                if (ret) {
                        pm_runtime_mark_last_busy(ddev->dev);
                        pm_runtime_put_autosuspend(ddev->dev);
-                       return -EINVAL;
+                       ret = -EINVAL;
+                       goto pro_end;
                }
        } else {
                if (adev->powerplay.pp_funcs->odn_edit_dpm_table) {
                        if (ret) {
                                pm_runtime_mark_last_busy(ddev->dev);
                                pm_runtime_put_autosuspend(ddev->dev);
-                               return -EINVAL;
+                               ret = -EINVAL;
+                               goto pro_end;
                        }
                }
 
                                                NULL);
                                pm_runtime_mark_last_busy(ddev->dev);
                                pm_runtime_put_autosuspend(ddev->dev);
-                               return count;
+                               ret = count;
+                               goto pro_end;
                        } else {
                                pm_runtime_mark_last_busy(ddev->dev);
                                pm_runtime_put_autosuspend(ddev->dev);
-                               return -EINVAL;
+                               ret = -EINVAL;
+                               goto pro_end;
                        }
                }
        }
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
-       return count;
+pro_end:
+       up_read(&adev->reset_sem);
+       return ret;
 }
 
 static ssize_t amdgpu_get_pp_od_clk_voltage(struct device *dev,
        ssize_t size;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
        uint64_t featuremask;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = kstrtou64(buf, 0, &featuremask);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
        if (is_support_sw_smu(adev)) {
                ret = smu_sys_set_pp_feature_mask(&adev->smu, featuremask);
                if (ret) {
                        pm_runtime_mark_last_busy(ddev->dev);
                        pm_runtime_put_autosuspend(ddev->dev);
+                       up_read(&adev->reset_sem);
                        return -EINVAL;
                }
        } else if (adev->powerplay.pp_funcs->set_ppfeature_status) {
                if (ret) {
                        pm_runtime_mark_last_busy(ddev->dev);
                        pm_runtime_put_autosuspend(ddev->dev);
+                       up_read(&adev->reset_sem);
                        return -EINVAL;
                }
        }
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        ssize_t size;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                size = smu_sys_get_pp_feature_mask(&adev->smu, buf);
        else if (adev->powerplay.pp_funcs->get_ppfeature_status)
        else
                size = snprintf(buf, PAGE_SIZE, "\n");
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        ssize_t size;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                size = smu_print_clk_levels(&adev->smu, SMU_SCLK, buf);
        else if (adev->powerplay.pp_funcs->print_clock_levels)
        else
                size = snprintf(buf, PAGE_SIZE, "\n");
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        int ret;
        uint32_t mask = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = amdgpu_read_mask(buf, count, &mask);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                ret = smu_force_clk_levels(&adev->smu, SMU_SCLK, mask);
        else if (adev->powerplay.pp_funcs->force_clock_level)
                ret = amdgpu_dpm_force_clock_level(adev, PP_SCLK, mask);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        ssize_t size;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                size = smu_print_clk_levels(&adev->smu, SMU_MCLK, buf);
        else if (adev->powerplay.pp_funcs->print_clock_levels)
        else
                size = snprintf(buf, PAGE_SIZE, "\n");
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        uint32_t mask = 0;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = amdgpu_read_mask(buf, count, &mask);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                ret = smu_force_clk_levels(&adev->smu, SMU_MCLK, mask);
        else if (adev->powerplay.pp_funcs->force_clock_level)
                ret = amdgpu_dpm_force_clock_level(adev, PP_MCLK, mask);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        ssize_t size;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                size = smu_print_clk_levels(&adev->smu, SMU_SOCCLK, buf);
        else if (adev->powerplay.pp_funcs->print_clock_levels)
        else
                size = snprintf(buf, PAGE_SIZE, "\n");
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        int ret;
        uint32_t mask = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = amdgpu_read_mask(buf, count, &mask);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                ret = smu_force_clk_levels(&adev->smu, SMU_SOCCLK, mask);
        else if (adev->powerplay.pp_funcs->force_clock_level)
        else
                ret = 0;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        ssize_t size;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                size = smu_print_clk_levels(&adev->smu, SMU_FCLK, buf);
        else if (adev->powerplay.pp_funcs->print_clock_levels)
        else
                size = snprintf(buf, PAGE_SIZE, "\n");
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        int ret;
        uint32_t mask = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = amdgpu_read_mask(buf, count, &mask);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                ret = smu_force_clk_levels(&adev->smu, SMU_FCLK, mask);
        else if (adev->powerplay.pp_funcs->force_clock_level)
        else
                ret = 0;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        ssize_t size;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                size = smu_print_clk_levels(&adev->smu, SMU_DCEFCLK, buf);
        else if (adev->powerplay.pp_funcs->print_clock_levels)
        else
                size = snprintf(buf, PAGE_SIZE, "\n");
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        int ret;
        uint32_t mask = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = amdgpu_read_mask(buf, count, &mask);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                ret = smu_force_clk_levels(&adev->smu, SMU_DCEFCLK, mask);
        else if (adev->powerplay.pp_funcs->force_clock_level)
        else
                ret = 0;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        ssize_t size;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                size = smu_print_clk_levels(&adev->smu, SMU_PCIE, buf);
        else if (adev->powerplay.pp_funcs->print_clock_levels)
        else
                size = snprintf(buf, PAGE_SIZE, "\n");
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        int ret;
        uint32_t mask = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = amdgpu_read_mask(buf, count, &mask);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                ret = smu_force_clk_levels(&adev->smu, SMU_PCIE, mask);
        else if (adev->powerplay.pp_funcs->force_clock_level)
        else
                ret = 0;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        uint32_t value = 0;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                value = smu_get_od_percentage(&(adev->smu), SMU_OD_SCLK);
        else if (adev->powerplay.pp_funcs->get_sclk_od)
                value = amdgpu_dpm_get_sclk_od(adev);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        int ret;
        long int value;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = kstrtol(buf, 0, &value);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                value = smu_set_od_percentage(&(adev->smu), SMU_OD_SCLK, (uint32_t)value);
        } else {
                }
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        uint32_t value = 0;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                value = smu_get_od_percentage(&(adev->smu), SMU_OD_MCLK);
        else if (adev->powerplay.pp_funcs->get_mclk_od)
                value = amdgpu_dpm_get_mclk_od(adev);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        int ret;
        long int value;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = kstrtol(buf, 0, &value);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                value = smu_set_od_percentage(&(adev->smu), SMU_OD_MCLK, (uint32_t)value);
        } else {
                }
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        ssize_t size;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                size = smu_get_power_profile_mode(&adev->smu, buf);
        else if (adev->powerplay.pp_funcs->get_power_profile_mode)
        else
                size = snprintf(buf, PAGE_SIZE, "\n");
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        long int profile_mode = 0;
        const char delimiter[3] = {' ', '\n', '\0'};
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        tmp[0] = *(buf);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                ret = smu_set_power_profile_mode(&adev->smu, parameter, parameter_size, true);
        else if (adev->powerplay.pp_funcs->set_power_profile_mode)
                ret = amdgpu_dpm_set_power_profile_mode(adev, parameter, parameter_size);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        struct amdgpu_device *adev = ddev->dev_private;
        int r, value, size = sizeof(value);
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
        /* read the IP busy sensor */
        r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_LOAD,
                                   (void *)&value, &size);
+       up_read(&adev->reset_sem);
 
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
        struct amdgpu_device *adev = ddev->dev_private;
        int r, value, size = sizeof(value);
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
+
        /* read the IP busy sensor */
        r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_MEM_LOAD,
                                   (void *)&value, &size);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        uint64_t count0 = 0, count1 = 0;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        if (adev->flags & AMD_IS_APU)
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        amdgpu_asic_get_pcie_usage(adev, &count0, &count1);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(ddev->dev);
        pm_runtime_put_autosuspend(ddev->dev);
 
        struct drm_device *ddev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = ddev->dev_private;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        if (adev->unique_id)
        int channel = to_sensor_dev_attr(attr)->index;
        int r, temp = 0, size = sizeof(temp);
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        if (channel >= PP_TEMP_MAX)
                return r;
        }
 
+       down_read(&adev->reset_sem);
+
        switch (channel) {
        case PP_TEMP_JUNCTION:
                /* get current junction temperature */
                break;
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        u32 pwm_mode = 0;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(adev->ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                pwm_mode = smu_get_fan_control_mode(&adev->smu);
        } else {
                if (!adev->powerplay.pp_funcs->get_fan_control_mode) {
                        pm_runtime_mark_last_busy(adev->ddev->dev);
                        pm_runtime_put_autosuspend(adev->ddev->dev);
+                       up_read(&adev->reset_sem);
                        return -EINVAL;
                }
 
                pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        int err, ret;
        int value;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        err = kstrtoint(buf, 10, &value);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                smu_set_fan_control_mode(&adev->smu, value);
        } else {
                if (!adev->powerplay.pp_funcs->set_fan_control_mode) {
                        pm_runtime_mark_last_busy(adev->ddev->dev);
                        pm_runtime_put_autosuspend(adev->ddev->dev);
+                       up_read(&adev->reset_sem);
                        return -EINVAL;
                }
 
                amdgpu_dpm_set_fan_control_mode(adev, value);
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        u32 value;
        u32 pwm_mode;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        err = pm_runtime_get_sync(adev->ddev->dev);
                return err;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                pwm_mode = smu_get_fan_control_mode(&adev->smu);
        else
                pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
 
+       up_read(&adev->reset_sem);
+
        if (pwm_mode != AMD_FAN_CTRL_MANUAL) {
                pr_info("manual fan speed control should be enabled first\n");
                pm_runtime_mark_last_busy(adev->ddev->dev);
        int err;
        u32 speed = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        err = pm_runtime_get_sync(adev->ddev->dev);
                return err;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                err = smu_get_fan_speed_percent(&adev->smu, &speed);
        else if (adev->powerplay.pp_funcs->get_fan_speed_percent)
        else
                err = -EINVAL;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        int err;
        u32 speed = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        err = pm_runtime_get_sync(adev->ddev->dev);
                return err;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                err = smu_get_fan_speed_rpm(&adev->smu, &speed);
        else if (adev->powerplay.pp_funcs->get_fan_speed_rpm)
        else
                err = -EINVAL;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        u32 size = sizeof(min_rpm);
        int r;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(adev->ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
+
        r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_MIN_FAN_RPM,
                                   (void *)&min_rpm, &size);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        u32 size = sizeof(max_rpm);
        int r;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(adev->ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
+
        r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_MAX_FAN_RPM,
                                   (void *)&max_rpm, &size);
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        int err;
        u32 rpm = 0;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        err = pm_runtime_get_sync(adev->ddev->dev);
                return err;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                err = smu_get_fan_speed_rpm(&adev->smu, &rpm);
        else if (adev->powerplay.pp_funcs->get_fan_speed_rpm)
        else
                err = -EINVAL;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        u32 value;
        u32 pwm_mode;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        err = pm_runtime_get_sync(adev->ddev->dev);
                return err;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                pwm_mode = smu_get_fan_control_mode(&adev->smu);
        else
                pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
 
+       up_read(&adev->reset_sem);
+
        if (pwm_mode != AMD_FAN_CTRL_MANUAL) {
                pm_runtime_mark_last_busy(adev->ddev->dev);
                pm_runtime_put_autosuspend(adev->ddev->dev);
                return err;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                err = smu_set_fan_speed_rpm(&adev->smu, value);
        else if (adev->powerplay.pp_funcs->set_fan_speed_rpm)
        else
                err = -EINVAL;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        u32 pwm_mode = 0;
        int ret;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        ret = pm_runtime_get_sync(adev->ddev->dev);
                return ret;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                pwm_mode = smu_get_fan_control_mode(&adev->smu);
        } else {
                if (!adev->powerplay.pp_funcs->get_fan_control_mode) {
                        pm_runtime_mark_last_busy(adev->ddev->dev);
                        pm_runtime_put_autosuspend(adev->ddev->dev);
+                       up_read(&adev->reset_sem);
                        return -EINVAL;
                }
 
                pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        int value;
        u32 pwm_mode;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        err = kstrtoint(buf, 10, &value);
                return err;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                smu_set_fan_control_mode(&adev->smu, pwm_mode);
        } else {
                if (!adev->powerplay.pp_funcs->set_fan_control_mode) {
                        pm_runtime_mark_last_busy(adev->ddev->dev);
                        pm_runtime_put_autosuspend(adev->ddev->dev);
+                       up_read(&adev->reset_sem);
                        return -EINVAL;
                }
                amdgpu_dpm_set_fan_control_mode(adev, pwm_mode);
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        u32 vddgfx;
        int r, size = sizeof(vddgfx);
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(adev->ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
        /* get the voltage */
        r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VDDGFX,
                                   (void *)&vddgfx, &size);
+       up_read(&adev->reset_sem);
 
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
        u32 vddnb;
        int r, size = sizeof(vddnb);
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        /* only APUs have vddnb */
                return r;
        }
 
+       down_read(&adev->reset_sem);
        /* get the voltage */
        r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VDDNB,
                                   (void *)&vddnb, &size);
+       up_read(&adev->reset_sem);
 
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
        int r, size = sizeof(u32);
        unsigned uw;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(adev->ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
        /* get the voltage */
        r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_POWER,
                                   (void *)&query, &size);
+       up_read(&adev->reset_sem);
 
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
        ssize_t size;
        int r;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(adev->ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                smu_get_power_limit(&adev->smu, &limit, true);
                size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000);
                size = snprintf(buf, PAGE_SIZE, "\n");
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        ssize_t size;
        int r;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(adev->ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev)) {
                smu_get_power_limit(&adev->smu, &limit, false);
                size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000);
                size = snprintf(buf, PAGE_SIZE, "\n");
        }
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        int err;
        u32 value;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        if (amdgpu_sriov_vf(adev))
                return err;
        }
 
+       down_read(&adev->reset_sem);
+
        if (is_support_sw_smu(adev))
                err = smu_set_power_limit(&adev->smu, value);
        else if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->set_power_limit)
        else
                err = -EINVAL;
 
+       up_read(&adev->reset_sem);
+
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
 
        uint32_t sclk;
        int r, size = sizeof(sclk);
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(adev->ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
        /* get the sclk */
        r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GFX_SCLK,
                                   (void *)&sclk, &size);
+       up_read(&adev->reset_sem);
 
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
        uint32_t mclk;
        int r, size = sizeof(mclk);
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(adev->ddev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
        /* get the sclk */
        r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GFX_MCLK,
                                   (void *)&mclk, &size);
+       up_read(&adev->reset_sem);
 
        pm_runtime_mark_last_busy(adev->ddev->dev);
        pm_runtime_put_autosuspend(adev->ddev->dev);
        u32 flags = 0;
        int r;
 
-       if (adev->in_gpu_reset)
+       if (amdgpu_in_reset(adev))
                return -EPERM;
 
        r = pm_runtime_get_sync(dev->dev);
                return r;
        }
 
+       down_read(&adev->reset_sem);
        amdgpu_device_ip_get_clockgating_state(adev, &flags);
+       up_read(&adev->reset_sem);
+
        seq_printf(m, "Clock Gating Flags Mask: 0x%x\n", flags);
        amdgpu_parse_cg_state(m, flags);
        seq_printf(m, "\n");
                return 0;
        }
 
+       down_read(&adev->reset_sem);
        if (!is_support_sw_smu(adev) &&
            adev->powerplay.pp_funcs->debugfs_print_current_performance_level) {
                mutex_lock(&adev->pm.mutex);
        } else {
                r = amdgpu_debugfs_pm_info_pp(m, adev);
        }
+       up_read(&adev->reset_sem);
 
        pm_runtime_mark_last_busy(dev->dev);
        pm_runtime_put_autosuspend(dev->dev);