Lines Matching refs:job
340 static u32 job_cmds_size(struct pvr_job *job, u32 ufo_wait_count) in job_cmds_size() argument
346 pvr_cccb_get_size_of_cmd_with_hdr(job->cmd_len); in job_cmds_size()
355 static unsigned long job_count_remaining_native_deps(struct pvr_job *job) in job_count_remaining_native_deps() argument
361 xa_for_each(&job->base.dependencies, index, fence) { in job_count_remaining_native_deps()
388 pvr_queue_get_job_cccb_fence(struct pvr_queue *queue, struct pvr_job *job) in pvr_queue_get_job_cccb_fence() argument
396 if (!job->cccb_fence) in pvr_queue_get_job_cccb_fence()
402 native_deps_remaining = job_count_remaining_native_deps(job); in pvr_queue_get_job_cccb_fence()
403 if (pvr_cccb_cmdseq_fits(&queue->cccb, job_cmds_size(job, native_deps_remaining))) { in pvr_queue_get_job_cccb_fence()
404 pvr_queue_fence_put(job->cccb_fence); in pvr_queue_get_job_cccb_fence()
405 job->cccb_fence = NULL; in pvr_queue_get_job_cccb_fence()
412 if (WARN_ON(queue->cccb_fence_ctx.job)) in pvr_queue_get_job_cccb_fence()
413 pvr_job_put(queue->cccb_fence_ctx.job); in pvr_queue_get_job_cccb_fence()
415 queue->cccb_fence_ctx.job = pvr_job_get(job); in pvr_queue_get_job_cccb_fence()
418 cccb_fence = container_of(job->cccb_fence, struct pvr_queue_fence, base); in pvr_queue_get_job_cccb_fence()
420 pvr_queue_cccb_fence_init(job->cccb_fence, queue); in pvr_queue_get_job_cccb_fence()
425 return dma_fence_get(job->cccb_fence); in pvr_queue_get_job_cccb_fence()
441 pvr_queue_get_job_kccb_fence(struct pvr_queue *queue, struct pvr_job *job) in pvr_queue_get_job_kccb_fence() argument
449 if (!job->kccb_fence) in pvr_queue_get_job_kccb_fence()
452 if (!WARN_ON(job->kccb_fence->ops)) { in pvr_queue_get_job_kccb_fence()
453 kccb_fence = pvr_kccb_reserve_slot(pvr_dev, job->kccb_fence); in pvr_queue_get_job_kccb_fence()
454 job->kccb_fence = NULL; in pvr_queue_get_job_kccb_fence()
461 pvr_queue_get_paired_frag_job_dep(struct pvr_queue *queue, struct pvr_job *job) in pvr_queue_get_paired_frag_job_dep() argument
463 struct pvr_job *frag_job = job->type == DRM_PVR_JOB_TYPE_GEOMETRY ? in pvr_queue_get_paired_frag_job_dep()
464 job->paired_job : NULL; in pvr_queue_get_paired_frag_job_dep()
477 if (f == &job->base.s_fence->scheduled) in pvr_queue_get_paired_frag_job_dep()
498 struct pvr_job *job = container_of(sched_job, struct pvr_job, base); in pvr_queue_prepare_job() local
507 if (job->type == DRM_PVR_JOB_TYPE_FRAGMENT && job->paired_job) { in pvr_queue_prepare_job()
514 if (job->paired_job->has_pm_ref) in pvr_queue_prepare_job()
522 pvr_queue_job_fence_init(job->done_fence, in pvr_queue_prepare_job()
523 job->ctx->queues.fragment); in pvr_queue_prepare_job()
525 pvr_queue_job_fence_init(job->done_fence, queue); in pvr_queue_prepare_job()
531 internal_dep = pvr_queue_get_job_cccb_fence(queue, job); in pvr_queue_prepare_job()
537 internal_dep = pvr_queue_get_job_kccb_fence(queue, job); in pvr_queue_prepare_job()
548 internal_dep = pvr_queue_get_paired_frag_job_dep(queue, job); in pvr_queue_prepare_job()
601 static void pvr_queue_submit_job_to_cccb(struct pvr_job *job) in pvr_queue_submit_job_to_cccb() argument
603 struct pvr_queue *queue = container_of(job->base.sched, struct pvr_queue, scheduler); in pvr_queue_submit_job_to_cccb()
618 xa_for_each(&job->base.dependencies, index, fence) { in pvr_queue_submit_job_to_cccb()
624 if (job->type == DRM_PVR_JOB_TYPE_FRAGMENT && job->paired_job && in pvr_queue_submit_job_to_cccb()
625 &job->paired_job->base.s_fence->scheduled == fence) in pvr_queue_submit_job_to_cccb()
643 if (job->type == DRM_PVR_JOB_TYPE_FRAGMENT && job->paired_job) { in pvr_queue_submit_job_to_cccb()
644 jfence = to_pvr_queue_job_fence(job->paired_job->done_fence); in pvr_queue_submit_job_to_cccb()
648 ufos[ufo_count++].value = job->paired_job->done_fence->seqno; in pvr_queue_submit_job_to_cccb()
657 if (job->type == DRM_PVR_JOB_TYPE_GEOMETRY && job->paired_job) { in pvr_queue_submit_job_to_cccb()
658 struct rogue_fwif_cmd_geom *cmd = job->cmd; in pvr_queue_submit_job_to_cccb()
665 cmd->partial_render_geom_frag_fence.value = job->done_fence->seqno - 1; in pvr_queue_submit_job_to_cccb()
669 pvr_cccb_write_command_with_header(cccb, job->fw_ccb_cmd_type, job->cmd_len, job->cmd, in pvr_queue_submit_job_to_cccb()
670 job->id, job->id); in pvr_queue_submit_job_to_cccb()
674 ufos[0].value = job->done_fence->seqno; in pvr_queue_submit_job_to_cccb()
688 struct pvr_job *job = container_of(sched_job, struct pvr_job, base); in pvr_queue_run_job() local
689 struct pvr_device *pvr_dev = job->pvr_dev; in pvr_queue_run_job()
696 if (job->paired_job && job->type == DRM_PVR_JOB_TYPE_FRAGMENT && in pvr_queue_run_job()
697 job->done_fence->ops) { in pvr_queue_run_job()
698 return dma_fence_get(job->done_fence); in pvr_queue_run_job()
707 if (WARN_ON(job->paired_job && in pvr_queue_run_job()
708 (job->type != DRM_PVR_JOB_TYPE_GEOMETRY || in pvr_queue_run_job()
709 job->paired_job->type != DRM_PVR_JOB_TYPE_FRAGMENT || in pvr_queue_run_job()
710 job->hwrt != job->paired_job->hwrt || in pvr_queue_run_job()
711 job->ctx != job->paired_job->ctx))) in pvr_queue_run_job()
714 err = pvr_job_get_pm_ref(job); in pvr_queue_run_job()
718 if (job->paired_job) { in pvr_queue_run_job()
719 err = pvr_job_get_pm_ref(job->paired_job); in pvr_queue_run_job()
725 pvr_queue_submit_job_to_cccb(job); in pvr_queue_run_job()
727 if (job->paired_job) { in pvr_queue_run_job()
728 struct pvr_job *geom_job = job; in pvr_queue_run_job()
729 struct pvr_job *frag_job = job->paired_job; in pvr_queue_run_job()
730 struct pvr_queue *geom_queue = job->ctx->queues.geometry; in pvr_queue_run_job()
731 struct pvr_queue *frag_queue = job->ctx->queues.fragment; in pvr_queue_run_job()
741 job->hwrt, in pvr_queue_run_job()
745 struct pvr_queue *queue = container_of(job->base.sched, in pvr_queue_run_job()
749 pvr_context_get_fw_addr(job->ctx) + queue->ctx_offset, in pvr_queue_run_job()
750 job->hwrt); in pvr_queue_run_job()
753 return dma_fence_get(job->done_fence); in pvr_queue_run_job()
763 struct pvr_job *job; in pvr_queue_start() local
770 list_for_each_entry(job, &queue->scheduler.pending_list, base.list) { in pvr_queue_start()
771 if (dma_fence_is_signaled(job->done_fence)) { in pvr_queue_start()
775 WARN_ON(job->base.s_fence->parent); in pvr_queue_start()
776 job->base.s_fence->parent = dma_fence_get(job->done_fence); in pvr_queue_start()
804 struct pvr_job *job; in pvr_queue_timedout_job() local
826 list_for_each_entry(job, &sched->pending_list, base.list) { in pvr_queue_timedout_job()
827 job->base.s_fence->parent = dma_fence_get(job->done_fence); in pvr_queue_timedout_job()
856 struct pvr_job *job = container_of(sched_job, struct pvr_job, base); in pvr_queue_free_job() local
859 job->paired_job = NULL; in pvr_queue_free_job()
860 pvr_job_put(job); in pvr_queue_free_job()
904 struct pvr_job *job, *tmp_job; in pvr_queue_signal_done_fences() local
909 list_for_each_entry_safe(job, tmp_job, &queue->scheduler.pending_list, base.list) { in pvr_queue_signal_done_fences()
910 if ((int)(cur_seqno - lower_32_bits(job->done_fence->seqno)) < 0) in pvr_queue_signal_done_fences()
913 if (!dma_fence_is_signaled(job->done_fence)) { in pvr_queue_signal_done_fences()
914 dma_fence_signal(job->done_fence); in pvr_queue_signal_done_fences()
915 pvr_job_release_pm_ref(job); in pvr_queue_signal_done_fences()
936 struct pvr_job *job; in pvr_queue_check_job_waiting_for_cccb_space() local
939 job = queue->cccb_fence_ctx.job; in pvr_queue_check_job_waiting_for_cccb_space()
940 if (!job) in pvr_queue_check_job_waiting_for_cccb_space()
946 if (WARN_ON(!job->cccb_fence)) { in pvr_queue_check_job_waiting_for_cccb_space()
947 job = NULL; in pvr_queue_check_job_waiting_for_cccb_space()
952 cccb_fence = container_of(job->cccb_fence, struct pvr_queue_fence, base); in pvr_queue_check_job_waiting_for_cccb_space()
954 job = NULL; in pvr_queue_check_job_waiting_for_cccb_space()
962 native_deps_remaining = job_count_remaining_native_deps(job); in pvr_queue_check_job_waiting_for_cccb_space()
963 if (!pvr_cccb_cmdseq_fits(&queue->cccb, job_cmds_size(job, native_deps_remaining))) { in pvr_queue_check_job_waiting_for_cccb_space()
964 job = NULL; in pvr_queue_check_job_waiting_for_cccb_space()
968 dma_fence_signal(job->cccb_fence); in pvr_queue_check_job_waiting_for_cccb_space()
969 pvr_queue_fence_put(job->cccb_fence); in pvr_queue_check_job_waiting_for_cccb_space()
970 job->cccb_fence = NULL; in pvr_queue_check_job_waiting_for_cccb_space()
971 queue->cccb_fence_ctx.job = NULL; in pvr_queue_check_job_waiting_for_cccb_space()
976 pvr_job_put(job); in pvr_queue_check_job_waiting_for_cccb_space()
1071 int pvr_queue_job_init(struct pvr_job *job) in pvr_queue_job_init() argument
1074 u32 min_native_dep_count = job->type == DRM_PVR_JOB_TYPE_FRAGMENT ? 1 : 0; in pvr_queue_job_init()
1078 if (atomic_read(&job->ctx->faulty)) in pvr_queue_job_init()
1081 queue = pvr_context_get_queue_for_job(job->ctx, job->type); in pvr_queue_job_init()
1085 if (!pvr_cccb_cmdseq_can_fit(&queue->cccb, job_cmds_size(job, min_native_dep_count))) in pvr_queue_job_init()
1088 err = drm_sched_job_init(&job->base, &queue->entity, 1, THIS_MODULE); in pvr_queue_job_init()
1092 job->cccb_fence = pvr_queue_fence_alloc(); in pvr_queue_job_init()
1093 job->kccb_fence = pvr_kccb_fence_alloc(); in pvr_queue_job_init()
1094 job->done_fence = pvr_queue_fence_alloc(); in pvr_queue_job_init()
1095 if (!job->cccb_fence || !job->kccb_fence || !job->done_fence) in pvr_queue_job_init()
1116 struct dma_fence *pvr_queue_job_arm(struct pvr_job *job) in pvr_queue_job_arm() argument
1118 drm_sched_job_arm(&job->base); in pvr_queue_job_arm()
1120 return &job->base.s_fence->finished; in pvr_queue_job_arm()
1129 void pvr_queue_job_cleanup(struct pvr_job *job) in pvr_queue_job_cleanup() argument
1131 pvr_queue_fence_put(job->done_fence); in pvr_queue_job_cleanup()
1132 pvr_queue_fence_put(job->cccb_fence); in pvr_queue_job_cleanup()
1133 pvr_kccb_fence_put(job->kccb_fence); in pvr_queue_job_cleanup()
1135 if (job->base.s_fence) in pvr_queue_job_cleanup()
1136 drm_sched_job_cleanup(&job->base); in pvr_queue_job_cleanup()
1149 void pvr_queue_job_push(struct pvr_job *job) in pvr_queue_job_push() argument
1151 struct pvr_queue *queue = container_of(job->base.sched, struct pvr_queue, scheduler); in pvr_queue_job_push()
1155 queue->last_queued_job_scheduled_fence = dma_fence_get(&job->base.s_fence->scheduled); in pvr_queue_job_push()
1157 pvr_job_get(job); in pvr_queue_job_push()
1158 drm_sched_entity_push_job(&job->base); in pvr_queue_job_push()