| .. | .. |
|---|
| 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 | |
|---|