media: platform: mtk-mdp3: introduce more pipelines from MT8195

Increasing the number of sets built by MMSYS and MUTEX in MT8195
will enable the creation of more pipelines in MDP3.

Signed-off-by: Moudy Ho <moudy.ho@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Sebastian Fricke <sebastian.fricke@collabora.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
Moudy Ho 2023-12-20 11:18:29 +01:00 committed by Mauro Carvalho Chehab
parent ee0d0dbb80
commit d9b52f7356
2 changed files with 60 additions and 27 deletions

View File

@ -50,6 +50,43 @@ static struct mtk_mutex *__get_mutex(const struct mdp_dev *mdp_dev,
return mdp_dev->mm_subsys[p->sub_id].mdp_mutex[p->mutex_id];
}
static enum mdp_pipe_id __get_pipe(const struct mdp_dev *mdp_dev,
enum mtk_mdp_comp_id id)
{
enum mdp_pipe_id pipe_id;
switch (id) {
case MDP_COMP_RDMA0:
pipe_id = MDP_PIPE_RDMA0;
break;
case MDP_COMP_ISP_IMGI:
pipe_id = MDP_PIPE_IMGI;
break;
case MDP_COMP_WPEI:
pipe_id = MDP_PIPE_WPEI;
break;
case MDP_COMP_WPEI2:
pipe_id = MDP_PIPE_WPEI2;
break;
case MDP_COMP_RDMA1:
pipe_id = MDP_PIPE_RDMA1;
break;
case MDP_COMP_RDMA2:
pipe_id = MDP_PIPE_RDMA2;
break;
case MDP_COMP_RDMA3:
pipe_id = MDP_PIPE_RDMA3;
break;
default:
/* Avoid exceptions when operating MUTEX */
pipe_id = MDP_PIPE_RDMA0;
dev_err(&mdp_dev->pdev->dev, "Unknown pipeline id %d", id);
break;
}
return pipe_id;
}
static int mdp_path_subfrm_require(const struct mdp_path *path,
struct mdp_cmdq_cmd *cmd,
struct mdp_pipe_info *p, u32 count)
@ -57,7 +94,6 @@ static int mdp_path_subfrm_require(const struct mdp_path *path,
const int p_id = path->mdp_dev->mdp_data->mdp_plat_id;
const struct mdp_comp_ctx *ctx;
const struct mtk_mdp_driver_data *data = path->mdp_dev->mdp_data;
struct device *dev = &path->mdp_dev->pdev->dev;
struct mtk_mutex *mutex;
int id, index;
u32 num_comp = 0;
@ -66,23 +102,7 @@ static int mdp_path_subfrm_require(const struct mdp_path *path,
num_comp = CFG_GET(MT8183, path->config, num_components);
/* Decide which mutex to use based on the current pipeline */
switch (path->comps[0].comp->public_id) {
case MDP_COMP_RDMA0:
index = MDP_PIPE_RDMA0;
break;
case MDP_COMP_ISP_IMGI:
index = MDP_PIPE_IMGI;
break;
case MDP_COMP_WPEI:
index = MDP_PIPE_WPEI;
break;
case MDP_COMP_WPEI2:
index = MDP_PIPE_WPEI2;
break;
default:
dev_err(dev, "Unknown pipeline and no mutex is assigned");
return -EINVAL;
}
index = __get_pipe(path->mdp_dev, path->comps[0].comp->public_id);
memcpy(p, &data->pipe_info[index], sizeof(struct mdp_pipe_info));
mutex = __get_mutex(path->mdp_dev, p);
@ -336,11 +356,13 @@ static void mdp_auto_release_work(struct work_struct *work)
struct mdp_cmdq_cmd *cmd;
struct mdp_dev *mdp;
struct mtk_mutex *mutex;
enum mdp_pipe_id pipe_id;
cmd = container_of(work, struct mdp_cmdq_cmd, auto_release_work);
mdp = cmd->mdp;
mutex = __get_mutex(mdp, &mdp->mdp_data->pipe_info[MDP_PIPE_RDMA0]);
pipe_id = __get_pipe(mdp, cmd->comps[0].public_id);
mutex = __get_mutex(mdp, &mdp->mdp_data->pipe_info[pipe_id]);
mtk_mutex_unprepare(mutex);
mdp_comp_clocks_off(&mdp->pdev->dev, cmd->comps,
cmd->num_comps);
@ -361,6 +383,7 @@ static void mdp_handle_cmdq_callback(struct mbox_client *cl, void *mssg)
struct cmdq_cb_data *data;
struct mdp_dev *mdp;
struct device *dev;
enum mdp_pipe_id pipe_id;
if (!mssg) {
pr_info("%s:no callback data\n", __func__);
@ -388,7 +411,8 @@ static void mdp_handle_cmdq_callback(struct mbox_client *cl, void *mssg)
struct mtk_mutex *mutex;
dev_err(dev, "%s:queue_work fail!\n", __func__);
mutex = __get_mutex(mdp, &mdp->mdp_data->pipe_info[MDP_PIPE_RDMA0]);
pipe_id = __get_pipe(mdp, cmd->comps[0].public_id);
mutex = __get_mutex(mdp, &mdp->mdp_data->pipe_info[pipe_id]);
mtk_mutex_unprepare(mutex);
mdp_comp_clocks_off(&mdp->pdev->dev, cmd->comps,
cmd->num_comps);
@ -412,6 +436,7 @@ int mdp_cmdq_send(struct mdp_dev *mdp, struct mdp_cmdq_param *param)
struct device *dev = &mdp->pdev->dev;
const int p_id = mdp->mdp_data->mdp_plat_id;
struct mtk_mutex *mutex = NULL;
enum mdp_pipe_id pipe_id;
int i, ret;
u32 num_comp = 0;
@ -449,13 +474,6 @@ int mdp_cmdq_send(struct mdp_dev *mdp, struct mdp_cmdq_param *param)
goto err_free_comps;
}
mutex = __get_mutex(mdp, &mdp->mdp_data->pipe_info[MDP_PIPE_RDMA0]);
ret = mtk_mutex_prepare(mutex);
if (ret) {
dev_err(dev, "Fail to enable mutex clk\n");
goto err_free_path;
}
path->mdp_dev = mdp;
path->config = param->config;
path->param = param->param;
@ -475,6 +493,14 @@ int mdp_cmdq_send(struct mdp_dev *mdp, struct mdp_cmdq_param *param)
goto err_free_path;
}
pipe_id = __get_pipe(mdp, path->comps[0].comp->public_id);
mutex = __get_mutex(mdp, &mdp->mdp_data->pipe_info[pipe_id]);
ret = mtk_mutex_prepare(mutex);
if (ret) {
dev_err(dev, "Fail to enable mutex clk\n");
goto err_free_path;
}
ret = mdp_path_config(mdp, cmd, path);
if (ret) {
dev_err(dev, "mdp_path_config error\n");

View File

@ -59,6 +59,13 @@ enum mdp_pipe_id {
MDP_PIPE_WPEI2,
MDP_PIPE_IMGI,
MDP_PIPE_RDMA0,
MDP_PIPE_RDMA1,
MDP_PIPE_RDMA2,
MDP_PIPE_RDMA3,
MDP_PIPE_SPLIT,
MDP_PIPE_SPLIT2,
MDP_PIPE_VPP0_SOUT,
MDP_PIPE_VPP1_SOUT,
MDP_PIPE_MAX
};