Change hevc driver to support secure video playback(svp) for
mt8188. Need to map shared memory with optee interface and
wait interrupt in optee-os.

Signed-off-by: Yunfei Dong <yunfei.d...@mediatek.com>
---
 .../decoder/vdec/vdec_hevc_req_multi_if.c     | 89 +++++++++++--------
 1 file changed, 54 insertions(+), 35 deletions(-)

diff --git 
a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c 
b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c
index fe0a8508d632..30c85d053f18 100644
--- 
a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c
+++ 
b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c
@@ -415,11 +415,14 @@ static void vdec_hevc_fill_dpb_info(struct 
mtk_vcodec_dec_ctx *ctx,
                hevc_dpb_info[index].field = dpb->field_pic;
 
                hevc_dpb_info[index].y_dma_addr = 
vb2_dma_contig_plane_dma_addr(vb, 0);
-               if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 2)
-                       hevc_dpb_info[index].c_dma_addr = 
vb2_dma_contig_plane_dma_addr(vb, 1);
-               else
-                       hevc_dpb_info[index].c_dma_addr =
-                               hevc_dpb_info[index].y_dma_addr + 
ctx->picinfo.fb_sz[0];
+               if (!ctx->is_secure_playback) {
+                       if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 2)
+                               hevc_dpb_info[index].c_dma_addr =
+                                       vb2_dma_contig_plane_dma_addr(vb, 1);
+                       else
+                               hevc_dpb_info[index].c_dma_addr =
+                                       hevc_dpb_info[index].y_dma_addr + 
ctx->picinfo.fb_sz[0];
+               }
        }
 }
 
@@ -800,7 +803,7 @@ static int vdec_hevc_slice_setup_core_buffer(struct 
vdec_hevc_slice_inst *inst,
        struct mtk_vcodec_dec_ctx *ctx = inst->ctx;
        struct vb2_v4l2_buffer *vb2_v4l2;
        struct vdec_fb *fb;
-       u64 y_fb_dma, c_fb_dma;
+       u64 y_fb_dma, c_fb_dma = 0;
        int i;
 
        fb = ctx->dev->vdec_pdata->get_cap_buffer(ctx);
@@ -810,18 +813,20 @@ static int vdec_hevc_slice_setup_core_buffer(struct 
vdec_hevc_slice_inst *inst,
        }
 
        y_fb_dma = (u64)fb->base_y.dma_addr;
-       if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 1)
-               c_fb_dma =
-                       y_fb_dma + inst->ctx->picinfo.buf_w * 
inst->ctx->picinfo.buf_h;
-       else
-               c_fb_dma = (u64)fb->base_c.dma_addr;
+       if (!ctx->is_secure_playback) {
+               if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 1)
+                       c_fb_dma =
+                               y_fb_dma + inst->ctx->picinfo.buf_w * 
inst->ctx->picinfo.buf_h;
+               else
+                       c_fb_dma = (u64)fb->base_c.dma_addr;
+       }
 
        mtk_vdec_debug(inst->ctx, "[hevc-core] y/c addr = 0x%llx 0x%llx", 
y_fb_dma, c_fb_dma);
 
        inst->vsi_core->fb.y.dma_addr = y_fb_dma;
        inst->vsi_core->fb.y.size = ctx->picinfo.fb_sz[0];
        inst->vsi_core->fb.c.dma_addr = c_fb_dma;
-       inst->vsi_core->fb.y.size = ctx->picinfo.fb_sz[1];
+       inst->vsi_core->fb.c.size = ctx->picinfo.fb_sz[1];
 
        inst->vsi_core->dec.vdec_fb_va = (unsigned long)fb;
 
@@ -878,8 +883,13 @@ static int vdec_hevc_slice_init(struct mtk_vcodec_dec_ctx 
*ctx)
 
        vsi_size = round_up(sizeof(struct vdec_hevc_slice_vsi), 
VCODEC_DEC_ALIGNED_64);
        inst->vsi = inst->vpu.vsi;
-       inst->vsi_core =
-               (struct vdec_hevc_slice_vsi *)(((char *)inst->vpu.vsi) + 
vsi_size);
+       if (ctx->is_secure_playback)
+               inst->vsi_core =
+                       
mtk_vcodec_dec_get_shm_buffer_va(ctx->dev->optee_private, MTK_VDEC_CORE,
+                                                        OPTEE_DATA_INDEX);
+       else
+               inst->vsi_core =
+                       (struct vdec_hevc_slice_vsi *)(((char *)inst->vpu.vsi) 
+ vsi_size);
 
        inst->resolution_changed = true;
        inst->realloc_mv_buf = true;
@@ -944,21 +954,22 @@ static int vdec_hevc_slice_core_decode(struct 
vdec_lat_buf *lat_buf)
                goto vdec_dec_end;
        }
 
