Lines Matching +full:powervr +full:- +full:gpu

1 // SPDX-License-Identifier: GPL-2.0-only OR MIT
27 xa_erase(&job->pvr_dev->job_ids, job->id); in pvr_job_release()
29 pvr_hwrt_data_put(job->hwrt); in pvr_job_release()
30 pvr_context_put(job->ctx); in pvr_job_release()
32 WARN_ON(job->paired_job); in pvr_job_release()
37 kfree(job->cmd); in pvr_job_release()
42 * pvr_job_put() - Release reference on job
49 kref_put(&job->ref_count, pvr_job_release); in pvr_job_put()
53 * pvr_job_process_stream() - Build job FW structure from stream
64 * * -%ENOMEM on out of memory, or
65 * * -%EINVAL on malformed stream.
73 job->cmd = kzalloc(cmd_defs->dest_size, GFP_KERNEL); in pvr_job_process_stream()
74 if (!job->cmd) in pvr_job_process_stream()
75 return -ENOMEM; in pvr_job_process_stream()
77 job->cmd_len = cmd_defs->dest_size; in pvr_job_process_stream()
79 err = pvr_stream_process(pvr_dev, cmd_defs, stream, stream_size, job->cmd); in pvr_job_process_stream()
81 kfree(job->cmd); in pvr_job_process_stream()
148 if (args->flags & ~DRM_PVR_SUBMIT_JOB_GEOM_CMD_FLAGS_MASK) in pvr_geom_job_fw_cmd_init()
149 return -EINVAL; in pvr_geom_job_fw_cmd_init()
151 if (job->ctx->type != DRM_PVR_CTX_TYPE_RENDER) in pvr_geom_job_fw_cmd_init()
152 return -EINVAL; in pvr_geom_job_fw_cmd_init()
154 if (!job->hwrt) in pvr_geom_job_fw_cmd_init()
155 return -EINVAL; in pvr_geom_job_fw_cmd_init()
157 job->fw_ccb_cmd_type = ROGUE_FWIF_CCB_CMD_TYPE_GEOM; in pvr_geom_job_fw_cmd_init()
158 err = pvr_fw_cmd_init(job->pvr_dev, job, &pvr_cmd_geom_stream, in pvr_geom_job_fw_cmd_init()
159 args->cmd_stream, args->cmd_stream_len); in pvr_geom_job_fw_cmd_init()
163 cmd = job->cmd; in pvr_geom_job_fw_cmd_init()
164 cmd->cmd_shared.cmn.frame_num = 0; in pvr_geom_job_fw_cmd_init()
165 cmd->flags = convert_geom_flags(args->flags); in pvr_geom_job_fw_cmd_init()
166 pvr_fw_object_get_fw_addr(job->hwrt->fw_obj, &cmd->cmd_shared.hwrt_data_fw_addr); in pvr_geom_job_fw_cmd_init()
177 if (args->flags & ~DRM_PVR_SUBMIT_JOB_FRAG_CMD_FLAGS_MASK) in pvr_frag_job_fw_cmd_init()
178 return -EINVAL; in pvr_frag_job_fw_cmd_init()
180 if (job->ctx->type != DRM_PVR_CTX_TYPE_RENDER) in pvr_frag_job_fw_cmd_init()
181 return -EINVAL; in pvr_frag_job_fw_cmd_init()
183 if (!job->hwrt) in pvr_frag_job_fw_cmd_init()
184 return -EINVAL; in pvr_frag_job_fw_cmd_init()
186 job->fw_ccb_cmd_type = (args->flags & DRM_PVR_SUBMIT_JOB_FRAG_CMD_PARTIAL_RENDER) ? in pvr_frag_job_fw_cmd_init()
189 err = pvr_fw_cmd_init(job->pvr_dev, job, &pvr_cmd_frag_stream, in pvr_frag_job_fw_cmd_init()
190 args->cmd_stream, args->cmd_stream_len); in pvr_frag_job_fw_cmd_init()
194 cmd = job->cmd; in pvr_frag_job_fw_cmd_init()
195 cmd->cmd_shared.cmn.frame_num = 0; in pvr_frag_job_fw_cmd_init()
196 cmd->flags = convert_frag_flags(args->flags); in pvr_frag_job_fw_cmd_init()
197 pvr_fw_object_get_fw_addr(job->hwrt->fw_obj, &cmd->cmd_shared.hwrt_data_fw_addr); in pvr_frag_job_fw_cmd_init()
221 if (args->flags & ~DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_FLAGS_MASK) in pvr_compute_job_fw_cmd_init()
222 return -EINVAL; in pvr_compute_job_fw_cmd_init()
224 if (job->ctx->type != DRM_PVR_CTX_TYPE_COMPUTE) in pvr_compute_job_fw_cmd_init()
225 return -EINVAL; in pvr_compute_job_fw_cmd_init()
227 job->fw_ccb_cmd_type = ROGUE_FWIF_CCB_CMD_TYPE_CDM; in pvr_compute_job_fw_cmd_init()
228 err = pvr_fw_cmd_init(job->pvr_dev, job, &pvr_cmd_compute_stream, in pvr_compute_job_fw_cmd_init()
229 args->cmd_stream, args->cmd_stream_len); in pvr_compute_job_fw_cmd_init()
233 cmd = job->cmd; in pvr_compute_job_fw_cmd_init()
234 cmd->common.frame_num = 0; in pvr_compute_job_fw_cmd_init()
235 cmd->flags = convert_compute_flags(args->flags); in pvr_compute_job_fw_cmd_init()
257 if (args->flags & ~DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_FLAGS_MASK) in pvr_transfer_job_fw_cmd_init()
258 return -EINVAL; in pvr_transfer_job_fw_cmd_init()
260 if (job->ctx->type != DRM_PVR_CTX_TYPE_TRANSFER_FRAG) in pvr_transfer_job_fw_cmd_init()
261 return -EINVAL; in pvr_transfer_job_fw_cmd_init()
263 job->fw_ccb_cmd_type = ROGUE_FWIF_CCB_CMD_TYPE_TQ_3D; in pvr_transfer_job_fw_cmd_init()
264 err = pvr_fw_cmd_init(job->pvr_dev, job, &pvr_cmd_transfer_stream, in pvr_transfer_job_fw_cmd_init()
265 args->cmd_stream, args->cmd_stream_len); in pvr_transfer_job_fw_cmd_init()
269 cmd = job->cmd; in pvr_transfer_job_fw_cmd_init()
270 cmd->common.frame_num = 0; in pvr_transfer_job_fw_cmd_init()
271 cmd->flags = convert_transfer_flags(args->flags); in pvr_transfer_job_fw_cmd_init()
279 switch (args->type) { in pvr_job_fw_cmd_init()
293 return -EINVAL; in pvr_job_fw_cmd_init()
298 * struct pvr_job_data - Helper container for pairing jobs with the
313 * prepare_job_syncs() - Prepare all sync objects for a single job.
314 * @pvr_file: PowerVR file.
332 job_data->sync_op_count, in prepare_job_syncs()
333 job_data->sync_ops); in prepare_job_syncs()
338 err = pvr_sync_add_deps_to_job(pvr_file, &job_data->job->base, in prepare_job_syncs()
339 job_data->sync_op_count, in prepare_job_syncs()
340 job_data->sync_ops, signal_array); in prepare_job_syncs()
344 if (job_data->job->hwrt) { in prepare_job_syncs()
349 gem_from_pvr_gem(job_data->job->hwrt->fw_obj->gem); in prepare_job_syncs()
351 dma_resv_usage_rw(job_data->job->type == in prepare_job_syncs()
354 dma_resv_lock(obj->resv, NULL); in prepare_job_syncs()
355 err = drm_sched_job_add_resv_dependencies(&job_data->job->base, in prepare_job_syncs()
356 obj->resv, usage); in prepare_job_syncs()
357 dma_resv_unlock(obj->resv); in prepare_job_syncs()
363 done_fence = pvr_queue_job_arm(job_data->job); in prepare_job_syncs()
366 job_data->sync_op_count, in prepare_job_syncs()
367 job_data->sync_ops, in prepare_job_syncs()
373 * prepare_job_syncs_for_each() - Prepare all sync objects for an array of jobs.
374 * @pvr_file: PowerVR file.
410 if (!args->cmd_stream || !args->cmd_stream_len) in create_job()
411 return ERR_PTR(-EINVAL); in create_job()
413 if (args->type != DRM_PVR_JOB_TYPE_GEOMETRY && in create_job()
414 args->type != DRM_PVR_JOB_TYPE_FRAGMENT && in create_job()
415 (args->hwrt.set_handle || args->hwrt.data_index)) in create_job()
416 return ERR_PTR(-EINVAL); in create_job()
420 return ERR_PTR(-ENOMEM); in create_job()
422 kref_init(&job->ref_count); in create_job()
423 job->type = args->type; in create_job()
424 job->pvr_dev = pvr_dev; in create_job()
426 err = xa_alloc(&pvr_dev->job_ids, &job->id, job, xa_limit_32b, GFP_KERNEL); in create_job()
430 job->ctx = pvr_context_lookup(pvr_file, args->context_handle); in create_job()
431 if (!job->ctx) { in create_job()
432 err = -EINVAL; in create_job()
436 if (args->hwrt.set_handle) { in create_job()
437 job->hwrt = pvr_hwrt_data_lookup(pvr_file, args->hwrt.set_handle, in create_job()
438 args->hwrt.data_index); in create_job()
439 if (!job->hwrt) { in create_job()
440 err = -EINVAL; in create_job()
461 * pvr_job_data_fini() - Cleanup all allocs used to set up job submission.
475 * pvr_job_data_init() - Init an array of created jobs, associating them with
477 * @pvr_dev: Target PowerVR device.
478 * @pvr_file: Pointer to PowerVR file structure.
533 return drm_exec_prepare_obj(exec, gem_from_pvr_gem(fw_obj->gem), 1); in prepare_fw_obj_resv()
547 gem_from_pvr_gem(job->ctx->fw_obj->gem)); in jobs_lock_all_objs()
552 if (job->hwrt) { in jobs_lock_all_objs()
554 job->hwrt->fw_obj); in jobs_lock_all_objs()
581 if (job->hwrt) { in update_job_resvs()
582 enum dma_resv_usage usage = job->type == DRM_PVR_JOB_TYPE_GEOMETRY ? in update_job_resvs()
584 struct drm_gem_object *obj = gem_from_pvr_gem(job->hwrt->fw_obj->gem); in update_job_resvs()
586 dma_resv_add_fence(obj->resv, &job->base.s_fence->finished, usage); in update_job_resvs()
606 if (a->type != DRM_PVR_JOB_TYPE_GEOMETRY || in can_combine_jobs()
607 b->type != DRM_PVR_JOB_TYPE_FRAGMENT || in can_combine_jobs()
608 a->ctx != b->ctx || in can_combine_jobs()
609 a->hwrt != b->hwrt) in can_combine_jobs()
612 xa_for_each(&frag_job->base.dependencies, index, fence) { in can_combine_jobs()
613 /* We combine when we see an explicit geom -> frag dep. */ in can_combine_jobs()
614 if (&geom_job->base.s_fence->scheduled == fence) in can_combine_jobs()
627 * last to-be-queued job targeting the same queue. in get_last_queued_job_scheduled_fence()
629 for (u32 i = cur_job_pos; i > 0; i--) { in get_last_queued_job_scheduled_fence()
630 struct pvr_job *job = job_data[i - 1].job; in get_last_queued_job_scheduled_fence()
632 if (job->ctx == queue->ctx && job->type == queue->type) in get_last_queued_job_scheduled_fence()
633 return dma_fence_get(&job->base.s_fence->scheduled); in get_last_queued_job_scheduled_fence()
639 return dma_fence_get(queue->last_queued_job_scheduled_fence); in get_last_queued_job_scheduled_fence()
645 for (u32 i = 0; i < *job_count - 1; i++) { in pvr_jobs_link_geom_frag()
658 frag_queue = pvr_context_get_queue_for_job(frag_job->ctx, in pvr_jobs_link_geom_frag()
659 frag_job->type); in pvr_jobs_link_geom_frag()
663 int err = drm_sched_job_add_dependency(&geom_job->base, in pvr_jobs_link_geom_frag()
674 pvr_kccb_fence_put(frag_job->kccb_fence); in pvr_jobs_link_geom_frag()
675 frag_job->kccb_fence = NULL; in pvr_jobs_link_geom_frag()
677 geom_job->paired_job = frag_job; in pvr_jobs_link_geom_frag()
678 frag_job->paired_job = geom_job; in pvr_jobs_link_geom_frag()
681 * job is being prepared by the GPU scheduler. Have the fragment in pvr_jobs_link_geom_frag()
695 * pvr_submit_jobs() - Submit jobs to the GPU
696 * @pvr_dev: Target PowerVR device.
697 * @pvr_file: Pointer to PowerVR file structure.
700 * This initial implementation is entirely synchronous; on return the GPU will
705 * * -%EFAULT if arguments can not be copied from user space, or
706 * * -%EINVAL on invalid arguments, or
720 if (!args->jobs.count) in pvr_submit_jobs()
721 return -EINVAL; in pvr_submit_jobs()
723 err = PVR_UOBJ_GET_ARRAY(job_args, &args->jobs); in pvr_submit_jobs()
727 job_data = kvmalloc_array(args->jobs.count, sizeof(*job_data), in pvr_submit_jobs()
730 err = -ENOMEM; in pvr_submit_jobs()
734 err = pvr_job_data_init(pvr_dev, pvr_file, job_args, &args->jobs.count, in pvr_submit_jobs()
739 jobs_alloced = args->jobs.count; in pvr_submit_jobs()
742 * Flush MMU if needed - this has been deferred until now to avoid in pvr_submit_jobs()
753 err = prepare_job_syncs_for_each(pvr_file, job_data, &args->jobs.count, in pvr_submit_jobs()
758 err = prepare_job_resvs_for_each(&exec, job_data, args->jobs.count); in pvr_submit_jobs()
762 err = pvr_jobs_link_geom_frag(job_data, &args->jobs.count); in pvr_submit_jobs()
769 update_job_resvs_for_each(job_data, args->jobs.count); in pvr_submit_jobs()
770 push_jobs(job_data, args->jobs.count); in pvr_submit_jobs()