Lines Matching full:thread
72 struct cmdq_thread *thread; member
82 struct cmdq_thread *thread; member
128 static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_suspend() argument
132 writel(CMDQ_THR_SUSPEND, thread->base + CMDQ_THR_SUSPEND_TASK); in cmdq_thread_suspend()
135 if (!(readl(thread->base + CMDQ_THR_ENABLE_TASK) & CMDQ_THR_ENABLED)) in cmdq_thread_suspend()
138 if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_CURR_STATUS, in cmdq_thread_suspend()
140 dev_err(cmdq->mbox.dev, "suspend GCE thread 0x%x failed\n", in cmdq_thread_suspend()
141 (u32)(thread->base - cmdq->base)); in cmdq_thread_suspend()
148 static void cmdq_thread_resume(struct cmdq_thread *thread) in cmdq_thread_resume() argument
150 writel(CMDQ_THR_RESUME, thread->base + CMDQ_THR_SUSPEND_TASK); in cmdq_thread_resume()
167 static int cmdq_thread_reset(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_reset() argument
171 writel(CMDQ_THR_DO_WARM_RESET, thread->base + CMDQ_THR_WARM_RESET); in cmdq_thread_reset()
172 if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_WARM_RESET, in cmdq_thread_reset()
175 dev_err(cmdq->mbox.dev, "reset GCE thread 0x%x failed\n", in cmdq_thread_reset()
176 (u32)(thread->base - cmdq->base)); in cmdq_thread_reset()
183 static void cmdq_thread_disable(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_disable() argument
185 cmdq_thread_reset(cmdq, thread); in cmdq_thread_disable()
186 writel(CMDQ_THR_DISABLED, thread->base + CMDQ_THR_ENABLE_TASK); in cmdq_thread_disable()
189 /* notify GCE to re-fetch commands by setting GCE thread PC */
190 static void cmdq_thread_invalidate_fetched_data(struct cmdq_thread *thread) in cmdq_thread_invalidate_fetched_data() argument
192 writel(readl(thread->base + CMDQ_THR_CURR_ADDR), in cmdq_thread_invalidate_fetched_data()
193 thread->base + CMDQ_THR_CURR_ADDR); in cmdq_thread_invalidate_fetched_data()
199 struct cmdq_thread *thread = task->thread; in cmdq_task_insert_into_thread() local
201 &thread->task_busy_list, typeof(*task), list_entry); in cmdq_task_insert_into_thread()
212 cmdq_thread_invalidate_fetched_data(thread); in cmdq_task_insert_into_thread()
215 static bool cmdq_thread_is_in_wfe(struct cmdq_thread *thread) in cmdq_thread_is_in_wfe() argument
217 return readl(thread->base + CMDQ_THR_WAIT_TOKEN) & CMDQ_THR_IS_WAITING; in cmdq_thread_is_in_wfe()
226 mbox_chan_received_data(task->thread->chan, &data); in cmdq_task_exec_done()
233 struct cmdq_thread *thread = task->thread; in cmdq_task_handle_error() local
238 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_task_handle_error()
239 next_task = list_first_entry_or_null(&thread->task_busy_list, in cmdq_task_handle_error()
243 thread->base + CMDQ_THR_CURR_ADDR); in cmdq_task_handle_error()
244 cmdq_thread_resume(thread); in cmdq_task_handle_error()
248 struct cmdq_thread *thread) in cmdq_thread_irq_handler() argument
255 irq_flag = readl(thread->base + CMDQ_THR_IRQ_STATUS); in cmdq_thread_irq_handler()
256 writel(~irq_flag, thread->base + CMDQ_THR_IRQ_STATUS); in cmdq_thread_irq_handler()
261 * reset / disable this GCE thread, so we need to check the enable in cmdq_thread_irq_handler()
262 * bit of this GCE thread. in cmdq_thread_irq_handler()
264 if (!(readl(thread->base + CMDQ_THR_ENABLE_TASK) & CMDQ_THR_ENABLED)) in cmdq_thread_irq_handler()
274 gce_addr = readl(thread->base + CMDQ_THR_CURR_ADDR); in cmdq_thread_irq_handler()
277 list_for_each_entry_safe(task, tmp, &thread->task_busy_list, in cmdq_thread_irq_handler()
296 if (list_empty(&thread->task_busy_list)) in cmdq_thread_irq_handler()
297 cmdq_thread_disable(cmdq, thread); in cmdq_thread_irq_handler()
311 struct cmdq_thread *thread = &cmdq->thread[bit]; in cmdq_irq_handler() local
313 spin_lock_irqsave(&thread->chan->lock, flags); in cmdq_irq_handler()
314 cmdq_thread_irq_handler(cmdq, thread); in cmdq_irq_handler()
315 spin_unlock_irqrestore(&thread->chan->lock, flags); in cmdq_irq_handler()
348 struct cmdq_thread *thread; in cmdq_suspend() local
355 thread = &cmdq->thread[i]; in cmdq_suspend()
356 if (!list_empty(&thread->task_busy_list)) { in cmdq_suspend()
391 struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv; in cmdq_mbox_send_data() local
407 task->thread = thread; in cmdq_mbox_send_data()
410 if (list_empty(&thread->task_busy_list)) { in cmdq_mbox_send_data()
412 * The thread reset will clear thread related register to 0, in cmdq_mbox_send_data()
415 * thread and make it running. in cmdq_mbox_send_data()
417 WARN_ON(cmdq_thread_reset(cmdq, thread) < 0); in cmdq_mbox_send_data()
420 writel(gce_addr, thread->base + CMDQ_THR_CURR_ADDR); in cmdq_mbox_send_data()
422 writel(gce_addr, thread->base + CMDQ_THR_END_ADDR); in cmdq_mbox_send_data()
424 writel(thread->priority, thread->base + CMDQ_THR_PRIORITY); in cmdq_mbox_send_data()
425 writel(CMDQ_THR_IRQ_EN, thread->base + CMDQ_THR_IRQ_ENABLE); in cmdq_mbox_send_data()
426 writel(CMDQ_THR_ENABLED, thread->base + CMDQ_THR_ENABLE_TASK); in cmdq_mbox_send_data()
428 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_send_data()
429 gce_addr = readl(thread->base + CMDQ_THR_CURR_ADDR); in cmdq_mbox_send_data()
431 gce_addr = readl(thread->base + CMDQ_THR_END_ADDR); in cmdq_mbox_send_data()
438 thread->base + CMDQ_THR_CURR_ADDR); in cmdq_mbox_send_data()
441 smp_mb(); /* modify jump before enable thread */ in cmdq_mbox_send_data()
444 thread->base + CMDQ_THR_END_ADDR); in cmdq_mbox_send_data()
445 cmdq_thread_resume(thread); in cmdq_mbox_send_data()
447 list_move_tail(&task->list_entry, &thread->task_busy_list); in cmdq_mbox_send_data()
459 struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv; in cmdq_mbox_shutdown() local
466 spin_lock_irqsave(&thread->chan->lock, flags); in cmdq_mbox_shutdown()
467 if (list_empty(&thread->task_busy_list)) in cmdq_mbox_shutdown()
470 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_shutdown()
473 cmdq_thread_irq_handler(cmdq, thread); in cmdq_mbox_shutdown()
474 if (list_empty(&thread->task_busy_list)) in cmdq_mbox_shutdown()
477 list_for_each_entry_safe(task, tmp, &thread->task_busy_list, in cmdq_mbox_shutdown()
483 cmdq_thread_disable(cmdq, thread); in cmdq_mbox_shutdown()
487 * The thread->task_busy_list empty means thread already disable. The in cmdq_mbox_shutdown()
488 * cmdq_mbox_send_data() always reset thread which clear disable and in cmdq_mbox_shutdown()
492 spin_unlock_irqrestore(&thread->chan->lock, flags); in cmdq_mbox_shutdown()
500 struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv; in cmdq_mbox_flush() local
512 spin_lock_irqsave(&thread->chan->lock, flags); in cmdq_mbox_flush()
513 if (list_empty(&thread->task_busy_list)) in cmdq_mbox_flush()
516 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_flush()
517 if (!cmdq_thread_is_in_wfe(thread)) in cmdq_mbox_flush()
520 list_for_each_entry_safe(task, tmp, &thread->task_busy_list, in cmdq_mbox_flush()
524 mbox_chan_received_data(task->thread->chan, &data); in cmdq_mbox_flush()
529 cmdq_thread_resume(thread); in cmdq_mbox_flush()
530 cmdq_thread_disable(cmdq, thread); in cmdq_mbox_flush()
533 spin_unlock_irqrestore(&thread->chan->lock, flags); in cmdq_mbox_flush()
540 cmdq_thread_resume(thread); in cmdq_mbox_flush()
541 spin_unlock_irqrestore(&thread->chan->lock, flags); in cmdq_mbox_flush()
542 if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_ENABLE_TASK, in cmdq_mbox_flush()
544 dev_err(cmdq->mbox.dev, "Fail to wait GCE thread 0x%x done\n", in cmdq_mbox_flush()
545 (u32)(thread->base - cmdq->base)); in cmdq_mbox_flush()
565 struct cmdq_thread *thread; in cmdq_xlate() local
570 thread = (struct cmdq_thread *)mbox->chans[ind].con_priv; in cmdq_xlate()
571 thread->priority = sp->args[1]; in cmdq_xlate()
572 thread->chan = &mbox->chans[ind]; in cmdq_xlate()
680 cmdq->thread = devm_kcalloc(dev, cmdq->pdata->thread_nr, in cmdq_probe()
681 sizeof(*cmdq->thread), GFP_KERNEL); in cmdq_probe()
682 if (!cmdq->thread) in cmdq_probe()
686 cmdq->thread[i].base = cmdq->base + CMDQ_THR_BASE + in cmdq_probe()
688 INIT_LIST_HEAD(&cmdq->thread[i].task_busy_list); in cmdq_probe()
689 cmdq->mbox.chans[i].con_priv = (void *)&cmdq->thread[i]; in cmdq_probe()