No intended functional change.  Needed to help separate
the IB scheduling and emit logic.

Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 19 +++++++++++--------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c    |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h  |  5 +++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c    |  3 ++-
 4 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index b1cf9550c259b..c1cb47e92d08c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -104,13 +104,11 @@ static void amdgpu_fence_save_fence_wptr_end(struct 
amdgpu_fence *af)
  *
  * @ring: ring the fence is associated with
  * @af: amdgpu fence input
- * @flags: flags to pass into the subordinate .emit_fence() call
  *
  * Emits a fence command on the requested ring (all asics).
  * Returns 0 on success, -ENOMEM on failure.
  */
-int amdgpu_fence_emit(struct amdgpu_ring *ring, struct amdgpu_fence *af,
-                     unsigned int flags)
+int amdgpu_fence_init(struct amdgpu_ring *ring, struct amdgpu_fence *af)
 {
        struct amdgpu_device *adev = ring->adev;
        struct dma_fence *fence;
@@ -126,11 +124,6 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct 
amdgpu_fence *af,
                       &ring->fence_drv.lock,
                       adev->fence_context + ring->idx, seq);
 
-       amdgpu_fence_save_fence_wptr_start(af);
-       amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
-                              seq, flags | AMDGPU_FENCE_FLAG_INT);
-       amdgpu_fence_save_fence_wptr_end(af);
-       amdgpu_fence_save_wptr(af);
        pm_runtime_get_noresume(adev_to_drm(adev)->dev);
        ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask];
        if (unlikely(rcu_dereference_protected(*ptr, 1))) {
@@ -158,6 +151,16 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct 
amdgpu_fence *af,
        return 0;
 }
 
+void amdgpu_fence_emit(struct amdgpu_ring *ring, struct amdgpu_fence *af,
+                      unsigned int flags)
+{
+       amdgpu_fence_save_fence_wptr_start(af);
+       amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
+                              af->base.seqno, flags | AMDGPU_FENCE_FLAG_INT);
+       amdgpu_fence_save_fence_wptr_end(af);
+       amdgpu_fence_save_wptr(af);
+}
+
 /**
  * amdgpu_fence_emit_polling - emit a fence on the requeste ring
  *
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index 036a9fb4e1ca3..49c32ad975203 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -277,7 +277,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
                amdgpu_ring_init_cond_exec(ring, ring->cond_exe_gpu_addr);
        }
 
-       r = amdgpu_fence_emit(ring, af, fence_flags);
+       r = amdgpu_fence_init(ring, af);
        if (r) {
                dev_err(adev->dev, "failed to emit fence (%d)\n", r);
                if (job->vmid)
@@ -285,6 +285,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, struct 
amdgpu_job *job,
                amdgpu_ring_undo(ring);
                return r;
        }
+       amdgpu_fence_emit(ring, af, fence_flags);
        *f = &af->base;
        /* get a ref for the job */
        dma_fence_get(*f);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index da437c349aab9..8aab82af2e0e0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -173,8 +173,9 @@ void amdgpu_fence_driver_hw_init(struct amdgpu_device 
*adev);
 void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev);
 int amdgpu_fence_driver_sw_init(struct amdgpu_device *adev);
 void amdgpu_fence_driver_sw_fini(struct amdgpu_device *adev);
-int amdgpu_fence_emit(struct amdgpu_ring *ring, struct amdgpu_fence *af,
-                     unsigned int flags);
+int amdgpu_fence_init(struct amdgpu_ring *ring, struct amdgpu_fence *af);
+void amdgpu_fence_emit(struct amdgpu_ring *ring, struct amdgpu_fence *af,
+                      unsigned int flags);
 int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s,
                              uint32_t timeout);
 bool amdgpu_fence_process(struct amdgpu_ring *ring);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index e480a65dbdb1c..374991520ad2c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -843,9 +843,10 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct 
amdgpu_job *job)
        if (job->vm_flush_needed ||
            job->pasid_mapping_needed ||
            job->cleaner_shader_needed) {
-               r = amdgpu_fence_emit(ring, job->hw_vm_fence, 0);
+               r = amdgpu_fence_init(ring, job->hw_vm_fence);
                if (r)
                        return r;
+               amdgpu_fence_emit(ring, job->hw_vm_fence, 0);
                fence = &job->hw_vm_fence->base;
                /* get a ref for the job */
                dma_fence_get(fence);
-- 
2.52.0

Reply via email to