Lines Matching refs:cmdq
65 struct cmdq *cmdq; member
72 struct cmdq { struct
95 struct cmdq *cmdq = container_of(chan->mbox, struct cmdq, mbox); in cmdq_get_shift_pa() argument
97 return cmdq->shift_pa; in cmdq_get_shift_pa()
101 static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_suspend() argument
113 dev_err(cmdq->mbox.dev, "suspend GCE thread 0x%x failed\n", in cmdq_thread_suspend()
114 (u32)(thread->base - cmdq->base)); in cmdq_thread_suspend()
126 static void cmdq_init(struct cmdq *cmdq) in cmdq_init() argument
130 WARN_ON(clk_bulk_enable(cmdq->gce_num, cmdq->clocks)); in cmdq_init()
131 if (cmdq->control_by_sw) in cmdq_init()
132 writel(0x7, cmdq->base + GCE_GCTL_VALUE); in cmdq_init()
133 writel(CMDQ_THR_ACTIVE_SLOT_CYCLES, cmdq->base + CMDQ_THR_SLOT_CYCLES); in cmdq_init()
135 writel(i, cmdq->base + CMDQ_SYNC_TOKEN_UPDATE); in cmdq_init()
136 clk_bulk_disable(cmdq->gce_num, cmdq->clocks); in cmdq_init()
139 static int cmdq_thread_reset(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_reset() argument
147 dev_err(cmdq->mbox.dev, "reset GCE thread 0x%x failed\n", in cmdq_thread_reset()
148 (u32)(thread->base - cmdq->base)); in cmdq_thread_reset()
155 static void cmdq_thread_disable(struct cmdq *cmdq, struct cmdq_thread *thread) in cmdq_thread_disable() argument
157 cmdq_thread_reset(cmdq, thread); in cmdq_thread_disable()
170 struct device *dev = task->cmdq->mbox.dev; in cmdq_task_insert_into_thread()
181 (task->pa_base >> task->cmdq->shift_pa); in cmdq_task_insert_into_thread()
213 struct cmdq *cmdq = task->cmdq; in cmdq_task_handle_error() local
215 dev_err(cmdq->mbox.dev, "task 0x%p error\n", task); in cmdq_task_handle_error()
216 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_task_handle_error()
220 writel(next_task->pa_base >> cmdq->shift_pa, in cmdq_task_handle_error()
225 static void cmdq_thread_irq_handler(struct cmdq *cmdq, in cmdq_thread_irq_handler() argument
251 curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) << cmdq->shift_pa; in cmdq_thread_irq_handler()
273 cmdq_thread_disable(cmdq, thread); in cmdq_thread_irq_handler()
274 clk_bulk_disable(cmdq->gce_num, cmdq->clocks); in cmdq_thread_irq_handler()
280 struct cmdq *cmdq = dev; in cmdq_irq_handler() local
284 irq_status = readl(cmdq->base + CMDQ_CURR_IRQ_STATUS) & cmdq->irq_mask; in cmdq_irq_handler()
285 if (!(irq_status ^ cmdq->irq_mask)) in cmdq_irq_handler()
288 for_each_clear_bit(bit, &irq_status, cmdq->thread_nr) { in cmdq_irq_handler()
289 struct cmdq_thread *thread = &cmdq->thread[bit]; in cmdq_irq_handler()
292 cmdq_thread_irq_handler(cmdq, thread); in cmdq_irq_handler()
301 struct cmdq *cmdq = dev_get_drvdata(dev); in cmdq_suspend() local
306 cmdq->suspended = true; in cmdq_suspend()
308 for (i = 0; i < cmdq->thread_nr; i++) { in cmdq_suspend()
309 thread = &cmdq->thread[i]; in cmdq_suspend()
319 clk_bulk_unprepare(cmdq->gce_num, cmdq->clocks); in cmdq_suspend()
326 struct cmdq *cmdq = dev_get_drvdata(dev); in cmdq_resume() local
328 WARN_ON(clk_bulk_prepare(cmdq->gce_num, cmdq->clocks)); in cmdq_resume()
329 cmdq->suspended = false; in cmdq_resume()
335 struct cmdq *cmdq = platform_get_drvdata(pdev); in cmdq_remove() local
337 clk_bulk_unprepare(cmdq->gce_num, cmdq->clocks); in cmdq_remove()
345 struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev); in cmdq_mbox_send_data() local
350 WARN_ON(cmdq->suspended); in cmdq_mbox_send_data()
356 task->cmdq = cmdq; in cmdq_mbox_send_data()
363 WARN_ON(clk_bulk_enable(cmdq->gce_num, cmdq->clocks)); in cmdq_mbox_send_data()
371 WARN_ON(cmdq_thread_reset(cmdq, thread) < 0); in cmdq_mbox_send_data()
373 writel(task->pa_base >> cmdq->shift_pa, in cmdq_mbox_send_data()
375 writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->shift_pa, in cmdq_mbox_send_data()
382 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_send_data()
384 cmdq->shift_pa; in cmdq_mbox_send_data()
386 cmdq->shift_pa; in cmdq_mbox_send_data()
391 writel(task->pa_base >> cmdq->shift_pa, in cmdq_mbox_send_data()
397 writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->shift_pa, in cmdq_mbox_send_data()
414 struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev); in cmdq_mbox_shutdown() local
422 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_shutdown()
425 cmdq_thread_irq_handler(cmdq, thread); in cmdq_mbox_shutdown()
435 cmdq_thread_disable(cmdq, thread); in cmdq_mbox_shutdown()
436 clk_bulk_disable(cmdq->gce_num, cmdq->clocks); in cmdq_mbox_shutdown()
453 struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev); in cmdq_mbox_flush() local
462 WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0); in cmdq_mbox_flush()
481 cmdq_thread_disable(cmdq, thread); in cmdq_mbox_flush()
482 clk_bulk_disable(cmdq->gce_num, cmdq->clocks); in cmdq_mbox_flush()
493 dev_err(cmdq->mbox.dev, "Fail to wait GCE thread 0x%x done\n", in cmdq_mbox_flush()
494 (u32)(thread->base - cmdq->base)); in cmdq_mbox_flush()
527 struct cmdq *cmdq; in cmdq_probe() local
536 cmdq = devm_kzalloc(dev, sizeof(*cmdq), GFP_KERNEL); in cmdq_probe()
537 if (!cmdq) in cmdq_probe()
540 cmdq->base = devm_platform_ioremap_resource(pdev, 0); in cmdq_probe()
541 if (IS_ERR(cmdq->base)) in cmdq_probe()
542 return PTR_ERR(cmdq->base); in cmdq_probe()
544 cmdq->irq = platform_get_irq(pdev, 0); in cmdq_probe()
545 if (cmdq->irq < 0) in cmdq_probe()
546 return cmdq->irq; in cmdq_probe()
554 cmdq->thread_nr = plat_data->thread_nr; in cmdq_probe()
555 cmdq->shift_pa = plat_data->shift; in cmdq_probe()
556 cmdq->control_by_sw = plat_data->control_by_sw; in cmdq_probe()
557 cmdq->gce_num = plat_data->gce_num; in cmdq_probe()
558 cmdq->irq_mask = GENMASK(cmdq->thread_nr - 1, 0); in cmdq_probe()
559 err = devm_request_irq(dev, cmdq->irq, cmdq_irq_handler, IRQF_SHARED, in cmdq_probe()
560 "mtk_cmdq", cmdq); in cmdq_probe()
567 dev, cmdq->base, cmdq->irq); in cmdq_probe()
569 if (cmdq->gce_num > 1) { in cmdq_probe()
572 if (alias_id >= 0 && alias_id < cmdq->gce_num) { in cmdq_probe()
573 cmdq->clocks[alias_id].id = clk_names[alias_id]; in cmdq_probe()
574 cmdq->clocks[alias_id].clk = of_clk_get(node, 0); in cmdq_probe()
575 if (IS_ERR(cmdq->clocks[alias_id].clk)) { in cmdq_probe()
577 return PTR_ERR(cmdq->clocks[alias_id].clk); in cmdq_probe()
582 cmdq->clocks[alias_id].id = clk_name; in cmdq_probe()
583 cmdq->clocks[alias_id].clk = devm_clk_get(&pdev->dev, clk_name); in cmdq_probe()
584 if (IS_ERR(cmdq->clocks[alias_id].clk)) { in cmdq_probe()
586 return PTR_ERR(cmdq->clocks[alias_id].clk); in cmdq_probe()
590 cmdq->mbox.dev = dev; in cmdq_probe()
591 cmdq->mbox.chans = devm_kcalloc(dev, cmdq->thread_nr, in cmdq_probe()
592 sizeof(*cmdq->mbox.chans), GFP_KERNEL); in cmdq_probe()
593 if (!cmdq->mbox.chans) in cmdq_probe()
596 cmdq->mbox.num_chans = cmdq->thread_nr; in cmdq_probe()
597 cmdq->mbox.ops = &cmdq_mbox_chan_ops; in cmdq_probe()
598 cmdq->mbox.of_xlate = cmdq_xlate; in cmdq_probe()
601 cmdq->mbox.txdone_irq = false; in cmdq_probe()
602 cmdq->mbox.txdone_poll = false; in cmdq_probe()
604 cmdq->thread = devm_kcalloc(dev, cmdq->thread_nr, in cmdq_probe()
605 sizeof(*cmdq->thread), GFP_KERNEL); in cmdq_probe()
606 if (!cmdq->thread) in cmdq_probe()
609 for (i = 0; i < cmdq->thread_nr; i++) { in cmdq_probe()
610 cmdq->thread[i].base = cmdq->base + CMDQ_THR_BASE + in cmdq_probe()
612 INIT_LIST_HEAD(&cmdq->thread[i].task_busy_list); in cmdq_probe()
613 cmdq->mbox.chans[i].con_priv = (void *)&cmdq->thread[i]; in cmdq_probe()
616 err = devm_mbox_controller_register(dev, &cmdq->mbox); in cmdq_probe()
622 platform_set_drvdata(pdev, cmdq); in cmdq_probe()
624 WARN_ON(clk_bulk_prepare(cmdq->gce_num, cmdq->clocks)); in cmdq_probe()
626 cmdq_init(cmdq); in cmdq_probe()