/**
* amdgpu_pm_dev_state_check - Check if device can be accessed.
* @adev: Target device.
+ * @runpm: Check runpm status for suspend state checks.
*
* Checks the state of the @adev for access. Return 0 if the device is
* accessible or a negative error code otherwise.
*/
-static int amdgpu_pm_dev_state_check(struct amdgpu_device *adev)
+static int amdgpu_pm_dev_state_check(struct amdgpu_device *adev, bool runpm)
{
+ bool runpm_check = runpm ? adev->in_runpm : false;
+
if (amdgpu_in_reset(adev))
return -EPERM;
- if (adev->in_suspend && !adev->in_runpm)
+ if (adev->in_suspend && !runpm_check)
return -EPERM;
return 0;
{
int ret;
- ret = amdgpu_pm_dev_state_check(adev);
+ ret = amdgpu_pm_dev_state_check(adev, true);
if (ret)
return ret;
{
int ret;
- ret = amdgpu_pm_dev_state_check(adev);
+ /* Ignore runpm status. If device is in suspended state, deny access */
+ ret = amdgpu_pm_dev_state_check(adev, false);
if (ret)
return ret;
+ /*
+ * Allow only if device is active. If runpm is disabled also, as in
+ * kernels without CONFIG_PM, allow access.
+ */
ret = pm_runtime_get_if_active(adev->dev);
- if (ret <= 0)
- return ret ?: -EPERM;
+ if (!ret)
+ return -EPERM;
return 0;
}
struct amdgpu_device *adev = drm_to_adev(ddev);
int ret;
- ret = amdgpu_pm_dev_state_check(adev);
+ ret = amdgpu_pm_dev_state_check(adev, true);
if (ret)
return ret;
struct amdgpu_device *adev = drm_to_adev(ddev);
int r;
- r = amdgpu_pm_dev_state_check(adev);
+ r = amdgpu_pm_dev_state_check(adev, true);
if (r)
return r;
if (adev->unique_id)
policy_attr =
container_of(attr, struct amdgpu_pm_policy_attr, dev_attr);
- r = amdgpu_pm_dev_state_check(adev);
+ r = amdgpu_pm_dev_state_check(adev, true);
if (r)
return r;
void *smu_prv_buf;
int ret = 0;
- ret = amdgpu_pm_dev_state_check(adev);
+ ret = amdgpu_pm_dev_state_check(adev, true);
if (ret)
return ret;