.. | .. |
---|
33 | 33 | #include <linux/pm_runtime.h> |
---|
34 | 34 | #include <linux/devfreq_cooling.h> |
---|
35 | 35 | #include <linux/regmap.h> |
---|
36 | | -#include <linux/dma-iommu.h> |
---|
37 | 36 | #include <linux/of_address.h> |
---|
38 | 37 | |
---|
39 | 38 | #ifndef FPGA_PLATFORM |
---|
.. | .. |
---|
118 | 117 | .num_irqs = ARRAY_SIZE(rknpu_irqs), |
---|
119 | 118 | .num_resets = ARRAY_SIZE(rknpu_resets), |
---|
120 | 119 | .nbuf_phyaddr = 0, |
---|
121 | | - .nbuf_size = 0 |
---|
| 120 | + .nbuf_size = 0, |
---|
| 121 | + .max_submit_number = (1 << 12) - 1 |
---|
122 | 122 | }; |
---|
123 | 123 | |
---|
124 | 124 | static const struct rknpu_config rk3588_rknpu_config = { |
---|
.. | .. |
---|
136 | 136 | .num_irqs = ARRAY_SIZE(rk3588_npu_irqs), |
---|
137 | 137 | .num_resets = ARRAY_SIZE(rk3588_npu_resets), |
---|
138 | 138 | .nbuf_phyaddr = 0, |
---|
139 | | - .nbuf_size = 0 |
---|
| 139 | + .nbuf_size = 0, |
---|
| 140 | + .max_submit_number = (1 << 12) - 1 |
---|
140 | 141 | }; |
---|
141 | 142 | |
---|
142 | 143 | static const struct rknpu_config rv1106_rknpu_config = { |
---|
.. | .. |
---|
154 | 155 | .num_irqs = ARRAY_SIZE(rknpu_irqs), |
---|
155 | 156 | .num_resets = ARRAY_SIZE(rknpu_resets), |
---|
156 | 157 | .nbuf_phyaddr = 0, |
---|
157 | | - .nbuf_size = 0 |
---|
| 158 | + .nbuf_size = 0, |
---|
| 159 | + .max_submit_number = (1 << 16) - 1 |
---|
158 | 160 | }; |
---|
159 | 161 | |
---|
160 | 162 | static const struct rknpu_config rk3562_rknpu_config = { |
---|
.. | .. |
---|
172 | 174 | .num_irqs = ARRAY_SIZE(rknpu_irqs), |
---|
173 | 175 | .num_resets = ARRAY_SIZE(rknpu_resets), |
---|
174 | 176 | .nbuf_phyaddr = 0xfe400000, |
---|
175 | | - .nbuf_size = 256 * 1024 |
---|
| 177 | + .nbuf_size = 256 * 1024, |
---|
| 178 | + .max_submit_number = (1 << 16) - 1 |
---|
176 | 179 | }; |
---|
177 | 180 | |
---|
178 | 181 | /* driver probe and init */ |
---|
.. | .. |
---|
225 | 228 | { |
---|
226 | 229 | int ret = 0; |
---|
227 | 230 | |
---|
228 | | - cancel_delayed_work(&rknpu_dev->power_off_work); |
---|
229 | 231 | mutex_lock(&rknpu_dev->power_lock); |
---|
230 | 232 | if (atomic_inc_return(&rknpu_dev->power_refcount) == 1) |
---|
231 | 233 | ret = rknpu_power_on(rknpu_dev); |
---|
.. | .. |
---|
248 | 250 | |
---|
249 | 251 | static int rknpu_power_put_delay(struct rknpu_device *rknpu_dev) |
---|
250 | 252 | { |
---|
| 253 | + if (rknpu_dev->power_put_delay == 0) |
---|
| 254 | + return rknpu_power_put(rknpu_dev); |
---|
| 255 | + |
---|
251 | 256 | mutex_lock(&rknpu_dev->power_lock); |
---|
252 | 257 | if (atomic_read(&rknpu_dev->power_refcount) == 1) |
---|
253 | 258 | queue_delayed_work( |
---|
.. | .. |
---|
256 | 261 | else |
---|
257 | 262 | atomic_dec_if_positive(&rknpu_dev->power_refcount); |
---|
258 | 263 | mutex_unlock(&rknpu_dev->power_lock); |
---|
| 264 | + |
---|
259 | 265 | return 0; |
---|
260 | 266 | } |
---|
261 | 267 | |
---|
.. | .. |
---|
489 | 495 | #endif |
---|
490 | 496 | |
---|
491 | 497 | #ifdef CONFIG_ROCKCHIP_RKNPU_DRM_GEM |
---|
| 498 | +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
492 | 499 | static const struct vm_operations_struct rknpu_gem_vm_ops = { |
---|
493 | 500 | .fault = rknpu_gem_fault, |
---|
494 | 501 | .open = drm_gem_vm_open, |
---|
495 | 502 | .close = drm_gem_vm_close, |
---|
496 | 503 | }; |
---|
| 504 | +#endif |
---|
497 | 505 | |
---|
498 | 506 | static int rknpu_action_ioctl(struct drm_device *dev, void *data, |
---|
499 | 507 | struct drm_file *file_priv) |
---|
.. | .. |
---|
535 | 543 | DRM_RENDER_ALLOW), |
---|
536 | 544 | }; |
---|
537 | 545 | |
---|
| 546 | +#if KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE |
---|
| 547 | +DEFINE_DRM_GEM_FOPS(rknpu_drm_driver_fops); |
---|
| 548 | +#else |
---|
538 | 549 | static const struct file_operations rknpu_drm_driver_fops = { |
---|
539 | 550 | .owner = THIS_MODULE, |
---|
540 | 551 | .open = drm_open, |
---|
.. | .. |
---|
548 | 559 | .release = drm_release, |
---|
549 | 560 | .llseek = noop_llseek, |
---|
550 | 561 | }; |
---|
| 562 | +#endif |
---|
551 | 563 | |
---|
552 | 564 | static struct drm_driver rknpu_drm_driver = { |
---|
553 | 565 | #if KERNEL_VERSION(5, 4, 0) <= LINUX_VERSION_CODE |
---|
.. | .. |
---|
555 | 567 | #else |
---|
556 | 568 | .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER, |
---|
557 | 569 | #endif |
---|
| 570 | +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
558 | 571 | .gem_free_object_unlocked = rknpu_gem_free_object, |
---|
559 | 572 | .gem_vm_ops = &rknpu_gem_vm_ops, |
---|
| 573 | + .dumb_destroy = drm_gem_dumb_destroy, |
---|
| 574 | + .gem_prime_export = drm_gem_prime_export, |
---|
| 575 | + .gem_prime_get_sg_table = rknpu_gem_prime_get_sg_table, |
---|
| 576 | + .gem_prime_vmap = rknpu_gem_prime_vmap, |
---|
| 577 | + .gem_prime_vunmap = rknpu_gem_prime_vunmap, |
---|
| 578 | +#endif |
---|
560 | 579 | .dumb_create = rknpu_gem_dumb_create, |
---|
561 | 580 | #if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE |
---|
562 | 581 | .dumb_map_offset = rknpu_gem_dumb_map_offset, |
---|
563 | 582 | #else |
---|
564 | 583 | .dumb_map_offset = drm_gem_dumb_map_offset, |
---|
565 | 584 | #endif |
---|
566 | | - .dumb_destroy = drm_gem_dumb_destroy, |
---|
567 | 585 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, |
---|
568 | 586 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, |
---|
569 | | - .gem_prime_export = drm_gem_prime_export, |
---|
570 | 587 | #if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE |
---|
571 | 588 | .gem_prime_import = rknpu_gem_prime_import, |
---|
572 | 589 | #else |
---|
573 | 590 | .gem_prime_import = drm_gem_prime_import, |
---|
574 | 591 | #endif |
---|
575 | | - .gem_prime_get_sg_table = rknpu_gem_prime_get_sg_table, |
---|
576 | 592 | .gem_prime_import_sg_table = rknpu_gem_prime_import_sg_table, |
---|
577 | | - .gem_prime_vmap = rknpu_gem_prime_vmap, |
---|
578 | | - .gem_prime_vunmap = rknpu_gem_prime_vunmap, |
---|
| 593 | +#if KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE |
---|
| 594 | + .gem_prime_mmap = drm_gem_prime_mmap, |
---|
| 595 | +#else |
---|
579 | 596 | .gem_prime_mmap = rknpu_gem_prime_mmap, |
---|
| 597 | +#endif |
---|
580 | 598 | .ioctls = rknpu_ioctls, |
---|
581 | 599 | .num_ioctls = ARRAY_SIZE(rknpu_ioctls), |
---|
582 | 600 | .fops = &rknpu_drm_driver_fops, |
---|
.. | .. |
---|
596 | 614 | container_of(timer, struct rknpu_device, timer); |
---|
597 | 615 | struct rknpu_subcore_data *subcore_data = NULL; |
---|
598 | 616 | struct rknpu_job *job = NULL; |
---|
599 | | - ktime_t now = ktime_get(); |
---|
| 617 | + ktime_t now; |
---|
600 | 618 | unsigned long flags; |
---|
601 | 619 | int i; |
---|
602 | 620 | |
---|
.. | .. |
---|
607 | 625 | |
---|
608 | 626 | job = subcore_data->job; |
---|
609 | 627 | if (job) { |
---|
| 628 | + now = ktime_get(); |
---|
610 | 629 | subcore_data->timer.busy_time += |
---|
611 | 630 | ktime_us_delta(now, job->hw_recoder_time); |
---|
612 | | - job->hw_recoder_time = ktime_get(); |
---|
| 631 | + job->hw_recoder_time = now; |
---|
613 | 632 | } |
---|
614 | 633 | |
---|
615 | 634 | subcore_data->timer.busy_time_record = |
---|
.. | .. |
---|
661 | 680 | } |
---|
662 | 681 | |
---|
663 | 682 | #ifdef CONFIG_ROCKCHIP_RKNPU_DRM_GEM |
---|
| 683 | +static int drm_fake_dev_register(struct rknpu_device *rknpu_dev) |
---|
| 684 | +{ |
---|
| 685 | + const struct platform_device_info rknpu_dev_info = { |
---|
| 686 | + .name = "rknpu_dev", |
---|
| 687 | + .id = PLATFORM_DEVID_AUTO, |
---|
| 688 | + .dma_mask = rknpu_dev->config->dma_mask, |
---|
| 689 | + }; |
---|
| 690 | + struct platform_device *pdev = NULL; |
---|
| 691 | + int ret = -EINVAL; |
---|
| 692 | + |
---|
| 693 | + pdev = platform_device_register_full(&rknpu_dev_info); |
---|
| 694 | + if (pdev) { |
---|
| 695 | + ret = of_dma_configure(&pdev->dev, NULL, true); |
---|
| 696 | + if (ret) { |
---|
| 697 | + platform_device_unregister(pdev); |
---|
| 698 | + pdev = NULL; |
---|
| 699 | + } |
---|
| 700 | + } |
---|
| 701 | + |
---|
| 702 | + rknpu_dev->fake_dev = pdev ? &pdev->dev : NULL; |
---|
| 703 | + |
---|
| 704 | + return ret; |
---|
| 705 | +} |
---|
| 706 | + |
---|
| 707 | +static void drm_fake_dev_unregister(struct rknpu_device *rknpu_dev) |
---|
| 708 | +{ |
---|
| 709 | + struct platform_device *pdev = NULL; |
---|
| 710 | + |
---|
| 711 | + if (!rknpu_dev->fake_dev) |
---|
| 712 | + return; |
---|
| 713 | + |
---|
| 714 | + pdev = to_platform_device(rknpu_dev->fake_dev); |
---|
| 715 | + |
---|
| 716 | + platform_device_unregister(pdev); |
---|
| 717 | +} |
---|
| 718 | + |
---|
664 | 719 | static int rknpu_drm_probe(struct rknpu_device *rknpu_dev) |
---|
665 | 720 | { |
---|
666 | 721 | struct device *dev = rknpu_dev->dev; |
---|
.. | .. |
---|
679 | 734 | drm_dev->dev_private = rknpu_dev; |
---|
680 | 735 | rknpu_dev->drm_dev = drm_dev; |
---|
681 | 736 | |
---|
| 737 | + drm_fake_dev_register(rknpu_dev); |
---|
| 738 | + |
---|
682 | 739 | return 0; |
---|
683 | 740 | |
---|
684 | 741 | err_free_drm: |
---|
.. | .. |
---|
694 | 751 | static void rknpu_drm_remove(struct rknpu_device *rknpu_dev) |
---|
695 | 752 | { |
---|
696 | 753 | struct drm_device *drm_dev = rknpu_dev->drm_dev; |
---|
| 754 | + |
---|
| 755 | + drm_fake_dev_unregister(rknpu_dev); |
---|
697 | 756 | |
---|
698 | 757 | drm_dev_unregister(drm_dev); |
---|
699 | 758 | |
---|
.. | .. |
---|
742 | 801 | } |
---|
743 | 802 | |
---|
744 | 803 | #ifndef FPGA_PLATFORM |
---|
745 | | -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE |
---|
| 804 | +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ |
---|
| 805 | + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
746 | 806 | rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info); |
---|
747 | 807 | #endif |
---|
748 | 808 | #endif |
---|
.. | .. |
---|
803 | 863 | |
---|
804 | 864 | out: |
---|
805 | 865 | #ifndef FPGA_PLATFORM |
---|
806 | | -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE |
---|
| 866 | +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ |
---|
| 867 | + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
807 | 868 | rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info); |
---|
808 | 869 | #endif |
---|
809 | 870 | #endif |
---|
.. | .. |
---|
819 | 880 | int ret; |
---|
820 | 881 | bool val; |
---|
821 | 882 | |
---|
822 | | -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE |
---|
| 883 | +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ |
---|
| 884 | + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
823 | 885 | rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info); |
---|
824 | 886 | #endif |
---|
825 | 887 | #endif |
---|
.. | .. |
---|
843 | 905 | if (ret) { |
---|
844 | 906 | LOG_DEV_ERROR(dev, "iommu still enabled\n"); |
---|
845 | 907 | pm_runtime_get_sync(dev); |
---|
846 | | -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE |
---|
| 908 | +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ |
---|
| 909 | + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
847 | 910 | rockchip_monitor_volt_adjust_unlock( |
---|
848 | 911 | rknpu_dev->mdev_info); |
---|
849 | 912 | #endif |
---|
.. | .. |
---|
862 | 925 | } |
---|
863 | 926 | |
---|
864 | 927 | #ifndef FPGA_PLATFORM |
---|
865 | | -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE |
---|
| 928 | +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ |
---|
| 929 | + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
866 | 930 | rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info); |
---|
867 | 931 | #endif |
---|
868 | 932 | #endif |
---|
.. | .. |
---|
881 | 945 | } |
---|
882 | 946 | |
---|
883 | 947 | #ifndef FPGA_PLATFORM |
---|
| 948 | +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
884 | 949 | static struct monitor_dev_profile npu_mdevp = { |
---|
885 | 950 | .type = MONITOR_TYPE_DEV, |
---|
886 | 951 | .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, |
---|
.. | .. |
---|
1143 | 1208 | .get_dev_status = npu_devfreq_get_dev_status, |
---|
1144 | 1209 | .get_cur_freq = npu_devfreq_get_cur_freq, |
---|
1145 | 1210 | }; |
---|
| 1211 | +#endif |
---|
1146 | 1212 | |
---|
1147 | 1213 | #ifdef CONFIG_PM_DEVFREQ |
---|
1148 | 1214 | static int devfreq_rknpu_ondemand_func(struct devfreq *df, unsigned long *freq) |
---|
.. | .. |
---|
1170 | 1236 | }; |
---|
1171 | 1237 | #endif |
---|
1172 | 1238 | |
---|
| 1239 | +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
1173 | 1240 | static unsigned long npu_get_static_power(struct devfreq *devfreq, |
---|
1174 | 1241 | unsigned long voltage) |
---|
1175 | 1242 | { |
---|
.. | .. |
---|
1543 | 1610 | return ret; |
---|
1544 | 1611 | } |
---|
1545 | 1612 | #endif |
---|
| 1613 | +#endif |
---|
1546 | 1614 | |
---|
1547 | 1615 | static int rknpu_devfreq_remove(struct rknpu_device *rknpu_dev) |
---|
1548 | 1616 | { |
---|
.. | .. |
---|
1565 | 1633 | { |
---|
1566 | 1634 | const struct rknpu_config *config = rknpu_dev->config; |
---|
1567 | 1635 | struct device *dev = &pdev->dev; |
---|
| 1636 | +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
1568 | 1637 | struct resource *res; |
---|
| 1638 | +#endif |
---|
1569 | 1639 | int i, ret, irq; |
---|
1570 | 1640 | |
---|
| 1641 | +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
1571 | 1642 | res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, |
---|
1572 | 1643 | config->irqs[0].name); |
---|
1573 | 1644 | if (res) { |
---|
.. | .. |
---|
1606 | 1677 | return ret; |
---|
1607 | 1678 | } |
---|
1608 | 1679 | } |
---|
| 1680 | +#else |
---|
| 1681 | + /* there are irq names in dts */ |
---|
| 1682 | + for (i = 0; i < config->num_irqs; i++) { |
---|
| 1683 | + irq = platform_get_irq_byname(pdev, config->irqs[i].name); |
---|
| 1684 | + if (irq < 0) { |
---|
| 1685 | + LOG_DEV_ERROR(dev, "no npu %s in dts\n", |
---|
| 1686 | + config->irqs[i].name); |
---|
| 1687 | + return irq; |
---|
| 1688 | + } |
---|
| 1689 | + |
---|
| 1690 | + ret = devm_request_irq(dev, irq, config->irqs[i].irq_hdl, |
---|
| 1691 | + IRQF_SHARED, dev_name(dev), rknpu_dev); |
---|
| 1692 | + if (ret < 0) { |
---|
| 1693 | + LOG_DEV_ERROR(dev, "request %s failed: %d\n", |
---|
| 1694 | + config->irqs[i].name, ret); |
---|
| 1695 | + return ret; |
---|
| 1696 | + } |
---|
| 1697 | + } |
---|
| 1698 | +#endif |
---|
1609 | 1699 | |
---|
1610 | 1700 | return 0; |
---|
1611 | 1701 | } |
---|
.. | .. |
---|
1744 | 1834 | } |
---|
1745 | 1835 | |
---|
1746 | 1836 | #ifndef FPGA_PLATFORM |
---|
1747 | | -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE |
---|
| 1837 | +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ |
---|
| 1838 | + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
1748 | 1839 | if (strstr(__clk_get_name(rknpu_dev->clks[0].clk), "scmi")) |
---|
1749 | 1840 | rknpu_dev->opp_info.scmi_clk = rknpu_dev->clks[0].clk; |
---|
1750 | 1841 | #endif |
---|
.. | .. |
---|
1886 | 1977 | goto err_remove_drv; |
---|
1887 | 1978 | |
---|
1888 | 1979 | #ifndef FPGA_PLATFORM |
---|
| 1980 | +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
1889 | 1981 | rknpu_devfreq_init(rknpu_dev); |
---|
| 1982 | +#endif |
---|
1890 | 1983 | #endif |
---|
1891 | 1984 | |
---|
1892 | 1985 | // set default power put delay to 3s |
---|
.. | .. |
---|
1995 | 2088 | } |
---|
1996 | 2089 | |
---|
1997 | 2090 | #ifndef FPGA_PLATFORM |
---|
1998 | | -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE |
---|
| 2091 | +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ |
---|
| 2092 | + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
1999 | 2093 | static int rknpu_runtime_suspend(struct device *dev) |
---|
2000 | 2094 | { |
---|
2001 | 2095 | struct rknpu_device *rknpu_dev = dev_get_drvdata(dev); |
---|
.. | .. |
---|
2054 | 2148 | .owner = THIS_MODULE, |
---|
2055 | 2149 | .name = "RKNPU", |
---|
2056 | 2150 | #ifndef FPGA_PLATFORM |
---|
2057 | | -#if KERNEL_VERSION(5, 5, 0) < LINUX_VERSION_CODE |
---|
| 2151 | +#if KERNEL_VERSION(5, 5, 0) < LINUX_VERSION_CODE && \ |
---|
| 2152 | + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE |
---|
2058 | 2153 | .pm = &rknpu_pm_ops, |
---|
2059 | 2154 | #endif |
---|
2060 | 2155 | #endif |
---|
.. | .. |
---|
2081 | 2176 | MODULE_LICENSE("GPL v2"); |
---|
2082 | 2177 | MODULE_VERSION(RKNPU_GET_DRV_VERSION_STRING(DRIVER_MAJOR, DRIVER_MINOR, |
---|
2083 | 2178 | DRIVER_PATCHLEVEL)); |
---|
| 2179 | +#if KERNEL_VERSION(5, 16, 0) < LINUX_VERSION_CODE |
---|
| 2180 | +MODULE_IMPORT_NS(DMA_BUF); |
---|
| 2181 | +#endif |
---|