From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8C6E1C25B7C for ; Wed, 22 May 2024 12:25:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type:In-Reply-To:References:Cc:To:Subject:From:MIME-Version:Date: Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=0l0Gy236eutYWA/nXAR/40nADQNTJE3czjYgvXsdS0k=; b=P3B2NqN6b/sngLVY9oFL1yS98b y8Oed/OIjmaEZJNohwfiT4wOqv62j4XeFhi8kWzIj5GhP65sKi55GeY319ifTSKBhL6/+rEnWQYR2 7rGjmEgATzs7Q4UxCZ4+aRNHH37CWKbe/nOj73VWN58uxAs+KI6JTcwzVhpf35D2eGqjt46hgb2qg BAVKNZuJYvpwCHmNemI48HaWTZe4/4pzyieuNGL34+Ni7dWgab3dnstQdflVBQqIiI2YGrHQV0VQH /6PG4sfqSpELflPTh3fmQwhqkF13VHQO6xVNTS3g4b9Lid7u4es7REhk5Wc3X6+YKGFb/aNuaBsXf w/Zb3DbQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1s9l2Q-00000002uq0-06Ck; Wed, 22 May 2024 12:25:46 +0000 Received: from madrid.collaboradmins.com ([2a00:1098:ed:100::25]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1s9l2N-00000002up8-0DTt; Wed, 22 May 2024 12:25:44 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1716380741; bh=KY1Jjtx90WFXJYI6JqxM7uBt+i92nKmYdqocJqbLDe8=; h=Date:From:Subject:To:Cc:References:In-Reply-To:From; b=DVDEsDWjuk7cnGRKzcU8HYgYN8jt+kEho5AHLuta0oero0v1ba8azGBVRKchGv8bD ssgusXJkI5oE7CMq6U68MOJRZM+4f0WNveqtX4bsH0M45PdHFZEo2a/KYQrJTtcBog fd1LEzaQeZ1J/9WbaZ4IGA955W7SYmQncCAemY+F/KU7ApDf4dgyeDi55HTEDWg7aT hIlJP8aTZxR/mJ6nVLbMbcaLdmfRupb8DuuV7qacSPA1uM96W0mzahgsmc/bUjIZRp aq1NIMKsK7fuOePtC6Cn7EvGQyg2XFydL59YTlQU6HbVboDctJ+YrSKeQg5yg21wmA v6oVQPXyqukIw== Received: from [100.95.196.182] (cola.collaboradmins.com [195.201.22.229]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: andrzej.p) by madrid.collaboradmins.com (Postfix) with ESMTPSA id 3F35437821A0; Wed, 22 May 2024 12:25:40 +0000 (UTC) Message-ID: Date: Wed, 22 May 2024 14:25:39 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Andrzej Pietrasiewicz Subject: Re: [PATCH v6,12/24] media: mediatek: vcodec: add interface to allocate/free secure memory To: Yunfei Dong , Jeffrey Kardatzke , =?UTF-8?Q?N=C3=ADcolas_F_=2E_R_=2E_A_=2E_Prado?= , Nathan Hebert , Nicolas Dufresne , Hans Verkuil , AngeloGioacchino Del Regno , Benjamin Gaignard , Sebastian Fricke , Tomasz Figa , Mauro Carvalho Chehab , Marek Szyprowski Cc: Chen-Yu Tsai , Yong Wu , Hsin-Yi Wang , Fritz Koenig , Daniel Vetter , Steve Cho , Sumit Semwal , Brian Starkey , John Stultz , "T . J . Mercier" , =?UTF-8?Q?Christian_K=C3=B6nig?= , Matthias Brugger , 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 References: <20240516122102.16379-1-yunfei.dong@mediatek.com> <20240516122102.16379-13-yunfei.dong@mediatek.com> Content-Language: en-US In-Reply-To: <20240516122102.16379-13-yunfei.dong@mediatek.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240522_052543_250232_BDD91578 X-CRM114-Status: GOOD ( 22.82 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org 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 > --- > .../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 > */ > > +#include > #include > #include > #include > +#include > > #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 { From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D1B83C25B7A for ; Wed, 22 May 2024 12:25:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:References:Cc:To:Subject:From: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=0h9uJW0I2No5TQNQaQLdNOJBV/tbZBXvpORdJPLckM4=; b=C6PD9QJ/GsHUn0 h5tp8WSlZj/MPXeR9nd6UCD7178F37FAVcUbkL6M57DI2EUDIwkrzGh5CUkuERRPMtW1YkMF0NBzZ 02Qj0+OCU0I8Gu/WbdVSC8NsZQYAmkBtZNtIGXFRvBk2rAZAQzatqgXPTFehkQvRA5hbPQWDQVf9e jw8RvzSzv/es1o2KwuNlvLQV3MRDLNfGbiXhoC00QTQ6zfcRjWNqRP0cRVYjg7OKwl5p8gIsZ6TPh UtJG1seughyBLDUDv0cK9+/Jpp2HWLqBqh/6WZCNRkO1LBkUge/LmDB/pc4VyA314QIXbnohkQfRs ArAAmPhmbfjeIip3S7ww==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1s9l2P-00000002upg-22p9; Wed, 22 May 2024 12:25:45 +0000 Received: from madrid.collaboradmins.com ([2a00:1098:ed:100::25]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1s9l2N-00000002up8-0DTt; Wed, 22 May 2024 12:25:44 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1716380741; bh=KY1Jjtx90WFXJYI6JqxM7uBt+i92nKmYdqocJqbLDe8=; h=Date:From:Subject:To:Cc:References:In-Reply-To:From; b=DVDEsDWjuk7cnGRKzcU8HYgYN8jt+kEho5AHLuta0oero0v1ba8azGBVRKchGv8bD ssgusXJkI5oE7CMq6U68MOJRZM+4f0WNveqtX4bsH0M45PdHFZEo2a/KYQrJTtcBog fd1LEzaQeZ1J/9WbaZ4IGA955W7SYmQncCAemY+F/KU7ApDf4dgyeDi55HTEDWg7aT hIlJP8aTZxR/mJ6nVLbMbcaLdmfRupb8DuuV7qacSPA1uM96W0mzahgsmc/bUjIZRp aq1NIMKsK7fuOePtC6Cn7EvGQyg2XFydL59YTlQU6HbVboDctJ+YrSKeQg5yg21wmA v6oVQPXyqukIw== Received: from [100.95.196.182] (cola.collaboradmins.com [195.201.22.229]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: andrzej.p) by madrid.collaboradmins.com (Postfix) with ESMTPSA id 3F35437821A0; Wed, 22 May 2024 12:25:40 +0000 (UTC) Message-ID: Date: Wed, 22 May 2024 14:25:39 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Andrzej Pietrasiewicz Subject: Re: [PATCH v6,12/24] media: mediatek: vcodec: add interface to allocate/free secure memory To: Yunfei Dong , Jeffrey Kardatzke , =?UTF-8?Q?N=C3=ADcolas_F_=2E_R_=2E_A_=2E_Prado?= , Nathan Hebert , Nicolas Dufresne , Hans Verkuil , AngeloGioacchino Del Regno , Benjamin Gaignard , Sebastian Fricke , Tomasz Figa , Mauro Carvalho Chehab , Marek Szyprowski Cc: Chen-Yu Tsai , Yong Wu , Hsin-Yi Wang , Fritz Koenig , Daniel Vetter , Steve Cho , Sumit Semwal , Brian Starkey , John Stultz , "T . J . Mercier" , =?UTF-8?Q?Christian_K=C3=B6nig?= , Matthias Brugger , 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 References: <20240516122102.16379-1-yunfei.dong@mediatek.com> <20240516122102.16379-13-yunfei.dong@mediatek.com> Content-Language: en-US In-Reply-To: <20240516122102.16379-13-yunfei.dong@mediatek.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240522_052543_250232_BDD91578 X-CRM114-Status: GOOD ( 22.82 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgWXVuZmVpLAoKVyBkbml1IDE2LjA1LjIwMjQgb8KgMTQ6MjAsIFl1bmZlaSBEb25nIHBpc3pl Ogo+IE5lZWQgdG8gY2FsbCBkbWEgaGVhcCBpbnRlcmZhY2UgdG8gYWxsb2NhdGUvZnJlZSBzZWN1 cmUgbWVtb3J5IHdoZW4gcGxheWluZwo+IHNlY3VyZSB2aWRlby4KPiAKPiBTaWduZWQtb2ZmLWJ5 OiBZdW5mZWkgRG9uZyA8eXVuZmVpLmRvbmdAbWVkaWF0ZWsuY29tPgo+IC0tLQo+ICAgLi4uL21l ZGlhL3BsYXRmb3JtL21lZGlhdGVrL3Zjb2RlYy9LY29uZmlnICAgIHwgICAxICsKPiAgIC4uLi9t ZWRpYXRlay92Y29kZWMvY29tbW9uL210a192Y29kZWNfdXRpbC5jICB8IDEyMiArKysrKysrKysr KysrKysrKy0KPiAgIC4uLi9tZWRpYXRlay92Y29kZWMvY29tbW9uL210a192Y29kZWNfdXRpbC5o ICB8ICAgMyArCj4gICAzIGZpbGVzIGNoYW5nZWQsIDEyMyBpbnNlcnRpb25zKCspLCAzIGRlbGV0 aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21lZGlhdGVr L3Zjb2RlYy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tZWRpYXRlay92Y29kZWMv S2NvbmZpZwo+IGluZGV4IGJjODI5MjIzMjUzMC4uNzA3ODY1NzAzZTYxIDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbWVkaWF0ZWsvdmNvZGVjL0tjb25maWcKPiArKysgYi9k cml2ZXJzL21lZGlhL3BsYXRmb3JtL21lZGlhdGVrL3Zjb2RlYy9LY29uZmlnCj4gQEAgLTE3LDYg KzE3LDcgQEAgY29uZmlnIFZJREVPX01FRElBVEVLX1ZDT0RFQwo+ICAgCWRlcGVuZHMgb24gVklE RU9fTUVESUFURUtfVlBVIHx8ICFWSURFT19NRURJQVRFS19WUFUKPiAgIAlkZXBlbmRzIG9uIE1U S19TQ1AgfHwgIU1US19TQ1AKPiAgIAlkZXBlbmRzIG9uIE1US19TTUkgfHwgKENPTVBJTEVfVEVT VCAmJiBNVEtfU01JPW4pCj4gKwlkZXBlbmRzIG9uIERNQUJVRl9IRUFQUwo+ICAgCXNlbGVjdCBW SURFT0JVRjJfRE1BX0NPTlRJRwo+ICAgCXNlbGVjdCBWNEwyX01FTTJNRU1fREVWCj4gICAJc2Vs ZWN0IFZJREVPX01FRElBVEVLX1ZDT0RFQ19WUFUgaWYgVklERU9fTUVESUFURUtfVlBVCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbWVkaWF0ZWsvdmNvZGVjL2NvbW1vbi9t dGtfdmNvZGVjX3V0aWwuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbWVkaWF0ZWsvdmNvZGVj L2NvbW1vbi9tdGtfdmNvZGVjX3V0aWwuYwo+IGluZGV4IGM2MGU0YzE5M2IyNS4uNTk1OGRjZDc5 NjVhIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbWVkaWF0ZWsvdmNvZGVj L2NvbW1vbi9tdGtfdmNvZGVjX3V0aWwuYwo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0v bWVkaWF0ZWsvdmNvZGVjL2NvbW1vbi9tdGtfdmNvZGVjX3V0aWwuYwo+IEBAIC01LDkgKzUsMTEg QEAKPiAgICoJVGlmZmFueSBMaW4gPHRpZmZhbnkubGluQG1lZGlhdGVrLmNvbT4KPiAgICovCj4g ICAKPiArI2luY2x1ZGUgPGxpbnV4L2RtYS1oZWFwLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvb2YuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9yZWdt YXAuaD4KPiArI2luY2x1ZGUgPHVhcGkvbGludXgvZG1hLWhlYXAuaD4KPiAgIAo+ICAgI2luY2x1 ZGUgIi4uL2RlY29kZXIvbXRrX3Zjb2RlY19kZWNfZHJ2LmgiCj4gICAjaW5jbHVkZSAiLi4vZW5j b2Rlci9tdGtfdmNvZGVjX2VuY19kcnYuaCIKPiBAQCAtNDUsNyArNDcsNyBAQCBpbnQgbXRrX3Zj b2RlY193cml0ZV92ZGVjc3lzKHN0cnVjdCBtdGtfdmNvZGVjX2RlY19jdHggKmN0eCwgdW5zaWdu ZWQgaW50IHJlZywKPiAgIH0KPiAgIEVYUE9SVF9TWU1CT0wobXRrX3Zjb2RlY193cml0ZV92ZGVj c3lzKTsKPiAgIAo+IC1pbnQgbXRrX3Zjb2RlY19tZW1fYWxsb2Modm9pZCAqcHJpdiwgc3RydWN0 IG10a192Y29kZWNfbWVtICptZW0pCj4gK3N0YXRpYyBpbnQgbXRrX3Zjb2RlY19tZW1fYWxsb2Nf bm9yKHZvaWQgKnByaXYsIHN0cnVjdCBtdGtfdmNvZGVjX21lbSAqbWVtKQo+ICAgewo+ICAgCWVu dW0gbXRrX2luc3RhbmNlX3R5cGUgaW5zdF90eXBlID0gKigodW5zaWduZWQgaW50ICopcHJpdik7 Cj4gICAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9kZXY7Cj4gQEAgLTc1LDkgKzc3LDcx IEBAIGludCBtdGtfdmNvZGVjX21lbV9hbGxvYyh2b2lkICpwcml2LCBzdHJ1Y3QgbXRrX3Zjb2Rl Y19tZW0gKm1lbSkKPiAgIAo+ICAgCXJldHVybiAwOwo+ICAgfQo+IC1FWFBPUlRfU1lNQk9MKG10 a192Y29kZWNfbWVtX2FsbG9jKTsKPiAgIAo+IC12b2lkIG10a192Y29kZWNfbWVtX2ZyZWUodm9p ZCAqcHJpdiwgc3RydWN0IG10a192Y29kZWNfbWVtICptZW0pCj4gK3N0YXRpYyBpbnQgbXRrX3Zj b2RlY19tZW1fYWxsb2Nfc2VjKHN0cnVjdCBtdGtfdmNvZGVjX2RlY19jdHggKmN0eCwgc3RydWN0 IG10a192Y29kZWNfbWVtICptZW0pCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjdHgt PmRldi0+cGxhdF9kZXYtPmRldjsKPiArCXN0cnVjdCBkbWFfYnVmICpkbWFfYnVmZmVyOwo+ICsJ c3RydWN0IGRtYV9oZWFwICp2ZGVjX2hlYXA7Cj4gKwlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50 ICphdHRhY2g7Cj4gKwlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKPiArCXVuc2lnbmVkIGxvbmcgc2l6 ZSA9IG1lbS0+c2l6ZTsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCWlmICghc2l6ZSkKPiArCQly ZXR1cm4gLUVJTlZBTDsKPiArCj4gKwl2ZGVjX2hlYXAgPSBkbWFfaGVhcF9maW5kKCJyZXN0cmlj dGVkX210a19jbWEiKTsKPiArCWlmICghdmRlY19oZWFwKSB7Cj4gKwkJbXRrX3Y0bDJfdmRlY19l cnIoY3R4LCAiZG1hIGhlYXAgZmluZCBmYWlsZWQhIik7Cj4gKwkJcmV0dXJuIC1FUEVSTTsKPiAr CX0KPiArCj4gKwlkbWFfYnVmZmVyID0gZG1hX2hlYXBfYnVmZmVyX2FsbG9jKHZkZWNfaGVhcCwg c2l6ZSwgRE1BX0hFQVBfVkFMSURfRkRfRkxBR1MsCj4gKwkJCQkJICAgRE1BX0hFQVBfVkFMSURf SEVBUF9GTEFHUyk7Cj4gKwlpZiAoSVNfRVJSX09SX05VTEwoZG1hX2J1ZmZlcikpIHsKPiArCQlt dGtfdjRsMl92ZGVjX2VycihjdHgsICJkbWEgaGVhcCBhbGxvYyBzaXplPTB4JWx4IGZhaWxlZCEi LCBzaXplKTsKPiArCQlyZXR1cm4gUFRSX0VSUihkbWFfYnVmZmVyKTsKPiArCX0KPiArCj4gKwlh dHRhY2ggPSBkbWFfYnVmX2F0dGFjaChkbWFfYnVmZmVyLCBkZXYpOwo+ICsJaWYgKElTX0VSUl9P Ul9OVUxMKGF0dGFjaCkpIHsKPiArCQltdGtfdjRsMl92ZGVjX2VycihjdHgsICJkbWEgYXR0YWNo IHNpemU9MHglbHggZmFpbGVkISIsIHNpemUpOwo+ICsJCXJldCA9IFBUUl9FUlIoYXR0YWNoKTsK PiArCQlnb3RvIGVycl9hdHRhY2g7Cj4gKwl9Cj4gKwo+ICsJc2d0ID0gZG1hX2J1Zl9tYXBfYXR0 YWNobWVudChhdHRhY2gsIERNQV9CSURJUkVDVElPTkFMKTsKPiArCWlmIChJU19FUlJfT1JfTlVM TChzZ3QpKSB7Cj4gKwkJbXRrX3Y0bDJfdmRlY19lcnIoY3R4LCAiZG1hIG1hcCBhdHRhY2ggc2l6 ZT0weCVseCBmYWlsZWQhIiwgc2l6ZSk7Cj4gKwkJcmV0ID0gUFRSX0VSUihzZ3QpOwo+ICsJCWdv dG8gZXJyX3NndDsKPiArCX0KPiArCj4gKwltZW0tPnZhID0gZG1hX2J1ZmZlcjsKPiArCW1lbS0+ ZG1hX2FkZHIgPSAoZG1hX2FkZHJfdClzZ19kbWFfYWRkcmVzcygoc2d0KS0+c2dsKTsKPiArCj4g KwlpZiAoIW1lbS0+dmEgfHwgIW1lbS0+ZG1hX2FkZHIpIHsKPiArCQltdGtfdjRsMl92ZGVjX2Vy cihjdHgsICJkbWEgYnVmZmVyIHNpemU9MHglbHggZmFpbGVkISIsIHNpemUpOwo+ICsJCXJldCA9 IC1FUEVSTTsKPiArCQlnb3RvIGVycl9hZGRyOwo+ICsJfQo+ICsKPiArCW1lbS0+YXR0YWNoID0g YXR0YWNoOwo+ICsJbWVtLT5zZ3QgPSBzZ3Q7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK2Vycl9hZGRy Ogo+ICsJZG1hX2J1Zl91bm1hcF9hdHRhY2htZW50KGF0dGFjaCwgc2d0LCBETUFfQklESVJFQ1RJ T05BTCk7Cj4gK2Vycl9zZ3Q6Cj4gKwlkbWFfYnVmX2RldGFjaChkbWFfYnVmZmVyLCBhdHRhY2gp Owo+ICtlcnJfYXR0YWNoOgo+ICsJZG1hX2J1Zl9wdXQoZG1hX2J1ZmZlcik7Cj4gKwo+ICsJcmV0 dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgbXRrX3Zjb2RlY19tZW1fZnJlZV9ub3Io dm9pZCAqcHJpdiwgc3RydWN0IG10a192Y29kZWNfbWVtICptZW0pCj4gICB7Cj4gICAJZW51bSBt dGtfaW5zdGFuY2VfdHlwZSBpbnN0X3R5cGUgPSAqKCh1bnNpZ25lZCBpbnQgKilwcml2KTsKPiAg IAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0X2RldjsKPiBAQCAtMTEwLDYgKzE3NCw1NyBA QCB2b2lkIG10a192Y29kZWNfbWVtX2ZyZWUodm9pZCAqcHJpdiwgc3RydWN0IG10a192Y29kZWNf bWVtICptZW0pCj4gICAJbWVtLT5kbWFfYWRkciA9IDA7Cj4gICAJbWVtLT5zaXplID0gMDsKPiAg IH0KPiArCj4gK3N0YXRpYyB2b2lkIG10a192Y29kZWNfbWVtX2ZyZWVfc2VjKHN0cnVjdCBtdGtf dmNvZGVjX21lbSAqbWVtKQo+ICt7Cj4gKwlpZiAobWVtLT5zZ3QpCj4gKwkJZG1hX2J1Zl91bm1h cF9hdHRhY2htZW50KG1lbS0+YXR0YWNoLCBtZW0tPnNndCwgRE1BX0JJRElSRUNUSU9OQUwpOwoK aXMgKCFtZW0tPnNndCkgcG9zc2libGUgYXQgYWxsIGhlcmU/CgpJbiBtdGtfdmNvZGVjX21lbV9h bGxvY19zZWMoKSAiaWYgKElTX0VSUl9PUl9OVUxMKHNndCkpIiB0cmlnZ2VycyBhbgplcnJvciBy ZWNvdmVyeSBwYXRoIGFuZCB0aGUgYWxsb2NhdGlvbiBmYWlscy4gRG8geW91IGV2ZXIgdHJ5IHRv IGZyZWVfc2VjKCkKYSBmYWlsZWQgYWxsb2NhdGlvbj8KCj4gKwlkbWFfYnVmX2RldGFjaCgoc3Ry dWN0IGRtYV9idWYgKiltZW0tPnZhLCBtZW0tPmF0dGFjaCk7Cj4gKwlkbWFfYnVmX3B1dCgoc3Ry dWN0IGRtYV9idWYgKiltZW0tPnZhKTsKPiArCj4gKwltZW0tPmF0dGFjaCA9IE5VTEw7Cj4gKwlt ZW0tPnNndCA9IE5VTEw7Cj4gKwltZW0tPnZhID0gTlVMTDsKPiArCW1lbS0+ZG1hX2FkZHIgPSAw Owo+ICsJbWVtLT5zaXplID0gMDsKPiArfQo+ICsKPiAraW50IG10a192Y29kZWNfbWVtX2FsbG9j KHZvaWQgKnByaXYsIHN0cnVjdCBtdGtfdmNvZGVjX21lbSAqbWVtKQo+ICt7Cj4gKwllbnVtIG10 a19pbnN0YW5jZV90eXBlIGluc3RfdHlwZSA9ICooKHVuc2lnbmVkIGludCAqKXByaXYpOwo+ICsJ aW50IHJldDsKPiArCj4gKwlpZiAoaW5zdF90eXBlID09IE1US19JTlNUX0RFQ09ERVIpIHsKPiAr CQlzdHJ1Y3QgbXRrX3Zjb2RlY19kZWNfY3R4ICpkZWNfY3R4ID0gcHJpdjsKPiArCj4gKwkJaWYg KGRlY19jdHgtPmlzX3NlY3VyZV9wbGF5YmFjaykgewo+ICsJCQlyZXQgPSBtdGtfdmNvZGVjX21l bV9hbGxvY19zZWMoZGVjX2N0eCwgbWVtKTsKPiArCQkJZ290byBhbGxvY19lbmQ7Cj4gKwkJfQo+ ICsJfQo+ICsKPiArCXJldCA9IG10a192Y29kZWNfbWVtX2FsbG9jX25vcihwcml2LCBtZW0pOwo+ ICthbGxvY19lbmQ6Cj4gKwoKYWdhaW4gbWF5YmUgaXQncyBqdXN0IG15IHBlcnNvbmFsIHByZWZl cmVuY2UsIGJ1dCBJJ2QgaGF2ZSBubyBnb3RvCihub3QgYmVjYXVzZSBnb3RvIGlzIHByb2hpYml0 ZWQsIGJ1dCBiZWNhdXNlIG1heWJlIGl0J3Mgbm90IHJlYWxseQpqdXN0aWZpZWQgaGVyZSksIGZl d2VyIGN1cmx5IGJyYWNlcyBhbmQgbm8gbGFiZWw6CgppbnQgbXRrX3Zjb2RlY19tZW1fYWxsb2Mo dm9pZCAqcHJpdiwgc3RydWN0IG10a192Y29kZWNfbWVtICptZW0pCnsKCXN0cnVjdCBtdGtfdmNv ZGVjX2RlY19jdHggKmRlY19jdHggPSBwcml2OwoKCWlmIChkZWNfY3R4LT5pbnN0X3R5cGUgPT0g TVRLX0lOU1RfREVDT0RFUiAmJiBkZWNfY3R4LT5pc19zZWN1cmVfcGxheWJhY2spCgkJcmV0dXJu IG10a192Y29kZWNfbWVtX2FsbG9jX3NlYyhkZWNfY3R4LCBtZW0pOwoKCXJldHVybiBtdGtfdmNv ZGVjX21lbV9hbGxvY19ub3IocHJpdiwgbWVtKTsKfQoKVG8gbWUgaXQgbWFrZXMgbm8gc2Vuc2Ug dG8gY2FzdCBwcml2IHRvIGluc3RfdHlwZSBfYW5kXyB0byBkZWNfY3R4CmdpdmVuIHRoYXQgZGVj X2N0eCdzIGZpcnN0IG1lbWJlciBfaXNfIGluc3RfdHlwZS4KCj4gKwlyZXR1cm4gcmV0Owo+ICt9 Cj4gK0VYUE9SVF9TWU1CT0wobXRrX3Zjb2RlY19tZW1fYWxsb2MpOwo+ICsKPiArdm9pZCBtdGtf dmNvZGVjX21lbV9mcmVlKHZvaWQgKnByaXYsIHN0cnVjdCBtdGtfdmNvZGVjX21lbSAqbWVtKQo+ ICt7Cj4gKwllbnVtIG10a19pbnN0YW5jZV90eXBlIGluc3RfdHlwZSA9ICooKHVuc2lnbmVkIGlu dCAqKXByaXYpOwoKCmRpdHRvIGhlcmUuCgpSZWdhcmRzLAoKQW5kcnplagoKPiArCj4gKwlpZiAo aW5zdF90eXBlID09IE1US19JTlNUX0RFQ09ERVIpIHsKPiArCQlzdHJ1Y3QgbXRrX3Zjb2RlY19k ZWNfY3R4ICpkZWNfY3R4ID0gcHJpdjsKPiArCj4gKwkJaWYgKGRlY19jdHgtPmlzX3NlY3VyZV9w bGF5YmFjaykgewo+ICsJCQltdGtfdmNvZGVjX21lbV9mcmVlX3NlYyhtZW0pOwo+ICsJCQlyZXR1 cm47Cj4gKwkJfQo+ICsJfQo+ICsKPiArCW10a192Y29kZWNfbWVtX2ZyZWVfbm9yKHByaXYsIG1l bSk7Cj4gK30KPiAgIEVYUE9SVF9TWU1CT0wobXRrX3Zjb2RlY19tZW1fZnJlZSk7Cj4gICAKPiAg IHZvaWQgKm10a192Y29kZWNfZ2V0X2h3X2RldihzdHJ1Y3QgbXRrX3Zjb2RlY19kZWNfZGV2ICpk ZXYsIGludCBod19pZHgpCj4gQEAgLTE3MSwzICsyODYsNCBAQCBFWFBPUlRfU1lNQk9MKG10a192 Y29kZWNfZ2V0X2N1cnJfY3R4KTsKPiAgIAo+ICAgTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+ ICAgTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWRpYXRlayB2aWRlbyBjb2RlYyBkcml2ZXIiKTsKPiAr TU9EVUxFX0lNUE9SVF9OUyhETUFfQlVGKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS9tZWRpYXRlay92Y29kZWMvY29tbW9uL210a192Y29kZWNfdXRpbC5oIGIvZHJpdmVy cy9tZWRpYS9wbGF0Zm9ybS9tZWRpYXRlay92Y29kZWMvY29tbW9uL210a192Y29kZWNfdXRpbC5o Cj4gaW5kZXggODVmNjE1Y2RkNGQzLi4yMjA3OGU3NTdlZDAgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9tZWRpYS9wbGF0Zm9ybS9tZWRpYXRlay92Y29kZWMvY29tbW9uL210a192Y29kZWNfdXRpbC5o Cj4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tZWRpYXRlay92Y29kZWMvY29tbW9uL210 a192Y29kZWNfdXRpbC5oCj4gQEAgLTE4LDYgKzE4LDkgQEAgc3RydWN0IG10a192Y29kZWNfbWVt IHsKPiAgIAlzaXplX3Qgc2l6ZTsKPiAgIAl2b2lkICp2YTsKPiAgIAlkbWFfYWRkcl90IGRtYV9h ZGRyOwo+ICsKPiArCXN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaDsKPiArCXN0cnVj dCBzZ190YWJsZSAqc2d0Owo+ICAgfTsKPiAgIAo+ICAgc3RydWN0IG10a192Y29kZWNfZmIgewoK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFy bS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1r ZXJuZWwK