From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF74232C8D; Thu, 19 Oct 2023 17:23:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WMlwZQW0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BF349C433C7; Thu, 19 Oct 2023 17:23:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1697736238; bh=N6rJotQAYKUbY3kdI/jN7i/D6rMJHj9xwtiC6QCP87s=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=WMlwZQW0kKr46J/2uM/wWEtQmhWvqTGSyTYCDriesS8L59DTZ3yWSHrK+xkxVIH9Y ax5f1V6Whi5BSEIov2GenCVaKuPp3PYSXqLYwUYZpYFkUUVtWeW+KXesj79wVBiAS+ D/tC/BjJoFCHhbkbjTYoTddz7xoXrjnUqmzbrVYDYmhWHmoq1hLWAL4s6PHDwSMaQ8 fp7g6t7dLIpu6Q33BobOQXW8BCJ+gFBrLdyWp5Z45Fio1subHcw3SQeQ78EKpIhEnI tgP99YXSpyrt9B8ik03iMRo0R6KcSPW45tYbhyJExq7KPDmNi1148f9OLFgQqP22GP hGm+Q6X3BfOwg== Date: Thu, 19 Oct 2023 22:53:47 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: Manivannan Sadhasivam , aisheng.dong@nxp.com, bhelgaas@google.com, devicetree@vger.kernel.org, festevam@gmail.com, imx@lists.linux.dev, jdmason@kudzu.us, kernel@pengutronix.de, kishon@kernel.org, kw@linux.com, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lorenzo.pieralisi@arm.com, lpieralisi@kernel.org, maz@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org, tglx@linutronix.de Subject: Re: [PATCH v2 1/5] PCI: endpoint: Add RC-to-EP doorbell support using platform MSI controller Message-ID: <20231019172347.GC7254@thinkpad> References: <20230911220920.1817033-1-Frank.Li@nxp.com> <20230911220920.1817033-2-Frank.Li@nxp.com> <20231017183722.GB137137@thinkpad> <20231019150441.GA7254@thinkpad> Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Thu, Oct 19, 2023 at 12:00:22PM -0400, Frank Li wrote: > On Thu, Oct 19, 2023 at 08:34:41PM +0530, Manivannan Sadhasivam wrote: > > On Tue, Oct 17, 2023 at 02:55:57PM -0400, Frank Li wrote: > > > On Wed, Oct 18, 2023 at 12:07:22AM +0530, Manivannan Sadhasivam wrote: > > > > On Mon, Sep 11, 2023 at 06:09:16PM -0400, Frank Li wrote: > > > > > This commit introduces a common method for sending messages from the Root > > > > > Complex (RC) to the Endpoint (EP) by utilizing the platform MSI interrupt > > > > > controller, such as ARM GIC, as an EP doorbell. Maps the memory assigned > > > > > for the BAR region by the PCI host to the message address of the platform > > > > > MSI interrupt controller in the PCI EP. As a result, when the PCI RC writes > > > > > > > > "Doorbell feature is implemented by mapping the EP's MSI interrupt controller > > > > message address to a dedicated BAR in the EPC core. It is the responsibility > > > > of the EPF driver to pass the actual message data to be written by the host to > > > > the doorbell BAR region through its own logic." > > > > > > > > > to the BAR region, it triggers an IRQ at the EP. This implementation serves > > > > > as a common method for all endpoint function drivers. > > > > > > > > > > However, it currently supports only one EP physical function due to > > > > > limitations in ARM MSI/IMS readiness. > > > > > > > > > > Signed-off-by: Frank Li > > > > > --- > > > > > drivers/pci/endpoint/pci-epc-core.c | 192 ++++++++++++++++++++++++++++ > > > > > drivers/pci/endpoint/pci-epf-core.c | 44 +++++++ > > > > > include/linux/pci-epc.h | 6 + > > > > > include/linux/pci-epf.h | 7 + > > > > > 4 files changed, 249 insertions(+) > > > > > > > > > > diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci-epc-core.c > > > > > index 5a4a8b0be6262..d336a99c6a94f 100644 > > > > > --- a/drivers/pci/endpoint/pci-epc-core.c > > > > > +++ b/drivers/pci/endpoint/pci-epc-core.c > > > > > @@ -10,6 +10,7 @@ > > > > > #include > > > > > #include > > > > > > > > > > +#include > > > > > #include > > > > > #include > > > > > #include > > > > > @@ -783,6 +784,197 @@ void pci_epc_bme_notify(struct pci_epc *epc) > > > > > } > > > > > EXPORT_SYMBOL_GPL(pci_epc_bme_notify); > > > > > > > > > > +/** > > > > > + * pci_epc_alloc_doorbell() - alloc an address space to let RC trigger EP side IRQ by write data to > > > > > + * the space. > > > > > > > > "Allocate platform specific doorbell IRQs to be used by the host to trigger > > > > doorbells on EP." > > > > > > > > > + * > > > > > + * @epc: the EPC device that need doorbell address and data from RC. > > > > > > > > EPC device for which the doorbell needs to be allocated > > > > > > > > > + * @func_no: the physical endpoint function number in the EPC device. > > > > > + * @vfunc_no: the virtual endpoint function number in the physical function. > > > > > + * @num_msgs: the total number of doorbell messages > > > > > > > > s/num_msgs/num_db > > > > > > > > > + * > > > > > + * Return: 0 success, other is failure > > > > > + */ > > > > > +int pci_epc_alloc_doorbell(struct pci_epc *epc, u8 func_no, u8 vfunc_no, int num_msgs) > > > > > +{ > > > > > + int ret; > > > > > + > > > > > + if (IS_ERR_OR_NULL(epc) || func_no >= epc->max_functions) > > > > > + return -EINVAL; > > > > > + > > > > > + if (vfunc_no > 0 && (!epc->max_vfs || vfunc_no > epc->max_vfs[func_no])) > > > > > + return -EINVAL; > > > > > + > > > > > + if (!epc->ops->alloc_doorbell) > > > > > + return 0; > > > > > > > > You mentioned 0 is a success. So if there is no callback, you want to return > > > > success? > > > > > > > > > + > > > > > + mutex_lock(&epc->lock); > > > > > + ret = epc->ops->alloc_doorbell(epc, func_no, vfunc_no, num_msgs); > > > > > > > > Why can't you just call the generic function here and in other places instead of > > > > implementing callbacks? I do not see a necessity for EPC specific callbacks. If > > > > there is one, please specify. > > > > > > 1. Refer v1 your comments. > > > https://lore.kernel.org/imx/20230906145227.GC5930@thinkpad/ > > > > I do not find where I suggested the callback approach. > > > > > If that, Each EPF driver need do duplicate work. > > > > > > > > > > Yes, and that's how it should be. EPF core has no job in supplying the of_node. > > > It is the responsibility of the EPF drivers as they depend on OF for platform > > > support. > > > > EPF driver still not depend on OF. such pci-epf-test, which was probed by > > configfs. > > > > Hmm, yeah. Then it should be part of the EPC driver. > > Sorry for the confusion. > > Here, all "EPF" should be "EPC". The key problem is of_node. EPC core have > not of_node, EPC core's parent driver (like dwc-ep driver) have of_node. > > pci_epc_generic_alloc_doorbell(dev), dev is probed by platform driver, such > as dwc-ep, which have of_node, EPC core will create child device. > > dwc-ep device > |- epc core device > > we can direct call pci_epc_generic_alloc_doorbell(epc->parent) here. > > I may miss understand what your means. I think you want to dwc-ep > (with of_node) handle these alloc functions. > My comment was to have just one function definition. But looking at it again, I think it is better to move all the (alloc, free, write_msg) definitions to dwc-ep, since the contents of those functions are not EPC core specific. In the EPC core, you can still have the callbacks specific to each EPC. This also solves your of_node problem. - Mani > > > > > 2. Maybe some ep controller have built-in doorbell support. Write to some > > > address to trigger doorbell irq. > > > > > > > We will handle it whenever such EP controllers arrive. Until then, let's keep it > > simple. > > > > - Mani > > > > > Frank > > > > > > > > > > > > + mutex_unlock(&epc->lock); > > > > > + > > > > > + return ret; > > > > > +} > > > > > +EXPORT_SYMBOL_GPL(pci_epc_alloc_doorbell); > > > > > + > > > > > +/** > > > > > + * pci_epc_free_doorbell() - free resource allocated by pci_epc_alloc_doorbell() > > > > > + * > > > > > + * @epc: the EPC device that need doorbell address and data from RC. > > > > > > > > Same as above. > > > > > > > > > + * @func_no: the physical endpoint function number in the EPC device. > > > > > + * @vfunc_no: the virtual endpoint function number in the physical function. > > > > > + * > > > > > + * Return: 0 success, other is failure > > > > > + */ > > > > > +void pci_epc_free_doorbell(struct pci_epc *epc, u8 func_no, u8 vfunc_no) > > > > > +{ > > > > > + if (IS_ERR_OR_NULL(epc) || func_no >= epc->max_functions) > > > > > + return; > > > > > + > > > > > + if (vfunc_no > 0 && (!epc->max_vfs || vfunc_no > epc->max_vfs[func_no])) > > > > > + return; > > > > > + > > > > > + if (!epc->ops->free_doorbell) > > > > > + return; > > > > > + > > > > > + mutex_lock(&epc->lock); > > > > > + epc->ops->free_doorbell(epc, func_no, vfunc_no); > > > > > > > > Same as suggested above. > > > > > > > > > + mutex_unlock(&epc->lock); > > > > > +} > > > > > +EXPORT_SYMBOL_GPL(pci_epc_free_doorbell); > > > > > + > > > > > +static irqreturn_t pci_epf_generic_doorbell_handler(int irq, void *data) > > > > > +{ > > > > > + struct pci_epf *epf = data; > > > > > + > > > > > + if (epf->event_ops && epf->event_ops->doorbell) > > > > > + epf->event_ops->doorbell(epf, irq - epf->virq_base); > > > > > > > > Same as suggested above. > > > > > > > > > + > > > > > + return IRQ_HANDLED; > > > > > +} > > > > > + > > > > > +static void pci_epc_generic_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg) > > > > > +{ > > > > > + struct pci_epc *epc = NULL; > > > > > + struct class_dev_iter iter; > > > > > + struct pci_epf *epf; > > > > > + struct device *dev; > > > > > + > > > > > + class_dev_iter_init(&iter, pci_epc_class, NULL, NULL); > > > > > + while ((dev = class_dev_iter_next(&iter))) { > > > > > + if (dev->parent != desc->dev) > > > > > + continue; > > > > > + > > > > > + epc = to_pci_epc(dev); > > > > > + > > > > > + class_dev_iter_exit(&iter); > > > > > + break; > > > > > + } > > > > > + > > > > > + if (!epc) > > > > > + return; > > > > > + > > > > > + /* Only support one EPF for doorbell */ > > > > > + epf = list_first_entry_or_null(&epc->pci_epf, struct pci_epf, list); > > > > > + > > > > > > > > No need of this newline > > > > > > > > > + if (!epf) > > > > > + return; > > > > > + > > > > > + if (epf->msg && desc->msi_index < epf->num_msgs) > > > > > + epf->msg[desc->msi_index] = *msg; > > > > > +} > > > > > + > > > > > + > > > > > > > > Remove extra newline > > > > > > > > > +/** > > > > > + * pci_epc_generic_alloc_doorbell() - Common help function. Allocate address space from MSI > > > > > + * controller > > > > > + * > > > > > + * @epc: the EPC device that need doorbell address and data from RC. > > > > > + * @func_no: the physical endpoint function number in the EPC device. > > > > > + * @vfunc_no: the virtual endpoint function number in the physical function. > > > > > + * @num_msgs: the total number of doorbell messages > > > > > + * > > > > > > > > Same comment as for pci_epc_alloc_doorbell() > > > > > > > > > + * Remark: use this function only if EPC driver just register one EPC device. > > > > > + * > > > > > + * Return: 0 success, other is failure > > > > > + */ > > > > > +int pci_epc_generic_alloc_doorbell(struct pci_epc *epc, u8 func_no, u8 vfunc_no, int num_msgs) > > > > > +{ > > > > > + struct pci_epf *epf; > > > > > + struct device *dev; > > > > > + int virq, last; > > > > > + int ret; > > > > > + int i; > > > > > + > > > > > + if (IS_ERR_OR_NULL(epc)) > > > > > + return -EINVAL; > > > > > + > > > > > + /* Currently only support one func and one vfunc for doorbell */ > > > > > + if (func_no || vfunc_no) > > > > > + return -EINVAL; > > > > > + > > > > > + epf = list_first_entry_or_null(&epc->pci_epf, struct pci_epf, list); > > > > > + if (!epf) > > > > > + return -EINVAL; > > > > > + > > > > > + dev = epc->dev.parent; > > > > > + ret = platform_msi_domain_alloc_irqs(dev, num_msgs, pci_epc_generic_write_msi_msg); > > > > > + if (ret) { > > > > > + dev_err(dev, "Failed to allocate MSI\n"); > > > > > + return -ENOMEM; > > > > > + } > > > > > + > > > > > + last = -1; > > > > > + for (i = 0; i < num_msgs; i++) { > > > > > > > > You should iterate over msi_desc as below: > > > > > > > > msi_lock_descs(dev); > > > > msi_for_each_desc(desc, dev, MSI_DESC_ALL) { > > > > ... > > > > } > > > > msi_unlock_descs(dev); > > > > > > > > > + virq = msi_get_virq(dev, i); > > > > > + if (i == 0) > > > > > + epf->virq_base = virq; > > > > > + > > > > > + ret = request_irq(virq, pci_epf_generic_doorbell_handler, 0, > > > > > > > > request_irq(desc->irq, ...) > > > > > > > > > + kasprintf(GFP_KERNEL, "pci-epc-doorbell%d", i), epf); > > > > > + > > > > > + if (ret) { > > > > > + dev_err(dev, "Failed to request doorbell\n"); > > > > > + goto err_free_irq; > > > > > + } > > > > > + last = i; > > > > > + } > > > > > + > > > > > + return 0; > > > > > + > > > > > +err_free_irq: > > > > > + for (i = 0; i < last; i++) > > > > > + kfree(free_irq(epf->virq_base + i, epf)); > > > > > + platform_msi_domain_free_irqs(dev); > > > > > + > > > > > + return -EINVAL; > > > > > > > > return ret; > > > > > > > > > +} > > > > > +EXPORT_SYMBOL_GPL(pci_epc_generic_alloc_doorbell); > > > > > + > > > > > > > > [...] > > > > > > > > > diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h > > > > > index 3f44b6aec4770..485c146a5efe2 100644 > > > > > --- a/include/linux/pci-epf.h > > > > > +++ b/include/linux/pci-epf.h > > > > > @@ -79,6 +79,7 @@ struct pci_epc_event_ops { > > > > > int (*link_up)(struct pci_epf *epf); > > > > > int (*link_down)(struct pci_epf *epf); > > > > > int (*bme)(struct pci_epf *epf); > > > > > + int (*doorbell)(struct pci_epf *epf, int index); > > > > > > > > kdoc missing. > > > > > > > > > }; > > > > > > > > > > /** > > > > > @@ -180,6 +181,9 @@ struct pci_epf { > > > > > unsigned long vfunction_num_map; > > > > > struct list_head pci_vepf; > > > > > const struct pci_epc_event_ops *event_ops; > > > > > + struct msi_msg *msg; > > > > > + u16 num_msgs; > > > > > > > > num_db > > > > > > > > You also need to add kdoc for each new member. > > > > > > > > - Mani > > > > > > > > -- > > > > மணிவண்ணன் சதாசிவம் > > > > -- > > மணிவண்ணன் சதாசிவம் -- மணிவண்ணன் சதாசிவம் From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2353CCDB465 for ; Thu, 19 Oct 2023 17:24:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=FmCKTkB5U3sFTP+OFpFnwT2vX5/a1hzzLaThbUvxPUo=; b=r/GyBgwx//QIXX XnVs7Z+DKqJo36Y8toQaDRLzsXSUooHraYz873eJMNqNWVWFt6BbvW313Hgvem2ev2vx9LA+6GjGw imnWAJuXMbFBlJqwv3SDBLhciCwQ2HZfcOxgSLEqUfdD1RFhA96C0cLlYIEDIFidHdUZAhnEAPAot UKcgFjbZRx5zA1HFIEh5oKMMCcU0Pr0wtboMdO0O+IAXXBRzH81ZXzc6YpCVzA1aShd4cTO5xnONZ uOqSn8wbw4moVI0dIWFPhcV9m585+AFuWKNkIFTSmLPF14ayIav5sp9AqFsetM2M/UTl6UUAy5tps N1uHg66LSG8xJ4SO+QNg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qtWkf-000Pb5-1J; Thu, 19 Oct 2023 17:24:05 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qtWkZ-000PWz-31 for linux-arm-kernel@lists.infradead.org; Thu, 19 Oct 2023 17:24:03 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id DBD0061C00; Thu, 19 Oct 2023 17:23:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BF349C433C7; Thu, 19 Oct 2023 17:23:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1697736238; bh=N6rJotQAYKUbY3kdI/jN7i/D6rMJHj9xwtiC6QCP87s=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=WMlwZQW0kKr46J/2uM/wWEtQmhWvqTGSyTYCDriesS8L59DTZ3yWSHrK+xkxVIH9Y ax5f1V6Whi5BSEIov2GenCVaKuPp3PYSXqLYwUYZpYFkUUVtWeW+KXesj79wVBiAS+ D/tC/BjJoFCHhbkbjTYoTddz7xoXrjnUqmzbrVYDYmhWHmoq1hLWAL4s6PHDwSMaQ8 fp7g6t7dLIpu6Q33BobOQXW8BCJ+gFBrLdyWp5Z45Fio1subHcw3SQeQ78EKpIhEnI tgP99YXSpyrt9B8ik03iMRo0R6KcSPW45tYbhyJExq7KPDmNi1148f9OLFgQqP22GP hGm+Q6X3BfOwg== Date: Thu, 19 Oct 2023 22:53:47 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: Manivannan Sadhasivam , aisheng.dong@nxp.com, bhelgaas@google.com, devicetree@vger.kernel.org, festevam@gmail.com, imx@lists.linux.dev, jdmason@kudzu.us, kernel@pengutronix.de, kishon@kernel.org, kw@linux.com, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lorenzo.pieralisi@arm.com, lpieralisi@kernel.org, maz@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org, tglx@linutronix.de Subject: Re: [PATCH v2 1/5] PCI: endpoint: Add RC-to-EP doorbell support using platform MSI controller Message-ID: <20231019172347.GC7254@thinkpad> References: <20230911220920.1817033-1-Frank.Li@nxp.com> <20230911220920.1817033-2-Frank.Li@nxp.com> <20231017183722.GB137137@thinkpad> <20231019150441.GA7254@thinkpad> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231019_102400_081489_86475BCC X-CRM114-Status: GOOD ( 59.24 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVGh1LCBPY3QgMTksIDIwMjMgYXQgMTI6MDA6MjJQTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gT24gVGh1LCBPY3QgMTksIDIwMjMgYXQgMDg6MzQ6NDFQTSArMDUzMCwgTWFuaXZhbm5hbiBT YWRoYXNpdmFtIHdyb3RlOgo+ID4gT24gVHVlLCBPY3QgMTcsIDIwMjMgYXQgMDI6NTU6NTdQTSAt MDQwMCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiA+IE9uIFdlZCwgT2N0IDE4LCAyMDIzIGF0IDEyOjA3 OjIyQU0gKzA1MzAsIE1hbml2YW5uYW4gU2FkaGFzaXZhbSB3cm90ZToKPiA+ID4gPiBPbiBNb24s IFNlcCAxMSwgMjAyMyBhdCAwNjowOToxNlBNIC0wNDAwLCBGcmFuayBMaSB3cm90ZToKPiA+ID4g PiA+IFRoaXMgY29tbWl0IGludHJvZHVjZXMgYSBjb21tb24gbWV0aG9kIGZvciBzZW5kaW5nIG1l c3NhZ2VzIGZyb20gdGhlIFJvb3QKPiA+ID4gPiA+IENvbXBsZXggKFJDKSB0byB0aGUgRW5kcG9p bnQgKEVQKSBieSB1dGlsaXppbmcgdGhlIHBsYXRmb3JtIE1TSSBpbnRlcnJ1cHQKPiA+ID4gPiA+ IGNvbnRyb2xsZXIsIHN1Y2ggYXMgQVJNIEdJQywgYXMgYW4gRVAgZG9vcmJlbGwuIE1hcHMgdGhl IG1lbW9yeSBhc3NpZ25lZAo+ID4gPiA+ID4gZm9yIHRoZSBCQVIgcmVnaW9uIGJ5IHRoZSBQQ0kg aG9zdCB0byB0aGUgbWVzc2FnZSBhZGRyZXNzIG9mIHRoZSBwbGF0Zm9ybQo+ID4gPiA+ID4gTVNJ IGludGVycnVwdCBjb250cm9sbGVyIGluIHRoZSBQQ0kgRVAuIEFzIGEgcmVzdWx0LCB3aGVuIHRo ZSBQQ0kgUkMgd3JpdGVzCj4gPiA+ID4gCj4gPiA+ID4gIkRvb3JiZWxsIGZlYXR1cmUgaXMgaW1w bGVtZW50ZWQgYnkgbWFwcGluZyB0aGUgRVAncyBNU0kgaW50ZXJydXB0IGNvbnRyb2xsZXIKPiA+ ID4gPiBtZXNzYWdlIGFkZHJlc3MgdG8gYSBkZWRpY2F0ZWQgQkFSIGluIHRoZSBFUEMgY29yZS4g SXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5Cj4gPiA+ID4gb2YgdGhlIEVQRiBkcml2ZXIgdG8gcGFz cyB0aGUgYWN0dWFsIG1lc3NhZ2UgZGF0YSB0byBiZSB3cml0dGVuIGJ5IHRoZSBob3N0IHRvCj4g PiA+ID4gdGhlIGRvb3JiZWxsIEJBUiByZWdpb24gdGhyb3VnaCBpdHMgb3duIGxvZ2ljLiIKPiA+ ID4gPiAKPiA+ID4gPiA+IHRvIHRoZSBCQVIgcmVnaW9uLCBpdCB0cmlnZ2VycyBhbiBJUlEgYXQg dGhlIEVQLiBUaGlzIGltcGxlbWVudGF0aW9uIHNlcnZlcwo+ID4gPiA+ID4gYXMgYSBjb21tb24g bWV0aG9kIGZvciBhbGwgZW5kcG9pbnQgZnVuY3Rpb24gZHJpdmVycy4KPiA+ID4gPiA+IAo+ID4g PiA+ID4gSG93ZXZlciwgaXQgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgb25lIEVQIHBoeXNpY2Fs IGZ1bmN0aW9uIGR1ZSB0bwo+ID4gPiA+ID4gbGltaXRhdGlvbnMgaW4gQVJNIE1TSS9JTVMgcmVh ZGluZXNzLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBGcmFuayBMaSA8RnJh bmsuTGlAbnhwLmNvbT4KPiA+ID4gPiA+IC0tLQo+ID4gPiA+ID4gIGRyaXZlcnMvcGNpL2VuZHBv aW50L3BjaS1lcGMtY29yZS5jIHwgMTkyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiA+ ID4gPiA+ICBkcml2ZXJzL3BjaS9lbmRwb2ludC9wY2ktZXBmLWNvcmUuYyB8ICA0NCArKysrKysr Cj4gPiA+ID4gPiAgaW5jbHVkZS9saW51eC9wY2ktZXBjLmggICAgICAgICAgICAgfCAgIDYgKwo+ ID4gPiA+ID4gIGluY2x1ZGUvbGludXgvcGNpLWVwZi5oICAgICAgICAgICAgIHwgICA3ICsKPiA+ ID4gPiA+ICA0IGZpbGVzIGNoYW5nZWQsIDI0OSBpbnNlcnRpb25zKCspCj4gPiA+ID4gPiAKPiA+ ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9lbmRwb2ludC9wY2ktZXBjLWNvcmUuYyBi L2RyaXZlcnMvcGNpL2VuZHBvaW50L3BjaS1lcGMtY29yZS5jCj4gPiA+ID4gPiBpbmRleCA1YTRh OGIwYmU2MjYyLi5kMzM2YTk5YzZhOTRmIDEwMDY0NAo+ID4gPiA+ID4gLS0tIGEvZHJpdmVycy9w Y2kvZW5kcG9pbnQvcGNpLWVwYy1jb3JlLmMKPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvcGNpL2Vu ZHBvaW50L3BjaS1lcGMtY29yZS5jCj4gPiA+ID4gPiBAQCAtMTAsNiArMTAsNyBAQAo+ID4gPiA+ ID4gICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gPiA+ID4gPiAgI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgo+ID4gPiA+ID4gIAo+ID4gPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9tc2kuaD4KPiA+ ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvcGNpLWVwYy5oPgo+ID4gPiA+ID4gICNpbmNsdWRlIDxs aW51eC9wY2ktZXBmLmg+Cj4gPiA+ID4gPiAgI2luY2x1ZGUgPGxpbnV4L3BjaS1lcC1jZnMuaD4K PiA+ID4gPiA+IEBAIC03ODMsNiArNzg0LDE5NyBAQCB2b2lkIHBjaV9lcGNfYm1lX25vdGlmeShz dHJ1Y3QgcGNpX2VwYyAqZXBjKQo+ID4gPiA+ID4gIH0KPiA+ID4gPiA+ICBFWFBPUlRfU1lNQk9M X0dQTChwY2lfZXBjX2JtZV9ub3RpZnkpOwo+ID4gPiA+ID4gIAo+ID4gPiA+ID4gKy8qKgo+ID4g PiA+ID4gKyAqIHBjaV9lcGNfYWxsb2NfZG9vcmJlbGwoKSAtIGFsbG9jIGFuIGFkZHJlc3Mgc3Bh Y2UgdG8gbGV0IFJDIHRyaWdnZXIgRVAgc2lkZSBJUlEgYnkgd3JpdGUgZGF0YSB0bwo+ID4gPiA+ ID4gKyAqCQkJICAgICAgdGhlIHNwYWNlLgo+ID4gPiA+IAo+ID4gPiA+ICJBbGxvY2F0ZSBwbGF0 Zm9ybSBzcGVjaWZpYyBkb29yYmVsbCBJUlFzIHRvIGJlIHVzZWQgYnkgdGhlIGhvc3QgdG8gdHJp Z2dlcgo+ID4gPiA+IGRvb3JiZWxscyBvbiBFUC4iCj4gPiA+ID4gCj4gPiA+ID4gPiArICoKPiA+ ID4gPiA+ICsgKiBAZXBjOiB0aGUgRVBDIGRldmljZSB0aGF0IG5lZWQgZG9vcmJlbGwgYWRkcmVz cyBhbmQgZGF0YSBmcm9tIFJDLgo+ID4gPiA+IAo+ID4gPiA+IEVQQyBkZXZpY2UgZm9yIHdoaWNo IHRoZSBkb29yYmVsbCBuZWVkcyB0byBiZSBhbGxvY2F0ZWQKPiA+ID4gPiAKPiA+ID4gPiA+ICsg KiBAZnVuY19ubzogdGhlIHBoeXNpY2FsIGVuZHBvaW50IGZ1bmN0aW9uIG51bWJlciBpbiB0aGUg RVBDIGRldmljZS4KPiA+ID4gPiA+ICsgKiBAdmZ1bmNfbm86IHRoZSB2aXJ0dWFsIGVuZHBvaW50 IGZ1bmN0aW9uIG51bWJlciBpbiB0aGUgcGh5c2ljYWwgZnVuY3Rpb24uCj4gPiA+ID4gPiArICog QG51bV9tc2dzOiB0aGUgdG90YWwgbnVtYmVyIG9mIGRvb3JiZWxsIG1lc3NhZ2VzCj4gPiA+ID4g Cj4gPiA+ID4gcy9udW1fbXNncy9udW1fZGIKPiA+ID4gPiAKPiA+ID4gPiA+ICsgKgo+ID4gPiA+ ID4gKyAqIFJldHVybjogMCBzdWNjZXNzLCBvdGhlciBpcyBmYWlsdXJlCj4gPiA+ID4gPiArICov Cj4gPiA+ID4gPiAraW50IHBjaV9lcGNfYWxsb2NfZG9vcmJlbGwoc3RydWN0IHBjaV9lcGMgKmVw YywgdTggZnVuY19ubywgdTggdmZ1bmNfbm8sIGludCBudW1fbXNncykKPiA+ID4gPiA+ICt7Cj4g PiA+ID4gPiArCWludCByZXQ7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArCWlmIChJU19FUlJfT1Jf TlVMTChlcGMpIHx8IGZ1bmNfbm8gPj0gZXBjLT5tYXhfZnVuY3Rpb25zKQo+ID4gPiA+ID4gKwkJ cmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArCWlmICh2ZnVuY19ubyA+IDAg JiYgKCFlcGMtPm1heF92ZnMgfHwgdmZ1bmNfbm8gPiBlcGMtPm1heF92ZnNbZnVuY19ub10pKQo+ ID4gPiA+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArCWlmICgh ZXBjLT5vcHMtPmFsbG9jX2Rvb3JiZWxsKQo+ID4gPiA+ID4gKwkJcmV0dXJuIDA7Cj4gPiA+ID4g Cj4gPiA+ID4gWW91IG1lbnRpb25lZCAwIGlzIGEgc3VjY2Vzcy4gU28gaWYgdGhlcmUgaXMgbm8g Y2FsbGJhY2ssIHlvdSB3YW50IHRvIHJldHVybgo+ID4gPiA+IHN1Y2Nlc3M/Cj4gPiA+ID4gCj4g PiA+ID4gPiArCj4gPiA+ID4gPiArCW11dGV4X2xvY2soJmVwYy0+bG9jayk7Cj4gPiA+ID4gPiAr CXJldCA9IGVwYy0+b3BzLT5hbGxvY19kb29yYmVsbChlcGMsIGZ1bmNfbm8sIHZmdW5jX25vLCBu dW1fbXNncyk7Cj4gPiA+ID4gCj4gPiA+ID4gV2h5IGNhbid0IHlvdSBqdXN0IGNhbGwgdGhlIGdl bmVyaWMgZnVuY3Rpb24gaGVyZSBhbmQgaW4gb3RoZXIgcGxhY2VzIGluc3RlYWQgb2YKPiA+ID4g PiBpbXBsZW1lbnRpbmcgY2FsbGJhY2tzPyBJIGRvIG5vdCBzZWUgYSBuZWNlc3NpdHkgZm9yIEVQ QyBzcGVjaWZpYyBjYWxsYmFja3MuIElmCj4gPiA+ID4gdGhlcmUgaXMgb25lLCBwbGVhc2Ugc3Bl Y2lmeS4KPiA+ID4gCj4gPiA+IDEuIFJlZmVyIHYxIHlvdXIgY29tbWVudHMuCj4gPiA+IGh0dHBz Oi8vbG9yZS5rZXJuZWwub3JnL2lteC8yMDIzMDkwNjE0NTIyNy5HQzU5MzBAdGhpbmtwYWQvCj4g PiAKPiA+IEkgZG8gbm90IGZpbmQgd2hlcmUgSSBzdWdnZXN0ZWQgdGhlIGNhbGxiYWNrIGFwcHJv YWNoLgo+IAo+IAk+ID4gPiBJZiB0aGF0LCBFYWNoIEVQRiBkcml2ZXIgbmVlZCBkbyBkdXBsaWNh dGUgd29yay4gCj4gCT4gPiA+IAo+IAk+ID4gCj4gCT4gPiBZZXMsIGFuZCB0aGF0J3MgaG93IGl0 IHNob3VsZCBiZS4gRVBGIGNvcmUgaGFzIG5vIGpvYiBpbiBzdXBwbHlpbmcgdGhlIG9mX25vZGUu Cj4gCT4gPiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIEVQRiBkcml2ZXJzIGFzIHRo ZXkgZGVwZW5kIG9uIE9GIGZvciBwbGF0Zm9ybQo+IAk+ID4gc3VwcG9ydC4KPiAJPiAKPiAJPiBF UEYgZHJpdmVyIHN0aWxsIG5vdCBkZXBlbmQgb24gT0YuIHN1Y2ggcGNpLWVwZi10ZXN0LCB3aGlj aCB3YXMgcHJvYmVkIGJ5Cj4gCT4gY29uZmlnZnMuCj4gCT4gCj4gCj4gCUhtbSwgeWVhaC4gVGhl biBpdCBzaG91bGQgYmUgcGFydCBvZiB0aGUgRVBDIGRyaXZlci4KPiAKPiAJU29ycnkgZm9yIHRo ZSBjb25mdXNpb24uCj4gCj4gSGVyZSwgYWxsICJFUEYiIHNob3VsZCBiZSAiRVBDIi4gVGhlIGtl eSBwcm9ibGVtIGlzIG9mX25vZGUuIEVQQyBjb3JlIGhhdmUKPiBub3Qgb2Zfbm9kZSwgRVBDIGNv cmUncyBwYXJlbnQgZHJpdmVyIChsaWtlIGR3Yy1lcCBkcml2ZXIpIGhhdmUgb2Zfbm9kZS4gCj4g Cj4gcGNpX2VwY19nZW5lcmljX2FsbG9jX2Rvb3JiZWxsKGRldiksIGRldiBpcyBwcm9iZWQgYnkg cGxhdGZvcm0gZHJpdmVyLCBzdWNoCj4gYXMgZHdjLWVwLCB3aGljaCBoYXZlIG9mX25vZGUsICBF UEMgY29yZSB3aWxsIGNyZWF0ZSBjaGlsZCBkZXZpY2UuCj4gCj4gZHdjLWVwIGRldmljZQo+ICB8 LSBlcGMgY29yZSBkZXZpY2UKPiAKPiB3ZSBjYW4gZGlyZWN0IGNhbGwgcGNpX2VwY19nZW5lcmlj X2FsbG9jX2Rvb3JiZWxsKGVwYy0+cGFyZW50KSBoZXJlLgo+IAo+IEkgbWF5IG1pc3MgdW5kZXJz dGFuZCB3aGF0IHlvdXIgbWVhbnMuIEkgdGhpbmsgeW91IHdhbnQgdG8gZHdjLWVwCj4gKHdpdGgg b2Zfbm9kZSkgaGFuZGxlIHRoZXNlIGFsbG9jIGZ1bmN0aW9ucy4gCj4gCgpNeSBjb21tZW50IHdh cyB0byBoYXZlIGp1c3Qgb25lIGZ1bmN0aW9uIGRlZmluaXRpb24uIEJ1dCBsb29raW5nIGF0IGl0 IGFnYWluLCBJCnRoaW5rIGl0IGlzIGJldHRlciB0byBtb3ZlIGFsbCB0aGUgKGFsbG9jLCBmcmVl LCB3cml0ZV9tc2cpIGRlZmluaXRpb25zIHRvCmR3Yy1lcCwgc2luY2UgdGhlIGNvbnRlbnRzIG9m IHRob3NlIGZ1bmN0aW9ucyBhcmUgbm90IEVQQyBjb3JlIHNwZWNpZmljLgoKSW4gdGhlIEVQQyBj b3JlLCB5b3UgY2FuIHN0aWxsIGhhdmUgdGhlIGNhbGxiYWNrcyBzcGVjaWZpYyB0byBlYWNoIEVQ Qy4gVGhpcwphbHNvIHNvbHZlcyB5b3VyIG9mX25vZGUgcHJvYmxlbS4KCi0gTWFuaQoKPiA+IAo+ ID4gPiAyLiBNYXliZSBzb21lIGVwIGNvbnRyb2xsZXIgaGF2ZSBidWlsdC1pbiBkb29yYmVsbCBz dXBwb3J0LiBXcml0ZSB0byBzb21lCj4gPiA+IGFkZHJlc3MgdG8gdHJpZ2dlciBkb29yYmVsbCBp cnEuCj4gPiA+IAo+ID4gCj4gPiBXZSB3aWxsIGhhbmRsZSBpdCB3aGVuZXZlciBzdWNoIEVQIGNv bnRyb2xsZXJzIGFycml2ZS4gVW50aWwgdGhlbiwgbGV0J3Mga2VlcCBpdAo+ID4gc2ltcGxlLgo+ ID4gCj4gPiAtIE1hbmkKPiA+IAo+ID4gPiBGcmFuawo+ID4gPiAKPiA+ID4gPiAKPiA+ID4gPiA+ ICsJbXV0ZXhfdW5sb2NrKCZlcGMtPmxvY2spOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKwlyZXR1 cm4gcmV0Owo+ID4gPiA+ID4gK30KPiA+ID4gPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChwY2lfZXBj X2FsbG9jX2Rvb3JiZWxsKTsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsvKioKPiA+ID4gPiA+ICsg KiBwY2lfZXBjX2ZyZWVfZG9vcmJlbGwoKSAtIGZyZWUgcmVzb3VyY2UgYWxsb2NhdGVkIGJ5IHBj aV9lcGNfYWxsb2NfZG9vcmJlbGwoKQo+ID4gPiA+ID4gKyAqCj4gPiA+ID4gPiArICogQGVwYzog dGhlIEVQQyBkZXZpY2UgdGhhdCBuZWVkIGRvb3JiZWxsIGFkZHJlc3MgYW5kIGRhdGEgZnJvbSBS Qy4KPiA+ID4gPiAKPiA+ID4gPiBTYW1lIGFzIGFib3ZlLgo+ID4gPiA+IAo+ID4gPiA+ID4gKyAq IEBmdW5jX25vOiB0aGUgcGh5c2ljYWwgZW5kcG9pbnQgZnVuY3Rpb24gbnVtYmVyIGluIHRoZSBF UEMgZGV2aWNlLgo+ID4gPiA+ID4gKyAqIEB2ZnVuY19ubzogdGhlIHZpcnR1YWwgZW5kcG9pbnQg ZnVuY3Rpb24gbnVtYmVyIGluIHRoZSBwaHlzaWNhbCBmdW5jdGlvbi4KPiA+ID4gPiA+ICsgKgo+ ID4gPiA+ID4gKyAqIFJldHVybjogMCBzdWNjZXNzLCBvdGhlciBpcyBmYWlsdXJlCj4gPiA+ID4g PiArICovCj4gPiA+ID4gPiArdm9pZCBwY2lfZXBjX2ZyZWVfZG9vcmJlbGwoc3RydWN0IHBjaV9l cGMgKmVwYywgdTggZnVuY19ubywgdTggdmZ1bmNfbm8pCj4gPiA+ID4gPiArewo+ID4gPiA+ID4g KwlpZiAoSVNfRVJSX09SX05VTEwoZXBjKSB8fCBmdW5jX25vID49IGVwYy0+bWF4X2Z1bmN0aW9u cykKPiA+ID4gPiA+ICsJCXJldHVybjsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsJaWYgKHZmdW5j X25vID4gMCAmJiAoIWVwYy0+bWF4X3ZmcyB8fCB2ZnVuY19ubyA+IGVwYy0+bWF4X3Zmc1tmdW5j X25vXSkpCj4gPiA+ID4gPiArCQlyZXR1cm47Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArCWlmICgh ZXBjLT5vcHMtPmZyZWVfZG9vcmJlbGwpCj4gPiA+ID4gPiArCQlyZXR1cm47Cj4gPiA+ID4gPiAr Cj4gPiA+ID4gPiArCW11dGV4X2xvY2soJmVwYy0+bG9jayk7Cj4gPiA+ID4gPiArCWVwYy0+b3Bz LT5mcmVlX2Rvb3JiZWxsKGVwYywgZnVuY19ubywgdmZ1bmNfbm8pOwo+ID4gPiA+IAo+ID4gPiA+ IFNhbWUgYXMgc3VnZ2VzdGVkIGFib3ZlLgo+ID4gPiA+IAo+ID4gPiA+ID4gKwltdXRleF91bmxv Y2soJmVwYy0+bG9jayk7Cj4gPiA+ID4gPiArfQo+ID4gPiA+ID4gK0VYUE9SVF9TWU1CT0xfR1BM KHBjaV9lcGNfZnJlZV9kb29yYmVsbCk7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArc3RhdGljIGly cXJldHVybl90IHBjaV9lcGZfZ2VuZXJpY19kb29yYmVsbF9oYW5kbGVyKGludCBpcnEsIHZvaWQg KmRhdGEpCj4gPiA+ID4gPiArewo+ID4gPiA+ID4gKwlzdHJ1Y3QgcGNpX2VwZiAqZXBmID0gZGF0 YTsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsJaWYgKGVwZi0+ZXZlbnRfb3BzICYmIGVwZi0+ZXZl bnRfb3BzLT5kb29yYmVsbCkKPiA+ID4gPiA+ICsJCWVwZi0+ZXZlbnRfb3BzLT5kb29yYmVsbChl cGYsIGlycSAtIGVwZi0+dmlycV9iYXNlKTsKPiA+ID4gPiAKPiA+ID4gPiBTYW1lIGFzIHN1Z2dl c3RlZCBhYm92ZS4KPiA+ID4gPiAKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsJcmV0dXJuIElSUV9I QU5ETEVEOwo+ID4gPiA+ID4gK30KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICtzdGF0aWMgdm9pZCBw Y2lfZXBjX2dlbmVyaWNfd3JpdGVfbXNpX21zZyhzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MsIHN0cnVj dCBtc2lfbXNnICptc2cpCj4gPiA+ID4gPiArewo+ID4gPiA+ID4gKwlzdHJ1Y3QgcGNpX2VwYyAq ZXBjID0gTlVMTDsKPiA+ID4gPiA+ICsJc3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7Cj4gPiA+ ID4gPiArCXN0cnVjdCBwY2lfZXBmICplcGY7Cj4gPiA+ID4gPiArCXN0cnVjdCBkZXZpY2UgKmRl djsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsJY2xhc3NfZGV2X2l0ZXJfaW5pdCgmaXRlciwgcGNp X2VwY19jbGFzcywgTlVMTCwgTlVMTCk7Cj4gPiA+ID4gPiArCXdoaWxlICgoZGV2ID0gY2xhc3Nf ZGV2X2l0ZXJfbmV4dCgmaXRlcikpKSB7Cj4gPiA+ID4gPiArCQlpZiAoZGV2LT5wYXJlbnQgIT0g ZGVzYy0+ZGV2KQo+ID4gPiA+ID4gKwkJCWNvbnRpbnVlOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4g KwkJZXBjID0gdG9fcGNpX2VwYyhkZXYpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKwkJY2xhc3Nf ZGV2X2l0ZXJfZXhpdCgmaXRlcik7Cj4gPiA+ID4gPiArCQlicmVhazsKPiA+ID4gPiA+ICsJfQo+ ID4gPiA+ID4gKwo+ID4gPiA+ID4gKwlpZiAoIWVwYykKPiA+ID4gPiA+ICsJCXJldHVybjsKPiA+ ID4gPiA+ICsKPiA+ID4gPiA+ICsJLyogT25seSBzdXBwb3J0IG9uZSBFUEYgZm9yIGRvb3JiZWxs ICovCj4gPiA+ID4gPiArCWVwZiA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXBjLT5wY2lf ZXBmLCBzdHJ1Y3QgcGNpX2VwZiwgbGlzdCk7Cj4gPiA+ID4gPiArCj4gPiA+ID4gCj4gPiA+ID4g Tm8gbmVlZCBvZiB0aGlzIG5ld2xpbmUKPiA+ID4gPiAKPiA+ID4gPiA+ICsJaWYgKCFlcGYpCj4g PiA+ID4gPiArCQlyZXR1cm47Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArCWlmIChlcGYtPm1zZyAm JiBkZXNjLT5tc2lfaW5kZXggPCBlcGYtPm51bV9tc2dzKQo+ID4gPiA+ID4gKwkJZXBmLT5tc2db ZGVzYy0+bXNpX2luZGV4XSA9ICptc2c7Cj4gPiA+ID4gPiArfQo+ID4gPiA+ID4gKwo+ID4gPiA+ ID4gKwo+ID4gPiA+IAo+ID4gPiA+IFJlbW92ZSBleHRyYSBuZXdsaW5lCj4gPiA+ID4gCj4gPiA+ ID4gPiArLyoqCj4gPiA+ID4gPiArICogcGNpX2VwY19nZW5lcmljX2FsbG9jX2Rvb3JiZWxsKCkg LSBDb21tb24gaGVscCBmdW5jdGlvbi4gQWxsb2NhdGUgYWRkcmVzcyBzcGFjZSBmcm9tIE1TSQo+ ID4gPiA+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxl cgo+ID4gPiA+ID4gKyAqCj4gPiA+ID4gPiArICogQGVwYzogdGhlIEVQQyBkZXZpY2UgdGhhdCBu ZWVkIGRvb3JiZWxsIGFkZHJlc3MgYW5kIGRhdGEgZnJvbSBSQy4KPiA+ID4gPiA+ICsgKiBAZnVu Y19ubzogdGhlIHBoeXNpY2FsIGVuZHBvaW50IGZ1bmN0aW9uIG51bWJlciBpbiB0aGUgRVBDIGRl dmljZS4KPiA+ID4gPiA+ICsgKiBAdmZ1bmNfbm86IHRoZSB2aXJ0dWFsIGVuZHBvaW50IGZ1bmN0 aW9uIG51bWJlciBpbiB0aGUgcGh5c2ljYWwgZnVuY3Rpb24uCj4gPiA+ID4gPiArICogQG51bV9t c2dzOiB0aGUgdG90YWwgbnVtYmVyIG9mIGRvb3JiZWxsIG1lc3NhZ2VzCj4gPiA+ID4gPiArICoK PiA+ID4gPiAKPiA+ID4gPiBTYW1lIGNvbW1lbnQgYXMgZm9yIHBjaV9lcGNfYWxsb2NfZG9vcmJl bGwoKQo+ID4gPiA+IAo+ID4gPiA+ID4gKyAqIFJlbWFyazogdXNlIHRoaXMgZnVuY3Rpb24gb25s eSBpZiBFUEMgZHJpdmVyIGp1c3QgcmVnaXN0ZXIgb25lIEVQQyBkZXZpY2UuCj4gPiA+ID4gPiAr ICoKPiA+ID4gPiA+ICsgKiBSZXR1cm46IDAgc3VjY2Vzcywgb3RoZXIgaXMgZmFpbHVyZQo+ID4g PiA+ID4gKyAqLwo+ID4gPiA+ID4gK2ludCBwY2lfZXBjX2dlbmVyaWNfYWxsb2NfZG9vcmJlbGwo c3RydWN0IHBjaV9lcGMgKmVwYywgdTggZnVuY19ubywgdTggdmZ1bmNfbm8sIGludCBudW1fbXNn cykKPiA+ID4gPiA+ICt7Cj4gPiA+ID4gPiArCXN0cnVjdCBwY2lfZXBmICplcGY7Cj4gPiA+ID4g PiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPiA+ID4gPiA+ICsJaW50IHZpcnEsIGxhc3Q7Cj4gPiA+ ID4gPiArCWludCByZXQ7Cj4gPiA+ID4gPiArCWludCBpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4g KwlpZiAoSVNfRVJSX09SX05VTEwoZXBjKSkKPiA+ID4gPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ ID4gPiA+ID4gKwo+ID4gPiA+ID4gKwkvKiBDdXJyZW50bHkgb25seSBzdXBwb3J0IG9uZSBmdW5j IGFuZCBvbmUgdmZ1bmMgZm9yIGRvb3JiZWxsICovCj4gPiA+ID4gPiArCWlmIChmdW5jX25vIHx8 IHZmdW5jX25vKQo+ID4gPiA+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiArCj4gPiA+ ID4gPiArCWVwZiA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXBjLT5wY2lfZXBmLCBzdHJ1 Y3QgcGNpX2VwZiwgbGlzdCk7Cj4gPiA+ID4gPiArCWlmICghZXBmKQo+ID4gPiA+ID4gKwkJcmV0 dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArCWRldiA9IGVwYy0+ZGV2LnBhcmVu dDsKPiA+ID4gPiA+ICsJcmV0ID0gcGxhdGZvcm1fbXNpX2RvbWFpbl9hbGxvY19pcnFzKGRldiwg bnVtX21zZ3MsIHBjaV9lcGNfZ2VuZXJpY193cml0ZV9tc2lfbXNnKTsKPiA+ID4gPiA+ICsJaWYg KHJldCkgewo+ID4gPiA+ID4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgTVNJ XG4iKTsKPiA+ID4gPiA+ICsJCXJldHVybiAtRU5PTUVNOwo+ID4gPiA+ID4gKwl9Cj4gPiA+ID4g PiArCj4gPiA+ID4gPiArCWxhc3QgPSAtMTsKPiA+ID4gPiA+ICsJZm9yIChpID0gMDsgaSA8IG51 bV9tc2dzOyBpKyspIHsKPiA+ID4gPiAKPiA+ID4gPiBZb3Ugc2hvdWxkIGl0ZXJhdGUgb3ZlciBt c2lfZGVzYyBhcyBiZWxvdzoKPiA+ID4gPiAKPiA+ID4gPiAgICAgICAgIG1zaV9sb2NrX2Rlc2Nz KGRldik7Cj4gPiA+ID4gICAgICAgICBtc2lfZm9yX2VhY2hfZGVzYyhkZXNjLCBkZXYsIE1TSV9E RVNDX0FMTCkgewo+ID4gPiA+IAkJLi4uCj4gPiA+ID4gCX0KPiA+ID4gPiAJbXNpX3VubG9ja19k ZXNjcyhkZXYpOwo+ID4gPiA+IAo+ID4gPiA+ID4gKwkJdmlycSA9IG1zaV9nZXRfdmlycShkZXYs IGkpOwo+ID4gPiA+ID4gKwkJaWYgKGkgPT0gMCkKPiA+ID4gPiA+ICsJCQllcGYtPnZpcnFfYmFz ZSA9IHZpcnE7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArCQlyZXQgPSByZXF1ZXN0X2lycSh2aXJx LCBwY2lfZXBmX2dlbmVyaWNfZG9vcmJlbGxfaGFuZGxlciwgMCwKPiA+ID4gPiAKPiA+ID4gPiAJ cmVxdWVzdF9pcnEoZGVzYy0+aXJxLCAuLi4pCj4gPiA+ID4gCj4gPiA+ID4gPiArCQkJCSAga2Fz cHJpbnRmKEdGUF9LRVJORUwsICJwY2ktZXBjLWRvb3JiZWxsJWQiLCBpKSwgZXBmKTsKPiA+ID4g PiA+ICsKPiA+ID4gPiA+ICsJCWlmIChyZXQpIHsKPiA+ID4gPiA+ICsJCQlkZXZfZXJyKGRldiwg IkZhaWxlZCB0byByZXF1ZXN0IGRvb3JiZWxsXG4iKTsKPiA+ID4gPiA+ICsJCQlnb3RvIGVycl9m cmVlX2lycTsKPiA+ID4gPiA+ICsJCX0KPiA+ID4gPiA+ICsJCWxhc3QgPSBpOwo+ID4gPiA+ID4g Kwl9Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArCXJldHVybiAwOwo+ID4gPiA+ID4gKwo+ID4gPiA+ ID4gK2Vycl9mcmVlX2lycToKPiA+ID4gPiA+ICsJZm9yIChpID0gMDsgaSA8IGxhc3Q7IGkrKykK PiA+ID4gPiA+ICsJCWtmcmVlKGZyZWVfaXJxKGVwZi0+dmlycV9iYXNlICsgaSwgZXBmKSk7Cj4g PiA+ID4gPiArCXBsYXRmb3JtX21zaV9kb21haW5fZnJlZV9pcnFzKGRldik7Cj4gPiA+ID4gPiAr Cj4gPiA+ID4gPiArCXJldHVybiAtRUlOVkFMOwo+ID4gPiA+IAo+ID4gPiA+IAlyZXR1cm4gcmV0 Owo+ID4gPiA+IAo+ID4gPiA+ID4gK30KPiA+ID4gPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChwY2lf ZXBjX2dlbmVyaWNfYWxsb2NfZG9vcmJlbGwpOwo+ID4gPiA+ID4gKwo+ID4gPiA+IAo+ID4gPiA+ IFsuLi5dCj4gPiA+ID4gCj4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kt ZXBmLmggYi9pbmNsdWRlL2xpbnV4L3BjaS1lcGYuaAo+ID4gPiA+ID4gaW5kZXggM2Y0NGI2YWVj NDc3MC4uNDg1YzE0NmE1ZWZlMiAxMDA2NDQKPiA+ID4gPiA+IC0tLSBhL2luY2x1ZGUvbGludXgv cGNpLWVwZi5oCj4gPiA+ID4gPiArKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1lcGYuaAo+ID4gPiA+ ID4gQEAgLTc5LDYgKzc5LDcgQEAgc3RydWN0IHBjaV9lcGNfZXZlbnRfb3BzIHsKPiA+ID4gPiA+ ICAJaW50ICgqbGlua191cCkoc3RydWN0IHBjaV9lcGYgKmVwZik7Cj4gPiA+ID4gPiAgCWludCAo KmxpbmtfZG93bikoc3RydWN0IHBjaV9lcGYgKmVwZik7Cj4gPiA+ID4gPiAgCWludCAoKmJtZSko c3RydWN0IHBjaV9lcGYgKmVwZik7Cj4gPiA+ID4gPiArCWludCAoKmRvb3JiZWxsKShzdHJ1Y3Qg cGNpX2VwZiAqZXBmLCBpbnQgaW5kZXgpOwo+ID4gPiA+IAo+ID4gPiA+IGtkb2MgbWlzc2luZy4K PiA+ID4gPiAKPiA+ID4gPiA+ICB9Owo+ID4gPiA+ID4gIAo+ID4gPiA+ID4gIC8qKgo+ID4gPiA+ ID4gQEAgLTE4MCw2ICsxODEsOSBAQCBzdHJ1Y3QgcGNpX2VwZiB7Cj4gPiA+ID4gPiAgCXVuc2ln bmVkIGxvbmcJCXZmdW5jdGlvbl9udW1fbWFwOwo+ID4gPiA+ID4gIAlzdHJ1Y3QgbGlzdF9oZWFk CXBjaV92ZXBmOwo+ID4gPiA+ID4gIAljb25zdCBzdHJ1Y3QgcGNpX2VwY19ldmVudF9vcHMgKmV2 ZW50X29wczsKPiA+ID4gPiA+ICsJc3RydWN0IG1zaV9tc2cgKm1zZzsKPiA+ID4gPiA+ICsJdTE2 IG51bV9tc2dzOwo+ID4gPiA+IAo+ID4gPiA+IG51bV9kYgo+ID4gPiA+IAo+ID4gPiA+IFlvdSBh bHNvIG5lZWQgdG8gYWRkIGtkb2MgZm9yIGVhY2ggbmV3IG1lbWJlci4KPiA+ID4gPiAKPiA+ID4g PiAtIE1hbmkKPiA+ID4gPiAKPiA+ID4gPiAtLSAKPiA+ID4gPiDgrq7grqPgrr/grrXgrqPgr43g rqPgrqngr40g4K6a4K6k4K6+4K6a4K6/4K614K6u4K+NCj4gPiAKPiA+IC0tIAo+ID4g4K6u4K6j 4K6/4K614K6j4K+N4K6j4K6p4K+NIOCumuCupOCuvuCumuCuv+CuteCuruCvjQoKLS0gCuCuruCu o+Cuv+CuteCuo+CvjeCuo+CuqeCvjSDgrprgrqTgrr7grprgrr/grrXgrq7gr40KCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwg bWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK