Le vendredi 15 août 2025 à 16:52 +0800, Yunfei Dong a écrit : > There is only one share memory for vcp architecture, need to > divide it into many different functions. > > Signed-off-by: Yunfei Dong > --- >  .../vcodec/common/mtk_vcodec_fw_vcp.c         | 20 +++++++++++++++++- >  .../vcodec/common/mtk_vcodec_fw_vcp.h         | 13 ++++++++++++ >  .../vcodec/decoder/vdec/vdec_av1_req_lat_if.c | 21 ++++++++++++++----- >  .../decoder/vdec/vdec_h264_req_multi_if.c     |  6 +++++- >  .../decoder/vdec/vdec_hevc_req_multi_if.c     |  7 +++++-- >  .../vcodec/decoder/vdec/vdec_vp9_req_lat_if.c | 16 ++++++++++---- >  .../mediatek/vcodec/decoder/vdec_vpu_if.c     |  7 +++++-- >  7 files changed, 75 insertions(+), 15 deletions(-) > > diff --git a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.c b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.c > index c9e5cde40aef..f6b93e1bcbf3 100644 > --- a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.c > +++ b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.c > @@ -366,8 +366,26 @@ static unsigned int mtk_vcodec_vcp_get_venc_capa(struct mtk_vcodec_fw *fw) >   return MTK_VENC_4K_CAPABILITY_ENABLE; >  } >   > -static void *mtk_vcodec_vcp_dm_addr(struct mtk_vcodec_fw *fw, u32 dtcm_dmem_addr) > +static void *mtk_vcodec_vcp_dm_addr(struct mtk_vcodec_fw *fw, u32 mem_type) >  { > + unsigned char *vsi_core = fw->vcp->vsi_core_addr; > + > + switch (mem_type) { > + case ENCODER_MEM: > + case VCODEC_LAT_MEM: > + return fw->vcp->vsi_addr; > + case VCODEC_CORE_MEM: > + return vsi_core; > + case VP9_FRAME_MEM: > + return vsi_core + VCODEC_VSI_LEN; > + case AV1_CDF_MEM: > + return vsi_core + VCODEC_VSI_LEN + VP9_FRAME_SIZE; > + case AV1_IQ_MEM: > + return vsi_core + VCODEC_VSI_LEN + VP9_FRAME_SIZE + AV1_CDF_SIZE; > + default: > + break; > + } > + >   return NULL; >  } >   > diff --git a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.h b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.h > index 53080ed12c69..54df468f301b 100644 > --- a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.h > +++ b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.h > @@ -13,6 +13,19 @@ typedef void (*vcp_ipi_handler_t) (void *data, unsigned int len, void *priv); >  #define VCP_SHARE_BUF_SIZE 64 >   >  #define VCODEC_VSI_LEN (0x2000) > +#define VP9_FRAME_SIZE (0x1000) > +#define AV1_CDF_SIZE (0xFE80) > +#define AV1_IQ_TABLE_SIZE (0x12200) > + > +/* enum mtk_vcp_mem_type - memory type for different hardware */ > +enum mtk_vcp_mem_type { > + ENCODER_MEM, > + VCODEC_LAT_MEM, > + VCODEC_CORE_MEM, > + VP9_FRAME_MEM, > + AV1_CDF_MEM, > + AV1_IQ_MEM, > +}; >   >  /* enum mtk_vcp_ipi_index - index used to separate different hardware */ >  enum mtk_vcp_ipi_index { > diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c > index 618064001883..2b2173062cb0 100644 > --- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c > +++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c > @@ -774,8 +774,11 @@ static int vdec_av1_slice_init_cdf_table(struct vdec_av1_slice_instance *instanc >   >   ctx = instance->ctx; >   vsi = instance->vpu.vsi; > - remote_cdf_table = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, > -      (u32)vsi->cdf_table_addr); > + if (mtk_vcodec_fw_get_type(ctx->dev->fw_handler) == VCP) > + remote_cdf_table = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, AV1_CDF_MEM); > + else > + remote_cdf_table = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, > +      (u32)vsi->cdf_table_addr); Would be nicer if you didn't have to do that. Can you add a hlper that returns the table ID based on the fw_handler type ? Nicolas >   if (IS_ERR(remote_cdf_table)) { >   mtk_vdec_err(ctx, "failed to map cdf table\n"); >   return PTR_ERR(remote_cdf_table); > @@ -805,8 +808,11 @@ static int vdec_av1_slice_init_iq_table(struct vdec_av1_slice_instance *instance >   >   ctx = instance->ctx; >   vsi = instance->vpu.vsi; > - remote_iq_table = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, > -     (u32)vsi->iq_table_addr); > + if (mtk_vcodec_fw_get_type(ctx->dev->fw_handler) == VCP) > + remote_iq_table = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, AV1_IQ_MEM); > + else > + remote_iq_table = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, > +     (u32)vsi->iq_table_addr); >   if (IS_ERR(remote_iq_table)) { >   mtk_vdec_err(ctx, "failed to map iq table\n"); >   return PTR_ERR(remote_iq_table); > @@ -1905,7 +1911,12 @@ static int vdec_av1_slice_init(struct mtk_vcodec_dec_ctx *ctx) >   goto error_vsi; >   } >   instance->init_vsi = vsi; > - instance->core_vsi = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, (u32)vsi->core_vsi); > + if (mtk_vcodec_fw_get_type(ctx->dev->fw_handler) == VCP) > + instance->core_vsi = > + mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, VCODEC_CORE_MEM); > + else > + instance->core_vsi = > + mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, (u32)vsi->core_vsi); >   >   if (!instance->core_vsi) { >   mtk_vdec_err(ctx, "failed to get AV1 core vsi\n"); > 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 50f81f1cb616..6b354d30910c 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 > @@ -1230,7 +1230,11 @@ static int vdec_h264_slice_init(struct mtk_vcodec_dec_ctx *ctx) >   vsi_size = round_up(vsi_size, VCODEC_DEC_ALIGNED_64); >   inst->vsi_ext = inst->vpu.vsi; >   temp = (unsigned char *)inst->vsi_ext; > - inst->vsi_core_ext = (struct vdec_h264_slice_vsi_ext *)(temp + vsi_size); > + if (mtk_vcodec_fw_get_type(ctx->dev->fw_handler) == VCP) > + inst->vsi_core_ext = > + mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, VCODEC_CORE_MEM); > + else > + inst->vsi_core_ext = (struct vdec_h264_slice_vsi_ext *)(temp + vsi_size); >   >   if (inst->ctx->dev->vdec_pdata->hw_arch == MTK_VDEC_PURE_SINGLE_CORE) >   inst->decode = vdec_h264_slice_single_decode_ext; > 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 80fbd0309b9e..ac0deea0df4c 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 > @@ -877,8 +877,11 @@ 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 (mtk_vcodec_fw_get_type(ctx->dev->fw_handler) == VCP) > + inst->vsi_core = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, VCODEC_CORE_MEM); > + else > + inst->vsi_core = > + (struct vdec_hevc_slice_vsi *)(((char *)inst->vpu.vsi) + vsi_size); >   >   inst->resolution_changed = true; >   inst->realloc_mv_buf = true; > diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c > index 0279f66efdf9..fa0f406f7726 100644 > --- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c > +++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c > @@ -513,8 +513,12 @@ static int vdec_vp9_slice_init_default_frame_ctx(struct vdec_vp9_slice_instance >   if (!ctx || !vsi) >   return -EINVAL; >   > - remote_frame_ctx = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, > -      (u32)vsi->default_frame_ctx); > + if (mtk_vcodec_fw_get_type(ctx->dev->fw_handler) == VCP) > + remote_frame_ctx = > + mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, VP9_FRAME_MEM); > + else > + remote_frame_ctx = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, > +      (u32)vsi->default_frame_ctx); >   if (!remote_frame_ctx) { >   mtk_vdec_err(ctx, "failed to map default frame ctx\n"); >   return -EINVAL; > @@ -1875,8 +1879,12 @@ static int vdec_vp9_slice_init(struct mtk_vcodec_dec_ctx *ctx) >   goto error_vsi; >   } >   instance->init_vsi = vsi; > - instance->core_vsi = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, > -        (u32)vsi->core_vsi); > + if (mtk_vcodec_fw_get_type(ctx->dev->fw_handler) == VCP) > + instance->core_vsi = > + mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, VCODEC_CORE_MEM); > + else > + instance->core_vsi = mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, > +        (u32)vsi->core_vsi); >   if (!instance->core_vsi) { >   mtk_vdec_err(ctx, "failed to get VP9 core vsi\n"); >   ret = -EINVAL; > diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec_vpu_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec_vpu_if.c > index 145958206e38..ac10e0dfefb2 100644 > --- a/drivers/media/platform/mediatek/vcodec/decoder/vdec_vpu_if.c > +++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec_vpu_if.c > @@ -18,8 +18,11 @@ static void handle_init_ack_msg(const struct vdec_vpu_ipi_init_ack *msg) >   >   /* mapping VPU address to kernel virtual address */ >   /* the content in vsi is initialized to 0 in VPU */ > - vpu->vsi = mtk_vcodec_fw_map_dm_addr(vpu->ctx->dev->fw_handler, > -      msg->vpu_inst_addr); > + if (mtk_vcodec_fw_get_type(vpu->ctx->dev->fw_handler) == VCP) > + vpu->vsi = mtk_vcodec_fw_map_dm_addr(vpu->ctx->dev->fw_handler, VCODEC_LAT_MEM); > + else > + vpu->vsi = mtk_vcodec_fw_map_dm_addr(vpu->ctx->dev->fw_handler, > +      msg->vpu_inst_addr); >   vpu->inst_addr = msg->vpu_inst_addr; >   >   mtk_vdec_debug(vpu->ctx, "- vpu_inst_addr = 0x%x", vpu->inst_addr);