Skip to content

Commit 063e4e6

Browse files
pzanoni-inteldanvet
authored andcommitted
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: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
1 parent a4001f1 commit 063e4e6

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
351351
struct drm_device *dev = obj->base.dev;
352352
void *vaddr = obj->phys_handle->vaddr + args->offset;
353353
char __user *user_data = to_user_ptr(args->data_ptr);
354-
int ret;
354+
int ret = 0;
355355

356356
/* We manually control the domain here and pretend that it
357357
* 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,
360360
if (ret)
361361
return ret;
362362

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

@@ -370,13 +371,18 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
370371
mutex_unlock(&dev->struct_mutex);
371372
unwritten = copy_from_user(vaddr, user_data, args->size);
372373
mutex_lock(&dev->struct_mutex);
373-
if (unwritten)
374-
return -EFAULT;
374+
if (unwritten) {
375+
ret = -EFAULT;
376+
goto out;
377+
}
375378
}
376379

377380
drm_clflush_virt_range(vaddr, args->size);
378381
i915_gem_chipset_flush(dev);
379-
return 0;
382+
383+
out:
384+
intel_fb_obj_flush(obj, false);
385+
return ret;
380386
}
381387

382388
void *i915_gem_object_alloc(struct drm_device *dev)
@@ -810,6 +816,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
810816

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

819+
intel_fb_obj_invalidate(obj, NULL, ORIGIN_GTT);
820+
813821
while (remain > 0) {
814822
/* Operation in this page
815823
*
@@ -830,14 +838,16 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
830838
if (fast_user_write(dev_priv->gtt.mappable, page_base,
831839
page_offset, user_data, page_length)) {
832840
ret = -EFAULT;
833-
goto out_unpin;
841+
goto out_flush;
834842
}
835843

836844
remain -= page_length;
837845
user_data += page_length;
838846
offset += page_length;
839847
}
840848

849+
out_flush:
850+
intel_fb_obj_flush(obj, false);
841851
out_unpin:
842852
i915_gem_object_ggtt_unpin(obj);
843853
out:
@@ -952,6 +962,8 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
952962
if (ret)
953963
return ret;
954964

965+
intel_fb_obj_invalidate(obj, NULL, ORIGIN_CPU);
966+
955967
i915_gem_object_pin_pages(obj);
956968

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

1045+
intel_fb_obj_flush(obj, false);
10331046
return ret;
10341047
}
10351048

0 commit comments

Comments
 (0)