[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-media
Subject:    Re: [PATCH v6, 19/24] media: mediatek: vcodec: disable wait interrupt for svp mode
From:       CK Hu (胡俊光) <ck.hu () mediatek ! com>
Date:       2024-05-17 9:53:29
Message-ID: 81b099b1f70253501c39b7d538f9759c64bc880e.camel () mediatek ! com
[Download RAW message or body]

Hi, Yunfei:

On Thu, 2024-05-16 at 20:20 +0800, Yunfei Dong wrote:
> Waiting interrupt in optee-os for svp mode, need to disable it in kernel
> in case of interrupt is cleaned.
> 
> Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
> ---
> .../vcodec/decoder/mtk_vcodec_dec_hw.c        | 34 +++++------
> .../vcodec/decoder/mtk_vcodec_dec_pm.c        |  6 +-
> .../decoder/vdec/vdec_h264_req_multi_if.c     | 57 +++++++++++--------
> 3 files changed, 54 insertions(+), 43 deletions(-)
> 
> diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_hw.c \
> b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_hw.c index \
>                 881d5de41e05..1982c088c6da 100644
> --- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_hw.c
> +++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_hw.c
> @@ -72,26 +72,28 @@ static irqreturn_t mtk_vdec_hw_irq_handler(int irq, void *priv)
> 
> 	ctx = mtk_vcodec_get_curr_ctx(dev->main_dev, dev->hw_idx);
> 
> -	/* check if HW active or not */
> -	cg_status = readl(dev->reg_base[VDEC_HW_SYS] + VDEC_HW_ACTIVE_ADDR);
> -	if (cg_status & VDEC_HW_ACTIVE_MASK) {
> -		mtk_v4l2_vdec_err(ctx, "vdec active is not 0x0 (0x%08x)", cg_status);
> -		return IRQ_HANDLED;
> -	}
> +	if (!ctx->is_secure_playback) {
> +		/* check if HW active or not */
> +		cg_status = readl(dev->reg_base[VDEC_HW_SYS] + VDEC_HW_ACTIVE_ADDR);
> +		if (cg_status & VDEC_HW_ACTIVE_MASK) {
> +			mtk_v4l2_vdec_err(ctx, "vdec active is not 0x0 (0x%08x)", cg_status);
> +			return IRQ_HANDLED;
> +		}
> 
> -	dec_done_status = readl(vdec_misc_addr);
> -	if ((dec_done_status & MTK_VDEC_IRQ_STATUS_DEC_SUCCESS) !=
> -	    MTK_VDEC_IRQ_STATUS_DEC_SUCCESS)
> -		return IRQ_HANDLED;
> +		dec_done_status = readl(vdec_misc_addr);
> +		if ((dec_done_status & MTK_VDEC_IRQ_STATUS_DEC_SUCCESS) !=
> +		    MTK_VDEC_IRQ_STATUS_DEC_SUCCESS)
> +			return IRQ_HANDLED;
> 
> -	/* clear interrupt */
> -	writel(dec_done_status | VDEC_IRQ_CFG, vdec_misc_addr);
> -	writel(dec_done_status & ~VDEC_IRQ_CLR, vdec_misc_addr);
> +		/* clear interrupt */
> +		writel(dec_done_status | VDEC_IRQ_CFG, vdec_misc_addr);
> +		writel(dec_done_status & ~VDEC_IRQ_CLR, vdec_misc_addr);
> 
> -	wake_up_dec_ctx(ctx, MTK_INST_IRQ_RECEIVED, dev->hw_idx);
> +		wake_up_dec_ctx(ctx, MTK_INST_IRQ_RECEIVED, dev->hw_idx);
> 
> -	mtk_v4l2_vdec_dbg(3, ctx, "wake up ctx %d, dec_done_status=%x",
> -			  ctx->id, dec_done_status);
> +		mtk_v4l2_vdec_dbg(3, ctx, "wake up ctx %d, dec_done_status=%x",
> +				  ctx->id, dec_done_status);
> +	}
> 
> 	return IRQ_HANDLED;
> }
> diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_pm.c \
> b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_pm.c index \
>                 aefd3e9e3061..a94eda936f16 100644
> --- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_pm.c
> +++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_pm.c
> @@ -238,7 +238,8 @@ void mtk_vcodec_dec_enable_hardware(struct mtk_vcodec_dec_ctx \
> *ctx, int hw_idx)  mtk_vcodec_dec_child_dev_on(ctx->dev, MTK_VDEC_LAT0);
> 	mtk_vcodec_dec_child_dev_on(ctx->dev, hw_idx);
> 
> -	mtk_vcodec_dec_enable_irq(ctx->dev, hw_idx);
> +	if (!ctx->is_secure_playback)
> +		mtk_vcodec_dec_enable_irq(ctx->dev, hw_idx);
> 
> 	if (IS_VDEC_INNER_RACING(ctx->dev->dec_capability))
> 		mtk_vcodec_load_racing_info(ctx);
> @@ -250,7 +251,8 @@ void mtk_vcodec_dec_disable_hardware(struct mtk_vcodec_dec_ctx \
> *ctx, int hw_idx)  if (IS_VDEC_INNER_RACING(ctx->dev->dec_capability))
> 		mtk_vcodec_record_racing_info(ctx);
> 
> -	mtk_vcodec_dec_disable_irq(ctx->dev, hw_idx);
> +	if (!ctx->is_secure_playback)
> +		mtk_vcodec_dec_disable_irq(ctx->dev, hw_idx);
> 
> 	mtk_vcodec_dec_child_dev_off(ctx->dev, hw_idx);
> 	if (IS_VDEC_LAT_ARCH(ctx->dev->vdec_pdata->hw_arch) &&
> diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c \
> b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c \
>                 index f27d326f00ba..3186777dcc13 100644
> --- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
> +++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
> @@ -593,14 +593,16 @@ static int vdec_h264_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;
> -
> -	vpu_dec_core_end(vpu);
> +	if (!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);
> +	}

In svp mode, optee driver would wait the irq, but why optee driver does not notify \
normal world driver? The normal world driver here does not wait anything and keep \
going, so it would get the frame which has not been processed done and pass it to \
next module such as mdp? The normal world driver does not wait here, how does it make \
sure the frame is processed done?

Regards,

CK

> 	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,
> 		       inst->vsi_core->dec.crc[0], inst->vsi_core->dec.crc[1],
> @@ -724,14 +726,16 @@ static int vdec_h264_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);
> @@ -831,16 +835,19 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct \
> mtk_vcodec_mem *bs  if (err)
> 		goto err_free_fb_out;
> 
> -	/* wait decoder done interrupt */
> -	err = mtk_vcodec_wait_for_done_ctx(inst->ctx, MTK_INST_IRQ_RECEIVED,
> -					   WAIT_INTR_TIMEOUT_MS, MTK_VDEC_CORE);
> -	if (err)
> -		mtk_vdec_err(inst->ctx, "decode timeout: pic_%d", inst->ctx->decoded_frame_cnt);
> -
> -	inst->vsi->dec.timeout = !!err;
> -	err = vpu_dec_end(vpu);
> -	if (err)
> -		goto err_free_fb_out;
> +	if (!inst->ctx->is_secure_playback) {
> +		/* wait decoder done interrupt */
> +		err = mtk_vcodec_wait_for_done_ctx(inst->ctx, MTK_INST_IRQ_RECEIVED,
> +						   WAIT_INTR_TIMEOUT_MS, MTK_VDEC_CORE);
> +		if (err)
> +			mtk_vdec_err(inst->ctx, "decode timeout: pic_%d",
> +				     inst->ctx->decoded_frame_cnt);
> +
> +		inst->vsi->dec.timeout = !!err;
> +		err = vpu_dec_end(vpu);
> +		if (err)
> +			goto err_free_fb_out;
> +	}
> 
> 	memcpy(&inst->vsi_ctx, inst->vpu.vsi, sizeof(inst->vsi_ctx));
> 	mtk_vdec_debug(inst->ctx, "pic[%d] crc: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x",


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic