Lines Matching +full:sub +full:- +full:components

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Author: Ping-Hsun Wu <ping-[email protected]>
9 #include "mtk-mdp3-cfg.h"
10 #include "mtk-mdp3-cmdq.h"
11 #include "mtk-mdp3-comp.h"
12 #include "mtk-mdp3-core.h"
13 #include "mtk-mdp3-m2m.h"
14 #include "mtk-img-ipi.h"
29 ((ctx)->comp->ops && (ctx)->comp->ops->op)
31 (has_op(ctx, op) ? (ctx)->comp->ops->op(ctx, ##__VA_ARGS__) : 0)
55 return mdp_dev->mm_subsys[p->sub_id].mdp_mutex[p->mutex_id]; in __get_mutex()
98 dev_err(&mdp_dev->pdev->dev, "Unknown pipeline id %d", id); in __get_pipe()
109 const int p_id = mdp->mdp_data->mdp_plat_id; in __get_config_offset()
110 struct device *dev = &mdp->pdev->dev; in __get_config_offset()
112 long bound = mdp->vpu.config_size; in __get_config_offset()
114 if (pp_idx >= mdp->mdp_data->pp_used) in __get_config_offset()
118 cfg_c = CFG_OFST(MT8183, param->config, pp_idx); in __get_config_offset()
119 cfg_n = CFG_OFST(MT8183, param->config, pp_idx + 1); in __get_config_offset()
121 cfg_c = CFG_OFST(MT8195, param->config, pp_idx); in __get_config_offset()
122 cfg_n = CFG_OFST(MT8195, param->config, pp_idx + 1); in __get_config_offset()
127 if ((long)cfg_n - (long)mdp->vpu.config > bound) { in __get_config_offset()
129 cfg_c = ERR_PTR(-EFAULT); in __get_config_offset()
135 cfg_c = ERR_PTR(-EINVAL); in __get_config_offset()
143 const int p_id = path->mdp_dev->mdp_data->mdp_plat_id; in mdp_path_subfrm_require()
145 const struct mtk_mdp_driver_data *data = path->mdp_dev->mdp_data; in mdp_path_subfrm_require()
151 num_comp = CFG_GET(MT8183, path->config, num_components); in mdp_path_subfrm_require()
153 num_comp = CFG_GET(MT8195, path->config, num_components); in mdp_path_subfrm_require()
156 index = __get_pipe(path->mdp_dev, path->comps[0].comp->public_id); in mdp_path_subfrm_require()
157 memcpy(p, &data->pipe_info[index], sizeof(struct mdp_pipe_info)); in mdp_path_subfrm_require()
158 mutex = __get_mutex(path->mdp_dev, p); in mdp_path_subfrm_require()
167 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_subfrm_require()
169 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_subfrm_require()
171 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_subfrm_require()
174 ctx = &path->comps[index]; in mdp_path_subfrm_require()
175 if (is_output_disabled(p_id, ctx->param, count)) in mdp_path_subfrm_require()
178 mutex_idx = data->mdp_mutex_table_idx; in mdp_path_subfrm_require()
179 id = ctx->comp->public_id; in mdp_path_subfrm_require()
182 b = &data->comp_data[id].blend; in mdp_path_subfrm_require()
183 if (b && b->aid_mod) in mdp_path_subfrm_require()
184 mtk_mutex_write_mod(mutex, mutex_idx[b->b_id], false); in mdp_path_subfrm_require()
196 const int p_id = path->mdp_dev->mdp_data->mdp_plat_id; in mdp_path_subfrm_run()
198 struct device *dev = &path->mdp_dev->pdev->dev; in mdp_path_subfrm_run()
205 if (-1 == p->mutex_id) { in mdp_path_subfrm_run()
207 return -EINVAL; in mdp_path_subfrm_run()
211 num_comp = CFG_GET(MT8183, path->config, num_components); in mdp_path_subfrm_run()
213 num_comp = CFG_GET(MT8195, path->config, num_components); in mdp_path_subfrm_run()
219 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_subfrm_run()
221 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_subfrm_run()
223 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_subfrm_run()
225 ctx = &path->comps[index]; in mdp_path_subfrm_run()
226 if (is_output_disabled(p_id, ctx->param, count)) in mdp_path_subfrm_run()
228 event = ctx->comp->gce_event[MDP_GCE_EVENT_SOF]; in mdp_path_subfrm_run()
234 mutex = __get_mutex(path->mdp_dev, p); in mdp_path_subfrm_run()
235 mtk_mutex_enable_by_cmdq(mutex, (void *)&cmd->pkt); in mdp_path_subfrm_run()
240 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_subfrm_run()
242 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_subfrm_run()
244 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_subfrm_run()
246 ctx = &path->comps[index]; in mdp_path_subfrm_run()
247 if (is_output_disabled(p_id, ctx->param, count)) in mdp_path_subfrm_run()
249 event = ctx->comp->gce_event[MDP_GCE_EVENT_SOF]; in mdp_path_subfrm_run()
259 const int p_id = mdp->mdp_data->mdp_plat_id; in mdp_path_ctx_init()
265 num_comp = CFG_GET(MT8183, path->config, num_components); in mdp_path_ctx_init()
267 num_comp = CFG_GET(MT8195, path->config, num_components); in mdp_path_ctx_init()
270 return -EINVAL; in mdp_path_ctx_init()
276 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_ctx_init()
278 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_ctx_init()
280 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_ctx_init()
283 param = (void *)CFG_ADDR(MT8183, path->config, components[index]); in mdp_path_ctx_init()
285 param = (void *)CFG_ADDR(MT8195, path->config, components[index]); in mdp_path_ctx_init()
286 ret = mdp_comp_ctx_config(mdp, &path->comps[index], in mdp_path_ctx_init()
287 param, path->param); in mdp_path_ctx_init()
298 const int p_id = path->mdp_dev->mdp_data->mdp_plat_id; in mdp_path_config_subfrm()
308 num_comp = CFG_GET(MT8183, path->config, num_components); in mdp_path_config_subfrm()
310 num_comp = CFG_GET(MT8195, path->config, num_components); in mdp_path_config_subfrm()
313 ctrl = CFG_ADDR(MT8183, path->config, ctrls[count]); in mdp_path_config_subfrm()
315 ctrl = CFG_ADDR(MT8195, path->config, ctrls[count]); in mdp_path_config_subfrm()
317 /* Acquire components */ in mdp_path_config_subfrm()
322 for (index = 0; index < ctrl->num_sets; index++) { in mdp_path_config_subfrm()
323 set = &ctrl->sets[index]; in mdp_path_config_subfrm()
324 cmdq_pkt_write(&cmd->pkt, set->subsys_id, set->reg, set->value); in mdp_path_config_subfrm()
326 /* Config sub-frame information */ in mdp_path_config_subfrm()
327 for (index = (num_comp - 1); index >= 0; index--) { in mdp_path_config_subfrm()
329 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_config_subfrm()
331 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_config_subfrm()
333 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_config_subfrm()
335 ctx = &path->comps[index]; in mdp_path_config_subfrm()
336 if (is_output_disabled(p_id, ctx->param, count)) in mdp_path_config_subfrm()
342 /* Run components */ in mdp_path_config_subfrm()
346 /* Wait components done */ in mdp_path_config_subfrm()
349 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_config_subfrm()
351 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_config_subfrm()
353 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_config_subfrm()
355 ctx = &path->comps[index]; in mdp_path_config_subfrm()
356 if (is_output_disabled(p_id, ctx->param, count)) in mdp_path_config_subfrm()
362 /* Advance to the next sub-frame */ in mdp_path_config_subfrm()
365 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_config_subfrm()
367 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_config_subfrm()
369 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_config_subfrm()
371 ctx = &path->comps[index]; in mdp_path_config_subfrm()
377 for (index = 0; index < ctrl->num_sets; index++) { in mdp_path_config_subfrm()
378 set = &ctrl->sets[index]; in mdp_path_config_subfrm()
379 cmdq_pkt_write(&cmd->pkt, set->subsys_id, set->reg, 0); in mdp_path_config_subfrm()
388 const int p_id = mdp->mdp_data->mdp_plat_id; in mdp_path_config()
396 num_comp = CFG_GET(MT8183, path->config, num_components); in mdp_path_config()
398 num_comp = CFG_GET(MT8195, path->config, num_components); in mdp_path_config()
401 num_sub = CFG_GET(MT8183, path->config, num_subfrms); in mdp_path_config()
403 num_sub = CFG_GET(MT8195, path->config, num_subfrms); in mdp_path_config()
406 /* Reset components */ in mdp_path_config()
409 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_config()
411 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_config()
413 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_config()
415 ctx = &path->comps[index]; in mdp_path_config()
425 ctx = &path->comps[index]; in mdp_path_config()
427 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_config()
429 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_config()
431 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_config()
435 out = CFG_COMP(MT8183, ctx->param, outputs[0]); in mdp_path_config()
437 out = CFG_COMP(MT8195, ctx->param, outputs[0]); in mdp_path_config()
439 compose = path->composes[out]; in mdp_path_config()
445 /* Config path sub-frames */ in mdp_path_config()
454 inner_id = CFG_GET(MT8183, path->config, components[index].type); in mdp_path_config()
456 inner_id = CFG_GET(MT8195, path->config, components[index].type); in mdp_path_config()
458 if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id)) in mdp_path_config()
460 ctx = &path->comps[index]; in mdp_path_config()
476 mdp = cmd->mdp; in mdp_auto_release_work()
478 pipe_id = __get_pipe(mdp, cmd->comps[0].public_id); in mdp_auto_release_work()
479 mutex = __get_mutex(mdp, &mdp->mdp_data->pipe_info[pipe_id]); in mdp_auto_release_work()
481 mdp_comp_clocks_off(&mdp->pdev->dev, cmd->comps, in mdp_auto_release_work()
482 cmd->num_comps); in mdp_auto_release_work()
484 if (refcount_dec_and_test(&mdp->job_count)) { in mdp_auto_release_work()
485 if (cmd->mdp_ctx) in mdp_auto_release_work()
486 mdp_m2m_job_finish(cmd->mdp_ctx); in mdp_auto_release_work()
488 if (cmd->user_cmdq_cb) { in mdp_auto_release_work()
491 user_cb_data.sta = cmd->data->sta; in mdp_auto_release_work()
492 user_cb_data.pkt = cmd->data->pkt; in mdp_auto_release_work()
493 cmd->user_cmdq_cb(user_cb_data); in mdp_auto_release_work()
495 wake_up(&mdp->callback_wq); in mdp_auto_release_work()
498 cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt); in mdp_auto_release_work()
499 kfree(cmd->comps); in mdp_auto_release_work()
500 cmd->comps = NULL; in mdp_auto_release_work()
519 cmd = container_of(data->pkt, struct mdp_cmdq_cmd, pkt); in mdp_handle_cmdq_callback()
520 cmd->data = data; in mdp_handle_cmdq_callback()
521 mdp = cmd->mdp; in mdp_handle_cmdq_callback()
522 dev = &mdp->pdev->dev; in mdp_handle_cmdq_callback()
524 INIT_WORK(&cmd->auto_release_work, mdp_auto_release_work); in mdp_handle_cmdq_callback()
525 if (!queue_work(mdp->clock_wq, &cmd->auto_release_work)) { in mdp_handle_cmdq_callback()
529 pipe_id = __get_pipe(mdp, cmd->comps[0].public_id); in mdp_handle_cmdq_callback()
530 mutex = __get_mutex(mdp, &mdp->mdp_data->pipe_info[pipe_id]); in mdp_handle_cmdq_callback()
532 mdp_comp_clocks_off(&mdp->pdev->dev, cmd->comps, in mdp_handle_cmdq_callback()
533 cmd->num_comps); in mdp_handle_cmdq_callback()
535 if (refcount_dec_and_test(&mdp->job_count)) in mdp_handle_cmdq_callback()
536 wake_up(&mdp->callback_wq); in mdp_handle_cmdq_callback()
538 cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt); in mdp_handle_cmdq_callback()
539 kfree(cmd->comps); in mdp_handle_cmdq_callback()
540 cmd->comps = NULL; in mdp_handle_cmdq_callback()
553 struct device *dev = &mdp->pdev->dev; in mdp_cmdq_prepare()
554 const int p_id = mdp->mdp_data->mdp_plat_id; in mdp_cmdq_prepare()
558 int i, ret = -ECANCELED; in mdp_cmdq_prepare()
569 ret = -ENOMEM; in mdp_cmdq_prepare()
573 ret = cmdq_pkt_create(mdp->cmdq_clt[pp_idx], &cmd->pkt, SZ_16K); in mdp_cmdq_prepare()
578 num_comp = CFG_GET(MT8183, param->config, num_components); in mdp_cmdq_prepare()
580 num_comp = CFG_GET(MT8195, param->config, num_components); in mdp_cmdq_prepare()
582 ret = -EINVAL; in mdp_cmdq_prepare()
588 ret = -ENOMEM; in mdp_cmdq_prepare()
594 ret = -ENOMEM; in mdp_cmdq_prepare()
598 path->mdp_dev = mdp; in mdp_cmdq_prepare()
599 path->config = config; in mdp_cmdq_prepare()
600 path->param = param->param; in mdp_cmdq_prepare()
601 for (i = 0; i < param->param->num_outputs; i++) { in mdp_cmdq_prepare()
602 path->bounds[i].left = 0; in mdp_cmdq_prepare()
603 path->bounds[i].top = 0; in mdp_cmdq_prepare()
604 path->bounds[i].width = in mdp_cmdq_prepare()
605 param->param->outputs[i].buffer.format.width; in mdp_cmdq_prepare()
606 path->bounds[i].height = in mdp_cmdq_prepare()
607 param->param->outputs[i].buffer.format.height; in mdp_cmdq_prepare()
608 path->composes[i] = param->composes[i] ? in mdp_cmdq_prepare()
609 param->composes[i] : &path->bounds[i]; in mdp_cmdq_prepare()
617 pipe_id = __get_pipe(mdp, path->comps[0].comp->public_id); in mdp_cmdq_prepare()
618 mutex = __get_mutex(mdp, &mdp->mdp_data->pipe_info[pipe_id]); in mdp_cmdq_prepare()
630 cmdq_pkt_eoc(&cmd->pkt); in mdp_cmdq_prepare()
631 cmdq_pkt_jump_rel(&cmd->pkt, CMDQ_INST_SIZE, mdp->cmdq_shift_pa[pp_idx]); in mdp_cmdq_prepare()
637 inner_id = CFG_GET(MT8183, path->config, components[i].type); in mdp_cmdq_prepare()
639 inner_id = CFG_GET(MT8195, path->config, components[i].type); in mdp_cmdq_prepare()
643 memcpy(&comps[i], path->comps[i].comp, in mdp_cmdq_prepare()
647 mdp->cmdq_clt[pp_idx]->client.rx_callback = mdp_handle_cmdq_callback; in mdp_cmdq_prepare()
648 cmd->mdp = mdp; in mdp_cmdq_prepare()
649 cmd->user_cmdq_cb = param->cmdq_cb; in mdp_cmdq_prepare()
650 cmd->user_cb_data = param->cb_data; in mdp_cmdq_prepare()
651 cmd->comps = comps; in mdp_cmdq_prepare()
652 cmd->num_comps = num_comp; in mdp_cmdq_prepare()
653 cmd->mdp_ctx = param->mdp_ctx; in mdp_cmdq_prepare()
654 cmd->pp_idx = pp_idx; in mdp_cmdq_prepare()
666 cmdq_pkt_destroy(mdp->cmdq_clt[pp_idx], &cmd->pkt); in mdp_cmdq_prepare()
676 struct device *dev = &mdp->pdev->dev; in mdp_cmdq_send()
678 u8 pp_used = __get_pp_num(param->param->type); in mdp_cmdq_send()
680 refcount_set(&mdp->job_count, pp_used); in mdp_cmdq_send()
681 if (atomic_read(&mdp->suspended)) { in mdp_cmdq_send()
682 refcount_set(&mdp->job_count, 0); in mdp_cmdq_send()
683 return -ECANCELED; in mdp_cmdq_send()
695 ret = mdp_comp_clocks_on(&mdp->pdev->dev, cmd[i]->comps, cmd[i]->num_comps); in mdp_cmdq_send()
701 dma_sync_single_for_device(mdp->cmdq_clt[i]->chan->mbox->dev, in mdp_cmdq_send()
702 cmd[i]->pkt.pa_base, cmd[i]->pkt.cmd_buf_size, in mdp_cmdq_send()
705 ret = mbox_send_message(mdp->cmdq_clt[i]->chan, &cmd[i]->pkt); in mdp_cmdq_send()
711 mbox_client_txdone(mdp->cmdq_clt[i]->chan, 0); in mdp_cmdq_send()
716 while (--i >= 0) in mdp_cmdq_send()
717 mdp_comp_clocks_off(&mdp->pdev->dev, cmd[i]->comps, in mdp_cmdq_send()
718 cmd[i]->num_comps); in mdp_cmdq_send()
720 refcount_set(&mdp->job_count, 0); in mdp_cmdq_send()