Lines Matching full:job

15  * we can attach fences and update the reservations after pushing the job
23 v3d_lock_bo_reservations(struct v3d_job *job, in v3d_lock_bo_reservations() argument
28 ret = drm_gem_lock_reservations(job->bo, job->bo_count, acquire_ctx); in v3d_lock_bo_reservations()
32 for (i = 0; i < job->bo_count; i++) { in v3d_lock_bo_reservations()
33 ret = dma_resv_reserve_fences(job->bo[i]->resv, 1); in v3d_lock_bo_reservations()
37 ret = drm_sched_job_add_implicit_dependencies(&job->base, in v3d_lock_bo_reservations()
38 job->bo[i], true); in v3d_lock_bo_reservations()
46 drm_gem_unlock_reservations(job->bo, job->bo_count, acquire_ctx); in v3d_lock_bo_reservations()
51 * v3d_lookup_bos() - Sets up job->bo[] with the GEM objects
52 * referenced by the job.
55 * @job: V3D job being set up
60 * the submitted job's BO list. This does the validation of the job's
61 * BO list and reference counting for the lifetime of the job.
69 struct v3d_job *job, in v3d_lookup_bos() argument
73 job->bo_count = bo_count; in v3d_lookup_bos()
75 if (!job->bo_count) { in v3d_lookup_bos()
85 job->bo_count, &job->bo); in v3d_lookup_bos()
91 struct v3d_job *job = container_of(ref, struct v3d_job, refcount); in v3d_job_free() local
94 if (job->bo) { in v3d_job_free()
95 for (i = 0; i < job->bo_count; i++) in v3d_job_free()
96 drm_gem_object_put(job->bo[i]); in v3d_job_free()
97 kvfree(job->bo); in v3d_job_free()
100 dma_fence_put(job->irq_fence); in v3d_job_free()
101 dma_fence_put(job->done_fence); in v3d_job_free()
103 if (job->perfmon) in v3d_job_free()
104 v3d_perfmon_put(job->perfmon); in v3d_job_free()
106 kfree(job); in v3d_job_free()
112 struct v3d_render_job *job = container_of(ref, struct v3d_render_job, in v3d_render_job_free() local
116 list_for_each_entry_safe(bo, save, &job->unref_list, unref_head) { in v3d_render_job_free()
123 void v3d_job_cleanup(struct v3d_job *job) in v3d_job_cleanup() argument
125 if (!job) in v3d_job_cleanup()
128 drm_sched_job_cleanup(&job->base); in v3d_job_cleanup()
129 v3d_job_put(job); in v3d_job_cleanup()
132 void v3d_job_put(struct v3d_job *job) in v3d_job_put() argument
134 if (!job) in v3d_job_put()
137 kref_put(&job->refcount, job->free); in v3d_job_put()
145 drm_err(&v3d->drm, "Cannot allocate memory for V3D job.\n"); in v3d_job_allocate()
161 struct v3d_job *job, void (*free)(struct kref *ref), in v3d_job_init() argument
168 job->v3d = v3d; in v3d_job_init()
169 job->free = free; in v3d_job_init()
170 job->file_priv = v3d_priv; in v3d_job_init()
172 ret = drm_sched_job_init(&job->base, &v3d_priv->sched_entity[queue], in v3d_job_init()
189 ret = drm_sched_job_add_syncobj_dependency(&job->base, file_priv, in.handle, 0); in v3d_job_init()
197 ret = drm_sched_job_add_syncobj_dependency(&job->base, file_priv, in_sync, 0); in v3d_job_init()
204 kref_init(&job->refcount); in v3d_job_init()
209 drm_sched_job_cleanup(&job->base); in v3d_job_init()
214 v3d_push_job(struct v3d_job *job) in v3d_push_job() argument
216 drm_sched_job_arm(&job->base); in v3d_push_job()
218 job->done_fence = dma_fence_get(&job->base.s_fence->finished); in v3d_push_job()
220 /* put by scheduler job completion */ in v3d_push_job()
221 kref_get(&job->refcount); in v3d_push_job()
223 drm_sched_entity_push_job(&job->base); in v3d_push_job()
228 struct v3d_job *job, in v3d_attach_fences_and_unlock_reservation() argument
238 for (i = 0; i < job->bo_count; i++) { in v3d_attach_fences_and_unlock_reservation()
240 dma_resv_add_fence(job->bo[i]->resv, job->done_fence, in v3d_attach_fences_and_unlock_reservation()
244 drm_gem_unlock_reservations(job->bo, job->bo_count, acquire_ctx); in v3d_attach_fences_and_unlock_reservation()
246 /* Update the return sync object for the job */ in v3d_attach_fences_and_unlock_reservation()
272 struct v3d_csd_job **job, in v3d_setup_csd_jobs_and_bos() argument
279 ret = v3d_job_allocate(v3d, (void *)job, sizeof(**job)); in v3d_setup_csd_jobs_and_bos()
283 ret = v3d_job_init(v3d, file_priv, &(*job)->base, in v3d_setup_csd_jobs_and_bos()
286 v3d_job_deallocate((void *)job); in v3d_setup_csd_jobs_and_bos()
301 (*job)->args = *args; in v3d_setup_csd_jobs_and_bos()
373 * to be signaled when job completes (out_sync).
386 drm_dbg(&v3d->drm, "Two multisync extensions were added to the same job."); in v3d_get_multisync_submit_deps()
409 /* Returns false if the CPU job has an invalid configuration. */
411 v3d_validate_cpu_job(struct drm_file *file_priv, struct v3d_cpu_job *job) in v3d_validate_cpu_job() argument
416 if (!job) { in v3d_validate_cpu_job()
417 drm_dbg(&v3d->drm, "CPU job extension was attached to a GPU job.\n"); in v3d_validate_cpu_job()
421 if (job->job_type) { in v3d_validate_cpu_job()
422 drm_dbg(&v3d->drm, "Two CPU job extensions were added to the same CPU job.\n"); in v3d_validate_cpu_job()
429 /* Get data for the indirect CSD job submission. */
433 struct v3d_cpu_job *job) in v3d_get_cpu_indirect_csd_params() argument
438 struct v3d_indirect_csd_info *info = &job->indirect_csd; in v3d_get_cpu_indirect_csd_params()
440 if (!v3d_validate_cpu_job(file_priv, job)) in v3d_get_cpu_indirect_csd_params()
451 job->job_type = V3D_CPU_JOB_TYPE_INDIRECT_CSD; in v3d_get_cpu_indirect_csd_params()
460 &info->job, &info->clean_job, in v3d_get_cpu_indirect_csd_params()
464 /* Get data for the query timestamp job submission. */
468 struct v3d_cpu_job *job) in v3d_get_cpu_timestamp_query_params() argument
472 struct v3d_timestamp_query_info *query_info = &job->timestamp_query; in v3d_get_cpu_timestamp_query_params()
476 if (!v3d_validate_cpu_job(file_priv, job)) in v3d_get_cpu_timestamp_query_params()
485 job->job_type = V3D_CPU_JOB_TYPE_TIMESTAMP_QUERY; in v3d_get_cpu_timestamp_query_params()
522 v3d_timestamp_query_info_free(&job->timestamp_query, i); in v3d_get_cpu_timestamp_query_params()
529 struct v3d_cpu_job *job) in v3d_get_cpu_reset_timestamp_params() argument
533 struct v3d_timestamp_query_info *query_info = &job->timestamp_query; in v3d_get_cpu_reset_timestamp_params()
537 if (!v3d_validate_cpu_job(file_priv, job)) in v3d_get_cpu_reset_timestamp_params()
543 job->job_type = V3D_CPU_JOB_TYPE_RESET_TIMESTAMP_QUERY; in v3d_get_cpu_reset_timestamp_params()
574 v3d_timestamp_query_info_free(&job->timestamp_query, i); in v3d_get_cpu_reset_timestamp_params()
578 /* Get data for the copy timestamp query results job submission. */
582 struct v3d_cpu_job *job) in v3d_get_cpu_copy_query_results_params() argument
586 struct v3d_timestamp_query_info *query_info = &job->timestamp_query; in v3d_get_cpu_copy_query_results_params()
590 if (!v3d_validate_cpu_job(file_priv, job)) in v3d_get_cpu_copy_query_results_params()
599 job->job_type = V3D_CPU_JOB_TYPE_COPY_TIMESTAMP_QUERY; in v3d_get_cpu_copy_query_results_params()
633 job->copy.do_64bit = copy.do_64bit; in v3d_get_cpu_copy_query_results_params()
634 job->copy.do_partial = copy.do_partial; in v3d_get_cpu_copy_query_results_params()
635 job->copy.availability_bit = copy.availability_bit; in v3d_get_cpu_copy_query_results_params()
636 job->copy.offset = copy.offset; in v3d_get_cpu_copy_query_results_params()
637 job->copy.stride = copy.stride; in v3d_get_cpu_copy_query_results_params()
642 v3d_timestamp_query_info_free(&job->timestamp_query, i); in v3d_get_cpu_copy_query_results_params()
712 struct v3d_cpu_job *job) in v3d_get_cpu_reset_performance_params() argument
714 struct v3d_performance_query_info *query_info = &job->performance_query; in v3d_get_cpu_reset_performance_params()
718 if (!v3d_validate_cpu_job(file_priv, job)) in v3d_get_cpu_reset_performance_params()
724 job->job_type = V3D_CPU_JOB_TYPE_RESET_PERFORMANCE_QUERY; in v3d_get_cpu_reset_performance_params()
749 struct v3d_cpu_job *job) in v3d_get_cpu_copy_performance_query_params() argument
751 struct v3d_performance_query_info *query_info = &job->performance_query; in v3d_get_cpu_copy_performance_query_params()
755 if (!v3d_validate_cpu_job(file_priv, job)) in v3d_get_cpu_copy_performance_query_params()
764 job->job_type = V3D_CPU_JOB_TYPE_COPY_PERFORMANCE_QUERY; in v3d_get_cpu_copy_performance_query_params()
784 job->copy.do_64bit = copy.do_64bit; in v3d_get_cpu_copy_performance_query_params()
785 job->copy.do_partial = copy.do_partial; in v3d_get_cpu_copy_performance_query_params()
786 job->copy.availability_bit = copy.availability_bit; in v3d_get_cpu_copy_performance_query_params()
787 job->copy.offset = copy.offset; in v3d_get_cpu_copy_performance_query_params()
788 job->copy.stride = copy.stride; in v3d_get_cpu_copy_performance_query_params()
800 struct v3d_cpu_job *job) in v3d_get_extensions() argument
821 ret = v3d_get_cpu_indirect_csd_params(file_priv, user_ext, job); in v3d_get_extensions()
824 ret = v3d_get_cpu_timestamp_query_params(file_priv, user_ext, job); in v3d_get_extensions()
827 ret = v3d_get_cpu_reset_timestamp_params(file_priv, user_ext, job); in v3d_get_extensions()
830 ret = v3d_get_cpu_copy_query_results_params(file_priv, user_ext, job); in v3d_get_extensions()
833 ret = v3d_get_cpu_reset_performance_params(file_priv, user_ext, job); in v3d_get_extensions()
836 ret = v3d_get_cpu_copy_performance_query_params(file_priv, user_ext, job); in v3d_get_extensions()
853 * v3d_submit_cl_ioctl() - Submits a job (frame) to the V3D.
1031 * v3d_submit_tfu_ioctl() - Submits a TFU (texture formatting) job to the V3D.
1046 struct v3d_tfu_job *job = NULL; in v3d_submit_tfu_ioctl() local
1065 ret = v3d_job_allocate(v3d, (void *)&job, sizeof(*job)); in v3d_submit_tfu_ioctl()
1069 ret = v3d_job_init(v3d, file_priv, &job->base, in v3d_submit_tfu_ioctl()
1072 v3d_job_deallocate((void *)&job); in v3d_submit_tfu_ioctl()
1076 job->base.bo = kzalloc_objs(*job->base.bo, ARRAY_SIZE(args->bo_handles)); in v3d_submit_tfu_ioctl()
1077 if (!job->base.bo) { in v3d_submit_tfu_ioctl()
1082 job->args = *args; in v3d_submit_tfu_ioctl()
1084 for (job->base.bo_count = 0; in v3d_submit_tfu_ioctl()
1085 job->base.bo_count < ARRAY_SIZE(args->bo_handles); in v3d_submit_tfu_ioctl()
1086 job->base.bo_count++) { in v3d_submit_tfu_ioctl()
1089 if (!args->bo_handles[job->base.bo_count]) in v3d_submit_tfu_ioctl()
1092 bo = drm_gem_object_lookup(file_priv, args->bo_handles[job->base.bo_count]); in v3d_submit_tfu_ioctl()
1095 job->base.bo_count, in v3d_submit_tfu_ioctl()
1096 args->bo_handles[job->base.bo_count]); in v3d_submit_tfu_ioctl()
1100 job->base.bo[job->base.bo_count] = bo; in v3d_submit_tfu_ioctl()
1103 ret = v3d_lock_bo_reservations(&job->base, &acquire_ctx); in v3d_submit_tfu_ioctl()
1108 v3d_push_job(&job->base); in v3d_submit_tfu_ioctl()
1112 &job->base, &acquire_ctx, in v3d_submit_tfu_ioctl()
1115 job->base.done_fence); in v3d_submit_tfu_ioctl()
1117 v3d_job_put(&job->base); in v3d_submit_tfu_ioctl()
1122 v3d_job_cleanup((void *)job); in v3d_submit_tfu_ioctl()
1129 * v3d_submit_csd_ioctl() - Submits a CSD (compute shader) job to the V3D.
1145 struct v3d_csd_job *job = NULL; in v3d_submit_csd_ioctl() local
1174 &job, &clean_job, &se, in v3d_submit_csd_ioctl()
1185 job->base.perfmon = v3d_perfmon_find(v3d_priv, in v3d_submit_csd_ioctl()
1187 if (!job->base.perfmon) { in v3d_submit_csd_ioctl()
1194 v3d_push_job(&job->base); in v3d_submit_csd_ioctl()
1197 dma_fence_get(job->base.done_fence)); in v3d_submit_csd_ioctl()
1211 v3d_job_put(&job->base); in v3d_submit_csd_ioctl()
1222 v3d_job_cleanup((void *)job); in v3d_submit_csd_ioctl()
1239 * v3d_submit_cpu_ioctl() - Submits a CPU job to the V3D.
1244 * Userspace specifies the CPU job type and data required to perform its
1278 /* Every CPU job must have a CPU job user extension */ in v3d_submit_cpu_ioctl()
1280 drm_dbg(dev, "CPU job must have a CPU job user extension.\n"); in v3d_submit_cpu_ioctl()
1286 drm_dbg(dev, "This CPU job was not submitted with the proper number of BOs.\n"); in v3d_submit_cpu_ioctl()
1301 csd_job = cpu_job->indirect_csd.job; in v3d_submit_cpu_ioctl()