From: Jerome Glisse <jglisse@xxxxxxxxxx> Both ib and semaphore are always associated with a fence, rework the sa allocator to store the fence in the sa_bo allowing sa allocator to wait for a fence and retry allocation. This also simplify the ib & semaphore code. Simpify semaphore code to use the sa allocator. Signed-off-by: Christian König <deathsimple@xxxxxxxxxxx> Signed-off-by: Jerome Glisse <jglisse@xxxxxxxxxx> --- drivers/gpu/drm/radeon/evergreen.c | 1 - drivers/gpu/drm/radeon/ni.c | 1 - drivers/gpu/drm/radeon/r600.c | 1 - drivers/gpu/drm/radeon/radeon.h | 75 +++++-------- drivers/gpu/drm/radeon/radeon_cs.c | 4 +- drivers/gpu/drm/radeon/radeon_device.c | 2 - drivers/gpu/drm/radeon/radeon_fence.c | 7 +- drivers/gpu/drm/radeon/radeon_semaphore.c | 161 ++++++----------------------- drivers/gpu/drm/radeon/radeon_test.c | 33 +++--- drivers/gpu/drm/radeon/radeon_ttm.c | 4 +- drivers/gpu/drm/radeon/rv770.c | 1 - drivers/gpu/drm/radeon/si.c | 1 - 12 files changed, 84 insertions(+), 207 deletions(-) diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 465026a..2f39fe4 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -3422,7 +3422,6 @@ void evergreen_fini(struct radeon_device *rdev) evergreen_pcie_gart_fini(rdev); r600_vram_scratch_fini(rdev); radeon_gem_fini(rdev); - radeon_semaphore_driver_fini(rdev); radeon_fence_driver_fini(rdev); radeon_agp_fini(rdev); radeon_bo_fini(rdev); diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index e55ee7b..3160a74 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c @@ -1744,7 +1744,6 @@ void cayman_fini(struct radeon_device *rdev) cayman_pcie_gart_fini(rdev); r600_vram_scratch_fini(rdev); radeon_gem_fini(rdev); - radeon_semaphore_driver_fini(rdev); radeon_fence_driver_fini(rdev); radeon_bo_fini(rdev); radeon_atombios_fini(rdev); diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 9bac947..0cbcd3a 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c @@ -2658,7 +2658,6 @@ void r600_fini(struct radeon_device *rdev) r600_vram_scratch_fini(rdev); radeon_agp_fini(rdev); radeon_gem_fini(rdev); - radeon_semaphore_driver_fini(rdev); radeon_fence_driver_fini(rdev); radeon_bo_fini(rdev); radeon_atombios_fini(rdev); diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 2e83a66..b899cec 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -248,6 +248,34 @@ extern void evergreen_tiling_fields(unsigned tiling_flags, unsigned *bankw, unsigned *tile_split); /* + * Semaphores. + */ +struct radeon_ring; +struct radeon_fence; + +/* everything here is constant */ +struct radeon_semaphore { + struct radeon_sa_bo *sa_bo; + struct list_head list; + uint64_t gpu_addr; + uint32_t *cpu_ptr; + int waiters; +}; + +int radeon_semaphore_create(struct radeon_device *rdev, + struct radeon_fence *fence); +void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, + struct radeon_fence *fence); +void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, + struct radeon_fence *fence); +int radeon_semaphore_sync_rings(struct radeon_device *rdev, + struct radeon_fence *fence, + bool sync_to[RADEON_NUM_RINGS], + int dst_ring); +void radeon_semaphore_free(struct radeon_device *rdev, + struct radeon_fence *fence); + +/* * Fences. */ struct radeon_fence_driver { @@ -273,7 +301,7 @@ struct radeon_fence { bool signaled; /* RB, DMA, etc. */ int ring; - struct radeon_semaphore *semaphore; + struct radeon_semaphore semaphore; }; int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring); @@ -431,50 +459,6 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv, uint32_t handle); /* - * Semaphores. - */ -struct radeon_ring; - -#define RADEON_SEMAPHORE_BO_SIZE 256 - -struct radeon_semaphore_driver { - rwlock_t lock; - struct list_head bo; -}; - -struct radeon_semaphore_bo; - -/* everything here is constant */ -struct radeon_semaphore { - struct list_head list; - uint64_t gpu_addr; - uint32_t *cpu_ptr; - struct radeon_semaphore_bo *bo; -}; - -struct radeon_semaphore_bo { - struct list_head list; - struct radeon_ib *ib; - struct list_head free; - struct radeon_semaphore semaphores[RADEON_SEMAPHORE_BO_SIZE/8]; - unsigned nused; -}; - -void radeon_semaphore_driver_fini(struct radeon_device *rdev); -int radeon_semaphore_create(struct radeon_device *rdev, - struct radeon_semaphore **semaphore); -void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -int radeon_semaphore_sync_rings(struct radeon_device *rdev, - struct radeon_semaphore *semaphore, - bool sync_to[RADEON_NUM_RINGS], - int dst_ring); -void radeon_semaphore_free(struct radeon_device *rdev, - struct radeon_semaphore *semaphore); - -/* * GART structures, functions & helpers */ struct radeon_mc; @@ -1506,7 +1490,6 @@ struct radeon_device { struct radeon_mman mman; rwlock_t fence_lock; struct radeon_fence_driver fence_drv[RADEON_NUM_RINGS]; - struct radeon_semaphore_driver semaphore_drv; struct radeon_ring ring[RADEON_NUM_RINGS]; bool ib_pool_ready; struct radeon_sa_manager ring_tmp_bo; diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 0c0c9d1..82f2e7b0 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c @@ -138,12 +138,12 @@ static int radeon_cs_sync_rings(struct radeon_cs_parser *p) return 0; } - r = radeon_semaphore_create(p->rdev, &p->ib->sa_bo->fence->semaphore); + r = radeon_semaphore_create(p->rdev, p->ib->sa_bo->fence); if (r) { return r; } - return radeon_semaphore_sync_rings(p->rdev, p->ib->sa_bo->fence->semaphore, + return radeon_semaphore_sync_rings(p->rdev, p->ib->sa_bo->fence, sync_to_ring, p->ring); } diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index e316144..1dac27d 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c @@ -732,11 +732,9 @@ int radeon_device_init(struct radeon_device *rdev, mutex_init(&rdev->pm.mutex); mutex_init(&rdev->vram_mutex); rwlock_init(&rdev->fence_lock); - rwlock_init(&rdev->semaphore_drv.lock); INIT_LIST_HEAD(&rdev->gem.objects); init_waitqueue_head(&rdev->irq.vblank_queue); init_waitqueue_head(&rdev->irq.idle_queue); - INIT_LIST_HEAD(&rdev->semaphore_drv.bo); /* initialize vm here */ rdev->vm_manager.use_bitmap = 1; rdev->vm_manager.max_pfn = 1 << 20; diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 5bb78bf..7d0c331 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c @@ -130,8 +130,9 @@ static void radeon_fence_destroy(struct kref *kref) list_del(&fence->list); fence->emitted = false; write_unlock_irqrestore(&fence->rdev->fence_lock, irq_flags); - if (fence->semaphore) - radeon_semaphore_free(fence->rdev, fence->semaphore); + if (fence->semaphore.sa_bo) { + radeon_semaphore_free(fence->rdev, fence); + } kfree(fence); } @@ -149,7 +150,7 @@ int radeon_fence_create(struct radeon_device *rdev, (*fence)->signaled = false; (*fence)->seq = 0; (*fence)->ring = ring; - (*fence)->semaphore = NULL; + (*fence)->semaphore.sa_bo = NULL; INIT_LIST_HEAD(&(*fence)->list); return 0; } diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c index 40a207a..8b083db 100644 --- a/drivers/gpu/drm/radeon/radeon_semaphore.c +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c @@ -31,125 +31,44 @@ #include "drm.h" #include "radeon.h" -static int radeon_semaphore_add_bo(struct radeon_device *rdev) +int radeon_semaphore_create(struct radeon_device *rdev, + struct radeon_fence *fence) { - struct radeon_semaphore_bo *bo; - unsigned long irq_flags; - uint64_t gpu_addr; - uint32_t *cpu_ptr; - int r, i; - - - bo = kmalloc(sizeof(struct radeon_semaphore_bo), GFP_KERNEL); - if (bo == NULL) { - return -ENOMEM; - } - INIT_LIST_HEAD(&bo->free); - INIT_LIST_HEAD(&bo->list); - bo->nused = 0; + uint64_t *ptr; + int r; - r = radeon_ib_get(rdev, 0, &bo->ib, RADEON_SEMAPHORE_BO_SIZE); + r = radeon_sa_bo_new(rdev, &fence->semaphore.sa_bo, + &rdev->ring_tmp_bo, 8, 8, true, fence); if (r) { - dev_err(rdev->dev, "failed to get a bo after 5 retry\n"); - kfree(bo); return r; } - gpu_addr = rdev->ring_tmp_bo.gpu_addr; - gpu_addr += bo->ib->sa_bo->soffset; - cpu_ptr = rdev->ring_tmp_bo.cpu_ptr; - cpu_ptr += (bo->ib->sa_bo->soffset >> 2); - for (i = 0; i < (RADEON_SEMAPHORE_BO_SIZE/8); i++) { - bo->semaphores[i].gpu_addr = gpu_addr; - bo->semaphores[i].cpu_ptr = cpu_ptr; - bo->semaphores[i].bo = bo; - list_add_tail(&bo->semaphores[i].list, &bo->free); - gpu_addr += 8; - cpu_ptr += 2; - } - write_lock_irqsave(&rdev->semaphore_drv.lock, irq_flags); - list_add_tail(&bo->list, &rdev->semaphore_drv.bo); - write_unlock_irqrestore(&rdev->semaphore_drv.lock, irq_flags); - return 0; -} - -static void radeon_semaphore_del_bo_locked(struct radeon_device *rdev, - struct radeon_semaphore_bo *bo) -{ - radeon_ib_free(rdev, &bo->ib); - list_del(&bo->list); - kfree(bo); -} -void radeon_semaphore_shrink_locked(struct radeon_device *rdev) -{ - struct radeon_semaphore_bo *bo, *n; - - if (list_empty(&rdev->semaphore_drv.bo)) { - return; - } - /* only shrink if first bo has free semaphore */ - bo = list_first_entry(&rdev->semaphore_drv.bo, struct radeon_semaphore_bo, list); - if (list_empty(&bo->free)) { - return; - } - list_for_each_entry_safe_continue(bo, n, &rdev->semaphore_drv.bo, list) { - if (bo->nused) - continue; - radeon_semaphore_del_bo_locked(rdev, bo); - } -} - -int radeon_semaphore_create(struct radeon_device *rdev, - struct radeon_semaphore **semaphore) -{ - struct radeon_semaphore_bo *bo; - unsigned long irq_flags; - bool do_retry = true; - int r; - -retry: - *semaphore = NULL; - write_lock_irqsave(&rdev->semaphore_drv.lock, irq_flags); - list_for_each_entry(bo, &rdev->semaphore_drv.bo, list) { - if (list_empty(&bo->free)) - continue; - *semaphore = list_first_entry(&bo->free, struct radeon_semaphore, list); - (*semaphore)->cpu_ptr[0] = 0; - (*semaphore)->cpu_ptr[1] = 0; - list_del(&(*semaphore)->list); - bo->nused++; - break; - } - write_unlock_irqrestore(&rdev->semaphore_drv.lock, irq_flags); - - if (*semaphore == NULL) { - if (do_retry) { - do_retry = false; - r = radeon_semaphore_add_bo(rdev); - if (r) - return r; - goto retry; - } - return -ENOMEM; - } + fence->semaphore.waiters = 0; + fence->semaphore.gpu_addr = rdev->ring_tmp_bo.gpu_addr; + fence->semaphore.gpu_addr += fence->semaphore.sa_bo->soffset; + ptr = rdev->ring_tmp_bo.cpu_ptr; + ptr += fence->semaphore.sa_bo->soffset; + *ptr = 0; return 0; } void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore) + struct radeon_fence *fence) { - radeon_semaphore_ring_emit(rdev, ring, &rdev->ring[ring], semaphore, false); + --fence->semaphore.waiters; + radeon_semaphore_ring_emit(rdev, ring, &rdev->ring[ring], &fence->semaphore, false); } void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore) + struct radeon_fence *fence) { - radeon_semaphore_ring_emit(rdev, ring, &rdev->ring[ring], semaphore, true); + ++fence->semaphore.waiters; + radeon_semaphore_ring_emit(rdev, ring, &rdev->ring[ring], &fence->semaphore, true); } int radeon_semaphore_sync_rings(struct radeon_device *rdev, - struct radeon_semaphore *semaphore, + struct radeon_fence *fence, bool sync_to[RADEON_NUM_RINGS], int dst_ring) { @@ -169,18 +88,20 @@ int radeon_semaphore_sync_rings(struct radeon_device *rdev, goto error; } - r = radeon_ring_lock(rdev, &rdev->ring[i], num_ops * 8); - if (r) + r = radeon_ring_lock(rdev, &rdev->ring[i], num_ops * 8); + if (r) { goto error; + } } for (i = 0; i < RADEON_NUM_RINGS; ++i) { /* no need to sync to our own or unused rings */ - if (!sync_to[i] || i == dst_ring) - continue; + if (!sync_to[i] || i == dst_ring) { + continue; + } - radeon_semaphore_emit_signal(rdev, i, semaphore); - radeon_semaphore_emit_wait(rdev, dst_ring, semaphore); + radeon_semaphore_emit_signal(rdev, i, fence); + radeon_semaphore_emit_wait(rdev, dst_ring, fence); } for (i = 0; i < RADEON_NUM_RINGS; ++i) { @@ -205,29 +126,11 @@ error: } void radeon_semaphore_free(struct radeon_device *rdev, - struct radeon_semaphore *semaphore) -{ - unsigned long irq_flags; - - write_lock_irqsave(&rdev->semaphore_drv.lock, irq_flags); - semaphore->bo->nused--; - list_add_tail(&semaphore->list, &semaphore->bo->free); - radeon_semaphore_shrink_locked(rdev); - write_unlock_irqrestore(&rdev->semaphore_drv.lock, irq_flags); -} - -void radeon_semaphore_driver_fini(struct radeon_device *rdev) + struct radeon_fence *fence) { - struct radeon_semaphore_bo *bo, *n; - unsigned long irq_flags; - - write_lock_irqsave(&rdev->semaphore_drv.lock, irq_flags); - /* we force to free everything */ - list_for_each_entry_safe(bo, n, &rdev->semaphore_drv.bo, list) { - if (!list_empty(&bo->free)) { - dev_err(rdev->dev, "still in use semaphore\n"); - } - radeon_semaphore_del_bo_locked(rdev, bo); + if (fence->semaphore.waiters > 0) { + dev_err(rdev->dev, "Semaphore %p has more waiters than signalers," + " hardware lockup imminent!\n", fence); } - write_unlock_irqrestore(&rdev->semaphore_drv.lock, irq_flags); + radeon_sa_bo_free(rdev, &fence->semaphore.sa_bo); } diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c index dc5dcf4..94b5ab4 100644 --- a/drivers/gpu/drm/radeon/radeon_test.c +++ b/drivers/gpu/drm/radeon/radeon_test.c @@ -240,7 +240,6 @@ void radeon_test_ring_sync(struct radeon_device *rdev, struct radeon_ring *ringB) { struct radeon_fence *fence1 = NULL, *fence2 = NULL; - struct radeon_semaphore *semaphore = NULL; int ridxA = radeon_ring_index(rdev, ringA); int ridxB = radeon_ring_index(rdev, ringB); int r; @@ -256,7 +255,12 @@ void radeon_test_ring_sync(struct radeon_device *rdev, goto out_cleanup; } - r = radeon_semaphore_create(rdev, &semaphore); + r = radeon_semaphore_create(rdev, fence1); + if (r) { + DRM_ERROR("Failed to create semaphore\n"); + goto out_cleanup; + } + r = radeon_semaphore_create(rdev, fence2); if (r) { DRM_ERROR("Failed to create semaphore\n"); goto out_cleanup; @@ -267,9 +271,9 @@ void radeon_test_ring_sync(struct radeon_device *rdev, DRM_ERROR("Failed to lock ring A %d\n", ridxA); goto out_cleanup; } - radeon_semaphore_emit_wait(rdev, ridxA, semaphore); + radeon_semaphore_emit_wait(rdev, ridxA, fence1); radeon_fence_emit(rdev, fence1); - radeon_semaphore_emit_wait(rdev, ridxA, semaphore); + radeon_semaphore_emit_wait(rdev, ridxA, fence2); radeon_fence_emit(rdev, fence2); radeon_ring_unlock_commit(rdev, ringA); @@ -285,7 +289,7 @@ void radeon_test_ring_sync(struct radeon_device *rdev, DRM_ERROR("Failed to lock ring B %p\n", ringB); goto out_cleanup; } - radeon_semaphore_emit_signal(rdev, ridxB, semaphore); + radeon_semaphore_emit_signal(rdev, ridxB, fence1); radeon_ring_unlock_commit(rdev, ringB); r = radeon_fence_wait(fence1, false); @@ -306,7 +310,7 @@ void radeon_test_ring_sync(struct radeon_device *rdev, DRM_ERROR("Failed to lock ring B %p\n", ringB); goto out_cleanup; } - radeon_semaphore_emit_signal(rdev, ridxB, semaphore); + radeon_semaphore_emit_signal(rdev, ridxB, fence2); radeon_ring_unlock_commit(rdev, ringB); r = radeon_fence_wait(fence2, false); @@ -316,9 +320,6 @@ void radeon_test_ring_sync(struct radeon_device *rdev, } out_cleanup: - if (semaphore) - radeon_semaphore_free(rdev, semaphore); - if (fence1) radeon_fence_unref(&fence1); @@ -335,7 +336,6 @@ void radeon_test_ring_sync2(struct radeon_device *rdev, struct radeon_ring *ringC) { struct radeon_fence *fenceA = NULL, *fenceB = NULL; - struct radeon_semaphore *semaphore = NULL; int ridxA = radeon_ring_index(rdev, ringA); int ridxB = radeon_ring_index(rdev, ringB); int ridxC = radeon_ring_index(rdev, ringC); @@ -353,7 +353,7 @@ void radeon_test_ring_sync2(struct radeon_device *rdev, goto out_cleanup; } - r = radeon_semaphore_create(rdev, &semaphore); + r = radeon_semaphore_create(rdev, fenceA); if (r) { DRM_ERROR("Failed to create semaphore\n"); goto out_cleanup; @@ -364,7 +364,7 @@ void radeon_test_ring_sync2(struct radeon_device *rdev, DRM_ERROR("Failed to lock ring A %d\n", ridxA); goto out_cleanup; } - radeon_semaphore_emit_wait(rdev, ridxA, semaphore); + radeon_semaphore_emit_wait(rdev, ridxA, fenceA); radeon_fence_emit(rdev, fenceA); radeon_ring_unlock_commit(rdev, ringA); @@ -373,7 +373,7 @@ void radeon_test_ring_sync2(struct radeon_device *rdev, DRM_ERROR("Failed to lock ring B %d\n", ridxB); goto out_cleanup; } - radeon_semaphore_emit_wait(rdev, ridxB, semaphore); + radeon_semaphore_emit_wait(rdev, ridxB, fenceA); radeon_fence_emit(rdev, fenceB); radeon_ring_unlock_commit(rdev, ringB); @@ -393,7 +393,7 @@ void radeon_test_ring_sync2(struct radeon_device *rdev, DRM_ERROR("Failed to lock ring B %p\n", ringC); goto out_cleanup; } - radeon_semaphore_emit_signal(rdev, ridxC, semaphore); + radeon_semaphore_emit_signal(rdev, ridxC, fenceA); radeon_ring_unlock_commit(rdev, ringC); for (i = 0; i < 30; ++i) { @@ -419,7 +419,7 @@ void radeon_test_ring_sync2(struct radeon_device *rdev, DRM_ERROR("Failed to lock ring B %p\n", ringC); goto out_cleanup; } - radeon_semaphore_emit_signal(rdev, ridxC, semaphore); + radeon_semaphore_emit_signal(rdev, ridxC, fenceA); radeon_ring_unlock_commit(rdev, ringC); mdelay(1000); @@ -436,9 +436,6 @@ void radeon_test_ring_sync2(struct radeon_device *rdev, } out_cleanup: - if (semaphore) - radeon_semaphore_free(rdev, semaphore); - if (fenceA) radeon_fence_unref(&fenceA); diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 5e3d54d..ece43b7 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -272,13 +272,13 @@ static int radeon_move_blit(struct ttm_buffer_object *bo, bool sync_to_ring[RADEON_NUM_RINGS] = { }; sync_to_ring[old_fence->ring] = true; - r = radeon_semaphore_create(rdev, &fence->semaphore); + r = radeon_semaphore_create(rdev, fence); if (r) { radeon_fence_unref(&fence); return r; } - r = radeon_semaphore_sync_rings(rdev, fence->semaphore, + r = radeon_semaphore_sync_rings(rdev, fence, sync_to_ring, fence->ring); if (r) { radeon_fence_unref(&fence); diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index a8b0016..40f82e2 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c @@ -1278,7 +1278,6 @@ void rv770_fini(struct radeon_device *rdev) rv770_pcie_gart_fini(rdev); r600_vram_scratch_fini(rdev); radeon_gem_fini(rdev); - radeon_semaphore_driver_fini(rdev); radeon_fence_driver_fini(rdev); radeon_agp_fini(rdev); radeon_bo_fini(rdev); diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index de37f09..eb49483 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c @@ -4107,7 +4107,6 @@ void si_fini(struct radeon_device *rdev) si_pcie_gart_fini(rdev); r600_vram_scratch_fini(rdev); radeon_gem_fini(rdev); - radeon_semaphore_driver_fini(rdev); radeon_fence_driver_fini(rdev); radeon_bo_fini(rdev); radeon_atombios_fini(rdev); -- 1.7.7.6 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel