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 X-Spam-Level: X-Spam-Status: No, score=-8.0 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B5E29C433DF for ; Wed, 10 Jun 2020 05:45:24 +0000 (UTC) Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4DE7F207ED for ; Wed, 10 Jun 2020 05:45:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="Iz9KbwUQ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4DE7F207ED Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id E1E0A888C5; Wed, 10 Jun 2020 05:45:23 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id XTLqyrHfqkGo; Wed, 10 Jun 2020 05:45:22 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 4E623888B5; Wed, 10 Jun 2020 05:45:22 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 399B5C0863; Wed, 10 Jun 2020 05:45:22 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id C569EC016F for ; Wed, 10 Jun 2020 05:45:20 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id AEE828763C for ; Wed, 10 Jun 2020 05:45:20 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id CbJOk5wCjbMT for ; Wed, 10 Jun 2020 05:45:18 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by whitealder.osuosl.org (Postfix) with ESMTP id D068A86E15 for ; Wed, 10 Jun 2020 05:45:17 +0000 (UTC) X-UUID: c89d0f18aa2f42fca33912e2213fa0e2-20200610 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=eZeaCZigg3GkXMWmssrDhkhnVabWFGgwfU7U4dmrbIc=; b=Iz9KbwUQwqGo0Y0IF3teZAVMKSX9FSt3HRsBMNgJQD3zF2vBJRuUVyoD6wdSg8yhnrnKeCIpVAYcrOIzL1Yq8KRVNHz24ewJoDqtY9vJbzgqRCXQ6w4iEskFhAwSquZXM44zEfJv59Sqc+9U0EdID/P82x0AiGFk++Jfv5hhf3g=; X-UUID: c89d0f18aa2f42fca33912e2213fa0e2-20200610 Received: from mtkcas11.mediatek.inc [(172.21.101.40)] by mailgw02.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 109392018; Wed, 10 Jun 2020 13:45:13 +0800 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n1.mediatek.inc (172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 10 Jun 2020 13:45:10 +0800 Received: from [172.21.77.4] (172.21.77.4) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 10 Jun 2020 13:45:10 +0800 Message-ID: <1591767911.527.5.camel@mtksdaap41> Subject: Re: [PATCH v4 08/17] media: mtk-vcodec: separate mtk-vcodec-enc node. From: CK Hu To: Yong Wu , Tiffany Lin , Maoguang Meng Date: Wed, 10 Jun 2020 13:45:11 +0800 In-Reply-To: <1590826218-23653-9-git-send-email-yong.wu@mediatek.com> References: <1590826218-23653-1-git-send-email-yong.wu@mediatek.com> <1590826218-23653-9-git-send-email-yong.wu@mediatek.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N Cc: Maoguang Meng , Will Deacon , youlin.pei@mediatek.com, Irui Wang , Nicolas Boichat , Evan Green , eizan@chromium.org, Matthias Kaehlcke , devicetree@vger.kernel.org, cui.zhang@mediatek.com, Tomasz Figa , Rob Herring , linux-mediatek@lists.infradead.org, Hsin-Yi Wang , Matthias Brugger , ming-fan.chen@mediatek.com, linux-arm-kernel@lists.infradead.org, anan.sun@mediatek.com, acourbot@chromium.org, srv_heupstream@mediatek.com, linux-kernel@vger.kernel.org, chao.hao@mediatek.com, iommu@lists.linux-foundation.org, Robin Murphy X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" + Tiffany & Maoguang. On Sat, 2020-05-30 at 16:10 +0800, Yong Wu wrote: > From: Maoguang Meng > > MTK H264 Encoder(VENC_SYS) and VP8 Encoder(VENC_LT_SYS) are two > independent hardware instance. They have their owner interrupt, > register mapping, and special clocks. > > This patch seperates the two instance. This is a preparing patch for > adding device_link between the larbs and venc-device. It's mainly for > fixing the problem: > https://lkml.org/lkml/2019/9/3/316 > > User Call "VIDIOC_QUERYCAP": > H264 Encoder return driver name "mtk-vcodec-enc"; > VP8 Encoder return driver name "mtk-venc-vp8. > > Signed-off-by: Maoguang Meng > Signed-off-by: Hsin-Yi Wang > Signed-off-by: Irui Wang > --- > drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h | 10 +- > drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c | 23 +++- > .../media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c | 127 +++++++++------------ > .../media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c | 31 +---- > .../media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h | 1 - > .../media/platform/mtk-vcodec/venc/venc_vp8_if.c | 4 +- > 6 files changed, 80 insertions(+), 116 deletions(-) > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > index a2716117..52d1ce1 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > @@ -19,6 +19,7 @@ > #define MTK_VCODEC_DRV_NAME "mtk_vcodec_drv" > #define MTK_VCODEC_DEC_NAME "mtk-vcodec-dec" > #define MTK_VCODEC_ENC_NAME "mtk-vcodec-enc" > +#define MTK_VENC_VP8_NAME "mtk-venc-vp8" > #define MTK_PLATFORM_STR "platform:mt8173" > > #define MTK_VCODEC_MAX_PLANES 3 > @@ -193,7 +194,6 @@ struct mtk_vcodec_pm { > > struct mtk_vcodec_clk venc_clk; > struct device *larbvenc; > - struct device *larbvenclt; > struct device *dev; > struct mtk_vcodec_dev *mtkdev; > }; > @@ -311,25 +311,27 @@ enum mtk_chip { > * @chip: chip this encoder is compatible with > * > * @uses_ext: whether the encoder uses the extended firmware messaging format > - * @has_lt_irq: whether the encoder uses the LT irq > + * @name: whether the encoder core is vp8 > * @min_birate: minimum supported encoding bitrate > * @max_bitrate: maximum supported encoding bitrate > * @capture_formats: array of supported capture formats > * @num_capture_formats: number of entries in capture_formats > * @output_formats: array of supported output formats > * @num_output_formats: number of entries in output_formats > + * @core_id: stand for h264 or vp8 encode index > */ > struct mtk_vcodec_enc_pdata { > enum mtk_chip chip; > > bool uses_ext; > - bool has_lt_irq; > + const char *name; > unsigned long min_bitrate; > unsigned long max_bitrate; > const struct mtk_video_fmt *capture_formats; > size_t num_capture_formats; > const struct mtk_video_fmt *output_formats; > size_t num_output_formats; > + int core_id; > }; > > /** > @@ -359,7 +361,6 @@ struct mtk_vcodec_enc_pdata { > * > * @dec_irq: decoder irq resource > * @enc_irq: h264 encoder irq resource > - * @enc_lt_irq: vp8 encoder irq resource > * > * @dec_mutex: decoder hardware lock > * @enc_mutex: encoder hardware lock. > @@ -395,7 +396,6 @@ struct mtk_vcodec_dev { > > int dec_irq; > int enc_irq; > - int enc_lt_irq; > > struct mutex dec_mutex; > struct mutex enc_mutex; > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > index f0af78f..5301dca 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > @@ -9,6 +9,7 @@ > #include > #include > #include > +#include > > #include "mtk_vcodec_drv.h" > #include "mtk_vcodec_enc.h" > @@ -174,7 +175,10 @@ static int vidioc_enum_fmt_vid_out(struct file *file, void *priv, > static int vidioc_venc_querycap(struct file *file, void *priv, > struct v4l2_capability *cap) > { > - strscpy(cap->driver, MTK_VCODEC_ENC_NAME, sizeof(cap->driver)); > + const struct mtk_vcodec_enc_pdata *pdata = > + fh_to_ctx(priv)->dev->venc_pdata; > + > + strscpy(cap->driver, pdata->name, sizeof(cap->driver)); > strscpy(cap->bus_info, MTK_PLATFORM_STR, sizeof(cap->bus_info)); > strscpy(cap->card, MTK_PLATFORM_STR, sizeof(cap->card)); > > @@ -788,7 +792,7 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count) > */ > if ((ctx->state == MTK_STATE_ABORT) || (ctx->state == MTK_STATE_FREE)) { > ret = -EIO; > - goto err_set_param; > + goto err_start_stream; > } > > /* Do the initialization when both start_streaming have been called */ > @@ -800,6 +804,12 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count) > return 0; > } > > + ret = pm_runtime_get_sync(&ctx->dev->plat_dev->dev); > + if (ret < 0) { > + mtk_v4l2_err("pm_runtime_get_sync fail %d", ret); > + goto err_start_stream; > + } > + > mtk_venc_set_param(ctx, ¶m); > ret = venc_if_set_param(ctx, VENC_SET_PARAM_ENC, ¶m); > if (ret) { > @@ -826,6 +836,11 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count) > return 0; > > err_set_param: > + ret = pm_runtime_put(&ctx->dev->plat_dev->dev); > + if (ret < 0) > + mtk_v4l2_err("pm_runtime_put fail %d", ret); > + > +err_start_stream: > for (i = 0; i < q->num_buffers; ++i) { > struct vb2_buffer *buf = vb2_get_buffer(q, i); > > @@ -879,6 +894,10 @@ static void vb2ops_venc_stop_streaming(struct vb2_queue *q) > if (ret) > mtk_v4l2_err("venc_if_deinit failed=%d", ret); > > + ret = pm_runtime_put(&ctx->dev->plat_dev->dev); > + if (ret < 0) > + mtk_v4l2_err("pm_runtime_put fail %d", ret); > + > ctx->state = MTK_STATE_FREE; > } > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > index b8fe408..fe17f0c 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > @@ -49,12 +49,15 @@ > }, > }; > > -static const struct mtk_video_fmt mtk_video_formats_capture_mt8173[] = { > +static const struct mtk_video_fmt mtk_video_formats_capture_mt8173_h264[] = { > { > .fourcc = V4L2_PIX_FMT_H264, > .type = MTK_FMT_ENC, > .num_planes = 1, > }, > +}; > + > +static const struct mtk_video_fmt mtk_video_formats_capture_mt8173_vp8[] = { > { > .fourcc = V4L2_PIX_FMT_VP8, > .type = MTK_FMT_ENC, > @@ -110,35 +113,13 @@ static irqreturn_t mtk_vcodec_enc_irq_handler(int irq, void *priv) > ctx = dev->curr_ctx; > spin_unlock_irqrestore(&dev->irqlock, flags); > > - mtk_v4l2_debug(1, "id=%d", ctx->id); > - addr = dev->reg_base[VENC_SYS] + MTK_VENC_IRQ_ACK_OFFSET; > - > - ctx->irq_status = readl(dev->reg_base[VENC_SYS] + > - (MTK_VENC_IRQ_STATUS_OFFSET)); > - > - clean_irq_status(ctx->irq_status, addr); > - > - wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED); > - return IRQ_HANDLED; > -} > - > -static irqreturn_t mtk_vcodec_enc_lt_irq_handler(int irq, void *priv) > -{ > - struct mtk_vcodec_dev *dev = priv; > - struct mtk_vcodec_ctx *ctx; > - unsigned long flags; > - void __iomem *addr; > - > - spin_lock_irqsave(&dev->irqlock, flags); > - ctx = dev->curr_ctx; > - spin_unlock_irqrestore(&dev->irqlock, flags); > + mtk_v4l2_debug(1, "id=%d coreid:%d", ctx->id, dev->venc_pdata->core_id); > + addr = dev->reg_base[dev->venc_pdata->core_id] + > + MTK_VENC_IRQ_ACK_OFFSET; > > - mtk_v4l2_debug(1, "id=%d", ctx->id); > - ctx->irq_status = readl(dev->reg_base[VENC_LT_SYS] + > + ctx->irq_status = readl(dev->reg_base[dev->venc_pdata->core_id] + > (MTK_VENC_IRQ_STATUS_OFFSET)); > > - addr = dev->reg_base[VENC_LT_SYS] + MTK_VENC_IRQ_ACK_OFFSET; > - > clean_irq_status(ctx->irq_status, addr); > > wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED); > @@ -265,7 +246,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > struct resource *res; > phandle rproc_phandle; > enum mtk_vcodec_fw_type fw_type; > - int i, j, ret; > + int ret; > + void __iomem *reg_base; > > dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); > if (!dev) > @@ -291,63 +273,39 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > dev->venc_pdata = of_device_get_match_data(&pdev->dev); > ret = mtk_vcodec_init_enc_pm(dev); > if (ret < 0) { > - dev_err(&pdev->dev, "Failed to get mt vcodec clock source!"); > + dev_err(&pdev->dev, "Failed to get mtk vcodec clock source!"); > goto err_enc_pm; > } > > - for (i = VENC_SYS, j = 0; i < NUM_MAX_VCODEC_REG_BASE; i++, j++) { > - res = platform_get_resource(pdev, IORESOURCE_MEM, j); > - dev->reg_base[i] = devm_ioremap_resource(&pdev->dev, res); > - if (IS_ERR((__force void *)dev->reg_base[i])) { > - ret = PTR_ERR((__force void *)dev->reg_base[i]); > - goto err_res; > - } > - mtk_v4l2_debug(2, "reg[%d] base=0x%p", i, dev->reg_base[i]); > - } > + pm_runtime_enable(&pdev->dev); > + > + snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "%s", > + dev->venc_pdata->name); > > - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); > - if (res == NULL) { > - dev_err(&pdev->dev, "failed to get irq resource"); > - ret = -ENOENT; > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + reg_base = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR((__force void *)reg_base)) { > + ret = PTR_ERR((__force void *)reg_base); > goto err_res; > } > + dev->reg_base[dev->venc_pdata->core_id] = reg_base; > > dev->enc_irq = platform_get_irq(pdev, 0); > ret = devm_request_irq(&pdev->dev, dev->enc_irq, > mtk_vcodec_enc_irq_handler, > 0, pdev->name, dev); > if (ret) { > - dev_err(&pdev->dev, "Failed to install dev->enc_irq %d (%d)", > - dev->enc_irq, > - ret); > + dev_err(&pdev->dev, > + "Failed to install dev->enc_irq %d (%d) core_id:%d", > + dev->enc_irq, ret, dev->venc_pdata->core_id); > ret = -EINVAL; > goto err_res; > } > disable_irq(dev->enc_irq); > > - if (dev->venc_pdata->has_lt_irq) { > - dev->enc_lt_irq = platform_get_irq(pdev, 1); > - ret = devm_request_irq(&pdev->dev, > - dev->enc_lt_irq, > - mtk_vcodec_enc_lt_irq_handler, > - 0, pdev->name, dev); > - if (ret) { > - dev_err(&pdev->dev, > - "Failed to install dev->enc_lt_irq %d (%d)", > - dev->enc_lt_irq, ret); > - ret = -EINVAL; > - goto err_res; > - } > - disable_irq(dev->enc_lt_irq); /* VENC_LT */ > - } > - > mutex_init(&dev->enc_mutex); > mutex_init(&dev->dev_mutex); > spin_lock_init(&dev->irqlock); > - > - snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "%s", > - "[MTK_V4L2_VENC]"); > - > ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); > if (ret) { > mtk_v4l2_err("v4l2_device_register err=%d", ret); > @@ -373,7 +331,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > V4L2_CAP_STREAMING; > > snprintf(vfd_enc->name, sizeof(vfd_enc->name), "%s", > - MTK_VCODEC_ENC_NAME); > + dev->venc_pdata->name); > video_set_drvdata(vfd_enc, dev); > dev->vfd_enc = vfd_enc; > platform_set_drvdata(pdev, dev); > @@ -401,8 +359,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > goto err_enc_reg; > } > > - mtk_v4l2_debug(0, "encoder registered as /dev/video%d", > - vfd_enc->num); > + mtk_v4l2_debug(0, "encoder %d registered as /dev/video%d", > + dev->venc_pdata->core_id, vfd_enc->num); > > return 0; > > @@ -415,26 +373,39 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > err_enc_alloc: > v4l2_device_unregister(&dev->v4l2_dev); > err_res: > - mtk_vcodec_release_enc_pm(dev); > + pm_runtime_disable(&pdev->dev); > err_enc_pm: > mtk_vcodec_fw_release(dev->fw_handler); > return ret; > } > > -static const struct mtk_vcodec_enc_pdata mt8173_pdata = { > +static const struct mtk_vcodec_enc_pdata mt8173_avc_pdata = { > + .chip = MTK_MT8173, > + .name = MTK_VCODEC_ENC_NAME, > + .capture_formats = mtk_video_formats_capture_mt8173_h264, > + .num_capture_formats = 1, > + .output_formats = mtk_video_formats_output_mt8173, > + .num_output_formats = ARRAY_SIZE(mtk_video_formats_output_mt8173), > + .min_bitrate = 1, > + .max_bitrate = 4000000, > + .core_id = VENC_SYS, > +}; > + > +static const struct mtk_vcodec_enc_pdata mt8173_vp8_pdata = { > .chip = MTK_MT8173, > - .has_lt_irq = true, > - .capture_formats = mtk_video_formats_capture_mt8173, > - .num_capture_formats = ARRAY_SIZE(mtk_video_formats_capture_mt8173), > + .name = MTK_VENC_VP8_NAME, > + .capture_formats = mtk_video_formats_capture_mt8173_vp8, > + .num_capture_formats = 1, > .output_formats = mtk_video_formats_output_mt8173, > .num_output_formats = ARRAY_SIZE(mtk_video_formats_output_mt8173), > .min_bitrate = 1, > .max_bitrate = 4000000, > + .core_id = VENC_LT_SYS, > }; > > static const struct mtk_vcodec_enc_pdata mt8183_pdata = { > .chip = MTK_MT8183, > - .has_lt_irq = false, > + .name = MTK_VCODEC_ENC_NAME, > .uses_ext = true, > .capture_formats = mtk_video_formats_capture_mt8183, > .num_capture_formats = ARRAY_SIZE(mtk_video_formats_capture_mt8183), > @@ -443,10 +414,14 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > .num_output_formats = ARRAY_SIZE(mtk_video_formats_output_mt8173), > .min_bitrate = 64, > .max_bitrate = 40000000, > + .core_id = VENC_SYS, > }; > > static const struct of_device_id mtk_vcodec_enc_match[] = { > - {.compatible = "mediatek,mt8173-vcodec-enc", .data = &mt8173_pdata}, > + {.compatible = "mediatek,mt8173-vcodec-avc-enc", > + .data = &mt8173_avc_pdata}, > + {.compatible = "mediatek,mt8173-vcodec-vp8-enc", > + .data = &mt8173_vp8_pdata}, > {.compatible = "mediatek,mt8183-vcodec-enc", .data = &mt8183_pdata}, > {}, > }; > @@ -466,7 +441,7 @@ static int mtk_vcodec_enc_remove(struct platform_device *pdev) > video_unregister_device(dev->vfd_enc); > > v4l2_device_unregister(&dev->v4l2_dev); > - mtk_vcodec_release_enc_pm(dev); > + pm_runtime_disable(&pdev->dev); > mtk_vcodec_fw_release(dev->fw_handler); > return 0; > } > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > index ee22902..01c6a55 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > @@ -43,21 +43,6 @@ int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *mtkdev) > return -ENODEV; > } > pm->larbvenc = &pdev->dev; > - > - node = of_parse_phandle(dev->of_node, "mediatek,larb", 1); > - if (!node) { > - mtk_v4l2_err("no mediatek,larb found"); > - return -ENODEV; > - } > - > - pdev = of_find_device_by_node(node); > - of_node_put(node); > - if (!pdev) { > - mtk_v4l2_err("no mediatek,larb device found"); > - return -ENODEV; > - } > - > - pm->larbvenclt = &pdev->dev; > pdev = mtkdev->plat_dev; > pm->dev = &pdev->dev; > > @@ -94,11 +79,6 @@ int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *mtkdev) > return ret; > } > > -void mtk_vcodec_release_enc_pm(struct mtk_vcodec_dev *mtkdev) > -{ > -} > - > - > void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm) > { > struct mtk_vcodec_clk *enc_clk = &pm->venc_clk; > @@ -116,18 +96,10 @@ void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm) > ret = mtk_smi_larb_get(pm->larbvenc); > if (ret) { > mtk_v4l2_err("mtk_smi_larb_get larb3 fail %d", ret); > - goto larbvencerr; > - } > - ret = mtk_smi_larb_get(pm->larbvenclt); > - if (ret) { > - mtk_v4l2_err("mtk_smi_larb_get larb4 fail %d", ret); > - goto larbvenclterr; > + goto clkerr; > } > return; > > -larbvenclterr: > - mtk_smi_larb_put(pm->larbvenc); > -larbvencerr: > clkerr: > for (i -= 1; i >= 0; i--) > clk_disable_unprepare(enc_clk->clk_info[i].vcodec_clk); > @@ -139,7 +111,6 @@ void mtk_vcodec_enc_clock_off(struct mtk_vcodec_pm *pm) > int i = 0; > > mtk_smi_larb_put(pm->larbvenc); > - mtk_smi_larb_put(pm->larbvenclt); > for (i = enc_clk->clk_num - 1; i >= 0; i--) > clk_disable_unprepare(enc_clk->clk_info[i].vcodec_clk); > } > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h > index b7ecdfd..c1b5986 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h > @@ -10,7 +10,6 @@ > #include "mtk_vcodec_drv.h" > > int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *dev); > -void mtk_vcodec_release_enc_pm(struct mtk_vcodec_dev *dev); > > void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm); > void mtk_vcodec_enc_clock_off(struct mtk_vcodec_pm *pm); > diff --git a/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c b/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > index 11abb19..8267a9c 100644 > --- a/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > +++ b/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > @@ -367,7 +367,7 @@ static int vp8_enc_encode(void *handle, > > mtk_vcodec_debug_enter(inst); > > - enable_irq(ctx->dev->enc_lt_irq); > + enable_irq(ctx->dev->enc_irq); > > switch (opt) { > case VENC_START_OPT_ENCODE_FRAME: > @@ -386,7 +386,7 @@ static int vp8_enc_encode(void *handle, > > encode_err: > > - disable_irq(ctx->dev->enc_lt_irq); > + disable_irq(ctx->dev->enc_irq); > mtk_vcodec_debug_leave(inst); > > return ret; _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu 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 X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BE617C433E0 for ; Wed, 10 Jun 2020 05:45:50 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 88287207ED for ; Wed, 10 Jun 2020 05:45:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="PTWdltKd"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="MoAGCfd8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 88287207ED Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=2/iGHOrTFJAJ0WsXcdHjw+LGD+DE0YhA4x6zghc0GGs=; b=PTWdltKdph/auX z4u6KC/rqVyBY5ZslhYzWnMVKgGfEHfvkN/D4ifMDjLN23zmRds+tNmBGfy3KtQPrPKhwmkN7ti3C ugTD/Qm0G8YKxqoXFIarDbi84agBcZaNN8BMkI+nfNNOknUU8B/BicjXFbEVpHd/JWxk4vNCBlQpw qGtskTDyTLWGgduSCNjV9yam5Jcl4k3xF35z1xjvb0d6X2/ZniiUguTNwSxoP1/AU1cHZNY5KLCka FWcYmTEcGU0/Ajw+/gAaiCzcVrnDyto7x7FqgDrcWdgjb3KvdJapTd3UhGIex7OIDY8hmLfBIY/n9 7qMHLjc1YAVlwemdrPrw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jitYT-0000kq-17; Wed, 10 Jun 2020 05:45:41 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jitYP-0000kI-GT; Wed, 10 Jun 2020 05:45:40 +0000 X-UUID: fb8145ff136a4332b9dd18da8943cbf9-20200609 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=eZeaCZigg3GkXMWmssrDhkhnVabWFGgwfU7U4dmrbIc=; b=MoAGCfd8FEY+mf88xYcffl0Nmx9jT7QFI54wEd9wOJb8zdfPp3Tg/amT+8f8RILPe0s7/mFNtGZ71wcKKaUQaJ4I0kTko+vz8YnPhj9ncKBE4nhZ87SMiq1VM5C1TOizsv7eVGxcSwpD108TIsbapRf9Skj+YhNGkNmwkbX0nJE=; X-UUID: fb8145ff136a4332b9dd18da8943cbf9-20200609 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1709960460; Tue, 09 Jun 2020 21:45:11 -0800 Received: from mtkmbs08n1.mediatek.inc (172.21.101.55) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 9 Jun 2020 22:45:23 -0700 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n1.mediatek.inc (172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 10 Jun 2020 13:45:10 +0800 Received: from [172.21.77.4] (172.21.77.4) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 10 Jun 2020 13:45:10 +0800 Message-ID: <1591767911.527.5.camel@mtksdaap41> Subject: Re: [PATCH v4 08/17] media: mtk-vcodec: separate mtk-vcodec-enc node. From: CK Hu To: Yong Wu , Tiffany Lin , Maoguang Meng Date: Wed, 10 Jun 2020 13:45:11 +0800 In-Reply-To: <1590826218-23653-9-git-send-email-yong.wu@mediatek.com> References: <1590826218-23653-1-git-send-email-yong.wu@mediatek.com> <1590826218-23653-9-git-send-email-yong.wu@mediatek.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200609_224537_562392_F88C8769 X-CRM114-Status: GOOD ( 23.53 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Maoguang Meng , Will Deacon , youlin.pei@mediatek.com, Irui Wang , Nicolas Boichat , Joerg Roedel , Evan Green , eizan@chromium.org, Matthias Kaehlcke , devicetree@vger.kernel.org, cui.zhang@mediatek.com, Tomasz Figa , Rob Herring , linux-mediatek@lists.infradead.org, Hsin-Yi Wang , Matthias Brugger , ming-fan.chen@mediatek.com, linux-arm-kernel@lists.infradead.org, anan.sun@mediatek.com, acourbot@chromium.org, srv_heupstream@mediatek.com, linux-kernel@vger.kernel.org, chao.hao@mediatek.com, iommu@lists.linux-foundation.org, Robin Murphy Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org + Tiffany & Maoguang. On Sat, 2020-05-30 at 16:10 +0800, Yong Wu wrote: > From: Maoguang Meng > > MTK H264 Encoder(VENC_SYS) and VP8 Encoder(VENC_LT_SYS) are two > independent hardware instance. They have their owner interrupt, > register mapping, and special clocks. > > This patch seperates the two instance. This is a preparing patch for > adding device_link between the larbs and venc-device. It's mainly for > fixing the problem: > https://lkml.org/lkml/2019/9/3/316 > > User Call "VIDIOC_QUERYCAP": > H264 Encoder return driver name "mtk-vcodec-enc"; > VP8 Encoder return driver name "mtk-venc-vp8. > > Signed-off-by: Maoguang Meng > Signed-off-by: Hsin-Yi Wang > Signed-off-by: Irui Wang > --- > drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h | 10 +- > drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c | 23 +++- > .../media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c | 127 +++++++++------------ > .../media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c | 31 +---- > .../media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h | 1 - > .../media/platform/mtk-vcodec/venc/venc_vp8_if.c | 4 +- > 6 files changed, 80 insertions(+), 116 deletions(-) > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > index a2716117..52d1ce1 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > @@ -19,6 +19,7 @@ > #define MTK_VCODEC_DRV_NAME "mtk_vcodec_drv" > #define MTK_VCODEC_DEC_NAME "mtk-vcodec-dec" > #define MTK_VCODEC_ENC_NAME "mtk-vcodec-enc" > +#define MTK_VENC_VP8_NAME "mtk-venc-vp8" > #define MTK_PLATFORM_STR "platform:mt8173" > > #define MTK_VCODEC_MAX_PLANES 3 > @@ -193,7 +194,6 @@ struct mtk_vcodec_pm { > > struct mtk_vcodec_clk venc_clk; > struct device *larbvenc; > - struct device *larbvenclt; > struct device *dev; > struct mtk_vcodec_dev *mtkdev; > }; > @@ -311,25 +311,27 @@ enum mtk_chip { > * @chip: chip this encoder is compatible with > * > * @uses_ext: whether the encoder uses the extended firmware messaging format > - * @has_lt_irq: whether the encoder uses the LT irq > + * @name: whether the encoder core is vp8 > * @min_birate: minimum supported encoding bitrate > * @max_bitrate: maximum supported encoding bitrate > * @capture_formats: array of supported capture formats > * @num_capture_formats: number of entries in capture_formats > * @output_formats: array of supported output formats > * @num_output_formats: number of entries in output_formats > + * @core_id: stand for h264 or vp8 encode index > */ > struct mtk_vcodec_enc_pdata { > enum mtk_chip chip; > > bool uses_ext; > - bool has_lt_irq; > + const char *name; > unsigned long min_bitrate; > unsigned long max_bitrate; > const struct mtk_video_fmt *capture_formats; > size_t num_capture_formats; > const struct mtk_video_fmt *output_formats; > size_t num_output_formats; > + int core_id; > }; > > /** > @@ -359,7 +361,6 @@ struct mtk_vcodec_enc_pdata { > * > * @dec_irq: decoder irq resource > * @enc_irq: h264 encoder irq resource > - * @enc_lt_irq: vp8 encoder irq resource > * > * @dec_mutex: decoder hardware lock > * @enc_mutex: encoder hardware lock. > @@ -395,7 +396,6 @@ struct mtk_vcodec_dev { > > int dec_irq; > int enc_irq; > - int enc_lt_irq; > > struct mutex dec_mutex; > struct mutex enc_mutex; > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > index f0af78f..5301dca 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > @@ -9,6 +9,7 @@ > #include > #include > #include > +#include > > #include "mtk_vcodec_drv.h" > #include "mtk_vcodec_enc.h" > @@ -174,7 +175,10 @@ static int vidioc_enum_fmt_vid_out(struct file *file, void *priv, > static int vidioc_venc_querycap(struct file *file, void *priv, > struct v4l2_capability *cap) > { > - strscpy(cap->driver, MTK_VCODEC_ENC_NAME, sizeof(cap->driver)); > + const struct mtk_vcodec_enc_pdata *pdata = > + fh_to_ctx(priv)->dev->venc_pdata; > + > + strscpy(cap->driver, pdata->name, sizeof(cap->driver)); > strscpy(cap->bus_info, MTK_PLATFORM_STR, sizeof(cap->bus_info)); > strscpy(cap->card, MTK_PLATFORM_STR, sizeof(cap->card)); > > @@ -788,7 +792,7 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count) > */ > if ((ctx->state == MTK_STATE_ABORT) || (ctx->state == MTK_STATE_FREE)) { > ret = -EIO; > - goto err_set_param; > + goto err_start_stream; > } > > /* Do the initialization when both start_streaming have been called */ > @@ -800,6 +804,12 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count) > return 0; > } > > + ret = pm_runtime_get_sync(&ctx->dev->plat_dev->dev); > + if (ret < 0) { > + mtk_v4l2_err("pm_runtime_get_sync fail %d", ret); > + goto err_start_stream; > + } > + > mtk_venc_set_param(ctx, ¶m); > ret = venc_if_set_param(ctx, VENC_SET_PARAM_ENC, ¶m); > if (ret) { > @@ -826,6 +836,11 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count) > return 0; > > err_set_param: > + ret = pm_runtime_put(&ctx->dev->plat_dev->dev); > + if (ret < 0) > + mtk_v4l2_err("pm_runtime_put fail %d", ret); > + > +err_start_stream: > for (i = 0; i < q->num_buffers; ++i) { > struct vb2_buffer *buf = vb2_get_buffer(q, i); > > @@ -879,6 +894,10 @@ static void vb2ops_venc_stop_streaming(struct vb2_queue *q) > if (ret) > mtk_v4l2_err("venc_if_deinit failed=%d", ret); > > + ret = pm_runtime_put(&ctx->dev->plat_dev->dev); > + if (ret < 0) > + mtk_v4l2_err("pm_runtime_put fail %d", ret); > + > ctx->state = MTK_STATE_FREE; > } > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > index b8fe408..fe17f0c 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > @@ -49,12 +49,15 @@ > }, > }; > > -static const struct mtk_video_fmt mtk_video_formats_capture_mt8173[] = { > +static const struct mtk_video_fmt mtk_video_formats_capture_mt8173_h264[] = { > { > .fourcc = V4L2_PIX_FMT_H264, > .type = MTK_FMT_ENC, > .num_planes = 1, > }, > +}; > + > +static const struct mtk_video_fmt mtk_video_formats_capture_mt8173_vp8[] = { > { > .fourcc = V4L2_PIX_FMT_VP8, > .type = MTK_FMT_ENC, > @@ -110,35 +113,13 @@ static irqreturn_t mtk_vcodec_enc_irq_handler(int irq, void *priv) > ctx = dev->curr_ctx; > spin_unlock_irqrestore(&dev->irqlock, flags); > > - mtk_v4l2_debug(1, "id=%d", ctx->id); > - addr = dev->reg_base[VENC_SYS] + MTK_VENC_IRQ_ACK_OFFSET; > - > - ctx->irq_status = readl(dev->reg_base[VENC_SYS] + > - (MTK_VENC_IRQ_STATUS_OFFSET)); > - > - clean_irq_status(ctx->irq_status, addr); > - > - wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED); > - return IRQ_HANDLED; > -} > - > -static irqreturn_t mtk_vcodec_enc_lt_irq_handler(int irq, void *priv) > -{ > - struct mtk_vcodec_dev *dev = priv; > - struct mtk_vcodec_ctx *ctx; > - unsigned long flags; > - void __iomem *addr; > - > - spin_lock_irqsave(&dev->irqlock, flags); > - ctx = dev->curr_ctx; > - spin_unlock_irqrestore(&dev->irqlock, flags); > + mtk_v4l2_debug(1, "id=%d coreid:%d", ctx->id, dev->venc_pdata->core_id); > + addr = dev->reg_base[dev->venc_pdata->core_id] + > + MTK_VENC_IRQ_ACK_OFFSET; > > - mtk_v4l2_debug(1, "id=%d", ctx->id); > - ctx->irq_status = readl(dev->reg_base[VENC_LT_SYS] + > + ctx->irq_status = readl(dev->reg_base[dev->venc_pdata->core_id] + > (MTK_VENC_IRQ_STATUS_OFFSET)); > > - addr = dev->reg_base[VENC_LT_SYS] + MTK_VENC_IRQ_ACK_OFFSET; > - > clean_irq_status(ctx->irq_status, addr); > > wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED); > @@ -265,7 +246,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > struct resource *res; > phandle rproc_phandle; > enum mtk_vcodec_fw_type fw_type; > - int i, j, ret; > + int ret; > + void __iomem *reg_base; > > dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); > if (!dev) > @@ -291,63 +273,39 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > dev->venc_pdata = of_device_get_match_data(&pdev->dev); > ret = mtk_vcodec_init_enc_pm(dev); > if (ret < 0) { > - dev_err(&pdev->dev, "Failed to get mt vcodec clock source!"); > + dev_err(&pdev->dev, "Failed to get mtk vcodec clock source!"); > goto err_enc_pm; > } > > - for (i = VENC_SYS, j = 0; i < NUM_MAX_VCODEC_REG_BASE; i++, j++) { > - res = platform_get_resource(pdev, IORESOURCE_MEM, j); > - dev->reg_base[i] = devm_ioremap_resource(&pdev->dev, res); > - if (IS_ERR((__force void *)dev->reg_base[i])) { > - ret = PTR_ERR((__force void *)dev->reg_base[i]); > - goto err_res; > - } > - mtk_v4l2_debug(2, "reg[%d] base=0x%p", i, dev->reg_base[i]); > - } > + pm_runtime_enable(&pdev->dev); > + > + snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "%s", > + dev->venc_pdata->name); > > - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); > - if (res == NULL) { > - dev_err(&pdev->dev, "failed to get irq resource"); > - ret = -ENOENT; > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + reg_base = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR((__force void *)reg_base)) { > + ret = PTR_ERR((__force void *)reg_base); > goto err_res; > } > + dev->reg_base[dev->venc_pdata->core_id] = reg_base; > > dev->enc_irq = platform_get_irq(pdev, 0); > ret = devm_request_irq(&pdev->dev, dev->enc_irq, > mtk_vcodec_enc_irq_handler, > 0, pdev->name, dev); > if (ret) { > - dev_err(&pdev->dev, "Failed to install dev->enc_irq %d (%d)", > - dev->enc_irq, > - ret); > + dev_err(&pdev->dev, > + "Failed to install dev->enc_irq %d (%d) core_id:%d", > + dev->enc_irq, ret, dev->venc_pdata->core_id); > ret = -EINVAL; > goto err_res; > } > disable_irq(dev->enc_irq); > > - if (dev->venc_pdata->has_lt_irq) { > - dev->enc_lt_irq = platform_get_irq(pdev, 1); > - ret = devm_request_irq(&pdev->dev, > - dev->enc_lt_irq, > - mtk_vcodec_enc_lt_irq_handler, > - 0, pdev->name, dev); > - if (ret) { > - dev_err(&pdev->dev, > - "Failed to install dev->enc_lt_irq %d (%d)", > - dev->enc_lt_irq, ret); > - ret = -EINVAL; > - goto err_res; > - } > - disable_irq(dev->enc_lt_irq); /* VENC_LT */ > - } > - > mutex_init(&dev->enc_mutex); > mutex_init(&dev->dev_mutex); > spin_lock_init(&dev->irqlock); > - > - snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "%s", > - "[MTK_V4L2_VENC]"); > - > ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); > if (ret) { > mtk_v4l2_err("v4l2_device_register err=%d", ret); > @@ -373,7 +331,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > V4L2_CAP_STREAMING; > > snprintf(vfd_enc->name, sizeof(vfd_enc->name), "%s", > - MTK_VCODEC_ENC_NAME); > + dev->venc_pdata->name); > video_set_drvdata(vfd_enc, dev); > dev->vfd_enc = vfd_enc; > platform_set_drvdata(pdev, dev); > @@ -401,8 +359,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > goto err_enc_reg; > } > > - mtk_v4l2_debug(0, "encoder registered as /dev/video%d", > - vfd_enc->num); > + mtk_v4l2_debug(0, "encoder %d registered as /dev/video%d", > + dev->venc_pdata->core_id, vfd_enc->num); > > return 0; > > @@ -415,26 +373,39 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > err_enc_alloc: > v4l2_device_unregister(&dev->v4l2_dev); > err_res: > - mtk_vcodec_release_enc_pm(dev); > + pm_runtime_disable(&pdev->dev); > err_enc_pm: > mtk_vcodec_fw_release(dev->fw_handler); > return ret; > } > > -static const struct mtk_vcodec_enc_pdata mt8173_pdata = { > +static const struct mtk_vcodec_enc_pdata mt8173_avc_pdata = { > + .chip = MTK_MT8173, > + .name = MTK_VCODEC_ENC_NAME, > + .capture_formats = mtk_video_formats_capture_mt8173_h264, > + .num_capture_formats = 1, > + .output_formats = mtk_video_formats_output_mt8173, > + .num_output_formats = ARRAY_SIZE(mtk_video_formats_output_mt8173), > + .min_bitrate = 1, > + .max_bitrate = 4000000, > + .core_id = VENC_SYS, > +}; > + > +static const struct mtk_vcodec_enc_pdata mt8173_vp8_pdata = { > .chip = MTK_MT8173, > - .has_lt_irq = true, > - .capture_formats = mtk_video_formats_capture_mt8173, > - .num_capture_formats = ARRAY_SIZE(mtk_video_formats_capture_mt8173), > + .name = MTK_VENC_VP8_NAME, > + .capture_formats = mtk_video_formats_capture_mt8173_vp8, > + .num_capture_formats = 1, > .output_formats = mtk_video_formats_output_mt8173, > .num_output_formats = ARRAY_SIZE(mtk_video_formats_output_mt8173), > .min_bitrate = 1, > .max_bitrate = 4000000, > + .core_id = VENC_LT_SYS, > }; > > static const struct mtk_vcodec_enc_pdata mt8183_pdata = { > .chip = MTK_MT8183, > - .has_lt_irq = false, > + .name = MTK_VCODEC_ENC_NAME, > .uses_ext = true, > .capture_formats = mtk_video_formats_capture_mt8183, > .num_capture_formats = ARRAY_SIZE(mtk_video_formats_capture_mt8183), > @@ -443,10 +414,14 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > .num_output_formats = ARRAY_SIZE(mtk_video_formats_output_mt8173), > .min_bitrate = 64, > .max_bitrate = 40000000, > + .core_id = VENC_SYS, > }; > > static const struct of_device_id mtk_vcodec_enc_match[] = { > - {.compatible = "mediatek,mt8173-vcodec-enc", .data = &mt8173_pdata}, > + {.compatible = "mediatek,mt8173-vcodec-avc-enc", > + .data = &mt8173_avc_pdata}, > + {.compatible = "mediatek,mt8173-vcodec-vp8-enc", > + .data = &mt8173_vp8_pdata}, > {.compatible = "mediatek,mt8183-vcodec-enc", .data = &mt8183_pdata}, > {}, > }; > @@ -466,7 +441,7 @@ static int mtk_vcodec_enc_remove(struct platform_device *pdev) > video_unregister_device(dev->vfd_enc); > > v4l2_device_unregister(&dev->v4l2_dev); > - mtk_vcodec_release_enc_pm(dev); > + pm_runtime_disable(&pdev->dev); > mtk_vcodec_fw_release(dev->fw_handler); > return 0; > } > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > index ee22902..01c6a55 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > @@ -43,21 +43,6 @@ int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *mtkdev) > return -ENODEV; > } > pm->larbvenc = &pdev->dev; > - > - node = of_parse_phandle(dev->of_node, "mediatek,larb", 1); > - if (!node) { > - mtk_v4l2_err("no mediatek,larb found"); > - return -ENODEV; > - } > - > - pdev = of_find_device_by_node(node); > - of_node_put(node); > - if (!pdev) { > - mtk_v4l2_err("no mediatek,larb device found"); > - return -ENODEV; > - } > - > - pm->larbvenclt = &pdev->dev; > pdev = mtkdev->plat_dev; > pm->dev = &pdev->dev; > > @@ -94,11 +79,6 @@ int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *mtkdev) > return ret; > } > > -void mtk_vcodec_release_enc_pm(struct mtk_vcodec_dev *mtkdev) > -{ > -} > - > - > void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm) > { > struct mtk_vcodec_clk *enc_clk = &pm->venc_clk; > @@ -116,18 +96,10 @@ void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm) > ret = mtk_smi_larb_get(pm->larbvenc); > if (ret) { > mtk_v4l2_err("mtk_smi_larb_get larb3 fail %d", ret); > - goto larbvencerr; > - } > - ret = mtk_smi_larb_get(pm->larbvenclt); > - if (ret) { > - mtk_v4l2_err("mtk_smi_larb_get larb4 fail %d", ret); > - goto larbvenclterr; > + goto clkerr; > } > return; > > -larbvenclterr: > - mtk_smi_larb_put(pm->larbvenc); > -larbvencerr: > clkerr: > for (i -= 1; i >= 0; i--) > clk_disable_unprepare(enc_clk->clk_info[i].vcodec_clk); > @@ -139,7 +111,6 @@ void mtk_vcodec_enc_clock_off(struct mtk_vcodec_pm *pm) > int i = 0; > > mtk_smi_larb_put(pm->larbvenc); > - mtk_smi_larb_put(pm->larbvenclt); > for (i = enc_clk->clk_num - 1; i >= 0; i--) > clk_disable_unprepare(enc_clk->clk_info[i].vcodec_clk); > } > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h > index b7ecdfd..c1b5986 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h > @@ -10,7 +10,6 @@ > #include "mtk_vcodec_drv.h" > > int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *dev); > -void mtk_vcodec_release_enc_pm(struct mtk_vcodec_dev *dev); > > void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm); > void mtk_vcodec_enc_clock_off(struct mtk_vcodec_pm *pm); > diff --git a/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c b/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > index 11abb19..8267a9c 100644 > --- a/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > +++ b/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > @@ -367,7 +367,7 @@ static int vp8_enc_encode(void *handle, > > mtk_vcodec_debug_enter(inst); > > - enable_irq(ctx->dev->enc_lt_irq); > + enable_irq(ctx->dev->enc_irq); > > switch (opt) { > case VENC_START_OPT_ENCODE_FRAME: > @@ -386,7 +386,7 @@ static int vp8_enc_encode(void *handle, > > encode_err: > > - disable_irq(ctx->dev->enc_lt_irq); > + disable_irq(ctx->dev->enc_irq); > mtk_vcodec_debug_leave(inst); > > return ret; _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek 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 X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DB54BC433DF for ; Wed, 10 Jun 2020 05:45:43 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id A31F5207F9 for ; Wed, 10 Jun 2020 05:45:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="QalcUK4S"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="MoAGCfd8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A31F5207F9 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=KIv5PmOAi1lJopzLr1WbSzlIqT3ARX8p59Tue1kFxCU=; b=QalcUK4SKsFtCy W9EiErLFzOHvLWBy6UFrnLSBTGA67BPqN5MSqc5zs4OzoBKaqkOqLvhWrbSTqpd/aFVn82srEMVDX ikjlrjIWzA6Tw5I9mvADChW/TGgsLbAHmIg/tPyQdcJ7BhcOEZ66+LScqFmdwc2Fhwk9LAt3v1mrR uIwATaQ8fvDz8rfyX9cIzMIxWYo60T1qXIfDlsJf5kiqj+I+nDNp7lpUQ9dtzrMAubpKClLjhJDmc LS4xcdAsdo4USryzQjGx4az3OSkvbN/b9CBg0CL/ijFkpYboSeWSWMOrDB+wI7SKyble2kK2XZYgb NOz/KxByYW1tZM9ycs6w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jitYV-0000ls-2M; Wed, 10 Jun 2020 05:45:43 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jitYP-0000kI-GT; Wed, 10 Jun 2020 05:45:40 +0000 X-UUID: fb8145ff136a4332b9dd18da8943cbf9-20200609 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=eZeaCZigg3GkXMWmssrDhkhnVabWFGgwfU7U4dmrbIc=; b=MoAGCfd8FEY+mf88xYcffl0Nmx9jT7QFI54wEd9wOJb8zdfPp3Tg/amT+8f8RILPe0s7/mFNtGZ71wcKKaUQaJ4I0kTko+vz8YnPhj9ncKBE4nhZ87SMiq1VM5C1TOizsv7eVGxcSwpD108TIsbapRf9Skj+YhNGkNmwkbX0nJE=; X-UUID: fb8145ff136a4332b9dd18da8943cbf9-20200609 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1709960460; Tue, 09 Jun 2020 21:45:11 -0800 Received: from mtkmbs08n1.mediatek.inc (172.21.101.55) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 9 Jun 2020 22:45:23 -0700 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n1.mediatek.inc (172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 10 Jun 2020 13:45:10 +0800 Received: from [172.21.77.4] (172.21.77.4) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 10 Jun 2020 13:45:10 +0800 Message-ID: <1591767911.527.5.camel@mtksdaap41> Subject: Re: [PATCH v4 08/17] media: mtk-vcodec: separate mtk-vcodec-enc node. From: CK Hu To: Yong Wu , Tiffany Lin , Maoguang Meng Date: Wed, 10 Jun 2020 13:45:11 +0800 In-Reply-To: <1590826218-23653-9-git-send-email-yong.wu@mediatek.com> References: <1590826218-23653-1-git-send-email-yong.wu@mediatek.com> <1590826218-23653-9-git-send-email-yong.wu@mediatek.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200609_224537_562392_F88C8769 X-CRM114-Status: GOOD ( 23.53 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Maoguang Meng , Will Deacon , youlin.pei@mediatek.com, Irui Wang , Nicolas Boichat , Joerg Roedel , Evan Green , eizan@chromium.org, Matthias Kaehlcke , devicetree@vger.kernel.org, cui.zhang@mediatek.com, Tomasz Figa , Rob Herring , linux-mediatek@lists.infradead.org, Hsin-Yi Wang , Matthias Brugger , ming-fan.chen@mediatek.com, linux-arm-kernel@lists.infradead.org, anan.sun@mediatek.com, acourbot@chromium.org, srv_heupstream@mediatek.com, linux-kernel@vger.kernel.org, chao.hao@mediatek.com, iommu@lists.linux-foundation.org, Robin Murphy Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org + Tiffany & Maoguang. On Sat, 2020-05-30 at 16:10 +0800, Yong Wu wrote: > From: Maoguang Meng > > MTK H264 Encoder(VENC_SYS) and VP8 Encoder(VENC_LT_SYS) are two > independent hardware instance. They have their owner interrupt, > register mapping, and special clocks. > > This patch seperates the two instance. This is a preparing patch for > adding device_link between the larbs and venc-device. It's mainly for > fixing the problem: > https://lkml.org/lkml/2019/9/3/316 > > User Call "VIDIOC_QUERYCAP": > H264 Encoder return driver name "mtk-vcodec-enc"; > VP8 Encoder return driver name "mtk-venc-vp8. > > Signed-off-by: Maoguang Meng > Signed-off-by: Hsin-Yi Wang > Signed-off-by: Irui Wang > --- > drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h | 10 +- > drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c | 23 +++- > .../media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c | 127 +++++++++------------ > .../media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c | 31 +---- > .../media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h | 1 - > .../media/platform/mtk-vcodec/venc/venc_vp8_if.c | 4 +- > 6 files changed, 80 insertions(+), 116 deletions(-) > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > index a2716117..52d1ce1 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > @@ -19,6 +19,7 @@ > #define MTK_VCODEC_DRV_NAME "mtk_vcodec_drv" > #define MTK_VCODEC_DEC_NAME "mtk-vcodec-dec" > #define MTK_VCODEC_ENC_NAME "mtk-vcodec-enc" > +#define MTK_VENC_VP8_NAME "mtk-venc-vp8" > #define MTK_PLATFORM_STR "platform:mt8173" > > #define MTK_VCODEC_MAX_PLANES 3 > @@ -193,7 +194,6 @@ struct mtk_vcodec_pm { > > struct mtk_vcodec_clk venc_clk; > struct device *larbvenc; > - struct device *larbvenclt; > struct device *dev; > struct mtk_vcodec_dev *mtkdev; > }; > @@ -311,25 +311,27 @@ enum mtk_chip { > * @chip: chip this encoder is compatible with > * > * @uses_ext: whether the encoder uses the extended firmware messaging format > - * @has_lt_irq: whether the encoder uses the LT irq > + * @name: whether the encoder core is vp8 > * @min_birate: minimum supported encoding bitrate > * @max_bitrate: maximum supported encoding bitrate > * @capture_formats: array of supported capture formats > * @num_capture_formats: number of entries in capture_formats > * @output_formats: array of supported output formats > * @num_output_formats: number of entries in output_formats > + * @core_id: stand for h264 or vp8 encode index > */ > struct mtk_vcodec_enc_pdata { > enum mtk_chip chip; > > bool uses_ext; > - bool has_lt_irq; > + const char *name; > unsigned long min_bitrate; > unsigned long max_bitrate; > const struct mtk_video_fmt *capture_formats; > size_t num_capture_formats; > const struct mtk_video_fmt *output_formats; > size_t num_output_formats; > + int core_id; > }; > > /** > @@ -359,7 +361,6 @@ struct mtk_vcodec_enc_pdata { > * > * @dec_irq: decoder irq resource > * @enc_irq: h264 encoder irq resource > - * @enc_lt_irq: vp8 encoder irq resource > * > * @dec_mutex: decoder hardware lock > * @enc_mutex: encoder hardware lock. > @@ -395,7 +396,6 @@ struct mtk_vcodec_dev { > > int dec_irq; > int enc_irq; > - int enc_lt_irq; > > struct mutex dec_mutex; > struct mutex enc_mutex; > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > index f0af78f..5301dca 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > @@ -9,6 +9,7 @@ > #include > #include > #include > +#include > > #include "mtk_vcodec_drv.h" > #include "mtk_vcodec_enc.h" > @@ -174,7 +175,10 @@ static int vidioc_enum_fmt_vid_out(struct file *file, void *priv, > static int vidioc_venc_querycap(struct file *file, void *priv, > struct v4l2_capability *cap) > { > - strscpy(cap->driver, MTK_VCODEC_ENC_NAME, sizeof(cap->driver)); > + const struct mtk_vcodec_enc_pdata *pdata = > + fh_to_ctx(priv)->dev->venc_pdata; > + > + strscpy(cap->driver, pdata->name, sizeof(cap->driver)); > strscpy(cap->bus_info, MTK_PLATFORM_STR, sizeof(cap->bus_info)); > strscpy(cap->card, MTK_PLATFORM_STR, sizeof(cap->card)); > > @@ -788,7 +792,7 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count) > */ > if ((ctx->state == MTK_STATE_ABORT) || (ctx->state == MTK_STATE_FREE)) { > ret = -EIO; > - goto err_set_param; > + goto err_start_stream; > } > > /* Do the initialization when both start_streaming have been called */ > @@ -800,6 +804,12 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count) > return 0; > } > > + ret = pm_runtime_get_sync(&ctx->dev->plat_dev->dev); > + if (ret < 0) { > + mtk_v4l2_err("pm_runtime_get_sync fail %d", ret); > + goto err_start_stream; > + } > + > mtk_venc_set_param(ctx, ¶m); > ret = venc_if_set_param(ctx, VENC_SET_PARAM_ENC, ¶m); > if (ret) { > @@ -826,6 +836,11 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count) > return 0; > > err_set_param: > + ret = pm_runtime_put(&ctx->dev->plat_dev->dev); > + if (ret < 0) > + mtk_v4l2_err("pm_runtime_put fail %d", ret); > + > +err_start_stream: > for (i = 0; i < q->num_buffers; ++i) { > struct vb2_buffer *buf = vb2_get_buffer(q, i); > > @@ -879,6 +894,10 @@ static void vb2ops_venc_stop_streaming(struct vb2_queue *q) > if (ret) > mtk_v4l2_err("venc_if_deinit failed=%d", ret); > > + ret = pm_runtime_put(&ctx->dev->plat_dev->dev); > + if (ret < 0) > + mtk_v4l2_err("pm_runtime_put fail %d", ret); > + > ctx->state = MTK_STATE_FREE; > } > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > index b8fe408..fe17f0c 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > @@ -49,12 +49,15 @@ > }, > }; > > -static const struct mtk_video_fmt mtk_video_formats_capture_mt8173[] = { > +static const struct mtk_video_fmt mtk_video_formats_capture_mt8173_h264[] = { > { > .fourcc = V4L2_PIX_FMT_H264, > .type = MTK_FMT_ENC, > .num_planes = 1, > }, > +}; > + > +static const struct mtk_video_fmt mtk_video_formats_capture_mt8173_vp8[] = { > { > .fourcc = V4L2_PIX_FMT_VP8, > .type = MTK_FMT_ENC, > @@ -110,35 +113,13 @@ static irqreturn_t mtk_vcodec_enc_irq_handler(int irq, void *priv) > ctx = dev->curr_ctx; > spin_unlock_irqrestore(&dev->irqlock, flags); > > - mtk_v4l2_debug(1, "id=%d", ctx->id); > - addr = dev->reg_base[VENC_SYS] + MTK_VENC_IRQ_ACK_OFFSET; > - > - ctx->irq_status = readl(dev->reg_base[VENC_SYS] + > - (MTK_VENC_IRQ_STATUS_OFFSET)); > - > - clean_irq_status(ctx->irq_status, addr); > - > - wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED); > - return IRQ_HANDLED; > -} > - > -static irqreturn_t mtk_vcodec_enc_lt_irq_handler(int irq, void *priv) > -{ > - struct mtk_vcodec_dev *dev = priv; > - struct mtk_vcodec_ctx *ctx; > - unsigned long flags; > - void __iomem *addr; > - > - spin_lock_irqsave(&dev->irqlock, flags); > - ctx = dev->curr_ctx; > - spin_unlock_irqrestore(&dev->irqlock, flags); > + mtk_v4l2_debug(1, "id=%d coreid:%d", ctx->id, dev->venc_pdata->core_id); > + addr = dev->reg_base[dev->venc_pdata->core_id] + > + MTK_VENC_IRQ_ACK_OFFSET; > > - mtk_v4l2_debug(1, "id=%d", ctx->id); > - ctx->irq_status = readl(dev->reg_base[VENC_LT_SYS] + > + ctx->irq_status = readl(dev->reg_base[dev->venc_pdata->core_id] + > (MTK_VENC_IRQ_STATUS_OFFSET)); > > - addr = dev->reg_base[VENC_LT_SYS] + MTK_VENC_IRQ_ACK_OFFSET; > - > clean_irq_status(ctx->irq_status, addr); > > wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED); > @@ -265,7 +246,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > struct resource *res; > phandle rproc_phandle; > enum mtk_vcodec_fw_type fw_type; > - int i, j, ret; > + int ret; > + void __iomem *reg_base; > > dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); > if (!dev) > @@ -291,63 +273,39 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > dev->venc_pdata = of_device_get_match_data(&pdev->dev); > ret = mtk_vcodec_init_enc_pm(dev); > if (ret < 0) { > - dev_err(&pdev->dev, "Failed to get mt vcodec clock source!"); > + dev_err(&pdev->dev, "Failed to get mtk vcodec clock source!"); > goto err_enc_pm; > } > > - for (i = VENC_SYS, j = 0; i < NUM_MAX_VCODEC_REG_BASE; i++, j++) { > - res = platform_get_resource(pdev, IORESOURCE_MEM, j); > - dev->reg_base[i] = devm_ioremap_resource(&pdev->dev, res); > - if (IS_ERR((__force void *)dev->reg_base[i])) { > - ret = PTR_ERR((__force void *)dev->reg_base[i]); > - goto err_res; > - } > - mtk_v4l2_debug(2, "reg[%d] base=0x%p", i, dev->reg_base[i]); > - } > + pm_runtime_enable(&pdev->dev); > + > + snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "%s", > + dev->venc_pdata->name); > > - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); > - if (res == NULL) { > - dev_err(&pdev->dev, "failed to get irq resource"); > - ret = -ENOENT; > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + reg_base = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR((__force void *)reg_base)) { > + ret = PTR_ERR((__force void *)reg_base); > goto err_res; > } > + dev->reg_base[dev->venc_pdata->core_id] = reg_base; > > dev->enc_irq = platform_get_irq(pdev, 0); > ret = devm_request_irq(&pdev->dev, dev->enc_irq, > mtk_vcodec_enc_irq_handler, > 0, pdev->name, dev); > if (ret) { > - dev_err(&pdev->dev, "Failed to install dev->enc_irq %d (%d)", > - dev->enc_irq, > - ret); > + dev_err(&pdev->dev, > + "Failed to install dev->enc_irq %d (%d) core_id:%d", > + dev->enc_irq, ret, dev->venc_pdata->core_id); > ret = -EINVAL; > goto err_res; > } > disable_irq(dev->enc_irq); > > - if (dev->venc_pdata->has_lt_irq) { > - dev->enc_lt_irq = platform_get_irq(pdev, 1); > - ret = devm_request_irq(&pdev->dev, > - dev->enc_lt_irq, > - mtk_vcodec_enc_lt_irq_handler, > - 0, pdev->name, dev); > - if (ret) { > - dev_err(&pdev->dev, > - "Failed to install dev->enc_lt_irq %d (%d)", > - dev->enc_lt_irq, ret); > - ret = -EINVAL; > - goto err_res; > - } > - disable_irq(dev->enc_lt_irq); /* VENC_LT */ > - } > - > mutex_init(&dev->enc_mutex); > mutex_init(&dev->dev_mutex); > spin_lock_init(&dev->irqlock); > - > - snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "%s", > - "[MTK_V4L2_VENC]"); > - > ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); > if (ret) { > mtk_v4l2_err("v4l2_device_register err=%d", ret); > @@ -373,7 +331,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > V4L2_CAP_STREAMING; > > snprintf(vfd_enc->name, sizeof(vfd_enc->name), "%s", > - MTK_VCODEC_ENC_NAME); > + dev->venc_pdata->name); > video_set_drvdata(vfd_enc, dev); > dev->vfd_enc = vfd_enc; > platform_set_drvdata(pdev, dev); > @@ -401,8 +359,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > goto err_enc_reg; > } > > - mtk_v4l2_debug(0, "encoder registered as /dev/video%d", > - vfd_enc->num); > + mtk_v4l2_debug(0, "encoder %d registered as /dev/video%d", > + dev->venc_pdata->core_id, vfd_enc->num); > > return 0; > > @@ -415,26 +373,39 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > err_enc_alloc: > v4l2_device_unregister(&dev->v4l2_dev); > err_res: > - mtk_vcodec_release_enc_pm(dev); > + pm_runtime_disable(&pdev->dev); > err_enc_pm: > mtk_vcodec_fw_release(dev->fw_handler); > return ret; > } > > -static const struct mtk_vcodec_enc_pdata mt8173_pdata = { > +static const struct mtk_vcodec_enc_pdata mt8173_avc_pdata = { > + .chip = MTK_MT8173, > + .name = MTK_VCODEC_ENC_NAME, > + .capture_formats = mtk_video_formats_capture_mt8173_h264, > + .num_capture_formats = 1, > + .output_formats = mtk_video_formats_output_mt8173, > + .num_output_formats = ARRAY_SIZE(mtk_video_formats_output_mt8173), > + .min_bitrate = 1, > + .max_bitrate = 4000000, > + .core_id = VENC_SYS, > +}; > + > +static const struct mtk_vcodec_enc_pdata mt8173_vp8_pdata = { > .chip = MTK_MT8173, > - .has_lt_irq = true, > - .capture_formats = mtk_video_formats_capture_mt8173, > - .num_capture_formats = ARRAY_SIZE(mtk_video_formats_capture_mt8173), > + .name = MTK_VENC_VP8_NAME, > + .capture_formats = mtk_video_formats_capture_mt8173_vp8, > + .num_capture_formats = 1, > .output_formats = mtk_video_formats_output_mt8173, > .num_output_formats = ARRAY_SIZE(mtk_video_formats_output_mt8173), > .min_bitrate = 1, > .max_bitrate = 4000000, > + .core_id = VENC_LT_SYS, > }; > > static const struct mtk_vcodec_enc_pdata mt8183_pdata = { > .chip = MTK_MT8183, > - .has_lt_irq = false, > + .name = MTK_VCODEC_ENC_NAME, > .uses_ext = true, > .capture_formats = mtk_video_formats_capture_mt8183, > .num_capture_formats = ARRAY_SIZE(mtk_video_formats_capture_mt8183), > @@ -443,10 +414,14 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > .num_output_formats = ARRAY_SIZE(mtk_video_formats_output_mt8173), > .min_bitrate = 64, > .max_bitrate = 40000000, > + .core_id = VENC_SYS, > }; > > static const struct of_device_id mtk_vcodec_enc_match[] = { > - {.compatible = "mediatek,mt8173-vcodec-enc", .data = &mt8173_pdata}, > + {.compatible = "mediatek,mt8173-vcodec-avc-enc", > + .data = &mt8173_avc_pdata}, > + {.compatible = "mediatek,mt8173-vcodec-vp8-enc", > + .data = &mt8173_vp8_pdata}, > {.compatible = "mediatek,mt8183-vcodec-enc", .data = &mt8183_pdata}, > {}, > }; > @@ -466,7 +441,7 @@ static int mtk_vcodec_enc_remove(struct platform_device *pdev) > video_unregister_device(dev->vfd_enc); > > v4l2_device_unregister(&dev->v4l2_dev); > - mtk_vcodec_release_enc_pm(dev); > + pm_runtime_disable(&pdev->dev); > mtk_vcodec_fw_release(dev->fw_handler); > return 0; > } > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > index ee22902..01c6a55 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > @@ -43,21 +43,6 @@ int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *mtkdev) > return -ENODEV; > } > pm->larbvenc = &pdev->dev; > - > - node = of_parse_phandle(dev->of_node, "mediatek,larb", 1); > - if (!node) { > - mtk_v4l2_err("no mediatek,larb found"); > - return -ENODEV; > - } > - > - pdev = of_find_device_by_node(node); > - of_node_put(node); > - if (!pdev) { > - mtk_v4l2_err("no mediatek,larb device found"); > - return -ENODEV; > - } > - > - pm->larbvenclt = &pdev->dev; > pdev = mtkdev->plat_dev; > pm->dev = &pdev->dev; > > @@ -94,11 +79,6 @@ int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *mtkdev) > return ret; > } > > -void mtk_vcodec_release_enc_pm(struct mtk_vcodec_dev *mtkdev) > -{ > -} > - > - > void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm) > { > struct mtk_vcodec_clk *enc_clk = &pm->venc_clk; > @@ -116,18 +96,10 @@ void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm) > ret = mtk_smi_larb_get(pm->larbvenc); > if (ret) { > mtk_v4l2_err("mtk_smi_larb_get larb3 fail %d", ret); > - goto larbvencerr; > - } > - ret = mtk_smi_larb_get(pm->larbvenclt); > - if (ret) { > - mtk_v4l2_err("mtk_smi_larb_get larb4 fail %d", ret); > - goto larbvenclterr; > + goto clkerr; > } > return; > > -larbvenclterr: > - mtk_smi_larb_put(pm->larbvenc); > -larbvencerr: > clkerr: > for (i -= 1; i >= 0; i--) > clk_disable_unprepare(enc_clk->clk_info[i].vcodec_clk); > @@ -139,7 +111,6 @@ void mtk_vcodec_enc_clock_off(struct mtk_vcodec_pm *pm) > int i = 0; > > mtk_smi_larb_put(pm->larbvenc); > - mtk_smi_larb_put(pm->larbvenclt); > for (i = enc_clk->clk_num - 1; i >= 0; i--) > clk_disable_unprepare(enc_clk->clk_info[i].vcodec_clk); > } > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h > index b7ecdfd..c1b5986 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.h > @@ -10,7 +10,6 @@ > #include "mtk_vcodec_drv.h" > > int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *dev); > -void mtk_vcodec_release_enc_pm(struct mtk_vcodec_dev *dev); > > void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm); > void mtk_vcodec_enc_clock_off(struct mtk_vcodec_pm *pm); > diff --git a/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c b/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > index 11abb19..8267a9c 100644 > --- a/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > +++ b/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > @@ -367,7 +367,7 @@ static int vp8_enc_encode(void *handle, > > mtk_vcodec_debug_enter(inst); > > - enable_irq(ctx->dev->enc_lt_irq); > + enable_irq(ctx->dev->enc_irq); > > switch (opt) { > case VENC_START_OPT_ENCODE_FRAME: > @@ -386,7 +386,7 @@ static int vp8_enc_encode(void *handle, > > encode_err: > > - disable_irq(ctx->dev->enc_lt_irq); > + disable_irq(ctx->dev->enc_irq); > mtk_vcodec_debug_leave(inst); > > return ret; _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel 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 X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 876ACC433E1 for ; Wed, 10 Jun 2020 05:45:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5069F207F9 for ; Wed, 10 Jun 2020 05:45:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="Iz9KbwUQ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725988AbgFJFp0 (ORCPT ); Wed, 10 Jun 2020 01:45:26 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:11679 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1725270AbgFJFpZ (ORCPT ); Wed, 10 Jun 2020 01:45:25 -0400 X-UUID: c89d0f18aa2f42fca33912e2213fa0e2-20200610 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=eZeaCZigg3GkXMWmssrDhkhnVabWFGgwfU7U4dmrbIc=; b=Iz9KbwUQwqGo0Y0IF3teZAVMKSX9FSt3HRsBMNgJQD3zF2vBJRuUVyoD6wdSg8yhnrnKeCIpVAYcrOIzL1Yq8KRVNHz24ewJoDqtY9vJbzgqRCXQ6w4iEskFhAwSquZXM44zEfJv59Sqc+9U0EdID/P82x0AiGFk++Jfv5hhf3g=; X-UUID: c89d0f18aa2f42fca33912e2213fa0e2-20200610 Received: from mtkcas11.mediatek.inc [(172.21.101.40)] by mailgw02.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 109392018; Wed, 10 Jun 2020 13:45:13 +0800 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n1.mediatek.inc (172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 10 Jun 2020 13:45:10 +0800 Received: from [172.21.77.4] (172.21.77.4) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 10 Jun 2020 13:45:10 +0800 Message-ID: <1591767911.527.5.camel@mtksdaap41> Subject: Re: [PATCH v4 08/17] media: mtk-vcodec: separate mtk-vcodec-enc node. From: CK Hu To: Yong Wu , Tiffany Lin , Maoguang Meng CC: Matthias Brugger , Joerg Roedel , Rob Herring , Maoguang Meng , Will Deacon , , Irui Wang , "Nicolas Boichat" , Evan Green , , Matthias Kaehlcke , , , , Tomasz Figa , , Hsin-Yi Wang , , , , , , , , Robin Murphy Date: Wed, 10 Jun 2020 13:45:11 +0800 In-Reply-To: <1590826218-23653-9-git-send-email-yong.wu@mediatek.com> References: <1590826218-23653-1-git-send-email-yong.wu@mediatek.com> <1590826218-23653-9-git-send-email-yong.wu@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N Content-Transfer-Encoding: base64 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org KyBUaWZmYW55ICYgTWFvZ3VhbmcuDQoNCg0KT24gU2F0LCAyMDIwLTA1LTMwIGF0IDE2OjEwICsw ODAwLCBZb25nIFd1IHdyb3RlOg0KPiBGcm9tOiBNYW9ndWFuZyBNZW5nIDxtYW9ndWFuZy5tZW5n QG1lZGlhdGVrLmNvbT4NCj4gDQo+IE1USyBIMjY0IEVuY29kZXIoVkVOQ19TWVMpIGFuZCBWUDgg RW5jb2RlcihWRU5DX0xUX1NZUykgYXJlIHR3bw0KPiBpbmRlcGVuZGVudCBoYXJkd2FyZSBpbnN0 YW5jZS4gVGhleSBoYXZlIHRoZWlyIG93bmVyIGludGVycnVwdCwNCj4gcmVnaXN0ZXIgbWFwcGlu ZywgYW5kIHNwZWNpYWwgY2xvY2tzLg0KPiANCj4gVGhpcyBwYXRjaCBzZXBlcmF0ZXMgdGhlIHR3 byBpbnN0YW5jZS4gVGhpcyBpcyBhIHByZXBhcmluZyBwYXRjaCBmb3INCj4gYWRkaW5nIGRldmlj ZV9saW5rIGJldHdlZW4gdGhlIGxhcmJzIGFuZCB2ZW5jLWRldmljZS4gSXQncyBtYWlubHkgZm9y DQo+IGZpeGluZyB0aGUgcHJvYmxlbToNCj4gaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMTkvOS8z LzMxNg0KPiANCj4gVXNlciBDYWxsICJWSURJT0NfUVVFUllDQVAiOg0KPiBIMjY0IEVuY29kZXIg cmV0dXJuIGRyaXZlciBuYW1lICJtdGstdmNvZGVjLWVuYyI7DQo+IFZQOCBFbmNvZGVyIHJldHVy biBkcml2ZXIgbmFtZSAibXRrLXZlbmMtdnA4Lg0KPiANCj4gU2lnbmVkLW9mZi1ieTogTWFvZ3Vh bmcgTWVuZyA8bWFvZ3VhbmcubWVuZ0BtZWRpYXRlay5jb20+DQo+IFNpZ25lZC1vZmYtYnk6IEhz aW4tWWkgV2FuZyA8aHNpbnlpQGNocm9taXVtLm9yZz4NCj4gU2lnbmVkLW9mZi1ieTogSXJ1aSBX YW5nIDxpcnVpLndhbmdAbWVkaWF0ZWsuY29tPg0KPiAtLS0NCj4gIGRyaXZlcnMvbWVkaWEvcGxh dGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Rydi5oIHwgIDEwICstDQo+ICBkcml2ZXJzL21l ZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmMuYyB8ICAyMyArKystDQo+ICAu Li4vbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuY19kcnYuYyB8IDEyNyAr KysrKysrKystLS0tLS0tLS0tLS0NCj4gIC4uLi9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210 a192Y29kZWNfZW5jX3BtLmMgIHwgIDMxICstLS0tDQo+ICAuLi4vbWVkaWEvcGxhdGZvcm0vbXRr LXZjb2RlYy9tdGtfdmNvZGVjX2VuY19wbS5oICB8ICAgMSAtDQo+ICAuLi4vbWVkaWEvcGxhdGZv cm0vbXRrLXZjb2RlYy92ZW5jL3ZlbmNfdnA4X2lmLmMgICB8ICAgNCArLQ0KPiAgNiBmaWxlcyBj aGFuZ2VkLCA4MCBpbnNlcnRpb25zKCspLCAxMTYgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2Lmgg Yi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19kcnYuaA0KPiBp bmRleCBhMjcxNjExNy4uNTJkMWNlMSAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2LmgNCj4gKysrIGIvZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2LmgNCj4gQEAgLTE5LDYgKzE5LDcgQEAN Cj4gICNkZWZpbmUgTVRLX1ZDT0RFQ19EUlZfTkFNRQkibXRrX3Zjb2RlY19kcnYiDQo+ICAjZGVm aW5lIE1US19WQ09ERUNfREVDX05BTUUJIm10ay12Y29kZWMtZGVjIg0KPiAgI2RlZmluZSBNVEtf VkNPREVDX0VOQ19OQU1FCSJtdGstdmNvZGVjLWVuYyINCj4gKyNkZWZpbmUgTVRLX1ZFTkNfVlA4 X05BTUUJIm10ay12ZW5jLXZwOCINCj4gICNkZWZpbmUgTVRLX1BMQVRGT1JNX1NUUgkicGxhdGZv cm06bXQ4MTczIg0KPiAgDQo+ICAjZGVmaW5lIE1US19WQ09ERUNfTUFYX1BMQU5FUwkzDQo+IEBA IC0xOTMsNyArMTk0LDYgQEAgc3RydWN0IG10a192Y29kZWNfcG0gew0KPiAgDQo+ICAJc3RydWN0 IG10a192Y29kZWNfY2xrCXZlbmNfY2xrOw0KPiAgCXN0cnVjdCBkZXZpY2UJKmxhcmJ2ZW5jOw0K PiAtCXN0cnVjdCBkZXZpY2UJKmxhcmJ2ZW5jbHQ7DQo+ICAJc3RydWN0IGRldmljZQkqZGV2Ow0K PiAgCXN0cnVjdCBtdGtfdmNvZGVjX2RldgkqbXRrZGV2Ow0KPiAgfTsNCj4gQEAgLTMxMSwyNSAr MzExLDI3IEBAIGVudW0gbXRrX2NoaXAgew0KPiAgICogQGNoaXA6IGNoaXAgdGhpcyBlbmNvZGVy IGlzIGNvbXBhdGlibGUgd2l0aA0KPiAgICoNCj4gICAqIEB1c2VzX2V4dDogd2hldGhlciB0aGUg ZW5jb2RlciB1c2VzIHRoZSBleHRlbmRlZCBmaXJtd2FyZSBtZXNzYWdpbmcgZm9ybWF0DQo+IC0g KiBAaGFzX2x0X2lycTogd2hldGhlciB0aGUgZW5jb2RlciB1c2VzIHRoZSBMVCBpcnENCj4gKyAq IEBuYW1lOiB3aGV0aGVyIHRoZSBlbmNvZGVyIGNvcmUgaXMgdnA4DQo+ICAgKiBAbWluX2JpcmF0 ZTogbWluaW11bSBzdXBwb3J0ZWQgZW5jb2RpbmcgYml0cmF0ZQ0KPiAgICogQG1heF9iaXRyYXRl OiBtYXhpbXVtIHN1cHBvcnRlZCBlbmNvZGluZyBiaXRyYXRlDQo+ICAgKiBAY2FwdHVyZV9mb3Jt YXRzOiBhcnJheSBvZiBzdXBwb3J0ZWQgY2FwdHVyZSBmb3JtYXRzDQo+ICAgKiBAbnVtX2NhcHR1 cmVfZm9ybWF0czogbnVtYmVyIG9mIGVudHJpZXMgaW4gY2FwdHVyZV9mb3JtYXRzDQo+ICAgKiBA b3V0cHV0X2Zvcm1hdHM6IGFycmF5IG9mIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0cw0KPiAgICog QG51bV9vdXRwdXRfZm9ybWF0czogbnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0X2Zvcm1hdHMN Cj4gKyAqIEBjb3JlX2lkOiBzdGFuZCBmb3IgaDI2NCBvciB2cDggZW5jb2RlIGluZGV4DQo+ICAg Ki8NCj4gIHN0cnVjdCBtdGtfdmNvZGVjX2VuY19wZGF0YSB7DQo+ICAJZW51bSBtdGtfY2hpcCBj aGlwOw0KPiAgDQo+ICAJYm9vbCB1c2VzX2V4dDsNCj4gLQlib29sIGhhc19sdF9pcnE7DQo+ICsJ Y29uc3QgY2hhciAqbmFtZTsNCj4gIAl1bnNpZ25lZCBsb25nIG1pbl9iaXRyYXRlOw0KPiAgCXVu c2lnbmVkIGxvbmcgbWF4X2JpdHJhdGU7DQo+ICAJY29uc3Qgc3RydWN0IG10a192aWRlb19mbXQg KmNhcHR1cmVfZm9ybWF0czsNCj4gIAlzaXplX3QgbnVtX2NhcHR1cmVfZm9ybWF0czsNCj4gIAlj b25zdCBzdHJ1Y3QgbXRrX3ZpZGVvX2ZtdCAqb3V0cHV0X2Zvcm1hdHM7DQo+ICAJc2l6ZV90IG51 bV9vdXRwdXRfZm9ybWF0czsNCj4gKwlpbnQgY29yZV9pZDsNCj4gIH07DQo+ICANCj4gIC8qKg0K PiBAQCAtMzU5LDcgKzM2MSw2IEBAIHN0cnVjdCBtdGtfdmNvZGVjX2VuY19wZGF0YSB7DQo+ICAg Kg0KPiAgICogQGRlY19pcnE6IGRlY29kZXIgaXJxIHJlc291cmNlDQo+ICAgKiBAZW5jX2lycTog aDI2NCBlbmNvZGVyIGlycSByZXNvdXJjZQ0KPiAtICogQGVuY19sdF9pcnE6IHZwOCBlbmNvZGVy IGlycSByZXNvdXJjZQ0KPiAgICoNCj4gICAqIEBkZWNfbXV0ZXg6IGRlY29kZXIgaGFyZHdhcmUg bG9jaw0KPiAgICogQGVuY19tdXRleDogZW5jb2RlciBoYXJkd2FyZSBsb2NrLg0KPiBAQCAtMzk1 LDcgKzM5Niw2IEBAIHN0cnVjdCBtdGtfdmNvZGVjX2RldiB7DQo+ICANCj4gIAlpbnQgZGVjX2ly cTsNCj4gIAlpbnQgZW5jX2lycTsNCj4gLQlpbnQgZW5jX2x0X2lycTsNCj4gIA0KPiAgCXN0cnVj dCBtdXRleCBkZWNfbXV0ZXg7DQo+ICAJc3RydWN0IG11dGV4IGVuY19tdXRleDsNCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuYy5j IGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jLmMNCj4g aW5kZXggZjBhZjc4Zi4uNTMwMWRjYSAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jLmMNCj4gKysrIGIvZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jLmMNCj4gQEAgLTksNiArOSw3IEBADQo+ ICAjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZW0ybWVtLmg+DQo+ICAjaW5jbHVkZSA8bWVkaWEvdmlk ZW9idWYyLWRtYS1jb250aWcuaD4NCj4gICNpbmNsdWRlIDxzb2MvbWVkaWF0ZWsvc21pLmg+DQo+ ICsjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPg0KPiAgDQo+ICAjaW5jbHVkZSAibXRrX3Zj b2RlY19kcnYuaCINCj4gICNpbmNsdWRlICJtdGtfdmNvZGVjX2VuYy5oIg0KPiBAQCAtMTc0LDcg KzE3NSwxMCBAQCBzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfb3V0KHN0cnVjdCBmaWxl ICpmaWxlLCB2b2lkICpwcml2LA0KPiAgc3RhdGljIGludCB2aWRpb2NfdmVuY19xdWVyeWNhcChz dHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwNCj4gIAkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmls aXR5ICpjYXApDQo+ICB7DQo+IC0Jc3Ryc2NweShjYXAtPmRyaXZlciwgTVRLX1ZDT0RFQ19FTkNf TkFNRSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7DQo+ICsJY29uc3Qgc3RydWN0IG10a192Y29kZWNf ZW5jX3BkYXRhICpwZGF0YSA9DQo+ICsJCWZoX3RvX2N0eChwcml2KS0+ZGV2LT52ZW5jX3BkYXRh Ow0KPiArDQo+ICsJc3Ryc2NweShjYXAtPmRyaXZlciwgcGRhdGEtPm5hbWUsIHNpemVvZihjYXAt PmRyaXZlcikpOw0KPiAgCXN0cnNjcHkoY2FwLT5idXNfaW5mbywgTVRLX1BMQVRGT1JNX1NUUiwg c2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsNCj4gIAlzdHJzY3B5KGNhcC0+Y2FyZCwgTVRLX1BMQVRG T1JNX1NUUiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOw0KPiAgDQo+IEBAIC03ODgsNyArNzkyLDcgQEAg c3RhdGljIGludCB2YjJvcHNfdmVuY19zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAq cSwgdW5zaWduZWQgaW50IGNvdW50KQ0KPiAgCSAgKi8NCj4gIAlpZiAoKGN0eC0+c3RhdGUgPT0g TVRLX1NUQVRFX0FCT1JUKSB8fCAoY3R4LT5zdGF0ZSA9PSBNVEtfU1RBVEVfRlJFRSkpIHsNCj4g IAkJcmV0ID0gLUVJTzsNCj4gLQkJZ290byBlcnJfc2V0X3BhcmFtOw0KPiArCQlnb3RvIGVycl9z dGFydF9zdHJlYW07DQo+ICAJfQ0KPiAgDQo+ICAJLyogRG8gdGhlIGluaXRpYWxpemF0aW9uIHdo ZW4gYm90aCBzdGFydF9zdHJlYW1pbmcgaGF2ZSBiZWVuIGNhbGxlZCAqLw0KPiBAQCAtODAwLDYg KzgwNCwxMiBAQCBzdGF0aWMgaW50IHZiMm9wc192ZW5jX3N0YXJ0X3N0cmVhbWluZyhzdHJ1Y3Qg dmIyX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgY291bnQpDQo+ICAJCQlyZXR1cm4gMDsNCj4gIAl9 DQo+ICANCj4gKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZjdHgtPmRldi0+cGxhdF9kZXYt PmRldik7DQo+ICsJaWYgKHJldCA8IDApIHsNCj4gKwkJbXRrX3Y0bDJfZXJyKCJwbV9ydW50aW1l X2dldF9zeW5jIGZhaWwgJWQiLCByZXQpOw0KPiArCQlnb3RvIGVycl9zdGFydF9zdHJlYW07DQo+ ICsJfQ0KPiArDQo+ICAJbXRrX3ZlbmNfc2V0X3BhcmFtKGN0eCwgJnBhcmFtKTsNCj4gIAlyZXQg PSB2ZW5jX2lmX3NldF9wYXJhbShjdHgsIFZFTkNfU0VUX1BBUkFNX0VOQywgJnBhcmFtKTsNCj4g IAlpZiAocmV0KSB7DQo+IEBAIC04MjYsNiArODM2LDExIEBAIHN0YXRpYyBpbnQgdmIyb3BzX3Zl bmNfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCBjb3Vu dCkNCj4gIAlyZXR1cm4gMDsNCj4gIA0KPiAgZXJyX3NldF9wYXJhbToNCj4gKwlyZXQgPSBwbV9y dW50aW1lX3B1dCgmY3R4LT5kZXYtPnBsYXRfZGV2LT5kZXYpOw0KPiArCWlmIChyZXQgPCAwKQ0K PiArCQltdGtfdjRsMl9lcnIoInBtX3J1bnRpbWVfcHV0IGZhaWwgJWQiLCByZXQpOw0KPiArDQo+ ICtlcnJfc3RhcnRfc3RyZWFtOg0KPiAgCWZvciAoaSA9IDA7IGkgPCBxLT5udW1fYnVmZmVyczsg KytpKSB7DQo+ICAJCXN0cnVjdCB2YjJfYnVmZmVyICpidWYgPSB2YjJfZ2V0X2J1ZmZlcihxLCBp KTsNCj4gIA0KPiBAQCAtODc5LDYgKzg5NCwxMCBAQCBzdGF0aWMgdm9pZCB2YjJvcHNfdmVuY19z dG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQ0KPiAgCWlmIChyZXQpDQo+ICAJCW10 a192NGwyX2VycigidmVuY19pZl9kZWluaXQgZmFpbGVkPSVkIiwgcmV0KTsNCj4gIA0KPiArCXJl dCA9IHBtX3J1bnRpbWVfcHV0KCZjdHgtPmRldi0+cGxhdF9kZXYtPmRldik7DQo+ICsJaWYgKHJl dCA8IDApDQo+ICsJCW10a192NGwyX2VycigicG1fcnVudGltZV9wdXQgZmFpbCAlZCIsIHJldCk7 DQo+ICsNCj4gIAljdHgtPnN0YXRlID0gTVRLX1NUQVRFX0ZSRUU7DQo+ICB9DQo+ICANCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Vu Y19kcnYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Vu Y19kcnYuYw0KPiBpbmRleCBiOGZlNDA4Li5mZTE3ZjBjIDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJz L21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfZHJ2LmMNCj4gKysrIGIv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jDQo+ IEBAIC00OSwxMiArNDksMTUgQEANCj4gIAl9LA0KPiAgfTsNCj4gIA0KPiAtc3RhdGljIGNvbnN0 IHN0cnVjdCBtdGtfdmlkZW9fZm10IG10a192aWRlb19mb3JtYXRzX2NhcHR1cmVfbXQ4MTczW10g PSAgew0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfdmlkZW9fZm10IG10a192aWRlb19mb3Jt YXRzX2NhcHR1cmVfbXQ4MTczX2gyNjRbXSA9ICB7DQo+ICAJew0KPiAgCQkuZm91cmNjID0gVjRM Ml9QSVhfRk1UX0gyNjQsDQo+ICAJCS50eXBlID0gTVRLX0ZNVF9FTkMsDQo+ICAJCS5udW1fcGxh bmVzID0gMSwNCj4gIAl9LA0KPiArfTsNCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtf dmlkZW9fZm10IG10a192aWRlb19mb3JtYXRzX2NhcHR1cmVfbXQ4MTczX3ZwOFtdID0gIHsNCj4g IAl7DQo+ICAJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfVlA4LA0KPiAgCQkudHlwZSA9IE1US19G TVRfRU5DLA0KPiBAQCAtMTEwLDM1ICsxMTMsMTMgQEAgc3RhdGljIGlycXJldHVybl90IG10a192 Y29kZWNfZW5jX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXYpDQo+ICAJY3R4ID0gZGV2 LT5jdXJyX2N0eDsNCj4gIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZs YWdzKTsNCj4gIA0KPiAtCW10a192NGwyX2RlYnVnKDEsICJpZD0lZCIsIGN0eC0+aWQpOw0KPiAt CWFkZHIgPSBkZXYtPnJlZ19iYXNlW1ZFTkNfU1lTXSArIE1US19WRU5DX0lSUV9BQ0tfT0ZGU0VU Ow0KPiAtDQo+IC0JY3R4LT5pcnFfc3RhdHVzID0gcmVhZGwoZGV2LT5yZWdfYmFzZVtWRU5DX1NZ U10gKw0KPiAtCQkJCShNVEtfVkVOQ19JUlFfU1RBVFVTX09GRlNFVCkpOw0KPiAtDQo+IC0JY2xl YW5faXJxX3N0YXR1cyhjdHgtPmlycV9zdGF0dXMsIGFkZHIpOw0KPiAtDQo+IC0Jd2FrZV91cF9j dHgoY3R4LCBNVEtfSU5TVF9JUlFfUkVDRUlWRUQpOw0KPiAtCXJldHVybiBJUlFfSEFORExFRDsN Cj4gLX0NCj4gLQ0KPiAtc3RhdGljIGlycXJldHVybl90IG10a192Y29kZWNfZW5jX2x0X2lycV9o YW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXYpDQo+IC17DQo+IC0Jc3RydWN0IG10a192Y29kZWNf ZGV2ICpkZXYgPSBwcml2Ow0KPiAtCXN0cnVjdCBtdGtfdmNvZGVjX2N0eCAqY3R4Ow0KPiAtCXVu c2lnbmVkIGxvbmcgZmxhZ3M7DQo+IC0Jdm9pZCBfX2lvbWVtICphZGRyOw0KPiAtDQo+IC0Jc3Bp bl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOw0KPiAtCWN0eCA9IGRldi0+Y3Vy cl9jdHg7DQo+IC0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7 DQo+ICsJbXRrX3Y0bDJfZGVidWcoMSwgImlkPSVkIGNvcmVpZDolZCIsIGN0eC0+aWQsIGRldi0+ dmVuY19wZGF0YS0+Y29yZV9pZCk7DQo+ICsJYWRkciA9IGRldi0+cmVnX2Jhc2VbZGV2LT52ZW5j X3BkYXRhLT5jb3JlX2lkXSArDQo+ICsJCQkJTVRLX1ZFTkNfSVJRX0FDS19PRkZTRVQ7DQo+ICAN Cj4gLQltdGtfdjRsMl9kZWJ1ZygxLCAiaWQ9JWQiLCBjdHgtPmlkKTsNCj4gLQljdHgtPmlycV9z dGF0dXMgPSByZWFkbChkZXYtPnJlZ19iYXNlW1ZFTkNfTFRfU1lTXSArDQo+ICsJY3R4LT5pcnFf c3RhdHVzID0gcmVhZGwoZGV2LT5yZWdfYmFzZVtkZXYtPnZlbmNfcGRhdGEtPmNvcmVfaWRdICsN Cj4gIAkJCQkoTVRLX1ZFTkNfSVJRX1NUQVRVU19PRkZTRVQpKTsNCj4gIA0KPiAtCWFkZHIgPSBk ZXYtPnJlZ19iYXNlW1ZFTkNfTFRfU1lTXSArIE1US19WRU5DX0lSUV9BQ0tfT0ZGU0VUOw0KPiAt DQo+ICAJY2xlYW5faXJxX3N0YXR1cyhjdHgtPmlycV9zdGF0dXMsIGFkZHIpOw0KPiAgDQo+ICAJ d2FrZV91cF9jdHgoY3R4LCBNVEtfSU5TVF9JUlFfUkVDRUlWRUQpOw0KPiBAQCAtMjY1LDcgKzI0 Niw4IEBAIHN0YXRpYyBpbnQgbXRrX3Zjb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl ICpwZGV2KQ0KPiAgCXN0cnVjdCByZXNvdXJjZSAqcmVzOw0KPiAgCXBoYW5kbGUgcnByb2NfcGhh bmRsZTsNCj4gIAllbnVtIG10a192Y29kZWNfZndfdHlwZSBmd190eXBlOw0KPiAtCWludCBpLCBq LCByZXQ7DQo+ICsJaW50IHJldDsNCj4gKwl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOw0KPiAgDQo+ ICAJZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGV2KSwgR0ZQX0tFUk5F TCk7DQo+ICAJaWYgKCFkZXYpDQo+IEBAIC0yOTEsNjMgKzI3MywzOSBAQCBzdGF0aWMgaW50IG10 a192Y29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gIAlkZXYtPnZl bmNfcGRhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7DQo+ICAJcmV0 ID0gbXRrX3Zjb2RlY19pbml0X2VuY19wbShkZXYpOw0KPiAgCWlmIChyZXQgPCAwKSB7DQo+IC0J CWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgbXQgdmNvZGVjIGNsb2NrIHNvdXJj ZSEiKTsNCj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBtdGsgdmNvZGVj IGNsb2NrIHNvdXJjZSEiKTsNCj4gIAkJZ290byBlcnJfZW5jX3BtOw0KPiAgCX0NCj4gIA0KPiAt CWZvciAoaSA9IFZFTkNfU1lTLCBqID0gMDsgaSA8IE5VTV9NQVhfVkNPREVDX1JFR19CQVNFOyBp KyssIGorKykgew0KPiAtCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNP VVJDRV9NRU0sIGopOw0KPiAtCQlkZXYtPnJlZ19iYXNlW2ldID0gZGV2bV9pb3JlbWFwX3Jlc291 cmNlKCZwZGV2LT5kZXYsIHJlcyk7DQo+IC0JCWlmIChJU19FUlIoKF9fZm9yY2Ugdm9pZCAqKWRl di0+cmVnX2Jhc2VbaV0pKSB7DQo+IC0JCQlyZXQgPSBQVFJfRVJSKChfX2ZvcmNlIHZvaWQgKilk ZXYtPnJlZ19iYXNlW2ldKTsNCj4gLQkJCWdvdG8gZXJyX3JlczsNCj4gLQkJfQ0KPiAtCQltdGtf djRsMl9kZWJ1ZygyLCAicmVnWyVkXSBiYXNlPTB4JXAiLCBpLCBkZXYtPnJlZ19iYXNlW2ldKTsN Cj4gLQl9DQo+ICsJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7DQo+ICsNCj4gKwlzbnBy aW50ZihkZXYtPnY0bDJfZGV2Lm5hbWUsIHNpemVvZihkZXYtPnY0bDJfZGV2Lm5hbWUpLCAiJXMi LA0KPiArCQkgZGV2LT52ZW5jX3BkYXRhLT5uYW1lKTsNCj4gIA0KPiAtCXJlcyA9IHBsYXRmb3Jt X2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7DQo+IC0JaWYgKHJlcyA9PSBO VUxMKSB7DQo+IC0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaXJxIHJlc291 cmNlIik7DQo+IC0JCXJldCA9IC1FTk9FTlQ7DQo+ICsJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291 cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsNCj4gKwlyZWdfYmFzZSA9IGRldm1faW9yZW1h cF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOw0KPiArCWlmIChJU19FUlIoKF9fZm9yY2Ugdm9p ZCAqKXJlZ19iYXNlKSkgew0KPiArCQlyZXQgPSBQVFJfRVJSKChfX2ZvcmNlIHZvaWQgKilyZWdf YmFzZSk7DQo+ICAJCWdvdG8gZXJyX3JlczsNCj4gIAl9DQo+ICsJZGV2LT5yZWdfYmFzZVtkZXYt PnZlbmNfcGRhdGEtPmNvcmVfaWRdID0gcmVnX2Jhc2U7DQo+ICANCj4gIAlkZXYtPmVuY19pcnEg PSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOw0KPiAgCXJldCA9IGRldm1fcmVxdWVzdF9pcnEo JnBkZXYtPmRldiwgZGV2LT5lbmNfaXJxLA0KPiAgCQkJICAgICAgIG10a192Y29kZWNfZW5jX2ly cV9oYW5kbGVyLA0KPiAgCQkJICAgICAgIDAsIHBkZXYtPm5hbWUsIGRldik7DQo+ICAJaWYgKHJl dCkgew0KPiAtCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW5zdGFsbCBkZXYtPmVu Y19pcnEgJWQgKCVkKSIsDQo+IC0JCQlkZXYtPmVuY19pcnEsDQo+IC0JCQlyZXQpOw0KPiArCQlk ZXZfZXJyKCZwZGV2LT5kZXYsDQo+ICsJCQkiRmFpbGVkIHRvIGluc3RhbGwgZGV2LT5lbmNfaXJx ICVkICglZCkgY29yZV9pZDolZCIsDQo+ICsJCQlkZXYtPmVuY19pcnEsIHJldCwgZGV2LT52ZW5j X3BkYXRhLT5jb3JlX2lkKTsNCj4gIAkJcmV0ID0gLUVJTlZBTDsNCj4gIAkJZ290byBlcnJfcmVz Ow0KPiAgCX0NCj4gIAlkaXNhYmxlX2lycShkZXYtPmVuY19pcnEpOw0KPiAgDQo+IC0JaWYgKGRl di0+dmVuY19wZGF0YS0+aGFzX2x0X2lycSkgew0KPiAtCQlkZXYtPmVuY19sdF9pcnEgPSBwbGF0 Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOw0KPiAtCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2 LT5kZXYsDQo+IC0JCQkJICAgICAgIGRldi0+ZW5jX2x0X2lycSwNCj4gLQkJCQkgICAgICAgbXRr X3Zjb2RlY19lbmNfbHRfaXJxX2hhbmRsZXIsDQo+IC0JCQkJICAgICAgIDAsIHBkZXYtPm5hbWUs IGRldik7DQo+IC0JCWlmIChyZXQpIHsNCj4gLQkJCWRldl9lcnIoJnBkZXYtPmRldiwNCj4gLQkJ CQkiRmFpbGVkIHRvIGluc3RhbGwgZGV2LT5lbmNfbHRfaXJxICVkICglZCkiLA0KPiAtCQkJCWRl di0+ZW5jX2x0X2lycSwgcmV0KTsNCj4gLQkJCXJldCA9IC1FSU5WQUw7DQo+IC0JCQlnb3RvIGVy cl9yZXM7DQo+IC0JCX0NCj4gLQkJZGlzYWJsZV9pcnEoZGV2LT5lbmNfbHRfaXJxKTsgLyogVkVO Q19MVCAqLw0KPiAtCX0NCj4gLQ0KPiAgCW11dGV4X2luaXQoJmRldi0+ZW5jX211dGV4KTsNCj4g IAltdXRleF9pbml0KCZkZXYtPmRldl9tdXRleCk7DQo+ICAJc3Bpbl9sb2NrX2luaXQoJmRldi0+ aXJxbG9jayk7DQo+IC0NCj4gLQlzbnByaW50ZihkZXYtPnY0bDJfZGV2Lm5hbWUsIHNpemVvZihk ZXYtPnY0bDJfZGV2Lm5hbWUpLCAiJXMiLA0KPiAtCQkgIltNVEtfVjRMMl9WRU5DXSIpOw0KPiAt DQo+ICAJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmRldi0+djRsMl9k ZXYpOw0KPiAgCWlmIChyZXQpIHsNCj4gIAkJbXRrX3Y0bDJfZXJyKCJ2NGwyX2RldmljZV9yZWdp c3RlciBlcnI9JWQiLCByZXQpOw0KPiBAQCAtMzczLDcgKzMzMSw3IEBAIHN0YXRpYyBpbnQgbXRr X3Zjb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KPiAgCQkJCQlWNEwy X0NBUF9TVFJFQU1JTkc7DQo+ICANCj4gIAlzbnByaW50Zih2ZmRfZW5jLT5uYW1lLCBzaXplb2Yo dmZkX2VuYy0+bmFtZSksICIlcyIsDQo+IC0JCSBNVEtfVkNPREVDX0VOQ19OQU1FKTsNCj4gKwkJ CWRldi0+dmVuY19wZGF0YS0+bmFtZSk7DQo+ICAJdmlkZW9fc2V0X2RydmRhdGEodmZkX2VuYywg ZGV2KTsNCj4gIAlkZXYtPnZmZF9lbmMgPSB2ZmRfZW5jOw0KPiAgCXBsYXRmb3JtX3NldF9kcnZk YXRhKHBkZXYsIGRldik7DQo+IEBAIC00MDEsOCArMzU5LDggQEAgc3RhdGljIGludCBtdGtfdmNv ZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+ICAJCWdvdG8gZXJyX2Vu Y19yZWc7DQo+ICAJfQ0KPiAgDQo+IC0JbXRrX3Y0bDJfZGVidWcoMCwgImVuY29kZXIgcmVnaXN0 ZXJlZCBhcyAvZGV2L3ZpZGVvJWQiLA0KPiAtCQkJdmZkX2VuYy0+bnVtKTsNCj4gKwltdGtfdjRs Ml9kZWJ1ZygwLCAiZW5jb2RlciAlZCByZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZCIsDQo+ICsJ CSAgICAgICBkZXYtPnZlbmNfcGRhdGEtPmNvcmVfaWQsIHZmZF9lbmMtPm51bSk7DQo+ICANCj4g IAlyZXR1cm4gMDsNCj4gIA0KPiBAQCAtNDE1LDI2ICszNzMsMzkgQEAgc3RhdGljIGludCBtdGtf dmNvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+ICBlcnJfZW5jX2Fs bG9jOg0KPiAgCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOw0KPiAgZXJy X3JlczoNCj4gLQltdGtfdmNvZGVjX3JlbGVhc2VfZW5jX3BtKGRldik7DQo+ICsJcG1fcnVudGlt ZV9kaXNhYmxlKCZwZGV2LT5kZXYpOw0KPiAgZXJyX2VuY19wbToNCj4gIAltdGtfdmNvZGVjX2Z3 X3JlbGVhc2UoZGV2LT5md19oYW5kbGVyKTsNCj4gIAlyZXR1cm4gcmV0Ow0KPiAgfQ0KPiAgDQo+ IC1zdGF0aWMgY29uc3Qgc3RydWN0IG10a192Y29kZWNfZW5jX3BkYXRhIG10ODE3M19wZGF0YSA9 IHsNCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX3Zjb2RlY19lbmNfcGRhdGEgbXQ4MTczX2F2 Y19wZGF0YSA9IHsNCj4gKwkuY2hpcCA9IE1US19NVDgxNzMsDQo+ICsJLm5hbWUgPSBNVEtfVkNP REVDX0VOQ19OQU1FLA0KPiArCS5jYXB0dXJlX2Zvcm1hdHMgPSBtdGtfdmlkZW9fZm9ybWF0c19j YXB0dXJlX210ODE3M19oMjY0LA0KPiArCS5udW1fY2FwdHVyZV9mb3JtYXRzID0gMSwNCj4gKwku b3V0cHV0X2Zvcm1hdHMgPSBtdGtfdmlkZW9fZm9ybWF0c19vdXRwdXRfbXQ4MTczLA0KPiArCS5u dW1fb3V0cHV0X2Zvcm1hdHMgPSBBUlJBWV9TSVpFKG10a192aWRlb19mb3JtYXRzX291dHB1dF9t dDgxNzMpLA0KPiArCS5taW5fYml0cmF0ZSA9IDEsDQo+ICsJLm1heF9iaXRyYXRlID0gNDAwMDAw MCwNCj4gKwkuY29yZV9pZCA9IFZFTkNfU1lTLA0KPiArfTsNCj4gKw0KPiArc3RhdGljIGNvbnN0 IHN0cnVjdCBtdGtfdmNvZGVjX2VuY19wZGF0YSBtdDgxNzNfdnA4X3BkYXRhID0gew0KPiAgCS5j aGlwID0gTVRLX01UODE3MywNCj4gLQkuaGFzX2x0X2lycSA9IHRydWUsDQo+IC0JLmNhcHR1cmVf Zm9ybWF0cyA9IG10a192aWRlb19mb3JtYXRzX2NhcHR1cmVfbXQ4MTczLA0KPiAtCS5udW1fY2Fw dHVyZV9mb3JtYXRzID0gQVJSQVlfU0laRShtdGtfdmlkZW9fZm9ybWF0c19jYXB0dXJlX210ODE3 MyksDQo+ICsJLm5hbWUgPSBNVEtfVkVOQ19WUDhfTkFNRSwNCj4gKwkuY2FwdHVyZV9mb3JtYXRz ID0gbXRrX3ZpZGVvX2Zvcm1hdHNfY2FwdHVyZV9tdDgxNzNfdnA4LA0KPiArCS5udW1fY2FwdHVy ZV9mb3JtYXRzID0gMSwNCj4gIAkub3V0cHV0X2Zvcm1hdHMgPSBtdGtfdmlkZW9fZm9ybWF0c19v dXRwdXRfbXQ4MTczLA0KPiAgCS5udW1fb3V0cHV0X2Zvcm1hdHMgPSBBUlJBWV9TSVpFKG10a192 aWRlb19mb3JtYXRzX291dHB1dF9tdDgxNzMpLA0KPiAgCS5taW5fYml0cmF0ZSA9IDEsDQo+ICAJ Lm1heF9iaXRyYXRlID0gNDAwMDAwMCwNCj4gKwkuY29yZV9pZCA9IFZFTkNfTFRfU1lTLA0KPiAg fTsNCj4gIA0KPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfdmNvZGVjX2VuY19wZGF0YSBtdDgx ODNfcGRhdGEgPSB7DQo+ICAJLmNoaXAgPSBNVEtfTVQ4MTgzLA0KPiAtCS5oYXNfbHRfaXJxID0g ZmFsc2UsDQo+ICsJLm5hbWUgPSBNVEtfVkNPREVDX0VOQ19OQU1FLA0KPiAgCS51c2VzX2V4dCA9 IHRydWUsDQo+ICAJLmNhcHR1cmVfZm9ybWF0cyA9IG10a192aWRlb19mb3JtYXRzX2NhcHR1cmVf bXQ4MTgzLA0KPiAgCS5udW1fY2FwdHVyZV9mb3JtYXRzID0gQVJSQVlfU0laRShtdGtfdmlkZW9f Zm9ybWF0c19jYXB0dXJlX210ODE4MyksDQo+IEBAIC00NDMsMTAgKzQxNCwxNCBAQCBzdGF0aWMg aW50IG10a192Y29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gIAku bnVtX291dHB1dF9mb3JtYXRzID0gQVJSQVlfU0laRShtdGtfdmlkZW9fZm9ybWF0c19vdXRwdXRf bXQ4MTczKSwNCj4gIAkubWluX2JpdHJhdGUgPSA2NCwNCj4gIAkubWF4X2JpdHJhdGUgPSA0MDAw MDAwMCwNCj4gKwkuY29yZV9pZCA9IFZFTkNfU1lTLA0KPiAgfTsNCj4gIA0KPiAgc3RhdGljIGNv bnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXRrX3Zjb2RlY19lbmNfbWF0Y2hbXSA9IHsNCj4gLQl7 LmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTczLXZjb2RlYy1lbmMiLCAuZGF0YSA9ICZtdDgx NzNfcGRhdGF9LA0KPiArCXsuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxNzMtdmNvZGVjLWF2 Yy1lbmMiLA0KPiArCQkJLmRhdGEgPSAmbXQ4MTczX2F2Y19wZGF0YX0sDQo+ICsJey5jb21wYXRp YmxlID0gIm1lZGlhdGVrLG10ODE3My12Y29kZWMtdnA4LWVuYyIsDQo+ICsJCQkuZGF0YSA9ICZt dDgxNzNfdnA4X3BkYXRhfSwNCj4gIAl7LmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTgzLXZj b2RlYy1lbmMiLCAuZGF0YSA9ICZtdDgxODNfcGRhdGF9LA0KPiAgCXt9LA0KPiAgfTsNCj4gQEAg LTQ2Niw3ICs0NDEsNyBAQCBzdGF0aWMgaW50IG10a192Y29kZWNfZW5jX3JlbW92ZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KPiAgCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYt PnZmZF9lbmMpOw0KPiAgDQo+ICAJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rl dik7DQo+IC0JbXRrX3Zjb2RlY19yZWxlYXNlX2VuY19wbShkZXYpOw0KPiArCXBtX3J1bnRpbWVf ZGlzYWJsZSgmcGRldi0+ZGV2KTsNCj4gIAltdGtfdmNvZGVjX2Z3X3JlbGVhc2UoZGV2LT5md19o YW5kbGVyKTsNCj4gIAlyZXR1cm4gMDsNCj4gIH0NCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVk aWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuY19wbS5jIGIvZHJpdmVycy9tZWRp YS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX3BtLmMNCj4gaW5kZXggZWUyMjkw Mi4uMDFjNmE1NSAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNv ZGVjL210a192Y29kZWNfZW5jX3BtLmMNCj4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9t dGstdmNvZGVjL210a192Y29kZWNfZW5jX3BtLmMNCj4gQEAgLTQzLDIxICs0Myw2IEBAIGludCBt dGtfdmNvZGVjX2luaXRfZW5jX3BtKHN0cnVjdCBtdGtfdmNvZGVjX2RldiAqbXRrZGV2KQ0KPiAg CQlyZXR1cm4gLUVOT0RFVjsNCj4gIAl9DQo+ICAJcG0tPmxhcmJ2ZW5jID0gJnBkZXYtPmRldjsN Cj4gLQ0KPiAtCW5vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgIm1lZGlhdGVr LGxhcmIiLCAxKTsNCj4gLQlpZiAoIW5vZGUpIHsNCj4gLQkJbXRrX3Y0bDJfZXJyKCJubyBtZWRp YXRlayxsYXJiIGZvdW5kIik7DQo+IC0JCXJldHVybiAtRU5PREVWOw0KPiAtCX0NCj4gLQ0KPiAt CXBkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5vZGUpOw0KPiAtCW9mX25vZGVfcHV0KG5v ZGUpOw0KPiAtCWlmICghcGRldikgew0KPiAtCQltdGtfdjRsMl9lcnIoIm5vIG1lZGlhdGVrLGxh cmIgZGV2aWNlIGZvdW5kIik7DQo+IC0JCXJldHVybiAtRU5PREVWOw0KPiAtCX0NCj4gLQ0KPiAt CXBtLT5sYXJidmVuY2x0ID0gJnBkZXYtPmRldjsNCj4gIAlwZGV2ID0gbXRrZGV2LT5wbGF0X2Rl djsNCj4gIAlwbS0+ZGV2ID0gJnBkZXYtPmRldjsNCj4gIA0KPiBAQCAtOTQsMTEgKzc5LDYgQEAg aW50IG10a192Y29kZWNfaW5pdF9lbmNfcG0oc3RydWN0IG10a192Y29kZWNfZGV2ICptdGtkZXYp DQo+ICAJcmV0dXJuIHJldDsNCj4gIH0NCj4gIA0KPiAtdm9pZCBtdGtfdmNvZGVjX3JlbGVhc2Vf ZW5jX3BtKHN0cnVjdCBtdGtfdmNvZGVjX2RldiAqbXRrZGV2KQ0KPiAtew0KPiAtfQ0KPiAtDQo+ IC0NCj4gIHZvaWQgbXRrX3Zjb2RlY19lbmNfY2xvY2tfb24oc3RydWN0IG10a192Y29kZWNfcG0g KnBtKQ0KPiAgew0KPiAgCXN0cnVjdCBtdGtfdmNvZGVjX2NsayAqZW5jX2NsayA9ICZwbS0+dmVu Y19jbGs7DQo+IEBAIC0xMTYsMTggKzk2LDEwIEBAIHZvaWQgbXRrX3Zjb2RlY19lbmNfY2xvY2tf b24oc3RydWN0IG10a192Y29kZWNfcG0gKnBtKQ0KPiAgCXJldCA9IG10a19zbWlfbGFyYl9nZXQo cG0tPmxhcmJ2ZW5jKTsNCj4gIAlpZiAocmV0KSB7DQo+ICAJCW10a192NGwyX2VycigibXRrX3Nt aV9sYXJiX2dldCBsYXJiMyBmYWlsICVkIiwgcmV0KTsNCj4gLQkJZ290byBsYXJidmVuY2VycjsN Cj4gLQl9DQo+IC0JcmV0ID0gbXRrX3NtaV9sYXJiX2dldChwbS0+bGFyYnZlbmNsdCk7DQo+IC0J aWYgKHJldCkgew0KPiAtCQltdGtfdjRsMl9lcnIoIm10a19zbWlfbGFyYl9nZXQgbGFyYjQgZmFp bCAlZCIsIHJldCk7DQo+IC0JCWdvdG8gbGFyYnZlbmNsdGVycjsNCj4gKwkJZ290byBjbGtlcnI7 DQo+ICAJfQ0KPiAgCXJldHVybjsNCj4gIA0KPiAtbGFyYnZlbmNsdGVycjoNCj4gLQltdGtfc21p X2xhcmJfcHV0KHBtLT5sYXJidmVuYyk7DQo+IC1sYXJidmVuY2VycjoNCj4gIGNsa2VycjoNCj4g IAlmb3IgKGkgLT0gMTsgaSA+PSAwOyBpLS0pDQo+ICAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShl bmNfY2xrLT5jbGtfaW5mb1tpXS52Y29kZWNfY2xrKTsNCj4gQEAgLTEzOSw3ICsxMTEsNiBAQCB2 b2lkIG10a192Y29kZWNfZW5jX2Nsb2NrX29mZihzdHJ1Y3QgbXRrX3Zjb2RlY19wbSAqcG0pDQo+ ICAJaW50IGkgPSAwOw0KPiAgDQo+ICAJbXRrX3NtaV9sYXJiX3B1dChwbS0+bGFyYnZlbmMpOw0K PiAtCW10a19zbWlfbGFyYl9wdXQocG0tPmxhcmJ2ZW5jbHQpOw0KPiAgCWZvciAoaSA9IGVuY19j bGstPmNsa19udW0gLSAxOyBpID49IDA7IGktLSkNCj4gIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJl KGVuY19jbGstPmNsa19pbmZvW2ldLnZjb2RlY19jbGspOw0KPiAgfQ0KPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX3BtLmggYi9k cml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfcG0uaA0KPiBp bmRleCBiN2VjZGZkLi5jMWI1OTg2IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRm b3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfcG0uaA0KPiArKysgYi9kcml2ZXJzL21lZGlh L3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfcG0uaA0KPiBAQCAtMTAsNyArMTAs NiBAQA0KPiAgI2luY2x1ZGUgIm10a192Y29kZWNfZHJ2LmgiDQo+ICANCj4gIGludCBtdGtfdmNv ZGVjX2luaXRfZW5jX3BtKHN0cnVjdCBtdGtfdmNvZGVjX2RldiAqZGV2KTsNCj4gLXZvaWQgbXRr X3Zjb2RlY19yZWxlYXNlX2VuY19wbShzdHJ1Y3QgbXRrX3Zjb2RlY19kZXYgKmRldik7DQo+ICAN Cj4gIHZvaWQgbXRrX3Zjb2RlY19lbmNfY2xvY2tfb24oc3RydWN0IG10a192Y29kZWNfcG0gKnBt KTsNCj4gIHZvaWQgbXRrX3Zjb2RlY19lbmNfY2xvY2tfb2ZmKHN0cnVjdCBtdGtfdmNvZGVjX3Bt ICpwbSk7DQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMv dmVuYy92ZW5jX3ZwOF9pZi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3Zl bmMvdmVuY192cDhfaWYuYw0KPiBpbmRleCAxMWFiYjE5Li44MjY3YTljIDEwMDY0NA0KPiAtLS0g YS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX3ZwOF9pZi5jDQo+ ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jL3ZlbmNfdnA4X2lm LmMNCj4gQEAgLTM2Nyw3ICszNjcsNyBAQCBzdGF0aWMgaW50IHZwOF9lbmNfZW5jb2RlKHZvaWQg KmhhbmRsZSwNCj4gIA0KPiAgCW10a192Y29kZWNfZGVidWdfZW50ZXIoaW5zdCk7DQo+ICANCj4g LQllbmFibGVfaXJxKGN0eC0+ZGV2LT5lbmNfbHRfaXJxKTsNCj4gKwllbmFibGVfaXJxKGN0eC0+ ZGV2LT5lbmNfaXJxKTsNCj4gIA0KPiAgCXN3aXRjaCAob3B0KSB7DQo+ICAJY2FzZSBWRU5DX1NU QVJUX09QVF9FTkNPREVfRlJBTUU6DQo+IEBAIC0zODYsNyArMzg2LDcgQEAgc3RhdGljIGludCB2 cDhfZW5jX2VuY29kZSh2b2lkICpoYW5kbGUsDQo+ICANCj4gIGVuY29kZV9lcnI6DQo+ICANCj4g LQlkaXNhYmxlX2lycShjdHgtPmRldi0+ZW5jX2x0X2lycSk7DQo+ICsJZGlzYWJsZV9pcnEoY3R4 LT5kZXYtPmVuY19pcnEpOw0KPiAgCW10a192Y29kZWNfZGVidWdfbGVhdmUoaW5zdCk7DQo+ICAN Cj4gIAlyZXR1cm4gcmV0Ow0KDQo=