Lines Matching defs:thread

70 	struct cmdq_thread	*thread;
80 struct cmdq_thread *thread;
113 static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread)
117 writel(CMDQ_THR_SUSPEND, thread->base + CMDQ_THR_SUSPEND_TASK);
120 if (!(readl(thread->base + CMDQ_THR_ENABLE_TASK) & CMDQ_THR_ENABLED))
123 if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_CURR_STATUS,
125 dev_err(cmdq->mbox.dev, "suspend GCE thread 0x%x failed\n",
126 (u32)(thread->base - cmdq->base));
133 static void cmdq_thread_resume(struct cmdq_thread *thread)
135 writel(CMDQ_THR_RESUME, thread->base + CMDQ_THR_SUSPEND_TASK);
158 static int cmdq_thread_reset(struct cmdq *cmdq, struct cmdq_thread *thread)
162 writel(CMDQ_THR_DO_WARM_RESET, thread->base + CMDQ_THR_WARM_RESET);
163 if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_WARM_RESET,
166 dev_err(cmdq->mbox.dev, "reset GCE thread 0x%x failed\n",
167 (u32)(thread->base - cmdq->base));
174 static void cmdq_thread_disable(struct cmdq *cmdq, struct cmdq_thread *thread)
176 cmdq_thread_reset(cmdq, thread);
177 writel(CMDQ_THR_DISABLED, thread->base + CMDQ_THR_ENABLE_TASK);
180 /* notify GCE to re-fetch commands by setting GCE thread PC */
181 static void cmdq_thread_invalidate_fetched_data(struct cmdq_thread *thread)
183 writel(readl(thread->base + CMDQ_THR_CURR_ADDR),
184 thread->base + CMDQ_THR_CURR_ADDR);
190 struct cmdq_thread *thread = task->thread;
192 &thread->task_busy_list, typeof(*task), list_entry);
204 cmdq_thread_invalidate_fetched_data(thread);
207 static bool cmdq_thread_is_in_wfe(struct cmdq_thread *thread)
209 return readl(thread->base + CMDQ_THR_WAIT_TOKEN) & CMDQ_THR_IS_WAITING;
218 mbox_chan_received_data(task->thread->chan, &data);
225 struct cmdq_thread *thread = task->thread;
230 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
231 next_task = list_first_entry_or_null(&thread->task_busy_list,
235 thread->base + CMDQ_THR_CURR_ADDR);
236 cmdq_thread_resume(thread);
240 struct cmdq_thread *thread)
246 irq_flag = readl(thread->base + CMDQ_THR_IRQ_STATUS);
247 writel(~irq_flag, thread->base + CMDQ_THR_IRQ_STATUS);
252 * reset / disable this GCE thread, so we need to check the enable
253 * bit of this GCE thread.
255 if (!(readl(thread->base + CMDQ_THR_ENABLE_TASK) & CMDQ_THR_ENABLED))
265 curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) << cmdq->pdata->shift;
267 list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
286 if (list_empty(&thread->task_busy_list)) {
287 cmdq_thread_disable(cmdq, thread);
303 struct cmdq_thread *thread = &cmdq->thread[bit];
305 spin_lock_irqsave(&thread->chan->lock, flags);
306 cmdq_thread_irq_handler(cmdq, thread);
307 spin_unlock_irqrestore(&thread->chan->lock, flags);
316 struct cmdq_thread *thread;
323 thread = &cmdq->thread[i];
324 if (!list_empty(&thread->task_busy_list)) {
368 struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
383 task->thread = thread;
386 if (list_empty(&thread->task_busy_list)) {
390 * The thread reset will clear thread related register to 0,
393 * thread and make it running.
395 WARN_ON(cmdq_thread_reset(cmdq, thread) < 0);
398 thread->base + CMDQ_THR_CURR_ADDR);
400 thread->base + CMDQ_THR_END_ADDR);
402 writel(thread->priority, thread->base + CMDQ_THR_PRIORITY);
403 writel(CMDQ_THR_IRQ_EN, thread->base + CMDQ_THR_IRQ_ENABLE);
404 writel(CMDQ_THR_ENABLED, thread->base + CMDQ_THR_ENABLE_TASK);
406 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
407 curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) <<
409 end_pa = readl(thread->base + CMDQ_THR_END_ADDR) <<
416 thread->base + CMDQ_THR_CURR_ADDR);
419 smp_mb(); /* modify jump before enable thread */
422 thread->base + CMDQ_THR_END_ADDR);
423 cmdq_thread_resume(thread);
425 list_move_tail(&task->list_entry, &thread->task_busy_list);
437 struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
442 spin_lock_irqsave(&thread->chan->lock, flags);
443 if (list_empty(&thread->task_busy_list))
446 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
449 cmdq_thread_irq_handler(cmdq, thread);
450 if (list_empty(&thread->task_busy_list))
453 list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
459 cmdq_thread_disable(cmdq, thread);
464 * The thread->task_busy_list empty means thread already disable. The
465 * cmdq_mbox_send_data() always reset thread which clear disable and
469 spin_unlock_irqrestore(&thread->chan->lock, flags);
474 struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
481 spin_lock_irqsave(&thread->chan->lock, flags);
482 if (list_empty(&thread->task_busy_list))
485 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
486 if (!cmdq_thread_is_in_wfe(thread))
489 list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
493 mbox_chan_received_data(task->thread->chan, &data);
498 cmdq_thread_resume(thread);
499 cmdq_thread_disable(cmdq, thread);
503 spin_unlock_irqrestore(&thread->chan->lock, flags);
507 cmdq_thread_resume(thread);
508 spin_unlock_irqrestore(&thread->chan->lock, flags);
509 if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_ENABLE_TASK,
511 dev_err(cmdq->mbox.dev, "Fail to wait GCE thread 0x%x done\n",
512 (u32)(thread->base - cmdq->base));
530 struct cmdq_thread *thread;
535 thread = (struct cmdq_thread *)mbox->chans[ind].con_priv;
536 thread->priority = sp->args[1];
537 thread->chan = &mbox->chans[ind];
614 cmdq->thread = devm_kcalloc(dev, cmdq->pdata->thread_nr,
615 sizeof(*cmdq->thread), GFP_KERNEL);
616 if (!cmdq->thread)
620 cmdq->thread[i].base = cmdq->base + CMDQ_THR_BASE +
622 INIT_LIST_HEAD(&cmdq->thread[i].task_busy_list);
623 cmdq->mbox.chans[i].con_priv = (void *)&cmdq->thread[i];