#include "mtk-mdp3-comp.h"
 #include "mtk-mdp3-core.h"
 #include "mtk-mdp3-m2m.h"
+#include "mtk-img-ipi.h"
 
 #define MDP_PATH_MAX_COMPS     IMG_MAX_COMPONENTS
 
  #define call_op(ctx, op, ...) \
        (has_op(ctx, op) ? (ctx)->comp->ops->op(ctx, ##__VA_ARGS__) : 0)
 
-static bool is_output_disabled(const struct img_compparam *param, u32 count)
+static bool is_output_disabled(int p_id, const struct img_compparam *param, u32 count)
 {
-       return (count < param->num_subfrms) ?
-               (param->frame.output_disable ||
-               param->subfrms[count].tile_disable) :
-               true;
+       u32 num = 0;
+       bool dis_output = false;
+       bool dis_tile = false;
+
+       if (CFG_CHECK(MT8183, p_id)) {
+               num = CFG_COMP(MT8183, param, num_subfrms);
+               dis_output = CFG_COMP(MT8183, param, frame.output_disable);
+               dis_tile = CFG_COMP(MT8183, param, frame.output_disable);
+       }
+
+       return (count < num) ? (dis_output || dis_tile) : true;
 }
 
 static int mdp_path_subfrm_require(const struct mdp_path *path,
                                   struct mdp_cmdq_cmd *cmd,
                                   s32 *mutex_id, u32 count)
 {
-       const struct img_config *config = path->config;
+       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 = path->mdp_dev->mdp_mutex;
        int id, index;
+       u32 num_comp = 0;
+
+       if (CFG_CHECK(MT8183, p_id))
+               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) {
        *mutex_id = data->pipe_info[index].mutex_id;
 
        /* Set mutex mod */
-       for (index = 0; index < config->num_components; index++) {
+       for (index = 0; index < num_comp; index++) {
                ctx = &path->comps[index];
-               if (is_output_disabled(ctx->param, count))
+               if (is_output_disabled(p_id, ctx->param, count))
                        continue;
                id = ctx->comp->public_id;
                mtk_mutex_write_mod(mutex[*mutex_id],
                               struct mdp_cmdq_cmd *cmd,
                               s32 *mutex_id, u32 count)
 {
-       const struct img_config *config = path->config;
+       const int p_id = path->mdp_dev->mdp_data->mdp_plat_id;
        const struct mdp_comp_ctx *ctx;
        struct device *dev = &path->mdp_dev->pdev->dev;
        struct mtk_mutex **mutex = path->mdp_dev->mdp_mutex;
        int index;
+       u32 num_comp = 0;
        s32 event;
 
        if (-1 == *mutex_id) {
                return -EINVAL;
        }
 
+       if (CFG_CHECK(MT8183, p_id))
+               num_comp = CFG_GET(MT8183, path->config, num_components);
+
        /* Wait WROT SRAM shared to DISP RDMA */
        /* Clear SOF event for each engine */
-       for (index = 0; index < config->num_components; index++) {
+       for (index = 0; index < num_comp; index++) {
                ctx = &path->comps[index];
-               if (is_output_disabled(ctx->param, count))
+               if (is_output_disabled(p_id, ctx->param, count))
                        continue;
                event = ctx->comp->gce_event[MDP_GCE_EVENT_SOF];
                if (event != MDP_GCE_NO_EVENT)
        mtk_mutex_enable_by_cmdq(mutex[*mutex_id], (void *)&cmd->pkt);
 
        /* Wait SOF events and clear mutex modules (optional) */
-       for (index = 0; index < config->num_components; index++) {
+       for (index = 0; index < num_comp; index++) {
                ctx = &path->comps[index];
-               if (is_output_disabled(ctx->param, count))
+               if (is_output_disabled(p_id, ctx->param, count))
                        continue;
                event = ctx->comp->gce_event[MDP_GCE_EVENT_SOF];
                if (event != MDP_GCE_NO_EVENT)
 
 static int mdp_path_ctx_init(struct mdp_dev *mdp, struct mdp_path *path)
 {
-       const struct img_config *config = path->config;
+       const int p_id = mdp->mdp_data->mdp_plat_id;
+       void *param = NULL;
        int index, ret;
+       u32 num_comp = 0;
 
-       if (config->num_components < 1)
+       if (CFG_CHECK(MT8183, p_id))
+               num_comp = CFG_GET(MT8183, path->config, num_components);
+
+       if (num_comp < 1)
                return -EINVAL;
 
-       for (index = 0; index < config->num_components; index++) {
+       for (index = 0; index < num_comp; index++) {
+               if (CFG_CHECK(MT8183, p_id))
+                       param = (void *)CFG_ADDR(MT8183, path->config, components[index]);
                ret = mdp_comp_ctx_config(mdp, &path->comps[index],
-                                         &config->components[index],
-                                         path->param);
+                                         param, path->param);
                if (ret)
                        return ret;
        }
 static int mdp_path_config_subfrm(struct mdp_cmdq_cmd *cmd,
                                  struct mdp_path *path, u32 count)
 {
-       const struct img_config *config = path->config;
-       const struct img_mmsys_ctrl *ctrl = &config->ctrls[count];
+       const int p_id = path->mdp_dev->mdp_data->mdp_plat_id;
+       const struct img_mmsys_ctrl *ctrl = NULL;
        const struct img_mux *set;
        struct mdp_comp_ctx *ctx;
        s32 mutex_id;
        int index, ret;
+       u32 num_comp = 0;
+
+       if (CFG_CHECK(MT8183, p_id))
+               num_comp = CFG_GET(MT8183, path->config, num_components);
+
+       if (CFG_CHECK(MT8183, p_id))
+               ctrl = CFG_ADDR(MT8183, path->config, ctrls[count]);
 
        /* Acquire components */
        ret = mdp_path_subfrm_require(path, cmd, &mutex_id, count);
                                    set->value, 0xFFFFFFFF);
        }
        /* Config sub-frame information */
-       for (index = (config->num_components - 1); index >= 0; index--) {
+       for (index = (num_comp - 1); index >= 0; index--) {
                ctx = &path->comps[index];
-               if (is_output_disabled(ctx->param, count))
+               if (is_output_disabled(p_id, ctx->param, count))
                        continue;
                ret = call_op(ctx, config_subfrm, cmd, count);
                if (ret)
        if (ret)
                return ret;
        /* Wait components done */
-       for (index = 0; index < config->num_components; index++) {
+       for (index = 0; index < num_comp; index++) {
                ctx = &path->comps[index];
-               if (is_output_disabled(ctx->param, count))
+               if (is_output_disabled(p_id, ctx->param, count))
                        continue;
                ret = call_op(ctx, wait_comp_event, cmd);
                if (ret)
                        return ret;
        }
        /* Advance to the next sub-frame */
-       for (index = 0; index < config->num_components; index++) {
+       for (index = 0; index < num_comp; index++) {
                ctx = &path->comps[index];
                ret = call_op(ctx, advance_subfrm, cmd, count);
                if (ret)
 static int mdp_path_config(struct mdp_dev *mdp, struct mdp_cmdq_cmd *cmd,
                           struct mdp_path *path)
 {
-       const struct img_config *config = path->config;
+       const int p_id = mdp->mdp_data->mdp_plat_id;
        struct mdp_comp_ctx *ctx;
        int index, count, ret;
+       u32 num_comp = 0;
+       u32 num_sub = 0;
+
+       if (CFG_CHECK(MT8183, p_id))
+               num_comp = CFG_GET(MT8183, path->config, num_components);
+
+       if (CFG_CHECK(MT8183, p_id))
+               num_sub = CFG_GET(MT8183, path->config, num_subfrms);
 
        /* Config path frame */
        /* Reset components */
-       for (index = 0; index < config->num_components; index++) {
+       for (index = 0; index < num_comp; index++) {
                ctx = &path->comps[index];
                ret = call_op(ctx, init_comp, cmd);
                if (ret)
                        return ret;
        }
        /* Config frame mode */
-       for (index = 0; index < config->num_components; index++) {
-               const struct v4l2_rect *compose =
-                       path->composes[ctx->param->outputs[0]];
+       for (index = 0; index < num_comp; index++) {
+               const struct v4l2_rect *compose;
+               u32 out = 0;
+
+               if (CFG_CHECK(MT8183, p_id))
+                       out = CFG_COMP(MT8183, ctx->param, outputs[0]);
 
+               compose = path->composes[out];
                ctx = &path->comps[index];
                ret = call_op(ctx, config_frame, cmd, compose);
                if (ret)
        }
 
        /* Config path sub-frames */
-       for (count = 0; count < config->num_subfrms; count++) {
+       for (count = 0; count < num_sub; count++) {
                ret = mdp_path_config_subfrm(cmd, path, count);
                if (ret)
                        return ret;
        }
        /* Post processing information */
-       for (index = 0; index < config->num_components; index++) {
+       for (index = 0; index < num_comp; index++) {
                ctx = &path->comps[index];
                ret = call_op(ctx, post_process, cmd);
                if (ret)
        struct mdp_cmdq_cmd *cmd = NULL;
        struct mdp_comp *comps = NULL;
        struct device *dev = &mdp->pdev->dev;
+       const int p_id = mdp->mdp_data->mdp_plat_id;
        int i, ret;
+       u32 num_comp = 0;
 
        atomic_inc(&mdp->job_count);
        if (atomic_read(&mdp->suspended)) {
        if (ret)
                goto err_free_cmd;
 
-       comps = kcalloc(param->config->num_components, sizeof(*comps),
-                       GFP_KERNEL);
+       if (CFG_CHECK(MT8183, p_id)) {
+               num_comp = CFG_GET(MT8183, param->config, num_components);
+       } else {
+               ret = -EINVAL;
+               goto err_destroy_pkt;
+       }
+       comps = kcalloc(num_comp, sizeof(*comps), GFP_KERNEL);
        if (!comps) {
                ret = -ENOMEM;
                goto err_destroy_pkt;
                path->composes[i] = param->composes[i] ?
                        param->composes[i] : &path->bounds[i];
        }
-
        ret = mdp_path_ctx_init(mdp, path);
        if (ret) {
                dev_err(dev, "mdp_path_ctx_init error\n");
        }
        cmdq_pkt_finalize(&cmd->pkt);
 
-       for (i = 0; i < param->config->num_components; i++)
+       for (i = 0; i < num_comp; i++)
                memcpy(&comps[i], path->comps[i].comp,
                       sizeof(struct mdp_comp));
 
        cmd->user_cmdq_cb = param->cmdq_cb;
        cmd->user_cb_data = param->cb_data;
        cmd->comps = comps;
-       cmd->num_comps = param->config->num_components;
+       cmd->num_comps = num_comp;
        cmd->mdp_ctx = param->mdp_ctx;
 
        ret = mdp_comp_clocks_on(&mdp->pdev->dev, cmd->comps, cmd->num_comps);
 
 #include "mdp_reg_wdma.h"
 
 static u32 mdp_comp_alias_id[MDP_COMP_TYPE_COUNT];
+static int p_id;
 
 static inline const struct mdp_platform_config *
 __get_plat_cfg(const struct mdp_comp_ctx *ctx)
                             struct mdp_cmdq_cmd *cmd,
                             const struct v4l2_rect *compose)
 {
-       const struct mdp_rdma_data *rdma = &ctx->param->rdma;
        const struct mdp_platform_config *mdp_cfg = __get_plat_cfg(ctx);
        u32 colorformat = ctx->input->buffer.format.colorformat;
        bool block10bit = MDP_COLOR_IS_10BIT_PACKED(colorformat);
        bool en_ufo = MDP_COLOR_IS_UFP(colorformat);
        phys_addr_t base = ctx->comp->reg_base;
        u8 subsys_id = ctx->comp->subsys_id;
+       u32 reg = 0;
 
        if (mdp_cfg && mdp_cfg->rdma_support_10bit) {
                if (block10bit)
                     0x00030071);
 
        /* Setup source frame info */
-       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_CON, rdma->src_ctrl,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.src_ctrl);
+       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_CON, reg,
                     0x03C8FE0F);
 
        if (mdp_cfg)
                if (mdp_cfg->rdma_support_10bit && en_ufo) {
                        /* Setup source buffer base */
+                       if (CFG_CHECK(MT8183, p_id))
+                               reg = CFG_COMP(MT8183, ctx->param, rdma.ufo_dec_y);
                        MM_REG_WRITE(cmd, subsys_id,
                                     base, MDP_RDMA_UFO_DEC_LENGTH_BASE_Y,
-                                    rdma->ufo_dec_y, 0xFFFFFFFF);
+                                    reg, 0xFFFFFFFF);
+                       if (CFG_CHECK(MT8183, p_id))
+                               reg = CFG_COMP(MT8183, ctx->param, rdma.ufo_dec_c);
                        MM_REG_WRITE(cmd, subsys_id,
                                     base, MDP_RDMA_UFO_DEC_LENGTH_BASE_C,
-                                    rdma->ufo_dec_c, 0xFFFFFFFF);
+                                    reg, 0xFFFFFFFF);
                        /* Set 10bit source frame pitch */
-                       if (block10bit)
+                       if (block10bit) {
+                               if (CFG_CHECK(MT8183, p_id))
+                                       reg = CFG_COMP(MT8183, ctx->param, rdma.mf_bkgd_in_pxl);
                                MM_REG_WRITE(cmd, subsys_id,
                                             base, MDP_RDMA_MF_BKGD_SIZE_IN_PXL,
-                                            rdma->mf_bkgd_in_pxl, 0x001FFFFF);
+                                            reg, 0x001FFFFF);
+                       }
                }
 
-       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_CON, rdma->control,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.control);
+       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_CON, reg,
                     0x1110);
        /* Setup source buffer base */
-       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_BASE_0, rdma->iova[0],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.iova[0]);
+       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_BASE_0, reg,
                     0xFFFFFFFF);
-       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_BASE_1, rdma->iova[1],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.iova[1]);
+       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_BASE_1, reg,
                     0xFFFFFFFF);
-       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_BASE_2, rdma->iova[2],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.iova[2]);
+       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_BASE_2, reg,
                     0xFFFFFFFF);
        /* Setup source buffer end */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.iova_end[0]);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_END_0,
-                    rdma->iova_end[0], 0xFFFFFFFF);
+                    reg, 0xFFFFFFFF);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.iova_end[1]);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_END_1,
-                    rdma->iova_end[1], 0xFFFFFFFF);
+                    reg, 0xFFFFFFFF);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.iova_end[2]);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_END_2,
-                    rdma->iova_end[2], 0xFFFFFFFF);
+                    reg, 0xFFFFFFFF);
        /* Setup source frame pitch */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.mf_bkgd);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_MF_BKGD_SIZE_IN_BYTE,
-                    rdma->mf_bkgd, 0x001FFFFF);
+                    reg, 0x001FFFFF);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.sf_bkgd);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SF_BKGD_SIZE_IN_BYTE,
-                    rdma->sf_bkgd, 0x001FFFFF);
+                    reg, 0x001FFFFF);
        /* Setup color transform */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.transform);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_TRANSFORM_0,
-                    rdma->transform, 0x0F110000);
+                    reg, 0x0F110000);
 
        return 0;
 }
 static int config_rdma_subfrm(struct mdp_comp_ctx *ctx,
                              struct mdp_cmdq_cmd *cmd, u32 index)
 {
-       const struct mdp_rdma_subfrm *subfrm = &ctx->param->rdma.subfrms[index];
-       const struct img_comp_subfrm *csf = &ctx->param->subfrms[index];
        const struct mdp_platform_config *mdp_cfg = __get_plat_cfg(ctx);
        u32 colorformat = ctx->input->buffer.format.colorformat;
        bool block10bit = MDP_COLOR_IS_10BIT_PACKED(colorformat);
        bool en_ufo = MDP_COLOR_IS_UFP(colorformat);
        phys_addr_t base = ctx->comp->reg_base;
        u8 subsys_id = ctx->comp->subsys_id;
+       u32 csf_l = 0, csf_r = 0;
+       u32 reg = 0;
 
        /* Enable RDMA */
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_EN, BIT(0), BIT(0));
 
        /* Set Y pixel offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.subfrms[index].offset[0]);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_OFFSET_0,
-                    subfrm->offset[0], 0xFFFFFFFF);
+                    reg, 0xFFFFFFFF);
 
        /* Set 10bit UFO mode */
