@@ -351,7 +351,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
351
351
struct drm_device * dev = obj -> base .dev ;
352
352
void * vaddr = obj -> phys_handle -> vaddr + args -> offset ;
353
353
char __user * user_data = to_user_ptr (args -> data_ptr );
354
- int ret ;
354
+ int ret = 0 ;
355
355
356
356
/* We manually control the domain here and pretend that it
357
357
* 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
360
if (ret )
361
361
return ret ;
362
362
363
+ intel_fb_obj_invalidate (obj , NULL , ORIGIN_CPU );
363
364
if (__copy_from_user_inatomic_nocache (vaddr , user_data , args -> size )) {
364
365
unsigned long unwritten ;
365
366
@@ -370,13 +371,18 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
370
371
mutex_unlock (& dev -> struct_mutex );
371
372
unwritten = copy_from_user (vaddr , user_data , args -> size );
372
373
mutex_lock (& dev -> struct_mutex );
373
- if (unwritten )
374
- return - EFAULT ;
374
+ if (unwritten ) {
375
+ ret = - EFAULT ;
376
+ goto out ;
377
+ }
375
378
}
376
379
377
380
drm_clflush_virt_range (vaddr , args -> size );
378
381
i915_gem_chipset_flush (dev );
379
- return 0 ;
382
+
383
+ out :
384
+ intel_fb_obj_flush (obj , false);
385
+ return ret ;
380
386
}
381
387
382
388
void * i915_gem_object_alloc (struct drm_device * dev )
@@ -810,6 +816,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
810
816
811
817
offset = i915_gem_obj_ggtt_offset (obj ) + args -> offset ;
812
818
819
+ intel_fb_obj_invalidate (obj , NULL , ORIGIN_GTT );
820
+
813
821
while (remain > 0 ) {
814
822
/* Operation in this page
815
823
*
@@ -830,14 +838,16 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
830
838
if (fast_user_write (dev_priv -> gtt .mappable , page_base ,
831
839
page_offset , user_data , page_length )) {
832
840
ret = - EFAULT ;
833
- goto out_unpin ;
841
+ goto out_flush ;
834
842
}
835
843
836
844
remain -= page_length ;
837
845
user_data += page_length ;
838
846
offset += page_length ;
839
847
}
840
848
849
+ out_flush :
850
+ intel_fb_obj_flush (obj , false);
841
851
out_unpin :
842
852
i915_gem_object_ggtt_unpin (obj );
843
853
out :
@@ -952,6 +962,8 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
952
962
if (ret )
953
963
return ret ;
954
964
965
+ intel_fb_obj_invalidate (obj , NULL , ORIGIN_CPU );
966
+
955
967
i915_gem_object_pin_pages (obj );
956
968
957
969
offset = args -> offset ;
@@ -1030,6 +1042,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
1030
1042
if (needs_clflush_after )
1031
1043
i915_gem_chipset_flush (dev );
1032
1044
1045
+ intel_fb_obj_flush (obj , false);
1033
1046
return ret ;
1034
1047
}
1035
1048
0 commit comments