diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 5ed5598997e9..8de765dee3e7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
@@ -113,6 +113,10 @@ static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev, | |||
113 | struct drm_device *ddev = dev_get_drvdata(dev); | 113 | struct drm_device *ddev = dev_get_drvdata(dev); |
114 | struct amdgpu_device *adev = ddev->dev_private; | 114 | struct amdgpu_device *adev = ddev->dev_private; |
115 | 115 | ||
116 | if ((adev->flags & AMD_IS_PX) && | ||
117 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | ||
118 | return snprintf(buf, PAGE_SIZE, "off\n"); | ||
119 | |||
116 | if (adev->pp_enabled) { | 120 | if (adev->pp_enabled) { |
117 | enum amd_dpm_forced_level level; | 121 | enum amd_dpm_forced_level level; |
118 | 122 | ||
@@ -140,6 +144,11 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | |||
140 | enum amdgpu_dpm_forced_level level; | 144 | enum amdgpu_dpm_forced_level level; |
141 | int ret = 0; | 145 | int ret = 0; |
142 | 146 | ||
147 | /* Can't force performance level when the card is off */ | ||
148 | if ((adev->flags & AMD_IS_PX) && | ||
149 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | ||
150 | return -EINVAL; | ||
151 | |||
143 | if (strncmp("low", buf, strlen("low")) == 0) { | 152 | if (strncmp("low", buf, strlen("low")) == 0) { |
144 | level = AMDGPU_DPM_FORCED_LEVEL_LOW; | 153 | level = AMDGPU_DPM_FORCED_LEVEL_LOW; |
145 | } else if (strncmp("high", buf, strlen("high")) == 0) { | 154 | } else if (strncmp("high", buf, strlen("high")) == 0) { |
@@ -181,8 +190,14 @@ static ssize_t amdgpu_hwmon_show_temp(struct device *dev, | |||
181 | char *buf) | 190 | char *buf) |
182 | { | 191 | { |
183 | struct amdgpu_device *adev = dev_get_drvdata(dev); | 192 | struct amdgpu_device *adev = dev_get_drvdata(dev); |
193 | struct drm_device *ddev = adev->ddev; | ||
184 | int temp; | 194 | int temp; |
185 | 195 | ||
196 | /* Can't get temperature when the card is off */ | ||
197 | if ((adev->flags & AMD_IS_PX) && | ||
198 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | ||
199 | return -EINVAL; | ||
200 | |||
186 | if (!adev->pp_enabled && !adev->pm.funcs->get_temperature) | 201 | if (!adev->pp_enabled && !adev->pm.funcs->get_temperature) |
187 | temp = 0; | 202 | temp = 0; |
188 | else | 203 | else |
@@ -846,12 +861,16 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data) | |||
846 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 861 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
847 | struct drm_device *dev = node->minor->dev; | 862 | struct drm_device *dev = node->minor->dev; |
848 | struct amdgpu_device *adev = dev->dev_private; | 863 | struct amdgpu_device *adev = dev->dev_private; |
864 | struct drm_device *ddev = adev->ddev; | ||
849 | 865 | ||
850 | if (!adev->pm.dpm_enabled) { | 866 | if (!adev->pm.dpm_enabled) { |
851 | seq_printf(m, "dpm not enabled\n"); | 867 | seq_printf(m, "dpm not enabled\n"); |
852 | return 0; | 868 | return 0; |
853 | } | 869 | } |
854 | if (adev->pp_enabled) { | 870 | if ((adev->flags & AMD_IS_PX) && |
871 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) { | ||
872 | seq_printf(m, "PX asic powered off\n"); | ||
873 | } else if (adev->pp_enabled) { | ||
855 | amdgpu_dpm_debugfs_print_current_performance_level(adev, m); | 874 | amdgpu_dpm_debugfs_print_current_performance_level(adev, m); |
856 | } else { | 875 | } else { |
857 | mutex_lock(&adev->pm.mutex); | 876 | mutex_lock(&adev->pm.mutex); |