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
....@@ -79,36 +78,29 @@
7978 MODULE_PARM_DESC(bypass_soft_reset,
8079 "bypass RKNPU soft reset if set it to 1, disabled by default");
8180
82
-struct npu_irqs_data {
81
+struct rknpu_irqs_data {
8382 const char *name;
8483 irqreturn_t (*irq_hdl)(int irq, void *ctx);
8584 };
8685
87
-static const struct npu_irqs_data rk356x_npu_irqs[] = {
86
+static const struct rknpu_irqs_data rknpu_irqs[] = {
8887 { "npu_irq", rknpu_core0_irq_handler }
8988 };
9089
91
-static const struct npu_irqs_data rk3588_npu_irqs[] = {
90
+static const struct rknpu_irqs_data rk3588_npu_irqs[] = {
9291 { "npu0_irq", rknpu_core0_irq_handler },
9392 { "npu1_irq", rknpu_core1_irq_handler },
9493 { "npu2_irq", rknpu_core2_irq_handler }
9594 };
9695
97
-static const struct npu_irqs_data rv110x_npu_irqs[] = {
98
- { "npu_irq", rknpu_core0_irq_handler }
99
-};
96
+static const struct rknpu_reset_data rknpu_resets[] = { { "srst_a",
97
+ "srst_h" } };
10098
101
-static const struct npu_reset_data rk356x_npu_resets[] = { { "srst_a",
102
- "srst_h" } };
103
-
104
-static const struct npu_reset_data rk3588_npu_resets[] = {
99
+static const struct rknpu_reset_data rk3588_npu_resets[] = {
105100 { "srst_a0", "srst_h0" },
106101 { "srst_a1", "srst_h1" },
107102 { "srst_a2", "srst_h2" }
108103 };
109
-
110
-static const struct npu_reset_data rv110x_npu_resets[] = { { "srst_a",
111
- "srst_h" } };
112104
113105 static const struct rknpu_config rk356x_rknpu_config = {
114106 .bw_priority_addr = 0xfe180008,
....@@ -117,11 +109,16 @@
117109 .pc_data_amount_scale = 1,
118110 .pc_task_number_bits = 12,
119111 .pc_task_number_mask = 0xfff,
112
+ .pc_task_status_offset = 0x3c,
113
+ .pc_dma_ctrl = 0,
120114 .bw_enable = 1,
121
- .irqs = rk356x_npu_irqs,
122
- .resets = rk356x_npu_resets,
123
- .num_irqs = ARRAY_SIZE(rk356x_npu_irqs),
124
- .num_resets = ARRAY_SIZE(rk356x_npu_resets)
115
+ .irqs = rknpu_irqs,
116
+ .resets = rknpu_resets,
117
+ .num_irqs = ARRAY_SIZE(rknpu_irqs),
118
+ .num_resets = ARRAY_SIZE(rknpu_resets),
119
+ .nbuf_phyaddr = 0,
120
+ .nbuf_size = 0,
121
+ .max_submit_number = (1 << 12) - 1
125122 };
126123
127124 static const struct rknpu_config rk3588_rknpu_config = {
....@@ -131,11 +128,16 @@
131128 .pc_data_amount_scale = 2,
132129 .pc_task_number_bits = 12,
133130 .pc_task_number_mask = 0xfff,
131
+ .pc_task_status_offset = 0x3c,
132
+ .pc_dma_ctrl = 0,
134133 .bw_enable = 0,
135134 .irqs = rk3588_npu_irqs,
136135 .resets = rk3588_npu_resets,
137136 .num_irqs = ARRAY_SIZE(rk3588_npu_irqs),
138
- .num_resets = ARRAY_SIZE(rk3588_npu_resets)
137
+ .num_resets = ARRAY_SIZE(rk3588_npu_resets),
138
+ .nbuf_phyaddr = 0,
139
+ .nbuf_size = 0,
140
+ .max_submit_number = (1 << 12) - 1
139141 };
140142
141143 static const struct rknpu_config rv1106_rknpu_config = {
....@@ -145,11 +147,35 @@
145147 .pc_data_amount_scale = 2,
146148 .pc_task_number_bits = 16,
147149 .pc_task_number_mask = 0xffff,
150
+ .pc_task_status_offset = 0x3c,
151
+ .pc_dma_ctrl = 0,
148152 .bw_enable = 1,
149
- .irqs = rv110x_npu_irqs,
150
- .resets = rv110x_npu_resets,
151
- .num_irqs = ARRAY_SIZE(rv110x_npu_irqs),
152
- .num_resets = ARRAY_SIZE(rv110x_npu_resets)
153
+ .irqs = rknpu_irqs,
154
+ .resets = rknpu_resets,
155
+ .num_irqs = ARRAY_SIZE(rknpu_irqs),
156
+ .num_resets = ARRAY_SIZE(rknpu_resets),
157
+ .nbuf_phyaddr = 0,
158
+ .nbuf_size = 0,
159
+ .max_submit_number = (1 << 16) - 1
160
+};
161
+
162
+static const struct rknpu_config rk3562_rknpu_config = {
163
+ .bw_priority_addr = 0x0,
164
+ .bw_priority_length = 0x0,
165
+ .dma_mask = DMA_BIT_MASK(40),
166
+ .pc_data_amount_scale = 2,
167
+ .pc_task_number_bits = 16,
168
+ .pc_task_number_mask = 0xffff,
169
+ .pc_task_status_offset = 0x48,
170
+ .pc_dma_ctrl = 1,
171
+ .bw_enable = 1,
172
+ .irqs = rknpu_irqs,
173
+ .resets = rknpu_resets,
174
+ .num_irqs = ARRAY_SIZE(rknpu_irqs),
175
+ .num_resets = ARRAY_SIZE(rknpu_resets),
176
+ .nbuf_phyaddr = 0xfe400000,
177
+ .nbuf_size = 256 * 1024,
178
+ .max_submit_number = (1 << 16) - 1
153179 };
154180
155181 /* driver probe and init */
....@@ -169,6 +195,10 @@
169195 {
170196 .compatible = "rockchip,rv1106-rknpu",
171197 .data = &rv1106_rknpu_config,
198
+ },
199
+ {
200
+ .compatible = "rockchip,rk3562-rknpu",
201
+ .data = &rk3562_rknpu_config,
172202 },
173203 {},
174204 };
....@@ -198,7 +228,6 @@
198228 {
199229 int ret = 0;
200230
201
- cancel_delayed_work(&rknpu_dev->power_off_work);
202231 mutex_lock(&rknpu_dev->power_lock);
203232 if (atomic_inc_return(&rknpu_dev->power_refcount) == 1)
204233 ret = rknpu_power_on(rknpu_dev);
....@@ -221,6 +250,9 @@
221250
222251 static int rknpu_power_put_delay(struct rknpu_device *rknpu_dev)
223252 {
253
+ if (rknpu_dev->power_put_delay == 0)
254
+ return rknpu_power_put(rknpu_dev);
255
+
224256 mutex_lock(&rknpu_dev->power_lock);
225257 if (atomic_read(&rknpu_dev->power_refcount) == 1)
226258 queue_delayed_work(
....@@ -229,6 +261,7 @@
229261 else
230262 atomic_dec_if_positive(&rknpu_dev->power_refcount);
231263 mutex_unlock(&rknpu_dev->power_lock);
264
+
232265 return 0;
233266 }
234267
....@@ -245,13 +278,17 @@
245278 ret = rknpu_get_drv_version(&args->value);
246279 break;
247280 case RKNPU_GET_FREQ:
281
+#ifndef FPGA_PLATFORM
248282 args->value = clk_get_rate(rknpu_dev->clks[0].clk);
283
+#endif
249284 ret = 0;
250285 break;
251286 case RKNPU_SET_FREQ:
252287 break;
253288 case RKNPU_GET_VOLT:
289
+#ifndef FPGA_PLATFORM
254290 args->value = regulator_get_voltage(rknpu_dev->vdd);
291
+#endif
255292 ret = 0;
256293 break;
257294 case RKNPU_SET_VOLT:
....@@ -330,11 +367,56 @@
330367 #ifdef CONFIG_ROCKCHIP_RKNPU_DMA_HEAP
331368 static int rknpu_open(struct inode *inode, struct file *file)
332369 {
370
+ struct rknpu_device *rknpu_dev =
371
+ container_of(file->private_data, struct rknpu_device, miscdev);
372
+ struct rknpu_session *session = NULL;
373
+
374
+ session = kzalloc(sizeof(*session), GFP_KERNEL);
375
+ if (!session) {
376
+ LOG_ERROR("rknpu session alloc failed\n");
377
+ return -ENOMEM;
378
+ }
379
+
380
+ session->rknpu_dev = rknpu_dev;
381
+ INIT_LIST_HEAD(&session->list);
382
+
383
+ file->private_data = (void *)session;
384
+
333385 return nonseekable_open(inode, file);
334386 }
335387
336388 static int rknpu_release(struct inode *inode, struct file *file)
337389 {
390
+ struct rknpu_mem_object *entry;
391
+ struct rknpu_session *session = file->private_data;
392
+ struct rknpu_device *rknpu_dev = session->rknpu_dev;
393
+ LIST_HEAD(local_list);
394
+
395
+ spin_lock(&rknpu_dev->lock);
396
+ list_replace_init(&session->list, &local_list);
397
+ file->private_data = NULL;
398
+ spin_unlock(&rknpu_dev->lock);
399
+
400
+ while (!list_empty(&local_list)) {
401
+ entry = list_first_entry(&local_list, struct rknpu_mem_object,
402
+ head);
403
+
404
+ LOG_DEBUG(
405
+ "Fd close free rknpu_obj: %#llx, rknpu_obj->dma_addr: %#llx\n",
406
+ (__u64)(uintptr_t)entry, (__u64)entry->dma_addr);
407
+
408
+ vunmap(entry->kv_addr);
409
+ entry->kv_addr = NULL;
410
+
411
+ if (!entry->owner)
412
+ dma_buf_put(entry->dmabuf);
413
+
414
+ list_del(&entry->head);
415
+ kfree(entry);
416
+ }
417
+
418
+ kfree(session);
419
+
338420 return 0;
339421 }
340422
....@@ -366,8 +448,12 @@
366448 static long rknpu_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
367449 {
368450 long ret = -EINVAL;
369
- struct rknpu_device *rknpu_dev =
370
- container_of(file->private_data, struct rknpu_device, miscdev);
451
+ struct rknpu_device *rknpu_dev = NULL;
452
+
453
+ if (!file->private_data)
454
+ return -EINVAL;
455
+
456
+ rknpu_dev = ((struct rknpu_session *)file->private_data)->rknpu_dev;
371457
372458 rknpu_power_get(rknpu_dev);
373459
....@@ -379,12 +465,12 @@
379465 ret = rknpu_submit_ioctl(rknpu_dev, arg);
380466 break;
381467 case IOCTL_RKNPU_MEM_CREATE:
382
- ret = rknpu_mem_create_ioctl(rknpu_dev, arg);
468
+ ret = rknpu_mem_create_ioctl(rknpu_dev, arg, file);
383469 break;
384470 case RKNPU_MEM_MAP:
385471 break;
386472 case IOCTL_RKNPU_MEM_DESTROY:
387
- ret = rknpu_mem_destroy_ioctl(rknpu_dev, arg);
473
+ ret = rknpu_mem_destroy_ioctl(rknpu_dev, arg, file);
388474 break;
389475 case IOCTL_RKNPU_MEM_SYNC:
390476 ret = rknpu_mem_sync_ioctl(rknpu_dev, arg);
....@@ -409,11 +495,13 @@
409495 #endif
410496
411497 #ifdef CONFIG_ROCKCHIP_RKNPU_DRM_GEM
498
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
412499 static const struct vm_operations_struct rknpu_gem_vm_ops = {
413500 .fault = rknpu_gem_fault,
414501 .open = drm_gem_vm_open,
415502 .close = drm_gem_vm_close,
416503 };
504
+#endif
417505
418506 static int rknpu_action_ioctl(struct drm_device *dev, void *data,
419507 struct drm_file *file_priv)
....@@ -455,6 +543,9 @@
455543 DRM_RENDER_ALLOW),
456544 };
457545
546
+#if KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE
547
+DEFINE_DRM_GEM_FOPS(rknpu_drm_driver_fops);
548
+#else
458549 static const struct file_operations rknpu_drm_driver_fops = {
459550 .owner = THIS_MODULE,
460551 .open = drm_open,
....@@ -468,6 +559,7 @@
468559 .release = drm_release,
469560 .llseek = noop_llseek,
470561 };
562
+#endif
471563
472564 static struct drm_driver rknpu_drm_driver = {
473565 #if KERNEL_VERSION(5, 4, 0) <= LINUX_VERSION_CODE
....@@ -475,28 +567,34 @@
475567 #else
476568 .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER,
477569 #endif
570
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
478571 .gem_free_object_unlocked = rknpu_gem_free_object,
479572 .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
480579 .dumb_create = rknpu_gem_dumb_create,
481580 #if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
482581 .dumb_map_offset = rknpu_gem_dumb_map_offset,
483582 #else
484583 .dumb_map_offset = drm_gem_dumb_map_offset,
485584 #endif
486
- .dumb_destroy = drm_gem_dumb_destroy,
487585 .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
488586 .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
489
- .gem_prime_export = drm_gem_prime_export,
490587 #if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE
491588 .gem_prime_import = rknpu_gem_prime_import,
492589 #else
493590 .gem_prime_import = drm_gem_prime_import,
494591 #endif
495
- .gem_prime_get_sg_table = rknpu_gem_prime_get_sg_table,
496592 .gem_prime_import_sg_table = rknpu_gem_prime_import_sg_table,
497
- .gem_prime_vmap = rknpu_gem_prime_vmap,
498
- .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
499596 .gem_prime_mmap = rknpu_gem_prime_mmap,
597
+#endif
500598 .ioctls = rknpu_ioctls,
501599 .num_ioctls = ARRAY_SIZE(rknpu_ioctls),
502600 .fops = &rknpu_drm_driver_fops,
....@@ -516,7 +614,7 @@
516614 container_of(timer, struct rknpu_device, timer);
517615 struct rknpu_subcore_data *subcore_data = NULL;
518616 struct rknpu_job *job = NULL;
519
- ktime_t now = ktime_get();
617
+ ktime_t now;
520618 unsigned long flags;
521619 int i;
522620
....@@ -527,9 +625,10 @@
527625
528626 job = subcore_data->job;
529627 if (job) {
628
+ now = ktime_get();
530629 subcore_data->timer.busy_time +=
531630 ktime_us_delta(now, job->hw_recoder_time);
532
- job->hw_recoder_time = ktime_get();
631
+ job->hw_recoder_time = now;
533632 }
534633
535634 subcore_data->timer.busy_time_record =
....@@ -581,6 +680,42 @@
581680 }
582681
583682 #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
+
584719 static int rknpu_drm_probe(struct rknpu_device *rknpu_dev)
585720 {
586721 struct device *dev = rknpu_dev->dev;
....@@ -599,6 +734,8 @@
599734 drm_dev->dev_private = rknpu_dev;
600735 rknpu_dev->drm_dev = drm_dev;
601736
737
+ drm_fake_dev_register(rknpu_dev);
738
+
602739 return 0;
603740
604741 err_free_drm:
....@@ -614,6 +751,8 @@
614751 static void rknpu_drm_remove(struct rknpu_device *rknpu_dev)
615752 {
616753 struct drm_device *drm_dev = rknpu_dev->drm_dev;
754
+
755
+ drm_fake_dev_unregister(rknpu_dev);
617756
618757 drm_dev_unregister(drm_dev);
619758
....@@ -662,7 +801,8 @@
662801 }
663802
664803 #ifndef FPGA_PLATFORM
665
-#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
666806 rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info);
667807 #endif
668808 #endif
....@@ -723,7 +863,8 @@
723863
724864 out:
725865 #ifndef FPGA_PLATFORM
726
-#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
727868 rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info);
728869 #endif
729870 #endif
....@@ -739,7 +880,8 @@
739880 int ret;
740881 bool val;
741882
742
-#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
743885 rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info);
744886 #endif
745887 #endif
....@@ -763,7 +905,8 @@
763905 if (ret) {
764906 LOG_DEV_ERROR(dev, "iommu still enabled\n");
765907 pm_runtime_get_sync(dev);
766
-#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
767910 rockchip_monitor_volt_adjust_unlock(
768911 rknpu_dev->mdev_info);
769912 #endif
....@@ -782,7 +925,8 @@
782925 }
783926
784927 #ifndef FPGA_PLATFORM
785
-#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
786930 rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info);
787931 #endif
788932 #endif
....@@ -801,8 +945,9 @@
801945 }
802946
803947 #ifndef FPGA_PLATFORM
948
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
804949 static struct monitor_dev_profile npu_mdevp = {
805
- .type = MONITOR_TPYE_DEV,
950
+ .type = MONITOR_TYPE_DEV,
806951 .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust,
807952 .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust,
808953 #if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE
....@@ -1063,6 +1208,7 @@
10631208 .get_dev_status = npu_devfreq_get_dev_status,
10641209 .get_cur_freq = npu_devfreq_get_cur_freq,
10651210 };
1211
+#endif
10661212
10671213 #ifdef CONFIG_PM_DEVFREQ
10681214 static int devfreq_rknpu_ondemand_func(struct devfreq *df, unsigned long *freq)
....@@ -1090,6 +1236,7 @@
10901236 };
10911237 #endif
10921238
1239
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
10931240 static unsigned long npu_get_static_power(struct devfreq *devfreq,
10941241 unsigned long voltage)
10951242 {
....@@ -1107,6 +1254,66 @@
11071254 };
11081255
11091256 #if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE
1257
+static int rk3588_npu_get_soc_info(struct device *dev, struct device_node *np,
1258
+ int *bin, int *process)
1259
+{
1260
+ int ret = 0;
1261
+ u8 value = 0;
1262
+
1263
+ if (!bin)
1264
+ return 0;
1265
+
1266
+ if (of_property_match_string(np, "nvmem-cell-names",
1267
+ "specification_serial_number") >= 0) {
1268
+ ret = rockchip_nvmem_cell_read_u8(
1269
+ np, "specification_serial_number", &value);
1270
+ if (ret) {
1271
+ LOG_DEV_ERROR(
1272
+ dev,
1273
+ "Failed to get specification_serial_number\n");
1274
+ return ret;
1275
+ }
1276
+ /* RK3588M */
1277
+ if (value == 0xd)
1278
+ *bin = 1;
1279
+ /* RK3588J */
1280
+ else if (value == 0xa)
1281
+ *bin = 2;
1282
+ }
1283
+ if (*bin < 0)
1284
+ *bin = 0;
1285
+ LOG_DEV_INFO(dev, "bin=%d\n", *bin);
1286
+
1287
+ return ret;
1288
+}
1289
+
1290
+static int rk3588_npu_set_soc_info(struct device *dev, struct device_node *np,
1291
+ int bin, int process, int volt_sel)
1292
+{
1293
+ struct opp_table *opp_table;
1294
+ u32 supported_hw[2];
1295
+
1296
+ if (volt_sel < 0)
1297
+ return 0;
1298
+ if (bin < 0)
1299
+ bin = 0;
1300
+
1301
+ if (!of_property_read_bool(np, "rockchip,supported-hw"))
1302
+ return 0;
1303
+
1304
+ /* SoC Version */
1305
+ supported_hw[0] = BIT(bin);
1306
+ /* Speed Grade */
1307
+ supported_hw[1] = BIT(volt_sel);
1308
+ opp_table = dev_pm_opp_set_supported_hw(dev, supported_hw, 2);
1309
+ if (IS_ERR(opp_table)) {
1310
+ LOG_DEV_ERROR(dev, "failed to set supported opp\n");
1311
+ return PTR_ERR(opp_table);
1312
+ }
1313
+
1314
+ return 0;
1315
+}
1316
+
11101317 static int rk3588_npu_set_read_margin(struct device *dev,
11111318 struct rockchip_opp_info *opp_info,
11121319 u32 rm)
....@@ -1139,6 +1346,8 @@
11391346 }
11401347
11411348 static const struct rockchip_opp_data rk3588_npu_opp_data = {
1349
+ .get_soc_info = rk3588_npu_get_soc_info,
1350
+ .set_soc_info = rk3588_npu_set_soc_info,
11421351 .set_read_margin = rk3588_npu_set_read_margin,
11431352 };
11441353
....@@ -1401,6 +1610,7 @@
14011610 return ret;
14021611 }
14031612 #endif
1613
+#endif
14041614
14051615 static int rknpu_devfreq_remove(struct rknpu_device *rknpu_dev)
14061616 {
....@@ -1423,9 +1633,12 @@
14231633 {
14241634 const struct rknpu_config *config = rknpu_dev->config;
14251635 struct device *dev = &pdev->dev;
1636
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
14261637 struct resource *res;
1638
+#endif
14271639 int i, ret, irq;
14281640
1641
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
14291642 res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
14301643 config->irqs[0].name);
14311644 if (res) {
....@@ -1464,6 +1677,25 @@
14641677 return ret;
14651678 }
14661679 }
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
14671699
14681700 return 0;
14691701 }
....@@ -1514,6 +1746,31 @@
15141746 LOG_DEV_INFO(dev, "sram region: [%pa, %pa), sram size: %#x\n",
15151747 &rknpu_dev->sram_start, &rknpu_dev->sram_end,
15161748 rknpu_dev->sram_size);
1749
+
1750
+ return 0;
1751
+}
1752
+
1753
+static int rknpu_find_nbuf_resource(struct rknpu_device *rknpu_dev)
1754
+{
1755
+ struct device *dev = rknpu_dev->dev;
1756
+
1757
+ if (rknpu_dev->config->nbuf_size == 0)
1758
+ return -EINVAL;
1759
+
1760
+ rknpu_dev->nbuf_start = rknpu_dev->config->nbuf_phyaddr;
1761
+ rknpu_dev->nbuf_size = rknpu_dev->config->nbuf_size;
1762
+ rknpu_dev->nbuf_base_io =
1763
+ devm_ioremap(dev, rknpu_dev->nbuf_start, rknpu_dev->nbuf_size);
1764
+ if (IS_ERR(rknpu_dev->nbuf_base_io)) {
1765
+ LOG_DEV_ERROR(dev, "failed to remap nbuf base io!\n");
1766
+ rknpu_dev->nbuf_base_io = NULL;
1767
+ }
1768
+
1769
+ rknpu_dev->nbuf_end = rknpu_dev->nbuf_start + rknpu_dev->nbuf_size;
1770
+
1771
+ LOG_DEV_INFO(dev, "nbuf region: [%pa, %pa), nbuf size: %#x\n",
1772
+ &rknpu_dev->nbuf_start, &rknpu_dev->nbuf_end,
1773
+ rknpu_dev->nbuf_size);
15171774
15181775 return 0;
15191776 }
....@@ -1577,7 +1834,8 @@
15771834 }
15781835
15791836 #ifndef FPGA_PLATFORM
1580
-#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
15811839 if (strstr(__clk_get_name(rknpu_dev->clks[0].clk), "scmi"))
15821840 rknpu_dev->opp_info.scmi_clk = rknpu_dev->clks[0].clk;
15831841 #endif
....@@ -1719,7 +1977,9 @@
17191977 goto err_remove_drv;
17201978
17211979 #ifndef FPGA_PLATFORM
1980
+#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
17221981 rknpu_devfreq_init(rknpu_dev);
1982
+#endif
17231983 #endif
17241984
17251985 // set default power put delay to 3s
....@@ -1734,7 +1994,8 @@
17341994 INIT_DEFERRABLE_WORK(&rknpu_dev->power_off_work,
17351995 rknpu_power_off_delay_work);
17361996
1737
- if (IS_ENABLED(CONFIG_ROCKCHIP_RKNPU_SRAM) && rknpu_dev->iommu_en) {
1997
+ if (IS_ENABLED(CONFIG_NO_GKI) &&
1998
+ IS_ENABLED(CONFIG_ROCKCHIP_RKNPU_SRAM) && rknpu_dev->iommu_en) {
17381999 if (!rknpu_find_sram_resource(rknpu_dev)) {
17392000 ret = rknpu_mm_create(rknpu_dev->sram_size, PAGE_SIZE,
17402001 &rknpu_dev->sram_mm);
....@@ -1744,6 +2005,10 @@
17442005 LOG_DEV_WARN(dev, "could not find sram resource!\n");
17452006 }
17462007 }
2008
+
2009
+ if (IS_ENABLED(CONFIG_NO_GKI) && rknpu_dev->iommu_en &&
2010
+ rknpu_dev->config->nbuf_size > 0)
2011
+ rknpu_find_nbuf_resource(rknpu_dev);
17472012
17482013 rknpu_power_off(rknpu_dev);
17492014 atomic_set(&rknpu_dev->power_refcount, 0);
....@@ -1823,7 +2088,8 @@
18232088 }
18242089
18252090 #ifndef FPGA_PLATFORM
1826
-#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
18272093 static int rknpu_runtime_suspend(struct device *dev)
18282094 {
18292095 struct rknpu_device *rknpu_dev = dev_get_drvdata(dev);
....@@ -1882,7 +2148,8 @@
18822148 .owner = THIS_MODULE,
18832149 .name = "RKNPU",
18842150 #ifndef FPGA_PLATFORM
1885
-#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
18862153 .pm = &rknpu_pm_ops,
18872154 #endif
18882155 #endif
....@@ -1909,3 +2176,6 @@
19092176 MODULE_LICENSE("GPL v2");
19102177 MODULE_VERSION(RKNPU_GET_DRV_VERSION_STRING(DRIVER_MAJOR, DRIVER_MINOR,
19112178 DRIVER_PATCHLEVEL));
2179
+#if KERNEL_VERSION(5, 16, 0) < LINUX_VERSION_CODE
2180
+MODULE_IMPORT_NS(DMA_BUF);
2181
+#endif