@@ -163,6 +163,15 @@ panfrost_lookup_bos(struct drm_device *dev,
if (!job->bo_count)
return 0;
+ job->bo_flags = kvmalloc_array(job->bo_count,
+ sizeof(*job->bo_flags),
+ GFP_KERNEL | __GFP_ZERO);
+ if (!job->bo_flags)
+ return -ENOMEM;
+
+ for (i = 0; i < job->bo_count; i++)
+ job->bo_flags[i] = PANFROST_BO_REF_RW;
+
ret = drm_gem_objects_lookup(file_priv,
(void __user *)(uintptr_t)args->bo_handles,
job->bo_count, &job->bos);
@@ -201,10 +201,17 @@ static int panfrost_acquire_object_fences(struct panfrost_job *job)
int i;
for (i = 0; i < job->bo_count; i++) {
+ bool write = job->bo_flags[i] & PANFROST_BO_REF_WRITE;
int ret;
+ if (!(job->bo_flags[i] & PANFROST_BO_REF_WRITE)) {
+ ret = dma_resv_reserve_shared(job->bos[i]->resv, 1);
+ if (ret)
+ return ret;
+ }
+
ret = drm_gem_fence_array_add_implicit(&job->deps,
- job->bos[i], true);
+ job->bos[i], write);
if (ret)
return ret;
}
@@ -219,7 +226,10 @@ static void panfrost_attach_object_fences(struct panfrost_job *job)
for (i = 0; i < job->bo_count; i++) {
struct dma_resv *robj = job->bos[i]->resv;
- dma_resv_add_excl_fence(robj, job->render_done_fence);
+ if (job->bo_flags[i] & PANFROST_BO_REF_WRITE)
+ dma_resv_add_excl_fence(robj, job->render_done_fence);
+ else
+ dma_resv_add_shared_fence(robj, job->render_done_fence);
}
}
@@ -298,6 +308,7 @@ static void panfrost_job_cleanup(struct kref *ref)
kvfree(job->bos);
}
+ kvfree(job->bo_flags);
kfree(job);
}
@@ -31,6 +31,7 @@ struct panfrost_job {
struct panfrost_gem_mapping **mappings;
struct drm_gem_object **bos;
+ u32 *bo_flags;
u32 bo_count;
/* Fence to be signaled by drm-sched once its done with the job */
@@ -223,6 +223,10 @@ struct drm_panfrost_madvise {
__u32 retained; /* out, whether backing store still exists */
};
+#define PANFROST_BO_REF_READ 0x1
+#define PANFROST_BO_REF_WRITE 0x2
+#define PANFROST_BO_REF_RW (PANFROST_BO_REF_READ | PANFROST_BO_REF_WRITE)
+
#if defined(__cplusplus)
}
#endif
Jobs reading from the same BO should not be serialized. Add access flags so we can relax the implicit dependencies in that case. We force RW access for now to keep the behavior unchanged, but a new SUBMIT ioctl taking explicit access flags will be introduced. Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> --- drivers/gpu/drm/panfrost/panfrost_drv.c | 9 +++++++++ drivers/gpu/drm/panfrost/panfrost_job.c | 15 +++++++++++++-- drivers/gpu/drm/panfrost/panfrost_job.h | 1 + include/uapi/drm/panfrost_drm.h | 4 ++++ 4 files changed, 27 insertions(+), 2 deletions(-)