aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c34
1 files changed, 4 insertions, 30 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index f671d052312a..a2b8a74168d7 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -597,47 +597,21 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
597 struct drm_i915_gem_pwrite *args, 597 struct drm_i915_gem_pwrite *args,
598 struct drm_file *file) 598 struct drm_file *file)
599{ 599{
600 struct drm_device *dev = obj->base.dev;
601 void *vaddr = obj->phys_handle->vaddr + args->offset; 600 void *vaddr = obj->phys_handle->vaddr + args->offset;
602 char __user *user_data = u64_to_user_ptr(args->data_ptr); 601 char __user *user_data = u64_to_user_ptr(args->data_ptr);
603 int ret;
604 602
605 /* We manually control the domain here and pretend that it 603 /* We manually control the domain here and pretend that it
606 * remains coherent i.e. in the GTT domain, like shmem_pwrite. 604 * remains coherent i.e. in the GTT domain, like shmem_pwrite.
607 */ 605 */
608 lockdep_assert_held(&obj->base.dev->struct_mutex);
609 ret = i915_gem_object_wait(obj,
610 I915_WAIT_INTERRUPTIBLE |
611 I915_WAIT_LOCKED |
612 I915_WAIT_ALL,
613 MAX_SCHEDULE_TIMEOUT,
614 to_rps_client(file));
615 if (ret)
616 return ret;
617
618 intel_fb_obj_invalidate(obj, ORIGIN_CPU); 606 intel_fb_obj_invalidate(obj, ORIGIN_CPU);
619 if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) { 607 if (copy_from_user(vaddr, user_data, args->size))
620 unsigned long unwritten; 608 return -EFAULT;
621
622 /* The physical object once assigned is fixed for the lifetime
623 * of the obj, so we can safely drop the lock and continue
624 * to access vaddr.
625 */
626 mutex_unlock(&dev->struct_mutex);
627 unwritten = copy_from_user(vaddr, user_data, args->size);
628 mutex_lock(&dev->struct_mutex);
629 if (unwritten) {
630 ret = -EFAULT;
631 goto out;
632 }
633 }
634 609
635 drm_clflush_virt_range(vaddr, args->size); 610 drm_clflush_virt_range(vaddr, args->size);
636 i915_gem_chipset_flush(to_i915(dev)); 611 i915_gem_chipset_flush(to_i915(obj->base.dev));
637 612
638out:
639 intel_fb_obj_flush(obj, false, ORIGIN_CPU); 613 intel_fb_obj_flush(obj, false, ORIGIN_CPU);
640 return ret; 614 return 0;
641} 615}
642 616
643void *i915_gem_object_alloc(struct drm_i915_private *dev_priv) 617void *i915_gem_object_alloc(struct drm_i915_private *dev_priv)