| .. | .. |
|---|
| 27 | 27 | #define MPP_CLASS_NAME "mpp_class" |
|---|
| 28 | 28 | #define MPP_SERVICE_NAME "mpp_service" |
|---|
| 29 | 29 | |
|---|
| 30 | | -#define MPP_REGISTER_DRIVER(srv, X, x) {\ |
|---|
| 31 | | - 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)\ |
|---|
| 32 | 46 | mpp_add_driver(srv, MPP_DRIVER_##X, &rockchip_##x##_driver, "grf_"#x);\ |
|---|
| 33 | 47 | } |
|---|
| 34 | 48 | |
|---|
| .. | .. |
|---|
| 85 | 99 | &srv->grf_infos[type], |
|---|
| 86 | 100 | grf_name); |
|---|
| 87 | 101 | |
|---|
| 88 | | - 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); |
|---|
| 89 | 106 | if (ret) |
|---|
| 90 | 107 | return ret; |
|---|
| 91 | 108 | |
|---|
| .. | .. |
|---|
| 97 | 114 | static int mpp_remove_driver(struct mpp_service *srv, int i) |
|---|
| 98 | 115 | { |
|---|
| 99 | 116 | if (srv && srv->sub_drivers[i]) { |
|---|
| 100 | | - mpp_set_grf(&srv->grf_infos[i]); |
|---|
| 101 | | - 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 | + } |
|---|
| 102 | 123 | srv->sub_drivers[i] = NULL; |
|---|
| 103 | 124 | } |
|---|
| 104 | 125 | |
|---|
| .. | .. |
|---|
| 162 | 183 | return 0; |
|---|
| 163 | 184 | } |
|---|
| 164 | 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 | + |
|---|
| 165 | 235 | static int mpp_show_session_summary(struct seq_file *seq, void *offset) |
|---|
| 166 | 236 | { |
|---|
| 167 | 237 | struct mpp_session *session = NULL, *n; |
|---|
| .. | .. |
|---|
| 179 | 249 | if (!session->mpp) |
|---|
| 180 | 250 | continue; |
|---|
| 181 | 251 | mpp = session->mpp; |
|---|
| 252 | + |
|---|
| 253 | + mpp_dump_session(session, seq); |
|---|
| 182 | 254 | |
|---|
| 183 | 255 | if (mpp->dev_ops->dump_session) |
|---|
| 184 | 256 | mpp->dev_ops->dump_session(session, seq); |
|---|
| .. | .. |
|---|
| 261 | 333 | /* show support devices */ |
|---|
| 262 | 334 | proc_create_single_data("supports-device", 0444, |
|---|
| 263 | 335 | srv->procfs, mpp_show_support_device, srv); |
|---|
| 336 | + mpp_procfs_create_u32("timing_en", 0644, srv->procfs, &srv->timing_en); |
|---|
| 264 | 337 | |
|---|
| 265 | 338 | return 0; |
|---|
| 266 | 339 | } |
|---|
| .. | .. |
|---|
| 349 | 422 | mpp_procfs_init(srv); |
|---|
| 350 | 423 | |
|---|
| 351 | 424 | /* register sub drivers */ |
|---|
| 352 | | - MPP_REGISTER_DRIVER(srv, RKVDEC, rkvdec); |
|---|
| 353 | | - MPP_REGISTER_DRIVER(srv, RKVENC, rkvenc); |
|---|
| 354 | | - MPP_REGISTER_DRIVER(srv, VDPU1, vdpu1); |
|---|
| 355 | | - MPP_REGISTER_DRIVER(srv, VEPU1, vepu1); |
|---|
| 356 | | - MPP_REGISTER_DRIVER(srv, VDPU2, vdpu2); |
|---|
| 357 | | - MPP_REGISTER_DRIVER(srv, VEPU2, vepu2); |
|---|
| 358 | | - MPP_REGISTER_DRIVER(srv, VEPU22, vepu22); |
|---|
| 359 | | - MPP_REGISTER_DRIVER(srv, IEP2, iep2); |
|---|
| 360 | | - MPP_REGISTER_DRIVER(srv, JPGDEC, jpgdec); |
|---|
| 361 | | - MPP_REGISTER_DRIVER(srv, RKVDEC2, rkvdec2); |
|---|
| 362 | | - MPP_REGISTER_DRIVER(srv, VDPP, vdpp); |
|---|
| 363 | | - 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); |
|---|
| 364 | 438 | |
|---|
| 365 | 439 | dev_info(dev, "probe success\n"); |
|---|
| 366 | 440 | |
|---|