diff options
author | Eric Anholt <eric@anholt.net> | 2014-12-31 14:19:39 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2015-06-04 14:15:28 -0700 |
commit | 291ad365c0fb29d1f19c0111c480b8b698b793ba (patch) | |
tree | 1a962d6c7ba73b68b37ee6afdadf420cf89c63e2 | |
parent | c00050d0a663f2dc8d2f6399097dcef58c495434 (diff) | |
download | linux-291ad365c0fb29d1f19c0111c480b8b698b793ba.tar.gz |
drm/vc4: Enforce that shaders start at bo offset 0.
This is what userspace does currently, and it will simplify the
caching of validated shader state.
Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_validate.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_validate_shaders.c | 16 |
3 files changed, 12 insertions, 16 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h index 6d29b034b603..c7da68b854fe 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h @@ -418,5 +418,4 @@ int vc4_validate_shader_recs(struct drm_device *dev, struct vc4_exec_info *exec); struct vc4_validated_shader_info * -vc4_validate_shader(struct drm_gem_cma_object *shader_obj, - uint32_t start_offset); +vc4_validate_shader(struct drm_gem_cma_object *shader_obj); diff --git a/drivers/gpu/drm/vc4/vc4_validate.c b/drivers/gpu/drm/vc4/vc4_validate.c index db1f98281019..0691a8d769ca 100644 --- a/drivers/gpu/drm/vc4/vc4_validate.c +++ b/drivers/gpu/drm/vc4/vc4_validate.c @@ -1074,9 +1074,14 @@ validate_shader_rec(struct drm_device *dev, switch (relocs[i].type) { case RELOC_CODE: + if (src_offset != 0) { + DRM_ERROR("Shaders must be at offset 0 of " + "the BO.\n"); + goto fail; + } + kfree(validated_shader); - validated_shader = vc4_validate_shader(bo[i], - src_offset); + validated_shader = vc4_validate_shader(bo[i]); if (!validated_shader) goto fail; diff --git a/drivers/gpu/drm/vc4/vc4_validate_shaders.c b/drivers/gpu/drm/vc4/vc4_validate_shaders.c index 4c4ac1a87cbf..ad7ebb11f2d8 100644 --- a/drivers/gpu/drm/vc4/vc4_validate_shaders.c +++ b/drivers/gpu/drm/vc4/vc4_validate_shaders.c @@ -367,8 +367,7 @@ check_instruction_reads(uint64_t inst, } struct vc4_validated_shader_info * -vc4_validate_shader(struct drm_gem_cma_object *shader_obj, - uint32_t start_offset) +vc4_validate_shader(struct drm_gem_cma_object *shader_obj) { bool found_shader_end = false; int shader_end_ip = 0; @@ -385,14 +384,8 @@ vc4_validate_shader(struct drm_gem_cma_object *shader_obj, for (i = 0; i < ARRAY_SIZE(validation_state.live_clamp_offsets); i++) validation_state.live_clamp_offsets[i] = ~0; - if (start_offset + sizeof(uint64_t) > shader_obj->base.size) { - DRM_ERROR("shader starting at %d outside of BO sized %d\n", - start_offset, - shader_obj->base.size); - return NULL; - } - shader = shader_obj->vaddr + start_offset; - max_ip = (shader_obj->base.size - start_offset) / sizeof(uint64_t); + shader = shader_obj->vaddr; + max_ip = shader_obj->base.size / sizeof(uint64_t); validated_shader = kcalloc(sizeof(*validated_shader), 1, GFP_KERNEL); if (!validated_shader) @@ -449,9 +442,8 @@ vc4_validate_shader(struct drm_gem_cma_object *shader_obj, } if (ip == max_ip) { - DRM_ERROR("shader starting at %d failed to terminate before " + DRM_ERROR("shader failed to terminate before " "shader BO end at %d\n", - start_offset, shader_obj->base.size); goto fail; } |