summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2014-12-31 14:19:39 -0800
committerEric Anholt <eric@anholt.net>2015-06-04 14:15:28 -0700
commit291ad365c0fb29d1f19c0111c480b8b698b793ba (patch)
tree1a962d6c7ba73b68b37ee6afdadf420cf89c63e2
parentc00050d0a663f2dc8d2f6399097dcef58c495434 (diff)
downloadlinux-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.h3
-rw-r--r--drivers/gpu/drm/vc4/vc4_validate.c9
-rw-r--r--drivers/gpu/drm/vc4/vc4_validate_shaders.c16
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;
}