Lines Matching full:job
28 "%s: job submission failed: " fmt "\n", \
332 static int submit_get_syncpt(struct tegra_drm_context *context, struct host1x_job *job, in submit_get_syncpt() argument
342 /* Syncpt ref will be dropped on job release */ in submit_get_syncpt()
349 job->syncpt = host1x_syncpt_get(sp); in submit_get_syncpt()
350 job->syncpt_incrs = args->syncpt.increments; in submit_get_syncpt()
355 static int submit_job_add_gather(struct host1x_job *job, struct tegra_drm_context *context, in submit_job_add_gather() argument
375 SUBMIT_ERR(context, "too many total words in job"); in submit_job_add_gather()
386 SUBMIT_ERR(context, "job was rejected by firewall"); in submit_job_add_gather()
390 host1x_job_add_gather(job, &bo->base, cmd->words, *offset * 4); in submit_job_add_gather()
404 struct host1x_job *job; in submit_create_job() local
417 job = host1x_job_alloc(context->channel, args->num_cmds, 0, true); in submit_create_job()
418 if (!job) { in submit_create_job()
419 SUBMIT_ERR(context, "failed to allocate memory for job"); in submit_create_job()
420 job = ERR_PTR(-ENOMEM); in submit_create_job()
424 err = submit_get_syncpt(context, job, syncpoints, args); in submit_create_job()
428 job->client = &context->client->base; in submit_create_job()
429 job->class = context->client->base.class; in submit_create_job()
430 job->serialize = true; in submit_create_job()
442 err = submit_job_add_gather(job, context, &cmd->gather_uptr, bo, in submit_create_job()
453 host1x_job_add_wait(job, cmd->wait_syncpt.id, cmd->wait_syncpt.value, in submit_create_job()
463 SUBMIT_ERR(context, "syncpoint ID in CMD_WAIT_SYNCPT_RELATIVE is not used by the job"); in submit_create_job()
468 host1x_job_add_wait(job, cmd->wait_syncpt.id, cmd->wait_syncpt.value, in submit_create_job()
478 SUBMIT_ERR(context, "job must have at least one gather"); in submit_create_job()
486 host1x_job_put(job); in submit_create_job()
487 job = ERR_PTR(err); in submit_create_job()
492 return job; in submit_create_job()
495 static void release_job(struct host1x_job *job) in release_job() argument
497 struct tegra_drm_client *client = container_of(job->client, struct tegra_drm_client, base); in release_job()
498 struct tegra_drm_submit_data *job_data = job->user_data; in release_job()
501 if (job->memory_context) in release_job()
502 host1x_memory_context_put(job->memory_context); in release_job()
522 struct host1x_job *job; in tegra_drm_ioctl_channel_submit() local
570 SUBMIT_ERR(context, "failed to allocate memory for job data"); in tegra_drm_ioctl_channel_submit()
581 job = submit_create_job(context, bo, args, job_data, &fpriv->syncpoints); in tegra_drm_ioctl_channel_submit()
582 if (IS_ERR(job)) { in tegra_drm_ioctl_channel_submit()
583 err = PTR_ERR(job); in tegra_drm_ioctl_channel_submit()
588 err = host1x_job_pin(job, context->client->base.dev); in tegra_drm_ioctl_channel_submit()
590 SUBMIT_ERR(context, "failed to pin job: %d", err); in tegra_drm_ioctl_channel_submit()
596 context->client, &job->engine_streamid_offset); in tegra_drm_ioctl_channel_submit()
613 job->memory_context = context->memory_context; in tegra_drm_ioctl_channel_submit()
614 host1x_memory_context_get(job->memory_context); in tegra_drm_ioctl_channel_submit()
621 * Job submission will need to temporarily change stream ID, in tegra_drm_ioctl_channel_submit()
626 job->engine_fallback_streamid = spec->ids[0] & 0xffff; in tegra_drm_ioctl_channel_submit()
628 job->engine_fallback_streamid = 0x7f; in tegra_drm_ioctl_channel_submit()
630 job->engine_fallback_streamid = 0x7f; in tegra_drm_ioctl_channel_submit()
641 job->user_data = job_data; in tegra_drm_ioctl_channel_submit()
642 job->release = release_job; in tegra_drm_ioctl_channel_submit()
643 job->timeout = 10000; in tegra_drm_ioctl_channel_submit()
646 * job_data is now part of job reference counting, so don't release in tegra_drm_ioctl_channel_submit()
651 /* Submit job to hardware. */ in tegra_drm_ioctl_channel_submit()
652 err = host1x_job_submit(job); in tegra_drm_ioctl_channel_submit()
654 SUBMIT_ERR(context, "host1x job submission failed: %d", err); in tegra_drm_ioctl_channel_submit()
659 args->syncpt.value = job->syncpt_end; in tegra_drm_ioctl_channel_submit()
662 struct dma_fence *fence = host1x_fence_create(job->syncpt, job->syncpt_end); in tegra_drm_ioctl_channel_submit()
674 if (job->memory_context) in tegra_drm_ioctl_channel_submit()
675 host1x_memory_context_put(job->memory_context); in tegra_drm_ioctl_channel_submit()
677 host1x_job_unpin(job); in tegra_drm_ioctl_channel_submit()
679 host1x_job_put(job); in tegra_drm_ioctl_channel_submit()