-       if (mdp_cfg)
-               if (mdp_cfg->rdma_support_10bit && block10bit && en_ufo)
+       if (mdp_cfg) {
+               if (mdp_cfg->rdma_support_10bit && block10bit && en_ufo) {
+                       if (CFG_CHECK(MT8183, p_id))
+                               reg = CFG_COMP(MT8183, ctx->param, rdma.subfrms[index].offset_0_p);
                        MM_REG_WRITE(cmd, subsys_id, base,
                                     MDP_RDMA_SRC_OFFSET_0_P,
-                                    subfrm->offset_0_p, 0xFFFFFFFF);
+                                    reg, 0xFFFFFFFF);
+               }
+       }
 
        /* Set U pixel offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.subfrms[index].offset[1]);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_OFFSET_1,
-                    subfrm->offset[1], 0xFFFFFFFF);
+                    reg, 0xFFFFFFFF);
        /* Set V pixel offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.subfrms[index].offset[2]);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_SRC_OFFSET_2,
-                    subfrm->offset[2], 0xFFFFFFFF);
+                    reg, 0xFFFFFFFF);
        /* Set source size */
-       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_MF_SRC_SIZE, subfrm->src,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.subfrms[index].src);
+       MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_MF_SRC_SIZE, reg,
                     0x1FFF1FFF);
        /* Set target size */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.subfrms[index].clip);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_MF_CLIP_SIZE,
