From: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
To: "Yunfei Dong" <yunfei.dong@mediatek.com>,
"Jeffrey Kardatzke" <jkardatzke@google.com>,
"Nícolas F . R . A . Prado" <nfraprado@collabora.com>,
"Nathan Hebert" <nhebert@chromium.org>,
"Nicolas Dufresne" <nicolas.dufresne@collabora.com>,
"Hans Verkuil" <hverkuil-cisco@xs4all.nl>,
"AngeloGioacchino Del Regno"
<angelogioacchino.delregno@collabora.com>,
"Benjamin Gaignard" <benjamin.gaignard@collabora.com>,
"Sebastian Fricke" <sebastian.fricke@collabora.com>,
"Tomasz Figa" <tfiga@chromium.org>,
"Mauro Carvalho Chehab" <mchehab@kernel.org>,
"Marek Szyprowski" <m.szyprowski@samsung.com>
Cc: "Chen-Yu Tsai" <wenst@chromium.org>,
"Yong Wu" <yong.wu@mediatek.com>,
"Hsin-Yi Wang" <hsinyi@chromium.org>,
"Fritz Koenig" <frkoenig@chromium.org>,
"Daniel Vetter" <daniel@ffwll.ch>,
"Steve Cho" <stevecho@chromium.org>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Brian Starkey" <Brian.Starkey@arm.com>,
"John Stultz" <jstultz@google.com>,
"T . J . Mercier" <tjmercier@google.com>,
"Christian König" <christian.koenig@amd.com>,
"Matthias Brugger" <matthias.bgg@gmail.com>,
linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org,
Project_Global_Chrome_Upstream_Group@mediatek.com
Subject: Re: [PATCH v6,12/24] media: mediatek: vcodec: add interface to allocate/free secure memory
Date: Wed, 22 May 2024 14:25:39 +0200 [thread overview]
Message-ID: <b6ef4188-e5da-487c-b4af-ebe5b2fcdfae@collabora.com> (raw)
In-Reply-To: <20240516122102.16379-13-yunfei.dong@mediatek.com>
Hi Yunfei,
W dniu 16.05.2024 o 14:20, Yunfei Dong pisze:
> Need to call dma heap interface to allocate/free secure memory when playing
> secure video.
>
> Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
> ---
> .../media/platform/mediatek/vcodec/Kconfig | 1 +
> .../mediatek/vcodec/common/mtk_vcodec_util.c | 122 +++++++++++++++++-
> .../mediatek/vcodec/common/mtk_vcodec_util.h | 3 +
> 3 files changed, 123 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/media/platform/mediatek/vcodec/Kconfig b/drivers/media/platform/mediatek/vcodec/Kconfig
> index bc8292232530..707865703e61 100644
> --- a/drivers/media/platform/mediatek/vcodec/Kconfig
> +++ b/drivers/media/platform/mediatek/vcodec/Kconfig
> @@ -17,6 +17,7 @@ config VIDEO_MEDIATEK_VCODEC
> depends on VIDEO_MEDIATEK_VPU || !VIDEO_MEDIATEK_VPU
> depends on MTK_SCP || !MTK_SCP
> depends on MTK_SMI || (COMPILE_TEST && MTK_SMI=n)
> + depends on DMABUF_HEAPS
> select VIDEOBUF2_DMA_CONTIG
> select V4L2_MEM2MEM_DEV
> select VIDEO_MEDIATEK_VCODEC_VPU if VIDEO_MEDIATEK_VPU
> diff --git a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.c b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.c
> index c60e4c193b25..5958dcd7965a 100644
> --- a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.c
> +++ b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.c
> @@ -5,9 +5,11 @@
> * Tiffany Lin <tiffany.lin@mediatek.com>
> */
>
> +#include <linux/dma-heap.h>
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/regmap.h>
> +#include <uapi/linux/dma-heap.h>
>
> #include "../decoder/mtk_vcodec_dec_drv.h"
> #include "../encoder/mtk_vcodec_enc_drv.h"
> @@ -45,7 +47,7 @@ int mtk_vcodec_write_vdecsys(struct mtk_vcodec_dec_ctx *ctx, unsigned int reg,
> }
> EXPORT_SYMBOL(mtk_vcodec_write_vdecsys);
>
> -int mtk_vcodec_mem_alloc(void *priv, struct mtk_vcodec_mem *mem)
> +static int mtk_vcodec_mem_alloc_nor(void *priv, struct mtk_vcodec_mem *mem)
> {
> enum mtk_instance_type inst_type = *((unsigned int *)priv);
> struct platform_device *plat_dev;
> @@ -75,9 +77,71 @@ int mtk_vcodec_mem_alloc(void *priv, struct mtk_vcodec_mem *mem)
>
> return 0;
> }
> -EXPORT_SYMBOL(mtk_vcodec_mem_alloc);
>
> -void mtk_vcodec_mem_free(void *priv, struct mtk_vcodec_mem *mem)
> +static int mtk_vcodec_mem_alloc_sec(struct mtk_vcodec_dec_ctx *ctx, struct mtk_vcodec_mem *mem)
> +{
> + struct device *dev = &ctx->dev->plat_dev->dev;
> + struct dma_buf *dma_buffer;
> + struct dma_heap *vdec_heap;
> + struct dma_buf_attachment *attach;
> + struct sg_table *sgt;
> + unsigned long size = mem->size;
> + int ret = 0;
> +
> + if (!size)
> + return -EINVAL;
> +
> + vdec_heap = dma_heap_find("restricted_mtk_cma");
> + if (!vdec_heap) {
> + mtk_v4l2_vdec_err(ctx, "dma heap find failed!");
> + return -EPERM;
> + }
> +
> + dma_buffer = dma_heap_buffer_alloc(vdec_heap, size, DMA_HEAP_VALID_FD_FLAGS,
> + DMA_HEAP_VALID_HEAP_FLAGS);
> + if (IS_ERR_OR_NULL(dma_buffer)) {
> + mtk_v4l2_vdec_err(ctx, "dma heap alloc size=0x%lx failed!", size);
> + return PTR_ERR(dma_buffer);
> + }
> +
> + attach = dma_buf_attach(dma_buffer, dev);
> + if (IS_ERR_OR_NULL(attach)) {
> + mtk_v4l2_vdec_err(ctx, "dma attach size=0x%lx failed!", size);
> + ret = PTR_ERR(attach);
> + goto err_attach;
> + }
> +
> + sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
> + if (IS_ERR_OR_NULL(sgt)) {
> + mtk_v4l2_vdec_err(ctx, "dma map attach size=0x%lx failed!", size);
> + ret = PTR_ERR(sgt);
> + goto err_sgt;
> + }
> +
> + mem->va = dma_buffer;
> + mem->dma_addr = (dma_addr_t)sg_dma_address((sgt)->sgl);
> +
> + if (!mem->va || !mem->dma_addr) {
> + mtk_v4l2_vdec_err(ctx, "dma buffer size=0x%lx failed!", size);
> + ret = -EPERM;
> + goto err_addr;
> + }
> +
> + mem->attach = attach;
> + mem->sgt = sgt;
> +
> + return 0;
> +err_addr:
> + dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
> +err_sgt:
> + dma_buf_detach(dma_buffer, attach);
> +err_attach:
> + dma_buf_put(dma_buffer);
> +
> + return ret;
> +}
> +
> +static void mtk_vcodec_mem_free_nor(void *priv, struct mtk_vcodec_mem *mem)
> {
> enum mtk_instance_type inst_type = *((unsigned int *)priv);
> struct platform_device *plat_dev;
> @@ -110,6 +174,57 @@ void mtk_vcodec_mem_free(void *priv, struct mtk_vcodec_mem *mem)
> mem->dma_addr = 0;
> mem->size = 0;
> }
> +
> +static void mtk_vcodec_mem_free_sec(struct mtk_vcodec_mem *mem)
> +{
> + if (mem->sgt)
> + dma_buf_unmap_attachment(mem->attach, mem->sgt, DMA_BIDIRECTIONAL);
is (!mem->sgt) possible at all here?
In mtk_vcodec_mem_alloc_sec() "if (IS_ERR_OR_NULL(sgt))" triggers an
error recovery path and the allocation fails. Do you ever try to free_sec()
a failed allocation?
> + dma_buf_detach((struct dma_buf *)mem->va, mem->attach);
> + dma_buf_put((struct dma_buf *)mem->va);
> +
> + mem->attach = NULL;
> + mem->sgt = NULL;
> + mem->va = NULL;
> + mem->dma_addr = 0;
> + mem->size = 0;
> +}
> +
> +int mtk_vcodec_mem_alloc(void *priv, struct mtk_vcodec_mem *mem)
> +{
> + enum mtk_instance_type inst_type = *((unsigned int *)priv);
> + int ret;
> +
> + if (inst_type == MTK_INST_DECODER) {
> + struct mtk_vcodec_dec_ctx *dec_ctx = priv;
> +
> + if (dec_ctx->is_secure_playback) {
> + ret = mtk_vcodec_mem_alloc_sec(dec_ctx, mem);
> + goto alloc_end;
> + }
> + }
> +
> + ret = mtk_vcodec_mem_alloc_nor(priv, mem);
> +alloc_end:
> +
again maybe it's just my personal preference, but I'd have no goto
(not because goto is prohibited, but because maybe it's not really
justified here), fewer curly braces and no label:
int mtk_vcodec_mem_alloc(void *priv, struct mtk_vcodec_mem *mem)
{
struct mtk_vcodec_dec_ctx *dec_ctx = priv;
if (dec_ctx->inst_type == MTK_INST_DECODER && dec_ctx->is_secure_playback)
return mtk_vcodec_mem_alloc_sec(dec_ctx, mem);
return mtk_vcodec_mem_alloc_nor(priv, mem);
}
To me it makes no sense to cast priv to inst_type _and_ to dec_ctx
given that dec_ctx's first member _is_ inst_type.
> + return ret;
> +}
> +EXPORT_SYMBOL(mtk_vcodec_mem_alloc);
> +
> +void mtk_vcodec_mem_free(void *priv, struct mtk_vcodec_mem *mem)
> +{
> + enum mtk_instance_type inst_type = *((unsigned int *)priv);
ditto here.
Regards,
Andrzej
> +
> + if (inst_type == MTK_INST_DECODER) {
> + struct mtk_vcodec_dec_ctx *dec_ctx = priv;
> +
> + if (dec_ctx->is_secure_playback) {
> + mtk_vcodec_mem_free_sec(mem);
> + return;
> + }
> + }
> +
> + mtk_vcodec_mem_free_nor(priv, mem);
> +}
> EXPORT_SYMBOL(mtk_vcodec_mem_free);
>
> void *mtk_vcodec_get_hw_dev(struct mtk_vcodec_dec_dev *dev, int hw_idx)
> @@ -171,3 +286,4 @@ EXPORT_SYMBOL(mtk_vcodec_get_curr_ctx);
>
> MODULE_LICENSE("GPL v2");
> MODULE_DESCRIPTION("Mediatek video codec driver");
> +MODULE_IMPORT_NS(DMA_BUF);
> diff --git a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.h b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.h
> index 85f615cdd4d3..22078e757ed0 100644
> --- a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.h
> +++ b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.h
> @@ -18,6 +18,9 @@ struct mtk_vcodec_mem {
> size_t size;
> void *va;
> dma_addr_t dma_addr;
> +
> + struct dma_buf_attachment *attach;
> + struct sg_table *sgt;
> };
>
> struct mtk_vcodec_fb {
next prev parent reply other threads:[~2024-05-22 12:25 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 (董云飞)
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 [this message]
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=b6ef4188-e5da-487c-b4af-ebe5b2fcdfae@collabora.com \
--to=andrzej.p@collabora.com \
--cc=Brian.Starkey@arm.com \
--cc=Project_Global_Chrome_Upstream_Group@mediatek.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 \
--cc=yong.wu@mediatek.com \
--cc=yunfei.dong@mediatek.com \
/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