drm/tegra: Add job firewall
[linux-2.6-microblaze.git] / drivers / gpu / drm / tegra / submit.c
index e253b0d..776f825 100644 (file)
@@ -326,7 +326,8 @@ static int submit_get_syncpt(struct tegra_drm_context *context, struct host1x_jo
 static int submit_job_add_gather(struct host1x_job *job, struct tegra_drm_context *context,
                                 struct drm_tegra_submit_cmd_gather_uptr *cmd,
                                 struct gather_bo *bo, u32 *offset,
-                                struct tegra_drm_submit_data *job_data)
+                                struct tegra_drm_submit_data *job_data,
+                                u32 *class)
 {
        u32 next_offset;
 
@@ -351,6 +352,12 @@ static int submit_job_add_gather(struct host1x_job *job, struct tegra_drm_contex
                return -EINVAL;
        }
 
+       if (tegra_drm_fw_validate(context->client, bo->gather_data, *offset,
+                                 cmd->words, job_data, class)) {
+               SUBMIT_ERR(context, "job was rejected by firewall");
+               return -EINVAL;
+       }
+
        host1x_job_add_gather(job, &bo->base, cmd->words, *offset * 4);
 
        *offset = next_offset;
@@ -404,7 +411,7 @@ submit_create_job(struct tegra_drm_context *context, struct gather_bo *bo,
 
                if (cmd->type == DRM_TEGRA_SUBMIT_CMD_GATHER_UPTR) {
                        err = submit_job_add_gather(job, context, &cmd->gather_uptr, bo,
-                                                   &gather_offset, job_data);
+                                                   &gather_offset, job_data, &class);
                        if (err)
                                goto free_job;
                } else if (cmd->type == DRM_TEGRA_SUBMIT_CMD_WAIT_SYNCPT) {