.. | .. |
---|
19 | 19 | #include <linux/slab.h> |
---|
20 | 20 | #include <linux/nospec.h> |
---|
21 | 21 | #include <linux/mfd/syscon.h> |
---|
22 | | -#include <linux/regmap.h> |
---|
23 | 22 | |
---|
24 | 23 | #include "mpp_debug.h" |
---|
25 | 24 | #include "mpp_common.h" |
---|
.. | .. |
---|
28 | 27 | #define MPP_CLASS_NAME "mpp_class" |
---|
29 | 28 | #define MPP_SERVICE_NAME "mpp_service" |
---|
30 | 29 | |
---|
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)\ |
---|
33 | 46 | mpp_add_driver(srv, MPP_DRIVER_##X, &rockchip_##x##_driver, "grf_"#x);\ |
---|
34 | 47 | } |
---|
35 | 48 | |
---|
.. | .. |
---|
43 | 56 | struct mpp_grf_info *grf_info, |
---|
44 | 57 | const char *grf_name) |
---|
45 | 58 | { |
---|
| 59 | + int ret; |
---|
46 | 60 | int index; |
---|
47 | 61 | u32 grf_offset = 0; |
---|
48 | 62 | u32 grf_value = 0; |
---|
49 | | - u32 mem_offset = 0; |
---|
50 | | - u32 val_mem_on = 0; |
---|
51 | | - u32 val_mem_off = 0; |
---|
52 | 63 | struct regmap *grf; |
---|
53 | 64 | |
---|
54 | 65 | grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); |
---|
55 | 66 | if (IS_ERR_OR_NULL(grf)) |
---|
56 | 67 | return -EINVAL; |
---|
57 | 68 | |
---|
| 69 | + ret = of_property_read_u32(np, "rockchip,grf-offset", &grf_offset); |
---|
| 70 | + if (ret) |
---|
| 71 | + return -ENODATA; |
---|
| 72 | + |
---|
58 | 73 | index = of_property_match_string(np, "rockchip,grf-names", grf_name); |
---|
59 | 74 | if (index < 0) |
---|
60 | 75 | return -ENODATA; |
---|
61 | 76 | |
---|
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; |
---|
72 | 81 | |
---|
73 | 82 | grf_info->grf = grf; |
---|
74 | 83 | grf_info->offset = grf_offset; |
---|
75 | 84 | grf_info->val = grf_value; |
---|
76 | 85 | |
---|
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); |
---|
87 | 87 | |
---|
88 | 88 | return 0; |
---|
89 | 89 | } |
---|
.. | .. |
---|
99 | 99 | &srv->grf_infos[type], |
---|
100 | 100 | grf_name); |
---|
101 | 101 | |
---|
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); |
---|
103 | 106 | if (ret) |
---|
104 | 107 | return ret; |
---|
105 | 108 | |
---|
.. | .. |
---|
111 | 114 | static int mpp_remove_driver(struct mpp_service *srv, int i) |
---|
112 | 115 | { |
---|
113 | 116 | 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 | + } |
---|
116 | 123 | srv->sub_drivers[i] = NULL; |
---|
117 | 124 | } |
---|
118 | 125 | |
---|
.. | .. |
---|
176 | 183 | return 0; |
---|
177 | 184 | } |
---|
178 | 185 | |
---|
| 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 | + |
---|
179 | 235 | static int mpp_show_session_summary(struct seq_file *seq, void *offset) |
---|
180 | 236 | { |
---|
181 | 237 | struct mpp_session *session = NULL, *n; |
---|
.. | .. |
---|
193 | 249 | if (!session->mpp) |
---|
194 | 250 | continue; |
---|
195 | 251 | mpp = session->mpp; |
---|
| 252 | + |
---|
| 253 | + mpp_dump_session(session, seq); |
---|
196 | 254 | |
---|
197 | 255 | if (mpp->dev_ops->dump_session) |
---|
198 | 256 | mpp->dev_ops->dump_session(session, seq); |
---|
.. | .. |
---|
364 | 422 | mpp_procfs_init(srv); |
---|
365 | 423 | |
---|
366 | 424 | /* 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); |
---|
379 | 438 | |
---|
380 | 439 | dev_info(dev, "probe success\n"); |
---|
381 | 440 | |
---|