-                    subfrm->clip, 0x1FFF1FFF);
+                    reg, 0x1FFF1FFF);
        /* Set crop offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rdma.subfrms[index].clip_ofst);
        MM_REG_WRITE(cmd, subsys_id, base, MDP_RDMA_MF_OFFSET_1,
-                    subfrm->clip_ofst, 0x003F001F);
+                    reg, 0x003F001F);
 
+       if (CFG_CHECK(MT8183, p_id)) {
+               csf_l = CFG_COMP(MT8183, ctx->param, subfrms[index].in.left);
+               csf_r = CFG_COMP(MT8183, ctx->param, subfrms[index].in.right);
+       }
        if (mdp_cfg && mdp_cfg->rdma_upsample_repeat_only)
-               if ((csf->in.right - csf->in.left + 1) > 320)
+               if ((csf_r - csf_l + 1) > 320)
                        MM_REG_WRITE(cmd, subsys_id, base,
                                     MDP_RDMA_RESV_DUMMY_0, BIT(2), BIT(2));
 
                            struct mdp_cmdq_cmd *cmd,
                            const struct v4l2_rect *compose)
 {
-       const struct mdp_rsz_data *rsz = &ctx->param->rsz;
        phys_addr_t base = ctx->comp->reg_base;
        u8 subsys_id = ctx->comp->subsys_id;
+       bool bypass = FALSE;
+       u32 reg = 0;
 
-       if (ctx->param->frame.bypass) {
+       if (CFG_CHECK(MT8183, p_id))
+               bypass = CFG_COMP(MT8183, ctx->param, frame.bypass);
+
+       if (bypass) {
                /* Disable RSZ */
                MM_REG_WRITE(cmd, subsys_id, base, PRZ_ENABLE, 0x0, BIT(0));
                return 0;
        }
 
