diff options
| author | Andrey Grodzovsky <andrey.grodzovsky@amd.com> | 2021-05-12 10:26:34 -0400 | 
|---|---|---|
| committer | Andrey Grodzovsky <andrey.grodzovsky@amd.com> | 2021-05-19 23:45:49 -0400 | 
| commit | 72c8c97b1522ce7ed1789a42fc9828784ebb5e23 (patch) | |
| tree | b02f8fee35064eb92c291dce4cd2d06daca55525 /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |
| parent | 267d51d77fdae8708b94e1a24b8e5d961297edb7 (diff) | |
drm/amdgpu: Split amdgpu_device_fini into early and late
Some of the stuff in amdgpu_device_fini such as HW interrupts
disable and pending fences finilization must be done right away on
pci_remove while most of the stuff which relates to finilizing and
releasing driver data structures can be kept until
drm_driver.release hook is called, i.e. when the last device
reference is dropped.
v4: Change functions prefix early->hw and late->sw
Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210512142648.666476-3-andrey.grodzovsky@amd.com
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 26 | 
1 files changed, 18 insertions, 8 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 7d3b54615147..8bee95ad32d9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -3646,15 +3646,13 @@ failed_unmap:   * Tear down the driver info (all asics).   * Called at driver shutdown.   */ -void amdgpu_device_fini(struct amdgpu_device *adev) +void amdgpu_device_fini_hw(struct amdgpu_device *adev)  {  	dev_info(adev->dev, "amdgpu: finishing device.\n");  	flush_delayed_work(&adev->delayed_init_work);  	ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);  	adev->shutdown = true; -	kfree(adev->pci_state); -  	/* make sure IB test finished before entering exclusive mode  	 * to avoid preemption on IB test  	 * */ @@ -3671,11 +3669,24 @@ void amdgpu_device_fini(struct amdgpu_device *adev)  		else  			drm_atomic_helper_shutdown(adev_to_drm(adev));  	} -	amdgpu_fence_driver_fini(adev); +	amdgpu_fence_driver_fini_hw(adev); +  	if (adev->pm_sysfs_en)  		amdgpu_pm_sysfs_fini(adev); +	if (adev->ucode_sysfs_en) +		amdgpu_ucode_sysfs_fini(adev); +	sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes); + +  	amdgpu_fbdev_fini(adev); + +	amdgpu_irq_fini_hw(adev); +} + +void amdgpu_device_fini_sw(struct amdgpu_device *adev) +{  	amdgpu_device_ip_fini(adev); +	amdgpu_fence_driver_fini_sw(adev);  	release_firmware(adev->firmware.gpu_info_fw);  	adev->firmware.gpu_info_fw = NULL;  	adev->accel_working = false; @@ -3701,14 +3712,13 @@ void amdgpu_device_fini(struct amdgpu_device *adev)  	adev->rmmio = NULL;  	amdgpu_device_doorbell_fini(adev); -	if (adev->ucode_sysfs_en) -		amdgpu_ucode_sysfs_fini(adev); - -	sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);  	if (IS_ENABLED(CONFIG_PERF_EVENTS))  		amdgpu_pmu_fini(adev);  	if (adev->mman.discovery_bin)  		amdgpu_discovery_fini(adev); + +	kfree(adev->pci_state); +  } | 
