diff options
Diffstat (limited to 'drivers/gpu/drm/vc4/vc4_validate.c')
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_validate.c | 17 | 
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_validate.c b/drivers/gpu/drm/vc4/vc4_validate.c index 9ce1d0adf882..26503e307438 100644 --- a/drivers/gpu/drm/vc4/vc4_validate.c +++ b/drivers/gpu/drm/vc4/vc4_validate.c @@ -267,6 +267,9 @@ validate_indexed_prim_list(VALIDATE_ARGS)  	if (!ib)  		return -EINVAL; +	exec->bin_dep_seqno = max(exec->bin_dep_seqno, +				  to_vc4_bo(&ib->base)->write_seqno); +  	if (offset > ib->base.size ||  	    (ib->base.size - offset) / index_size < length) {  		DRM_ERROR("IB access overflow (%d + %d*%d > %zd)\n", @@ -555,8 +558,7 @@ static bool  reloc_tex(struct vc4_exec_info *exec,  	  void *uniform_data_u,  	  struct vc4_texture_sample_info *sample, -	  uint32_t texture_handle_index) - +	  uint32_t texture_handle_index, bool is_cs)  {  	struct drm_gem_cma_object *tex;  	uint32_t p0 = *(uint32_t *)(uniform_data_u + sample->p_offset[0]); @@ -714,6 +716,11 @@ reloc_tex(struct vc4_exec_info *exec,  	*validated_p0 = tex->paddr + p0; +	if (is_cs) { +		exec->bin_dep_seqno = max(exec->bin_dep_seqno, +					  to_vc4_bo(&tex->base)->write_seqno); +	} +  	return true;   fail:  	DRM_INFO("Texture p0 at %d: 0x%08x\n", sample->p_offset[0], p0); @@ -835,7 +842,8 @@ validate_gl_shader_rec(struct drm_device *dev,  			if (!reloc_tex(exec,  				       uniform_data_u,  				       &validated_shader->texture_samples[tex], -				       texture_handles_u[tex])) { +				       texture_handles_u[tex], +				       i == 2)) {  				return -EINVAL;  			}  		} @@ -867,6 +875,9 @@ validate_gl_shader_rec(struct drm_device *dev,  		uint32_t stride = *(uint8_t *)(pkt_u + o + 5);  		uint32_t max_index; +		exec->bin_dep_seqno = max(exec->bin_dep_seqno, +					  to_vc4_bo(&vbo->base)->write_seqno); +  		if (state->addr & 0x8)  			stride |= (*(uint32_t *)(pkt_u + 100 + i * 4)) & ~0xff;  |