-       MM_REG_WRITE(cmd, subsys_id, base, PRZ_CONTROL_1, rsz->control1,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rsz.control1);
+       MM_REG_WRITE(cmd, subsys_id, base, PRZ_CONTROL_1, reg,
                     0x03FFFDF3);
-       MM_REG_WRITE(cmd, subsys_id, base, PRZ_CONTROL_2, rsz->control2,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rsz.control2);
+       MM_REG_WRITE(cmd, subsys_id, base, PRZ_CONTROL_2, reg,
                     0x0FFFC290);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rsz.coeff_step_x);
        MM_REG_WRITE(cmd, subsys_id, base, PRZ_HORIZONTAL_COEFF_STEP,
-                    rsz->coeff_step_x, 0x007FFFFF);
+                    reg, 0x007FFFFF);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rsz.coeff_step_y);
        MM_REG_WRITE(cmd, subsys_id, base, PRZ_VERTICAL_COEFF_STEP,
-                    rsz->coeff_step_y, 0x007FFFFF);
+                    reg, 0x007FFFFF);
        return 0;
 }
 
 static int config_rsz_subfrm(struct mdp_comp_ctx *ctx,
                             struct mdp_cmdq_cmd *cmd, u32 index)
 {
-       const struct mdp_rsz_subfrm *subfrm = &ctx->param->rsz.subfrms[index];
-       const struct img_comp_subfrm *csf = &ctx->param->subfrms[index];
        const struct mdp_platform_config *mdp_cfg = __get_plat_cfg(ctx);
        phys_addr_t base = ctx->comp->reg_base;
        u8 subsys_id = ctx->comp->subsys_id;
+       u32 csf_l = 0, csf_r = 0;
+       u32 reg = 0;
 
-       MM_REG_WRITE(cmd, subsys_id, base, PRZ_CONTROL_2, subfrm->control2,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rsz.subfrms[index].control2);
+       MM_REG_WRITE(cmd, subsys_id, base, PRZ_CONTROL_2, reg,
                     0x00003800);
-       MM_REG_WRITE(cmd, subsys_id, base, PRZ_INPUT_IMAGE, subfrm->src,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rsz.subfrms[index].src);
+       MM_REG_WRITE(cmd, subsys_id, base, PRZ_INPUT_IMAGE, reg,
                     0xFFFFFFFF);
 
+       if (CFG_CHECK(MT8183, p_id)) {
+               csf_l = CFG_COMP(MT8183, ctx->param, subfrms[index].in.left);
+               csf_r = CFG_COMP(MT8183, ctx->param, subfrms[index].in.right);
+       }
        if (mdp_cfg && mdp_cfg->rsz_disable_dcm_small_sample)
-               if ((csf->in.right - csf->in.left + 1) <= 16)
+               if ((csf_r - csf_l + 1) <= 16)
                        MM_REG_WRITE(cmd, subsys_id, base, PRZ_CONTROL_1,
                                     BIT(27), BIT(27));
 
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, subfrms[index].luma.left);
        MM_REG_WRITE(cmd, subsys_id, base, PRZ_LUMA_HORIZONTAL_INTEGER_OFFSET,
-                    csf->luma.left, 0xFFFF);
+                    reg, 0xFFFF);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, subfrms[index].luma.left_subpix);
        MM_REG_WRITE(cmd, subsys_id,
                     base, PRZ_LUMA_HORIZONTAL_SUBPIXEL_OFFSET,
-                    csf->luma.left_subpix, 0x1FFFFF);
+                    reg, 0x1FFFFF);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, subfrms[index].luma.top);
        MM_REG_WRITE(cmd, subsys_id, base, PRZ_LUMA_VERTICAL_INTEGER_OFFSET,
-                    csf->luma.top, 0xFFFF);
+                    reg, 0xFFFF);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, subfrms[index].luma.top_subpix);
        MM_REG_WRITE(cmd, subsys_id, base, PRZ_LUMA_VERTICAL_SUBPIXEL_OFFSET,
-                    csf->luma.top_subpix, 0x1FFFFF);
+                    reg, 0x1FFFFF);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, subfrms[index].chroma.left);
        MM_REG_WRITE(cmd, subsys_id,
                     base, PRZ_CHROMA_HORIZONTAL_INTEGER_OFFSET,
-                    csf->chroma.left, 0xFFFF);
+                    reg, 0xFFFF);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, subfrms[index].chroma.left_subpix);
        MM_REG_WRITE(cmd, subsys_id,
                     base, PRZ_CHROMA_HORIZONTAL_SUBPIXEL_OFFSET,
-                    csf->chroma.left_subpix, 0x1FFFFF);
+                    reg, 0x1FFFFF);
 
-       MM_REG_WRITE(cmd, subsys_id, base, PRZ_OUTPUT_IMAGE, subfrm->clip,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, rsz.subfrms[index].clip);
+       MM_REG_WRITE(cmd, subsys_id, base, PRZ_OUTPUT_IMAGE, reg,
                     0xFFFFFFFF);
 
        return 0;
        const struct mdp_platform_config *mdp_cfg = __get_plat_cfg(ctx);
 
        if (mdp_cfg && mdp_cfg->rsz_disable_dcm_small_sample) {
-               const struct img_comp_subfrm *csf = &ctx->param->subfrms[index];
                phys_addr_t base = ctx->comp->reg_base;
                u8 subsys_id = ctx->comp->subsys_id;
+               u32 csf_l = 0, csf_r = 0;
 
-               if ((csf->in.right - csf->in.left + 1) <= 16)
+               if (CFG_CHECK(MT8183, p_id)) {
+                       csf_l = CFG_COMP(MT8183, ctx->param, subfrms[index].in.left);
+                       csf_r = CFG_COMP(MT8183, ctx->param, subfrms[index].in.right);
+               }
+
+               if ((csf_r - csf_l + 1) <= 16)
                        MM_REG_WRITE(cmd, subsys_id, base, PRZ_CONTROL_1, 0x0,
                                     BIT(27));
        }
                             struct mdp_cmdq_cmd *cmd,
                             const struct v4l2_rect *compose)
 {
-       const struct mdp_wrot_data *wrot = &ctx->param->wrot;
        const struct mdp_platform_config *mdp_cfg = __get_plat_cfg(ctx);
        phys_addr_t base = ctx->comp->reg_base;
        u8 subsys_id = ctx->comp->subsys_id;
+       u32 reg = 0;
 
        /* Write frame base address */
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_BASE_ADDR, wrot->iova[0],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.iova[0]);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_BASE_ADDR, reg,
                     0xFFFFFFFF);
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_BASE_ADDR_C, wrot->iova[1],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.iova[1]);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_BASE_ADDR_C, reg,
                     0xFFFFFFFF);
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_BASE_ADDR_V, wrot->iova[2],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.iova[2]);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_BASE_ADDR_V, reg,
                     0xFFFFFFFF);
        /* Write frame related registers */
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_CTRL, wrot->control,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.control);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_CTRL, reg,
                     0xF131510F);
        /* Write frame Y pitch */
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_STRIDE, wrot->stride[0],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.stride[0]);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_STRIDE, reg,
                     0x0000FFFF);
        /* Write frame UV pitch */
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_STRIDE_C, wrot->stride[1],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.stride[1]);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_STRIDE_C, reg,
                     0xFFFF);
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_STRIDE_V, wrot->stride[2],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.stride[2]);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_STRIDE_V, reg,
                     0xFFFF);
        /* Write matrix control */
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_MAT_CTRL, wrot->mat_ctrl, 0xF3);
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.mat_ctrl);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_MAT_CTRL, reg, 0xF3);
 
        /* Set the fixed ALPHA as 0xFF */
        MM_REG_WRITE(cmd, subsys_id, base, VIDO_DITHER, 0xFF000000,
        /* Set VIDO_EOL_SEL */
        MM_REG_WRITE(cmd, subsys_id, base, VIDO_RSV_1, BIT(31), BIT(31));
        /* Set VIDO_FIFO_TEST */
-       if (wrot->fifo_test != 0)
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.fifo_test);
+       if (reg != 0)
                MM_REG_WRITE(cmd, subsys_id, base, VIDO_FIFO_TEST,
-                            wrot->fifo_test, 0xFFF);
+                            reg, 0xFFF);
        /* Filter enable */
-       if (mdp_cfg && mdp_cfg->wrot_filter_constraint)
+       if (mdp_cfg && mdp_cfg->wrot_filter_constraint) {
+               if (CFG_CHECK(MT8183, p_id))
+                       reg = CFG_COMP(MT8183, ctx->param, wrot.filter);
                MM_REG_WRITE(cmd, subsys_id, base, VIDO_MAIN_BUF_SIZE,
-                            wrot->filter, 0x77);
+                            reg, 0x77);
+       }
 
        return 0;
 }
 static int config_wrot_subfrm(struct mdp_comp_ctx *ctx,
                              struct mdp_cmdq_cmd *cmd, u32 index)
 {
-       const struct mdp_wrot_subfrm *subfrm = &ctx->param->wrot.subfrms[index];
        phys_addr_t base = ctx->comp->reg_base;
        u8 subsys_id = ctx->comp->subsys_id;
+       u32 reg = 0;
 
        /* Write Y pixel offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.subfrms[index].offset[0]);
        MM_REG_WRITE(cmd, subsys_id, base, VIDO_OFST_ADDR,
-                    subfrm->offset[0], 0x0FFFFFFF);
+                    reg, 0x0FFFFFFF);
        /* Write U pixel offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.subfrms[index].offset[1]);
        MM_REG_WRITE(cmd, subsys_id, base, VIDO_OFST_ADDR_C,
-                    subfrm->offset[1], 0x0FFFFFFF);
+                    reg, 0x0FFFFFFF);
        /* Write V pixel offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.subfrms[index].offset[2]);
        MM_REG_WRITE(cmd, subsys_id, base, VIDO_OFST_ADDR_V,
-                    subfrm->offset[2], 0x0FFFFFFF);
+                    reg, 0x0FFFFFFF);
        /* Write source size */
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_IN_SIZE, subfrm->src,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.subfrms[index].src);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_IN_SIZE, reg,
                     0x1FFF1FFF);
        /* Write target size */
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_TAR_SIZE, subfrm->clip,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.subfrms[index].clip);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_TAR_SIZE, reg,
                     0x1FFF1FFF);
-       MM_REG_WRITE(cmd, subsys_id, base, VIDO_CROP_OFST, subfrm->clip_ofst,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.subfrms[index].clip_ofst);
+       MM_REG_WRITE(cmd, subsys_id, base, VIDO_CROP_OFST, reg,
                     0x1FFF1FFF);
 
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wrot.subfrms[index].main_buf);
        MM_REG_WRITE(cmd, subsys_id, base, VIDO_MAIN_BUF_SIZE,
-                    subfrm->main_buf, 0x1FFF7F00);
+                    reg, 0x1FFF7F00);
 
        /* Enable WROT */
        MM_REG_WRITE(cmd, subsys_id, base, VIDO_ROT_EN, BIT(0), BIT(0));
                             struct mdp_cmdq_cmd *cmd,
                             const struct v4l2_rect *compose)
 {
-       const struct mdp_wdma_data *wdma = &ctx->param->wdma;
        phys_addr_t base = ctx->comp->reg_base;
        u8 subsys_id = ctx->comp->subsys_id;
+       u32 reg = 0;
 
        MM_REG_WRITE(cmd, subsys_id, base, WDMA_BUF_CON2, 0x10101050,
                     0xFFFFFFFF);
 
        /* Setup frame information */
-       MM_REG_WRITE(cmd, subsys_id, base, WDMA_CFG, wdma->wdma_cfg,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.wdma_cfg);
+       MM_REG_WRITE(cmd, subsys_id, base, WDMA_CFG, reg,
                     0x0F01B8F0);
        /* Setup frame base address */
-       MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_ADDR,   wdma->iova[0],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.iova[0]);
+       MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_ADDR, reg,
                     0xFFFFFFFF);
-       MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_U_ADDR, wdma->iova[1],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.iova[1]);
+       MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_U_ADDR, reg,
                     0xFFFFFFFF);
-       MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_V_ADDR, wdma->iova[2],
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.iova[2]);
+       MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_V_ADDR, reg,
                     0xFFFFFFFF);
        /* Setup Y pitch */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.w_in_byte);
        MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_W_IN_BYTE,
-                    wdma->w_in_byte, 0x0000FFFF);
+                    reg, 0x0000FFFF);
        /* Setup UV pitch */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.uv_stride);
        MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_UV_PITCH,
-                    wdma->uv_stride, 0x0000FFFF);
+                    reg, 0x0000FFFF);
        /* Set the fixed ALPHA as 0xFF */
        MM_REG_WRITE(cmd, subsys_id, base, WDMA_ALPHA, 0x800000FF,
                     0x800000FF);
 static int config_wdma_subfrm(struct mdp_comp_ctx *ctx,
                              struct mdp_cmdq_cmd *cmd, u32 index)
 {
-       const struct mdp_wdma_subfrm *subfrm = &ctx->param->wdma.subfrms[index];
        phys_addr_t base = ctx->comp->reg_base;
        u8 subsys_id = ctx->comp->subsys_id;
+       u32 reg = 0;
 
        /* Write Y pixel offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.subfrms[index].offset[0]);
        MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_ADDR_OFFSET,
-                    subfrm->offset[0], 0x0FFFFFFF);
+                    reg, 0x0FFFFFFF);
        /* Write U pixel offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.subfrms[index].offset[1]);
        MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_U_ADDR_OFFSET,
-                    subfrm->offset[1], 0x0FFFFFFF);
+                    reg, 0x0FFFFFFF);
        /* Write V pixel offset */
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.subfrms[index].offset[2]);
        MM_REG_WRITE(cmd, subsys_id, base, WDMA_DST_V_ADDR_OFFSET,
-                    subfrm->offset[2], 0x0FFFFFFF);
+                    reg, 0x0FFFFFFF);
        /* Write source size */
