hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/rknpu/rknpu_drv.c
....@@ -33,7 +33,6 @@
3333 #include <linux/pm_runtime.h>
3434 #include <linux/devfreq_cooling.h>
3535 #include <linux/regmap.h>
36
-#include <linux/dma-iommu.h>
3736 #include <linux/of_address.h>
3837
3938 #ifndef FPGA_PLATFORM
....@@ -118,7 +117,8 @@
118117 .num_irqs = ARRAY_SIZE(rknpu_irqs),
119118 .num_resets = ARRAY_SIZE(rknpu_resets),
120119 .nbuf_phyaddr = 0,
121
- .nbuf_size = 0
120
+ .nbuf_size = 0,
121
+ .max_submit_number = (1 << 12) - 1
122122 };
123123
124124 static const struct rknpu_config rk3588_rknpu_config = {
....@@ -136,7 +136,8 @@
136136 .num_irqs = ARRAY_SIZE(rk3588_npu_irqs),
137137 .num_resets = ARRAY_SIZE(rk3588_npu_resets),
138138 .nbuf_phyaddr = 0,
139
- .nbuf_size = 0
139
+ .nbuf_size = 0,
140
+ .max_submit_number = (1 << 12) - 1
140141 };
141142
142143 static const struct rknpu_config rv1106_rknpu_config = {
....@@ -154,7 +155,8 @@
154155 .num_irqs = ARRAY_SIZE(rknpu_irqs),
155156 .num_resets = ARRAY_SIZE(rknpu_resets),
156157 .nbuf_phyaddr = 0,
157
- .nbuf_size = 0
158
+ .nbuf_size = 0,
159
+ .max_submit_number = (1 << 16) - 1
158160 };
159161
160162 static const struct rknpu_config rk3562_rknpu_config = {
....@@ -172,7 +174,8 @@
172174 .num_irqs = ARRAY_SIZE(rknpu_irqs),
173175 .num_resets = ARRAY_SIZE(rknpu_resets),
174176 .nbuf_phyaddr = 0xfe400000,
175
- .nbuf_size = 256 * 1024
177
+ .nbuf_size = 256 * 1024,
178
+ .max_submit_number = (1 << 16) - 1
176179 };
177180
178181 /* driver probe and init */
....@@ -225,7 +228,6 @@
225228 {
226229 int ret = 0;
227230
228
- cancel_delayed_work(&rknpu_dev->power_off_work);
229231 mutex_lock(&rknpu_dev->power_lock);
230232 if (atomic_inc_return(&rknpu_dev->power_refcount) == 1)
231233 ret = rknpu_power_on(rknpu_dev);
....@@ -248,6 +250,9 @@
248250
249251 static int rknpu_power_put_delay(struct rknpu_device *rknpu_dev)
250252 {
253
+ if (rknpu_dev->power_put_delay == 0)
254
+ return rknpu_power_put(rknpu_dev);
255
+
251256 mutex_lock(&rknpu_dev->power_lock);
252257 if (atomic_read(&rknpu_dev->power_refcount) == 1)
253258 queue_delayed_work(
....@@ -256,6 +261,7 @@
256261 else
257262 atomic_dec_if_positive(&rknpu_dev->power_refcount);
258263 mutex_unlock(&rknpu_dev->power_lock);
264
+
259265 return 0;
260266 }
261267
....@@ -489,11 +495,13 @@
489495 #endif
490496
491497 #ifdef CONFIG_ROCKCHIP_RKNPU_DRM_GEM
498
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
492499 static const struct vm_operations_struct rknpu_gem_vm_ops = {
493500 .fault = rknpu_gem_fault,
494501 .open = drm_gem_vm_open,
495502 .close = drm_gem_vm_close,
496503 };
504
+#endif
497505
498506 static int rknpu_action_ioctl(struct drm_device *dev, void *data,
499507 struct drm_file *file_priv)
....@@ -535,6 +543,9 @@
535543 DRM_RENDER_ALLOW),
536544 };
537545
546
+#if KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE
547
+DEFINE_DRM_GEM_FOPS(rknpu_drm_driver_fops);
548
+#else
538549 static const struct file_operations rknpu_drm_driver_fops = {
539550 .owner = THIS_MODULE,
540551 .open = drm_open,
....@@ -548,6 +559,7 @@
548559 .release = drm_release,
549560 .llseek = noop_llseek,
550561 };
562
+#endif
551563
552564 static struct drm_driver rknpu_drm_driver = {
553565 #if KERNEL_VERSION(5, 4, 0) <= LINUX_VERSION_CODE
....@@ -555,28 +567,34 @@
555567 #else
556568 .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER,
557569 #endif
570
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
558571 .gem_free_object_unlocked = rknpu_gem_free_object,
559572 .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
560579 .dumb_create = rknpu_gem_dumb_create,
561580 #if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
562581 .dumb_map_offset = rknpu_gem_dumb_map_offset,
563582 #else
564583 .dumb_map_offset = drm_gem_dumb_map_offset,
565584 #endif
566
- .dumb_destroy = drm_gem_dumb_destroy,
567585 .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
568586 .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
569
- .gem_prime_export = drm_gem_prime_export,
570587 #if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE
571588 .gem_prime_import = rknpu_gem_prime_import,
572589 #else
573590 .gem_prime_import = drm_gem_prime_import,
574591 #endif
575
- .gem_prime_get_sg_table = rknpu_gem_prime_get_sg_table,
576592 .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
579596 .gem_prime_mmap = rknpu_gem_prime_mmap,
597
+#endif
580598 .ioctls = rknpu_ioctls,
581599 .num_ioctls = ARRAY_SIZE(rknpu_ioctls),
582600 .fops = &rknpu_drm_driver_fops,
....@@ -596,7 +614,7 @@
596614 container_of(timer, struct rknpu_device, timer);
597615 struct rknpu_subcore_data *subcore_data = NULL;
598616 struct rknpu_job *job = NULL;
599
- ktime_t now = ktime_get();
617
+ ktime_t now;
600618 unsigned long flags;
601619 int i;
602620
....@@ -607,9 +625,10 @@
607625
608626 job = subcore_data->job;
609627 if (job) {
628
+ now = ktime_get();
610629 subcore_data->timer.busy_time +=
611630 ktime_us_delta(now, job->hw_recoder_time);
612
- job->hw_recoder_time = ktime_get();
631
+ job->hw_recoder_time = now;
613632 }
614633
615634 subcore_data->timer.busy_time_record =
....@@ -661,6 +680,42 @@
661680 }
662681
663682 #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
+
664719 static int rknpu_drm_probe(struct rknpu_device *rknpu_dev)
665720 {
666721 struct device *dev = rknpu_dev->dev;
....@@ -679,6 +734,8 @@
679734 drm_dev->dev_private = rknpu_dev;
680735 rknpu_dev->drm_dev = drm_dev;
681736
737
+ drm_fake_dev_register(rknpu_dev);
738
+
682739 return 0;
683740
684741 err_free_drm:
....@@ -694,6 +751,8 @@
694751 static void rknpu_drm_remove(struct rknpu_device *rknpu_dev)
695752 {
696753 struct drm_device *drm_dev = rknpu_dev->drm_dev;
754
+
755
+ drm_fake_dev_unregister(rknpu_dev);
697756
698757 drm_dev_unregister(drm_dev);
699758
....@@ -742,7 +801,8 @@
742801 }
743802
744803 #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
746806 rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info);
747807 #endif
748808 #endif
....@@ -803,7 +863,8 @@
803863
804864 out:
805865 #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
807868 rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info);
808869 #endif
809870 #endif
....@@ -819,7 +880,8 @@
819880 int ret;
820881 bool val;
821882
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
823885 rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info);
824886 #endif
825887 #endif
....@@ -843,7 +905,8 @@
843905 if (ret) {
844906 LOG_DEV_ERROR(dev, "iommu still enabled\n");
845907 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
847910 rockchip_monitor_volt_adjust_unlock(
848911 rknpu_dev->mdev_info);
849912 #endif
....@@ -862,7 +925,8 @@
862925 }
863926
864927 #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
866930 rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info);
867931 #endif
868932 #endif
....@@ -881,6 +945,7 @@
881945 }
882946
883947 #ifndef FPGA_PLATFORM
948
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
884949 static struct monitor_dev_profile npu_mdevp = {
885950 .type = MONITOR_TYPE_DEV,
886951 .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust,
....@@ -1143,6 +1208,7 @@
11431208 .get_dev_status = npu_devfreq_get_dev_status,
11441209 .get_cur_freq = npu_devfreq_get_cur_freq,
11451210 };
1211
+#endif
11461212
11471213 #ifdef CONFIG_PM_DEVFREQ
11481214 static int devfreq_rknpu_ondemand_func(struct devfreq *df, unsigned long *freq)
....@@ -1170,6 +1236,7 @@
11701236 };
11711237 #endif
11721238
1239
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
11731240 static unsigned long npu_get_static_power(struct devfreq *devfreq,
11741241 unsigned long voltage)
11751242 {
....@@ -1543,6 +1610,7 @@
15431610 return ret;
15441611 }
15451612 #endif
1613
+#endif
15461614
15471615 static int rknpu_devfreq_remove(struct rknpu_device *rknpu_dev)
15481616 {
....@@ -1565,9 +1633,12 @@
15651633 {
15661634 const struct rknpu_config *config = rknpu_dev->config;
15671635 struct device *dev = &pdev->dev;
1636
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
15681637 struct resource *res;
1638
+#endif
15691639 int i, ret, irq;
15701640
1641
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
15711642 res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
15721643 config->irqs[0].name);
15731644 if (res) {
....@@ -1606,6 +1677,25 @@
16061677 return ret;
16071678 }
16081679 }
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
16091699
16101700 return 0;
16111701 }
....@@ -1744,7 +1834,8 @@
17441834 }
17451835
17461836 #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
17481839 if (strstr(__clk_get_name(rknpu_dev->clks[0].clk), "scmi"))
17491840 rknpu_dev->opp_info.scmi_clk = rknpu_dev->clks[0].clk;
17501841 #endif
....@@ -1886,7 +1977,9 @@
18861977 goto err_remove_drv;
18871978
18881979 #ifndef FPGA_PLATFORM
1980
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
18891981 rknpu_devfreq_init(rknpu_dev);
1982
+#endif
18901983 #endif
18911984
18921985 // set default power put delay to 3s
....@@ -1995,7 +2088,8 @@
19952088 }
19962089
19972090 #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
19992093 static int rknpu_runtime_suspend(struct device *dev)
20002094 {
20012095 struct rknpu_device *rknpu_dev = dev_get_drvdata(dev);
....@@ -2054,7 +2148,8 @@
20542148 .owner = THIS_MODULE,
20552149 .name = "RKNPU",
20562150 #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
20582153 .pm = &rknpu_pm_ops,
20592154 #endif
20602155 #endif
....@@ -2081,3 +2176,6 @@
20812176 MODULE_LICENSE("GPL v2");
20822177 MODULE_VERSION(RKNPU_GET_DRV_VERSION_STRING(DRIVER_MAJOR, DRIVER_MINOR,
20832178 DRIVER_PATCHLEVEL));
2179
+#if KERNEL_VERSION(5, 16, 0) < LINUX_VERSION_CODE
2180
+MODULE_IMPORT_NS(DMA_BUF);
2181
+#endif