Am 06.12.2016 um 23:55 schrieb Alex Deucher: > We can't just reuse pci_remove as there may be userspace still > doing things. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98638 > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97980 > Signed-off-by: Alex Deucher <alexander.deucher at amd.com> > Cc: stable at vger.kernel.org Reviewed-by: Christian König <christian.koenig at amd.com>. > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 5 ++++- > 3 files changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 946dfcc..123f8152 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -1714,6 +1714,7 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev, > struct drm_file *file_priv); > void amdgpu_driver_preclose_kms(struct drm_device *dev, > struct drm_file *file_priv); > +int amdgpu_suspend(struct amdgpu_device *adev); > int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon); > int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon); > u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe); > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index 4701d94..8b39fd3 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -1530,7 +1530,7 @@ static int amdgpu_fini(struct amdgpu_device *adev) > return 0; > } > > -static int amdgpu_suspend(struct amdgpu_device *adev) > +int amdgpu_suspend(struct amdgpu_device *adev) > { > int i, r; > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > index 3210081..6e4e3a1 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > @@ -486,12 +486,15 @@ amdgpu_pci_remove(struct pci_dev *pdev) > static void > amdgpu_pci_shutdown(struct pci_dev *pdev) > { > + struct drm_device *dev = pci_get_drvdata(pdev); > + struct amdgpu_device *adev = dev->dev_private; > + > /* if we are running in a VM, make sure the device > * torn down properly on reboot/shutdown. > * unfortunately we can't detect certain > * hypervisors so just do this all the time. > */ > - amdgpu_pci_remove(pdev); > + amdgpu_suspend(adev); > } > > static int amdgpu_pmops_suspend(struct device *dev)