Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -351,7 +351,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
	struct drm_device *dev = obj->base.dev;
	void *vaddr = obj->phys_handle->vaddr + args->offset;
	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
	 * 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,
	if (ret)
		return ret;

	intel_fb_obj_invalidate(obj, NULL, ORIGIN_CPU);
	if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
		unsigned long unwritten;

@@ -370,13 +371,18 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
		mutex_unlock(&dev->struct_mutex);
		unwritten = copy_from_user(vaddr, user_data, args->size);
		mutex_lock(&dev->struct_mutex);
		if (unwritten)
			return -EFAULT;
		if (unwritten) {
			ret = -EFAULT;
			goto out;
		}
	}

	drm_clflush_virt_range(vaddr, args->size);
	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)
@@ -810,6 +816,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,

	offset = i915_gem_obj_ggtt_offset(obj) + args->offset;

	intel_fb_obj_invalidate(obj, NULL, ORIGIN_GTT);

	while (remain > 0) {
		/* Operation in this page
		 *
@@ -830,7 +838,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
		if (fast_user_write(dev_priv->gtt.mappable, page_base,
				    page_offset, user_data, page_length)) {
			ret = -EFAULT;
			goto out_unpin;
			goto out_flush;
		}

		remain -= page_length;
@@ -838,6 +846,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
		offset += page_length;
	}

out_flush:
	intel_fb_obj_flush(obj, false);
out_unpin:
	i915_gem_object_ggtt_unpin(obj);
out:
@@ -952,6 +962,8 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
	if (ret)
		return ret;

	intel_fb_obj_invalidate(obj, NULL, ORIGIN_CPU);

	i915_gem_object_pin_pages(obj);

	offset = args->offset;
@@ -1030,6 +1042,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
	if (needs_clflush_after)
		i915_gem_chipset_flush(dev);

	intel_fb_obj_flush(obj, false);
	return ret;
}