From: "Yunfei Dong (董云飞)" <Yunfei.Dong@mediatek.com>
To: "andrzej.p@collabora.com" <andrzej.p@collabora.com>,
"tfiga@chromium.org" <tfiga@chromium.org>,
"nhebert@chromium.org" <nhebert@chromium.org>,
"nicolas.dufresne@collabora.com" <nicolas.dufresne@collabora.com>,
"mchehab@kernel.org" <mchehab@kernel.org>,
"m.szyprowski@samsung.com" <m.szyprowski@samsung.com>,
"jkardatzke@google.com" <jkardatzke@google.com>,
"benjamin.gaignard@collabora.com"
<benjamin.gaignard@collabora.com>,
"hverkuil-cisco@xs4all.nl" <hverkuil-cisco@xs4all.nl>,
"sebastian.fricke@collabora.com" <sebastian.fricke@collabora.com>,
"angelogioacchino.delregno@collabora.com"
<angelogioacchino.delregno@collabora.com>,
"nfraprado@collabora.com" <nfraprado@collabora.com>
Cc: "sumit.semwal@linaro.org" <sumit.semwal@linaro.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-mediatek@lists.infradead.org"
<linux-mediatek@lists.infradead.org>,
"frkoenig@chromium.org" <frkoenig@chromium.org>,
"stevecho@chromium.org" <stevecho@chromium.org>,
"wenst@chromium.org" <wenst@chromium.org>,
"jstultz@google.com" <jstultz@google.com>,
"christian.koenig@amd.com" <christian.koenig@amd.com>,
"linux-media@vger.kernel.org" <linux-media@vger.kernel.org>,
"daniel@ffwll.ch" <daniel@ffwll.ch>,
"Yong Wu (吴勇)" <Yong.Wu@mediatek.com>,
"Brian.Starkey@arm.com" <Brian.Starkey@arm.com>,
"hsinyi@chromium.org" <hsinyi@chromium.org>,
"tjmercier@google.com" <tjmercier@google.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"dri-devel@lists.freedesktop.org"
<dri-devel@lists.freedesktop.org>,
"matthias.bgg@gmail.com" <matthias.bgg@gmail.com>,
Project_Global_Chrome_Upstream_Group
<Project_Global_Chrome_Upstream_Group@mediatek.com>
Subject: Re: [PATCH v6,10/24] media: mediatek: vcodec: send share memory data to optee
Date: Mon, 17 Jun 2024 07:45:17 +0000 [thread overview]
Message-ID: <30a0daa8f7166bd3f958a93505de357f466bc0ec.camel@mediatek.com> (raw)
In-Reply-To: <00128c79-9a27-4410-88d5-d1cd9a6460c0@collabora.com>
Hi Andrzej,
Thanks for your help to review this patch.
On Wed, 2024-05-22 at 14:22 +0200, Andrzej Pietrasiewicz wrote:
> Hi Yunfei & Jeffrey,
>
> W dniu 16.05.2024 o 14:20, Yunfei Dong pisze:
> > Setting msg and vsi information to shared buffer, then call tee
> > invoke
> > function to send it to optee-os.
> >
> > Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
> > ---
> > .../vcodec/decoder/mtk_vcodec_dec_optee.c | 140
> > ++++++++++++++++++
> > .../vcodec/decoder/mtk_vcodec_dec_optee.h | 51 +++++++
> > 2 files changed, 191 insertions(+)
> >
> > diff --git
> > a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_opt
> > ee.c
> > b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_opt
> > ee.c
> > index 611fb0e56480..f29a8d143fee 100644
> > ---
> > a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_opt
> > ee.c
> > +++
> > b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_opt
> > ee.c
> > @@ -241,3 +241,143 @@ void mtk_vcodec_dec_optee_release(struct
> > mtk_vdec_optee_private *optee_private)
> > mutex_unlock(&optee_private->tee_mutex);
> > }
> > EXPORT_SYMBOL_GPL(mtk_vcodec_dec_optee_release);
> > +
> > +static int mtk_vcodec_dec_optee_fill_shm(struct tee_param
> > *command_params,
> > + struct
> > mtk_vdec_optee_shm_memref *shm_memref,
> > + struct
> > mtk_vdec_optee_data_to_shm *data,
> > + int index, struct device *dev)
> > +{
> > + if (!data->msg_buf_size[index] || !data->msg_buf[index]) {
> > + pr_err(MTK_DBG_VCODEC_STR "tee invalid buf param:
> > %d.\n", index);
> > + return -EINVAL;
> > + }
> > +
> > + *command_params = (struct tee_param) {
> > + .attr = shm_memref->param_type,
> > + .u.memref = {
> > + .shm = shm_memref->msg_shm,
> > + .size = data->msg_buf_size[index],
> > + .shm_offs = 0,
> > + },
> > + };
> > +
> > + if (!shm_memref->copy_to_ta) {
> > + dev_dbg(dev, MTK_DBG_VCODEC_STR "share memref data:
> > 0x%x param_type:%llu.\n",
> > + *((unsigned int *)shm_memref->msg_shm_ca_buf),
> > shm_memref->param_type);
> > + return 0;
> > + }
> > +
> > + memset(shm_memref->msg_shm_ca_buf, 0, shm_memref-
> > >msg_shm_size);
> > + memcpy(shm_memref->msg_shm_ca_buf, data->msg_buf[index], data-
> > >msg_buf_size[index]);
> > +
> > + dev_dbg(dev, MTK_DBG_VCODEC_STR "share memref data => msg
> > id:0x%x 0x%x param_type:%llu.\n",
> > + *((unsigned int *)data->msg_buf[index]),
> > + *((unsigned int *)shm_memref->msg_shm_ca_buf),
> > + shm_memref->param_type);
> > +
> > + return 0;
> > +}
> > +
> > +void mtk_vcodec_dec_optee_set_data(struct
> > mtk_vdec_optee_data_to_shm *data,
> > + void *buf, int buf_size,
> > + enum mtk_vdec_optee_data_index
> > index)
> > +{
> > + data->msg_buf[index] = buf;
> > + data->msg_buf_size[index] = buf_size;
> > +}
> > +EXPORT_SYMBOL_GPL(mtk_vcodec_dec_optee_set_data);
> > +
> > +int mtk_vcodec_dec_optee_invokd_cmd(struct mtk_vdec_optee_private
> > *optee_private,
> > + enum mtk_vdec_hw_id hw_id,
> > + struct mtk_vdec_optee_data_to_shm
> > *data)
> > +{
> > + struct device *dev = &optee_private->vcodec_dev->plat_dev->dev;
> > + struct tee_ioctl_invoke_arg trans_args;
> > + struct tee_param command_params[MTK_OPTEE_MAX_TEE_PARAMS];
> > + struct mtk_vdec_optee_ca_info *ca_info;
> > + struct mtk_vdec_optee_shm_memref *shm_memref;
> > + int ret, index;
> > +
> > + if (hw_id == MTK_VDEC_LAT0)
> > + ca_info = &optee_private->lat_ca;
> > + else
> > + ca_info = &optee_private->core_ca;
>
> You seem to be using this in several places. Maybe create a helper?
>
> static inline struct mtk_vdec_optee_ca_info *get_ca_info(
> struct mtk_vdec_optee_private *optee_private,
> enum mtk_vdec_hw_id hw_id)
> {
> return hw_id == MTK_VDEC_LAT0 ?
> &optee_private->lat_ca : &optee_private->core_ca;
> }
>
> (you want to clean up the line breaks in this suggested function)
>
> and then
>
> ca_info = get_ca_info(optee_private, hw_id);
>
> > +
> > + memset(&trans_args, 0, sizeof(trans_args));
> > + memset(command_params, 0, sizeof(command_params));
> > +
> > + trans_args = (struct tee_ioctl_invoke_arg) {
> > + .func = ca_info->vdec_session_func,
> > + .session = ca_info->vdec_session_id,
> > + .num_params = MTK_OPTEE_MAX_TEE_PARAMS,
> > + };
> > +
> > + /* Fill msg command parameters */
> > + for (index = 0; index < MTK_OPTEE_MAX_TEE_PARAMS; index++) {
> > + shm_memref = &ca_info->shm_memref[index];
> > +
> > + if (shm_memref->param_type ==
> > TEE_IOCTL_PARAM_ATTR_TYPE_NONE ||
> > + data->msg_buf_size[index] == 0)
> > + continue;
> > +
> > + dev_dbg(dev, MTK_DBG_VCODEC_STR "tee share memory data
> > size: %d -> %d.\n",
> > + data->msg_buf_size[index], shm_memref-
> > >msg_shm_size);
> > +
> > + if (data->msg_buf_size[index] > shm_memref-
> > >msg_shm_size) {
> > + dev_err(dev, MTK_DBG_VCODEC_STR "tee buf size
> > big than shm (%d -> %d).\n",
>
> s/big/bigger ? Or s/big/greater ?
>
> > + data->msg_buf_size[index], shm_memref-
> > >msg_shm_size);
> > + return -EINVAL;
> > + }
> > +
> > + ret =
> > mtk_vcodec_dec_optee_fill_shm(&command_params[index], shm_memref,
> > + data, index, dev);
> > + if (ret)
> > + return ret;
>
> So if any of the iterations of this loop fails, then the data has
> been
> potentially copied to several shm_memref->msg_shm_ca_buf and remains
> there until
> next call to mtk_vcodec_dec_optee_fill_shm() for a corresponding
> ca_buf.
> In other words, mtk_vcodec_dec_optee_fill_shm() has maybe filled
> several
> ca_bufs, but if we return with error from this loop the tee function
> is not
> invoked but the data prepared for its invocation remains in the
> buffers.
> Don't know if this is a problem or not, but given we're dealing with
> restricted
> aka secure memory you might want to think about it.
The invoke information will be filled again when begin to decode
another frame.
The ca buffer data will be overwritten by new frame data again.
Best Regards,
Yunfei Dong
>
> > + }
> > +
> > + ret = tee_client_invoke_func(optee_private->tee_vdec_ctx,
> > &trans_args, command_params);
> > + if (ret < 0 || trans_args.ret != 0) {
> > + dev_err(dev, MTK_DBG_VCODEC_STR "tee submit command
> > fail: 0x%x 0x%x.\n",
> > + trans_args.ret, ret);
> > + return (ret < 0) ? ret : trans_args.ret;
> > + }
> > +
> > + /* clear all attrs, set all command param to unused */
> > + for (index = 0; index < MTK_OPTEE_MAX_TEE_PARAMS; index++) {
> > + data->msg_buf[index] = NULL;
> > + data->msg_buf_size[index] = 0;
> > + }
> > +
> > + return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(mtk_vcodec_dec_optee_invokd_cmd);
> > +
> > +void *mtk_vcodec_dec_get_shm_buffer_va(struct
> > mtk_vdec_optee_private *optee_private,
> > + enum mtk_vdec_hw_id hw_id,
> > + enum mtk_vdec_optee_data_index
> > data_index)
> > +{
> > + struct mtk_vdec_optee_ca_info *ca_info;
> > +
> > + if (hw_id == MTK_VDEC_LAT0)
> > + ca_info = &optee_private->lat_ca;
> > + else
> > + ca_info = &optee_private->core_ca;
> > +
> > + return ca_info->shm_memref[data_index].msg_shm_ca_buf;
> > +}
> > +EXPORT_SYMBOL_GPL(mtk_vcodec_dec_get_shm_buffer_va);
> > +
> > +int mtk_vcodec_dec_get_shm_buffer_size(struct
> > mtk_vdec_optee_private *optee_private,
> > + enum mtk_vdec_hw_id hw_id,
> > + enum mtk_vdec_optee_data_index
> > data_index)
> > +{
> > + struct mtk_vdec_optee_ca_info *ca_info;
> > +
> > + if (hw_id == MTK_VDEC_LAT0)
> > + ca_info = &optee_private->lat_ca;
> > + else
> > + ca_info = &optee_private->core_ca;
> > +
> > + return ca_info->shm_memref[data_index].msg_shm_size;
> > +}
> > +EXPORT_SYMBOL_GPL(mtk_vcodec_dec_get_shm_buffer_size);
> > diff --git
> > a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_opt
> > ee.h
> > b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_opt
> > ee.h
> > index 24aa63af9887..c24a567ec877 100644
> > ---
> > a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_opt
> > ee.h
> > +++
> > b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_opt
> > ee.h
> > @@ -62,6 +62,16 @@ enum mtk_vdec_optee_data_index {
> > OPTEE_MAX_INDEX,
> > };
> >
> > +/**
> > + * struct mtk_vdec_optee_data_to_shm - shm data used for TA
> > + * @msg_buf: msg information to TA.
> > + * @msg_buf_len: length of msg information.
> > + */
> > +struct mtk_vdec_optee_data_to_shm {
> > + void *msg_buf[MTK_OPTEE_MAX_TEE_PARAMS];
> > + int msg_buf_size[MTK_OPTEE_MAX_TEE_PARAMS];
> > +};
> > +
> > /**
> > * struct mtk_vdec_optee_private - optee private data
> > * @vcodec_dev: pointer to the mtk_vcodec_dev of the device
> > @@ -102,4 +112,45 @@ int mtk_vcodec_dec_optee_private_init(struct
> > mtk_vcodec_dec_dev *vcodec_dev);
> > */
> > void mtk_vcodec_dec_optee_release(struct mtk_vdec_optee_private
> > *optee_private);
> >
> > +/**
> > + * mtk_vcodec_dec_optee_set_data - set buffer to share memref.
> > + * @vcodec_dev: normal world data used to init optee share memory
> > + * @buf: normal world buffer address
> > + * @buf_size: buf size
> > + * @data_index: indentify each share memory informaiton
> > + */
> > +void mtk_vcodec_dec_optee_set_data(struct
> > mtk_vdec_optee_data_to_shm *data,
> > + void *buf, int buf_size,
> > + enum mtk_vdec_optee_data_index
> > data_index);
> > +
> > +/**
> > + * mtk_vcodec_dec_optee_invokd_cmd - send share memory data to
> > optee .
> > + * @optee_private: optee private context
> > + * @hw_id: hardware index
> > + * @data: normal world data used to init optee share memory
> > + */
> > +int mtk_vcodec_dec_optee_invokd_cmd(struct mtk_vdec_optee_private
> > *optee_private,
> > + enum mtk_vdec_hw_id hw_id,
> > + struct mtk_vdec_optee_data_to_shm
> > *data);
> > +
> > +/**
> > + * mtk_vcodec_dec_get_shm_buffer_va - close the communication
> > channels with TA.
>
> This comment is most likely incorrect.
>
> > + * @optee_private: optee private context
> > + * @hw_id: hardware index
> > + * @@data_index: indentify each share memory informaiton
> > + */
> > +void *mtk_vcodec_dec_get_shm_buffer_va(struct
> > mtk_vdec_optee_private *optee_private,
> > + enum mtk_vdec_hw_id hw_id,
> > + enum mtk_vdec_optee_data_index
> > data_index);
> > +
> > +/**
> > + * mtk_vcodec_dec_get_shm_buffer_size - close the communication
> > channels with TA.
>
> And so is this one.
>
> Regards,
>
> Andrzej
>
> > + * @optee_private: optee private context
> > + * @hw_id: hardware index
> > + * @@data_index: indentify each share memory informaiton
> > + */
> > +int mtk_vcodec_dec_get_shm_buffer_size(struct
> > mtk_vdec_optee_private *optee_private,
> > + enum mtk_vdec_hw_id hw_id,
> > + enum mtk_vdec_optee_data_index
> > data_index);
> > +
> > #endif /* _MTK_VCODEC_FW_OPTEE_H_ */
>
>
next prev parent reply other threads:[~2024-06-17 7:45 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-16 12:20 [PATCH v6,00/24] media: mediatek: add driver to support secure video decoder Yunfei Dong
2024-05-16 12:20 ` [PATCH v6,01/24] v4l2: add restricted memory flags Yunfei Dong
2024-05-16 12:20 ` [PATCH v6,02/24] v4l2: handle restricted memory flags in queue setup Yunfei Dong
2024-05-22 12:20 ` Andrzej Pietrasiewicz
2024-06-17 7:11 ` Yunfei Dong (董云飞)
2024-05-16 12:20 ` [PATCH v6,03/24] v4l2: verify restricted dmabufs are used in restricted queue Yunfei Dong
2024-06-12 4:31 ` Tomasz Figa
2024-05-16 12:20 ` [PATCH v6,04/24] v4l: add documentation for restricted memory flag Yunfei Dong
2024-05-22 11:16 ` Laurent Pinchart
2024-06-12 4:37 ` Tomasz Figa
2024-06-12 19:43 ` Nicolas Dufresne
2024-06-12 20:25 ` Laurent Pinchart
2024-06-12 20:58 ` Nicolas Dufresne
2024-06-17 19:02 ` Nicolas Dufresne
2024-05-22 12:24 ` Andrzej Pietrasiewicz
2024-05-16 12:20 ` [PATCH v6,05/24] dma-buf: heaps: Deduplicate docs and adopt common format Yunfei Dong
2024-05-16 12:20 ` [PATCH v6,06/24] dma-heap: Add proper kref handling on dma-buf heaps Yunfei Dong
2024-06-18 7:22 ` [PATCH v6 06/24] " Markus Elfring
2024-05-16 12:20 ` [PATCH v6,07/24] dma-heap: Provide accessors so that in-kernel drivers can allocate dmabufs from specific heaps Yunfei Dong
2024-05-16 12:20 ` [PATCH v6,08/24] media: mediatek: vcodec: add tee client interface to communiate with optee-os Yunfei Dong
2024-05-22 12:21 ` Andrzej Pietrasiewicz
2024-06-17 7:25 ` Yunfei Dong (董云飞)
2024-05-27 8:19 ` Chen-Yu Tsai
2024-05-16 12:20 ` [PATCH v6,09/24] media: mediatek: vcodec: allocate tee share memory Yunfei Dong
2024-05-22 12:23 ` Andrzej Pietrasiewicz
2024-05-16 12:20 ` [PATCH v6,10/24] media: mediatek: vcodec: send share memory data to optee Yunfei Dong
2024-05-22 12:22 ` Andrzej Pietrasiewicz
2024-06-17 7:45 ` Yunfei Dong (董云飞) [this message]
2024-05-16 12:20 ` [PATCH v6,11/24] media: mediatek: vcodec: initialize msg and vsi information Yunfei Dong
2024-05-16 12:20 ` [PATCH v6,12/24] media: mediatek: vcodec: add interface to allocate/free secure memory Yunfei Dong
2024-05-22 12:25 ` Andrzej Pietrasiewicz
2024-06-17 7:53 ` Yunfei Dong (董云飞)
2024-06-12 5:22 ` Tomasz Figa
2024-06-17 6:53 ` Yong Wu (吴勇)
2024-06-18 6:16 ` Tomasz Figa
2024-05-16 12:20 ` [PATCH v6,13/24] media: mediatek: vcodec: using shared memory as vsi address Yunfei Dong
2024-05-16 12:20 ` [PATCH v6,14/24] media: mediatek: vcodec: Add capture format to support one plane memory Yunfei Dong
2024-05-22 12:26 ` Andrzej Pietrasiewicz
2024-05-23 10:14 ` Andrzej Pietrasiewicz
2024-05-23 10:36 ` Chen-Yu Tsai
2024-05-31 13:06 ` Nicolas Dufresne
2024-06-17 9:44 ` Yunfei Dong (董云飞)
2024-05-27 7:07 ` Chen-Yu Tsai
2024-05-16 12:20 ` [PATCH v6,15/24] media: mediatek: vcodec: Add one plane format Yunfei Dong
2024-05-31 13:08 ` Nicolas Dufresne
2024-05-16 12:20 ` [PATCH v6,16/24] media: mediatek: vcodec: support one plane capture buffer Yunfei Dong
2024-05-16 12:20 ` [PATCH v6,17/24] media: mediatek: vcodec: re-construct h264 driver to support svp mode Yunfei Dong
2024-05-27 5:58 ` Chen-Yu Tsai
2024-05-28 7:37 ` Chen-Yu Tsai
2024-05-16 12:20 ` [PATCH v6,18/24] media: mediatek: vcodec: remove parse nal_info in kernel Yunfei Dong
2024-05-16 12:20 ` [PATCH v6,19/24] media: mediatek: vcodec: disable wait interrupt for svp mode Yunfei Dong
2024-05-17 9:53 ` [PATCH v6, 19/24] " CK Hu (胡俊光)
2024-06-17 6:00 ` Yunfei Dong (董云飞)
2024-05-16 12:20 ` [PATCH v6,20/24] media: mediatek: vcodec: support tee decoder Yunfei Dong
2024-05-16 12:20 ` [PATCH v6,21/24] media: mediatek: vcodec: move vdec init interface to setup callback Yunfei Dong
2024-05-16 12:21 ` [PATCH v6,22/24] media: mediatek: vcodec: support hevc svp for mt8188 Yunfei Dong
2024-05-16 12:21 ` [PATCH v6,23/24] media: mediatek: vcodec: support av1 svp decoder " Yunfei Dong
2024-05-23 13:32 ` Andrzej Pietrasiewicz
2024-05-16 12:21 ` [PATCH v6,24/24] media: mediatek: vcodec: support vp9 " Yunfei Dong
2024-05-27 7:54 ` [PATCH v6, 24/24] " Chen-Yu Tsai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=30a0daa8f7166bd3f958a93505de357f466bc0ec.camel@mediatek.com \
--to=yunfei.dong@mediatek.com \
--cc=Brian.Starkey@arm.com \
--cc=Project_Global_Chrome_Upstream_Group@mediatek.com \
--cc=Yong.Wu@mediatek.com \
--cc=andrzej.p@collabora.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=benjamin.gaignard@collabora.com \
--cc=christian.koenig@amd.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=frkoenig@chromium.org \
--cc=hsinyi@chromium.org \
--cc=hverkuil-cisco@xs4all.nl \
--cc=jkardatzke@google.com \
--cc=jstultz@google.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=m.szyprowski@samsung.com \
--cc=matthias.bgg@gmail.com \
--cc=mchehab@kernel.org \
--cc=nfraprado@collabora.com \
--cc=nhebert@chromium.org \
--cc=nicolas.dufresne@collabora.com \
--cc=sebastian.fricke@collabora.com \
--cc=stevecho@chromium.org \
--cc=sumit.semwal@linaro.org \
--cc=tfiga@chromium.org \
--cc=tjmercier@google.com \
--cc=wenst@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).