Commit 063e4e6b authored by Paulo Zanoni's avatar Paulo Zanoni Committed by Daniel Vetter

drm/i915: also do frontbuffer tracking on pwrites

We need this for FBC, and possibly for PSR too.

v2: Don't only flush: invalidate too (Daniel).
Signed-off-by: default avatarPaulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent a4001f1b
...@@ -351,7 +351,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj, ...@@ -351,7 +351,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
struct drm_device *dev = obj->base.dev; struct drm_device *dev = obj->base.dev;
void *vaddr = obj->phys_handle->vaddr + args->offset; void *vaddr = obj->phys_handle->vaddr + args->offset;
char __user *user_data = to_user_ptr(args->data_ptr); char __user *user_data = to_user_ptr(args->data_ptr);
int ret; int ret = 0;
/* We manually control the domain here and pretend that it /* We manually control the domain here and pretend that it
* remains coherent i.e. in the GTT domain, like shmem_pwrite. * remains coherent i.e. in the GTT domain, like shmem_pwrite.
...@@ -360,6 +360,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj, ...@@ -360,6 +360,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
if (ret) if (ret)
return ret; return ret;
intel_fb_obj_invalidate(obj, NULL, ORIGIN_CPU);
if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) { if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
unsigned long unwritten; unsigned long unwritten;
...@@ -370,13 +371,18 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj, ...@@ -370,13 +371,18 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
unwritten = copy_from_user(vaddr, user_data, args->size); unwritten = copy_from_user(vaddr, user_data, args->size);
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
if (unwritten) if (unwritten) {
return -EFAULT; ret = -EFAULT;
goto out;
}
} }
drm_clflush_virt_range(vaddr, args->size); drm_clflush_virt_range(vaddr, args->size);
i915_gem_chipset_flush(dev); i915_gem_chipset_flush(dev);
return 0;
out:
intel_fb_obj_flush(obj, false);
return ret;
} }
void *i915_gem_object_alloc(struct drm_device *dev) void *i915_gem_object_alloc(struct drm_device *dev)
...@@ -810,6 +816,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, ...@@ -810,6 +816,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
offset = i915_gem_obj_ggtt_offset(obj) + args->offset; offset = i915_gem_obj_ggtt_offset(obj) + args->offset;
intel_fb_obj_invalidate(obj, NULL, ORIGIN_GTT);
while (remain > 0) { while (remain > 0) {
/* Operation in this page /* Operation in this page
* *
...@@ -830,7 +838,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, ...@@ -830,7 +838,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
if (fast_user_write(dev_priv->gtt.mappable, page_base, if (fast_user_write(dev_priv->gtt.mappable, page_base,
page_offset, user_data, page_length)) { page_offset, user_data, page_length)) {
ret = -EFAULT; ret = -EFAULT;
goto out_unpin; goto out_flush;
} }
remain -= page_length; remain -= page_length;
...@@ -838,6 +846,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, ...@@ -838,6 +846,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
offset += page_length; offset += page_length;
} }
out_flush:
intel_fb_obj_flush(obj, false);
out_unpin: out_unpin:
i915_gem_object_ggtt_unpin(obj); i915_gem_object_ggtt_unpin(obj);
out: out:
...@@ -952,6 +962,8 @@ i915_gem_shmem_pwrite(struct drm_device *dev, ...@@ -952,6 +962,8 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
if (ret) if (ret)
return ret; return ret;
intel_fb_obj_invalidate(obj, NULL, ORIGIN_CPU);
i915_gem_object_pin_pages(obj); i915_gem_object_pin_pages(obj);
offset = args->offset; offset = args->offset;
...@@ -1030,6 +1042,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev, ...@@ -1030,6 +1042,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
if (needs_clflush_after) if (needs_clflush_after)
i915_gem_chipset_flush(dev); i915_gem_chipset_flush(dev);
intel_fb_obj_flush(obj, false);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment