diff options
| author | Thomas Zimmermann <tzimmermann@suse.de> | 2023-06-15 10:34:19 +0200 | 
|---|---|---|
| committer | Thomas Zimmermann <tzimmermann@suse.de> | 2023-06-15 10:34:19 +0200 | 
| commit | db6da59cf27b5661ced03754ae0550f8914eda9e (patch) | |
| tree | ccb1851c8a71e776dbccf1ccae132dc9b5f093c6 /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |
| parent | cf03e2956af307dc25e8c41fd4cffe44482a6ec1 (diff) | |
| parent | 901bdf5ea1a836400ee69aa32b04e9c209271ec7 (diff) | |
Merge drm/drm-next into drm-misc-next-fixes
Backmerging to sync drm-misc-next-fixes with drm-misc-next.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 60 | 
1 files changed, 41 insertions, 19 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 08eced097bd8..6e1d331af01f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -112,6 +112,9 @@ static int amdgpu_cs_p1_ib(struct amdgpu_cs_parser *p,  	if (r < 0)  		return r; +	if (num_ibs[r] >= amdgpu_ring_max_ibs(chunk_ib->ip_type)) +		return -EINVAL; +  	++(num_ibs[r]);  	p->gang_leader_idx = r;  	return 0; @@ -192,7 +195,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,  	uint64_t *chunk_array_user;  	uint64_t *chunk_array;  	uint32_t uf_offset = 0; -	unsigned int size; +	size_t size;  	int ret;  	int i; @@ -285,6 +288,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,  		case AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES:  		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT:  		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL: +		case AMDGPU_CHUNK_ID_CP_GFX_SHADOW:  			break;  		default: @@ -393,7 +397,7 @@ static int amdgpu_cs_p2_dependencies(struct amdgpu_cs_parser *p,  {  	struct drm_amdgpu_cs_chunk_dep *deps = chunk->kdata;  	struct amdgpu_fpriv *fpriv = p->filp->driver_priv; -	unsigned num_deps; +	unsigned int num_deps;  	int i, r;  	num_deps = chunk->length_dw * 4 / @@ -464,7 +468,7 @@ static int amdgpu_cs_p2_syncobj_in(struct amdgpu_cs_parser *p,  				   struct amdgpu_cs_chunk *chunk)  {  	struct drm_amdgpu_cs_chunk_sem *deps = chunk->kdata; -	unsigned num_deps; +	unsigned int num_deps;  	int i, r;  	num_deps = chunk->length_dw * 4 / @@ -482,7 +486,7 @@ static int amdgpu_cs_p2_syncobj_timeline_wait(struct amdgpu_cs_parser *p,  					      struct amdgpu_cs_chunk *chunk)  {  	struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps = chunk->kdata; -	unsigned num_deps; +	unsigned int num_deps;  	int i, r;  	num_deps = chunk->length_dw * 4 / @@ -502,7 +506,7 @@ static int amdgpu_cs_p2_syncobj_out(struct amdgpu_cs_parser *p,  				    struct amdgpu_cs_chunk *chunk)  {  	struct drm_amdgpu_cs_chunk_sem *deps = chunk->kdata; -	unsigned num_deps; +	unsigned int num_deps;  	int i;  	num_deps = chunk->length_dw * 4 / @@ -536,7 +540,7 @@ static int amdgpu_cs_p2_syncobj_timeline_signal(struct amdgpu_cs_parser *p,  						struct amdgpu_cs_chunk *chunk)  {  	struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps = chunk->kdata; -	unsigned num_deps; +	unsigned int num_deps;  	int i;  	num_deps = chunk->length_dw * 4 / @@ -575,6 +579,26 @@ static int amdgpu_cs_p2_syncobj_timeline_signal(struct amdgpu_cs_parser *p,  	return 0;  } +static int amdgpu_cs_p2_shadow(struct amdgpu_cs_parser *p, +			       struct amdgpu_cs_chunk *chunk) +{ +	struct drm_amdgpu_cs_chunk_cp_gfx_shadow *shadow = chunk->kdata; +	int i; + +	if (shadow->flags & ~AMDGPU_CS_CHUNK_CP_GFX_SHADOW_FLAGS_INIT_SHADOW) +		return -EINVAL; + +	for (i = 0; i < p->gang_size; ++i) { +		p->jobs[i]->shadow_va = shadow->shadow_va; +		p->jobs[i]->csa_va = shadow->csa_va; +		p->jobs[i]->gds_va = shadow->gds_va; +		p->jobs[i]->init_shadow = +			shadow->flags & AMDGPU_CS_CHUNK_CP_GFX_SHADOW_FLAGS_INIT_SHADOW; +	} + +	return 0; +} +  static int amdgpu_cs_pass2(struct amdgpu_cs_parser *p)  {  	unsigned int ce_preempt = 0, de_preempt = 0; @@ -617,6 +641,11 @@ static int amdgpu_cs_pass2(struct amdgpu_cs_parser *p)  			if (r)  				return r;  			break; +		case AMDGPU_CHUNK_ID_CP_GFX_SHADOW: +			r = amdgpu_cs_p2_shadow(p, chunk); +			if (r) +				return r; +			break;  		}  	} @@ -729,6 +758,7 @@ static void amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev,  		if (used_vis_vram < total_vis_vram) {  			u64 free_vis_vram = total_vis_vram - used_vis_vram; +  			adev->mm_stats.accum_us_vis = min(adev->mm_stats.accum_us_vis +  							  increment_us, us_upper_bound); @@ -1047,9 +1077,8 @@ static int amdgpu_cs_patch_ibs(struct amdgpu_cs_parser *p,  		/* the IB should be reserved at this point */  		r = amdgpu_bo_kmap(aobj, (void **)&kptr); -		if (r) { +		if (r)  			return r; -		}  		kptr += va_start - (m->start * AMDGPU_GPU_PAGE_SIZE); @@ -1276,7 +1305,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,  		r = drm_sched_job_add_dependency(&leader->base, fence);  		if (r) {  			dma_fence_put(fence); -			goto error_cleanup; +			return r;  		}  	} @@ -1303,7 +1332,8 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,  	}  	if (r) {  		r = -EAGAIN; -		goto error_unlock; +		mutex_unlock(&p->adev->notifier_lock); +		return r;  	}  	p->fence = dma_fence_get(&leader->base.s_fence->finished); @@ -1350,20 +1380,12 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,  	mutex_unlock(&p->adev->notifier_lock);  	mutex_unlock(&p->bo_list->bo_list_mutex);  	return 0; - -error_unlock: -	mutex_unlock(&p->adev->notifier_lock); - -error_cleanup: -	for (i = 0; i < p->gang_size; ++i) -		drm_sched_job_cleanup(&p->jobs[i]->base); -	return r;  }  /* Cleanup the parser structure */  static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser)  { -	unsigned i; +	unsigned int i;  	amdgpu_sync_free(&parser->sync);  	for (i = 0; i < parser->num_post_deps; i++) { | 
