Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: free the BO in kernel by helper amdgpu_bo_free_kernel()

Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Junwei Zhang and committed by
Alex Deucher
8640faed aa1d562e

+16 -46
+3 -13
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
··· 119 119 */ 120 120 void amdgpu_ih_ring_fini(struct amdgpu_device *adev) 121 121 { 122 - int r; 123 - 124 122 if (adev->irq.ih.use_bus_addr) { 125 123 if (adev->irq.ih.ring) { 126 124 /* add 8 bytes for the rptr/wptr shadows and ··· 130 132 adev->irq.ih.ring = NULL; 131 133 } 132 134 } else { 133 - if (adev->irq.ih.ring_obj) { 134 - r = amdgpu_bo_reserve(adev->irq.ih.ring_obj, false); 135 - if (likely(r == 0)) { 136 - amdgpu_bo_kunmap(adev->irq.ih.ring_obj); 137 - amdgpu_bo_unpin(adev->irq.ih.ring_obj); 138 - amdgpu_bo_unreserve(adev->irq.ih.ring_obj); 139 - } 140 - amdgpu_bo_unref(&adev->irq.ih.ring_obj); 141 - adev->irq.ih.ring = NULL; 142 - adev->irq.ih.ring_obj = NULL; 143 - } 135 + amdgpu_bo_free_kernel(&adev->irq.ih.ring_obj, 136 + &adev->irq.ih.gpu_addr, 137 + (void **)&adev->irq.ih.ring); 144 138 amdgpu_wb_free(adev, adev->irq.ih.wptr_offs); 145 139 amdgpu_wb_free(adev, adev->irq.ih.rptr_offs); 146 140 }
+4 -15
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
··· 252 252 */ 253 253 void amdgpu_ring_fini(struct amdgpu_ring *ring) 254 254 { 255 - int r; 256 - struct amdgpu_bo *ring_obj; 257 - 258 - ring_obj = ring->ring_obj; 259 255 ring->ready = false; 260 - ring->ring = NULL; 261 - ring->ring_obj = NULL; 262 256 263 257 amdgpu_wb_free(ring->adev, ring->cond_exe_offs); 264 258 amdgpu_wb_free(ring->adev, ring->fence_offs); 265 259 amdgpu_wb_free(ring->adev, ring->rptr_offs); 266 260 amdgpu_wb_free(ring->adev, ring->wptr_offs); 267 261 268 - if (ring_obj) { 269 - r = amdgpu_bo_reserve(ring_obj, false); 270 - if (likely(r == 0)) { 271 - amdgpu_bo_kunmap(ring_obj); 272 - amdgpu_bo_unpin(ring_obj); 273 - amdgpu_bo_unreserve(ring_obj); 274 - } 275 - amdgpu_bo_unref(&ring_obj); 276 - } 262 + amdgpu_bo_free_kernel(&ring->ring_obj, 263 + &ring->gpu_addr, 264 + (void **)&ring->ring); 265 + 277 266 amdgpu_debugfs_ring_fini(ring); 278 267 } 279 268
+3 -12
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
··· 249 249 250 250 int amdgpu_uvd_sw_fini(struct amdgpu_device *adev) 251 251 { 252 - int r; 253 - 254 252 kfree(adev->uvd.saved_bo); 255 253 256 254 amd_sched_entity_fini(&adev->uvd.ring.sched, &adev->uvd.entity); 257 255 258 - if (adev->uvd.vcpu_bo) { 259 - r = amdgpu_bo_reserve(adev->uvd.vcpu_bo, false); 260 - if (!r) { 261 - amdgpu_bo_kunmap(adev->uvd.vcpu_bo); 262 - amdgpu_bo_unpin(adev->uvd.vcpu_bo); 263 - amdgpu_bo_unreserve(adev->uvd.vcpu_bo); 264 - } 265 - 266 - amdgpu_bo_unref(&adev->uvd.vcpu_bo); 267 - } 256 + amdgpu_bo_free_kernel(&adev->uvd.vcpu_bo, 257 + &adev->uvd.gpu_addr, 258 + (void **)&adev->uvd.cpu_addr); 268 259 269 260 amdgpu_ring_fini(&adev->uvd.ring); 270 261
+3 -3
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 4490 4490 int i; 4491 4491 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 4492 4492 4493 - amdgpu_bo_unref(&adev->gds.oa_gfx_bo); 4494 - amdgpu_bo_unref(&adev->gds.gws_gfx_bo); 4495 - amdgpu_bo_unref(&adev->gds.gds_gfx_bo); 4493 + amdgpu_bo_free_kernel(&adev->gds.oa_gfx_bo, NULL, NULL); 4494 + amdgpu_bo_free_kernel(&adev->gds.gws_gfx_bo, NULL, NULL); 4495 + amdgpu_bo_free_kernel(&adev->gds.gds_gfx_bo, NULL, NULL); 4496 4496 4497 4497 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 4498 4498 amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
+3 -3
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
··· 2109 2109 int i; 2110 2110 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2111 2111 2112 - amdgpu_bo_unref(&adev->gds.oa_gfx_bo); 2113 - amdgpu_bo_unref(&adev->gds.gws_gfx_bo); 2114 - amdgpu_bo_unref(&adev->gds.gds_gfx_bo); 2112 + amdgpu_bo_free_kernel(&adev->gds.oa_gfx_bo, NULL, NULL); 2113 + amdgpu_bo_free_kernel(&adev->gds.gws_gfx_bo, NULL, NULL); 2114 + amdgpu_bo_free_kernel(&adev->gds.gds_gfx_bo, NULL, NULL); 2115 2115 2116 2116 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 2117 2117 amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);