On Mon, 2016-09-05 at 12:17 +0200, Hans Verkuil wrote: > On 08/30/2016 02:25 PM, Minghsiu Tsai wrote: > > Add MDP driver for MT8173 > > > > Signed-off-by: Minghsiu Tsai <minghsiu.tsai@xxxxxxxxxxxx> > > --- > > drivers/media/platform/Kconfig | 17 + > > drivers/media/platform/Makefile | 2 + > > drivers/media/platform/mtk-mdp/Makefile | 9 + > > drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 159 ++++ > > drivers/media/platform/mtk-mdp/mtk_mdp_comp.h | 72 ++ > > drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 294 ++++++ > > drivers/media/platform/mtk-mdp/mtk_mdp_core.h | 260 +++++ > > drivers/media/platform/mtk-mdp/mtk_mdp_ipi.h | 126 +++ > > drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c | 1270 +++++++++++++++++++++++++ > > drivers/media/platform/mtk-mdp/mtk_mdp_m2m.h | 22 + > > drivers/media/platform/mtk-mdp/mtk_mdp_regs.c | 152 +++ > > drivers/media/platform/mtk-mdp/mtk_mdp_regs.h | 31 + > > drivers/media/platform/mtk-mdp/mtk_mdp_vpu.c | 145 +++ > > drivers/media/platform/mtk-mdp/mtk_mdp_vpu.h | 41 + > > 14 files changed, 2600 insertions(+) > > create mode 100644 drivers/media/platform/mtk-mdp/Makefile > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_comp.c > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_comp.h > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_core.c > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_core.h > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_ipi.h > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_m2m.h > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_regs.c > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_regs.h > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_vpu.c > > create mode 100644 drivers/media/platform/mtk-mdp/mtk_mdp_vpu.h > > > > <snip> > > > +static inline bool mtk_mdp_is_target_compose(u32 target) > > +{ > > + if (target == V4L2_SEL_TGT_COMPOSE_DEFAULT > > + || target == V4L2_SEL_TGT_COMPOSE_BOUNDS > > + || target == V4L2_SEL_TGT_COMPOSE) > > + return true; > > + return false; > > +} > > + > > +static inline bool mtk_mdp_is_target_crop(u32 target) > > +{ > > + if (target == V4L2_SEL_TGT_CROP_DEFAULT > > + || target == V4L2_SEL_TGT_CROP_BOUNDS > > + || target == V4L2_SEL_TGT_CROP) > > + return true; > > + return false; > > +} > > + > > +static int mtk_mdp_m2m_g_selection(struct file *file, void *fh, > > + struct v4l2_selection *s) > > +{ > > + struct mtk_mdp_frame *frame; > > + struct mtk_mdp_ctx *ctx = fh_to_ctx(fh); > > + bool valid = false; > > + > > + if (s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { > > + if (mtk_mdp_is_target_compose(s->target)) > > + valid = true; > > + } else if (s->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) { > > + if (mtk_mdp_is_target_crop(s->target)) > > + valid = true; > > + } > > + if (!valid) { > > + mtk_mdp_dbg(1, "[%d] invalid type:%d,%u", ctx->id, s->type, > > + s->target); > > + return -EINVAL; > > + } > > + > > + frame = mtk_mdp_ctx_get_frame(ctx, s->type); > > + > > + switch (s->target) { > > + case V4L2_SEL_TGT_COMPOSE_DEFAULT: > > + case V4L2_SEL_TGT_COMPOSE_BOUNDS: > > + case V4L2_SEL_TGT_CROP_BOUNDS: > > + case V4L2_SEL_TGT_CROP_DEFAULT: > > + s->r.left = 0; > > + s->r.top = 0; > > + s->r.width = frame->width; > > + s->r.height = frame->height; > > + return 0; > > + > > + case V4L2_SEL_TGT_COMPOSE: > > + case V4L2_SEL_TGT_CROP: > > + s->r.left = frame->crop.left; > > + s->r.top = frame->crop.top; > > + s->r.width = frame->crop.width; > > + s->r.height = frame->crop.height; > > + return 0; > > + } > > + > > + return -EINVAL; > > +} > > + > > +static int mtk_mdp_check_scaler_ratio(struct mtk_mdp_variant *var, int src_w, > > + int src_h, int dst_w, int dst_h, int rot) > > +{ > > + int tmp_w, tmp_h; > > + > > + if (rot == 90 || rot == 270) { > > + tmp_w = dst_h; > > + tmp_h = dst_w; > > + } else { > > + tmp_w = dst_w; > > + tmp_h = dst_h; > > + } > > + > > + if ((src_w / tmp_w) > var->h_scale_down_max || > > + (src_h / tmp_h) > var->v_scale_down_max || > > + (tmp_w / src_w) > var->h_scale_up_max || > > + (tmp_h / src_h) > var->v_scale_up_max) > > + return -EINVAL; > > + > > + return 0; > > +} > > + > > +static int mtk_mdp_m2m_s_selection(struct file *file, void *fh, > > + struct v4l2_selection *s) > > +{ > > + struct mtk_mdp_frame *frame; > > + struct mtk_mdp_ctx *ctx = fh_to_ctx(fh); > > + struct v4l2_rect new_r; > > + struct mtk_mdp_variant *variant = ctx->mdp_dev->variant; > > + int ret; > > + bool valid = false; > > + > > + if (s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { > > + if (mtk_mdp_is_target_compose(s->target)) > > + valid = true; > > + } else if (s->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) { > > + if (mtk_mdp_is_target_crop(s->target)) > > + valid = true; > > + } > > These tests are wrong: you can't set the _DEFAULT and _BOUNDS targets. > Those are read-only. It's easiest to just explicitly check for _CROP or > _COMPOSE here. > > I've added a check to v4l2-compliance to test for this. > I will fix it in v6 and test with the latest v4l2-compliance. Thanks. > > + if (!valid) { > > + mtk_mdp_dbg(1, "[%d] invalid type:%d,%u", ctx->id, s->type, > > + s->target); > > + return -EINVAL; > > + } > > + > > + new_r = s->r; > > + ret = mtk_mdp_try_crop(ctx, s->type, &new_r); > > + if (ret) > > + return ret; > > + > > + if (mtk_mdp_is_target_crop(s->target)) > > + frame = &ctx->s_frame; > > + else > > + frame = &ctx->d_frame; > > + > > + /* Check to see if scaling ratio is within supported range */ > > + if (mtk_mdp_ctx_state_is_set(ctx, MTK_MDP_DST_FMT | MTK_MDP_SRC_FMT)) { > > + if (V4L2_TYPE_IS_OUTPUT(s->type)) { > > + ret = mtk_mdp_check_scaler_ratio(variant, new_r.width, > > + new_r.height, ctx->d_frame.crop.width, > > + ctx->d_frame.crop.height, > > + ctx->ctrls.rotate->val); > > + } else { > > + ret = mtk_mdp_check_scaler_ratio(variant, > > + ctx->s_frame.crop.width, > > + ctx->s_frame.crop.height, new_r.width, > > + new_r.height, ctx->ctrls.rotate->val); > > + } > > + > > + if (ret) { > > + dev_info(&ctx->mdp_dev->pdev->dev, > > + "Out of scaler range"); > > + return -EINVAL; > > + } > > + } > > + > > + s->r = new_r; > > + frame->crop = new_r; > > + > > + return 0; > > +} > > > Regards, > > Hans -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html