diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 31 | 
1 files changed, 28 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 71ed27eb3dde..e0890deccb2f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -479,12 +479,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) @@ -735,8 +738,20 @@ static struct pci_driver amdgpu_kms_pci_driver = {  static int __init amdgpu_init(void)  { -	amdgpu_sync_init(); -	amdgpu_fence_slab_init(); +	int r; + +	r = amdgpu_sync_init(); +	if (r) +		goto error_sync; + +	r = amdgpu_fence_slab_init(); +	if (r) +		goto error_fence; + +	r = amd_sched_fence_slab_init(); +	if (r) +		goto error_sched; +  	if (vgacon_text_force()) {  		DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");  		return -EINVAL; @@ -748,6 +763,15 @@ static int __init amdgpu_init(void)  	amdgpu_register_atpx_handler();  	/* let modprobe override vga console setting */  	return drm_pci_init(driver, pdriver); + +error_sched: +	amdgpu_fence_slab_fini(); + +error_fence: +	amdgpu_sync_fini(); + +error_sync: +	return r;  }  static void __exit amdgpu_exit(void) @@ -756,6 +780,7 @@ static void __exit amdgpu_exit(void)  	drm_pci_exit(driver, pdriver);  	amdgpu_unregister_atpx_handler();  	amdgpu_sync_fini(); +	amd_sched_fence_slab_fini();  	amdgpu_fence_slab_fini();  }  | 
