diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 23 | 
1 files changed, 17 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 6e4ae0d983c2..659997bfff30 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c @@ -121,6 +121,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  {  	struct amdgpu_device *adev = ring->adev;  	struct amdgpu_ib *ib = &ibs[0]; +	struct dma_fence *tmp = NULL;  	bool skip_preamble, need_ctx_switch;  	unsigned patch_offset = ~0;  	struct amdgpu_vm *vm; @@ -129,6 +130,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  	unsigned i;  	int r = 0; +	bool need_pipe_sync = false;  	if (num_ibs == 0)  		return -EINVAL; @@ -160,11 +162,19 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  		dev_err(adev->dev, "scheduling IB failed (%d).\n", r);  		return r;  	} -	if (ring->funcs->emit_pipeline_sync && job && job->need_pipeline_sync) -		amdgpu_ring_emit_pipeline_sync(ring); -	if (vm) { -		r = amdgpu_vm_flush(ring, job); +	if (ring->funcs->emit_pipeline_sync && job && +	    ((tmp = amdgpu_sync_get_fence(&job->sched_sync)) || +	     amdgpu_vm_need_pipeline_sync(ring, job))) { +		need_pipe_sync = true; +		dma_fence_put(tmp); +	} + +	if (ring->funcs->insert_start) +		ring->funcs->insert_start(ring); + +	if (job) { +		r = amdgpu_vm_flush(ring, job, need_pipe_sync);  		if (r) {  			amdgpu_ring_undo(ring);  			return r; @@ -188,8 +198,6 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  			status |= AMDGPU_HAVE_CTX_SWITCH;  		status |= job->preamble_status; -		if (vm) -			status |= AMDGPU_VM_DOMAIN;  		amdgpu_ring_emit_cntxcntl(ring, status);  	} @@ -208,6 +216,9 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  		need_ctx_switch = false;  	} +	if (ring->funcs->emit_tmz) +		amdgpu_ring_emit_tmz(ring, false); +  	if (ring->funcs->emit_hdp_invalidate  #ifdef CONFIG_X86_64  	    && !(adev->flags & AMD_IS_APU) |