Lines Matching refs:cmdq
69 struct cmdq *cmdq; member
76 struct cmdq { struct
97 struct cmdq *cmdq = container_of(chan->mbox, struct cmdq, mbox); in cmdq_get_shift_pa() argument
99 return cmdq->pdata->shift; in cmdq_get_shift_pa()
103 static void cmdq_gctl_value_toggle(struct cmdq *cmdq, bool ddr_enable) in cmdq_gctl_value_toggle() argument
105 u32 val = cmdq->pdata->control_by_sw ? GCE_CTRL_BY_SW : 0; in cmdq_gctl_value_toggle()
107 if (!cmdq->pdata->control_by_sw && !cmdq->pdata->sw_ddr_en) in cmdq_gctl_value_toggle()
110 if (cmdq->pdata->sw_ddr_en && ddr_enable) in cmdq_gctl_value_toggle()
113 writel(val, cmdq->base + GCE_GCTL_VALUE); in cmdq_gctl_value_toggle()
116 static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_suspend() argument
128 dev_err(cmdq->mbox.dev, "suspend GCE thread 0x%x failed\n", in cmdq_thread_suspend()
129 (u32)(thread->base - cmdq->base)); in cmdq_thread_suspend()
141 static void cmdq_init(struct cmdq *cmdq) in cmdq_init() argument
145 WARN_ON(clk_bulk_enable(cmdq->pdata->gce_num, cmdq->clocks)); in cmdq_init()
147 cmdq_gctl_value_toggle(cmdq, true); in cmdq_init()
149 writel(CMDQ_THR_ACTIVE_SLOT_CYCLES, cmdq->base + CMDQ_THR_SLOT_CYCLES); in cmdq_init()
151 writel(i, cmdq->base + CMDQ_SYNC_TOKEN_UPDATE); in cmdq_init()
152 clk_bulk_disable(cmdq->pdata->gce_num, cmdq->clocks); in cmdq_init()
155 static int cmdq_thread_reset(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_reset() argument
163 dev_err(cmdq->mbox.dev, "reset GCE thread 0x%x failed\n", in cmdq_thread_reset()
164 (u32)(thread->base - cmdq->base)); in cmdq_thread_reset()
171 static void cmdq_thread_disable(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_disable() argument
173 cmdq_thread_reset(cmdq, thread); in cmdq_thread_disable()
186 struct device *dev = task->cmdq->mbox.dev; in cmdq_task_insert_into_thread()
197 (task->pa_base >> task->cmdq->pdata->shift); in cmdq_task_insert_into_thread()
224 struct cmdq *cmdq = task->cmdq; in cmdq_task_handle_error() local
226 dev_err(cmdq->mbox.dev, "task 0x%p error\n", task); in cmdq_task_handle_error()
227 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_task_handle_error()
231 writel(next_task->pa_base >> cmdq->pdata->shift, in cmdq_task_handle_error()
236 static void cmdq_thread_irq_handler(struct cmdq *cmdq, in cmdq_thread_irq_handler() argument
262 curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) << cmdq->pdata->shift; in cmdq_thread_irq_handler()
284 cmdq_thread_disable(cmdq, thread); in cmdq_thread_irq_handler()
289 struct cmdq *cmdq = dev; in cmdq_irq_handler() local
293 irq_status = readl(cmdq->base + CMDQ_CURR_IRQ_STATUS) & cmdq->irq_mask; in cmdq_irq_handler()
294 if (!(irq_status ^ cmdq->irq_mask)) in cmdq_irq_handler()
297 for_each_clear_bit(bit, &irq_status, cmdq->pdata->thread_nr) { in cmdq_irq_handler()
298 struct cmdq_thread *thread = &cmdq->thread[bit]; in cmdq_irq_handler()
301 cmdq_thread_irq_handler(cmdq, thread); in cmdq_irq_handler()
305 pm_runtime_mark_last_busy(cmdq->mbox.dev); in cmdq_irq_handler()
312 struct cmdq *cmdq = dev_get_drvdata(dev); in cmdq_runtime_resume() local
315 ret = clk_bulk_enable(cmdq->pdata->gce_num, cmdq->clocks); in cmdq_runtime_resume()
319 cmdq_gctl_value_toggle(cmdq, true); in cmdq_runtime_resume()
325 struct cmdq *cmdq = dev_get_drvdata(dev); in cmdq_runtime_suspend() local
327 cmdq_gctl_value_toggle(cmdq, false); in cmdq_runtime_suspend()
328 clk_bulk_disable(cmdq->pdata->gce_num, cmdq->clocks); in cmdq_runtime_suspend()
334 struct cmdq *cmdq = dev_get_drvdata(dev); in cmdq_suspend() local
339 cmdq->suspended = true; in cmdq_suspend()
341 for (i = 0; i < cmdq->pdata->thread_nr; i++) { in cmdq_suspend()
342 thread = &cmdq->thread[i]; in cmdq_suspend()
357 struct cmdq *cmdq = dev_get_drvdata(dev); in cmdq_resume() local
360 cmdq->suspended = false; in cmdq_resume()
367 struct cmdq *cmdq = platform_get_drvdata(pdev); in cmdq_remove() local
372 clk_bulk_unprepare(cmdq->pdata->gce_num, cmdq->clocks); in cmdq_remove()
379 struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev); in cmdq_mbox_send_data() local
385 WARN_ON(cmdq->suspended); in cmdq_mbox_send_data()
387 ret = pm_runtime_get_sync(cmdq->mbox.dev); in cmdq_mbox_send_data()
393 pm_runtime_put_autosuspend(cmdq->mbox.dev); in cmdq_mbox_send_data()
397 task->cmdq = cmdq; in cmdq_mbox_send_data()
410 WARN_ON(cmdq_thread_reset(cmdq, thread) < 0); in cmdq_mbox_send_data()
412 writel(task->pa_base >> cmdq->pdata->shift, in cmdq_mbox_send_data()
414 writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->pdata->shift, in cmdq_mbox_send_data()
421 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_send_data()
423 cmdq->pdata->shift; in cmdq_mbox_send_data()
425 cmdq->pdata->shift; in cmdq_mbox_send_data()
430 writel(task->pa_base >> cmdq->pdata->shift, in cmdq_mbox_send_data()
436 writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->pdata->shift, in cmdq_mbox_send_data()
442 pm_runtime_mark_last_busy(cmdq->mbox.dev); in cmdq_mbox_send_data()
443 pm_runtime_put_autosuspend(cmdq->mbox.dev); in cmdq_mbox_send_data()
456 struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev); in cmdq_mbox_shutdown() local
460 WARN_ON(pm_runtime_get_sync(cmdq->mbox.dev) < 0); in cmdq_mbox_shutdown()
466 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_shutdown()
469 cmdq_thread_irq_handler(cmdq, thread); in cmdq_mbox_shutdown()
479 cmdq_thread_disable(cmdq, thread); in cmdq_mbox_shutdown()
490 pm_runtime_mark_last_busy(cmdq->mbox.dev); in cmdq_mbox_shutdown()
491 pm_runtime_put_autosuspend(cmdq->mbox.dev); in cmdq_mbox_shutdown()
498 struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev); in cmdq_mbox_flush() local
504 ret = pm_runtime_get_sync(cmdq->mbox.dev); in cmdq_mbox_flush()
512 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_flush()
526 cmdq_thread_disable(cmdq, thread); in cmdq_mbox_flush()
530 pm_runtime_mark_last_busy(cmdq->mbox.dev); in cmdq_mbox_flush()
531 pm_runtime_put_autosuspend(cmdq->mbox.dev); in cmdq_mbox_flush()
540 dev_err(cmdq->mbox.dev, "Fail to wait GCE thread 0x%x done\n", in cmdq_mbox_flush()
541 (u32)(thread->base - cmdq->base)); in cmdq_mbox_flush()
545 pm_runtime_mark_last_busy(cmdq->mbox.dev); in cmdq_mbox_flush()
546 pm_runtime_put_autosuspend(cmdq->mbox.dev); in cmdq_mbox_flush()
573 static int cmdq_get_clocks(struct device *dev, struct cmdq *cmdq) in cmdq_get_clocks() argument
579 cmdq->clocks = devm_kcalloc(dev, cmdq->pdata->gce_num, in cmdq_get_clocks()
580 sizeof(*cmdq->clocks), GFP_KERNEL); in cmdq_get_clocks()
581 if (!cmdq->clocks) in cmdq_get_clocks()
584 if (cmdq->pdata->gce_num == 1) { in cmdq_get_clocks()
585 clks = &cmdq->clocks[0]; in cmdq_get_clocks()
604 if (alias_id < 0 || alias_id >= cmdq->pdata->gce_num) in cmdq_get_clocks()
607 clks = &cmdq->clocks[alias_id]; in cmdq_get_clocks()
629 struct cmdq *cmdq; in cmdq_probe() local
632 cmdq = devm_kzalloc(dev, sizeof(*cmdq), GFP_KERNEL); in cmdq_probe()
633 if (!cmdq) in cmdq_probe()
636 cmdq->base = devm_platform_ioremap_resource(pdev, 0); in cmdq_probe()
637 if (IS_ERR(cmdq->base)) in cmdq_probe()
638 return PTR_ERR(cmdq->base); in cmdq_probe()
640 cmdq->irq = platform_get_irq(pdev, 0); in cmdq_probe()
641 if (cmdq->irq < 0) in cmdq_probe()
642 return cmdq->irq; in cmdq_probe()
644 cmdq->pdata = device_get_match_data(dev); in cmdq_probe()
645 if (!cmdq->pdata) { in cmdq_probe()
650 cmdq->irq_mask = GENMASK(cmdq->pdata->thread_nr - 1, 0); in cmdq_probe()
653 dev, cmdq->base, cmdq->irq); in cmdq_probe()
655 err = cmdq_get_clocks(dev, cmdq); in cmdq_probe()
659 cmdq->mbox.dev = dev; in cmdq_probe()
660 cmdq->mbox.chans = devm_kcalloc(dev, cmdq->pdata->thread_nr, in cmdq_probe()
661 sizeof(*cmdq->mbox.chans), GFP_KERNEL); in cmdq_probe()
662 if (!cmdq->mbox.chans) in cmdq_probe()
665 cmdq->mbox.num_chans = cmdq->pdata->thread_nr; in cmdq_probe()
666 cmdq->mbox.ops = &cmdq_mbox_chan_ops; in cmdq_probe()
667 cmdq->mbox.of_xlate = cmdq_xlate; in cmdq_probe()
670 cmdq->mbox.txdone_irq = false; in cmdq_probe()
671 cmdq->mbox.txdone_poll = false; in cmdq_probe()
673 cmdq->thread = devm_kcalloc(dev, cmdq->pdata->thread_nr, in cmdq_probe()
674 sizeof(*cmdq->thread), GFP_KERNEL); in cmdq_probe()
675 if (!cmdq->thread) in cmdq_probe()
678 for (i = 0; i < cmdq->pdata->thread_nr; i++) { in cmdq_probe()
679 cmdq->thread[i].base = cmdq->base + CMDQ_THR_BASE + in cmdq_probe()
681 INIT_LIST_HEAD(&cmdq->thread[i].task_busy_list); in cmdq_probe()
682 cmdq->mbox.chans[i].con_priv = (void *)&cmdq->thread[i]; in cmdq_probe()
685 platform_set_drvdata(pdev, cmdq); in cmdq_probe()
687 WARN_ON(clk_bulk_prepare(cmdq->pdata->gce_num, cmdq->clocks)); in cmdq_probe()
689 cmdq_init(cmdq); in cmdq_probe()
691 err = devm_request_irq(dev, cmdq->irq, cmdq_irq_handler, IRQF_SHARED, in cmdq_probe()
692 "mtk_cmdq", cmdq); in cmdq_probe()
712 err = devm_mbox_controller_register(dev, &cmdq->mbox); in cmdq_probe()