Lines Matching full:thread
65 struct cmdq_thread *thread; member
74 struct cmdq_thread *thread; member
79 static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_suspend() argument
83 writel(CMDQ_THR_SUSPEND, thread->base + CMDQ_THR_SUSPEND_TASK); in cmdq_thread_suspend()
86 if (!(readl(thread->base + CMDQ_THR_ENABLE_TASK) & CMDQ_THR_ENABLED)) in cmdq_thread_suspend()
89 if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_CURR_STATUS, in cmdq_thread_suspend()
91 dev_err(cmdq->mbox.dev, "suspend GCE thread 0x%x failed\n", in cmdq_thread_suspend()
92 (u32)(thread->base - cmdq->base)); in cmdq_thread_suspend()
99 static void cmdq_thread_resume(struct cmdq_thread *thread) in cmdq_thread_resume() argument
101 writel(CMDQ_THR_RESUME, thread->base + CMDQ_THR_SUSPEND_TASK); in cmdq_thread_resume()
111 static int cmdq_thread_reset(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_reset() argument
115 writel(CMDQ_THR_DO_WARM_RESET, thread->base + CMDQ_THR_WARM_RESET); in cmdq_thread_reset()
116 if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_WARM_RESET, in cmdq_thread_reset()
119 dev_err(cmdq->mbox.dev, "reset GCE thread 0x%x failed\n", in cmdq_thread_reset()
120 (u32)(thread->base - cmdq->base)); in cmdq_thread_reset()
127 static void cmdq_thread_disable(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_disable() argument
129 cmdq_thread_reset(cmdq, thread); in cmdq_thread_disable()
130 writel(CMDQ_THR_DISABLED, thread->base + CMDQ_THR_ENABLE_TASK); in cmdq_thread_disable()
133 /* notify GCE to re-fetch commands by setting GCE thread PC */
134 static void cmdq_thread_invalidate_fetched_data(struct cmdq_thread *thread) in cmdq_thread_invalidate_fetched_data() argument
136 writel(readl(thread->base + CMDQ_THR_CURR_ADDR), in cmdq_thread_invalidate_fetched_data()
137 thread->base + CMDQ_THR_CURR_ADDR); in cmdq_thread_invalidate_fetched_data()
143 struct cmdq_thread *thread = task->thread; in cmdq_task_insert_into_thread() local
145 &thread->task_busy_list, typeof(*task), list_entry); in cmdq_task_insert_into_thread()
156 cmdq_thread_invalidate_fetched_data(thread); in cmdq_task_insert_into_thread()
168 /* we assume tasks in the same display GCE thread are waiting the same event. */
185 static bool cmdq_thread_is_in_wfe(struct cmdq_thread *thread) in cmdq_thread_is_in_wfe() argument
187 return readl(thread->base + CMDQ_THR_WAIT_TOKEN) & CMDQ_THR_IS_WAITING; in cmdq_thread_is_in_wfe()
190 static void cmdq_thread_wait_end(struct cmdq_thread *thread, in cmdq_thread_wait_end() argument
193 struct device *dev = thread->chan->mbox->dev; in cmdq_thread_wait_end()
196 if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_CURR_ADDR, in cmdq_thread_wait_end()
198 dev_err(dev, "GCE thread cannot run to end.\n"); in cmdq_thread_wait_end()
216 struct cmdq_thread *thread = task->thread; in cmdq_task_handle_error() local
220 WARN_ON(cmdq_thread_suspend(task->cmdq, thread) < 0); in cmdq_task_handle_error()
221 next_task = list_first_entry_or_null(&thread->task_busy_list, in cmdq_task_handle_error()
224 writel(next_task->pa_base, thread->base + CMDQ_THR_CURR_ADDR); in cmdq_task_handle_error()
225 cmdq_thread_resume(thread); in cmdq_task_handle_error()
229 struct cmdq_thread *thread) in cmdq_thread_irq_handler() argument
235 irq_flag = readl(thread->base + CMDQ_THR_IRQ_STATUS); in cmdq_thread_irq_handler()
236 writel(~irq_flag, thread->base + CMDQ_THR_IRQ_STATUS); in cmdq_thread_irq_handler()
241 * reset / disable this GCE thread, so we need to check the enable in cmdq_thread_irq_handler()
242 * bit of this GCE thread. in cmdq_thread_irq_handler()
244 if (!(readl(thread->base + CMDQ_THR_ENABLE_TASK) & CMDQ_THR_ENABLED)) in cmdq_thread_irq_handler()
254 curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR); in cmdq_thread_irq_handler()
256 list_for_each_entry_safe(task, tmp, &thread->task_busy_list, in cmdq_thread_irq_handler()
275 if (list_empty(&thread->task_busy_list)) { in cmdq_thread_irq_handler()
276 cmdq_thread_disable(cmdq, thread); in cmdq_thread_irq_handler()
292 struct cmdq_thread *thread = &cmdq->thread[bit]; in cmdq_irq_handler() local
294 spin_lock_irqsave(&thread->chan->lock, flags); in cmdq_irq_handler()
295 cmdq_thread_irq_handler(cmdq, thread); in cmdq_irq_handler()
296 spin_unlock_irqrestore(&thread->chan->lock, flags); in cmdq_irq_handler()
305 struct cmdq_thread *thread; in cmdq_suspend() local
312 thread = &cmdq->thread[i]; in cmdq_suspend()
313 if (!list_empty(&thread->task_busy_list)) { in cmdq_suspend()
346 if (cmdq->thread) in cmdq_remove()
347 devm_kfree(&pdev->dev, cmdq->thread); in cmdq_remove()
357 struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv; in cmdq_mbox_send_data() local
372 task->thread = thread; in cmdq_mbox_send_data()
375 if (list_empty(&thread->task_busy_list)) { in cmdq_mbox_send_data()
377 WARN_ON(cmdq_thread_reset(cmdq, thread) < 0); in cmdq_mbox_send_data()
379 writel(task->pa_base, thread->base + CMDQ_THR_CURR_ADDR); in cmdq_mbox_send_data()
381 thread->base + CMDQ_THR_END_ADDR); in cmdq_mbox_send_data()
382 writel(thread->priority, thread->base + CMDQ_THR_PRIORITY); in cmdq_mbox_send_data()
383 writel(CMDQ_THR_IRQ_EN, thread->base + CMDQ_THR_IRQ_ENABLE); in cmdq_mbox_send_data()
384 writel(CMDQ_THR_ENABLED, thread->base + CMDQ_THR_ENABLE_TASK); in cmdq_mbox_send_data()
386 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_send_data()
387 curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR); in cmdq_mbox_send_data()
388 end_pa = readl(thread->base + CMDQ_THR_END_ADDR); in cmdq_mbox_send_data()
394 if (thread->atomic_exec) { in cmdq_mbox_send_data()
396 if (!cmdq_thread_is_in_wfe(thread)) { in cmdq_mbox_send_data()
397 cmdq_thread_resume(thread); in cmdq_mbox_send_data()
398 cmdq_thread_wait_end(thread, end_pa); in cmdq_mbox_send_data()
399 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_send_data()
402 thread->base + CMDQ_THR_CURR_ADDR); in cmdq_mbox_send_data()
406 smp_mb(); /* modify jump before enable thread */ in cmdq_mbox_send_data()
414 thread->base + CMDQ_THR_CURR_ADDR); in cmdq_mbox_send_data()
417 smp_mb(); /* modify jump before enable thread */ in cmdq_mbox_send_data()
421 thread->base + CMDQ_THR_END_ADDR); in cmdq_mbox_send_data()
422 cmdq_thread_resume(thread); in cmdq_mbox_send_data()
424 list_move_tail(&task->list_entry, &thread->task_busy_list); in cmdq_mbox_send_data()
448 struct cmdq_thread *thread; in cmdq_xlate() local
453 thread = (struct cmdq_thread *)mbox->chans[ind].con_priv; in cmdq_xlate()
454 thread->priority = sp->args[1]; in cmdq_xlate()
455 thread->atomic_exec = (sp->args[2] != 0); in cmdq_xlate()
456 thread->chan = &mbox->chans[ind]; in cmdq_xlate()
515 cmdq->thread = devm_kcalloc(dev, cmdq->thread_nr, in cmdq_probe()
516 sizeof(*cmdq->thread), GFP_KERNEL); in cmdq_probe()
517 if (!cmdq->thread) in cmdq_probe()
521 cmdq->thread[i].base = cmdq->base + CMDQ_THR_BASE + in cmdq_probe()
523 INIT_LIST_HEAD(&cmdq->thread[i].task_busy_list); in cmdq_probe()
524 cmdq->mbox.chans[i].con_priv = (void *)&cmdq->thread[i]; in cmdq_probe()