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_fence.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_fence.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 15 | 
1 files changed, 14 insertions, 1 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index 47ea46859618..1ffb36bd0b19 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -523,7 +523,7 @@ int amdgpu_fence_driver_init(struct amdgpu_device *adev)   *   * Tear down the fence driver for all possible rings (all asics).   */ -void amdgpu_fence_driver_fini(struct amdgpu_device *adev) +void amdgpu_fence_driver_fini_hw(struct amdgpu_device *adev)  {  	unsigned i, j;  	int r; @@ -545,6 +545,19 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)  				       ring->fence_drv.irq_type);  		del_timer_sync(&ring->fence_drv.fallback_timer); +	} +} + +void amdgpu_fence_driver_fini_sw(struct amdgpu_device *adev) +{ +	unsigned int i, j; + +	for (i = 0; i < AMDGPU_MAX_RINGS; i++) { +		struct amdgpu_ring *ring = adev->rings[i]; + +		if (!ring || !ring->fence_drv.initialized) +			continue; +  		for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)  			dma_fence_put(ring->fence_drv.fences[j]);  		kfree(ring->fence_drv.fences); | 
