|
@@ -40,9 +40,9 @@ static struct page **get_pages(struct drm_gem_object *obj)
|
|
|
}
|
|
|
|
|
|
msm_obj->sgt = drm_prime_pages_to_sg(p, npages);
|
|
|
- if (!msm_obj->sgt) {
|
|
|
+ if (IS_ERR(msm_obj->sgt)) {
|
|
|
dev_err(dev->dev, "failed to allocate sgt\n");
|
|
|
- return ERR_PTR(-ENOMEM);
|
|
|
+ return ERR_CAST(msm_obj->sgt);
|
|
|
}
|
|
|
|
|
|
msm_obj->pages = p;
|
|
@@ -159,7 +159,6 @@ out_unlock:
|
|
|
out:
|
|
|
switch (ret) {
|
|
|
case -EAGAIN:
|
|
|
- set_need_resched();
|
|
|
case 0:
|
|
|
case -ERESTARTSYS:
|
|
|
case -EINTR:
|
|
@@ -393,11 +392,14 @@ int msm_gem_queue_inactive_work(struct drm_gem_object *obj,
|
|
|
}
|
|
|
|
|
|
void msm_gem_move_to_active(struct drm_gem_object *obj,
|
|
|
- struct msm_gpu *gpu, uint32_t fence)
|
|
|
+ struct msm_gpu *gpu, bool write, uint32_t fence)
|
|
|
{
|
|
|
struct msm_gem_object *msm_obj = to_msm_bo(obj);
|
|
|
msm_obj->gpu = gpu;
|
|
|
- msm_obj->fence = fence;
|
|
|
+ if (write)
|
|
|
+ msm_obj->write_fence = fence;
|
|
|
+ else
|
|
|
+ msm_obj->read_fence = fence;
|
|
|
list_del_init(&msm_obj->mm_list);
|
|
|
list_add_tail(&msm_obj->mm_list, &gpu->active_list);
|
|
|
}
|
|
@@ -411,7 +413,8 @@ void msm_gem_move_to_inactive(struct drm_gem_object *obj)
|
|
|
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
|
|
|
|
|
|
msm_obj->gpu = NULL;
|
|
|
- msm_obj->fence = 0;
|
|
|
+ msm_obj->read_fence = 0;
|
|
|
+ msm_obj->write_fence = 0;
|
|
|
list_del_init(&msm_obj->mm_list);
|
|
|
list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
|
|
|
|
|
@@ -433,8 +436,18 @@ int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op,
|
|
|
struct msm_gem_object *msm_obj = to_msm_bo(obj);
|
|
|
int ret = 0;
|
|
|
|
|
|
- if (is_active(msm_obj) && !(op & MSM_PREP_NOSYNC))
|
|
|
- ret = msm_wait_fence_interruptable(dev, msm_obj->fence, timeout);
|
|
|
+ if (is_active(msm_obj)) {
|
|
|
+ uint32_t fence = 0;
|
|
|
+
|
|
|
+ if (op & MSM_PREP_READ)
|
|
|
+ fence = msm_obj->write_fence;
|
|
|
+ if (op & MSM_PREP_WRITE)
|
|
|
+ fence = max(fence, msm_obj->read_fence);
|
|
|
+ if (op & MSM_PREP_NOSYNC)
|
|
|
+ timeout = NULL;
|
|
|
+
|
|
|
+ ret = msm_wait_fence_interruptable(dev, fence, timeout);
|
|
|
+ }
|
|
|
|
|
|
/* TODO cache maintenance */
|
|
|
|
|
@@ -455,9 +468,10 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
|
|
|
uint64_t off = drm_vma_node_start(&obj->vma_node);
|
|
|
|
|
|
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
|
|
|
- seq_printf(m, "%08x: %c(%d) %2d (%2d) %08llx %p %d\n",
|
|
|
+ seq_printf(m, "%08x: %c(r=%u,w=%u) %2d (%2d) %08llx %p %d\n",
|
|
|
msm_obj->flags, is_active(msm_obj) ? 'A' : 'I',
|
|
|
- msm_obj->fence, obj->name, obj->refcount.refcount.counter,
|
|
|
+ msm_obj->read_fence, msm_obj->write_fence,
|
|
|
+ obj->name, obj->refcount.refcount.counter,
|
|
|
off, msm_obj->vaddr, obj->size);
|
|
|
}
|
|
|
|