drm/radeon: Replace some spinlocks by lockmgr locks master
authorFrançois Tigeot <ftigeot@wolfpond.org>
Sun, 19 Feb 2017 20:09:34 +0000 (21:09 +0100)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Sun, 19 Feb 2017 21:15:36 +0000 (22:15 +0100)
The original Linux code uses struct mutexes instead of spinlocks for
gem.mutex, gpu_clock_mutex and srbm_mutex.

sys/dev/drm/radeon/cik.c
sys/dev/drm/radeon/r600.c
sys/dev/drm/radeon/radeon.h
sys/dev/drm/radeon/radeon_device.c
sys/dev/drm/radeon/radeon_gem.c
sys/dev/drm/radeon/radeon_object.c
sys/dev/drm/radeon/si.c

index d8947f4..73df88e 100644 (file)
@@ -4483,11 +4483,11 @@ u32 cik_compute_get_rptr(struct radeon_device *rdev,
        if (rdev->wb.enabled) {
                rptr = rdev->wb.wb[ring->rptr_offs/4];
        } else {
-               spin_lock(&rdev->srbm_mutex);
+               mutex_lock(&rdev->srbm_mutex);
                cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
                rptr = RREG32(CP_HQD_PQ_RPTR);
                cik_srbm_select(rdev, 0, 0, 0, 0);
-               spin_unlock(&rdev->srbm_mutex);
+               mutex_unlock(&rdev->srbm_mutex);
        }
 
        return rptr;
@@ -4502,11 +4502,11 @@ u32 cik_compute_get_wptr(struct radeon_device *rdev,
                /* XXX check if swapping is necessary on BE */
                wptr = rdev->wb.wb[ring->wptr_offs/4];
        } else {
-               spin_lock(&rdev->srbm_mutex);
+               mutex_lock(&rdev->srbm_mutex);
                cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
                wptr = RREG32(CP_HQD_PQ_WPTR);
                cik_srbm_select(rdev, 0, 0, 0, 0);
-               spin_unlock(&rdev->srbm_mutex);
+               mutex_unlock(&rdev->srbm_mutex);
        }
 
        return wptr;
@@ -4832,7 +4832,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
        WREG32(CP_CPF_DEBUG, tmp);
 
        /* init the pipes */
-       spin_lock(&rdev->srbm_mutex);
+       mutex_lock(&rdev->srbm_mutex);
        for (i = 0; i < (rdev->mec.num_pipe * rdev->mec.num_mec); i++) {
                int me = (i < 4) ? 1 : 2;
                int pipe = (i < 4) ? i : (i - 4);
@@ -4855,7 +4855,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
                WREG32(CP_HPD_EOP_CONTROL, tmp);
        }
        cik_srbm_select(rdev, 0, 0, 0, 0);
-       spin_unlock(&rdev->srbm_mutex);
+       mutex_unlock(&rdev->srbm_mutex);
 
        /* init the queues.  Just two for now. */
        for (i = 0; i < 2; i++) {
@@ -4905,7 +4905,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
                mqd->static_thread_mgmt23[0] = 0xffffffff;
                mqd->static_thread_mgmt23[1] = 0xffffffff;
 
-               spin_lock(&rdev->srbm_mutex);
+               mutex_lock(&rdev->srbm_mutex);
                cik_srbm_select(rdev, rdev->ring[idx].me,
                                rdev->ring[idx].pipe,
                                rdev->ring[idx].queue, 0);
@@ -5032,7 +5032,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
                WREG32(CP_HQD_ACTIVE, mqd->queue_state.cp_hqd_active);
 
                cik_srbm_select(rdev, 0, 0, 0, 0);
-               spin_unlock(&rdev->srbm_mutex);
+               mutex_unlock(&rdev->srbm_mutex);
 
                radeon_bo_kunmap(rdev->ring[idx].mqd_obj);
                radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
@@ -5798,7 +5798,7 @@ static int cik_pcie_gart_enable(struct radeon_device *rdev)
 
        /* XXX SH_MEM regs */
        /* where to put LDS, scratch, GPUVM in FSA64 space */
-       spin_lock(&rdev->srbm_mutex);
+       mutex_lock(&rdev->srbm_mutex);
        for (i = 0; i < 16; i++) {
                cik_srbm_select(rdev, 0, 0, 0, i);
                /* CP and shaders */
@@ -5814,7 +5814,7 @@ static int cik_pcie_gart_enable(struct radeon_device *rdev)
                /* XXX SDMA RLC - todo */
        }
        cik_srbm_select(rdev, 0, 0, 0, 0);
-       spin_unlock(&rdev->srbm_mutex);
+       mutex_unlock(&rdev->srbm_mutex);
 
        cik_pcie_gart_tlb_flush(rdev);
        DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
@@ -9487,11 +9487,11 @@ uint64_t cik_get_gpu_clock_counter(struct radeon_device *rdev)
 {
        uint64_t clock;
 
-       spin_lock(&rdev->gpu_clock_mutex);
+       mutex_lock(&rdev->gpu_clock_mutex);
        WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
        clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
-               ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
-       spin_unlock(&rdev->gpu_clock_mutex);
+               ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
+       mutex_unlock(&rdev->gpu_clock_mutex);
        return clock;
 }
 
index 262c63a..f7714ea 100644 (file)
@@ -4507,10 +4507,10 @@ uint64_t r600_get_gpu_clock_counter(struct radeon_device *rdev)
 {
        uint64_t clock;
 
-       spin_lock(&rdev->gpu_clock_mutex);
+       mutex_lock(&rdev->gpu_clock_mutex);
        WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
        clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
-               ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
-       spin_unlock(&rdev->gpu_clock_mutex);
+               ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
+       mutex_unlock(&rdev->gpu_clock_mutex);
        return clock;
 }
index e3a4a94..6788543 100644 (file)
@@ -558,7 +558,7 @@ struct radeon_sa_bo {
  * GEM objects.
  */
 struct radeon_gem {
-       struct spinlock         mutex;
+       struct lock             mutex;
        struct list_head        objects;
 };
 
@@ -2379,7 +2379,7 @@ struct radeon_device {
        unsigned                debugfs_count;
        /* virtual memory */
        struct radeon_vm_manager        vm_manager;
-       struct spinlock                 gpu_clock_mutex;
+       struct lock                     gpu_clock_mutex;
        /* memory stats */
        atomic64_t                      vram_usage;
        atomic64_t                      gtt_usage;
@@ -2388,7 +2388,7 @@ struct radeon_device {
        struct radeon_atif              atif;
        struct radeon_atcs              atcs;
        /* srbm instance registers */
-       struct spinlock                 srbm_mutex;
+       struct lock                     srbm_mutex;
        /* clock, powergating flags */
        u32 cg_flags;
        u32 pg_flags;
index 7fd3d4e..9ef4ee7 100644 (file)
@@ -1279,11 +1279,12 @@ int radeon_device_init(struct radeon_device *rdev,
        lockinit(&rdev->dc_hw_i2c_mutex,
                 "drm__radeon_device__dc_hw_i2c_mutex", 0, LK_CANRECURSE);
        atomic_set(&rdev->ih.lock, 0);
-       spin_init(&rdev->gem.mutex, "radeon_gemmtx");
+       lockinit(&rdev->gem.mutex, "radeon_gemmtx", 0, LK_CANRECURSE);
        lockinit(&rdev->pm.mutex, "drm__radeon_device__pm__mutex", 0,
                 LK_CANRECURSE);
-       spin_init(&rdev->gpu_clock_mutex, "radeon_clockmtx");
-       spin_init(&rdev->srbm_mutex, "radeon_srbm_mutex");
+
+       lockinit(&rdev->gpu_clock_mutex, "radeon_clockmtx", 0, LK_CANRECURSE);
+       lockinit(&rdev->srbm_mutex, "radeon_srbm_mutex", 0, LK_CANRECURSE);
        lockinit(&rdev->pm.mclk_lock, "drm__radeon_device__pm__mclk_lock", 0,
                 LK_CANRECURSE);
        lockinit(&rdev->exclusive_lock, "drm__radeon_device__exclusive_lock",
index a3c934e..6987f4d 100644 (file)
@@ -88,9 +88,9 @@ retry:
        *obj = &robj->gem_base;
        robj->pid = curproc ? curproc->p_pid : 0;
 
-       spin_lock(&rdev->gem.mutex);
+       mutex_lock(&rdev->gem.mutex);
        list_add_tail(&robj->list, &rdev->gem.objects);
-       spin_unlock(&rdev->gem.mutex);
+       mutex_unlock(&rdev->gem.mutex);
 
        return 0;
 }
index 3fa72d1..09f9b7b 100644 (file)
@@ -75,9 +75,9 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)
 
        radeon_update_memory_usage(bo, bo->tbo.mem.mem_type, -1);
 
-       spin_lock(&bo->rdev->gem.mutex);
+       mutex_lock(&bo->rdev->gem.mutex);
        list_del_init(&bo->list);
-       spin_unlock(&bo->rdev->gem.mutex);
+       mutex_unlock(&bo->rdev->gem.mutex);
        radeon_bo_clear_surface_reg(bo);
        WARN_ON(!list_empty(&bo->va));
        drm_gem_object_release(&bo->gem_base);
@@ -403,9 +403,9 @@ void radeon_bo_force_delete(struct radeon_device *rdev)
                dev_err(rdev->dev, "%p %p %lu %lu force free\n",
                        &bo->gem_base, bo, (unsigned long)bo->gem_base.size,
                        *((unsigned long *)&bo->gem_base.refcount));
-               spin_lock(&bo->rdev->gem.mutex);
+               mutex_lock(&bo->rdev->gem.mutex);
                list_del_init(&bo->list);
-               spin_unlock(&bo->rdev->gem.mutex);
+               mutex_unlock(&bo->rdev->gem.mutex);
                /* this should unref the ttm bo */
                drm_gem_object_unreference(&bo->gem_base);
        }
index 03c9bd9..447dfb7 100644 (file)
@@ -7104,11 +7104,11 @@ uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev)
 {
        uint64_t clock;
 
-       spin_lock(&rdev->gpu_clock_mutex);
+       mutex_lock(&rdev->gpu_clock_mutex);
        WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
        clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
-               ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
-       spin_unlock(&rdev->gpu_clock_mutex);
+               ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
+       mutex_unlock(&rdev->gpu_clock_mutex);
        return clock;
 }