aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/host1x/job.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/host1x/job.c')
-rw-r--r--drivers/gpu/host1x/job.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/gpu/host1x/job.c b/drivers/gpu/host1x/job.c
index 54230ec4f81e..ef746f7afb88 100644
--- a/drivers/gpu/host1x/job.c
+++ b/drivers/gpu/host1x/job.c
@@ -356,6 +356,9 @@ struct host1x_firewall {
356 356
357static int check_register(struct host1x_firewall *fw, unsigned long offset) 357static int check_register(struct host1x_firewall *fw, unsigned long offset)
358{ 358{
359 if (!fw->job->is_addr_reg)
360 return 0;
361
359 if (fw->job->is_addr_reg(fw->dev, fw->class, offset)) { 362 if (fw->job->is_addr_reg(fw->dev, fw->class, offset)) {
360 if (!fw->num_relocs) 363 if (!fw->num_relocs)
361 return -EINVAL; 364 return -EINVAL;
@@ -370,6 +373,19 @@ static int check_register(struct host1x_firewall *fw, unsigned long offset)
370 return 0; 373 return 0;
371} 374}
372 375
376static int check_class(struct host1x_firewall *fw, u32 class)
377{
378 if (!fw->job->is_valid_class) {
379 if (fw->class != class)
380 return -EINVAL;
381 } else {
382 if (!fw->job->is_valid_class(fw->class))
383 return -EINVAL;
384 }
385
386 return 0;
387}
388
373static int check_mask(struct host1x_firewall *fw) 389static int check_mask(struct host1x_firewall *fw)
374{ 390{
375 u32 mask = fw->mask; 391 u32 mask = fw->mask;
@@ -443,11 +459,9 @@ static int validate(struct host1x_firewall *fw, struct host1x_job_gather *g)
443{ 459{
444 u32 *cmdbuf_base = (u32 *)fw->job->gather_copy_mapped + 460 u32 *cmdbuf_base = (u32 *)fw->job->gather_copy_mapped +
445 (g->offset / sizeof(u32)); 461 (g->offset / sizeof(u32));
462 u32 job_class = fw->class;
446 int err = 0; 463 int err = 0;
447 464
448 if (!fw->job->is_addr_reg)
449 return 0;
450
451 fw->words = g->words; 465 fw->words = g->words;
452 fw->cmdbuf = g->bo; 466 fw->cmdbuf = g->bo;
453 fw->offset = 0; 467 fw->offset = 0;
@@ -467,7 +481,9 @@ static int validate(struct host1x_firewall *fw, struct host1x_job_gather *g)
467 fw->class = word >> 6 & 0x3ff; 481 fw->class = word >> 6 & 0x3ff;
468 fw->mask = word & 0x3f; 482 fw->mask = word & 0x3f;
469 fw->reg = word >> 16 & 0xfff; 483 fw->reg = word >> 16 & 0xfff;
470 err = check_mask(fw); 484 err = check_class(fw, job_class);
485 if (!err)
486 err = check_mask(fw);
471 if (err) 487 if (err)
472 goto out; 488 goto out;
473 break; 489 break;