forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/video/rockchip/mpp/mpp_service.c
....@@ -19,7 +19,6 @@
1919 #include <linux/slab.h>
2020 #include <linux/nospec.h>
2121 #include <linux/mfd/syscon.h>
22
-#include <linux/regmap.h>
2322
2423 #include "mpp_debug.h"
2524 #include "mpp_common.h"
....@@ -28,8 +27,22 @@
2827 #define MPP_CLASS_NAME "mpp_class"
2928 #define MPP_SERVICE_NAME "mpp_service"
3029
31
-#define MPP_REGISTER_DRIVER(srv, X, x) {\
32
- if (IS_ENABLED(CONFIG_ROCKCHIP_MPP_##X))\
30
+#define HAS_RKVDEC IS_ENABLED(CONFIG_ROCKCHIP_MPP_RKVDEC)
31
+#define HAS_RKVENC IS_ENABLED(CONFIG_ROCKCHIP_MPP_RKVENC)
32
+#define HAS_VDPU1 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VDPU1)
33
+#define HAS_VEPU1 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VEPU1)
34
+#define HAS_VDPU2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VDPU2)
35
+#define HAS_VEPU2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VEPU2)
36
+#define HAS_VEPU22 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VEPU22)
37
+#define HAS_IEP2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_IEP2)
38
+#define HAS_JPGDEC IS_ENABLED(CONFIG_ROCKCHIP_MPP_JPGDEC)
39
+#define HAS_RKVDEC2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_RKVDEC2)
40
+#define HAS_RKVENC2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_RKVENC2)
41
+#define HAS_AV1DEC IS_ENABLED(CONFIG_ROCKCHIP_MPP_AV1DEC)
42
+#define HAS_VDPP IS_ENABLED(CONFIG_ROCKCHIP_MPP_VDPP)
43
+
44
+#define MPP_REGISTER_DRIVER(srv, flag, X, x) {\
45
+ if (flag)\
3346 mpp_add_driver(srv, MPP_DRIVER_##X, &rockchip_##x##_driver, "grf_"#x);\
3447 }
3548
....@@ -43,47 +56,34 @@
4356 struct mpp_grf_info *grf_info,
4457 const char *grf_name)
4558 {
59
+ int ret;
4660 int index;
4761 u32 grf_offset = 0;
4862 u32 grf_value = 0;
49
- u32 mem_offset = 0;
50
- u32 val_mem_on = 0;
51
- u32 val_mem_off = 0;
5263 struct regmap *grf;
5364
5465 grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
5566 if (IS_ERR_OR_NULL(grf))
5667 return -EINVAL;
5768
69
+ ret = of_property_read_u32(np, "rockchip,grf-offset", &grf_offset);
70
+ if (ret)
71
+ return -ENODATA;
72
+
5873 index = of_property_match_string(np, "rockchip,grf-names", grf_name);
5974 if (index < 0)
6075 return -ENODATA;
6176
62
- of_property_read_u32(np, "rockchip,grf-offset", &grf_offset);
63
- of_property_read_u32_index(np, "rockchip,grf-values",
64
- index, &grf_value);
65
- of_property_read_u32_index(np, "rockchip,grf-mem-offset",
66
- index, &mem_offset);
67
- of_property_read_u32_index(np, "rockchip,grf-mem-on-values",
68
- index, &val_mem_on);
69
- of_property_read_u32_index(np, "rockchip,grf-mem-off-values",
70
- index, &val_mem_off);
71
-
77
+ ret = of_property_read_u32_index(np, "rockchip,grf-values",
78
+ index, &grf_value);
79
+ if (ret)
80
+ return -ENODATA;
7281
7382 grf_info->grf = grf;
7483 grf_info->offset = grf_offset;
7584 grf_info->val = grf_value;
7685
77
- grf_info->mem_offset = mem_offset;
78
- grf_info->val_mem_on = val_mem_on;
79
- grf_info->val_mem_off = val_mem_off;
80
-
81
- if (grf_info->offset && grf_info->val)
82
- mpp_set_grf(grf_info);
83
-
84
- if (grf_info->mem_offset && grf_info->val_mem_off)
85
- regmap_write(grf_info->grf, grf_info->mem_offset,
86
- grf_info->val_mem_off);
86
+ mpp_set_grf(grf_info);
8787
8888 return 0;
8989 }
....@@ -99,7 +99,10 @@
9999 &srv->grf_infos[type],
100100 grf_name);
101101
102
- ret = platform_driver_register(driver);
102
+ if (IS_ENABLED(CONFIG_ROCKCHIP_MPP_AV1DEC) && type == MPP_DRIVER_AV1DEC)
103
+ ret = av1dec_driver_register(driver);
104
+ else
105
+ ret = platform_driver_register(driver);
103106 if (ret)
104107 return ret;
105108
....@@ -111,8 +114,12 @@
111114 static int mpp_remove_driver(struct mpp_service *srv, int i)
112115 {
113116 if (srv && srv->sub_drivers[i]) {
114
- mpp_set_grf(&srv->grf_infos[i]);
115
- platform_driver_unregister(srv->sub_drivers[i]);
117
+ if (i != MPP_DRIVER_AV1DEC) {
118
+ mpp_set_grf(&srv->grf_infos[i]);
119
+ platform_driver_unregister(srv->sub_drivers[i]);
120
+ } else if (IS_ENABLED(CONFIG_ROCKCHIP_MPP_AV1DEC)) {
121
+ av1dec_driver_unregister(srv->sub_drivers[i]);
122
+ }
116123 srv->sub_drivers[i] = NULL;
117124 }
118125
....@@ -176,6 +183,55 @@
176183 return 0;
177184 }
178185
186
+static int mpp_dump_session(struct mpp_session *session, struct seq_file *s)
187
+{
188
+ struct mpp_dma_session *dma = session->dma;
189
+ struct mpp_dma_buffer *n;
190
+ struct mpp_dma_buffer *buffer;
191
+ phys_addr_t end;
192
+ unsigned long z = 0, t = 0;
193
+ int i = 0;
194
+#define K(size) ((unsigned long)((size) >> 10))
195
+
196
+ if (!dma)
197
+ return 0;
198
+
199
+ seq_puts(s, "session iova range dump:\n");
200
+
201
+ mutex_lock(&dma->list_mutex);
202
+ list_for_each_entry_safe(buffer, n, &dma->used_list, link) {
203
+ end = buffer->iova + buffer->size - 1;
204
+ z = (unsigned long)buffer->size;
205
+ t += z;
206
+
207
+ seq_printf(s, "%4d: ", i++);
208
+ seq_printf(s, "%pa..%pa (%10lu %s)\n", &buffer->iova, &end,
209
+ (z >= 1024) ? (K(z)) : z,
210
+ (z >= 1024) ? "KiB" : "Bytes");
211
+ }
212
+ i = 0;
213
+ list_for_each_entry_safe(buffer, n, &dma->unused_list, link) {
214
+ if (!buffer->dmabuf)
215
+ continue;
216
+
217
+ end = buffer->iova + buffer->size - 1;
218
+ z = (unsigned long)buffer->size;
219
+ t += z;
220
+
221
+ seq_printf(s, "%4d: ", i++);
222
+ seq_printf(s, "%pa..%pa (%10lu %s)\n", &buffer->iova, &end,
223
+ (z >= 1024) ? (K(z)) : z,
224
+ (z >= 1024) ? "KiB" : "Bytes");
225
+ }
226
+
227
+ mutex_unlock(&dma->list_mutex);
228
+ seq_printf(s, "session: pid=%d index=%d\n", session->pid, session->index);
229
+ seq_printf(s, " device: %s\n", dev_name(session->mpp->dev));
230
+ seq_printf(s, " memory: %lu MiB\n", K(K(t)));
231
+
232
+ return 0;
233
+}
234
+
179235 static int mpp_show_session_summary(struct seq_file *seq, void *offset)
180236 {
181237 struct mpp_session *session = NULL, *n;
....@@ -193,6 +249,8 @@
193249 if (!session->mpp)
194250 continue;
195251 mpp = session->mpp;
252
+
253
+ mpp_dump_session(session, seq);
196254
197255 if (mpp->dev_ops->dump_session)
198256 mpp->dev_ops->dump_session(session, seq);
....@@ -364,18 +422,19 @@
364422 mpp_procfs_init(srv);
365423
366424 /* register sub drivers */
367
- MPP_REGISTER_DRIVER(srv, RKVDEC, rkvdec);
368
- MPP_REGISTER_DRIVER(srv, RKVENC, rkvenc);
369
- MPP_REGISTER_DRIVER(srv, VDPU1, vdpu1);
370
- MPP_REGISTER_DRIVER(srv, VEPU1, vepu1);
371
- MPP_REGISTER_DRIVER(srv, VDPU2, vdpu2);
372
- MPP_REGISTER_DRIVER(srv, VEPU2, vepu2);
373
- MPP_REGISTER_DRIVER(srv, VEPU22, vepu22);
374
- MPP_REGISTER_DRIVER(srv, IEP2, iep2);
375
- MPP_REGISTER_DRIVER(srv, JPGDEC, jpgdec);
376
- MPP_REGISTER_DRIVER(srv, RKVDEC2, rkvdec2);
377
- MPP_REGISTER_DRIVER(srv, VDPP, vdpp);
378
- MPP_REGISTER_DRIVER(srv, RKVENC2, rkvenc2);
425
+ MPP_REGISTER_DRIVER(srv, HAS_RKVDEC, RKVDEC, rkvdec);
426
+ MPP_REGISTER_DRIVER(srv, HAS_RKVENC, RKVENC, rkvenc);
427
+ MPP_REGISTER_DRIVER(srv, HAS_VDPU1, VDPU1, vdpu1);
428
+ MPP_REGISTER_DRIVER(srv, HAS_VEPU1, VEPU1, vepu1);
429
+ MPP_REGISTER_DRIVER(srv, HAS_VDPU2, VDPU2, vdpu2);
430
+ MPP_REGISTER_DRIVER(srv, HAS_VEPU2, VEPU2, vepu2);
431
+ MPP_REGISTER_DRIVER(srv, HAS_VEPU22, VEPU22, vepu22);
432
+ MPP_REGISTER_DRIVER(srv, HAS_IEP2, IEP2, iep2);
433
+ MPP_REGISTER_DRIVER(srv, HAS_JPGDEC, JPGDEC, jpgdec);
434
+ MPP_REGISTER_DRIVER(srv, HAS_RKVDEC2, RKVDEC2, rkvdec2);
435
+ MPP_REGISTER_DRIVER(srv, HAS_RKVENC2, RKVENC2, rkvenc2);
436
+ MPP_REGISTER_DRIVER(srv, HAS_AV1DEC, AV1DEC, av1dec);
437
+ MPP_REGISTER_DRIVER(srv, HAS_VDPP, VDPP, vdpp);
379438
380439 dev_info(dev, "probe success\n");
381440