-       MM_REG_WRITE(cmd, subsys_id, base, WDMA_SRC_SIZE, subfrm->src,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.subfrms[index].src);
+       MM_REG_WRITE(cmd, subsys_id, base, WDMA_SRC_SIZE, reg,
                     0x3FFF3FFF);
        /* Write target size */
-       MM_REG_WRITE(cmd, subsys_id, base, WDMA_CLIP_SIZE, subfrm->clip,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.subfrms[index].clip);
+       MM_REG_WRITE(cmd, subsys_id, base, WDMA_CLIP_SIZE, reg,
                     0x3FFF3FFF);
        /* Write clip offset */
-       MM_REG_WRITE(cmd, subsys_id, base, WDMA_CLIP_COORD, subfrm->clip_ofst,
+       if (CFG_CHECK(MT8183, p_id))
+               reg = CFG_COMP(MT8183, ctx->param, wdma.subfrms[index].clip_ofst);
+       MM_REG_WRITE(cmd, subsys_id, base, WDMA_CLIP_COORD, reg,
                     0x3FFF3FFF);
 
        /* Enable WDMA */
 static int config_ccorr_subfrm(struct mdp_comp_ctx *ctx,
                               struct mdp_cmdq_cmd *cmd, u32 index)
 {
-       const struct img_comp_subfrm *csf = &ctx->param->subfrms[index];
        phys_addr_t base = ctx->comp->reg_base;
        u8 subsys_id = ctx->comp->subsys_id;
+       u32 csf_l = 0, csf_r = 0;
+       u32 csf_t = 0, csf_b = 0;
        u32 hsize, vsize;
 
-       hsize = csf->in.right - csf->in.left + 1;
-       vsize = csf->in.bottom - csf->in.top + 1;
+       if (CFG_CHECK(MT8183, p_id)) {
+               csf_l = CFG_COMP(MT8183, ctx->param, subfrms[index].in.left);
+               csf_r = CFG_COMP(MT8183, ctx->param, subfrms[index].in.right);
+               csf_t = CFG_COMP(MT8183, ctx->param, subfrms[index].in.top);
+               csf_b = CFG_COMP(MT8183, ctx->param, subfrms[index].in.bottom);
+       }
+
+       hsize = csf_r - csf_l + 1;
+       vsize = csf_b - csf_t + 1;
        MM_REG_WRITE(cmd, subsys_id, base, MDP_CCORR_SIZE,
                     (hsize << 16) + (vsize <<  0), 0x1FFF1FFF);
        return 0;
        int ret;
 
        memset(mdp_comp_alias_id, 0, sizeof(mdp_comp_alias_id));
+       p_id = mdp->mdp_data->mdp_plat_id;
 
        parent = dev->of_node->parent;
        /* Iterate over sibling MDP function blocks */
 {
        struct device *dev = &mdp->pdev->dev;
        enum mtk_mdp_comp_id public_id = MDP_COMP_NONE;
-       int i;
+       u32 arg;
+       int i, idx;
 
-       public_id = mdp_cfg_get_id_public(mdp, param->type);
+       if (!param) {
+               dev_err(dev, "Invalid component param");
+               return -EINVAL;
+       }
+
+       if (CFG_CHECK(MT8183, p_id))
+               arg = CFG_COMP(MT8183, param, type);
+       else
+               return -EINVAL;
+       public_id = mdp_cfg_get_id_public(mdp, arg);
        if (public_id < 0) {
                dev_err(dev, "Invalid component id %d", public_id);
                return -EINVAL;
 
        ctx->comp = mdp->comp[public_id];
        if (!ctx->comp) {
-               dev_err(dev, "Uninit component inner id %d", param->type);
+               dev_err(dev, "Uninit component inner id %d", arg);
                return -EINVAL;
        }
 
        ctx->param = param;
-       ctx->input = &frame->inputs[param->input];
-       for (i = 0; i < param->num_outputs; i++)
-               ctx->outputs[i] = &frame->outputs[param->outputs[i]];
+       if (CFG_CHECK(MT8183, p_id))
+               arg = CFG_COMP(MT8183, param, input);
+       else
+               return -EINVAL;
+       ctx->input = &frame->inputs[arg];
+       if (CFG_CHECK(MT8183, p_id))
+               idx = CFG_COMP(MT8183, param, num_outputs);
+       else
+               return -EINVAL;
+       for (i = 0; i < idx; i++) {
+               if (CFG_CHECK(MT8183, p_id))
+                       arg = CFG_COMP(MT8183, param, outputs[i]);
+               else
+                       return -EINVAL;
+               ctx->outputs[i] = &frame->outputs[arg];
+       }
        return 0;
 }