Lines Matching full:job
17 static void rga_job_free(struct rga_job *job) in rga_job_free() argument
19 free_page((unsigned long)job); in rga_job_free()
24 struct rga_job *job; in rga_job_kref_release() local
26 job = container_of(ref, struct rga_job, refcount); in rga_job_kref_release()
28 rga_job_free(job); in rga_job_kref_release()
31 static int rga_job_put(struct rga_job *job) in rga_job_put() argument
33 return kref_put(&job->refcount, rga_job_kref_release); in rga_job_put()
36 static void rga_job_get(struct rga_job *job) in rga_job_get() argument
38 kref_get(&job->refcount); in rga_job_get()
41 static int rga_job_cleanup(struct rga_job *job) in rga_job_cleanup() argument
44 pr_err("(pid:%d) job clean use time = %lld\n", job->pid, in rga_job_cleanup()
45 ktime_us_delta(ktime_get(), job->timestamp)); in rga_job_cleanup()
47 rga_job_put(job); in rga_job_cleanup()
52 static int rga_job_judgment_support_core(struct rga_job *job) in rga_job_judgment_support_core() argument
59 req = &job->rga_command_base; in rga_job_judgment_support_core()
76 job->flags |= RGA_JOB_UNSUPPORT_RGA_MMU; in rga_job_judgment_support_core()
89 job->flags |= RGA_JOB_UNSUPPORT_RGA_MMU; in rga_job_judgment_support_core()
102 job->flags |= RGA_JOB_UNSUPPORT_RGA_MMU; in rga_job_judgment_support_core()
115 struct rga_job *job = NULL; in rga_job_alloc() local
117 job = (struct rga_job *)get_zeroed_page(GFP_KERNEL | GFP_DMA32); in rga_job_alloc()
118 if (!job) in rga_job_alloc()
121 INIT_LIST_HEAD(&job->head); in rga_job_alloc()
122 kref_init(&job->refcount); in rga_job_alloc()
124 job->timestamp = ktime_get(); in rga_job_alloc()
125 job->pid = current->pid; in rga_job_alloc()
127 job->rga_command_base = *rga_command_base; in rga_job_alloc()
131 job->priority = RGA_SCHED_PRIORITY_MAX; in rga_job_alloc()
133 job->priority = rga_command_base->priority; in rga_job_alloc()
136 if (job->rga_command_base.handle_flag & 1) { in rga_job_alloc()
137 job->flags |= RGA_JOB_USE_HANDLE; in rga_job_alloc()
139 rga_job_judgment_support_core(job); in rga_job_alloc()
142 return job; in rga_job_alloc()
145 static void rga_job_dump_info(struct rga_job *job) in rga_job_dump_info() argument
147 pr_info("job: reqeust_id = %d, priority = %d, core = %d\n", in rga_job_dump_info()
148 job->request_id, job->priority, job->core); in rga_job_dump_info()
172 static int rga_job_run(struct rga_job *job, struct rga_scheduler_t *scheduler) in rga_job_run() argument
183 ret = scheduler->ops->set_reg(job, scheduler); in rga_job_run()
190 set_bit(RGA_JOB_STATE_RUNNING, &job->state); in rga_job_run()
194 rga_job_dump_info(job); in rga_job_run()
202 struct rga_job *job = NULL; in rga_job_next() local
214 job = list_first_entry(&scheduler->todo_list, struct rga_job, head); in rga_job_next()
216 list_del_init(&job->head); in rga_job_next()
220 scheduler->running_job = job; in rga_job_next()
221 set_bit(RGA_JOB_STATE_PREPARE, &job->state); in rga_job_next()
222 rga_job_get(job); in rga_job_next()
226 ret = rga_job_run(job, scheduler); in rga_job_next()
234 rga_job_put(job); in rga_job_next()
238 job->ret = ret; in rga_job_next()
239 rga_request_release_signal(scheduler, job); in rga_job_next()
244 rga_job_put(job); in rga_job_next()
249 struct rga_job *job; in rga_job_done() local
255 job = scheduler->running_job; in rga_job_done()
256 if (job == NULL) { in rga_job_done()
257 pr_err("core[0x%x] running job has been cleanup.\n", scheduler->core); in rga_job_done()
264 scheduler->timer.busy_time += ktime_us_delta(now, job->hw_recoder_time); in rga_job_done()
265 set_bit(RGA_JOB_STATE_DONE, &job->state); in rga_job_done()
270 scheduler->ops->read_back_reg(job, scheduler); in rga_job_done()
273 rga_dump_job_image(job); in rga_job_done()
276 pr_info("hw use time = %lld\n", ktime_us_delta(now, job->hw_running_time)); in rga_job_done()
277 pr_info("(pid:%d) job done use time = %lld\n", job->pid, in rga_job_done()
278 ktime_us_delta(now, job->timestamp)); in rga_job_done()
281 rga_mm_unmap_job_info(job); in rga_job_done()
283 return job; in rga_job_done()
289 struct rga_job *job = NULL; in rga_job_scheduler_timeout_clean() local
298 job = scheduler->running_job; in rga_job_scheduler_timeout_clean()
299 if (ktime_ms_delta(ktime_get(), job->hw_running_time) >= RGA_JOB_TIMEOUT_DELAY) { in rga_job_scheduler_timeout_clean()
306 rga_mm_unmap_job_info(job); in rga_job_scheduler_timeout_clean()
308 job->ret = -EBUSY; in rga_job_scheduler_timeout_clean()
309 rga_request_release_signal(scheduler, job); in rga_job_scheduler_timeout_clean()
317 static void rga_job_insert_todo_list(struct rga_job *job) in rga_job_insert_todo_list() argument
322 struct rga_scheduler_t *scheduler = job->scheduler; in rga_job_insert_todo_list()
328 || (job->priority == RGA_SCHED_PRIORITY_DEFAULT)) { in rga_job_insert_todo_list()
329 list_add_tail(&job->head, &scheduler->todo_list); in rga_job_insert_todo_list()
332 if (job->priority > job_pos->priority && in rga_job_insert_todo_list()
334 list_add(&job->head, &job_pos->head); in rga_job_insert_todo_list()
347 list_add_tail(&job->head, &scheduler->todo_list); in rga_job_insert_todo_list()
351 set_bit(RGA_JOB_STATE_PENDING, &job->state); in rga_job_insert_todo_list()
356 static struct rga_scheduler_t *rga_job_schedule(struct rga_job *job) in rga_job_schedule() argument
367 job->core = rga_job_assign(job); in rga_job_schedule()
368 if (job->core <= 0) { in rga_job_schedule()
369 pr_err("job assign failed"); in rga_job_schedule()
370 job->ret = -EINVAL; in rga_job_schedule()
374 job->core = rga_drvdata->scheduler[0]->core; in rga_job_schedule()
375 job->scheduler = rga_drvdata->scheduler[0]; in rga_job_schedule()
378 scheduler = job->scheduler; in rga_job_schedule()
381 job->ret = -EFAULT; in rga_job_schedule()
391 struct rga_job *job = NULL; in rga_job_commit() local
394 job = rga_job_alloc(rga_command_base); in rga_job_commit()
395 if (!job) { in rga_job_commit()
396 pr_err("failed to alloc rga job!\n"); in rga_job_commit()
400 job->use_batch_mode = request->use_batch_mode; in rga_job_commit()
401 job->request_id = request->id; in rga_job_commit()
402 job->session = request->session; in rga_job_commit()
403 job->mm = request->current_mm; in rga_job_commit()
405 scheduler = rga_job_schedule(job); in rga_job_commit()
414 job->ret = -EFAULT; in rga_job_commit()
418 ret = rga_mm_map_job_info(job); in rga_job_commit()
420 pr_err("%s: failed to map job info\n", __func__); in rga_job_commit()
421 job->ret = ret; in rga_job_commit()
425 ret = scheduler->ops->init_reg(job); in rga_job_commit()
428 job->ret = ret; in rga_job_commit()
432 rga_job_insert_todo_list(job); in rga_job_commit()
438 return job; in rga_job_commit()
441 rga_mm_unmap_job_info(job); in rga_job_commit()
447 ret = job->ret; in rga_job_commit()
448 rga_request_release_signal(scheduler, job); in rga_job_commit()
622 struct rga_job *job, *job_q; in rga_request_scheduler_job_abort() local
629 list_for_each_entry_safe(job, job_q, &scheduler->todo_list, head) { in rga_request_scheduler_job_abort()
630 if (request->id == job->request_id) { in rga_request_scheduler_job_abort()
631 list_move(&job->head, &list_to_free); in rga_request_scheduler_job_abort()
638 job = NULL; in rga_request_scheduler_job_abort()
641 job = scheduler->running_job; in rga_request_scheduler_job_abort()
645 list_add_tail(&job->head, &list_to_free); in rga_request_scheduler_job_abort()
647 if (job->hw_running_time != 0) { in rga_request_scheduler_job_abort()
649 ktime_us_delta(ktime_get(), job->hw_recoder_time); in rga_request_scheduler_job_abort()
661 if (job && scheduler_status == RGA_SCHEDULER_WORKING) in rga_request_scheduler_job_abort()
666 list_for_each_entry_safe(job, job_q, &list_to_free, head) { in rga_request_scheduler_job_abort()
667 rga_mm_unmap_job_info(job); in rga_request_scheduler_job_abort()
669 job->ret = -EBUSY; in rga_request_scheduler_job_abort()
670 rga_job_cleanup(job); in rga_request_scheduler_job_abort()
744 struct rga_job *job = NULL; in rga_request_timeout_query_state() local
752 job = scheduler->running_job; in rga_request_timeout_query_state()
753 if (request->id == job->request_id) { in rga_request_timeout_query_state()
754 if (test_bit(RGA_JOB_STATE_DONE, &job->state) && in rga_request_timeout_query_state()
755 test_bit(RGA_JOB_STATE_FINISH, &job->state)) { in rga_request_timeout_query_state()
758 } else if (!test_bit(RGA_JOB_STATE_DONE, &job->state) && in rga_request_timeout_query_state()
759 test_bit(RGA_JOB_STATE_FINISH, &job->state)) { in rga_request_timeout_query_state()
764 } else if (!test_bit(RGA_JOB_STATE_DONE, &job->state) && in rga_request_timeout_query_state()
765 !test_bit(RGA_JOB_STATE_FINISH, &job->state)) { in rga_request_timeout_query_state()
811 struct rga_job *job; in rga_request_commit() local
814 job = rga_job_commit(&(request->task_list[i]), request); in rga_request_commit()
815 if (IS_ERR(job)) { in rga_request_commit()
817 rga_request_release_abort(request, PTR_ERR(job)); in rga_request_commit()
819 return PTR_ERR(job); in rga_request_commit()
849 int rga_request_release_signal(struct rga_scheduler_t *scheduler, struct rga_job *job) in rga_request_release_signal() argument
864 request = rga_request_lookup(request_manager, job->request_id); in rga_request_release_signal()
866 pr_err("can not find internal request from id[%d]", job->request_id); in rga_request_release_signal()
876 if (job->ret < 0) { in rga_request_release_signal()
878 request->ret = job->ret; in rga_request_release_signal()
888 rga_job_cleanup(job); in rga_request_release_signal()
1142 struct rga_job *job = NULL; in rga_request_mpi_submit() local
1172 job = rga_job_commit(req, request); in rga_request_mpi_submit()
1173 if (IS_ERR_OR_NULL(job)) { in rga_request_mpi_submit()
1174 pr_err("failed to commit job!\n"); in rga_request_mpi_submit()
1175 return job ? PTR_ERR(job) : -EFAULT; in rga_request_mpi_submit()