Lines Matching full:exec

158 	struct vc4_exec_info *exec[2];  in vc4_save_hang_state()  local
170 exec[0] = vc4_first_bin_job(vc4); in vc4_save_hang_state()
171 exec[1] = vc4_first_render_job(vc4); in vc4_save_hang_state()
172 if (!exec[0] && !exec[1]) { in vc4_save_hang_state()
180 if (!exec[i]) in vc4_save_hang_state()
184 list_for_each_entry(bo, &exec[i]->unref_list, unref_head) in vc4_save_hang_state()
186 state->bo_count += exec[i]->bo_count + unref_list_count; in vc4_save_hang_state()
199 if (!exec[i]) in vc4_save_hang_state()
202 for (j = 0; j < exec[i]->bo_count; j++) { in vc4_save_hang_state()
203 bo = to_vc4_bo(exec[i]->bo[j]); in vc4_save_hang_state()
211 drm_gem_object_get(exec[i]->bo[j]); in vc4_save_hang_state()
212 kernel_state->bo[k++] = exec[i]->bo[j]; in vc4_save_hang_state()
215 list_for_each_entry(bo, &exec[i]->unref_list, unref_head) { in vc4_save_hang_state()
226 if (exec[0]) in vc4_save_hang_state()
227 state->start_bin = exec[0]->ct0ca; in vc4_save_hang_state()
228 if (exec[1]) in vc4_save_hang_state()
229 state->start_render = exec[1]->ct1ca; in vc4_save_hang_state()
476 struct vc4_exec_info *exec; in vc4_submit_next_bin_job() local
482 exec = vc4_first_bin_job(vc4); in vc4_submit_next_bin_job()
483 if (!exec) in vc4_submit_next_bin_job()
491 if (exec->perfmon && vc4->active_perfmon != exec->perfmon) in vc4_submit_next_bin_job()
492 vc4_perfmon_start(vc4, exec->perfmon); in vc4_submit_next_bin_job()
497 if (exec->ct0ca != exec->ct0ea) { in vc4_submit_next_bin_job()
498 trace_vc4_submit_cl(dev, false, exec->seqno, exec->ct0ca, in vc4_submit_next_bin_job()
499 exec->ct0ea); in vc4_submit_next_bin_job()
500 submit_cl(dev, 0, exec->ct0ca, exec->ct0ea); in vc4_submit_next_bin_job()
504 vc4_move_job_to_render(dev, exec); in vc4_submit_next_bin_job()
512 if (next && next->perfmon == exec->perfmon) in vc4_submit_next_bin_job()
521 struct vc4_exec_info *exec = vc4_first_render_job(vc4); in vc4_submit_next_render_job() local
523 if (!exec) in vc4_submit_next_render_job()
537 trace_vc4_submit_cl(dev, true, exec->seqno, exec->ct1ca, exec->ct1ea); in vc4_submit_next_render_job()
538 submit_cl(dev, 1, exec->ct1ca, exec->ct1ea); in vc4_submit_next_render_job()
542 vc4_move_job_to_render(struct drm_device *dev, struct vc4_exec_info *exec) in vc4_move_job_to_render() argument
550 list_move_tail(&exec->head, &vc4->render_job_list); in vc4_move_job_to_render()
556 vc4_attach_fences(struct vc4_exec_info *exec) in vc4_attach_fences() argument
561 for (i = 0; i < exec->bo_count; i++) { in vc4_attach_fences()
562 bo = to_vc4_bo(exec->bo[i]); in vc4_attach_fences()
563 dma_resv_add_fence(bo->base.base.resv, exec->fence, in vc4_attach_fences()
567 for (i = 0; i < exec->rcl_write_bo_count; i++) { in vc4_attach_fences()
568 bo = to_vc4_bo(&exec->rcl_write_bo[i]->base); in vc4_attach_fences()
569 dma_resv_add_fence(bo->base.base.resv, exec->fence, in vc4_attach_fences()
578 * (all of which are on exec->unref_list). They're entirely private
582 vc4_lock_bo_reservations(struct vc4_exec_info *exec, in vc4_lock_bo_reservations() argument
590 drm_exec_init(exec_ctx, DRM_EXEC_INTERRUPTIBLE_WAIT, exec->bo_count); in vc4_lock_bo_reservations()
592 ret = drm_exec_prepare_array(exec_ctx, exec->bo, in vc4_lock_bo_reservations()
593 exec->bo_count, 1); in vc4_lock_bo_reservations()
614 vc4_queue_submit(struct drm_device *dev, struct vc4_exec_info *exec, in vc4_queue_submit() argument
632 exec->seqno = seqno; in vc4_queue_submit()
635 vc4->dma_fence_context, exec->seqno); in vc4_queue_submit()
636 fence->seqno = exec->seqno; in vc4_queue_submit()
637 exec->fence = &fence->base; in vc4_queue_submit()
640 drm_syncobj_replace_fence(out_sync, exec->fence); in vc4_queue_submit()
642 vc4_attach_fences(exec); in vc4_queue_submit()
646 list_add_tail(&exec->head, &vc4->bin_job_list); in vc4_queue_submit()
654 if (vc4_first_bin_job(vc4) == exec && in vc4_queue_submit()
655 (!renderjob || renderjob->perfmon == exec->perfmon)) { in vc4_queue_submit()
666 * vc4_cl_lookup_bos() - Sets up exec->bo[] with the GEM objects
670 * @exec: V3D job being set up
679 struct vc4_exec_info *exec) in vc4_cl_lookup_bos() argument
681 struct drm_vc4_submit_cl *args = exec->args; in vc4_cl_lookup_bos()
685 exec->bo_count = args->bo_handle_count; in vc4_cl_lookup_bos()
687 if (!exec->bo_count) { in vc4_cl_lookup_bos()
696 exec->bo_count, &exec->bo); in vc4_cl_lookup_bos()
701 for (i = 0; i < exec->bo_count; i++) { in vc4_cl_lookup_bos()
702 ret = vc4_bo_inc_usecnt(to_vc4_bo(exec->bo[i])); in vc4_cl_lookup_bos()
715 * exec->bo to NULL so that vc4_complete_exec() skips the 'BO release' in vc4_cl_lookup_bos()
719 vc4_bo_dec_usecnt(to_vc4_bo(exec->bo[i])); in vc4_cl_lookup_bos()
723 for (i = 0; i < exec->bo_count && exec->bo[i]; i++) in vc4_cl_lookup_bos()
724 drm_gem_object_put(exec->bo[i]); in vc4_cl_lookup_bos()
726 kvfree(exec->bo); in vc4_cl_lookup_bos()
727 exec->bo = NULL; in vc4_cl_lookup_bos()
732 vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) in vc4_get_bcl() argument
734 struct drm_vc4_submit_cl *args = exec->args; in vc4_get_bcl()
754 DRM_DEBUG("overflow in exec arguments\n"); in vc4_get_bcl()
774 exec->shader_rec_u = temp + shader_rec_offset; in vc4_get_bcl()
775 exec->uniforms_u = temp + uniforms_offset; in vc4_get_bcl()
776 exec->shader_state = temp + exec_size; in vc4_get_bcl()
777 exec->shader_state_size = args->shader_rec_count; in vc4_get_bcl()
786 if (copy_from_user(exec->shader_rec_u, in vc4_get_bcl()
793 if (copy_from_user(exec->uniforms_u, in vc4_get_bcl()
806 exec->exec_bo = &bo->base; in vc4_get_bcl()
808 list_add_tail(&to_vc4_bo(&exec->exec_bo->base)->unref_head, in vc4_get_bcl()
809 &exec->unref_list); in vc4_get_bcl()
811 exec->ct0ca = exec->exec_bo->dma_addr + bin_offset; in vc4_get_bcl()
813 exec->bin_u = bin; in vc4_get_bcl()
815 exec->shader_rec_v = exec->exec_bo->vaddr + shader_rec_offset; in vc4_get_bcl()
816 exec->shader_rec_p = exec->exec_bo->dma_addr + shader_rec_offset; in vc4_get_bcl()
817 exec->shader_rec_size = args->shader_rec_size; in vc4_get_bcl()
819 exec->uniforms_v = exec->exec_bo->vaddr + uniforms_offset; in vc4_get_bcl()
820 exec->uniforms_p = exec->exec_bo->dma_addr + uniforms_offset; in vc4_get_bcl()
821 exec->uniforms_size = args->uniforms_size; in vc4_get_bcl()
824 exec->exec_bo->vaddr + bin_offset, in vc4_get_bcl()
826 exec); in vc4_get_bcl()
830 ret = vc4_validate_shader_recs(dev, exec); in vc4_get_bcl()
834 if (exec->found_tile_binning_mode_config_packet) { in vc4_get_bcl()
835 ret = vc4_v3d_bin_bo_get(vc4, &exec->bin_bo_used); in vc4_get_bcl()
846 vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec) in vc4_complete_exec() argument
855 if (exec->fence) { in vc4_complete_exec()
856 dma_fence_signal(exec->fence); in vc4_complete_exec()
857 dma_fence_put(exec->fence); in vc4_complete_exec()
860 if (exec->bo) { in vc4_complete_exec()
861 for (i = 0; i < exec->bo_count; i++) { in vc4_complete_exec()
862 struct vc4_bo *bo = to_vc4_bo(exec->bo[i]); in vc4_complete_exec()
865 drm_gem_object_put(exec->bo[i]); in vc4_complete_exec()
867 kvfree(exec->bo); in vc4_complete_exec()
870 while (!list_empty(&exec->unref_list)) { in vc4_complete_exec()
871 struct vc4_bo *bo = list_first_entry(&exec->unref_list, in vc4_complete_exec()
879 vc4->bin_alloc_used &= ~exec->bin_slots; in vc4_complete_exec()
883 if (exec->bin_bo_used) in vc4_complete_exec()
887 vc4_perfmon_put(exec->perfmon); in vc4_complete_exec()
891 kfree(exec); in vc4_complete_exec()
904 struct vc4_exec_info *exec = in vc4_job_handle_completed() local
907 list_del(&exec->head); in vc4_job_handle_completed()
910 vc4_complete_exec(&vc4->base, exec); in vc4_job_handle_completed()
918 * jobs that had completed and unrefs their BOs and frees their exec
1015 struct vc4_exec_info *exec; in vc4_submit_cl_ioctl() local
1045 exec = kcalloc(1, sizeof(*exec), GFP_KERNEL); in vc4_submit_cl_ioctl()
1046 if (!exec) in vc4_submit_cl_ioctl()
1049 exec->dev = vc4; in vc4_submit_cl_ioctl()
1053 kfree(exec); in vc4_submit_cl_ioctl()
1057 exec->args = args; in vc4_submit_cl_ioctl()
1058 INIT_LIST_HEAD(&exec->unref_list); in vc4_submit_cl_ioctl()
1060 ret = vc4_cl_lookup_bos(dev, file_priv, exec); in vc4_submit_cl_ioctl()
1065 exec->perfmon = vc4_perfmon_find(vc4file, in vc4_submit_cl_ioctl()
1067 if (!exec->perfmon) { in vc4_submit_cl_ioctl()
1096 if (exec->args->bin_cl_size != 0) { in vc4_submit_cl_ioctl()
1097 ret = vc4_get_bcl(dev, exec); in vc4_submit_cl_ioctl()
1101 exec->ct0ca = 0; in vc4_submit_cl_ioctl()
1102 exec->ct0ea = 0; in vc4_submit_cl_ioctl()
1105 ret = vc4_get_rcl(dev, exec); in vc4_submit_cl_ioctl()
1109 ret = vc4_lock_bo_reservations(exec, &exec_ctx); in vc4_submit_cl_ioctl()
1130 exec->args = NULL; in vc4_submit_cl_ioctl()
1132 ret = vc4_queue_submit(dev, exec, &exec_ctx, out_sync); in vc4_submit_cl_ioctl()
1134 /* The syncobj isn't part of the exec data and we need to free our in vc4_submit_cl_ioctl()
1151 vc4_complete_exec(&vc4->base, exec); in vc4_submit_cl_ioctl()
1194 /* Waiting for exec to finish would need to be done before in vc4_gem_destroy()