@@ -97,7 +97,7 @@ void *etnaviv_gem_vaddr_locked(struct drm_gem_object *obj);
void *msm_gem_vaddr(struct drm_gem_object *obj);
dma_addr_t etnaviv_gem_paddr_locked(struct drm_gem_object *obj);
void etnaviv_gem_move_to_active(struct drm_gem_object *obj,
- struct etnaviv_gpu *gpu, bool write, uint32_t fence);
+ struct etnaviv_gpu *gpu, uint32_t access, uint32_t fence);
void etnaviv_gem_move_to_inactive(struct drm_gem_object *obj);
int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op,
struct timespec *timeout);
@@ -405,16 +405,18 @@ dma_addr_t etnaviv_gem_paddr_locked(struct drm_gem_object *obj)
}
void etnaviv_gem_move_to_active(struct drm_gem_object *obj,
- struct etnaviv_gpu *gpu, bool write, uint32_t fence)
+ struct etnaviv_gpu *gpu, uint32_t access, uint32_t fence)
{
struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
etnaviv_obj->gpu = gpu;
- if (write)
- etnaviv_obj->write_fence = fence;
- else
+ if (access & ETNA_SUBMIT_BO_READ)
etnaviv_obj->read_fence = fence;
+ if (access & ETNA_SUBMIT_BO_WRITE)
+ etnaviv_obj->write_fence = fence;
+
+ etnaviv_obj->access |= access;
list_del_init(&etnaviv_obj->mm_list);
list_add_tail(&etnaviv_obj->mm_list, &gpu->active_list);
@@ -431,6 +433,7 @@ void etnaviv_gem_move_to_inactive(struct drm_gem_object *obj)
etnaviv_obj->gpu = NULL;
etnaviv_obj->read_fence = 0;
etnaviv_obj->write_fence = 0;
+ etnaviv_obj->access = 0;
list_del_init(&etnaviv_obj->mm_list);
list_add_tail(&etnaviv_obj->mm_list, &priv->inactive_list);
}
@@ -46,6 +46,7 @@ struct etnaviv_gem_object {
*/
struct list_head mm_list;
struct etnaviv_gpu *gpu; /* non-null if active */
+ uint32_t access;
uint32_t read_fence, write_fence;
/* Transiently in the process of submit ioctl, objects associated
@@ -845,8 +845,10 @@ static void retire_worker(struct work_struct *work)
obj = list_first_entry(&gpu->active_list,
struct etnaviv_gem_object, mm_list);
- if ((obj->read_fence <= fence) &&
- (obj->write_fence <= fence)) {
+ if ((!(obj->access & ETNA_SUBMIT_BO_READ) ||
+ fence_after_eq(fence, obj->read_fence)) &&
+ (!(obj->access & ETNA_SUBMIT_BO_WRITE) ||
+ fence_after_eq(fence, obj->write_fence))) {
/* move to inactive: */
etnaviv_gem_move_to_inactive(&obj->base);
etnaviv_gem_put_iova(&obj->base);
@@ -917,13 +919,11 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
&iova);
}
- if (submit->bos[i].flags & ETNA_SUBMIT_BO_READ)
+ if (submit->bos[i].flags & (ETNA_SUBMIT_BO_READ |
+ ETNA_SUBMIT_BO_WRITE))
etnaviv_gem_move_to_active(&etnaviv_obj->base, gpu,
- false, submit->fence);
-
- if (submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE)
- etnaviv_gem_move_to_active(&etnaviv_obj->base, gpu,
- true, submit->fence);
+ submit->bos[i].flags,
+ submit->fence);
}
hangcheck_timer_reset(gpu);