1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright 2020-2021 NXP
6 #include <linux/init.h>
7 #include <linux/interconnect.h>
8 #include <linux/ioctl.h>
9 #include <linux/list.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/of_device.h>
13 #include <linux/of_address.h>
14 #include <linux/platform_device.h>
15 #include <linux/slab.h>
16 #include <linux/types.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/pm_domain.h>
19 #include <linux/firmware.h>
20 #include <linux/vmalloc.h>
29 void csr_writel(struct vpu_core *core, u32 reg, u32 val)
31 writel(val, core->base + reg);
34 u32 csr_readl(struct vpu_core *core, u32 reg)
36 return readl(core->base + reg);
39 static int vpu_core_load_firmware(struct vpu_core *core)
41 const struct firmware *pfw = NULL;
45 dev_err(core->dev, "firmware buffer is not ready\n");
49 ret = reject_firmware(&pfw, core->res->fwname, core->dev);
50 dev_dbg(core->dev, "request_firmware %s : %d\n", core->res->fwname, ret);
52 dev_err(core->dev, "request firmware %s failed, ret = %d\n",
53 core->res->fwname, ret);
57 if (core->fw.length < pfw->size) {
58 dev_err(core->dev, "firmware buffer size want %zu, but %d\n",
59 pfw->size, core->fw.length);
64 memset(core->fw.virt, 0, core->fw.length);
65 memcpy(core->fw.virt, pfw->data, pfw->size);
66 core->fw.bytesused = pfw->size;
67 ret = vpu_iface_on_firmware_loaded(core);
69 release_firmware(pfw);
75 static int vpu_core_boot_done(struct vpu_core *core)
79 fw_version = vpu_iface_get_version(core);
80 dev_info(core->dev, "%s firmware version : %d.%d.%d\n",
81 vpu_core_type_desc(core->type),
82 (fw_version >> 16) & 0xff,
83 (fw_version >> 8) & 0xff,
85 core->supported_instance_count = vpu_iface_get_max_instance_count(core);
86 if (core->res->act_size) {
87 u32 count = core->act.length / core->res->act_size;
89 core->supported_instance_count = min(core->supported_instance_count, count);
91 core->fw_version = fw_version;
92 core->state = VPU_CORE_ACTIVE;
97 static int vpu_core_wait_boot_done(struct vpu_core *core)
101 ret = wait_for_completion_timeout(&core->cmp, VPU_TIMEOUT);
103 dev_err(core->dev, "boot timeout\n");
106 return vpu_core_boot_done(core);
109 static int vpu_core_boot(struct vpu_core *core, bool load)
113 reinit_completion(&core->cmp);
115 ret = vpu_core_load_firmware(core);
120 vpu_iface_boot_core(core);
121 return vpu_core_wait_boot_done(core);
124 static int vpu_core_shutdown(struct vpu_core *core)
126 return vpu_iface_shutdown_core(core);
129 static int vpu_core_restore(struct vpu_core *core)
133 ret = vpu_core_sw_reset(core);
137 vpu_core_boot_done(core);
138 return vpu_iface_restore_core(core);
141 static int __vpu_alloc_dma(struct device *dev, struct vpu_buffer *buf)
143 gfp_t gfp = GFP_KERNEL | GFP_DMA32;
148 buf->virt = dma_alloc_coherent(dev, buf->length, &buf->phys, gfp);
157 void vpu_free_dma(struct vpu_buffer *buf)
159 if (!buf->virt || !buf->dev)
162 dma_free_coherent(buf->dev, buf->length, buf->virt, buf->phys);
170 int vpu_alloc_dma(struct vpu_core *core, struct vpu_buffer *buf)
172 return __vpu_alloc_dma(core->dev, buf);
175 static void vpu_core_check_hang(struct vpu_core *core)
178 core->state = VPU_CORE_HANG;
181 static struct vpu_core *vpu_core_find_proper_by_type(struct vpu_dev *vpu, u32 type)
183 struct vpu_core *core = NULL;
184 int request_count = INT_MAX;
187 list_for_each_entry(c, &vpu->cores, list) {
188 dev_dbg(c->dev, "instance_mask = 0x%lx, state = %d\n", c->instance_mask, c->state);
191 if (c->state == VPU_CORE_DEINIT) {
195 vpu_core_check_hang(c);
196 if (c->state != VPU_CORE_ACTIVE)
198 if (c->request_count < request_count) {
199 request_count = c->request_count;
209 static bool vpu_core_is_exist(struct vpu_dev *vpu, struct vpu_core *core)
213 list_for_each_entry(c, &vpu->cores, list) {
221 static void vpu_core_get_vpu(struct vpu_core *core)
223 core->vpu->get_vpu(core->vpu);
224 if (core->type == VPU_CORE_TYPE_ENC)
225 core->vpu->get_enc(core->vpu);
226 if (core->type == VPU_CORE_TYPE_DEC)
227 core->vpu->get_dec(core->vpu);
230 static int vpu_core_register(struct device *dev, struct vpu_core *core)
232 struct vpu_dev *vpu = dev_get_drvdata(dev);
235 dev_dbg(core->dev, "register core %s\n", vpu_core_type_desc(core->type));
236 if (vpu_core_is_exist(vpu, core))
239 core->workqueue = alloc_workqueue("vpu", WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
240 if (!core->workqueue) {
241 dev_err(core->dev, "fail to alloc workqueue\n");
244 INIT_WORK(&core->msg_work, vpu_msg_run_work);
245 INIT_DELAYED_WORK(&core->msg_delayed_work, vpu_msg_delayed_work);
246 core->msg_buffer_size = roundup_pow_of_two(VPU_MSG_BUFFER_SIZE);
247 core->msg_buffer = vzalloc(core->msg_buffer_size);
248 if (!core->msg_buffer) {
249 dev_err(core->dev, "failed allocate buffer for fifo\n");
253 ret = kfifo_init(&core->msg_fifo, core->msg_buffer, core->msg_buffer_size);
255 dev_err(core->dev, "failed init kfifo\n");
259 list_add_tail(&core->list, &vpu->cores);
261 vpu_core_get_vpu(core);
263 if (vpu_iface_get_power_state(core))
264 ret = vpu_core_restore(core);
270 if (core->msg_buffer) {
271 vfree(core->msg_buffer);
272 core->msg_buffer = NULL;
274 if (core->workqueue) {
275 destroy_workqueue(core->workqueue);
276 core->workqueue = NULL;
281 static void vpu_core_put_vpu(struct vpu_core *core)
283 if (core->type == VPU_CORE_TYPE_ENC)
284 core->vpu->put_enc(core->vpu);
285 if (core->type == VPU_CORE_TYPE_DEC)
286 core->vpu->put_dec(core->vpu);
287 core->vpu->put_vpu(core->vpu);
290 static int vpu_core_unregister(struct device *dev, struct vpu_core *core)
292 list_del_init(&core->list);
294 vpu_core_put_vpu(core);
296 vfree(core->msg_buffer);
297 core->msg_buffer = NULL;
299 if (core->workqueue) {
300 cancel_work_sync(&core->msg_work);
301 cancel_delayed_work_sync(&core->msg_delayed_work);
302 destroy_workqueue(core->workqueue);
303 core->workqueue = NULL;
309 static int vpu_core_acquire_instance(struct vpu_core *core)
313 id = ffz(core->instance_mask);
314 if (id >= core->supported_instance_count)
317 set_bit(id, &core->instance_mask);
322 static void vpu_core_release_instance(struct vpu_core *core, int id)
324 if (id < 0 || id >= core->supported_instance_count)
327 clear_bit(id, &core->instance_mask);
330 struct vpu_inst *vpu_inst_get(struct vpu_inst *inst)
335 atomic_inc(&inst->ref_count);
340 void vpu_inst_put(struct vpu_inst *inst)
344 if (atomic_dec_and_test(&inst->ref_count)) {
350 struct vpu_core *vpu_request_core(struct vpu_dev *vpu, enum vpu_core_type type)
352 struct vpu_core *core = NULL;
355 mutex_lock(&vpu->lock);
357 core = vpu_core_find_proper_by_type(vpu, type);
361 mutex_lock(&core->lock);
362 pm_runtime_resume_and_get(core->dev);
364 if (core->state == VPU_CORE_DEINIT) {
365 ret = vpu_core_boot(core, true);
367 pm_runtime_put_sync(core->dev);
368 mutex_unlock(&core->lock);
374 core->request_count++;
376 mutex_unlock(&core->lock);
378 mutex_unlock(&vpu->lock);
383 void vpu_release_core(struct vpu_core *core)
388 mutex_lock(&core->lock);
389 pm_runtime_put_sync(core->dev);
390 if (core->request_count)
391 core->request_count--;
392 mutex_unlock(&core->lock);
395 int vpu_inst_register(struct vpu_inst *inst)
398 struct vpu_core *core;
404 core = vpu_request_core(vpu, inst->type);
406 dev_err(vpu->dev, "there is no vpu core for %s\n",
407 vpu_core_type_desc(inst->type));
411 inst->dev = get_device(core->dev);
414 mutex_lock(&core->lock);
415 if (inst->id >= 0 && inst->id < core->supported_instance_count)
418 ret = vpu_core_acquire_instance(core);
422 vpu_trace(inst->dev, "[%d] %p\n", ret, inst);
424 list_add_tail(&inst->list, &core->instances);
426 if (core->res->act_size) {
427 inst->act.phys = core->act.phys + core->res->act_size * inst->id;
428 inst->act.virt = core->act.virt + core->res->act_size * inst->id;
429 inst->act.length = core->res->act_size;
431 vpu_inst_create_dbgfs_file(inst);
433 mutex_unlock(&core->lock);
436 dev_err(core->dev, "register instance fail\n");
440 int vpu_inst_unregister(struct vpu_inst *inst)
442 struct vpu_core *core;
448 vpu_clear_request(inst);
449 mutex_lock(&core->lock);
450 if (inst->id >= 0 && inst->id < core->supported_instance_count) {
451 vpu_inst_remove_dbgfs_file(inst);
452 list_del_init(&inst->list);
453 vpu_core_release_instance(core, inst->id);
454 inst->id = VPU_INST_NULL_ID;
456 vpu_core_check_hang(core);
457 if (core->state == VPU_CORE_HANG && !core->instance_mask) {
458 dev_info(core->dev, "reset hang core\n");
459 if (!vpu_core_sw_reset(core)) {
460 core->state = VPU_CORE_ACTIVE;
464 mutex_unlock(&core->lock);
469 struct vpu_inst *vpu_core_find_instance(struct vpu_core *core, u32 index)
471 struct vpu_inst *inst = NULL;
472 struct vpu_inst *tmp;
474 mutex_lock(&core->lock);
475 if (index >= core->supported_instance_count || !test_bit(index, &core->instance_mask))
477 list_for_each_entry(tmp, &core->instances, list) {
478 if (tmp->id == index) {
479 inst = vpu_inst_get(tmp);
484 mutex_unlock(&core->lock);
489 const struct vpu_core_resources *vpu_get_resource(struct vpu_inst *inst)
492 struct vpu_core *core = NULL;
493 const struct vpu_core_resources *res = NULL;
495 if (!inst || !inst->vpu)
498 if (inst->core && inst->core->res)
499 return inst->core->res;
502 mutex_lock(&vpu->lock);
503 list_for_each_entry(core, &vpu->cores, list) {
504 if (core->type == inst->type) {
509 mutex_unlock(&vpu->lock);
514 static int vpu_core_parse_dt(struct vpu_core *core, struct device_node *np)
516 struct device_node *node;
520 if (of_count_phandle_with_args(np, "memory-region", NULL) < 2) {
521 dev_err(core->dev, "need 2 memory-region for boot and rpc\n");
525 node = of_parse_phandle(np, "memory-region", 0);
527 dev_err(core->dev, "boot-region of_parse_phandle error\n");
530 if (of_address_to_resource(node, 0, &res)) {
531 dev_err(core->dev, "boot-region of_address_to_resource error\n");
535 core->fw.phys = res.start;
536 core->fw.length = resource_size(&res);
540 node = of_parse_phandle(np, "memory-region", 1);
542 dev_err(core->dev, "rpc-region of_parse_phandle error\n");
545 if (of_address_to_resource(node, 0, &res)) {
546 dev_err(core->dev, "rpc-region of_address_to_resource error\n");
550 core->rpc.phys = res.start;
551 core->rpc.length = resource_size(&res);
553 if (core->rpc.length < core->res->rpc_size + core->res->fwlog_size) {
554 dev_err(core->dev, "the rpc-region <%pad, 0x%x> is not enough\n",
555 &core->rpc.phys, core->rpc.length);
560 core->fw.virt = memremap(core->fw.phys, core->fw.length, MEMREMAP_WC);
561 core->rpc.virt = memremap(core->rpc.phys, core->rpc.length, MEMREMAP_WC);
562 memset(core->rpc.virt, 0, core->rpc.length);
564 ret = vpu_iface_check_memory_region(core, core->rpc.phys, core->rpc.length);
565 if (ret != VPU_CORE_MEMORY_UNCACHED) {
566 dev_err(core->dev, "rpc region<%pad, 0x%x> isn't uncached\n",
567 &core->rpc.phys, core->rpc.length);
572 core->log.phys = core->rpc.phys + core->res->rpc_size;
573 core->log.virt = core->rpc.virt + core->res->rpc_size;
574 core->log.length = core->res->fwlog_size;
575 core->act.phys = core->log.phys + core->log.length;
576 core->act.virt = core->log.virt + core->log.length;
577 core->act.length = core->rpc.length - core->res->rpc_size - core->log.length;
578 core->rpc.length = core->res->rpc_size;
585 static int vpu_core_probe(struct platform_device *pdev)
587 struct device *dev = &pdev->dev;
588 struct vpu_core *core;
589 struct vpu_dev *vpu = dev_get_drvdata(dev->parent);
590 struct vpu_shared_addr *iface;
594 dev_dbg(dev, "probe\n");
597 core = devm_kzalloc(dev, sizeof(*core), GFP_KERNEL);
603 platform_set_drvdata(pdev, core);
605 INIT_LIST_HEAD(&core->instances);
606 mutex_init(&core->lock);
607 mutex_init(&core->cmd_lock);
608 init_completion(&core->cmp);
609 init_waitqueue_head(&core->ack_wq);
610 core->state = VPU_CORE_DEINIT;
612 core->res = of_device_get_match_data(dev);
616 core->type = core->res->type;
617 core->id = of_alias_get_id(dev->of_node, "vpu_core");
619 dev_err(dev, "can't get vpu core id\n");
622 dev_info(core->dev, "[%d] = %s\n", core->id, vpu_core_type_desc(core->type));
623 ret = vpu_core_parse_dt(core, dev->of_node);
627 core->base = devm_platform_ioremap_resource(pdev, 0);
628 if (IS_ERR(core->base))
629 return PTR_ERR(core->base);
631 if (!vpu_iface_check_codec(core)) {
632 dev_err(core->dev, "is not supported\n");
636 ret = vpu_mbox_init(core);
640 iface = devm_kzalloc(dev, sizeof(*iface), GFP_KERNEL);
644 iface_data_size = vpu_iface_get_data_size(core);
645 if (iface_data_size) {
646 iface->priv = devm_kzalloc(dev, iface_data_size, GFP_KERNEL);
651 ret = vpu_iface_init(core, iface, &core->rpc, core->fw.phys);
653 dev_err(core->dev, "init iface fail, ret = %d\n", ret);
657 vpu_iface_config_system(core, vpu->res->mreg_base, vpu->base);
658 vpu_iface_set_log_buf(core, &core->log);
660 pm_runtime_enable(dev);
661 ret = pm_runtime_resume_and_get(dev);
663 pm_runtime_put_noidle(dev);
664 pm_runtime_set_suspended(dev);
665 goto err_runtime_disable;
668 ret = vpu_core_register(dev->parent, core);
670 goto err_core_register;
671 core->parent = dev->parent;
673 pm_runtime_put_sync(dev);
674 vpu_core_create_dbgfs_file(core);
679 pm_runtime_put_sync(dev);
681 pm_runtime_disable(dev);
686 static int vpu_core_remove(struct platform_device *pdev)
688 struct device *dev = &pdev->dev;
689 struct vpu_core *core = platform_get_drvdata(pdev);
692 vpu_core_remove_dbgfs_file(core);
693 ret = pm_runtime_resume_and_get(dev);
696 vpu_core_shutdown(core);
697 pm_runtime_put_sync(dev);
698 pm_runtime_disable(dev);
700 vpu_core_unregister(core->parent, core);
701 memunmap(core->fw.virt);
702 memunmap(core->rpc.virt);
703 mutex_destroy(&core->lock);
704 mutex_destroy(&core->cmd_lock);
709 static int __maybe_unused vpu_core_runtime_resume(struct device *dev)
711 struct vpu_core *core = dev_get_drvdata(dev);
713 return vpu_mbox_request(core);
716 static int __maybe_unused vpu_core_runtime_suspend(struct device *dev)
718 struct vpu_core *core = dev_get_drvdata(dev);
724 static void vpu_core_cancel_work(struct vpu_core *core)
726 struct vpu_inst *inst = NULL;
728 cancel_work_sync(&core->msg_work);
729 cancel_delayed_work_sync(&core->msg_delayed_work);
731 mutex_lock(&core->lock);
732 list_for_each_entry(inst, &core->instances, list)
733 cancel_work_sync(&inst->msg_work);
734 mutex_unlock(&core->lock);
737 static void vpu_core_resume_work(struct vpu_core *core)
739 struct vpu_inst *inst = NULL;
740 unsigned long delay = msecs_to_jiffies(10);
742 queue_work(core->workqueue, &core->msg_work);
743 queue_delayed_work(core->workqueue, &core->msg_delayed_work, delay);
745 mutex_lock(&core->lock);
746 list_for_each_entry(inst, &core->instances, list)
747 queue_work(inst->workqueue, &inst->msg_work);
748 mutex_unlock(&core->lock);
751 static int __maybe_unused vpu_core_resume(struct device *dev)
753 struct vpu_core *core = dev_get_drvdata(dev);
756 mutex_lock(&core->lock);
757 pm_runtime_resume_and_get(dev);
758 vpu_core_get_vpu(core);
759 if (core->state != VPU_CORE_SNAPSHOT)
762 if (!vpu_iface_get_power_state(core)) {
763 if (!list_empty(&core->instances)) {
764 ret = vpu_core_boot(core, false);
766 dev_err(core->dev, "%s boot fail\n", __func__);
767 core->state = VPU_CORE_DEINIT;
771 core->state = VPU_CORE_DEINIT;
774 if (!list_empty(&core->instances)) {
775 ret = vpu_core_sw_reset(core);
777 dev_err(core->dev, "%s sw_reset fail\n", __func__);
778 core->state = VPU_CORE_HANG;
782 core->state = VPU_CORE_ACTIVE;
786 pm_runtime_put_sync(dev);
787 mutex_unlock(&core->lock);
789 vpu_core_resume_work(core);
793 static int __maybe_unused vpu_core_suspend(struct device *dev)
795 struct vpu_core *core = dev_get_drvdata(dev);
798 mutex_lock(&core->lock);
799 if (core->state == VPU_CORE_ACTIVE) {
800 if (!list_empty(&core->instances)) {
801 ret = vpu_core_snapshot(core);
803 mutex_unlock(&core->lock);
808 core->state = VPU_CORE_SNAPSHOT;
810 mutex_unlock(&core->lock);
812 vpu_core_cancel_work(core);
814 mutex_lock(&core->lock);
815 vpu_core_put_vpu(core);
816 mutex_unlock(&core->lock);
820 static const struct dev_pm_ops vpu_core_pm_ops = {
821 SET_RUNTIME_PM_OPS(vpu_core_runtime_suspend, vpu_core_runtime_resume, NULL)
822 SET_SYSTEM_SLEEP_PM_OPS(vpu_core_suspend, vpu_core_resume)
825 static struct vpu_core_resources imx8q_enc = {
826 .type = VPU_CORE_TYPE_ENC,
827 .fwname = "/*(DEBLOBBED)*/",
836 .fwlog_size = 0x80000,
840 static struct vpu_core_resources imx8q_dec = {
841 .type = VPU_CORE_TYPE_DEC,
842 .fwname = "/*(DEBLOBBED)*/",
851 .fwlog_size = 0x80000,
854 static const struct of_device_id vpu_core_dt_match[] = {
855 { .compatible = "nxp,imx8q-vpu-encoder", .data = &imx8q_enc },
856 { .compatible = "nxp,imx8q-vpu-decoder", .data = &imx8q_dec },
859 MODULE_DEVICE_TABLE(of, vpu_core_dt_match);
861 static struct platform_driver amphion_vpu_core_driver = {
862 .probe = vpu_core_probe,
863 .remove = vpu_core_remove,
865 .name = "amphion-vpu-core",
866 .of_match_table = vpu_core_dt_match,
867 .pm = &vpu_core_pm_ops,
871 int __init vpu_core_driver_init(void)
873 return platform_driver_register(&hion_vpu_core_driver);
876 void __exit vpu_core_driver_exit(void)
878 platform_driver_unregister(&hion_vpu_core_driver);