-       /* wait decoder done interrupt */
-       timeout = mtk_vcodec_wait_for_done_ctx(inst->ctx, MTK_INST_IRQ_RECEIVED,
-                                              WAIT_INTR_TIMEOUT_MS, 
MTK_VDEC_CORE);
-       if (timeout)
-               mtk_vdec_err(ctx, "core decode timeout: pic_%d", 
ctx->decoded_frame_cnt);
-       inst->vsi_core->dec.timeout = !!timeout;
+       if (!vpu->ctx->is_secure_playback) {
+               /* wait decoder done interrupt */
+               timeout = mtk_vcodec_wait_for_done_ctx(inst->ctx, 
MTK_INST_IRQ_RECEIVED,
+                                                      WAIT_INTR_TIMEOUT_MS, 
MTK_VDEC_CORE);
+               if (timeout)
+                       mtk_vdec_err(ctx, "core decode timeout: pic_%d", 
ctx->decoded_frame_cnt);
+               inst->vsi_core->dec.timeout = !!timeout;
 
-       vpu_dec_core_end(vpu);
-       mtk_vdec_debug(ctx, "pic[%d] crc: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 
0x%x",
-                      ctx->decoded_frame_cnt,
+               vpu_dec_core_end(vpu);
+       }
+       mtk_vdec_debug(ctx, "pic[%d] svp:%d crc: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 
0x%x 0x%x",
+                      ctx->decoded_frame_cnt, ctx->is_secure_playback,
                       inst->vsi_core->dec.crc[0], inst->vsi_core->dec.crc[1],
                       inst->vsi_core->dec.crc[2], inst->vsi_core->dec.crc[3],
                       inst->vsi_core->dec.crc[4], inst->vsi_core->dec.crc[5],
                       inst->vsi_core->dec.crc[6], inst->vsi_core->dec.crc[7]);
-
 vdec_dec_end:
        vdec_msg_queue_update_ube_rptr(&lat_buf->ctx->msg_queue, 
share_info->trans.dma_addr_end);
        ctx->dev->vdec_pdata->cap_to_disp(ctx, !!err, lat_buf->src_buf_req);
@@ -1015,14 +1026,17 @@ static int vdec_hevc_slice_lat_decode(void *h_vdec, 
struct mtk_vcodec_mem *bs,
                vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
        }
 
-       /* wait decoder done interrupt */
-       timeout = mtk_vcodec_wait_for_done_ctx(inst->ctx, MTK_INST_IRQ_RECEIVED,
-                                              WAIT_INTR_TIMEOUT_MS, 
MTK_VDEC_LAT0);
-       if (timeout)
-               mtk_vdec_err(inst->ctx, "lat decode timeout: pic_%d", 
inst->slice_dec_num);
-       inst->vsi->dec.timeout = !!timeout;
+       if (!inst->ctx->is_secure_playback) {
+               /* wait decoder done interrupt */
+               timeout = mtk_vcodec_wait_for_done_ctx(inst->ctx, 
MTK_INST_IRQ_RECEIVED,
+                                                      WAIT_INTR_TIMEOUT_MS, 
MTK_VDEC_LAT0);
+               if (timeout)
+                       mtk_vdec_err(inst->ctx, "lat decode timeout: pic_%d", 
inst->slice_dec_num);
+               inst->vsi->dec.timeout = !!timeout;
+
+               err = vpu_dec_end(vpu);
+       }
 
-       err = vpu_dec_end(vpu);
        if (err == SLICE_HEADER_FULL || err == TRANS_BUFFER_FULL) {
                if (!IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability))
                        vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, 
lat_buf);
@@ -1031,8 +1045,11 @@ static int vdec_hevc_slice_lat_decode(void *h_vdec, 
struct mtk_vcodec_mem *bs,
                return -EINVAL;
        }
 
-       share_info->trans.dma_addr_end = 
inst->ctx->msg_queue.wdma_addr.dma_addr +
-               inst->vsi->dec.wdma_end_addr_offset;
+       if (inst->ctx->is_secure_playback)
+               share_info->trans.dma_addr_end = 
inst->vsi->dec.wdma_end_addr_offset;
+       else
+               share_info->trans.dma_addr_end = 
inst->ctx->msg_queue.wdma_addr.dma_addr +
+                       inst->vsi->dec.wdma_end_addr_offset;
        vdec_msg_queue_update_ube_wptr(&lat_buf->ctx->msg_queue, 
share_info->trans.dma_addr_end);
 
        if (!IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability)) {
@@ -1040,8 +1057,10 @@ static int vdec_hevc_slice_lat_decode(void *h_vdec, 
struct mtk_vcodec_mem *bs,
                       sizeof(share_info->hevc_slice_params));
                vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
        }
-       mtk_vdec_debug(inst->ctx, "dec num: %d lat crc: 0x%x 0x%x 0x%x", 
inst->slice_dec_num,
-                      inst->vsi->dec.crc[0], inst->vsi->dec.crc[1], 
inst->vsi->dec.crc[2]);
+
+       mtk_vdec_debug(inst->ctx, "dec num: %d lat crc: 0x%x 0x%x 0x%x 0x%x 
size:%d",
+                      inst->slice_dec_num, inst->vsi->dec.crc[0], 
inst->vsi->dec.crc[1],
+                      inst->vsi->dec.crc[2], inst->vsi->dec.crc[3], (unsigned 
int)bs->size);
 
        inst->slice_dec_num++;
        return 0;
-- 
2.25.1

Reply via email to