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=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 AE3D1C433DF for ; Mon, 8 Jun 2020 10:50:04 +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 808BF206C3 for ; Mon, 8 Jun 2020 10:50:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="b1TUpDiR"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="NNphv3hi" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 808BF206C3 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=+EvEZ/iiq+oNkf0LNayCb0+cC74ENfzwDlbymSCsQks=; b=b1TUpDiRt3MVuq tSzE2dYku5A8RNJqDJR4RRpgUMCb/90ItcKTCvYFywyQ4JpkFXuNaKHdxym96TnsACzsLWSvWlAwP VmzAhoVNFJyonnAfMh5U9fwPoIgIH6CUiqxOzyr9Pq91zpI58naiae5+zQaJeLPllWPAEoRNvJc/m rWeqYDlbD+TtRfld+Xusl8mUKpIVMbzJxmHTx1l2jx3IcxNKcIvAwUqyG/L/yKgP6z+k+uNFbWuHd zx+oPnSdWqNDNGEfYeFjtd9MlmfyA/cjCcv3vK+kLgD4EfCsszIs/k/NroQ8Ed3GxXApIebabhonU SlPUzgSPT2H0LsCp57yQ==; 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 1jiFLl-0002L7-38; Mon, 08 Jun 2020 10:49:53 +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 1jiFLg-0002Jc-TX for linux-mediatek@lists.infradead.org; Mon, 08 Jun 2020 10:49:52 +0000 X-UUID: 32775e6a1ad64a9c9a2d04cf9b6f1733-20200608 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=nDTwn3HYUdqhoihw53OorCtFz45EH3thj56ECqplSXA=; b=NNphv3hiYS7YOeaUTrfRc+YLS427m63OhTZ26J3ZQ8Y6QcIEv1ONJ/QYSC69ee8S6KnCVVCAvDQKSwt6ZH0dmA5HLBmGN1M0ogKCtFyQ+t5r7rujs0LrEhSgcikbv1DQ2jhKtlv49M3s+uLBTBCf80TNF5DqINhsMeFZMQGJ2h8=; X-UUID: 32775e6a1ad64a9c9a2d04cf9b6f1733-20200608 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 950099180; Mon, 08 Jun 2020 02:49:38 -0800 Received: from MTKMBS01N1.mediatek.inc (172.21.101.68) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 8 Jun 2020 03:41:30 -0700 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 8 Jun 2020 18:41:16 +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; Mon, 8 Jun 2020 18:41:15 +0800 Message-ID: <1591612878.18435.5.camel@mtksdaap41> Subject: Re: [PATCH 01/10] media: mtk-vcodec: abstract firmware interface From: Tiffany Lin To: Alexandre Courbot Date: Mon, 8 Jun 2020 18:41:18 +0800 In-Reply-To: <1591611416.18435.1.camel@mtksdaap41> References: <20200520082723.96136-1-acourbot@chromium.org> <20200520082723.96136-2-acourbot@chromium.org> <1591611416.18435.1.camel@mtksdaap41> 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-20200608_034948_983287_8E6DB7F1 X-CRM114-Status: GOOD ( 22.87 ) 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: Andrew-CT Chen , Maoguang Meng , Rui Wang , Yunfei Dong , linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, Pi-Hsun Shih , linux-media@vger.kernel.org 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 On Mon, 2020-06-08 at 18:16 +0800, Tiffany Lin wrote: > On Wed, 2020-05-20 at 17:27 +0900, Alexandre Courbot wrote: > > From: Yunfei Dong > > > > MT8183's codec firwmare is run by a different remote processor from > > MT8173. While the firmware interface is basically the same, the way to > > invoke it differs. Abstract all firmware calls under a layer that will > > allow us to handle both firmware types transparently. > > > > Signed-off-by: Yunfei Dong > > [acourbot: refactor, cleanup and split] > > Co-developed-by: Alexandre Courbot > > Signed-off-by: Alexandre Courbot > > [pihsun: fix error path and add mtk_vcodec_fw_release] > > Signed-off-by: Pi-Hsun Shih > > --- > > drivers/media/platform/mtk-vcodec/Makefile | 4 +- > > .../platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 50 ++--- > > .../platform/mtk-vcodec/mtk_vcodec_dec_pm.c | 1 - > > .../platform/mtk-vcodec/mtk_vcodec_drv.h | 5 +- > > .../platform/mtk-vcodec/mtk_vcodec_enc_drv.c | 47 ++--- > > .../platform/mtk-vcodec/mtk_vcodec_enc_pm.c | 2 - > > .../media/platform/mtk-vcodec/mtk_vcodec_fw.c | 172 ++++++++++++++++++ > > .../media/platform/mtk-vcodec/mtk_vcodec_fw.h | 36 ++++ > > .../platform/mtk-vcodec/mtk_vcodec_util.c | 1 - > > .../platform/mtk-vcodec/vdec/vdec_h264_if.c | 1 - > > .../platform/mtk-vcodec/vdec/vdec_vp8_if.c | 1 - > > .../platform/mtk-vcodec/vdec/vdec_vp9_if.c | 1 - > > .../media/platform/mtk-vcodec/vdec_drv_base.h | 2 - > > .../media/platform/mtk-vcodec/vdec_drv_if.c | 1 - > > .../media/platform/mtk-vcodec/vdec_vpu_if.c | 12 +- > > .../media/platform/mtk-vcodec/vdec_vpu_if.h | 11 +- > > .../platform/mtk-vcodec/venc/venc_h264_if.c | 15 +- > > .../platform/mtk-vcodec/venc/venc_vp8_if.c | 8 +- > > .../media/platform/mtk-vcodec/venc_drv_if.c | 1 - > > .../media/platform/mtk-vcodec/venc_vpu_if.c | 17 +- > > .../media/platform/mtk-vcodec/venc_vpu_if.h | 5 +- > > 21 files changed, 290 insertions(+), 103 deletions(-) > > create mode 100644 drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.c > > create mode 100644 drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.h > > > > diff --git a/drivers/media/platform/mtk-vcodec/Makefile b/drivers/media/platform/mtk-vcodec/Makefile > > index 37b94b555fa1..b8636119ed0a 100644 > > --- a/drivers/media/platform/mtk-vcodec/Makefile > > +++ b/drivers/media/platform/mtk-vcodec/Makefile > > @@ -12,7 +12,7 @@ mtk-vcodec-dec-y := vdec/vdec_h264_if.o \ > > vdec_vpu_if.o \ > > mtk_vcodec_dec.o \ > > mtk_vcodec_dec_pm.o \ > > - > > + mtk_vcodec_fw.o > > > > mtk-vcodec-enc-y := venc/venc_vp8_if.o \ > > venc/venc_h264_if.o \ > > @@ -25,5 +25,3 @@ mtk-vcodec-enc-y := venc/venc_vp8_if.o \ > > > > mtk-vcodec-common-y := mtk_vcodec_intr.o \ > > mtk_vcodec_util.o\ > > - > > -ccflags-y += -I$(srctree)/drivers/media/platform/mtk-vpu > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c > > index 97a1b6664c20..4f07a5fcce7f 100644 > > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c > > @@ -20,7 +20,7 @@ > > #include "mtk_vcodec_dec_pm.h" > > #include "mtk_vcodec_intr.h" > > #include "mtk_vcodec_util.h" > > -#include "mtk_vpu.h" > > +#include "mtk_vcodec_fw.h" > > > > #define VDEC_HW_ACTIVE 0x10 > > #define VDEC_IRQ_CFG 0x11 > > @@ -77,22 +77,6 @@ static irqreturn_t mtk_vcodec_dec_irq_handler(int irq, void *priv) > > return IRQ_HANDLED; > > } > > > > -static void mtk_vcodec_dec_reset_handler(void *priv) > > -{ > > - struct mtk_vcodec_dev *dev = priv; > > - struct mtk_vcodec_ctx *ctx; > > - > > - mtk_v4l2_err("Watchdog timeout!!"); > > - > > - mutex_lock(&dev->dev_mutex); > > - list_for_each_entry(ctx, &dev->ctx_list, list) { > > - ctx->state = MTK_STATE_ABORT; > > - mtk_v4l2_debug(0, "[%d] Change to state MTK_STATE_ERROR", > > - ctx->id); > > - } > > - mutex_unlock(&dev->dev_mutex); > > -} > > - > > After using abstract firmware interface, how does driver process > watchdog timeout? I found it move to mtk_vcodec_fw.c and rename to mtk_vcodec_reset_handler. Reviewed-by:Tiffany Lin > > > static int fops_vcodec_open(struct file *file) > > { > > struct mtk_vcodec_dev *dev = video_drvdata(file); > > @@ -144,21 +128,20 @@ static int fops_vcodec_open(struct file *file) > > if (v4l2_fh_is_singular(&ctx->fh)) { > > mtk_vcodec_dec_pw_on(&dev->pm); > > /* > > - * vpu_load_firmware checks if it was loaded already and > > - * does nothing in that case > > + * Does nothing if firmware was already loaded. > > */ > > - ret = vpu_load_firmware(dev->vpu_plat_dev); > > + ret = mtk_vcodec_fw_load_firmware(dev->fw_handler); > > if (ret < 0) { > > /* > > * Return 0 if downloading firmware successfully, > > * otherwise it is failed > > */ > > - mtk_v4l2_err("vpu_load_firmware failed!"); > > + mtk_v4l2_err("failed to load firmware!"); > > goto err_load_fw; > > } > > > > dev->dec_capability = > > - vpu_get_vdec_hw_capa(dev->vpu_plat_dev); > > + mtk_vcodec_fw_get_vdec_capa(dev->fw_handler); > > mtk_v4l2_debug(0, "decoder capability %x", dev->dec_capability); > > } > > > > @@ -228,6 +211,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > > struct mtk_vcodec_dev *dev; > > struct video_device *vfd_dec; > > struct resource *res; > > + phandle rproc_phandle; > > + enum mtk_vcodec_fw_type fw_type; > > int i, ret; > > > > dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); > > @@ -237,19 +222,21 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > > INIT_LIST_HEAD(&dev->ctx_list); > > dev->plat_dev = pdev; > > > > - dev->vpu_plat_dev = vpu_get_plat_device(dev->plat_dev); > > - if (dev->vpu_plat_dev == NULL) { > > - mtk_v4l2_err("[VPU] vpu device in not ready"); > > - return -EPROBE_DEFER; > > + if (!of_property_read_u32(pdev->dev.of_node, "mediatek,vpu", > > + &rproc_phandle)) { > > + fw_type = VPU; > > + } else { > > + mtk_v4l2_err("Could not get vdec IPI device"); > > + return -ENODEV; > > } > > - > > - vpu_wdt_reg_handler(dev->vpu_plat_dev, mtk_vcodec_dec_reset_handler, > > - dev, VPU_RST_DEC); > > + dev->fw_handler = mtk_vcodec_fw_select(dev, fw_type, VPU_RST_DEC); > > + if (IS_ERR(dev->fw_handler)) > > + return PTR_ERR(dev->fw_handler); > > > > ret = mtk_vcodec_init_dec_pm(dev); > > if (ret < 0) { > > dev_err(&pdev->dev, "Failed to get mt vcodec clock source"); > > - return ret; > > + goto err_dec_pm; > > } > > > > for (i = 0; i < NUM_MAX_VDEC_REG_BASE; i++) { > > @@ -352,6 +339,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > > v4l2_device_unregister(&dev->v4l2_dev); > > err_res: > > mtk_vcodec_release_dec_pm(dev); > > +err_dec_pm: > > + mtk_vcodec_fw_release(dev->fw_handler); > > return ret; > > } > > > > @@ -376,6 +365,7 @@ static int mtk_vcodec_dec_remove(struct platform_device *pdev) > > > > v4l2_device_unregister(&dev->v4l2_dev); > > mtk_vcodec_release_dec_pm(dev); > > + mtk_vcodec_fw_release(dev->fw_handler); > > return 0; > > } > > > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c > > index 5a6ec8fb52da..36dfe3fc056a 100644 > > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c > > @@ -12,7 +12,6 @@ > > > > #include "mtk_vcodec_dec_pm.h" > > #include "mtk_vcodec_util.h" > > -#include "mtk_vpu.h" > > > > int mtk_vcodec_init_dec_pm(struct mtk_vcodec_dev *mtkdev) > > { > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > index 9fd56dee7fd1..e132c4ec463a 100644 > > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > @@ -309,13 +309,13 @@ struct mtk_vcodec_ctx { > > * @m2m_dev_dec: m2m device for decoder > > * @m2m_dev_enc: m2m device for encoder. > > * @plat_dev: platform device > > - * @vpu_plat_dev: mtk vpu platform device > > * @ctx_list: list of struct mtk_vcodec_ctx > > * @irqlock: protect data access by irq handler and work thread > > * @curr_ctx: The context that is waiting for codec hardware > > * > > * @reg_base: Mapped address of MTK Vcodec registers. > > * > > + * @fw_handler: used to communicate with the firmware. > > * @id_counter: used to identify current opened instance > > * > > * @encode_workqueue: encode work queue > > @@ -344,12 +344,13 @@ struct mtk_vcodec_dev { > > struct v4l2_m2m_dev *m2m_dev_dec; > > struct v4l2_m2m_dev *m2m_dev_enc; > > struct platform_device *plat_dev; > > - struct platform_device *vpu_plat_dev; > > struct list_head ctx_list; > > spinlock_t irqlock; > > struct mtk_vcodec_ctx *curr_ctx; > > void __iomem *reg_base[NUM_MAX_VCODEC_REG_BASE]; > > > > + struct mtk_vcodec_fw *fw_handler; > > + > > unsigned long id_counter; > > > > struct workqueue_struct *decode_workqueue; > > 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 4d31f1ed113f..4340ea10afd0 100644 > > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c > > @@ -21,7 +21,7 @@ > > #include "mtk_vcodec_enc_pm.h" > > #include "mtk_vcodec_intr.h" > > #include "mtk_vcodec_util.h" > > -#include "mtk_vpu.h" > > +#include "mtk_vcodec_fw.h" > > > > module_param(mtk_v4l2_dbg_level, int, S_IRUGO | S_IWUSR); > > module_param(mtk_vcodec_dbg, bool, S_IRUGO | S_IWUSR); > > @@ -101,22 +101,6 @@ static irqreturn_t mtk_vcodec_enc_lt_irq_handler(int irq, void *priv) > > return IRQ_HANDLED; > > } > > > > -static void mtk_vcodec_enc_reset_handler(void *priv) > > -{ > > - struct mtk_vcodec_dev *dev = priv; > > - struct mtk_vcodec_ctx *ctx; > > - > > - mtk_v4l2_debug(0, "Watchdog timeout!!"); > > - > > - mutex_lock(&dev->dev_mutex); > > - list_for_each_entry(ctx, &dev->ctx_list, list) { > > - ctx->state = MTK_STATE_ABORT; > > - mtk_v4l2_debug(0, "[%d] Change to state MTK_STATE_ABORT", > > - ctx->id); > > - } > > - mutex_unlock(&dev->dev_mutex); > > -} > > - > > After using abstract firmware interface, how does driver process > watchdog timeout? > > > static int fops_vcodec_open(struct file *file) > > { > > struct mtk_vcodec_dev *dev = video_drvdata(file); > > @@ -159,10 +143,10 @@ static int fops_vcodec_open(struct file *file) > > > > if (v4l2_fh_is_singular(&ctx->fh)) { > > /* > > - * vpu_load_firmware checks if it was loaded already and > > + * load fireware to checks if it was loaded already and > > * does nothing in that case > > */ > > - ret = vpu_load_firmware(dev->vpu_plat_dev); > > + ret = mtk_vcodec_fw_load_firmware(dev->fw_handler); > > if (ret < 0) { > > /* > > * Return 0 if downloading firmware successfully, > > @@ -173,7 +157,7 @@ static int fops_vcodec_open(struct file *file) > > } > > > > dev->enc_capability = > > - vpu_get_venc_hw_capa(dev->vpu_plat_dev); > > + mtk_vcodec_fw_get_venc_capa(dev->fw_handler); > > mtk_v4l2_debug(0, "encoder capability %x", dev->enc_capability); > > } > > > > @@ -235,6 +219,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > > struct mtk_vcodec_dev *dev; > > struct video_device *vfd_enc; > > struct resource *res; > > + phandle rproc_phandle; > > + enum mtk_vcodec_fw_type fw_type; > > int i, j, ret; > > > > dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); > > @@ -244,19 +230,21 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > > INIT_LIST_HEAD(&dev->ctx_list); > > dev->plat_dev = pdev; > > > > - dev->vpu_plat_dev = vpu_get_plat_device(dev->plat_dev); > > - if (dev->vpu_plat_dev == NULL) { > > - mtk_v4l2_err("[VPU] vpu device in not ready"); > > - return -EPROBE_DEFER; > > + if (!of_property_read_u32(pdev->dev.of_node, "mediatek,vpu", > > + &rproc_phandle)) { > > + fw_type = VPU; > > + } else { > > + mtk_v4l2_err("Could not get venc IPI device"); > > + return -ENODEV; > > } > > - > > - vpu_wdt_reg_handler(dev->vpu_plat_dev, mtk_vcodec_enc_reset_handler, > > - dev, VPU_RST_ENC); > > + dev->fw_handler = mtk_vcodec_fw_select(dev, fw_type, VPU_RST_ENC); > > + if (IS_ERR(dev->fw_handler)) > > + return PTR_ERR(dev->fw_handler); > > > > ret = mtk_vcodec_init_enc_pm(dev); > > if (ret < 0) { > > dev_err(&pdev->dev, "Failed to get mt vcodec clock source!"); > > - return ret; > > + goto err_enc_pm; > > } > > > > for (i = VENC_SYS, j = 0; i < NUM_MAX_VCODEC_REG_BASE; i++, j++) { > > @@ -377,6 +365,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) > > v4l2_device_unregister(&dev->v4l2_dev); > > err_res: > > mtk_vcodec_release_enc_pm(dev); > > +err_enc_pm: > > + mtk_vcodec_fw_release(dev->fw_handler); > > return ret; > > } > > > > @@ -401,6 +391,7 @@ static int mtk_vcodec_enc_remove(struct platform_device *pdev) > > > > v4l2_device_unregister(&dev->v4l2_dev); > > mtk_vcodec_release_enc_pm(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 3e2bfded79a6..ee22902aaa71 100644 > > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c > > @@ -12,8 +12,6 @@ > > > > #include "mtk_vcodec_enc_pm.h" > > #include "mtk_vcodec_util.h" > > -#include "mtk_vpu.h" > > - > > > > int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *mtkdev) > > { > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.c > > new file mode 100644 > > index 000000000000..967bb100a990 > > --- /dev/null > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.c > > @@ -0,0 +1,172 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > + > > +#include "mtk_vcodec_fw.h" > > +#include "mtk_vcodec_util.h" > > +#include "mtk_vcodec_drv.h" > > + > > +struct mtk_vcodec_fw_ops { > > + int (*load_firmware)(struct mtk_vcodec_fw *fw); > > + unsigned int (*get_vdec_capa)(struct mtk_vcodec_fw *fw); > > + unsigned int (*get_venc_capa)(struct mtk_vcodec_fw *fw); > > + void * (*map_dm_addr)(struct mtk_vcodec_fw *fw, u32 dtcm_dmem_addr); > > + int (*ipi_register)(struct mtk_vcodec_fw *fw, int id, > > + mtk_vcodec_ipi_handler handler, const char *name, void *priv); > > + int (*ipi_send)(struct mtk_vcodec_fw *fw, int id, void *buf, > > + unsigned int len, unsigned int wait); > > +}; > > + > > +struct mtk_vcodec_fw { > > + enum mtk_vcodec_fw_type type; > > + const struct mtk_vcodec_fw_ops *ops; > > + struct platform_device *pdev; > > +}; > > + > > +static int mtk_vcodec_vpu_load_firmware(struct mtk_vcodec_fw *fw) > > +{ > > + return vpu_load_firmware(fw->pdev); > > +} > > + > > +static unsigned int mtk_vcodec_vpu_get_vdec_capa(struct mtk_vcodec_fw *fw) > > +{ > > + return vpu_get_vdec_hw_capa(fw->pdev); > > +} > > + > > +static unsigned int mtk_vcodec_vpu_get_venc_capa(struct mtk_vcodec_fw *fw) > > +{ > > + return vpu_get_venc_hw_capa(fw->pdev); > > +} > > + > > +static void *mtk_vcodec_vpu_map_dm_addr(struct mtk_vcodec_fw *fw, > > + u32 dtcm_dmem_addr) > > +{ > > + return vpu_mapping_dm_addr(fw->pdev, dtcm_dmem_addr); > > +} > > + > > +static int mtk_vcodec_vpu_set_ipi_register(struct mtk_vcodec_fw *fw, int id, > > + mtk_vcodec_ipi_handler handler, const char *name, void *priv) > > +{ > > + /* > > + * The handler we receive takes a void * as its first argument. We > > + * cannot change this because it needs to be passed down to the rproc > > + * subsystem when SCP is used. VPU takes a const argument, which is > > + * more constrained, so the conversion below is safe. > > + */ > > + ipi_handler_t handler_const = (ipi_handler_t)handler; > > + > > + return vpu_ipi_register(fw->pdev, id, handler_const, name, priv); > > +} > > + > > +static int mtk_vcodec_vpu_ipi_send(struct mtk_vcodec_fw *fw, int id, void *buf, > > + unsigned int len, unsigned int wait) > > +{ > > + return vpu_ipi_send(fw->pdev, id, buf, len); > > +} > > + > > +static const struct mtk_vcodec_fw_ops mtk_vcodec_vpu_msg = { > > + .load_firmware = mtk_vcodec_vpu_load_firmware, > > + .get_vdec_capa = mtk_vcodec_vpu_get_vdec_capa, > > + .get_venc_capa = mtk_vcodec_vpu_get_venc_capa, > > + .map_dm_addr = mtk_vcodec_vpu_map_dm_addr, > > + .ipi_register = mtk_vcodec_vpu_set_ipi_register, > > + .ipi_send = mtk_vcodec_vpu_ipi_send, > > +}; > > + > > +static void mtk_vcodec_reset_handler(void *priv) > > +{ > > + struct mtk_vcodec_dev *dev = priv; > > + struct mtk_vcodec_ctx *ctx; > > + > > + mtk_v4l2_err("Watchdog timeout!!"); > > + > > + mutex_lock(&dev->dev_mutex); > > + list_for_each_entry(ctx, &dev->ctx_list, list) { > > + ctx->state = MTK_STATE_ABORT; > > + mtk_v4l2_debug(0, "[%d] Change to state MTK_STATE_ABORT", > > + ctx->id); > > + } > > + mutex_unlock(&dev->dev_mutex); > > +} > > + > > +struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev, > > + enum mtk_vcodec_fw_type type, > > + enum rst_id rst_id) > > +{ > > + const struct mtk_vcodec_fw_ops *ops; > > + struct mtk_vcodec_fw *fw; > > + struct platform_device *fw_pdev = NULL; > > + > > + switch (type) { > > + case VPU: > > + ops = &mtk_vcodec_vpu_msg; > > + fw_pdev = vpu_get_plat_device(dev->plat_dev); > > + if (!fw_pdev) { > > + mtk_v4l2_err("firmware device is not ready"); > > + return ERR_PTR(-EINVAL); > > + } > > + vpu_wdt_reg_handler(fw_pdev, mtk_vcodec_reset_handler, > > + dev, rst_id); > > + break; > > + default: > > + mtk_v4l2_err("invalid vcodec fw type"); > > + return ERR_PTR(-EINVAL); > > + } > > + > > + fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL); > > + if (!fw) > > + return ERR_PTR(-EINVAL); > > + > > + fw->type = type; > > + fw->ops = ops; > > + fw->pdev = fw_pdev; > > + > > + return fw; > > +} > > +EXPORT_SYMBOL_GPL(mtk_vcodec_fw_select); > > + > > +void mtk_vcodec_fw_release(struct mtk_vcodec_fw *fw) > > +{ > > + switch (fw->type) { > > + case VPU: > > + put_device(&fw->pdev->dev); > > + break; > > + } > > +} > > +EXPORT_SYMBOL_GPL(mtk_vcodec_fw_release); > > + > > +int mtk_vcodec_fw_load_firmware(struct mtk_vcodec_fw *fw) > > +{ > > + return fw->ops->load_firmware(fw); > > +} > > +EXPORT_SYMBOL_GPL(mtk_vcodec_fw_load_firmware); > > + > > +unsigned int mtk_vcodec_fw_get_vdec_capa(struct mtk_vcodec_fw *fw) > > +{ > > + return fw->ops->get_vdec_capa(fw); > > +} > > +EXPORT_SYMBOL_GPL(mtk_vcodec_fw_get_vdec_capa); > > + > > +unsigned int mtk_vcodec_fw_get_venc_capa(struct mtk_vcodec_fw *fw) > > +{ > > + return fw->ops->get_venc_capa(fw); > > +} > > +EXPORT_SYMBOL_GPL(mtk_vcodec_fw_get_venc_capa); > > + > > +void *mtk_vcodec_fw_map_dm_addr(struct mtk_vcodec_fw *fw, u32 mem_addr) > > +{ > > + return fw->ops->map_dm_addr(fw, mem_addr); > > +} > > +EXPORT_SYMBOL_GPL(mtk_vcodec_fw_map_dm_addr); > > + > > +int mtk_vcodec_fw_ipi_register(struct mtk_vcodec_fw *fw, int id, > > + mtk_vcodec_ipi_handler handler, const char *name, void *priv) > > +{ > > + return fw->ops->ipi_register(fw, id, handler, name, priv); > > +} > > +EXPORT_SYMBOL_GPL(mtk_vcodec_fw_ipi_register); > > + > > +int mtk_vcodec_fw_ipi_send(struct mtk_vcodec_fw *fw, > > + int id, void *buf, unsigned int len, unsigned int wait) > > +{ > > + return fw->ops->ipi_send(fw, id, buf, len, wait); > > +} > > +EXPORT_SYMBOL_GPL(mtk_vcodec_fw_ipi_send); > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.h > > new file mode 100644 > > index 000000000000..ff25b0c19f74 > > --- /dev/null > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.h > > @@ -0,0 +1,36 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > + > > +#ifndef _MTK_VCODEC_FW_H_ > > +#define _MTK_VCODEC_FW_H_ > > + > > +#include > > + > > +#include "../mtk-vpu/mtk_vpu.h" > > + > > +struct mtk_vcodec_dev; > > + > > +enum mtk_vcodec_fw_type { > > + VPU, > > +}; > > + > > +struct mtk_vcodec_fw; > > + > > +typedef void (*mtk_vcodec_ipi_handler) (void *data, > > + unsigned int len, void *priv); > > + > > +struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev, > > + enum mtk_vcodec_fw_type type, > > + enum rst_id rst_id); > > +void mtk_vcodec_fw_release(struct mtk_vcodec_fw *fw); > > + > > +int mtk_vcodec_fw_load_firmware(struct mtk_vcodec_fw *fw); > > +unsigned int mtk_vcodec_fw_get_vdec_capa(struct mtk_vcodec_fw *fw); > > +unsigned int mtk_vcodec_fw_get_venc_capa(struct mtk_vcodec_fw *fw); > > +void *mtk_vcodec_fw_map_dm_addr(struct mtk_vcodec_fw *fw, u32 mem_addr); > > +int mtk_vcodec_fw_ipi_register(struct mtk_vcodec_fw *fw, int id, > > + mtk_vcodec_ipi_handler handler, const char *name, void *priv); > > +int mtk_vcodec_fw_ipi_send(struct mtk_vcodec_fw *fw, > > + int id, void *buf, unsigned int len, unsigned int wait); > > + > > +#endif /* _MTK_VCODEC_FW_H_ */ > > + > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c > > index d48f542db1a9..ac5973b6735f 100644 > > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c > > @@ -9,7 +9,6 @@ > > > > #include "mtk_vcodec_drv.h" > > #include "mtk_vcodec_util.h" > > -#include "mtk_vpu.h" > > > > /* For encoder, this will enable logs in venc/*/ > > bool mtk_vcodec_dbg; > > diff --git a/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_if.c b/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_if.c > > index 50048c170b99..40d6e6c5ac7a 100644 > > --- a/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_if.c > > +++ b/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_if.c > > @@ -281,7 +281,6 @@ static int vdec_h264_init(struct mtk_vcodec_ctx *ctx) > > inst->ctx = ctx; > > > > inst->vpu.id = IPI_VDEC_H264; > > - inst->vpu.dev = ctx->dev->vpu_plat_dev; > > inst->vpu.ctx = ctx; > > > > err = vpu_dec_init(&inst->vpu); > > diff --git a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp8_if.c b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp8_if.c > > index 6011fdd60a22..e5393f841080 100644 > > --- a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp8_if.c > > +++ b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp8_if.c > > @@ -400,7 +400,6 @@ static int vdec_vp8_init(struct mtk_vcodec_ctx *ctx) > > inst->ctx = ctx; > > > > inst->vpu.id = IPI_VDEC_VP8; > > - inst->vpu.dev = ctx->dev->vpu_plat_dev; > > inst->vpu.ctx = ctx; > > > > err = vpu_dec_init(&inst->vpu); > > diff --git a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c > > index 257a5b5ad212..8e099b859f21 100644 > > --- a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c > > +++ b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c > > @@ -795,7 +795,6 @@ static int vdec_vp9_init(struct mtk_vcodec_ctx *ctx) > > inst->ctx = ctx; > > > > inst->vpu.id = IPI_VDEC_VP9; > > - inst->vpu.dev = ctx->dev->vpu_plat_dev; > > inst->vpu.ctx = ctx; > > > > if (vpu_dec_init(&inst->vpu)) { > > diff --git a/drivers/media/platform/mtk-vcodec/vdec_drv_base.h b/drivers/media/platform/mtk-vcodec/vdec_drv_base.h > > index ceb4db4cb3be..e913f963b7db 100644 > > --- a/drivers/media/platform/mtk-vcodec/vdec_drv_base.h > > +++ b/drivers/media/platform/mtk-vcodec/vdec_drv_base.h > > @@ -7,8 +7,6 @@ > > #ifndef _VDEC_DRV_BASE_ > > #define _VDEC_DRV_BASE_ > > > > -#include "mtk_vcodec_drv.h" > > - > > #include "vdec_drv_if.h" > > > > struct vdec_common_if { > > diff --git a/drivers/media/platform/mtk-vcodec/vdec_drv_if.c b/drivers/media/platform/mtk-vcodec/vdec_drv_if.c > > index 2e43dd4486e0..b18743b906ea 100644 > > --- a/drivers/media/platform/mtk-vcodec/vdec_drv_if.c > > +++ b/drivers/media/platform/mtk-vcodec/vdec_drv_if.c > > @@ -13,7 +13,6 @@ > > #include "mtk_vcodec_dec.h" > > #include "vdec_drv_base.h" > > #include "mtk_vcodec_dec_pm.h" > > -#include "mtk_vpu.h" > > > > int vdec_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc) > > { > > diff --git a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c > > index 948a12fd9d46..58b0e6fa8fd2 100644 > > --- a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c > > +++ b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c > > @@ -8,6 +8,7 @@ > > #include "mtk_vcodec_util.h" > > #include "vdec_ipi_msg.h" > > #include "vdec_vpu_if.h" > > +#include "mtk_vcodec_fw.h" > > > > static void handle_init_ack_msg(const struct vdec_vpu_ipi_init_ack *msg) > > { > > @@ -18,7 +19,8 @@ static void handle_init_ack_msg(const struct vdec_vpu_ipi_init_ack *msg) > > > > /* mapping VPU address to kernel virtual address */ > > /* the content in vsi is initialized to 0 in VPU */ > > - vpu->vsi = vpu_mapping_dm_addr(vpu->dev, msg->vpu_inst_addr); > > + vpu->vsi = mtk_vcodec_fw_map_dm_addr(vpu->ctx->dev->fw_handler, > > + msg->vpu_inst_addr); > > vpu->inst_addr = msg->vpu_inst_addr; > > > > mtk_vcodec_debug(vpu, "- vpu_inst_addr = 0x%x", vpu->inst_addr); > > @@ -34,7 +36,7 @@ static void handle_init_ack_msg(const struct vdec_vpu_ipi_init_ack *msg) > > * This function runs in interrupt context and it means there's an IPI MSG > > * from VPU. > > */ > > -static void vpu_dec_ipi_handler(const void *data, unsigned int len, void *priv) > > +static void vpu_dec_ipi_handler(void *data, unsigned int len, void *priv) > > { > > const struct vdec_vpu_ipi_ack *msg = data; > > struct vdec_vpu_inst *vpu = (struct vdec_vpu_inst *) > > @@ -74,7 +76,8 @@ static int vcodec_vpu_send_msg(struct vdec_vpu_inst *vpu, void *msg, int len) > > vpu->failure = 0; > > vpu->signaled = 0; > > > > - err = vpu_ipi_send(vpu->dev, vpu->id, msg, len); > > + err = mtk_vcodec_fw_ipi_send(vpu->ctx->dev->fw_handler, vpu->id, msg, > > + len, 2000); > > if (err) { > > mtk_vcodec_err(vpu, "send fail vpu_id=%d msg_id=%X status=%d", > > vpu->id, *(uint32_t *)msg, err); > > @@ -110,7 +113,8 @@ int vpu_dec_init(struct vdec_vpu_inst *vpu) > > init_waitqueue_head(&vpu->wq); > > vpu->handler = vpu_dec_ipi_handler; > > > > - err = vpu_ipi_register(vpu->dev, vpu->id, vpu->handler, "vdec", NULL); > > + err = mtk_vcodec_fw_ipi_register(vpu->ctx->dev->fw_handler, vpu->id, > > + vpu->handler, "vdec", NULL); > > if (err != 0) { > > mtk_vcodec_err(vpu, "vpu_ipi_register fail status=%d", err); > > return err; > > diff --git a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.h b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.h > > index f779b0676fbd..85224eb7e34b 100644 > > --- a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.h > > +++ b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.h > > @@ -7,11 +7,13 @@ > > #ifndef _VDEC_VPU_IF_H_ > > #define _VDEC_VPU_IF_H_ > > > > -#include "mtk_vpu.h" > > +#include "mtk_vcodec_fw.h" > > + > > +struct mtk_vcodec_ctx; > > > > /** > > * struct vdec_vpu_inst - VPU instance for video codec > > - * @ipi_id : ipi id for each decoder > > + * @id : ipi msg id for each decoder > > * @vsi : driver structure allocated by VPU side and shared to AP side > > * for control and info share > > * @failure : VPU execution result status, 0: success, others: fail > > @@ -23,15 +25,14 @@ > > * @handler : ipi handler for each decoder > > */ > > struct vdec_vpu_inst { > > - enum ipi_id id; > > + int id; > > void *vsi; > > int32_t failure; > > uint32_t inst_addr; > > unsigned int signaled; > > struct mtk_vcodec_ctx *ctx; > > - struct platform_device *dev; > > wait_queue_head_t wq; > > - ipi_handler_t handler; > > + mtk_vcodec_ipi_handler handler; > > }; > > > > /** > > diff --git a/drivers/media/platform/mtk-vcodec/venc/venc_h264_if.c b/drivers/media/platform/mtk-vcodec/venc/venc_h264_if.c > > index b9624f8df0e9..7a00f050ec36 100644 > > --- a/drivers/media/platform/mtk-vcodec/venc/venc_h264_if.c > > +++ b/drivers/media/platform/mtk-vcodec/venc/venc_h264_if.c > > @@ -18,7 +18,6 @@ > > #include "../venc_drv_base.h" > > #include "../venc_ipi_msg.h" > > #include "../venc_vpu_if.h" > > -#include "mtk_vpu.h" > > > > static const char h264_filler_marker[] = {0x0, 0x0, 0x0, 0x1, 0xc}; > > > > @@ -257,8 +256,11 @@ static int h264_enc_alloc_work_buf(struct venc_h264_inst *inst) > > */ > > inst->work_bufs[i].size = wb[i].size; > > if (i == VENC_H264_VPU_WORK_BUF_SKIP_FRAME) { > > - inst->work_bufs[i].va = vpu_mapping_dm_addr( > > - inst->vpu_inst.dev, wb[i].vpua); > > + struct mtk_vcodec_fw *handler; > > + > > + handler = inst->vpu_inst.ctx->dev->fw_handler; > > + inst->work_bufs[i].va = > > + mtk_vcodec_fw_map_dm_addr(handler, wb[i].vpua); > > inst->work_bufs[i].dma_addr = 0; > > } else { > > ret = mtk_vcodec_mem_alloc(inst->ctx, > > @@ -275,10 +277,12 @@ static int h264_enc_alloc_work_buf(struct venc_h264_inst *inst) > > * setting in VPU side. > > */ > > if (i == VENC_H264_VPU_WORK_BUF_RC_CODE) { > > + struct mtk_vcodec_fw *handler; > > void *tmp_va; > > > > - tmp_va = vpu_mapping_dm_addr(inst->vpu_inst.dev, > > - wb[i].vpua); > > + handler = inst->vpu_inst.ctx->dev->fw_handler; > > + tmp_va = mtk_vcodec_fw_map_dm_addr(handler, > > + wb[i].vpua); > > memcpy(inst->work_bufs[i].va, tmp_va, > > wb[i].size); > > } > > @@ -469,7 +473,6 @@ static int h264_enc_init(struct mtk_vcodec_ctx *ctx) > > > > inst->ctx = ctx; > > inst->vpu_inst.ctx = ctx; > > - inst->vpu_inst.dev = ctx->dev->vpu_plat_dev; > > inst->vpu_inst.id = IPI_VENC_H264; > > inst->hw_base = mtk_vcodec_get_reg_addr(inst->ctx, VENC_SYS); > > > > 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 8d36f0362efe..6426af514526 100644 > > --- a/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > > +++ b/drivers/media/platform/mtk-vcodec/venc/venc_vp8_if.c > > @@ -17,7 +17,6 @@ > > #include "../venc_drv_base.h" > > #include "../venc_ipi_msg.h" > > #include "../venc_vpu_if.h" > > -#include "mtk_vpu.h" > > > > #define VENC_BITSTREAM_FRAME_SIZE 0x0098 > > #define VENC_BITSTREAM_HEADER_LEN 0x00e8 > > @@ -190,10 +189,12 @@ static int vp8_enc_alloc_work_buf(struct venc_vp8_inst *inst) > > if (i == VENC_VP8_VPU_WORK_BUF_RC_CODE || > > i == VENC_VP8_VPU_WORK_BUF_RC_CODE2 || > > i == VENC_VP8_VPU_WORK_BUF_RC_CODE3) { > > + struct mtk_vcodec_fw *handler; > > void *tmp_va; > > > > - tmp_va = vpu_mapping_dm_addr(inst->vpu_inst.dev, > > - wb[i].vpua); > > + handler = inst->vpu_inst.ctx->dev->fw_handler; > > + tmp_va = mtk_vcodec_fw_map_dm_addr(handler, > > + wb[i].vpua); > > memcpy(inst->work_bufs[i].va, tmp_va, wb[i].size); > > } > > wb[i].iova = inst->work_bufs[i].dma_addr; > > @@ -334,7 +335,6 @@ static int vp8_enc_init(struct mtk_vcodec_ctx *ctx) > > > > inst->ctx = ctx; > > inst->vpu_inst.ctx = ctx; > > - inst->vpu_inst.dev = ctx->dev->vpu_plat_dev; > > inst->vpu_inst.id = IPI_VENC_VP8; > > inst->hw_base = mtk_vcodec_get_reg_addr(inst->ctx, VENC_LT_SYS); > > > > diff --git a/drivers/media/platform/mtk-vcodec/venc_drv_if.c b/drivers/media/platform/mtk-vcodec/venc_drv_if.c > > index c6bb82ac2dcd..ce0bce811615 100644 > > --- a/drivers/media/platform/mtk-vcodec/venc_drv_if.c > > +++ b/drivers/media/platform/mtk-vcodec/venc_drv_if.c > > @@ -15,7 +15,6 @@ > > > > #include "mtk_vcodec_enc.h" > > #include "mtk_vcodec_enc_pm.h" > > -#include "mtk_vpu.h" > > > > int venc_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc) > > { > > diff --git a/drivers/media/platform/mtk-vcodec/venc_vpu_if.c b/drivers/media/platform/mtk-vcodec/venc_vpu_if.c > > index 9540709c1905..53854127814b 100644 > > --- a/drivers/media/platform/mtk-vcodec/venc_vpu_if.c > > +++ b/drivers/media/platform/mtk-vcodec/venc_vpu_if.c > > @@ -4,7 +4,7 @@ > > * Author: PoChun Lin > > */ > > > > -#include "mtk_vpu.h" > > +#include "mtk_vcodec_fw.h" > > #include "venc_ipi_msg.h" > > #include "venc_vpu_if.h" > > > > @@ -13,7 +13,8 @@ static void handle_enc_init_msg(struct venc_vpu_inst *vpu, const void *data) > > const struct venc_vpu_ipi_msg_init *msg = data; > > > > vpu->inst_addr = msg->vpu_inst_addr; > > - vpu->vsi = vpu_mapping_dm_addr(vpu->dev, msg->vpu_inst_addr); > > + vpu->vsi = mtk_vcodec_fw_map_dm_addr(vpu->ctx->dev->fw_handler, > > + msg->vpu_inst_addr); > > } > > > > static void handle_enc_encode_msg(struct venc_vpu_inst *vpu, const void *data) > > @@ -25,7 +26,7 @@ static void handle_enc_encode_msg(struct venc_vpu_inst *vpu, const void *data) > > vpu->is_key_frm = msg->is_key_frm; > > } > > > > -static void vpu_enc_ipi_handler(const void *data, unsigned int len, void *priv) > > +static void vpu_enc_ipi_handler(void *data, unsigned int len, void *priv) > > { > > const struct venc_vpu_ipi_msg_common *msg = data; > > struct venc_vpu_inst *vpu = > > @@ -63,12 +64,13 @@ static int vpu_enc_send_msg(struct venc_vpu_inst *vpu, void *msg, > > > > mtk_vcodec_debug_enter(vpu); > > > > - if (!vpu->dev) { > > + if (!vpu->ctx->dev->fw_handler) { > > mtk_vcodec_err(vpu, "inst dev is NULL"); > > return -EINVAL; > > } > > > > - status = vpu_ipi_send(vpu->dev, vpu->id, msg, len); > > + status = mtk_vcodec_fw_ipi_send(vpu->ctx->dev->fw_handler, vpu->id, msg, > > + len, 2000); > > if (status) { > > mtk_vcodec_err(vpu, "vpu_ipi_send msg_id %x len %d fail %d", > > *(uint32_t *)msg, len, status); > > @@ -93,8 +95,9 @@ int vpu_enc_init(struct venc_vpu_inst *vpu) > > vpu->signaled = 0; > > vpu->failure = 0; > > > > - status = vpu_ipi_register(vpu->dev, vpu->id, vpu_enc_ipi_handler, > > - NULL, NULL); > > + status = mtk_vcodec_fw_ipi_register(vpu->ctx->dev->fw_handler, vpu->id, > > + vpu_enc_ipi_handler, "venc", NULL); > > + > > if (status) { > > mtk_vcodec_err(vpu, "vpu_ipi_register fail %d", status); > > return -EINVAL; > > diff --git a/drivers/media/platform/mtk-vcodec/venc_vpu_if.h b/drivers/media/platform/mtk-vcodec/venc_vpu_if.h > > index ba301a138a5a..edd411621b68 100644 > > --- a/drivers/media/platform/mtk-vcodec/venc_vpu_if.h > > +++ b/drivers/media/platform/mtk-vcodec/venc_vpu_if.h > > @@ -7,7 +7,7 @@ > > #ifndef _VENC_VPU_IF_H_ > > #define _VENC_VPU_IF_H_ > > > > -#include "mtk_vpu.h" > > +#include "mtk_vcodec_fw.h" > > #include "venc_drv_if.h" > > > > /* > > @@ -34,9 +34,8 @@ struct venc_vpu_inst { > > int is_key_frm; > > unsigned int inst_addr; > > void *vsi; > > - enum ipi_id id; > > + int id; > > struct mtk_vcodec_ctx *ctx; > > - struct platform_device *dev; > > }; > > > > int vpu_enc_init(struct venc_vpu_inst *vpu); > _______________________________________________ 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.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=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 EFB83C433DF for ; Mon, 8 Jun 2020 10:41:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B75AB20760 for ; Mon, 8 Jun 2020 10:41:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="NNphv3hi" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729326AbgFHKlh (ORCPT ); Mon, 8 Jun 2020 06:41:37 -0400 Received: from mailgw01.mediatek.com ([210.61.82.183]:54632 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1729300AbgFHKlf (ORCPT ); Mon, 8 Jun 2020 06:41:35 -0400 X-UUID: a5affbf3929340e6891b13530b79bfa3-20200608 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=nDTwn3HYUdqhoihw53OorCtFz45EH3thj56ECqplSXA=; b=NNphv3hiYS7YOeaUTrfRc+YLS427m63OhTZ26J3ZQ8Y6QcIEv1ONJ/QYSC69ee8S6KnCVVCAvDQKSwt6ZH0dmA5HLBmGN1M0ogKCtFyQ+t5r7rujs0LrEhSgcikbv1DQ2jhKtlv49M3s+uLBTBCf80TNF5DqINhsMeFZMQGJ2h8=; X-UUID: a5affbf3929340e6891b13530b79bfa3-20200608 Received: from mtkcas11.mediatek.inc [(172.21.101.40)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 943911058; Mon, 08 Jun 2020 18:41:19 +0800 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 8 Jun 2020 18:41:16 +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; Mon, 8 Jun 2020 18:41:15 +0800 Message-ID: <1591612878.18435.5.camel@mtksdaap41> Subject: Re: [PATCH 01/10] media: mtk-vcodec: abstract firmware interface From: Tiffany Lin To: Alexandre Courbot CC: Andrew-CT Chen , Rui Wang , Yunfei Dong , "Pi-Hsun Shih" , Maoguang Meng , , , Date: Mon, 8 Jun 2020 18:41:18 +0800 In-Reply-To: <1591611416.18435.1.camel@mtksdaap41> References: <20200520082723.96136-1-acourbot@chromium.org> <20200520082723.96136-2-acourbot@chromium.org> <1591611416.18435.1.camel@mtksdaap41> 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: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org T24gTW9uLCAyMDIwLTA2LTA4IGF0IDE4OjE2ICswODAwLCBUaWZmYW55IExpbiB3cm90ZToNCj4g T24gV2VkLCAyMDIwLTA1LTIwIGF0IDE3OjI3ICswOTAwLCBBbGV4YW5kcmUgQ291cmJvdCB3cm90 ZToNCj4gPiBGcm9tOiBZdW5mZWkgRG9uZyA8eXVuZmVpLmRvbmdAbWVkaWF0ZWsuY29tPg0KPiA+ IA0KPiA+IE1UODE4MydzIGNvZGVjIGZpcndtYXJlIGlzIHJ1biBieSBhIGRpZmZlcmVudCByZW1v dGUgcHJvY2Vzc29yIGZyb20NCj4gPiBNVDgxNzMuIFdoaWxlIHRoZSBmaXJtd2FyZSBpbnRlcmZh Y2UgaXMgYmFzaWNhbGx5IHRoZSBzYW1lLCB0aGUgd2F5IHRvDQo+ID4gaW52b2tlIGl0IGRpZmZl cnMuIEFic3RyYWN0IGFsbCBmaXJtd2FyZSBjYWxscyB1bmRlciBhIGxheWVyIHRoYXQgd2lsbA0K PiA+IGFsbG93IHVzIHRvIGhhbmRsZSBib3RoIGZpcm13YXJlIHR5cGVzIHRyYW5zcGFyZW50bHku DQo+ID4gDQo+ID4gU2lnbmVkLW9mZi1ieTogWXVuZmVpIERvbmcgPHl1bmZlaS5kb25nQG1lZGlh dGVrLmNvbT4NCj4gPiBbYWNvdXJib3Q6IHJlZmFjdG9yLCBjbGVhbnVwIGFuZCBzcGxpdF0NCj4g PiBDby1kZXZlbG9wZWQtYnk6IEFsZXhhbmRyZSBDb3VyYm90IDxhY291cmJvdEBjaHJvbWl1bS5v cmc+DQo+ID4gU2lnbmVkLW9mZi1ieTogQWxleGFuZHJlIENvdXJib3QgPGFjb3VyYm90QGNocm9t aXVtLm9yZz4NCj4gPiBbcGloc3VuOiBmaXggZXJyb3IgcGF0aCBhbmQgYWRkIG10a192Y29kZWNf ZndfcmVsZWFzZV0NCj4gPiBTaWduZWQtb2ZmLWJ5OiBQaS1Ic3VuIFNoaWggPHBpaHN1bkBjaHJv bWl1bS5vcmc+DQo+ID4gLS0tDQo+ID4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2Rl Yy9NYWtlZmlsZSAgICB8ICAgNCArLQ0KPiA+ICAuLi4vcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtf dmNvZGVjX2RlY19kcnYuYyAgfCAgNTAgKystLS0NCj4gPiAgLi4uL3BsYXRmb3JtL210ay12Y29k ZWMvbXRrX3Zjb2RlY19kZWNfcG0uYyAgIHwgICAxIC0NCj4gPiAgLi4uL3BsYXRmb3JtL210ay12 Y29kZWMvbXRrX3Zjb2RlY19kcnYuaCAgICAgIHwgICA1ICstDQo+ID4gIC4uLi9wbGF0Zm9ybS9t dGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jICB8ICA0NyArKy0tLQ0KPiA+ICAuLi4vcGxh dGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuY19wbS5jICAgfCAgIDIgLQ0KPiA+ICAuLi4v bWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Z3LmMgfCAxNzIgKysrKysrKysr KysrKysrKysrDQo+ID4gIC4uLi9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNf ZncuaCB8ICAzNiArKysrDQo+ID4gIC4uLi9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNf dXRpbC5jICAgICB8ICAgMSAtDQo+ID4gIC4uLi9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWMvdmRl Y19oMjY0X2lmLmMgICB8ICAgMSAtDQo+ID4gIC4uLi9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWMv dmRlY192cDhfaWYuYyAgICB8ICAgMSAtDQo+ID4gIC4uLi9wbGF0Zm9ybS9tdGstdmNvZGVjL3Zk ZWMvdmRlY192cDlfaWYuYyAgICB8ICAgMSAtDQo+ID4gIC4uLi9tZWRpYS9wbGF0Zm9ybS9tdGst dmNvZGVjL3ZkZWNfZHJ2X2Jhc2UuaCB8ICAgMiAtDQo+ID4gIC4uLi9tZWRpYS9wbGF0Zm9ybS9t dGstdmNvZGVjL3ZkZWNfZHJ2X2lmLmMgICB8ICAgMSAtDQo+ID4gIC4uLi9tZWRpYS9wbGF0Zm9y bS9tdGstdmNvZGVjL3ZkZWNfdnB1X2lmLmMgICB8ICAxMiArLQ0KPiA+ICAuLi4vbWVkaWEvcGxh dGZvcm0vbXRrLXZjb2RlYy92ZGVjX3ZwdV9pZi5oICAgfCAgMTEgKy0NCj4gPiAgLi4uL3BsYXRm b3JtL210ay12Y29kZWMvdmVuYy92ZW5jX2gyNjRfaWYuYyAgIHwgIDE1ICstDQo+ID4gIC4uLi9w bGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY192cDhfaWYuYyAgICB8ICAgOCArLQ0KPiA+ICAu Li4vbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jX2Rydl9pZi5jICAgfCAgIDEgLQ0KPiA+ ICAuLi4vbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jX3ZwdV9pZi5jICAgfCAgMTcgKy0N Cj4gPiAgLi4uL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuY192cHVfaWYuaCAgIHwgICA1 ICstDQo+ID4gIDIxIGZpbGVzIGNoYW5nZWQsIDI5MCBpbnNlcnRpb25zKCspLCAxMDMgZGVsZXRp b25zKC0pDQo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL210 ay12Y29kZWMvbXRrX3Zjb2RlY19mdy5jDQo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19mdy5oDQo+ID4gDQo+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9NYWtlZmlsZSBiL2Ry aXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9NYWtlZmlsZQ0KPiA+IGluZGV4IDM3Yjk0 YjU1NWZhMS4uYjg2MzYxMTllZDBhIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxh dGZvcm0vbXRrLXZjb2RlYy9NYWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZv cm0vbXRrLXZjb2RlYy9NYWtlZmlsZQ0KPiA+IEBAIC0xMiw3ICsxMiw3IEBAIG10ay12Y29kZWMt ZGVjLXkgOj0gdmRlYy92ZGVjX2gyNjRfaWYubyBcDQo+ID4gIAkJdmRlY192cHVfaWYubyBcDQo+ ID4gIAkJbXRrX3Zjb2RlY19kZWMubyBcDQo+ID4gIAkJbXRrX3Zjb2RlY19kZWNfcG0ubyBcDQo+ ID4gLQ0KPiA+ICsJCW10a192Y29kZWNfZncubw0KPiA+ICANCj4gPiAgbXRrLXZjb2RlYy1lbmMt eSA6PSB2ZW5jL3ZlbmNfdnA4X2lmLm8gXA0KPiA+ICAJCXZlbmMvdmVuY19oMjY0X2lmLm8gXA0K PiA+IEBAIC0yNSw1ICsyNSwzIEBAIG10ay12Y29kZWMtZW5jLXkgOj0gdmVuYy92ZW5jX3ZwOF9p Zi5vIFwNCj4gPiAgDQo+ID4gIG10ay12Y29kZWMtY29tbW9uLXkgOj0gbXRrX3Zjb2RlY19pbnRy Lm8gXA0KPiA+ICAJCW10a192Y29kZWNfdXRpbC5vXA0KPiA+IC0NCj4gPiAtY2NmbGFncy15ICs9 IC1JJChzcmN0cmVlKS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12cHUNCj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZGVjX2Ry di5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZGVjX2Ry di5jDQo+ID4gaW5kZXggOTdhMWI2NjY0YzIwLi40ZjA3YTVmY2NlN2YgMTAwNjQ0DQo+ID4gLS0t IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZGVjX2Rydi5j DQo+ID4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNf ZGVjX2Rydi5jDQo+ID4gQEAgLTIwLDcgKzIwLDcgQEANCj4gPiAgI2luY2x1ZGUgIm10a192Y29k ZWNfZGVjX3BtLmgiDQo+ID4gICNpbmNsdWRlICJtdGtfdmNvZGVjX2ludHIuaCINCj4gPiAgI2lu Y2x1ZGUgIm10a192Y29kZWNfdXRpbC5oIg0KPiA+IC0jaW5jbHVkZSAibXRrX3ZwdS5oIg0KPiA+ ICsjaW5jbHVkZSAibXRrX3Zjb2RlY19mdy5oIg0KPiA+ICANCj4gPiAgI2RlZmluZSBWREVDX0hX X0FDVElWRQkweDEwDQo+ID4gICNkZWZpbmUgVkRFQ19JUlFfQ0ZHCTB4MTENCj4gPiBAQCAtNzcs MjIgKzc3LDYgQEAgc3RhdGljIGlycXJldHVybl90IG10a192Y29kZWNfZGVjX2lycV9oYW5kbGVy KGludCBpcnEsIHZvaWQgKnByaXYpDQo+ID4gIAlyZXR1cm4gSVJRX0hBTkRMRUQ7DQo+ID4gIH0N Cj4gPiAgDQo+ID4gLXN0YXRpYyB2b2lkIG10a192Y29kZWNfZGVjX3Jlc2V0X2hhbmRsZXIodm9p ZCAqcHJpdikNCj4gPiAtew0KPiA+IC0Jc3RydWN0IG10a192Y29kZWNfZGV2ICpkZXYgPSBwcml2 Ow0KPiA+IC0Jc3RydWN0IG10a192Y29kZWNfY3R4ICpjdHg7DQo+ID4gLQ0KPiA+IC0JbXRrX3Y0 bDJfZXJyKCJXYXRjaGRvZyB0aW1lb3V0ISEiKTsNCj4gPiAtDQo+ID4gLQltdXRleF9sb2NrKCZk ZXYtPmRldl9tdXRleCk7DQo+ID4gLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJmRldi0+Y3R4 X2xpc3QsIGxpc3QpIHsNCj4gPiAtCQljdHgtPnN0YXRlID0gTVRLX1NUQVRFX0FCT1JUOw0KPiA+ IC0JCW10a192NGwyX2RlYnVnKDAsICJbJWRdIENoYW5nZSB0byBzdGF0ZSBNVEtfU1RBVEVfRVJS T1IiLA0KPiA+IC0JCQkJY3R4LT5pZCk7DQo+ID4gLQl9DQo+ID4gLQltdXRleF91bmxvY2soJmRl di0+ZGV2X211dGV4KTsNCj4gPiAtfQ0KPiA+IC0NCj4gDQo+IEFmdGVyIHVzaW5nIGFic3RyYWN0 IGZpcm13YXJlIGludGVyZmFjZSwgaG93IGRvZXMgZHJpdmVyIHByb2Nlc3MNCj4gd2F0Y2hkb2cg dGltZW91dD8NCg0KSSBmb3VuZCBpdCBtb3ZlIHRvIG10a192Y29kZWNfZncuYyBhbmQgcmVuYW1l IHRvDQptdGtfdmNvZGVjX3Jlc2V0X2hhbmRsZXIuDQoNCg0KUmV2aWV3ZWQtYnk6VGlmZmFueSBM aW4gPHRpZmZhbnkubGluQG1lZGlhdGVrLmNvbT4NCg0KPiANCj4gPiAgc3RhdGljIGludCBmb3Bz X3Zjb2RlY19vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQ0KPiA+ICB7DQo+ID4gIAlzdHJ1Y3QgbXRr X3Zjb2RlY19kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7DQo+ID4gQEAgLTE0NCwyMSAr MTI4LDIwIEBAIHN0YXRpYyBpbnQgZm9wc192Y29kZWNfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkN Cj4gPiAgCWlmICh2NGwyX2ZoX2lzX3Npbmd1bGFyKCZjdHgtPmZoKSkgew0KPiA+ICAJCW10a192 Y29kZWNfZGVjX3B3X29uKCZkZXYtPnBtKTsNCj4gPiAgCQkvKg0KPiA+IC0JCSAqIHZwdV9sb2Fk X2Zpcm13YXJlIGNoZWNrcyBpZiBpdCB3YXMgbG9hZGVkIGFscmVhZHkgYW5kDQo+ID4gLQkJICog ZG9lcyBub3RoaW5nIGluIHRoYXQgY2FzZQ0KPiA+ICsJCSAqIERvZXMgbm90aGluZyBpZiBmaXJt d2FyZSB3YXMgYWxyZWFkeSBsb2FkZWQuDQo+ID4gIAkJICovDQo+ID4gLQkJcmV0ID0gdnB1X2xv YWRfZmlybXdhcmUoZGV2LT52cHVfcGxhdF9kZXYpOw0KPiA+ICsJCXJldCA9IG10a192Y29kZWNf ZndfbG9hZF9maXJtd2FyZShkZXYtPmZ3X2hhbmRsZXIpOw0KPiA+ICAJCWlmIChyZXQgPCAwKSB7 DQo+ID4gIAkJCS8qDQo+ID4gIAkJCSAqIFJldHVybiAwIGlmIGRvd25sb2FkaW5nIGZpcm13YXJl IHN1Y2Nlc3NmdWxseSwNCj4gPiAgCQkJICogb3RoZXJ3aXNlIGl0IGlzIGZhaWxlZA0KPiA+ICAJ CQkgKi8NCj4gPiAtCQkJbXRrX3Y0bDJfZXJyKCJ2cHVfbG9hZF9maXJtd2FyZSBmYWlsZWQhIik7 DQo+ID4gKwkJCW10a192NGwyX2VycigiZmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhIik7DQo+ID4g IAkJCWdvdG8gZXJyX2xvYWRfZnc7DQo+ID4gIAkJfQ0KPiA+ICANCj4gPiAgCQlkZXYtPmRlY19j YXBhYmlsaXR5ID0NCj4gPiAtCQkJdnB1X2dldF92ZGVjX2h3X2NhcGEoZGV2LT52cHVfcGxhdF9k ZXYpOw0KPiA+ICsJCQltdGtfdmNvZGVjX2Z3X2dldF92ZGVjX2NhcGEoZGV2LT5md19oYW5kbGVy KTsNCj4gPiAgCQltdGtfdjRsMl9kZWJ1ZygwLCAiZGVjb2RlciBjYXBhYmlsaXR5ICV4IiwgZGV2 LT5kZWNfY2FwYWJpbGl0eSk7DQo+ID4gIAl9DQo+ID4gIA0KPiA+IEBAIC0yMjgsNiArMjExLDgg QEAgc3RhdGljIGludCBtdGtfdmNvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpDQo+ID4gIAlzdHJ1Y3QgbXRrX3Zjb2RlY19kZXYgKmRldjsNCj4gPiAgCXN0cnVjdCB2aWRl b19kZXZpY2UgKnZmZF9kZWM7DQo+ID4gIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsNCj4gPiArCXBo YW5kbGUgcnByb2NfcGhhbmRsZTsNCj4gPiArCWVudW0gbXRrX3Zjb2RlY19md190eXBlIGZ3X3R5 cGU7DQo+ID4gIAlpbnQgaSwgcmV0Ow0KPiA+ICANCj4gPiAgCWRldiA9IGRldm1fa3phbGxvYygm cGRldi0+ZGV2LCBzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOw0KPiA+IEBAIC0yMzcsMTkgKzIy MiwyMSBAQCBzdGF0aWMgaW50IG10a192Y29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikNCj4gPiAgCUlOSVRfTElTVF9IRUFEKCZkZXYtPmN0eF9saXN0KTsNCj4gPiAgCWRl di0+cGxhdF9kZXYgPSBwZGV2Ow0KPiA+ICANCj4gPiAtCWRldi0+dnB1X3BsYXRfZGV2ID0gdnB1 X2dldF9wbGF0X2RldmljZShkZXYtPnBsYXRfZGV2KTsNCj4gPiAtCWlmIChkZXYtPnZwdV9wbGF0 X2RldiA9PSBOVUxMKSB7DQo+ID4gLQkJbXRrX3Y0bDJfZXJyKCJbVlBVXSB2cHUgZGV2aWNlIGlu IG5vdCByZWFkeSIpOw0KPiA+IC0JCXJldHVybiAtRVBST0JFX0RFRkVSOw0KPiA+ICsJaWYgKCFv Zl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgIm1lZGlhdGVrLHZwdSIsDQo+ ID4gKwkJCQkgICZycHJvY19waGFuZGxlKSkgew0KPiA+ICsJCWZ3X3R5cGUgPSBWUFU7DQo+ID4g Kwl9IGVsc2Ugew0KPiA+ICsJCW10a192NGwyX2VycigiQ291bGQgbm90IGdldCB2ZGVjIElQSSBk ZXZpY2UiKTsNCj4gPiArCQlyZXR1cm4gLUVOT0RFVjsNCj4gPiAgCX0NCj4gPiAtDQo+ID4gLQl2 cHVfd2R0X3JlZ19oYW5kbGVyKGRldi0+dnB1X3BsYXRfZGV2LCBtdGtfdmNvZGVjX2RlY19yZXNl dF9oYW5kbGVyLA0KPiA+IC0JCQlkZXYsIFZQVV9SU1RfREVDKTsNCj4gPiArCWRldi0+ZndfaGFu ZGxlciA9IG10a192Y29kZWNfZndfc2VsZWN0KGRldiwgZndfdHlwZSwgVlBVX1JTVF9ERUMpOw0K PiA+ICsJaWYgKElTX0VSUihkZXYtPmZ3X2hhbmRsZXIpKQ0KPiA+ICsJCXJldHVybiBQVFJfRVJS KGRldi0+ZndfaGFuZGxlcik7DQo+ID4gIA0KPiA+ICAJcmV0ID0gbXRrX3Zjb2RlY19pbml0X2Rl Y19wbShkZXYpOw0KPiA+ICAJaWYgKHJldCA8IDApIHsNCj4gPiAgCQlkZXZfZXJyKCZwZGV2LT5k ZXYsICJGYWlsZWQgdG8gZ2V0IG10IHZjb2RlYyBjbG9jayBzb3VyY2UiKTsNCj4gPiAtCQlyZXR1 cm4gcmV0Ow0KPiA+ICsJCWdvdG8gZXJyX2RlY19wbTsNCj4gPiAgCX0NCj4gPiAgDQo+ID4gIAlm b3IgKGkgPSAwOyBpIDwgTlVNX01BWF9WREVDX1JFR19CQVNFOyBpKyspIHsNCj4gPiBAQCAtMzUy LDYgKzMzOSw4IEBAIHN0YXRpYyBpbnQgbXRrX3Zjb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQ0KPiA+ICAJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rl dik7DQo+ID4gIGVycl9yZXM6DQo+ID4gIAltdGtfdmNvZGVjX3JlbGVhc2VfZGVjX3BtKGRldik7 DQo+ID4gK2Vycl9kZWNfcG06DQo+ID4gKwltdGtfdmNvZGVjX2Z3X3JlbGVhc2UoZGV2LT5md19o YW5kbGVyKTsNCj4gPiAgCXJldHVybiByZXQ7DQo+ID4gIH0NCj4gPiAgDQo+ID4gQEAgLTM3Niw2 ICszNjUsNyBAQCBzdGF0aWMgaW50IG10a192Y29kZWNfZGVjX3JlbW92ZShzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2KQ0KPiA+ICANCj4gPiAgCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRl di0+djRsMl9kZXYpOw0KPiA+ICAJbXRrX3Zjb2RlY19yZWxlYXNlX2RlY19wbShkZXYpOw0KPiA+ ICsJbXRrX3Zjb2RlY19md19yZWxlYXNlKGRldi0+ZndfaGFuZGxlcik7DQo+ID4gIAlyZXR1cm4g MDsNCj4gPiAgfQ0KPiA+ICANCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9y bS9tdGstdmNvZGVjL210a192Y29kZWNfZGVjX3BtLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3Jt L210ay12Y29kZWMvbXRrX3Zjb2RlY19kZWNfcG0uYw0KPiA+IGluZGV4IDVhNmVjOGZiNTJkYS4u MzZkZmUzZmMwNTZhIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRr LXZjb2RlYy9tdGtfdmNvZGVjX2RlY19wbS5jDQo+ID4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZGVjX3BtLmMNCj4gPiBAQCAtMTIsNyArMTIsNiBA QA0KPiA+ICANCj4gPiAgI2luY2x1ZGUgIm10a192Y29kZWNfZGVjX3BtLmgiDQo+ID4gICNpbmNs dWRlICJtdGtfdmNvZGVjX3V0aWwuaCINCj4gPiAtI2luY2x1ZGUgIm10a192cHUuaCINCj4gPiAg DQo+ID4gIGludCBtdGtfdmNvZGVjX2luaXRfZGVjX3BtKHN0cnVjdCBtdGtfdmNvZGVjX2RldiAq bXRrZGV2KQ0KPiA+ICB7DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0v bXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Rydi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGst dmNvZGVjL210a192Y29kZWNfZHJ2LmgNCj4gPiBpbmRleCA5ZmQ1NmRlZTdmZDEuLmUxMzJjNGVj NDYzYSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMv bXRrX3Zjb2RlY19kcnYuaA0KPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZj b2RlYy9tdGtfdmNvZGVjX2Rydi5oDQo+ID4gQEAgLTMwOSwxMyArMzA5LDEzIEBAIHN0cnVjdCBt dGtfdmNvZGVjX2N0eCB7DQo+ID4gICAqIEBtMm1fZGV2X2RlYzogbTJtIGRldmljZSBmb3IgZGVj b2Rlcg0KPiA+ICAgKiBAbTJtX2Rldl9lbmM6IG0ybSBkZXZpY2UgZm9yIGVuY29kZXIuDQo+ID4g ICAqIEBwbGF0X2RldjogcGxhdGZvcm0gZGV2aWNlDQo+ID4gLSAqIEB2cHVfcGxhdF9kZXY6IG10 ayB2cHUgcGxhdGZvcm0gZGV2aWNlDQo+ID4gICAqIEBjdHhfbGlzdDogbGlzdCBvZiBzdHJ1Y3Qg bXRrX3Zjb2RlY19jdHgNCj4gPiAgICogQGlycWxvY2s6IHByb3RlY3QgZGF0YSBhY2Nlc3MgYnkg aXJxIGhhbmRsZXIgYW5kIHdvcmsgdGhyZWFkDQo+ID4gICAqIEBjdXJyX2N0eDogVGhlIGNvbnRl eHQgdGhhdCBpcyB3YWl0aW5nIGZvciBjb2RlYyBoYXJkd2FyZQ0KPiA+ICAgKg0KPiA+ICAgKiBA cmVnX2Jhc2U6IE1hcHBlZCBhZGRyZXNzIG9mIE1USyBWY29kZWMgcmVnaXN0ZXJzLg0KPiA+ICAg Kg0KPiA+ICsgKiBAZndfaGFuZGxlcjogdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBmaXJt d2FyZS4NCj4gPiAgICogQGlkX2NvdW50ZXI6IHVzZWQgdG8gaWRlbnRpZnkgY3VycmVudCBvcGVu ZWQgaW5zdGFuY2UNCj4gPiAgICoNCj4gPiAgICogQGVuY29kZV93b3JrcXVldWU6IGVuY29kZSB3 b3JrIHF1ZXVlDQo+ID4gQEAgLTM0NCwxMiArMzQ0LDEzIEBAIHN0cnVjdCBtdGtfdmNvZGVjX2Rl diB7DQo+ID4gIAlzdHJ1Y3QgdjRsMl9tMm1fZGV2ICptMm1fZGV2X2RlYzsNCj4gPiAgCXN0cnVj dCB2NGwyX20ybV9kZXYgKm0ybV9kZXZfZW5jOw0KPiA+ICAJc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGxhdF9kZXY7DQo+ID4gLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp2cHVfcGxhdF9kZXY7 DQo+ID4gIAlzdHJ1Y3QgbGlzdF9oZWFkIGN0eF9saXN0Ow0KPiA+ICAJc3BpbmxvY2tfdCBpcnFs b2NrOw0KPiA+ICAJc3RydWN0IG10a192Y29kZWNfY3R4ICpjdXJyX2N0eDsNCj4gPiAgCXZvaWQg X19pb21lbSAqcmVnX2Jhc2VbTlVNX01BWF9WQ09ERUNfUkVHX0JBU0VdOw0KPiA+ICANCj4gPiAr CXN0cnVjdCBtdGtfdmNvZGVjX2Z3ICpmd19oYW5kbGVyOw0KPiA+ICsNCj4gPiAgCXVuc2lnbmVk IGxvbmcgaWRfY291bnRlcjsNCj4gPiAgDQo+ID4gIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAq ZGVjb2RlX3dvcmtxdWV1ZTsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9y bS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9y bS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jDQo+ID4gaW5kZXggNGQzMWYxZWQxMTNm Li40MzQwZWExMGFmZDAgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9t dGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jDQo+ID4gKysrIGIvZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jDQo+ID4gQEAgLTIxLDcgKzIx LDcgQEANCj4gPiAgI2luY2x1ZGUgIm10a192Y29kZWNfZW5jX3BtLmgiDQo+ID4gICNpbmNsdWRl ICJtdGtfdmNvZGVjX2ludHIuaCINCj4gPiAgI2luY2x1ZGUgIm10a192Y29kZWNfdXRpbC5oIg0K PiA+IC0jaW5jbHVkZSAibXRrX3ZwdS5oIg0KPiA+ICsjaW5jbHVkZSAibXRrX3Zjb2RlY19mdy5o Ig0KPiA+ICANCj4gPiAgbW9kdWxlX3BhcmFtKG10a192NGwyX2RiZ19sZXZlbCwgaW50LCBTX0lS VUdPIHwgU19JV1VTUik7DQo+ID4gIG1vZHVsZV9wYXJhbShtdGtfdmNvZGVjX2RiZywgYm9vbCwg U19JUlVHTyB8IFNfSVdVU1IpOw0KPiA+IEBAIC0xMDEsMjIgKzEwMSw2IEBAIHN0YXRpYyBpcnFy ZXR1cm5fdCBtdGtfdmNvZGVjX2VuY19sdF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2 KQ0KPiA+ICAJcmV0dXJuIElSUV9IQU5ETEVEOw0KPiA+ICB9DQo+ID4gIA0KPiA+IC1zdGF0aWMg dm9pZCBtdGtfdmNvZGVjX2VuY19yZXNldF9oYW5kbGVyKHZvaWQgKnByaXYpDQo+ID4gLXsNCj4g PiAtCXN0cnVjdCBtdGtfdmNvZGVjX2RldiAqZGV2ID0gcHJpdjsNCj4gPiAtCXN0cnVjdCBtdGtf dmNvZGVjX2N0eCAqY3R4Ow0KPiA+IC0NCj4gPiAtCW10a192NGwyX2RlYnVnKDAsICJXYXRjaGRv ZyB0aW1lb3V0ISEiKTsNCj4gPiAtDQo+ID4gLQltdXRleF9sb2NrKCZkZXYtPmRldl9tdXRleCk7 DQo+ID4gLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJmRldi0+Y3R4X2xpc3QsIGxpc3QpIHsN Cj4gPiAtCQljdHgtPnN0YXRlID0gTVRLX1NUQVRFX0FCT1JUOw0KPiA+IC0JCW10a192NGwyX2Rl YnVnKDAsICJbJWRdIENoYW5nZSB0byBzdGF0ZSBNVEtfU1RBVEVfQUJPUlQiLA0KPiA+IC0JCQkJ Y3R4LT5pZCk7DQo+ID4gLQl9DQo+ID4gLQltdXRleF91bmxvY2soJmRldi0+ZGV2X211dGV4KTsN Cj4gPiAtfQ0KPiA+IC0NCj4gDQo+IEFmdGVyIHVzaW5nIGFic3RyYWN0IGZpcm13YXJlIGludGVy ZmFjZSwgaG93IGRvZXMgZHJpdmVyIHByb2Nlc3MNCj4gd2F0Y2hkb2cgdGltZW91dD8NCj4gDQo+ ID4gIHN0YXRpYyBpbnQgZm9wc192Y29kZWNfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkNCj4gPiAg ew0KPiA+ICAJc3RydWN0IG10a192Y29kZWNfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUp Ow0KPiA+IEBAIC0xNTksMTAgKzE0MywxMCBAQCBzdGF0aWMgaW50IGZvcHNfdmNvZGVjX29wZW4o c3RydWN0IGZpbGUgKmZpbGUpDQo+ID4gIA0KPiA+ICAJaWYgKHY0bDJfZmhfaXNfc2luZ3VsYXIo JmN0eC0+ZmgpKSB7DQo+ID4gIAkJLyoNCj4gPiAtCQkgKiB2cHVfbG9hZF9maXJtd2FyZSBjaGVj a3MgaWYgaXQgd2FzIGxvYWRlZCBhbHJlYWR5IGFuZA0KPiA+ICsJCSAqIGxvYWQgZmlyZXdhcmUg dG8gY2hlY2tzIGlmIGl0IHdhcyBsb2FkZWQgYWxyZWFkeSBhbmQNCj4gPiAgCQkgKiBkb2VzIG5v dGhpbmcgaW4gdGhhdCBjYXNlDQo+ID4gIAkJICovDQo+ID4gLQkJcmV0ID0gdnB1X2xvYWRfZmly bXdhcmUoZGV2LT52cHVfcGxhdF9kZXYpOw0KPiA+ICsJCXJldCA9IG10a192Y29kZWNfZndfbG9h ZF9maXJtd2FyZShkZXYtPmZ3X2hhbmRsZXIpOw0KPiA+ICAJCWlmIChyZXQgPCAwKSB7DQo+ID4g IAkJCS8qDQo+ID4gIAkJCSAqIFJldHVybiAwIGlmIGRvd25sb2FkaW5nIGZpcm13YXJlIHN1Y2Nl c3NmdWxseSwNCj4gPiBAQCAtMTczLDcgKzE1Nyw3IEBAIHN0YXRpYyBpbnQgZm9wc192Y29kZWNf b3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkNCj4gPiAgCQl9DQo+ID4gIA0KPiA+ICAJCWRldi0+ZW5j X2NhcGFiaWxpdHkgPQ0KPiA+IC0JCQl2cHVfZ2V0X3ZlbmNfaHdfY2FwYShkZXYtPnZwdV9wbGF0 X2Rldik7DQo+ID4gKwkJCW10a192Y29kZWNfZndfZ2V0X3ZlbmNfY2FwYShkZXYtPmZ3X2hhbmRs ZXIpOw0KPiA+ICAJCW10a192NGwyX2RlYnVnKDAsICJlbmNvZGVyIGNhcGFiaWxpdHkgJXgiLCBk ZXYtPmVuY19jYXBhYmlsaXR5KTsNCj4gPiAgCX0NCj4gPiAgDQo+ID4gQEAgLTIzNSw2ICsyMTks OCBAQCBzdGF0aWMgaW50IG10a192Y29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikNCj4gPiAgCXN0cnVjdCBtdGtfdmNvZGVjX2RldiAqZGV2Ow0KPiA+ICAJc3RydWN0IHZp ZGVvX2RldmljZSAqdmZkX2VuYzsNCj4gPiAgCXN0cnVjdCByZXNvdXJjZSAqcmVzOw0KPiA+ICsJ cGhhbmRsZSBycHJvY19waGFuZGxlOw0KPiA+ICsJZW51bSBtdGtfdmNvZGVjX2Z3X3R5cGUgZndf dHlwZTsNCj4gPiAgCWludCBpLCBqLCByZXQ7DQo+ID4gIA0KPiA+ICAJZGV2ID0gZGV2bV9remFs bG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7DQo+ID4gQEAgLTI0NCwx OSArMjMwLDIxIEBAIHN0YXRpYyBpbnQgbXRrX3Zjb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQ0KPiA+ICAJSU5JVF9MSVNUX0hFQUQoJmRldi0+Y3R4X2xpc3QpOw0KPiA+ ICAJZGV2LT5wbGF0X2RldiA9IHBkZXY7DQo+ID4gIA0KPiA+IC0JZGV2LT52cHVfcGxhdF9kZXYg PSB2cHVfZ2V0X3BsYXRfZGV2aWNlKGRldi0+cGxhdF9kZXYpOw0KPiA+IC0JaWYgKGRldi0+dnB1 X3BsYXRfZGV2ID09IE5VTEwpIHsNCj4gPiAtCQltdGtfdjRsMl9lcnIoIltWUFVdIHZwdSBkZXZp Y2UgaW4gbm90IHJlYWR5Iik7DQo+ID4gLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7DQo+ID4gKwlp ZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAibWVkaWF0ZWssdnB1 IiwNCj4gPiArCQkJCSAgJnJwcm9jX3BoYW5kbGUpKSB7DQo+ID4gKwkJZndfdHlwZSA9IFZQVTsN Cj4gPiArCX0gZWxzZSB7DQo+ID4gKwkJbXRrX3Y0bDJfZXJyKCJDb3VsZCBub3QgZ2V0IHZlbmMg SVBJIGRldmljZSIpOw0KPiA+ICsJCXJldHVybiAtRU5PREVWOw0KPiA+ICAJfQ0KPiA+IC0NCj4g PiAtCXZwdV93ZHRfcmVnX2hhbmRsZXIoZGV2LT52cHVfcGxhdF9kZXYsIG10a192Y29kZWNfZW5j X3Jlc2V0X2hhbmRsZXIsDQo+ID4gLQkJCQlkZXYsIFZQVV9SU1RfRU5DKTsNCj4gPiArCWRldi0+ ZndfaGFuZGxlciA9IG10a192Y29kZWNfZndfc2VsZWN0KGRldiwgZndfdHlwZSwgVlBVX1JTVF9F TkMpOw0KPiA+ICsJaWYgKElTX0VSUihkZXYtPmZ3X2hhbmRsZXIpKQ0KPiA+ICsJCXJldHVybiBQ VFJfRVJSKGRldi0+ZndfaGFuZGxlcik7DQo+ID4gIA0KPiA+ICAJcmV0ID0gbXRrX3Zjb2RlY19p bml0X2VuY19wbShkZXYpOw0KPiA+ICAJaWYgKHJldCA8IDApIHsNCj4gPiAgCQlkZXZfZXJyKCZw ZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IG10IHZjb2RlYyBjbG9jayBzb3VyY2UhIik7DQo+ID4g LQkJcmV0dXJuIHJldDsNCj4gPiArCQlnb3RvIGVycl9lbmNfcG07DQo+ID4gIAl9DQo+ID4gIA0K PiA+ICAJZm9yIChpID0gVkVOQ19TWVMsIGogPSAwOyBpIDwgTlVNX01BWF9WQ09ERUNfUkVHX0JB U0U7IGkrKywgaisrKSB7DQo+ID4gQEAgLTM3Nyw2ICszNjUsOCBAQCBzdGF0aWMgaW50IG10a192 Y29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gPiAgCXY0bDJfZGV2 aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOw0KPiA+ICBlcnJfcmVzOg0KPiA+ICAJbXRr X3Zjb2RlY19yZWxlYXNlX2VuY19wbShkZXYpOw0KPiA+ICtlcnJfZW5jX3BtOg0KPiA+ICsJbXRr X3Zjb2RlY19md19yZWxlYXNlKGRldi0+ZndfaGFuZGxlcik7DQo+ID4gIAlyZXR1cm4gcmV0Ow0K PiA+ICB9DQo+ID4gIA0KPiA+IEBAIC00MDEsNiArMzkxLDcgQEAgc3RhdGljIGludCBtdGtfdmNv ZGVjX2VuY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gPiAgDQo+ID4g IAl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsNCj4gPiAgCW10a192Y29k ZWNfcmVsZWFzZV9lbmNfcG0oZGV2KTsNCj4gPiArCW10a192Y29kZWNfZndfcmVsZWFzZShkZXYt PmZ3X2hhbmRsZXIpOw0KPiA+ICAJcmV0dXJuIDA7DQo+ID4gIH0NCj4gPiAgDQo+ID4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuY19w bS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX3Bt LmMNCj4gPiBpbmRleCAzZTJiZmRlZDc5YTYuLmVlMjI5MDJhYWE3MSAxMDA2NDQNCj4gPiAtLS0g YS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfcG0uYw0K PiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Vu Y19wbS5jDQo+ID4gQEAgLTEyLDggKzEyLDYgQEANCj4gPiAgDQo+ID4gICNpbmNsdWRlICJtdGtf dmNvZGVjX2VuY19wbS5oIg0KPiA+ICAjaW5jbHVkZSAibXRrX3Zjb2RlY191dGlsLmgiDQo+ID4g LSNpbmNsdWRlICJtdGtfdnB1LmgiDQo+ID4gLQ0KPiA+ICANCj4gPiAgaW50IG10a192Y29kZWNf aW5pdF9lbmNfcG0oc3RydWN0IG10a192Y29kZWNfZGV2ICptdGtkZXYpDQo+ID4gIHsNCj4gPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNf ZncuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Z3LmMN Cj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uOTY3YmIx MDBhOTkwDQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZv cm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Z3LmMNCj4gPiBAQCAtMCwwICsxLDE3MiBAQA0KPiA+ ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KPiA+ICsNCj4gPiArI2luY2x1 ZGUgIm10a192Y29kZWNfZncuaCINCj4gPiArI2luY2x1ZGUgIm10a192Y29kZWNfdXRpbC5oIg0K PiA+ICsjaW5jbHVkZSAibXRrX3Zjb2RlY19kcnYuaCINCj4gPiArDQo+ID4gK3N0cnVjdCBtdGtf dmNvZGVjX2Z3X29wcyB7DQo+ID4gKwlpbnQgKCpsb2FkX2Zpcm13YXJlKShzdHJ1Y3QgbXRrX3Zj b2RlY19mdyAqZncpOw0KPiA+ICsJdW5zaWduZWQgaW50ICgqZ2V0X3ZkZWNfY2FwYSkoc3RydWN0 IG10a192Y29kZWNfZncgKmZ3KTsNCj4gPiArCXVuc2lnbmVkIGludCAoKmdldF92ZW5jX2NhcGEp KHN0cnVjdCBtdGtfdmNvZGVjX2Z3ICpmdyk7DQo+ID4gKwl2b2lkICogKCptYXBfZG1fYWRkciko c3RydWN0IG10a192Y29kZWNfZncgKmZ3LCB1MzIgZHRjbV9kbWVtX2FkZHIpOw0KPiA+ICsJaW50 ICgqaXBpX3JlZ2lzdGVyKShzdHJ1Y3QgbXRrX3Zjb2RlY19mdyAqZncsIGludCBpZCwNCj4gPiAr CQltdGtfdmNvZGVjX2lwaV9oYW5kbGVyIGhhbmRsZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQg KnByaXYpOw0KPiA+ICsJaW50ICgqaXBpX3NlbmQpKHN0cnVjdCBtdGtfdmNvZGVjX2Z3ICpmdywg aW50IGlkLCB2b2lkICpidWYsDQo+ID4gKwkJdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50 IHdhaXQpOw0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RydWN0IG10a192Y29kZWNfZncgew0KPiA+ ICsJZW51bSBtdGtfdmNvZGVjX2Z3X3R5cGUgdHlwZTsNCj4gPiArCWNvbnN0IHN0cnVjdCBtdGtf dmNvZGVjX2Z3X29wcyAqb3BzOw0KPiA+ICsJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsN Cj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgbXRrX3Zjb2RlY192cHVfbG9hZF9maXJt d2FyZShzdHJ1Y3QgbXRrX3Zjb2RlY19mdyAqZncpDQo+ID4gK3sNCj4gPiArCXJldHVybiB2cHVf bG9hZF9maXJtd2FyZShmdy0+cGRldik7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB1bnNp Z25lZCBpbnQgbXRrX3Zjb2RlY192cHVfZ2V0X3ZkZWNfY2FwYShzdHJ1Y3QgbXRrX3Zjb2RlY19m dyAqZncpDQo+ID4gK3sNCj4gPiArCXJldHVybiB2cHVfZ2V0X3ZkZWNfaHdfY2FwYShmdy0+cGRl dik7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXRrX3Zjb2RlY192 cHVfZ2V0X3ZlbmNfY2FwYShzdHJ1Y3QgbXRrX3Zjb2RlY19mdyAqZncpDQo+ID4gK3sNCj4gPiAr CXJldHVybiB2cHVfZ2V0X3ZlbmNfaHdfY2FwYShmdy0+cGRldik7DQo+ID4gK30NCj4gPiArDQo+ ID4gK3N0YXRpYyB2b2lkICptdGtfdmNvZGVjX3ZwdV9tYXBfZG1fYWRkcihzdHJ1Y3QgbXRrX3Zj b2RlY19mdyAqZncsDQo+ID4gKwkJCQkJdTMyIGR0Y21fZG1lbV9hZGRyKQ0KPiA+ICt7DQo+ID4g KwlyZXR1cm4gdnB1X21hcHBpbmdfZG1fYWRkcihmdy0+cGRldiwgZHRjbV9kbWVtX2FkZHIpOw0K PiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IG10a192Y29kZWNfdnB1X3NldF9pcGlfcmVn aXN0ZXIoc3RydWN0IG10a192Y29kZWNfZncgKmZ3LCBpbnQgaWQsDQo+ID4gKwkJbXRrX3Zjb2Rl Y19pcGlfaGFuZGxlciBoYW5kbGVyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwcml2KQ0KPiA+ ICt7DQo+ID4gKwkvKg0KPiA+ICsJICogVGhlIGhhbmRsZXIgd2UgcmVjZWl2ZSB0YWtlcyBhIHZv aWQgKiBhcyBpdHMgZmlyc3QgYXJndW1lbnQuIFdlDQo+ID4gKwkgKiBjYW5ub3QgY2hhbmdlIHRo aXMgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSBwYXNzZWQgZG93biB0byB0aGUgcnByb2MNCj4gPiAr CSAqIHN1YnN5c3RlbSB3aGVuIFNDUCBpcyB1c2VkLiBWUFUgdGFrZXMgYSBjb25zdCBhcmd1bWVu dCwgd2hpY2ggaXMNCj4gPiArCSAqIG1vcmUgY29uc3RyYWluZWQsIHNvIHRoZSBjb252ZXJzaW9u IGJlbG93IGlzIHNhZmUuDQo+ID4gKwkgKi8NCj4gPiArCWlwaV9oYW5kbGVyX3QgaGFuZGxlcl9j b25zdCA9IChpcGlfaGFuZGxlcl90KWhhbmRsZXI7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIHZwdV9p cGlfcmVnaXN0ZXIoZnctPnBkZXYsIGlkLCBoYW5kbGVyX2NvbnN0LCBuYW1lLCBwcml2KTsNCj4g PiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBtdGtfdmNvZGVjX3ZwdV9pcGlfc2VuZChzdHJ1 Y3QgbXRrX3Zjb2RlY19mdyAqZncsIGludCBpZCwgdm9pZCAqYnVmLA0KPiA+ICsJCXVuc2lnbmVk IGludCBsZW4sIHVuc2lnbmVkIGludCB3YWl0KQ0KPiA+ICt7DQo+ID4gKwlyZXR1cm4gdnB1X2lw aV9zZW5kKGZ3LT5wZGV2LCBpZCwgYnVmLCBsZW4pOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IG10a192Y29kZWNfZndfb3BzIG10a192Y29kZWNfdnB1X21zZyA9IHsN Cj4gPiArCS5sb2FkX2Zpcm13YXJlID0gbXRrX3Zjb2RlY192cHVfbG9hZF9maXJtd2FyZSwNCj4g PiArCS5nZXRfdmRlY19jYXBhID0gbXRrX3Zjb2RlY192cHVfZ2V0X3ZkZWNfY2FwYSwNCj4gPiAr CS5nZXRfdmVuY19jYXBhID0gbXRrX3Zjb2RlY192cHVfZ2V0X3ZlbmNfY2FwYSwNCj4gPiArCS5t YXBfZG1fYWRkciA9IG10a192Y29kZWNfdnB1X21hcF9kbV9hZGRyLA0KPiA+ICsJLmlwaV9yZWdp c3RlciA9IG10a192Y29kZWNfdnB1X3NldF9pcGlfcmVnaXN0ZXIsDQo+ID4gKwkuaXBpX3NlbmQg PSBtdGtfdmNvZGVjX3ZwdV9pcGlfc2VuZCwNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyB2 b2lkIG10a192Y29kZWNfcmVzZXRfaGFuZGxlcih2b2lkICpwcml2KQ0KPiA+ICt7DQo+ID4gKwlz dHJ1Y3QgbXRrX3Zjb2RlY19kZXYgKmRldiA9IHByaXY7DQo+ID4gKwlzdHJ1Y3QgbXRrX3Zjb2Rl Y19jdHggKmN0eDsNCj4gPiArDQo+ID4gKwltdGtfdjRsMl9lcnIoIldhdGNoZG9nIHRpbWVvdXQh ISIpOw0KPiA+ICsNCj4gPiArCW11dGV4X2xvY2soJmRldi0+ZGV2X211dGV4KTsNCj4gPiArCWxp c3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmZGV2LT5jdHhfbGlzdCwgbGlzdCkgew0KPiA+ICsJCWN0 eC0+c3RhdGUgPSBNVEtfU1RBVEVfQUJPUlQ7DQo+ID4gKwkJbXRrX3Y0bDJfZGVidWcoMCwgIlsl ZF0gQ2hhbmdlIHRvIHN0YXRlIE1US19TVEFURV9BQk9SVCIsDQo+ID4gKwkJCQljdHgtPmlkKTsN Cj4gPiArCX0NCj4gPiArCW11dGV4X3VubG9jaygmZGV2LT5kZXZfbXV0ZXgpOw0KPiA+ICt9DQo+ ID4gKw0KPiA+ICtzdHJ1Y3QgbXRrX3Zjb2RlY19mdyAqbXRrX3Zjb2RlY19md19zZWxlY3Qoc3Ry dWN0IG10a192Y29kZWNfZGV2ICpkZXYsDQo+ID4gKwkJCQkJICAgZW51bSBtdGtfdmNvZGVjX2Z3 X3R5cGUgdHlwZSwNCj4gPiArCQkJCQkgICBlbnVtIHJzdF9pZCByc3RfaWQpDQo+ID4gK3sNCj4g PiArCWNvbnN0IHN0cnVjdCBtdGtfdmNvZGVjX2Z3X29wcyAqb3BzOw0KPiA+ICsJc3RydWN0IG10 a192Y29kZWNfZncgKmZ3Ow0KPiA+ICsJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZndfcGRldiA9 IE5VTEw7DQo+ID4gKw0KPiA+ICsJc3dpdGNoICh0eXBlKSB7DQo+ID4gKwljYXNlIFZQVToNCj4g PiArCQlvcHMgPSAmbXRrX3Zjb2RlY192cHVfbXNnOw0KPiA+ICsJCWZ3X3BkZXYgPSB2cHVfZ2V0 X3BsYXRfZGV2aWNlKGRldi0+cGxhdF9kZXYpOw0KPiA+ICsJCWlmICghZndfcGRldikgew0KPiA+ ICsJCQltdGtfdjRsMl9lcnIoImZpcm13YXJlIGRldmljZSBpcyBub3QgcmVhZHkiKTsNCj4gPiAr CQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7DQo+ID4gKwkJfQ0KPiA+ICsJCXZwdV93ZHRfcmVn X2hhbmRsZXIoZndfcGRldiwgbXRrX3Zjb2RlY19yZXNldF9oYW5kbGVyLA0KPiA+ICsJCQkJICAg IGRldiwgcnN0X2lkKTsNCj4gPiArCQlicmVhazsNCj4gPiArCWRlZmF1bHQ6DQo+ID4gKwkJbXRr X3Y0bDJfZXJyKCJpbnZhbGlkIHZjb2RlYyBmdyB0eXBlIik7DQo+ID4gKwkJcmV0dXJuIEVSUl9Q VFIoLUVJTlZBTCk7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJZncgPSBkZXZtX2t6YWxsb2MoJmRl di0+cGxhdF9kZXYtPmRldiwgc2l6ZW9mKCpmdyksIEdGUF9LRVJORUwpOw0KPiA+ICsJaWYgKCFm dykNCj4gPiArCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsNCj4gPiArDQo+ID4gKwlmdy0+dHlw ZSA9IHR5cGU7DQo+ID4gKwlmdy0+b3BzID0gb3BzOw0KPiA+ICsJZnctPnBkZXYgPSBmd19wZGV2 Ow0KPiA+ICsNCj4gPiArCXJldHVybiBmdzsNCj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQ TChtdGtfdmNvZGVjX2Z3X3NlbGVjdCk7DQo+ID4gKw0KPiA+ICt2b2lkIG10a192Y29kZWNfZndf cmVsZWFzZShzdHJ1Y3QgbXRrX3Zjb2RlY19mdyAqZncpDQo+ID4gK3sNCj4gPiArCXN3aXRjaCAo ZnctPnR5cGUpIHsNCj4gPiArCWNhc2UgVlBVOg0KPiA+ICsJCXB1dF9kZXZpY2UoJmZ3LT5wZGV2 LT5kZXYpOw0KPiA+ICsJCWJyZWFrOw0KPiA+ICsJfQ0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1C T0xfR1BMKG10a192Y29kZWNfZndfcmVsZWFzZSk7DQo+ID4gKw0KPiA+ICtpbnQgbXRrX3Zjb2Rl Y19md19sb2FkX2Zpcm13YXJlKHN0cnVjdCBtdGtfdmNvZGVjX2Z3ICpmdykNCj4gPiArew0KPiA+ ICsJcmV0dXJuIGZ3LT5vcHMtPmxvYWRfZmlybXdhcmUoZncpOw0KPiA+ICt9DQo+ID4gK0VYUE9S VF9TWU1CT0xfR1BMKG10a192Y29kZWNfZndfbG9hZF9maXJtd2FyZSk7DQo+ID4gKw0KPiA+ICt1 bnNpZ25lZCBpbnQgbXRrX3Zjb2RlY19md19nZXRfdmRlY19jYXBhKHN0cnVjdCBtdGtfdmNvZGVj X2Z3ICpmdykNCj4gPiArew0KPiA+ICsJcmV0dXJuIGZ3LT5vcHMtPmdldF92ZGVjX2NhcGEoZncp Ow0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKG10a192Y29kZWNfZndfZ2V0X3ZkZWNf Y2FwYSk7DQo+ID4gKw0KPiA+ICt1bnNpZ25lZCBpbnQgbXRrX3Zjb2RlY19md19nZXRfdmVuY19j YXBhKHN0cnVjdCBtdGtfdmNvZGVjX2Z3ICpmdykNCj4gPiArew0KPiA+ICsJcmV0dXJuIGZ3LT5v cHMtPmdldF92ZW5jX2NhcGEoZncpOw0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKG10 a192Y29kZWNfZndfZ2V0X3ZlbmNfY2FwYSk7DQo+ID4gKw0KPiA+ICt2b2lkICptdGtfdmNvZGVj X2Z3X21hcF9kbV9hZGRyKHN0cnVjdCBtdGtfdmNvZGVjX2Z3ICpmdywgdTMyIG1lbV9hZGRyKQ0K PiA+ICt7DQo+ID4gKwlyZXR1cm4gZnctPm9wcy0+bWFwX2RtX2FkZHIoZncsIG1lbV9hZGRyKTsN Cj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChtdGtfdmNvZGVjX2Z3X21hcF9kbV9hZGRy KTsNCj4gPiArDQo+ID4gK2ludCBtdGtfdmNvZGVjX2Z3X2lwaV9yZWdpc3RlcihzdHJ1Y3QgbXRr X3Zjb2RlY19mdyAqZncsIGludCBpZCwNCj4gPiArCW10a192Y29kZWNfaXBpX2hhbmRsZXIgaGFu ZGxlciwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcHJpdikNCj4gPiArew0KPiA+ICsJcmV0dXJu IGZ3LT5vcHMtPmlwaV9yZWdpc3RlcihmdywgaWQsIGhhbmRsZXIsIG5hbWUsIHByaXYpOw0KPiA+ ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKG10a192Y29kZWNfZndfaXBpX3JlZ2lzdGVyKTsN Cj4gPiArDQo+ID4gK2ludCBtdGtfdmNvZGVjX2Z3X2lwaV9zZW5kKHN0cnVjdCBtdGtfdmNvZGVj X2Z3ICpmdywNCj4gPiArCWludCBpZCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNp Z25lZCBpbnQgd2FpdCkNCj4gPiArew0KPiA+ICsJcmV0dXJuIGZ3LT5vcHMtPmlwaV9zZW5kKGZ3 LCBpZCwgYnVmLCBsZW4sIHdhaXQpOw0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKG10 a192Y29kZWNfZndfaXBpX3NlbmQpOw0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Bs YXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19mdy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9y bS9tdGstdmNvZGVjL210a192Y29kZWNfZncuaA0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ ID4gaW5kZXggMDAwMDAwMDAwMDAwLi5mZjI1YjBjMTlmNzQNCj4gPiAtLS0gL2Rldi9udWxsDQo+ ID4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZncu aA0KPiA+IEBAIC0wLDAgKzEsMzYgQEANCj4gPiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEdQTC0yLjAgKi8NCj4gPiArDQo+ID4gKyNpZm5kZWYgX01US19WQ09ERUNfRldfSF8NCj4gPiAr I2RlZmluZSBfTVRLX1ZDT0RFQ19GV19IXw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4L3Jl bW90ZXByb2MuaD4NCj4gPiArDQo+ID4gKyNpbmNsdWRlICIuLi9tdGstdnB1L210a192cHUuaCIN Cj4gPiArDQo+ID4gK3N0cnVjdCBtdGtfdmNvZGVjX2RldjsNCj4gPiArDQo+ID4gK2VudW0gbXRr X3Zjb2RlY19md190eXBlIHsNCj4gPiArCVZQVSwNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0cnVj dCBtdGtfdmNvZGVjX2Z3Ow0KPiA+ICsNCj4gPiArdHlwZWRlZiB2b2lkICgqbXRrX3Zjb2RlY19p cGlfaGFuZGxlcikgKHZvaWQgKmRhdGEsDQo+ID4gKwl1bnNpZ25lZCBpbnQgbGVuLCB2b2lkICpw cml2KTsNCj4gPiArDQo+ID4gK3N0cnVjdCBtdGtfdmNvZGVjX2Z3ICptdGtfdmNvZGVjX2Z3X3Nl bGVjdChzdHJ1Y3QgbXRrX3Zjb2RlY19kZXYgKmRldiwNCj4gPiArCQkJCQkgICBlbnVtIG10a192 Y29kZWNfZndfdHlwZSB0eXBlLA0KPiA+ICsJCQkJCSAgIGVudW0gcnN0X2lkIHJzdF9pZCk7DQo+ ID4gK3ZvaWQgbXRrX3Zjb2RlY19md19yZWxlYXNlKHN0cnVjdCBtdGtfdmNvZGVjX2Z3ICpmdyk7 DQo+ID4gKw0KPiA+ICtpbnQgbXRrX3Zjb2RlY19md19sb2FkX2Zpcm13YXJlKHN0cnVjdCBtdGtf dmNvZGVjX2Z3ICpmdyk7DQo+ID4gK3Vuc2lnbmVkIGludCBtdGtfdmNvZGVjX2Z3X2dldF92ZGVj X2NhcGEoc3RydWN0IG10a192Y29kZWNfZncgKmZ3KTsNCj4gPiArdW5zaWduZWQgaW50IG10a192 Y29kZWNfZndfZ2V0X3ZlbmNfY2FwYShzdHJ1Y3QgbXRrX3Zjb2RlY19mdyAqZncpOw0KPiA+ICt2 b2lkICptdGtfdmNvZGVjX2Z3X21hcF9kbV9hZGRyKHN0cnVjdCBtdGtfdmNvZGVjX2Z3ICpmdywg dTMyIG1lbV9hZGRyKTsNCj4gPiAraW50IG10a192Y29kZWNfZndfaXBpX3JlZ2lzdGVyKHN0cnVj dCBtdGtfdmNvZGVjX2Z3ICpmdywgaW50IGlkLA0KPiA+ICsJbXRrX3Zjb2RlY19pcGlfaGFuZGxl ciBoYW5kbGVyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwcml2KTsNCj4gPiAraW50IG10a192 Y29kZWNfZndfaXBpX3NlbmQoc3RydWN0IG10a192Y29kZWNfZncgKmZ3LA0KPiA+ICsJaW50IGlk LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCB3YWl0KTsNCj4gPiAr DQo+ID4gKyNlbmRpZiAvKiBfTVRLX1ZDT0RFQ19GV19IXyAqLw0KPiA+ICsNCj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfdXRpbC5j IGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfdXRpbC5jDQo+ ID4gaW5kZXggZDQ4ZjU0MmRiMWE5Li5hYzU5NzNiNjczNWYgMTAwNjQ0DQo+ID4gLS0tIGEvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfdXRpbC5jDQo+ID4gKysr IGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfdXRpbC5jDQo+ ID4gQEAgLTksNyArOSw2IEBADQo+ID4gIA0KPiA+ICAjaW5jbHVkZSAibXRrX3Zjb2RlY19kcnYu aCINCj4gPiAgI2luY2x1ZGUgIm10a192Y29kZWNfdXRpbC5oIg0KPiA+IC0jaW5jbHVkZSAibXRr X3ZwdS5oIg0KPiA+ICANCj4gPiAgLyogRm9yIGVuY29kZXIsIHRoaXMgd2lsbCBlbmFibGUgbG9n cyBpbiB2ZW5jLyovDQo+ID4gIGJvb2wgbXRrX3Zjb2RlY19kYmc7DQo+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjL3ZkZWNfaDI2NF9pZi5jIGIv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWMvdmRlY19oMjY0X2lmLmMNCj4g PiBpbmRleCA1MDA0OGMxNzBiOTkuLjQwZDZlNmM1YWM3YSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRlYy92ZGVjX2gyNjRfaWYuYw0KPiA+ICsr KyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjL3ZkZWNfaDI2NF9pZi5j DQo+ID4gQEAgLTI4MSw3ICsyODEsNiBAQCBzdGF0aWMgaW50IHZkZWNfaDI2NF9pbml0KHN0cnVj dCBtdGtfdmNvZGVjX2N0eCAqY3R4KQ0KPiA+ICAJaW5zdC0+Y3R4ID0gY3R4Ow0KPiA+ICANCj4g PiAgCWluc3QtPnZwdS5pZCA9IElQSV9WREVDX0gyNjQ7DQo+ID4gLQlpbnN0LT52cHUuZGV2ID0g Y3R4LT5kZXYtPnZwdV9wbGF0X2RldjsNCj4gPiAgCWluc3QtPnZwdS5jdHggPSBjdHg7DQo+ID4g IA0KPiA+ICAJZXJyID0gdnB1X2RlY19pbml0KCZpbnN0LT52cHUpOw0KPiA+IGRpZmYgLS1naXQg YS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRlYy92ZGVjX3ZwOF9pZi5jIGIv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWMvdmRlY192cDhfaWYuYw0KPiA+ IGluZGV4IDYwMTFmZGQ2MGEyMi4uZTUzOTNmODQxMDgwIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZl cnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjL3ZkZWNfdnA4X2lmLmMNCj4gPiArKysg Yi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRlYy92ZGVjX3ZwOF9pZi5jDQo+ ID4gQEAgLTQwMCw3ICs0MDAsNiBAQCBzdGF0aWMgaW50IHZkZWNfdnA4X2luaXQoc3RydWN0IG10 a192Y29kZWNfY3R4ICpjdHgpDQo+ID4gIAlpbnN0LT5jdHggPSBjdHg7DQo+ID4gIA0KPiA+ICAJ aW5zdC0+dnB1LmlkID0gSVBJX1ZERUNfVlA4Ow0KPiA+IC0JaW5zdC0+dnB1LmRldiA9IGN0eC0+ ZGV2LT52cHVfcGxhdF9kZXY7DQo+ID4gIAlpbnN0LT52cHUuY3R4ID0gY3R4Ow0KPiA+ICANCj4g PiAgCWVyciA9IHZwdV9kZWNfaW5pdCgmaW5zdC0+dnB1KTsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWMvdmRlY192cDlfaWYuYyBiL2RyaXZl cnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjL3ZkZWNfdnA5X2lmLmMNCj4gPiBpbmRl eCAyNTdhNWI1YWQyMTIuLjhlMDk5Yjg1OWYyMSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL21l ZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRlYy92ZGVjX3ZwOV9pZi5jDQo+ID4gKysrIGIvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWMvdmRlY192cDlfaWYuYw0KPiA+IEBA IC03OTUsNyArNzk1LDYgQEAgc3RhdGljIGludCB2ZGVjX3ZwOV9pbml0KHN0cnVjdCBtdGtfdmNv ZGVjX2N0eCAqY3R4KQ0KPiA+ICAJaW5zdC0+Y3R4ID0gY3R4Ow0KPiA+ICANCj4gPiAgCWluc3Qt PnZwdS5pZCA9IElQSV9WREVDX1ZQOTsNCj4gPiAtCWluc3QtPnZwdS5kZXYgPSBjdHgtPmRldi0+ dnB1X3BsYXRfZGV2Ow0KPiA+ICAJaW5zdC0+dnB1LmN0eCA9IGN0eDsNCj4gPiAgDQo+ID4gIAlp ZiAodnB1X2RlY19pbml0KCZpbnN0LT52cHUpKSB7DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv bWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjX2Rydl9iYXNlLmggYi9kcml2ZXJzL21lZGlh L3BsYXRmb3JtL210ay12Y29kZWMvdmRlY19kcnZfYmFzZS5oDQo+ID4gaW5kZXggY2ViNGRiNGNi M2JlLi5lOTEzZjk2M2I3ZGIgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9y bS9tdGstdmNvZGVjL3ZkZWNfZHJ2X2Jhc2UuaA0KPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxh dGZvcm0vbXRrLXZjb2RlYy92ZGVjX2Rydl9iYXNlLmgNCj4gPiBAQCAtNyw4ICs3LDYgQEANCj4g PiAgI2lmbmRlZiBfVkRFQ19EUlZfQkFTRV8NCj4gPiAgI2RlZmluZSBfVkRFQ19EUlZfQkFTRV8N Cj4gPiAgDQo+ID4gLSNpbmNsdWRlICJtdGtfdmNvZGVjX2Rydi5oIg0KPiA+IC0NCj4gPiAgI2lu Y2x1ZGUgInZkZWNfZHJ2X2lmLmgiDQo+ID4gIA0KPiA+ICBzdHJ1Y3QgdmRlY19jb21tb25faWYg ew0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRl Y19kcnZfaWYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjX2Rydl9p Zi5jDQo+ID4gaW5kZXggMmU0M2RkNDQ4NmUwLi5iMTg3NDNiOTA2ZWEgMTAwNjQ0DQo+ID4gLS0t IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWNfZHJ2X2lmLmMNCj4gPiAr KysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRlY19kcnZfaWYuYw0KPiA+ IEBAIC0xMyw3ICsxMyw2IEBADQo+ID4gICNpbmNsdWRlICJtdGtfdmNvZGVjX2RlYy5oIg0KPiA+ ICAjaW5jbHVkZSAidmRlY19kcnZfYmFzZS5oIg0KPiA+ICAjaW5jbHVkZSAibXRrX3Zjb2RlY19k ZWNfcG0uaCINCj4gPiAtI2luY2x1ZGUgIm10a192cHUuaCINCj4gPiAgDQo+ID4gIGludCB2ZGVj X2lmX2luaXQoc3RydWN0IG10a192Y29kZWNfY3R4ICpjdHgsIHVuc2lnbmVkIGludCBmb3VyY2Mp DQo+ID4gIHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNv ZGVjL3ZkZWNfdnB1X2lmLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRl Y192cHVfaWYuYw0KPiA+IGluZGV4IDk0OGExMmZkOWQ0Ni4uNThiMGU2ZmE4ZmQyIDEwMDY0NA0K PiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjX3ZwdV9pZi5j DQo+ID4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWNfdnB1X2lm LmMNCj4gPiBAQCAtOCw2ICs4LDcgQEANCj4gPiAgI2luY2x1ZGUgIm10a192Y29kZWNfdXRpbC5o Ig0KPiA+ICAjaW5jbHVkZSAidmRlY19pcGlfbXNnLmgiDQo+ID4gICNpbmNsdWRlICJ2ZGVjX3Zw dV9pZi5oIg0KPiA+ICsjaW5jbHVkZSAibXRrX3Zjb2RlY19mdy5oIg0KPiA+ICANCj4gPiAgc3Rh dGljIHZvaWQgaGFuZGxlX2luaXRfYWNrX21zZyhjb25zdCBzdHJ1Y3QgdmRlY192cHVfaXBpX2lu aXRfYWNrICptc2cpDQo+ID4gIHsNCj4gPiBAQCAtMTgsNyArMTksOCBAQCBzdGF0aWMgdm9pZCBo YW5kbGVfaW5pdF9hY2tfbXNnKGNvbnN0IHN0cnVjdCB2ZGVjX3ZwdV9pcGlfaW5pdF9hY2sgKm1z ZykNCj4gPiAgDQo+ID4gIAkvKiBtYXBwaW5nIFZQVSBhZGRyZXNzIHRvIGtlcm5lbCB2aXJ0dWFs IGFkZHJlc3MgKi8NCj4gPiAgCS8qIHRoZSBjb250ZW50IGluIHZzaSBpcyBpbml0aWFsaXplZCB0 byAwIGluIFZQVSAqLw0KPiA+IC0JdnB1LT52c2kgPSB2cHVfbWFwcGluZ19kbV9hZGRyKHZwdS0+ ZGV2LCBtc2ctPnZwdV9pbnN0X2FkZHIpOw0KPiA+ICsJdnB1LT52c2kgPSBtdGtfdmNvZGVjX2Z3 X21hcF9kbV9hZGRyKHZwdS0+Y3R4LT5kZXYtPmZ3X2hhbmRsZXIsDQo+ID4gKwkJCQkJICAgICBt c2ctPnZwdV9pbnN0X2FkZHIpOw0KPiA+ICAJdnB1LT5pbnN0X2FkZHIgPSBtc2ctPnZwdV9pbnN0 X2FkZHI7DQo+ID4gIA0KPiA+ICAJbXRrX3Zjb2RlY19kZWJ1Zyh2cHUsICItIHZwdV9pbnN0X2Fk ZHIgPSAweCV4IiwgdnB1LT5pbnN0X2FkZHIpOw0KPiA+IEBAIC0zNCw3ICszNiw3IEBAIHN0YXRp YyB2b2lkIGhhbmRsZV9pbml0X2Fja19tc2coY29uc3Qgc3RydWN0IHZkZWNfdnB1X2lwaV9pbml0 X2FjayAqbXNnKQ0KPiA+ICAgKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgaW4gaW50ZXJydXB0IGNvbnRl eHQgYW5kIGl0IG1lYW5zIHRoZXJlJ3MgYW4gSVBJIE1TRw0KPiA+ICAgKiBmcm9tIFZQVS4NCj4g PiAgICovDQo+ID4gLXN0YXRpYyB2b2lkIHZwdV9kZWNfaXBpX2hhbmRsZXIoY29uc3Qgdm9pZCAq ZGF0YSwgdW5zaWduZWQgaW50IGxlbiwgdm9pZCAqcHJpdikNCj4gPiArc3RhdGljIHZvaWQgdnB1 X2RlY19pcGlfaGFuZGxlcih2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCB2b2lkICpwcml2 KQ0KPiA+ICB7DQo+ID4gIAljb25zdCBzdHJ1Y3QgdmRlY192cHVfaXBpX2FjayAqbXNnID0gZGF0 YTsNCj4gPiAgCXN0cnVjdCB2ZGVjX3ZwdV9pbnN0ICp2cHUgPSAoc3RydWN0IHZkZWNfdnB1X2lu c3QgKikNCj4gPiBAQCAtNzQsNyArNzYsOCBAQCBzdGF0aWMgaW50IHZjb2RlY192cHVfc2VuZF9t c2coc3RydWN0IHZkZWNfdnB1X2luc3QgKnZwdSwgdm9pZCAqbXNnLCBpbnQgbGVuKQ0KPiA+ICAJ dnB1LT5mYWlsdXJlID0gMDsNCj4gPiAgCXZwdS0+c2lnbmFsZWQgPSAwOw0KPiA+ICANCj4gPiAt CWVyciA9IHZwdV9pcGlfc2VuZCh2cHUtPmRldiwgdnB1LT5pZCwgbXNnLCBsZW4pOw0KPiA+ICsJ ZXJyID0gbXRrX3Zjb2RlY19md19pcGlfc2VuZCh2cHUtPmN0eC0+ZGV2LT5md19oYW5kbGVyLCB2 cHUtPmlkLCBtc2csDQo+ID4gKwkJCQkgICAgIGxlbiwgMjAwMCk7DQo+ID4gIAlpZiAoZXJyKSB7 DQo+ID4gIAkJbXRrX3Zjb2RlY19lcnIodnB1LCAic2VuZCBmYWlsIHZwdV9pZD0lZCBtc2dfaWQ9 JVggc3RhdHVzPSVkIiwNCj4gPiAgCQkJICAgICAgIHZwdS0+aWQsICoodWludDMyX3QgKiltc2cs IGVycik7DQo+ID4gQEAgLTExMCw3ICsxMTMsOCBAQCBpbnQgdnB1X2RlY19pbml0KHN0cnVjdCB2 ZGVjX3ZwdV9pbnN0ICp2cHUpDQo+ID4gIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2cHUtPndxKTsN Cj4gPiAgCXZwdS0+aGFuZGxlciA9IHZwdV9kZWNfaXBpX2hhbmRsZXI7DQo+ID4gIA0KPiA+IC0J ZXJyID0gdnB1X2lwaV9yZWdpc3Rlcih2cHUtPmRldiwgdnB1LT5pZCwgdnB1LT5oYW5kbGVyLCAi dmRlYyIsIE5VTEwpOw0KPiA+ICsJZXJyID0gbXRrX3Zjb2RlY19md19pcGlfcmVnaXN0ZXIodnB1 LT5jdHgtPmRldi0+ZndfaGFuZGxlciwgdnB1LT5pZCwNCj4gPiArCQkJCQkgdnB1LT5oYW5kbGVy LCAidmRlYyIsIE5VTEwpOw0KPiA+ICAJaWYgKGVyciAhPSAwKSB7DQo+ID4gIAkJbXRrX3Zjb2Rl Y19lcnIodnB1LCAidnB1X2lwaV9yZWdpc3RlciBmYWlsIHN0YXR1cz0lZCIsIGVycik7DQo+ID4g IAkJcmV0dXJuIGVycjsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9t dGstdmNvZGVjL3ZkZWNfdnB1X2lmLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29k ZWMvdmRlY192cHVfaWYuaA0KPiA+IGluZGV4IGY3NzliMDY3NmZiZC4uODUyMjRlYjdlMzRiIDEw MDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjX3Zw dV9pZi5oDQo+ID4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWNf dnB1X2lmLmgNCj4gPiBAQCAtNywxMSArNywxMyBAQA0KPiA+ICAjaWZuZGVmIF9WREVDX1ZQVV9J Rl9IXw0KPiA+ICAjZGVmaW5lIF9WREVDX1ZQVV9JRl9IXw0KPiA+ICANCj4gPiAtI2luY2x1ZGUg Im10a192cHUuaCINCj4gPiArI2luY2x1ZGUgIm10a192Y29kZWNfZncuaCINCj4gPiArDQo+ID4g K3N0cnVjdCBtdGtfdmNvZGVjX2N0eDsNCj4gPiAgDQo+ID4gIC8qKg0KPiA+ICAgKiBzdHJ1Y3Qg dmRlY192cHVfaW5zdCAtIFZQVSBpbnN0YW5jZSBmb3IgdmlkZW8gY29kZWMNCj4gPiAtICogQGlw aV9pZCAgICAgIDogaXBpIGlkIGZvciBlYWNoIGRlY29kZXINCj4gPiArICogQGlkICAgICAgICAg IDogaXBpIG1zZyBpZCBmb3IgZWFjaCBkZWNvZGVyDQo+ID4gICAqIEB2c2kgICAgICAgICA6IGRy aXZlciBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IFZQVSBzaWRlIGFuZCBzaGFyZWQgdG8gQVAgc2lk ZQ0KPiA+ICAgKiAgICAgICAgICAgICAgICBmb3IgY29udHJvbCBhbmQgaW5mbyBzaGFyZQ0KPiA+ ICAgKiBAZmFpbHVyZSAgICAgOiBWUFUgZXhlY3V0aW9uIHJlc3VsdCBzdGF0dXMsIDA6IHN1Y2Nl c3MsIG90aGVyczogZmFpbA0KPiA+IEBAIC0yMywxNSArMjUsMTQgQEANCj4gPiAgICogQGhhbmRs ZXIgICAgIDogaXBpIGhhbmRsZXIgZm9yIGVhY2ggZGVjb2Rlcg0KPiA+ICAgKi8NCj4gPiAgc3Ry dWN0IHZkZWNfdnB1X2luc3Qgew0KPiA+IC0JZW51bSBpcGlfaWQgaWQ7DQo+ID4gKwlpbnQgaWQ7 DQo+ID4gIAl2b2lkICp2c2k7DQo+ID4gIAlpbnQzMl90IGZhaWx1cmU7DQo+ID4gIAl1aW50MzJf dCBpbnN0X2FkZHI7DQo+ID4gIAl1bnNpZ25lZCBpbnQgc2lnbmFsZWQ7DQo+ID4gIAlzdHJ1Y3Qg bXRrX3Zjb2RlY19jdHggKmN0eDsNCj4gPiAtCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsN Cj4gPiAgCXdhaXRfcXVldWVfaGVhZF90IHdxOw0KPiA+IC0JaXBpX2hhbmRsZXJfdCBoYW5kbGVy Ow0KPiA+ICsJbXRrX3Zjb2RlY19pcGlfaGFuZGxlciBoYW5kbGVyOw0KPiA+ICB9Ow0KPiA+ICAN Cj4gPiAgLyoqDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZj b2RlYy92ZW5jL3ZlbmNfaDI2NF9pZi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNv ZGVjL3ZlbmMvdmVuY19oMjY0X2lmLmMNCj4gPiBpbmRleCBiOTYyNGY4ZGYwZTkuLjdhMDBmMDUw ZWMzNiAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMv dmVuYy92ZW5jX2gyNjRfaWYuYw0KPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRr LXZjb2RlYy92ZW5jL3ZlbmNfaDI2NF9pZi5jDQo+ID4gQEAgLTE4LDcgKzE4LDYgQEANCj4gPiAg I2luY2x1ZGUgIi4uL3ZlbmNfZHJ2X2Jhc2UuaCINCj4gPiAgI2luY2x1ZGUgIi4uL3ZlbmNfaXBp X21zZy5oIg0KPiA+ICAjaW5jbHVkZSAiLi4vdmVuY192cHVfaWYuaCINCj4gPiAtI2luY2x1ZGUg Im10a192cHUuaCINCj4gPiAgDQo+ID4gIHN0YXRpYyBjb25zdCBjaGFyIGgyNjRfZmlsbGVyX21h cmtlcltdID0gezB4MCwgMHgwLCAweDAsIDB4MSwgMHhjfTsNCj4gPiAgDQo+ID4gQEAgLTI1Nyw4 ICsyNTYsMTEgQEAgc3RhdGljIGludCBoMjY0X2VuY19hbGxvY193b3JrX2J1ZihzdHJ1Y3QgdmVu Y19oMjY0X2luc3QgKmluc3QpDQo+ID4gIAkJICovDQo+ID4gIAkJaW5zdC0+d29ya19idWZzW2ld LnNpemUgPSB3YltpXS5zaXplOw0KPiA+ICAJCWlmIChpID09IFZFTkNfSDI2NF9WUFVfV09SS19C VUZfU0tJUF9GUkFNRSkgew0KPiA+IC0JCQlpbnN0LT53b3JrX2J1ZnNbaV0udmEgPSB2cHVfbWFw cGluZ19kbV9hZGRyKA0KPiA+IC0JCQkJaW5zdC0+dnB1X2luc3QuZGV2LCB3YltpXS52cHVhKTsN Cj4gPiArCQkJc3RydWN0IG10a192Y29kZWNfZncgKmhhbmRsZXI7DQo+ID4gKw0KPiA+ICsJCQlo YW5kbGVyID0gaW5zdC0+dnB1X2luc3QuY3R4LT5kZXYtPmZ3X2hhbmRsZXI7DQo+ID4gKwkJCWlu c3QtPndvcmtfYnVmc1tpXS52YSA9DQo+ID4gKwkJCQltdGtfdmNvZGVjX2Z3X21hcF9kbV9hZGRy KGhhbmRsZXIsIHdiW2ldLnZwdWEpOw0KPiA+ICAJCQlpbnN0LT53b3JrX2J1ZnNbaV0uZG1hX2Fk ZHIgPSAwOw0KPiA+ICAJCX0gZWxzZSB7DQo+ID4gIAkJCXJldCA9IG10a192Y29kZWNfbWVtX2Fs bG9jKGluc3QtPmN0eCwNCj4gPiBAQCAtMjc1LDEwICsyNzcsMTIgQEAgc3RhdGljIGludCBoMjY0 X2VuY19hbGxvY193b3JrX2J1ZihzdHJ1Y3QgdmVuY19oMjY0X2luc3QgKmluc3QpDQo+ID4gIAkJ CSAqIHNldHRpbmcgaW4gVlBVIHNpZGUuDQo+ID4gIAkJCSAqLw0KPiA+ICAJCQlpZiAoaSA9PSBW RU5DX0gyNjRfVlBVX1dPUktfQlVGX1JDX0NPREUpIHsNCj4gPiArCQkJCXN0cnVjdCBtdGtfdmNv ZGVjX2Z3ICpoYW5kbGVyOw0KPiA+ICAJCQkJdm9pZCAqdG1wX3ZhOw0KPiA+ICANCj4gPiAtCQkJ CXRtcF92YSA9IHZwdV9tYXBwaW5nX2RtX2FkZHIoaW5zdC0+dnB1X2luc3QuZGV2LA0KPiA+IC0J CQkJCQkJICAgICB3YltpXS52cHVhKTsNCj4gPiArCQkJCWhhbmRsZXIgPSBpbnN0LT52cHVfaW5z dC5jdHgtPmRldi0+ZndfaGFuZGxlcjsNCj4gPiArCQkJCXRtcF92YSA9IG10a192Y29kZWNfZndf bWFwX2RtX2FkZHIoaGFuZGxlciwNCj4gPiArCQkJCQkJCQkgICB3YltpXS52cHVhKTsNCj4gPiAg CQkJCW1lbWNweShpbnN0LT53b3JrX2J1ZnNbaV0udmEsIHRtcF92YSwNCj4gPiAgCQkJCSAgICAg ICB3YltpXS5zaXplKTsNCj4gPiAgCQkJfQ0KPiA+IEBAIC00NjksNyArNDczLDYgQEAgc3RhdGlj IGludCBoMjY0X2VuY19pbml0KHN0cnVjdCBtdGtfdmNvZGVjX2N0eCAqY3R4KQ0KPiA+ICANCj4g PiAgCWluc3QtPmN0eCA9IGN0eDsNCj4gPiAgCWluc3QtPnZwdV9pbnN0LmN0eCA9IGN0eDsNCj4g PiAtCWluc3QtPnZwdV9pbnN0LmRldiA9IGN0eC0+ZGV2LT52cHVfcGxhdF9kZXY7DQo+ID4gIAlp bnN0LT52cHVfaW5zdC5pZCA9IElQSV9WRU5DX0gyNjQ7DQo+ID4gIAlpbnN0LT5od19iYXNlID0g bXRrX3Zjb2RlY19nZXRfcmVnX2FkZHIoaW5zdC0+Y3R4LCBWRU5DX1NZUyk7DQo+ID4gIA0KPiA+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5j X3ZwOF9pZi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY192 cDhfaWYuYw0KPiA+IGluZGV4IDhkMzZmMDM2MmVmZS4uNjQyNmFmNTE0NTI2IDEwMDY0NA0KPiA+ IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jL3ZlbmNfdnA4X2lm LmMNCj4gPiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5j X3ZwOF9pZi5jDQo+ID4gQEAgLTE3LDcgKzE3LDYgQEANCj4gPiAgI2luY2x1ZGUgIi4uL3ZlbmNf ZHJ2X2Jhc2UuaCINCj4gPiAgI2luY2x1ZGUgIi4uL3ZlbmNfaXBpX21zZy5oIg0KPiA+ICAjaW5j bHVkZSAiLi4vdmVuY192cHVfaWYuaCINCj4gPiAtI2luY2x1ZGUgIm10a192cHUuaCINCj4gPiAg DQo+ID4gICNkZWZpbmUgVkVOQ19CSVRTVFJFQU1fRlJBTUVfU0laRSAweDAwOTgNCj4gPiAgI2Rl ZmluZSBWRU5DX0JJVFNUUkVBTV9IRUFERVJfTEVOIDB4MDBlOA0KPiA+IEBAIC0xOTAsMTAgKzE4 OSwxMiBAQCBzdGF0aWMgaW50IHZwOF9lbmNfYWxsb2Nfd29ya19idWYoc3RydWN0IHZlbmNfdnA4 X2luc3QgKmluc3QpDQo+ID4gIAkJaWYgKGkgPT0gVkVOQ19WUDhfVlBVX1dPUktfQlVGX1JDX0NP REUgfHwNCj4gPiAgCQkgICAgaSA9PSBWRU5DX1ZQOF9WUFVfV09SS19CVUZfUkNfQ09ERTIgfHwN Cj4gPiAgCQkgICAgaSA9PSBWRU5DX1ZQOF9WUFVfV09SS19CVUZfUkNfQ09ERTMpIHsNCj4gPiAr CQkJc3RydWN0IG10a192Y29kZWNfZncgKmhhbmRsZXI7DQo+ID4gIAkJCXZvaWQgKnRtcF92YTsN Cj4gPiAgDQo+ID4gLQkJCXRtcF92YSA9IHZwdV9tYXBwaW5nX2RtX2FkZHIoaW5zdC0+dnB1X2lu c3QuZGV2LA0KPiA+IC0JCQkJCQkgICAgIHdiW2ldLnZwdWEpOw0KPiA+ICsJCQloYW5kbGVyID0g aW5zdC0+dnB1X2luc3QuY3R4LT5kZXYtPmZ3X2hhbmRsZXI7DQo+ID4gKwkJCXRtcF92YSA9IG10 a192Y29kZWNfZndfbWFwX2RtX2FkZHIoaGFuZGxlciwNCj4gPiArCQkJCQkJCSAgIHdiW2ldLnZw dWEpOw0KPiA+ICAJCQltZW1jcHkoaW5zdC0+d29ya19idWZzW2ldLnZhLCB0bXBfdmEsIHdiW2ld LnNpemUpOw0KPiA+ICAJCX0NCj4gPiAgCQl3YltpXS5pb3ZhID0gaW5zdC0+d29ya19idWZzW2ld LmRtYV9hZGRyOw0KPiA+IEBAIC0zMzQsNyArMzM1LDYgQEAgc3RhdGljIGludCB2cDhfZW5jX2lu aXQoc3RydWN0IG10a192Y29kZWNfY3R4ICpjdHgpDQo+ID4gIA0KPiA+ICAJaW5zdC0+Y3R4ID0g Y3R4Ow0KPiA+ICAJaW5zdC0+dnB1X2luc3QuY3R4ID0gY3R4Ow0KPiA+IC0JaW5zdC0+dnB1X2lu c3QuZGV2ID0gY3R4LT5kZXYtPnZwdV9wbGF0X2RldjsNCj4gPiAgCWluc3QtPnZwdV9pbnN0Lmlk ID0gSVBJX1ZFTkNfVlA4Ow0KPiA+ICAJaW5zdC0+aHdfYmFzZSA9IG10a192Y29kZWNfZ2V0X3Jl Z19hZGRyKGluc3QtPmN0eCwgVkVOQ19MVF9TWVMpOw0KPiA+ICANCj4gPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmNfZHJ2X2lmLmMgYi9kcml2ZXJz L21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuY19kcnZfaWYuYw0KPiA+IGluZGV4IGM2YmI4 MmFjMmRjZC4uY2UwYmNlODExNjE1IDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxh dGZvcm0vbXRrLXZjb2RlYy92ZW5jX2Rydl9pZi5jDQo+ID4gKysrIGIvZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmNfZHJ2X2lmLmMNCj4gPiBAQCAtMTUsNyArMTUsNiBAQA0K PiA+ICANCj4gPiAgI2luY2x1ZGUgIm10a192Y29kZWNfZW5jLmgiDQo+ID4gICNpbmNsdWRlICJt dGtfdmNvZGVjX2VuY19wbS5oIg0KPiA+IC0jaW5jbHVkZSAibXRrX3ZwdS5oIg0KPiA+ICANCj4g PiAgaW50IHZlbmNfaWZfaW5pdChzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eCwgdW5zaWduZWQg aW50IGZvdXJjYykNCj4gPiAgew0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRm b3JtL210ay12Y29kZWMvdmVuY192cHVfaWYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRr LXZjb2RlYy92ZW5jX3ZwdV9pZi5jDQo+ID4gaW5kZXggOTU0MDcwOWMxOTA1Li41Mzg1NDEyNzgx NGIgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3Zl bmNfdnB1X2lmLmMNCj4gPiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMv dmVuY192cHVfaWYuYw0KPiA+IEBAIC00LDcgKzQsNyBAQA0KPiA+ICAgKiBBdXRob3I6IFBvQ2h1 biBMaW4gPHBvY2h1bi5saW5AbWVkaWF0ZWsuY29tPg0KPiA+ICAgKi8NCj4gPiAgDQo+ID4gLSNp bmNsdWRlICJtdGtfdnB1LmgiDQo+ID4gKyNpbmNsdWRlICJtdGtfdmNvZGVjX2Z3LmgiDQo+ID4g ICNpbmNsdWRlICJ2ZW5jX2lwaV9tc2cuaCINCj4gPiAgI2luY2x1ZGUgInZlbmNfdnB1X2lmLmgi DQo+ID4gIA0KPiA+IEBAIC0xMyw3ICsxMyw4IEBAIHN0YXRpYyB2b2lkIGhhbmRsZV9lbmNfaW5p dF9tc2coc3RydWN0IHZlbmNfdnB1X2luc3QgKnZwdSwgY29uc3Qgdm9pZCAqZGF0YSkNCj4gPiAg CWNvbnN0IHN0cnVjdCB2ZW5jX3ZwdV9pcGlfbXNnX2luaXQgKm1zZyA9IGRhdGE7DQo+ID4gIA0K PiA+ICAJdnB1LT5pbnN0X2FkZHIgPSBtc2ctPnZwdV9pbnN0X2FkZHI7DQo+ID4gLQl2cHUtPnZz aSA9IHZwdV9tYXBwaW5nX2RtX2FkZHIodnB1LT5kZXYsIG1zZy0+dnB1X2luc3RfYWRkcik7DQo+ ID4gKwl2cHUtPnZzaSA9IG10a192Y29kZWNfZndfbWFwX2RtX2FkZHIodnB1LT5jdHgtPmRldi0+ ZndfaGFuZGxlciwNCj4gPiArCQkJCQkgICAgIG1zZy0+dnB1X2luc3RfYWRkcik7DQo+ID4gIH0N Cj4gPiAgDQo+ID4gIHN0YXRpYyB2b2lkIGhhbmRsZV9lbmNfZW5jb2RlX21zZyhzdHJ1Y3QgdmVu Y192cHVfaW5zdCAqdnB1LCBjb25zdCB2b2lkICpkYXRhKQ0KPiA+IEBAIC0yNSw3ICsyNiw3IEBA IHN0YXRpYyB2b2lkIGhhbmRsZV9lbmNfZW5jb2RlX21zZyhzdHJ1Y3QgdmVuY192cHVfaW5zdCAq dnB1LCBjb25zdCB2b2lkICpkYXRhKQ0KPiA+ICAJdnB1LT5pc19rZXlfZnJtID0gbXNnLT5pc19r ZXlfZnJtOw0KPiA+ICB9DQo+ID4gIA0KPiA+IC1zdGF0aWMgdm9pZCB2cHVfZW5jX2lwaV9oYW5k bGVyKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHZvaWQgKnByaXYpDQo+ID4g K3N0YXRpYyB2b2lkIHZwdV9lbmNfaXBpX2hhbmRsZXIodm9pZCAqZGF0YSwgdW5zaWduZWQgaW50 IGxlbiwgdm9pZCAqcHJpdikNCj4gPiAgew0KPiA+ICAJY29uc3Qgc3RydWN0IHZlbmNfdnB1X2lw aV9tc2dfY29tbW9uICptc2cgPSBkYXRhOw0KPiA+ICAJc3RydWN0IHZlbmNfdnB1X2luc3QgKnZw dSA9DQo+ID4gQEAgLTYzLDEyICs2NCwxMyBAQCBzdGF0aWMgaW50IHZwdV9lbmNfc2VuZF9tc2co c3RydWN0IHZlbmNfdnB1X2luc3QgKnZwdSwgdm9pZCAqbXNnLA0KPiA+ICANCj4gPiAgCW10a192 Y29kZWNfZGVidWdfZW50ZXIodnB1KTsNCj4gPiAgDQo+ID4gLQlpZiAoIXZwdS0+ZGV2KSB7DQo+ ID4gKwlpZiAoIXZwdS0+Y3R4LT5kZXYtPmZ3X2hhbmRsZXIpIHsNCj4gPiAgCQltdGtfdmNvZGVj X2Vycih2cHUsICJpbnN0IGRldiBpcyBOVUxMIik7DQo+ID4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+ ID4gIAl9DQo+ID4gIA0KPiA+IC0Jc3RhdHVzID0gdnB1X2lwaV9zZW5kKHZwdS0+ZGV2LCB2cHUt PmlkLCBtc2csIGxlbik7DQo+ID4gKwlzdGF0dXMgPSBtdGtfdmNvZGVjX2Z3X2lwaV9zZW5kKHZw dS0+Y3R4LT5kZXYtPmZ3X2hhbmRsZXIsIHZwdS0+aWQsIG1zZywNCj4gPiArCQkJCQlsZW4sIDIw MDApOw0KPiA+ICAJaWYgKHN0YXR1cykgew0KPiA+ICAJCW10a192Y29kZWNfZXJyKHZwdSwgInZw dV9pcGlfc2VuZCBtc2dfaWQgJXggbGVuICVkIGZhaWwgJWQiLA0KPiA+ICAJCQkgICAgICAgKih1 aW50MzJfdCAqKW1zZywgbGVuLCBzdGF0dXMpOw0KPiA+IEBAIC05Myw4ICs5NSw5IEBAIGludCB2 cHVfZW5jX2luaXQoc3RydWN0IHZlbmNfdnB1X2luc3QgKnZwdSkNCj4gPiAgCXZwdS0+c2lnbmFs ZWQgPSAwOw0KPiA+ICAJdnB1LT5mYWlsdXJlID0gMDsNCj4gPiAgDQo+ID4gLQlzdGF0dXMgPSB2 cHVfaXBpX3JlZ2lzdGVyKHZwdS0+ZGV2LCB2cHUtPmlkLCB2cHVfZW5jX2lwaV9oYW5kbGVyLA0K PiA+IC0JCQkJICBOVUxMLCBOVUxMKTsNCj4gPiArCXN0YXR1cyA9IG10a192Y29kZWNfZndfaXBp X3JlZ2lzdGVyKHZwdS0+Y3R4LT5kZXYtPmZ3X2hhbmRsZXIsIHZwdS0+aWQsDQo+ID4gKwkJdnB1 X2VuY19pcGlfaGFuZGxlciwgInZlbmMiLCBOVUxMKTsNCj4gPiArDQo+ID4gIAlpZiAoc3RhdHVz KSB7DQo+ID4gIAkJbXRrX3Zjb2RlY19lcnIodnB1LCAidnB1X2lwaV9yZWdpc3RlciBmYWlsICVk Iiwgc3RhdHVzKTsNCj4gPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmNfdnB1X2lmLmggYi9kcml2ZXJzL21l ZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuY192cHVfaWYuaA0KPiA+IGluZGV4IGJhMzAxYTEz OGE1YS4uZWRkNDExNjIxYjY4IDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZv cm0vbXRrLXZjb2RlYy92ZW5jX3ZwdV9pZi5oDQo+ID4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS9tdGstdmNvZGVjL3ZlbmNfdnB1X2lmLmgNCj4gPiBAQCAtNyw3ICs3LDcgQEANCj4gPiAg I2lmbmRlZiBfVkVOQ19WUFVfSUZfSF8NCj4gPiAgI2RlZmluZSBfVkVOQ19WUFVfSUZfSF8NCj4g PiAgDQo+ID4gLSNpbmNsdWRlICJtdGtfdnB1LmgiDQo+ID4gKyNpbmNsdWRlICJtdGtfdmNvZGVj X2Z3LmgiDQo+ID4gICNpbmNsdWRlICJ2ZW5jX2Rydl9pZi5oIg0KPiA+ICANCj4gPiAgLyoNCj4g PiBAQCAtMzQsOSArMzQsOCBAQCBzdHJ1Y3QgdmVuY192cHVfaW5zdCB7DQo+ID4gIAlpbnQgaXNf a2V5X2ZybTsNCj4gPiAgCXVuc2lnbmVkIGludCBpbnN0X2FkZHI7DQo+ID4gIAl2b2lkICp2c2k7 DQo+ID4gLQllbnVtIGlwaV9pZCBpZDsNCj4gPiArCWludCBpZDsNCj4gPiAgCXN0cnVjdCBtdGtf dmNvZGVjX2N0eCAqY3R4Ow0KPiA+IC0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2Ow0KPiA+ ICB9Ow0KPiA+ICANCj4gPiAgaW50IHZwdV9lbmNfaW5pdChzdHJ1Y3QgdmVuY192cHVfaW5zdCAq dnB1KTsNCj4gDQoNCg==