aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikko Perttunen <mperttunen@nvidia.com>2017-09-28 08:50:44 -0400
committerThierry Reding <treding@nvidia.com>2017-10-20 08:19:52 -0400
commita176c67d71508761ec9d66a2d9a4eabb8d6873fd (patch)
tree736f11a9bd7f36839af0c01fdfcf54b9c313a6bd
parent45bd862c2846414371bc9b5d31be7c5df252c289 (diff)
drm/tegra: Use u64_to_user_ptr helper
Use the u64_to_user_ptr helper macro to cast IOCTL argument u64 values to user pointers instead of writing out the cast manually. Also do some other cleanup with user pointers to make them stand out more and look cleaner. Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com> Reviewed-by: Dmitry Osipenko <digetx@gmail.com> Tested-by: Dmitry Osipenko <digetx@gmail.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/gpu/drm/tegra/drm.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 130d193192ee..943bdf88c4a2 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -386,12 +386,10 @@ int tegra_drm_submit(struct tegra_drm_context *context,
386 unsigned int num_cmdbufs = args->num_cmdbufs; 386 unsigned int num_cmdbufs = args->num_cmdbufs;
387 unsigned int num_relocs = args->num_relocs; 387 unsigned int num_relocs = args->num_relocs;
388 unsigned int num_waitchks = args->num_waitchks; 388 unsigned int num_waitchks = args->num_waitchks;
389 struct drm_tegra_cmdbuf __user *cmdbufs = 389 struct drm_tegra_cmdbuf __user *user_cmdbufs;
390 (void __user *)(uintptr_t)args->cmdbufs; 390 struct drm_tegra_reloc __user *user_relocs;
391 struct drm_tegra_reloc __user *relocs = 391 struct drm_tegra_waitchk __user *user_waitchks;
392 (void __user *)(uintptr_t)args->relocs; 392 struct drm_tegra_syncpt __user *user_syncpt;
393 struct drm_tegra_waitchk __user *waitchks =
394 (void __user *)(uintptr_t)args->waitchks;
395 struct drm_tegra_syncpt syncpt; 393 struct drm_tegra_syncpt syncpt;
396 struct host1x *host1x = dev_get_drvdata(drm->dev->parent); 394 struct host1x *host1x = dev_get_drvdata(drm->dev->parent);
397 struct drm_gem_object **refs; 395 struct drm_gem_object **refs;
@@ -400,6 +398,11 @@ int tegra_drm_submit(struct tegra_drm_context *context,
400 unsigned int num_refs; 398 unsigned int num_refs;
401 int err; 399 int err;
402 400
401 user_cmdbufs = u64_to_user_ptr(args->cmdbufs);
402 user_relocs = u64_to_user_ptr(args->relocs);
403 user_waitchks = u64_to_user_ptr(args->waitchks);
404 user_syncpt = u64_to_user_ptr(args->syncpts);
405
403 /* We don't yet support other than one syncpt_incr struct per submit */ 406 /* We don't yet support other than one syncpt_incr struct per submit */
404 if (args->num_syncpts != 1) 407 if (args->num_syncpts != 1)
405 return -EINVAL; 408 return -EINVAL;
@@ -440,7 +443,7 @@ int tegra_drm_submit(struct tegra_drm_context *context,
440 struct tegra_bo *obj; 443 struct tegra_bo *obj;
441 u64 offset; 444 u64 offset;
442 445
443 if (copy_from_user(&cmdbuf, cmdbufs, sizeof(cmdbuf))) { 446 if (copy_from_user(&cmdbuf, user_cmdbufs, sizeof(cmdbuf))) {
444 err = -EFAULT; 447 err = -EFAULT;
445 goto fail; 448 goto fail;
446 } 449 }
@@ -476,7 +479,7 @@ int tegra_drm_submit(struct tegra_drm_context *context,
476 479
477 host1x_job_add_gather(job, bo, cmdbuf.words, cmdbuf.offset); 480 host1x_job_add_gather(job, bo, cmdbuf.words, cmdbuf.offset);
478 num_cmdbufs--; 481 num_cmdbufs--;
479 cmdbufs++; 482 user_cmdbufs++;
480 } 483 }
481 484
482 /* copy and resolve relocations from submit */ 485 /* copy and resolve relocations from submit */
@@ -485,7 +488,7 @@ int tegra_drm_submit(struct tegra_drm_context *context,
485 struct tegra_bo *obj; 488 struct tegra_bo *obj;
486 489
487 err = host1x_reloc_copy_from_user(&job->relocarray[num_relocs], 490 err = host1x_reloc_copy_from_user(&job->relocarray[num_relocs],
488 &relocs[num_relocs], drm, 491 &user_relocs[num_relocs], drm,
489 file); 492 file);
490 if (err < 0) 493 if (err < 0)
491 goto fail; 494 goto fail;
@@ -519,9 +522,8 @@ int tegra_drm_submit(struct tegra_drm_context *context,
519 struct host1x_waitchk *wait = &job->waitchk[num_waitchks]; 522 struct host1x_waitchk *wait = &job->waitchk[num_waitchks];
520 struct tegra_bo *obj; 523 struct tegra_bo *obj;
521 524
522 err = host1x_waitchk_copy_from_user(wait, 525 err = host1x_waitchk_copy_from_user(
523 &waitchks[num_waitchks], 526 wait, &user_waitchks[num_waitchks], file);
524 file);
525 if (err < 0) 527 if (err < 0)
526 goto fail; 528 goto fail;
527 529
@@ -539,8 +541,7 @@ int tegra_drm_submit(struct tegra_drm_context *context,
539 } 541 }
540 } 542 }
541 543
542 if (copy_from_user(&syncpt, (void __user *)(uintptr_t)args->syncpts, 544 if (copy_from_user(&syncpt, user_syncpt, sizeof(syncpt))) {
543 sizeof(syncpt))) {
544 err = -EFAULT; 545 err = -EFAULT;
545 goto fail; 546 goto fail;
546 } 547 }