diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2017-01-24 09:57:18 -0800 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2017-01-24 09:57:18 -0800 | 
| commit | 62ed8ceda1699acae01b666497f004bfd3d67a6f (patch) | |
| tree | fe38c83c49dfd568b540666948ef78cb9d082c38 /drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | |
| parent | 1c3415a06b1016a596bfe59e0cfee56c773aa958 (diff) | |
| parent | 7a308bb3016f57e5be11a677d15b821536419d36 (diff) | |
Merge tag 'v4.10-rc5' into for-linus
Sync up with mainline to apply fixup to a commit that came through
power supply tree.
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 41 | 
1 files changed, 28 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index ec1282af2479..216a9572d946 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c @@ -89,7 +89,7 @@ int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,   * Free an IB (all asics).   */  void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib, -		    struct fence *f) +		    struct dma_fence *f)  {  	amdgpu_sa_bo_free(adev, &ib->sa_bo, f);  } @@ -116,15 +116,16 @@ void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib,   * to SI there was just a DE IB.   */  int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, -		       struct amdgpu_ib *ibs, struct fence *last_vm_update, -		       struct amdgpu_job *job, struct fence **f) +		       struct amdgpu_ib *ibs, struct dma_fence *last_vm_update, +		       struct amdgpu_job *job, struct dma_fence **f)  {  	struct amdgpu_device *adev = ring->adev;  	struct amdgpu_ib *ib = &ibs[0];  	bool skip_preamble, need_ctx_switch;  	unsigned patch_offset = ~0;  	struct amdgpu_vm *vm; -	uint64_t ctx; +	uint64_t fence_ctx; +	uint32_t status = 0, alloc_size;  	unsigned i;  	int r = 0; @@ -135,14 +136,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  	/* ring tests don't use a job */  	if (job) {  		vm = job->vm; -		ctx = job->ctx; +		fence_ctx = job->fence_ctx;  	} else {  		vm = NULL; -		ctx = 0; +		fence_ctx = 0;  	}  	if (!ring->ready) { -		dev_err(adev->dev, "couldn't schedule ib\n"); +		dev_err(adev->dev, "couldn't schedule ib on ring <%s>\n", ring->name);  		return -EINVAL;  	} @@ -151,13 +152,16 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  		return -EINVAL;  	} -	r = amdgpu_ring_alloc(ring, 256 * num_ibs); +	alloc_size = ring->funcs->emit_frame_size + num_ibs * +		ring->funcs->emit_ib_size; + +	r = amdgpu_ring_alloc(ring, alloc_size);  	if (r) {  		dev_err(adev->dev, "scheduling IB failed (%d).\n", r);  		return r;  	} -	if (ring->type == AMDGPU_RING_TYPE_SDMA && ring->funcs->init_cond_exec) +	if (ring->funcs->init_cond_exec)  		patch_offset = amdgpu_ring_init_cond_exec(ring);  	if (vm) { @@ -174,13 +178,22 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  	/* always set cond_exec_polling to CONTINUE */  	*ring->cond_exe_cpu_addr = 1; -	skip_preamble = ring->current_ctx == ctx; -	need_ctx_switch = ring->current_ctx != ctx; +	skip_preamble = ring->current_ctx == fence_ctx; +	need_ctx_switch = ring->current_ctx != fence_ctx; +	if (job && ring->funcs->emit_cntxcntl) { +		if (need_ctx_switch) +			status |= AMDGPU_HAVE_CTX_SWITCH; +		status |= job->preamble_status; +		amdgpu_ring_emit_cntxcntl(ring, status); +	} +  	for (i = 0; i < num_ibs; ++i) {  		ib = &ibs[i];  		/* drop preamble IBs if we don't have a context switch */ -		if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && skip_preamble) +		if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && +			skip_preamble && +			!(status & AMDGPU_PREAMBLE_IB_PRESENT_FIRST))  			continue;  		amdgpu_ring_emit_ib(ring, ib, job ? job->vm_id : 0, @@ -209,7 +222,9 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  	if (patch_offset != ~0 && ring->funcs->patch_cond_exec)  		amdgpu_ring_patch_cond_exec(ring, patch_offset); -	ring->current_ctx = ctx; +	ring->current_ctx = fence_ctx; +	if (ring->funcs->emit_switch_buffer) +		amdgpu_ring_emit_switch_buffer(ring);  	amdgpu_ring_commit(ring);  	return 0;  }  | 
