Getting secure video playback (svp) flag when request output buffer, then
calling init interface to init svp parameters in optee-os.

Signed-off-by: Yunfei Dong <yunfei.d...@mediatek.com>
---
 .../mediatek/vcodec/decoder/mtk_vcodec_dec.c  | 144 ++++++++++++------
 1 file changed, 94 insertions(+), 50 deletions(-)

diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c 
b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
index ab922e8d2d37..3639beac20cb 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
@@ -184,6 +184,74 @@ void mtk_vcodec_dec_set_default_params(struct 
mtk_vcodec_dec_ctx *ctx)
        q_data->bytesperline[1] = q_data->coded_width;
 }
 
+static int mtk_vcodec_dec_init_pic_info(struct mtk_vcodec_dec_ctx *ctx, enum 
v4l2_buf_type type)
+{
+       const struct mtk_vcodec_dec_pdata *dec_pdata = ctx->dev->vdec_pdata;
+       struct mtk_q_data *q_data;
+       int ret;
+
+       if (!ctx->current_codec)
+               return 0;
+
+       if (V4L2_TYPE_IS_OUTPUT(type) && ctx->state == MTK_STATE_FREE) {
+               q_data = mtk_vdec_get_q_data(ctx, 
V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
+               if (!q_data)
+                       return -EINVAL;
+
+               ret = vdec_if_init(ctx, q_data->fmt->fourcc);
+               if (ret) {
+                       mtk_v4l2_vdec_err(ctx, "[%d]: vdec_if_init() fail 
ret=%d",
+                                         ctx->id, ret);
+                       return -EINVAL;
+               }
+               ctx->state = MTK_STATE_INIT;
+       }
+
+       if (!dec_pdata->uses_stateless_api)
+               return 0;
+
+       /*
+        * If get pic info fail, need to use the default pic info params, or
+        * v4l2-compliance will fail
+        */
+       ret = vdec_if_get_param(ctx, GET_PARAM_PIC_INFO, &ctx->picinfo);
+       if (ret) {
+               mtk_v4l2_vdec_err(ctx, "[%d]Error!! Get GET_PARAM_PICTURE_INFO 
Fail",
+                                 ctx->id);
+       }
+
+       ctx->last_decoded_picinfo = ctx->picinfo;
+
+       if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 1) {
+               ctx->q_data[MTK_Q_DATA_DST].sizeimage[0] =
+                       ctx->picinfo.fb_sz[0] +
+                       ctx->picinfo.fb_sz[1];
+               ctx->q_data[MTK_Q_DATA_DST].bytesperline[0] =
+                       ctx->picinfo.buf_w;
+       } else {
+               if (ctx->is_secure_playback)
+                       ctx->q_data[MTK_Q_DATA_DST].sizeimage[0] =
+                               ctx->picinfo.fb_sz[0] + ctx->picinfo.fb_sz[1];
+               else
+                       ctx->q_data[MTK_Q_DATA_DST].sizeimage[0] = 
ctx->picinfo.fb_sz[0];
+
+               ctx->q_data[MTK_Q_DATA_DST].bytesperline[0] = 
ctx->picinfo.buf_w;
+               ctx->q_data[MTK_Q_DATA_DST].sizeimage[1] = 
ctx->picinfo.fb_sz[1];
+               ctx->q_data[MTK_Q_DATA_DST].bytesperline[1] = 
ctx->picinfo.buf_w;
+       }
+
+       ctx->q_data[MTK_Q_DATA_DST].coded_width = ctx->picinfo.buf_w;
+       ctx->q_data[MTK_Q_DATA_DST].coded_height = ctx->picinfo.buf_h;
+       mtk_v4l2_vdec_dbg(2, ctx,
+                         "[%d] init() plane:%d wxh=%dx%d pic wxh=%dx%d 
sz=0x%x_0x%x",
+                         ctx->id, q_data->fmt->num_planes,
+                         ctx->picinfo.buf_w, ctx->picinfo.buf_h,
+                         ctx->picinfo.pic_w, ctx->picinfo.pic_h,
+                         ctx->q_data[MTK_Q_DATA_DST].sizeimage[0],
+                         ctx->q_data[MTK_Q_DATA_DST].sizeimage[1]);
+       return 0;
+}
+
 static int vidioc_vdec_qbuf(struct file *file, void *priv,
                            struct v4l2_buffer *buf)
 {
@@ -479,17 +547,7 @@ static int vidioc_vdec_s_fmt(struct file *file, void *priv,
                ctx->ycbcr_enc = pix_mp->ycbcr_enc;
                ctx->quantization = pix_mp->quantization;
                ctx->xfer_func = pix_mp->xfer_func;
-
                ctx->current_codec = fmt->fourcc;
-               if (ctx->state == MTK_STATE_FREE) {
-                       ret = vdec_if_init(ctx, q_data->fmt->fourcc);
-                       if (ret) {
-                               mtk_v4l2_vdec_err(ctx, "[%d]: vdec_if_init() 
fail ret=%d",
-                                                 ctx->id, ret);
-                               return -EINVAL;
-                       }
-                       ctx->state = MTK_STATE_INIT;
-               }
        } else {
                ctx->capture_fourcc = fmt->fourcc;
        }
@@ -502,46 +560,11 @@ static int vidioc_vdec_s_fmt(struct file *file, void 
*priv,
                ctx->picinfo.pic_w = pix_mp->width;
                ctx->picinfo.pic_h = pix_mp->height;
 
-               /*
-                * If get pic info fail, need to use the default pic info 
params, or
-                * v4l2-compliance will fail
-                */
-               ret = vdec_if_get_param(ctx, GET_PARAM_PIC_INFO, &ctx->picinfo);
-               if (ret) {
-                       mtk_v4l2_vdec_err(ctx, "[%d]Error!! Get 
GET_PARAM_PICTURE_INFO Fail",
-                                         ctx->id);
-               }
-
-               ctx->last_decoded_picinfo = ctx->picinfo;
-
-               if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 1) {
-                       ctx->q_data[MTK_Q_DATA_DST].sizeimage[0] =
-                               ctx->picinfo.fb_sz[0] +
-                               ctx->picinfo.fb_sz[1];
-                       ctx->q_data[MTK_Q_DATA_DST].bytesperline[0] =
-                               ctx->picinfo.buf_w;
-               } else {
-                       ctx->q_data[MTK_Q_DATA_DST].sizeimage[0] =
-                               ctx->picinfo.fb_sz[0];
-                       ctx->q_data[MTK_Q_DATA_DST].bytesperline[0] =
-                               ctx->picinfo.buf_w;
-                       ctx->q_data[MTK_Q_DATA_DST].sizeimage[1] =
-                               ctx->picinfo.fb_sz[1];
-                       ctx->q_data[MTK_Q_DATA_DST].bytesperline[1] =
-                               ctx->picinfo.buf_w;
-               }
-
-               ctx->q_data[MTK_Q_DATA_DST].coded_width = ctx->picinfo.buf_w;
-               ctx->q_data[MTK_Q_DATA_DST].coded_height = ctx->picinfo.buf_h;
-               mtk_v4l2_vdec_dbg(2, ctx,
-                                 "[%d] init() plane:%d wxh=%dx%d pic wxh=%dx%d 
sz=0x%x_0x%x",
-                                 ctx->id, pix_mp->num_planes,
-                                 ctx->picinfo.buf_w, ctx->picinfo.buf_h,
-                                 ctx->picinfo.pic_w, ctx->picinfo.pic_h,
-                                 ctx->q_data[MTK_Q_DATA_DST].sizeimage[0],
-                                 ctx->q_data[MTK_Q_DATA_DST].sizeimage[1]);
+               if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+                       ret = mtk_vcodec_dec_init_pic_info(ctx, f->type);
        }
