Restructure the CPU ioctl so that all job types, including indirect CSD, use a single struct v3d_submit chain and a single DRM exec context.
Now that v3d_get_cpu_indirect_csd_params() is a pure parser and the submit helpers operate on struct v3d_submit, fold the indirect CSD path into the standard flow by appending the CSD and CLEAN_CACHE jobs to the same struct v3d_submit as the CPU job and locking the union of all jobs' BOs under one drm_exec. This eliminates the second drm_exec, the nested submission, and the conditional two-pass fence attachment that the CPU ioctl previously required for the indirect CSD path. Signed-off-by: Maíra Canal <[email protected]> --- drivers/gpu/drm/v3d/v3d_drv.h | 6 --- drivers/gpu/drm/v3d/v3d_submit.c | 80 ++++++++++------------------------------ 2 files changed, 20 insertions(+), 66 deletions(-) diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h index ec01668bacb6..071d919fe860 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.h +++ b/drivers/gpu/drm/v3d/v3d_drv.h @@ -422,9 +422,6 @@ struct v3d_indirect_csd_info { /* Indirect CSD */ struct v3d_csd_job *job; - /* Clean cache job associated to the Indirect CSD job */ - struct v3d_job *clean_job; - /* Indirect CSD args, stashed by the extension parser and later used * to create the CSD job from them. */ @@ -443,9 +440,6 @@ struct v3d_indirect_csd_info { /* Indirect BO */ struct drm_gem_object *indirect; - - /* Context of the Indirect CSD job */ - struct drm_exec exec; }; struct v3d_timestamp_query_info { diff --git a/drivers/gpu/drm/v3d/v3d_submit.c b/drivers/gpu/drm/v3d/v3d_submit.c index 899128fc2bd5..6506acb6992e 100644 --- a/drivers/gpu/drm/v3d/v3d_submit.c +++ b/drivers/gpu/drm/v3d/v3d_submit.c @@ -1250,15 +1250,10 @@ int v3d_submit_cpu_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { - struct v3d_dev *v3d = to_v3d_dev(dev); struct v3d_submit submit = { .v3d = to_v3d_dev(dev), .file_priv = file_priv }; - struct v3d_submit indirect_submit = { .v3d = to_v3d_dev(dev), .file_priv = file_priv }; struct drm_v3d_submit_cpu *args = data; struct v3d_submit_ext se = {0}; - struct v3d_submit_ext *out_se = NULL; struct v3d_cpu_job *cpu_job = NULL; - struct v3d_csd_job *csd_job = NULL; - struct v3d_job *clean_job = NULL; int ret; if (args->flags && !(args->flags & DRM_V3D_SUBMIT_EXTENSION)) { @@ -1292,86 +1287,51 @@ v3d_submit_cpu_ioctl(struct drm_device *dev, void *data, goto fail; } - trace_v3d_submit_cpu_ioctl(&v3d->drm, cpu_job->job_type); + trace_v3d_submit_cpu_ioctl(dev, cpu_job->job_type); ret = v3d_job_add_syncobjs(&cpu_job->base, file_priv, 0, &se, V3D_CPU); if (ret) goto fail; - if (cpu_job->job_type == V3D_CPU_JOB_TYPE_INDIRECT_CSD) { - ret = v3d_setup_csd_jobs_and_bos(&indirect_submit, - &cpu_job->indirect_csd.args, - NULL); - if (ret) - goto fail; - - cpu_job->indirect_csd.job = container_of(indirect_submit.jobs[0], - struct v3d_csd_job, base); - cpu_job->indirect_csd.clean_job = indirect_submit.jobs[1]; - } - - clean_job = cpu_job->indirect_csd.clean_job; - csd_job = cpu_job->indirect_csd.job; - + /* Look up the CPU jobs' BOs first, so v3d_setup_csd_jobs_and_bos(), which + * locks all jobs' BOs at its end, picks them up too in the case of indirect + * CSD. + */ if (args->bo_handle_count) { ret = v3d_lookup_bos(&submit, args->bo_handles, args->bo_handle_count); if (ret) goto fail; + } + if (cpu_job->job_type == V3D_CPU_JOB_TYPE_INDIRECT_CSD) { + ret = v3d_setup_csd_jobs_and_bos(&submit, &cpu_job->indirect_csd.args, + NULL); + if (ret) + goto fail; + + /* The CSD job was appended at jobs[1] */ + cpu_job->indirect_csd.job = container_of(submit.jobs[1], struct v3d_csd_job, + base); + } else { ret = v3d_submit_lock_reservations(&submit); if (ret) goto fail; } - mutex_lock(&v3d->sched_lock); - v3d_push_job(&cpu_job->base); + ret = v3d_submit_jobs(&submit); + if (ret) + goto fail_unreserve; - switch (cpu_job->job_type) { - case V3D_CPU_JOB_TYPE_INDIRECT_CSD: - ret = drm_sched_job_add_dependency(&csd_job->base.base, - dma_fence_get(cpu_job->base.done_fence)); - if (ret) - goto fail_unreserve; - - v3d_push_job(&csd_job->base); - - ret = drm_sched_job_add_dependency(&clean_job->base, - dma_fence_get(csd_job->base.done_fence)); - if (ret) - goto fail_unreserve; - - v3d_push_job(clean_job); - - break; - default: - break; - } - mutex_unlock(&v3d->sched_lock); - - out_se = (cpu_job->job_type == V3D_CPU_JOB_TYPE_INDIRECT_CSD) ? NULL : &se; - - v3d_attach_fences_and_unlock_reservation(&submit, 0, out_se); - - switch (cpu_job->job_type) { - case V3D_CPU_JOB_TYPE_INDIRECT_CSD: - v3d_attach_fences_and_unlock_reservation(&indirect_submit, 0, &se); - break; - default: - break; - } + v3d_attach_fences_and_unlock_reservation(&submit, 0, &se); v3d_submit_put_jobs(&submit); - v3d_submit_put_jobs(&indirect_submit); return 0; fail_unreserve: - mutex_unlock(&v3d->sched_lock); v3d_submit_unlock_reservations(&submit); - v3d_submit_unlock_reservations(&indirect_submit); fail: v3d_submit_cleanup_jobs(&submit); - v3d_submit_cleanup_jobs(&indirect_submit); v3d_put_multisync_post_deps(&se); kvfree(cpu_job->timestamp_query.queries); kvfree(cpu_job->performance_query.queries); -- 2.54.0
