diff options
Diffstat (limited to 'drivers/gpu/host1x/job.c')
-rw-r--r-- | drivers/gpu/host1x/job.c | 24 |
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 | ||
357 | static int check_register(struct host1x_firewall *fw, unsigned long offset) | 357 | static 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 | ||
376 | static 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 | |||
373 | static int check_mask(struct host1x_firewall *fw) | 389 | static 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; |