-       return 0;
+
+       return ret;
 }
 
 static int vidioc_enum_framesizes(struct file *file, void *priv,
@@ -722,7 +745,7 @@ int vb2ops_vdec_queue_setup(struct vb2_queue *vq, unsigned 
int *nbuffers,
 {
        struct mtk_vcodec_dec_ctx *ctx = vb2_get_drv_priv(vq);
        struct mtk_q_data *q_data;
-       unsigned int i;
+       unsigned int i, ret;
 
        q_data = mtk_vdec_get_q_data(ctx, vq->type);
 
@@ -731,6 +754,25 @@ int vb2ops_vdec_queue_setup(struct vb2_queue *vq, unsigned 
int *nbuffers,
                return -EINVAL;
        }
 
+       if (vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+               ret = mtk_vcodec_dec_init_pic_info(ctx, vq->type);
+               if (ret) {
+                       mtk_v4l2_vdec_err(ctx, "Failed to init picture 
information");
+                       return ret;
+               }
+
+               if (vq->secure_mem && !ctx->is_secure_playback) {
+                       ret = 
mtk_vcodec_dec_optee_open(ctx->dev->optee_private);
+                       if (ret) {
+                               mtk_v4l2_vdec_err(ctx, "Failed to open decoder 
optee os");
+                               return ret;
+                       }
+                       ctx->is_secure_playback = vq->secure_mem;
+                       mtk_v4l2_vdec_dbg(1, ctx, "Getting secure decoder 
mode:%d",
+                                         ctx->is_secure_playback);
+               }
+       }
+
        if (*nplanes) {
                if (vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
                        if (*nplanes != q_data->fmt->num_planes)
@@ -980,6 +1022,7 @@ int mtk_vcodec_dec_queue_init(void *priv, struct vb2_queue 
*src_vq,
        src_vq->lock            = &ctx->dev->dev_mutex;
        src_vq->dev             = &ctx->dev->plat_dev->dev;
        src_vq->allow_cache_hints = 1;
+       src_vq->allow_secure_mem = 1;
 
        ret = vb2_queue_init(src_vq);
        if (ret) {
@@ -996,6 +1039,7 @@ int mtk_vcodec_dec_queue_init(void *priv, struct vb2_queue 
*src_vq,
        dst_vq->lock            = &ctx->dev->dev_mutex;
        dst_vq->dev             = &ctx->dev->plat_dev->dev;
        dst_vq->allow_cache_hints = 1;
+       dst_vq->allow_secure_mem = 1;
 
        ret = vb2_queue_init(dst_vq);
        if (ret)
-- 
2.18.0

Reply via email to