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 89979200C8; Fri, 20 Oct 2023 17:12:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=none Received: by smtp.kernel.org (Postfix) with ESMTPSA id D000EC433C8; Fri, 20 Oct 2023 17:12:20 +0000 (UTC) Date: Fri, 20 Oct 2023 22:42:15 +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 controllery Message-ID: <20231020171215.GA46191@thinkpad> References: <20230911220920.1817033-1-Frank.Li@nxp.com> <20230911220920.1817033-2-Frank.Li@nxp.com> <20231017183722.GB137137@thinkpad> <20231019150441.GA7254@thinkpad> <20231019172347.GC7254@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 02:11:22PM -0400, Frank Li wrote: > On Thu, Oct 19, 2023 at 10:53:47PM +0530, Manivannan Sadhasivam wrote: > > 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. > > There are still problem. (alloc, free, write_msg) is quite common for all > controller and the system with MSI. > > If move these into dwc-ep, cdns or other controller have to duplicate > these codes. > > If you think it is not EPC core specific, how about create new help files? > Hmm, that sounds good to me. I think the best place would be: drivers/pci/endpoint/pci-ep-msi.c Reason is, we cannot have this generic code under drivers/pci/controller/ as it is not a standalone PCI controller but a platform MSI controller. So having it under pci/endpoint/ makes much sense to me. And this is not specific to EPF drivers as well, so we cannot have it under pci/endpoint/functions/. - Mani > Frank > > > > > 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 3C46BCDB474 for ; Fri, 20 Oct 2023 17:12:59 +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=xPwlPNSFzviqoSHSIm4CQfr1YEAA4IfBHLDWy1uPHm8=; b=Rs712i2ndi+uvH AqtVLGcmhBEBAVGWa1WRh+shGHzCQffIluk4uOslFO/XuD93w1nd7vLpsuTxlCwKNQxc9qSITmRJR 6IBDde+o9AYgKxsEkoApu+Eh3gD4xYkKVKuYPjjKHLxWtrvBDJlf7tdkpgfb5s0Ipv6YewQsG48mD VsKIB7OoWHxPv0vX3IBBphNzxEla0S5mWBFd2MTP5nbGzlkozBhCp52bDnUNB/p57UDIN65a3VPlh Gh5UzSxJ6MWZR/HGIPIPNbB9fmgXpSXn+WM5BZQgeNpUMydkIxuFXmedrX0dD+S1Ykh5TXBBzs9tN kR0wh9bQqVQKCFuZmI2Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qtt32-002kQS-2S; Fri, 20 Oct 2023 17:12:32 +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 1qtt2y-002kPY-1e for linux-arm-kernel@lists.infradead.org; Fri, 20 Oct 2023 17:12:31 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 72A056228F; Fri, 20 Oct 2023 17:12:27 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D000EC433C8; Fri, 20 Oct 2023 17:12:20 +0000 (UTC) Date: Fri, 20 Oct 2023 22:42:15 +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 controllery Message-ID: <20231020171215.GA46191@thinkpad> References: <20230911220920.1817033-1-Frank.Li@nxp.com> <20230911220920.1817033-2-Frank.Li@nxp.com> <20231017183722.GB137137@thinkpad> <20231019150441.GA7254@thinkpad> <20231019172347.GC7254@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-20231020_101228_659505_E6F90899 X-CRM114-Status: GOOD ( 62.74 ) 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 T24gVGh1LCBPY3QgMTksIDIwMjMgYXQgMDI6MTE6MjJQTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gT24gVGh1LCBPY3QgMTksIDIwMjMgYXQgMTA6NTM6NDdQTSArMDUzMCwgTWFuaXZhbm5hbiBT YWRoYXNpdmFtIHdyb3RlOgo+ID4gT24gVGh1LCBPY3QgMTksIDIwMjMgYXQgMTI6MDA6MjJQTSAt MDQwMCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiA+IE9uIFRodSwgT2N0IDE5LCAyMDIzIGF0IDA4OjM0 OjQxUE0gKzA1MzAsIE1hbml2YW5uYW4gU2FkaGFzaXZhbSB3cm90ZToKPiA+ID4gPiBPbiBUdWUs IE9jdCAxNywgMjAyMyBhdCAwMjo1NTo1N1BNIC0wNDAwLCBGcmFuayBMaSB3cm90ZToKPiA+ID4g PiA+IE9uIFdlZCwgT2N0IDE4LCAyMDIzIGF0IDEyOjA3OjIyQU0gKzA1MzAsIE1hbml2YW5uYW4g U2FkaGFzaXZhbSB3cm90ZToKPiA+ID4gPiA+ID4gT24gTW9uLCBTZXAgMTEsIDIwMjMgYXQgMDY6 MDk6MTZQTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gVGhpcyBjb21taXQg aW50cm9kdWNlcyBhIGNvbW1vbiBtZXRob2QgZm9yIHNlbmRpbmcgbWVzc2FnZXMgZnJvbSB0aGUg Um9vdAo+ID4gPiA+ID4gPiA+IENvbXBsZXggKFJDKSB0byB0aGUgRW5kcG9pbnQgKEVQKSBieSB1 dGlsaXppbmcgdGhlIHBsYXRmb3JtIE1TSSBpbnRlcnJ1cHQKPiA+ID4gPiA+ID4gPiBjb250cm9s bGVyLCBzdWNoIGFzIEFSTSBHSUMsIGFzIGFuIEVQIGRvb3JiZWxsLiBNYXBzIHRoZSBtZW1vcnkg YXNzaWduZWQKPiA+ID4gPiA+ID4gPiBmb3IgdGhlIEJBUiByZWdpb24gYnkgdGhlIFBDSSBob3N0 IHRvIHRoZSBtZXNzYWdlIGFkZHJlc3Mgb2YgdGhlIHBsYXRmb3JtCj4gPiA+ID4gPiA+ID4gTVNJ IGludGVycnVwdCBjb250cm9sbGVyIGluIHRoZSBQQ0kgRVAuIEFzIGEgcmVzdWx0LCB3aGVuIHRo ZSBQQ0kgUkMgd3JpdGVzCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiAiRG9vcmJlbGwgZmVhdHVy ZSBpcyBpbXBsZW1lbnRlZCBieSBtYXBwaW5nIHRoZSBFUCdzIE1TSSBpbnRlcnJ1cHQgY29udHJv bGxlcgo+ID4gPiA+ID4gPiBtZXNzYWdlIGFkZHJlc3MgdG8gYSBkZWRpY2F0ZWQgQkFSIGluIHRo ZSBFUEMgY29yZS4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5Cj4gPiA+ID4gPiA+IG9mIHRoZSBF UEYgZHJpdmVyIHRvIHBhc3MgdGhlIGFjdHVhbCBtZXNzYWdlIGRhdGEgdG8gYmUgd3JpdHRlbiBi eSB0aGUgaG9zdCB0bwo+ID4gPiA+ID4gPiB0aGUgZG9vcmJlbGwgQkFSIHJlZ2lvbiB0aHJvdWdo IGl0cyBvd24gbG9naWMuIgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiB0byB0aGUgQkFSIHJl Z2lvbiwgaXQgdHJpZ2dlcnMgYW4gSVJRIGF0IHRoZSBFUC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBz ZXJ2ZXMKPiA+ID4gPiA+ID4gPiBhcyBhIGNvbW1vbiBtZXRob2QgZm9yIGFsbCBlbmRwb2ludCBm dW5jdGlvbiBkcml2ZXJzLgo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IEhvd2V2ZXIsIGl0 IGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IG9uZSBFUCBwaHlzaWNhbCBmdW5jdGlvbiBkdWUgdG8K PiA+ID4gPiA+ID4gPiBsaW1pdGF0aW9ucyBpbiBBUk0gTVNJL0lNUyByZWFkaW5lc3MuCj4gPiA+ ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gU2lnbmVkLW9mZi1ieTogRnJhbmsgTGkgPEZyYW5rLkxp QG54cC5jb20+Cj4gPiA+ID4gPiA+ID4gLS0tCj4gPiA+ID4gPiA+ID4gIGRyaXZlcnMvcGNpL2Vu ZHBvaW50L3BjaS1lcGMtY29yZS5jIHwgMTkyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysK PiA+ID4gPiA+ID4gPiAgZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNpLWVwZi1jb3JlLmMgfCAgNDQg KysrKysrKwo+ID4gPiA+ID4gPiA+ICBpbmNsdWRlL2xpbnV4L3BjaS1lcGMuaCAgICAgICAgICAg ICB8ICAgNiArCj4gPiA+ID4gPiA+ID4gIGluY2x1ZGUvbGludXgvcGNpLWVwZi5oICAgICAgICAg ICAgIHwgICA3ICsKPiA+ID4gPiA+ID4gPiAgNCBmaWxlcyBjaGFuZ2VkLCAyNDkgaW5zZXJ0aW9u cygrKQo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3Bj aS9lbmRwb2ludC9wY2ktZXBjLWNvcmUuYyBiL2RyaXZlcnMvcGNpL2VuZHBvaW50L3BjaS1lcGMt Y29yZS5jCj4gPiA+ID4gPiA+ID4gaW5kZXggNWE0YThiMGJlNjI2Mi4uZDMzNmE5OWM2YTk0ZiAx MDA2NDQKPiA+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJzL3BjaS9lbmRwb2ludC9wY2ktZXBjLWNv cmUuYwo+ID4gPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvcGNpL2VuZHBvaW50L3BjaS1lcGMtY29y ZS5jCj4gPiA+ID4gPiA+ID4gQEAgLTEwLDYgKzEwLDcgQEAKPiA+ID4gPiA+ID4gPiAgI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4KPiA+ID4gPiA+ID4gPiAgI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5o Pgo+ID4gPiA+ID4gPiA+ICAKPiA+ID4gPiA+ID4gPiArI2luY2x1ZGUgPGxpbnV4L21zaS5oPgo+ ID4gPiA+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvcGNpLWVwYy5oPgo+ID4gPiA+ID4gPiA+ICAj aW5jbHVkZSA8bGludXgvcGNpLWVwZi5oPgo+ID4gPiA+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgv cGNpLWVwLWNmcy5oPgo+ID4gPiA+ID4gPiA+IEBAIC03ODMsNiArNzg0LDE5NyBAQCB2b2lkIHBj aV9lcGNfYm1lX25vdGlmeShzdHJ1Y3QgcGNpX2VwYyAqZXBjKQo+ID4gPiA+ID4gPiA+ICB9Cj4g PiA+ID4gPiA+ID4gIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9lcGNfYm1lX25vdGlmeSk7Cj4gPiA+ ID4gPiA+ID4gIAo+ID4gPiA+ID4gPiA+ICsvKioKPiA+ID4gPiA+ID4gPiArICogcGNpX2VwY19h bGxvY19kb29yYmVsbCgpIC0gYWxsb2MgYW4gYWRkcmVzcyBzcGFjZSB0byBsZXQgUkMgdHJpZ2dl ciBFUCBzaWRlIElSUSBieSB3cml0ZSBkYXRhIHRvCj4gPiA+ID4gPiA+ID4gKyAqCQkJICAgICAg dGhlIHNwYWNlLgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gIkFsbG9jYXRlIHBsYXRmb3JtIHNw ZWNpZmljIGRvb3JiZWxsIElSUXMgdG8gYmUgdXNlZCBieSB0aGUgaG9zdCB0byB0cmlnZ2VyCj4g PiA+ID4gPiA+IGRvb3JiZWxscyBvbiBFUC4iCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ICsg Kgo+ID4gPiA+ID4gPiA+ICsgKiBAZXBjOiB0aGUgRVBDIGRldmljZSB0aGF0IG5lZWQgZG9vcmJl bGwgYWRkcmVzcyBhbmQgZGF0YSBmcm9tIFJDLgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gRVBD IGRldmljZSBmb3Igd2hpY2ggdGhlIGRvb3JiZWxsIG5lZWRzIHRvIGJlIGFsbG9jYXRlZAo+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiArICogQGZ1bmNfbm86IHRoZSBwaHlzaWNhbCBlbmRwb2lu dCBmdW5jdGlvbiBudW1iZXIgaW4gdGhlIEVQQyBkZXZpY2UuCj4gPiA+ID4gPiA+ID4gKyAqIEB2 ZnVuY19ubzogdGhlIHZpcnR1YWwgZW5kcG9pbnQgZnVuY3Rpb24gbnVtYmVyIGluIHRoZSBwaHlz aWNhbCBmdW5jdGlvbi4KPiA+ID4gPiA+ID4gPiArICogQG51bV9tc2dzOiB0aGUgdG90YWwgbnVt YmVyIG9mIGRvb3JiZWxsIG1lc3NhZ2VzCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiBzL251bV9t c2dzL251bV9kYgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiArICoKPiA+ID4gPiA+ID4gPiAr ICogUmV0dXJuOiAwIHN1Y2Nlc3MsIG90aGVyIGlzIGZhaWx1cmUKPiA+ID4gPiA+ID4gPiArICov Cj4gPiA+ID4gPiA+ID4gK2ludCBwY2lfZXBjX2FsbG9jX2Rvb3JiZWxsKHN0cnVjdCBwY2lfZXBj ICplcGMsIHU4IGZ1bmNfbm8sIHU4IHZmdW5jX25vLCBpbnQgbnVtX21zZ3MpCj4gPiA+ID4gPiA+ ID4gK3sKPiA+ID4gPiA+ID4gPiArCWludCByZXQ7Cj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4g PiA+ICsJaWYgKElTX0VSUl9PUl9OVUxMKGVwYykgfHwgZnVuY19ubyA+PSBlcGMtPm1heF9mdW5j dGlvbnMpCj4gPiA+ID4gPiA+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiA+ID4gKwo+ ID4gPiA+ID4gPiA+ICsJaWYgKHZmdW5jX25vID4gMCAmJiAoIWVwYy0+bWF4X3ZmcyB8fCB2ZnVu Y19ubyA+IGVwYy0+bWF4X3Zmc1tmdW5jX25vXSkpCj4gPiA+ID4gPiA+ID4gKwkJcmV0dXJuIC1F SU5WQUw7Cj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ICsJaWYgKCFlcGMtPm9wcy0+YWxs b2NfZG9vcmJlbGwpCj4gPiA+ID4gPiA+ID4gKwkJcmV0dXJuIDA7Cj4gPiA+ID4gPiA+IAo+ID4g PiA+ID4gPiBZb3UgbWVudGlvbmVkIDAgaXMgYSBzdWNjZXNzLiBTbyBpZiB0aGVyZSBpcyBubyBj YWxsYmFjaywgeW91IHdhbnQgdG8gcmV0dXJuCj4gPiA+ID4gPiA+IHN1Y2Nlc3M/Cj4gPiA+ID4g PiA+IAo+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiArCW11dGV4X2xvY2soJmVwYy0+bG9j ayk7Cj4gPiA+ID4gPiA+ID4gKwlyZXQgPSBlcGMtPm9wcy0+YWxsb2NfZG9vcmJlbGwoZXBjLCBm dW5jX25vLCB2ZnVuY19ubywgbnVtX21zZ3MpOwo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gV2h5 IGNhbid0IHlvdSBqdXN0IGNhbGwgdGhlIGdlbmVyaWMgZnVuY3Rpb24gaGVyZSBhbmQgaW4gb3Ro ZXIgcGxhY2VzIGluc3RlYWQgb2YKPiA+ID4gPiA+ID4gaW1wbGVtZW50aW5nIGNhbGxiYWNrcz8g SSBkbyBub3Qgc2VlIGEgbmVjZXNzaXR5IGZvciBFUEMgc3BlY2lmaWMgY2FsbGJhY2tzLiBJZgo+ ID4gPiA+ID4gPiB0aGVyZSBpcyBvbmUsIHBsZWFzZSBzcGVjaWZ5Lgo+ID4gPiA+ID4gCj4gPiA+ ID4gPiAxLiBSZWZlciB2MSB5b3VyIGNvbW1lbnRzLgo+ID4gPiA+ID4gaHR0cHM6Ly9sb3JlLmtl cm5lbC5vcmcvaW14LzIwMjMwOTA2MTQ1MjI3LkdDNTkzMEB0aGlua3BhZC8KPiA+ID4gPiAKPiA+ ID4gPiBJIGRvIG5vdCBmaW5kIHdoZXJlIEkgc3VnZ2VzdGVkIHRoZSBjYWxsYmFjayBhcHByb2Fj aC4KPiA+ID4gCj4gPiA+IAk+ID4gPiBJZiB0aGF0LCBFYWNoIEVQRiBkcml2ZXIgbmVlZCBkbyBk dXBsaWNhdGUgd29yay4gCj4gPiA+IAk+ID4gPiAKPiA+ID4gCT4gPiAKPiA+ID4gCT4gPiBZZXMs IGFuZCB0aGF0J3MgaG93IGl0IHNob3VsZCBiZS4gRVBGIGNvcmUgaGFzIG5vIGpvYiBpbiBzdXBw bHlpbmcgdGhlIG9mX25vZGUuCj4gPiA+IAk+ID4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9m IHRoZSBFUEYgZHJpdmVycyBhcyB0aGV5IGRlcGVuZCBvbiBPRiBmb3IgcGxhdGZvcm0KPiA+ID4g CT4gPiBzdXBwb3J0Lgo+ID4gPiAJPiAKPiA+ID4gCT4gRVBGIGRyaXZlciBzdGlsbCBub3QgZGVw ZW5kIG9uIE9GLiBzdWNoIHBjaS1lcGYtdGVzdCwgd2hpY2ggd2FzIHByb2JlZCBieQo+ID4gPiAJ PiBjb25maWdmcy4KPiA+ID4gCT4gCj4gPiA+IAo+ID4gPiAJSG1tLCB5ZWFoLiBUaGVuIGl0IHNo b3VsZCBiZSBwYXJ0IG9mIHRoZSBFUEMgZHJpdmVyLgo+ID4gPiAKPiA+ID4gCVNvcnJ5IGZvciB0 aGUgY29uZnVzaW9uLgo+ID4gPiAKPiA+ID4gSGVyZSwgYWxsICJFUEYiIHNob3VsZCBiZSAiRVBD Ii4gVGhlIGtleSBwcm9ibGVtIGlzIG9mX25vZGUuIEVQQyBjb3JlIGhhdmUKPiA+ID4gbm90IG9m X25vZGUsIEVQQyBjb3JlJ3MgcGFyZW50IGRyaXZlciAobGlrZSBkd2MtZXAgZHJpdmVyKSBoYXZl IG9mX25vZGUuIAo+ID4gPiAKPiA+ID4gcGNpX2VwY19nZW5lcmljX2FsbG9jX2Rvb3JiZWxsKGRl diksIGRldiBpcyBwcm9iZWQgYnkgcGxhdGZvcm0gZHJpdmVyLCBzdWNoCj4gPiA+IGFzIGR3Yy1l cCwgd2hpY2ggaGF2ZSBvZl9ub2RlLCAgRVBDIGNvcmUgd2lsbCBjcmVhdGUgY2hpbGQgZGV2aWNl Lgo+ID4gPiAKPiA+ID4gZHdjLWVwIGRldmljZQo+ID4gPiAgfC0gZXBjIGNvcmUgZGV2aWNlCj4g PiA+IAo+ID4gPiB3ZSBjYW4gZGlyZWN0IGNhbGwgcGNpX2VwY19nZW5lcmljX2FsbG9jX2Rvb3Ji ZWxsKGVwYy0+cGFyZW50KSBoZXJlLgo+ID4gPiAKPiA+ID4gSSBtYXkgbWlzcyB1bmRlcnN0YW5k IHdoYXQgeW91ciBtZWFucy4gSSB0aGluayB5b3Ugd2FudCB0byBkd2MtZXAKPiA+ID4gKHdpdGgg b2Zfbm9kZSkgaGFuZGxlIHRoZXNlIGFsbG9jIGZ1bmN0aW9ucy4gCj4gPiA+IAo+ID4gCj4gPiBN eSBjb21tZW50IHdhcyB0byBoYXZlIGp1c3Qgb25lIGZ1bmN0aW9uIGRlZmluaXRpb24uIEJ1dCBs b29raW5nIGF0IGl0IGFnYWluLCBJCj4gPiB0aGluayBpdCBpcyBiZXR0ZXIgdG8gbW92ZSBhbGwg dGhlIChhbGxvYywgZnJlZSwgd3JpdGVfbXNnKSBkZWZpbml0aW9ucyB0bwo+ID4gZHdjLWVwLCBz aW5jZSB0aGUgY29udGVudHMgb2YgdGhvc2UgZnVuY3Rpb25zIGFyZSBub3QgRVBDIGNvcmUgc3Bl Y2lmaWMuCj4gCj4gVGhlcmUgYXJlIHN0aWxsIHByb2JsZW0uIChhbGxvYywgZnJlZSwgd3JpdGVf bXNnKSBpcyBxdWl0ZSBjb21tb24gZm9yIGFsbAo+IGNvbnRyb2xsZXIgYW5kIHRoZSBzeXN0ZW0g d2l0aCBNU0kuCj4gCj4gSWYgbW92ZSB0aGVzZSBpbnRvIGR3Yy1lcCwgIGNkbnMgb3Igb3RoZXIg Y29udHJvbGxlciBoYXZlIHRvIGR1cGxpY2F0ZSAKPiB0aGVzZSBjb2Rlcy4KPiAKPiBJZiB5b3Ug dGhpbmsgaXQgaXMgbm90IEVQQyBjb3JlIHNwZWNpZmljLCBob3cgYWJvdXQgY3JlYXRlIG5ldyBo ZWxwIGZpbGVzPwo+IAoKSG1tLCB0aGF0IHNvdW5kcyBnb29kIHRvIG1lLiBJIHRoaW5rIHRoZSBi ZXN0IHBsYWNlIHdvdWxkIGJlOgpkcml2ZXJzL3BjaS9lbmRwb2ludC9wY2ktZXAtbXNpLmMKClJl YXNvbiBpcywgd2UgY2Fubm90IGhhdmUgdGhpcyBnZW5lcmljIGNvZGUgdW5kZXIgZHJpdmVycy9w Y2kvY29udHJvbGxlci8gYXMgaXQKaXMgbm90IGEgc3RhbmRhbG9uZSBQQ0kgY29udHJvbGxlciBi dXQgYSBwbGF0Zm9ybSBNU0kgY29udHJvbGxlci4gU28gaGF2aW5nIGl0CnVuZGVyIHBjaS9lbmRw b2ludC8gbWFrZXMgbXVjaCBzZW5zZSB0byBtZS4KCkFuZCB0aGlzIGlzIG5vdCBzcGVjaWZpYyB0 byBFUEYgZHJpdmVycyBhcyB3ZWxsLCBzbyB3ZSBjYW5ub3QgaGF2ZSBpdCB1bmRlcgpwY2kvZW5k cG9pbnQvZnVuY3Rpb25zLy4KCi0gTWFuaQoKPiBGcmFuawo+IAo+ID4gCj4gPiBJbiB0aGUgRVBD IGNvcmUsIHlvdSBjYW4gc3RpbGwgaGF2ZSB0aGUgY2FsbGJhY2tzIHNwZWNpZmljIHRvIGVhY2gg RVBDLiBUaGlzCj4gPiBhbHNvIHNvbHZlcyB5b3VyIG9mX25vZGUgcHJvYmxlbS4KPiA+IAo+ID4g LSBNYW5pCj4gPiAKPiA+ID4gPiAKPiA+ID4gPiA+IDIuIE1heWJlIHNvbWUgZXAgY29udHJvbGxl ciBoYXZlIGJ1aWx0LWluIGRvb3JiZWxsIHN1cHBvcnQuIFdyaXRlIHRvIHNvbWUKPiA+ID4gPiA+ IGFkZHJlc3MgdG8gdHJpZ2dlciBkb29yYmVsbCBpcnEuCj4gPiA+ID4gPiAKPiA+ID4gPiAKPiA+ ID4gPiBXZSB3aWxsIGhhbmRsZSBpdCB3aGVuZXZlciBzdWNoIEVQIGNvbnRyb2xsZXJzIGFycml2 ZS4gVW50aWwgdGhlbiwgbGV0J3Mga2VlcCBpdAo+ID4gPiA+IHNpbXBsZS4KPiA+ID4gPiAKPiA+ ID4gPiAtIE1hbmkKPiA+ID4gPiAKPiA+ID4gPiA+IEZyYW5rCj4gPiA+ID4gPiAKPiA+ID4gPiA+ ID4gCj4gPiA+ID4gPiA+ID4gKwltdXRleF91bmxvY2soJmVwYy0+bG9jayk7Cj4gPiA+ID4gPiA+ ID4gKwo+ID4gPiA+ID4gPiA+ICsJcmV0dXJuIHJldDsKPiA+ID4gPiA+ID4gPiArfQo+ID4gPiA+ ID4gPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChwY2lfZXBjX2FsbG9jX2Rvb3JiZWxsKTsKPiA+ID4g PiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gKy8qKgo+ID4gPiA+ID4gPiA+ICsgKiBwY2lfZXBjX2Zy ZWVfZG9vcmJlbGwoKSAtIGZyZWUgcmVzb3VyY2UgYWxsb2NhdGVkIGJ5IHBjaV9lcGNfYWxsb2Nf ZG9vcmJlbGwoKQo+ID4gPiA+ID4gPiA+ICsgKgo+ID4gPiA+ID4gPiA+ICsgKiBAZXBjOiB0aGUg RVBDIGRldmljZSB0aGF0IG5lZWQgZG9vcmJlbGwgYWRkcmVzcyBhbmQgZGF0YSBmcm9tIFJDLgo+ ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gU2FtZSBhcyBhYm92ZS4KPiA+ID4gPiA+ID4gCj4gPiA+ ID4gPiA+ID4gKyAqIEBmdW5jX25vOiB0aGUgcGh5c2ljYWwgZW5kcG9pbnQgZnVuY3Rpb24gbnVt YmVyIGluIHRoZSBFUEMgZGV2aWNlLgo+ID4gPiA+ID4gPiA+ICsgKiBAdmZ1bmNfbm86IHRoZSB2 aXJ0dWFsIGVuZHBvaW50IGZ1bmN0aW9uIG51bWJlciBpbiB0aGUgcGh5c2ljYWwgZnVuY3Rpb24u Cj4gPiA+ID4gPiA+ID4gKyAqCj4gPiA+ID4gPiA+ID4gKyAqIFJldHVybjogMCBzdWNjZXNzLCBv dGhlciBpcyBmYWlsdXJlCj4gPiA+ID4gPiA+ID4gKyAqLwo+ID4gPiA+ID4gPiA+ICt2b2lkIHBj aV9lcGNfZnJlZV9kb29yYmVsbChzdHJ1Y3QgcGNpX2VwYyAqZXBjLCB1OCBmdW5jX25vLCB1OCB2 ZnVuY19ubykKPiA+ID4gPiA+ID4gPiArewo+ID4gPiA+ID4gPiA+ICsJaWYgKElTX0VSUl9PUl9O VUxMKGVwYykgfHwgZnVuY19ubyA+PSBlcGMtPm1heF9mdW5jdGlvbnMpCj4gPiA+ID4gPiA+ID4g KwkJcmV0dXJuOwo+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiArCWlmICh2ZnVuY19ubyA+ IDAgJiYgKCFlcGMtPm1heF92ZnMgfHwgdmZ1bmNfbm8gPiBlcGMtPm1heF92ZnNbZnVuY19ub10p KQo+ID4gPiA+ID4gPiA+ICsJCXJldHVybjsKPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4g KwlpZiAoIWVwYy0+b3BzLT5mcmVlX2Rvb3JiZWxsKQo+ID4gPiA+ID4gPiA+ICsJCXJldHVybjsK PiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gKwltdXRleF9sb2NrKCZlcGMtPmxvY2spOwo+ ID4gPiA+ID4gPiA+ICsJZXBjLT5vcHMtPmZyZWVfZG9vcmJlbGwoZXBjLCBmdW5jX25vLCB2ZnVu Y19ubyk7Cj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiBTYW1lIGFzIHN1Z2dlc3RlZCBhYm92ZS4K PiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gKwltdXRleF91bmxvY2soJmVwYy0+bG9jayk7Cj4g PiA+ID4gPiA+ID4gK30KPiA+ID4gPiA+ID4gPiArRVhQT1JUX1NZTUJPTF9HUEwocGNpX2VwY19m cmVlX2Rvb3JiZWxsKTsKPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gK3N0YXRpYyBpcnFy ZXR1cm5fdCBwY2lfZXBmX2dlbmVyaWNfZG9vcmJlbGxfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpk YXRhKQo+ID4gPiA+ID4gPiA+ICt7Cj4gPiA+ID4gPiA+ID4gKwlzdHJ1Y3QgcGNpX2VwZiAqZXBm ID0gZGF0YTsKPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gKwlpZiAoZXBmLT5ldmVudF9v cHMgJiYgZXBmLT5ldmVudF9vcHMtPmRvb3JiZWxsKQo+ID4gPiA+ID4gPiA+ICsJCWVwZi0+ZXZl bnRfb3BzLT5kb29yYmVsbChlcGYsIGlycSAtIGVwZi0+dmlycV9iYXNlKTsKPiA+ID4gPiA+ID4g Cj4gPiA+ID4gPiA+IFNhbWUgYXMgc3VnZ2VzdGVkIGFib3ZlLgo+ID4gPiA+ID4gPiAKPiA+ID4g PiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPiA+ID4gPiA+ ID4gK30KPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gK3N0YXRpYyB2b2lkIHBjaV9lcGNf Z2VuZXJpY193cml0ZV9tc2lfbXNnKHN0cnVjdCBtc2lfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9t c2cgKm1zZykKPiA+ID4gPiA+ID4gPiArewo+ID4gPiA+ID4gPiA+ICsJc3RydWN0IHBjaV9lcGMg KmVwYyA9IE5VTEw7Cj4gPiA+ID4gPiA+ID4gKwlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjsK PiA+ID4gPiA+ID4gPiArCXN0cnVjdCBwY2lfZXBmICplcGY7Cj4gPiA+ID4gPiA+ID4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXY7Cj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ICsJY2xhc3NfZGV2 X2l0ZXJfaW5pdCgmaXRlciwgcGNpX2VwY19jbGFzcywgTlVMTCwgTlVMTCk7Cj4gPiA+ID4gPiA+ ID4gKwl3aGlsZSAoKGRldiA9IGNsYXNzX2Rldl9pdGVyX25leHQoJml0ZXIpKSkgewo+ID4gPiA+ ID4gPiA+ICsJCWlmIChkZXYtPnBhcmVudCAhPSBkZXNjLT5kZXYpCj4gPiA+ID4gPiA+ID4gKwkJ CWNvbnRpbnVlOwo+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiArCQllcGMgPSB0b19wY2lf ZXBjKGRldik7Cj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ICsJCWNsYXNzX2Rldl9pdGVy X2V4aXQoJml0ZXIpOwo+ID4gPiA+ID4gPiA+ICsJCWJyZWFrOwo+ID4gPiA+ID4gPiA+ICsJfQo+ ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiArCWlmICghZXBjKQo+ID4gPiA+ID4gPiA+ICsJ CXJldHVybjsKPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gKwkvKiBPbmx5IHN1cHBvcnQg b25lIEVQRiBmb3IgZG9vcmJlbGwgKi8KPiA+ID4gPiA+ID4gPiArCWVwZiA9IGxpc3RfZmlyc3Rf ZW50cnlfb3JfbnVsbCgmZXBjLT5wY2lfZXBmLCBzdHJ1Y3QgcGNpX2VwZiwgbGlzdCk7Cj4gPiA+ ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gTm8gbmVlZCBvZiB0aGlzIG5ld2xp bmUKPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gKwlpZiAoIWVwZikKPiA+ID4gPiA+ID4gPiAr CQlyZXR1cm47Cj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ICsJaWYgKGVwZi0+bXNnICYm IGRlc2MtPm1zaV9pbmRleCA8IGVwZi0+bnVtX21zZ3MpCj4gPiA+ID4gPiA+ID4gKwkJZXBmLT5t c2dbZGVzYy0+bXNpX2luZGV4XSA9ICptc2c7Cj4gPiA+ID4gPiA+ID4gK30KPiA+ID4gPiA+ID4g PiArCj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gUmVtb3ZlIGV4dHJh IG5ld2xpbmUKPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gKy8qKgo+ID4gPiA+ID4gPiA+ICsg KiBwY2lfZXBjX2dlbmVyaWNfYWxsb2NfZG9vcmJlbGwoKSAtIENvbW1vbiBoZWxwIGZ1bmN0aW9u LiBBbGxvY2F0ZSBhZGRyZXNzIHNwYWNlIGZyb20gTVNJCj4gPiA+ID4gPiA+ID4gKyAqICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcgo+ID4gPiA+ID4gPiA+ICsg Kgo+ID4gPiA+ID4gPiA+ICsgKiBAZXBjOiB0aGUgRVBDIGRldmljZSB0aGF0IG5lZWQgZG9vcmJl bGwgYWRkcmVzcyBhbmQgZGF0YSBmcm9tIFJDLgo+ID4gPiA+ID4gPiA+ICsgKiBAZnVuY19ubzog dGhlIHBoeXNpY2FsIGVuZHBvaW50IGZ1bmN0aW9uIG51bWJlciBpbiB0aGUgRVBDIGRldmljZS4K PiA+ID4gPiA+ID4gPiArICogQHZmdW5jX25vOiB0aGUgdmlydHVhbCBlbmRwb2ludCBmdW5jdGlv biBudW1iZXIgaW4gdGhlIHBoeXNpY2FsIGZ1bmN0aW9uLgo+ID4gPiA+ID4gPiA+ICsgKiBAbnVt X21zZ3M6IHRoZSB0b3RhbCBudW1iZXIgb2YgZG9vcmJlbGwgbWVzc2FnZXMKPiA+ID4gPiA+ID4g PiArICoKPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+IFNhbWUgY29tbWVudCBhcyBmb3IgcGNpX2Vw Y19hbGxvY19kb29yYmVsbCgpCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ICsgKiBSZW1hcms6 IHVzZSB0aGlzIGZ1bmN0aW9uIG9ubHkgaWYgRVBDIGRyaXZlciBqdXN0IHJlZ2lzdGVyIG9uZSBF UEMgZGV2aWNlLgo+ID4gPiA+ID4gPiA+ICsgKgo+ID4gPiA+ID4gPiA+ICsgKiBSZXR1cm46IDAg c3VjY2Vzcywgb3RoZXIgaXMgZmFpbHVyZQo+ID4gPiA+ID4gPiA+ICsgKi8KPiA+ID4gPiA+ID4g PiAraW50IHBjaV9lcGNfZ2VuZXJpY19hbGxvY19kb29yYmVsbChzdHJ1Y3QgcGNpX2VwYyAqZXBj LCB1OCBmdW5jX25vLCB1OCB2ZnVuY19ubywgaW50IG51bV9tc2dzKQo+ID4gPiA+ID4gPiA+ICt7 Cj4gPiA+ID4gPiA+ID4gKwlzdHJ1Y3QgcGNpX2VwZiAqZXBmOwo+ID4gPiA+ID4gPiA+ICsJc3Ry dWN0IGRldmljZSAqZGV2Owo+ID4gPiA+ID4gPiA+ICsJaW50IHZpcnEsIGxhc3Q7Cj4gPiA+ID4g PiA+ID4gKwlpbnQgcmV0Owo+ID4gPiA+ID4gPiA+ICsJaW50IGk7Cj4gPiA+ID4gPiA+ID4gKwo+ ID4gPiA+ID4gPiA+ICsJaWYgKElTX0VSUl9PUl9OVUxMKGVwYykpCj4gPiA+ID4gPiA+ID4gKwkJ cmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ICsJLyogQ3VycmVu dGx5IG9ubHkgc3VwcG9ydCBvbmUgZnVuYyBhbmQgb25lIHZmdW5jIGZvciBkb29yYmVsbCAqLwo+ ID4gPiA+ID4gPiA+ICsJaWYgKGZ1bmNfbm8gfHwgdmZ1bmNfbm8pCj4gPiA+ID4gPiA+ID4gKwkJ cmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ICsJZXBmID0gbGlz dF9maXJzdF9lbnRyeV9vcl9udWxsKCZlcGMtPnBjaV9lcGYsIHN0cnVjdCBwY2lfZXBmLCBsaXN0 KTsKPiA+ID4gPiA+ID4gPiArCWlmICghZXBmKQo+ID4gPiA+ID4gPiA+ICsJCXJldHVybiAtRUlO VkFMOwo+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiArCWRldiA9IGVwYy0+ZGV2LnBhcmVu dDsKPiA+ID4gPiA+ID4gPiArCXJldCA9IHBsYXRmb3JtX21zaV9kb21haW5fYWxsb2NfaXJxcyhk ZXYsIG51bV9tc2dzLCBwY2lfZXBjX2dlbmVyaWNfd3JpdGVfbXNpX21zZyk7Cj4gPiA+ID4gPiA+ ID4gKwlpZiAocmV0KSB7Cj4gPiA+ID4gPiA+ID4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8g YWxsb2NhdGUgTVNJXG4iKTsKPiA+ID4gPiA+ID4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ID4g PiA+ID4gPiArCX0KPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gKwlsYXN0ID0gLTE7Cj4g PiA+ID4gPiA+ID4gKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21zZ3M7IGkrKykgewo+ID4gPiA+ID4g PiAKPiA+ID4gPiA+ID4gWW91IHNob3VsZCBpdGVyYXRlIG92ZXIgbXNpX2Rlc2MgYXMgYmVsb3c6 Cj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiAgICAgICAgIG1zaV9sb2NrX2Rlc2NzKGRldik7Cj4g PiA+ID4gPiA+ICAgICAgICAgbXNpX2Zvcl9lYWNoX2Rlc2MoZGVzYywgZGV2LCBNU0lfREVTQ19B TEwpIHsKPiA+ID4gPiA+ID4gCQkuLi4KPiA+ID4gPiA+ID4gCX0KPiA+ID4gPiA+ID4gCW1zaV91 bmxvY2tfZGVzY3MoZGV2KTsKPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gKwkJdmlycSA9IG1z aV9nZXRfdmlycShkZXYsIGkpOwo+ID4gPiA+ID4gPiA+ICsJCWlmIChpID09IDApCj4gPiA+ID4g PiA+ID4gKwkJCWVwZi0+dmlycV9iYXNlID0gdmlycTsKPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4g PiA+ID4gKwkJcmV0ID0gcmVxdWVzdF9pcnEodmlycSwgcGNpX2VwZl9nZW5lcmljX2Rvb3JiZWxs X2hhbmRsZXIsIDAsCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiAJcmVxdWVzdF9pcnEoZGVzYy0+ aXJxLCAuLi4pCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ICsJCQkJICBrYXNwcmludGYoR0ZQ X0tFUk5FTCwgInBjaS1lcGMtZG9vcmJlbGwlZCIsIGkpLCBlcGYpOwo+ID4gPiA+ID4gPiA+ICsK PiA+ID4gPiA+ID4gPiArCQlpZiAocmV0KSB7Cj4gPiA+ID4gPiA+ID4gKwkJCWRldl9lcnIoZGV2 LCAiRmFpbGVkIHRvIHJlcXVlc3QgZG9vcmJlbGxcbiIpOwo+ID4gPiA+ID4gPiA+ICsJCQlnb3Rv IGVycl9mcmVlX2lycTsKPiA+ID4gPiA+ID4gPiArCQl9Cj4gPiA+ID4gPiA+ID4gKwkJbGFzdCA9 IGk7Cj4gPiA+ID4gPiA+ID4gKwl9Cj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ICsJcmV0 dXJuIDA7Cj4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ICtlcnJfZnJlZV9pcnE6Cj4gPiA+ ID4gPiA+ID4gKwlmb3IgKGkgPSAwOyBpIDwgbGFzdDsgaSsrKQo+ID4gPiA+ID4gPiA+ICsJCWtm cmVlKGZyZWVfaXJxKGVwZi0+dmlycV9iYXNlICsgaSwgZXBmKSk7Cj4gPiA+ID4gPiA+ID4gKwlw bGF0Zm9ybV9tc2lfZG9tYWluX2ZyZWVfaXJxcyhkZXYpOwo+ID4gPiA+ID4gPiA+ICsKPiA+ID4g PiA+ID4gPiArCXJldHVybiAtRUlOVkFMOwo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gCXJldHVy biByZXQ7Cj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ICt9Cj4gPiA+ID4gPiA+ID4gK0VYUE9S VF9TWU1CT0xfR1BMKHBjaV9lcGNfZ2VuZXJpY19hbGxvY19kb29yYmVsbCk7Cj4gPiA+ID4gPiA+ ID4gKwo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gWy4uLl0KPiA+ID4gPiA+ID4gCj4gPiA+ID4g PiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLWVwZi5oIGIvaW5jbHVkZS9saW51 eC9wY2ktZXBmLmgKPiA+ID4gPiA+ID4gPiBpbmRleCAzZjQ0YjZhZWM0NzcwLi40ODVjMTQ2YTVl ZmUyIDEwMDY0NAo+ID4gPiA+ID4gPiA+IC0tLSBhL2luY2x1ZGUvbGludXgvcGNpLWVwZi5oCj4g PiA+ID4gPiA+ID4gKysrIGIvaW5jbHVkZS9saW51eC9wY2ktZXBmLmgKPiA+ID4gPiA+ID4gPiBA QCAtNzksNiArNzksNyBAQCBzdHJ1Y3QgcGNpX2VwY19ldmVudF9vcHMgewo+ID4gPiA+ID4gPiA+ ICAJaW50ICgqbGlua191cCkoc3RydWN0IHBjaV9lcGYgKmVwZik7Cj4gPiA+ID4gPiA+ID4gIAlp bnQgKCpsaW5rX2Rvd24pKHN0cnVjdCBwY2lfZXBmICplcGYpOwo+ID4gPiA+ID4gPiA+ICAJaW50 ICgqYm1lKShzdHJ1Y3QgcGNpX2VwZiAqZXBmKTsKPiA+ID4gPiA+ID4gPiArCWludCAoKmRvb3Ji ZWxsKShzdHJ1Y3QgcGNpX2VwZiAqZXBmLCBpbnQgaW5kZXgpOwo+ID4gPiA+ID4gPiAKPiA+ID4g PiA+ID4ga2RvYyBtaXNzaW5nLgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiAgfTsKPiA+ID4g PiA+ID4gPiAgCj4gPiA+ID4gPiA+ID4gIC8qKgo+ID4gPiA+ID4gPiA+IEBAIC0xODAsNiArMTgx LDkgQEAgc3RydWN0IHBjaV9lcGYgewo+ID4gPiA+ID4gPiA+ICAJdW5zaWduZWQgbG9uZwkJdmZ1 bmN0aW9uX251bV9tYXA7Cj4gPiA+ID4gPiA+ID4gIAlzdHJ1Y3QgbGlzdF9oZWFkCXBjaV92ZXBm Owo+ID4gPiA+ID4gPiA+ICAJY29uc3Qgc3RydWN0IHBjaV9lcGNfZXZlbnRfb3BzICpldmVudF9v cHM7Cj4gPiA+ID4gPiA+ID4gKwlzdHJ1Y3QgbXNpX21zZyAqbXNnOwo+ID4gPiA+ID4gPiA+ICsJ dTE2IG51bV9tc2dzOwo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gbnVtX2RiCj4gPiA+ID4gPiA+ IAo+ID4gPiA+ID4gPiBZb3UgYWxzbyBuZWVkIHRvIGFkZCBrZG9jIGZvciBlYWNoIG5ldyBtZW1i ZXIuCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiAtIE1hbmkKPiA+ID4gPiA+ID4gCj4gPiA+ID4g PiA+IC0tIAo+ID4gPiA+ID4gPiDgrq7grqPgrr/grrXgrqPgr43grqPgrqngr40g4K6a4K6k4K6+ 4K6a4K6/4K614K6u4K+NCj4gPiA+ID4gCj4gPiA+ID4gLS0gCj4gPiA+ID4g4K6u4K6j4K6/4K61 4K6j4K+N4K6j4K6p4K+NIOCumuCupOCuvuCumuCuv+CuteCuruCvjQo+ID4gCj4gPiAtLSAKPiA+ IOCuruCuo+Cuv+CuteCuo+CvjeCuo+CuqeCvjSDgrprgrqTgrr7grprgrr/grrXgrq7gr40KCi0t IArgrq7grqPgrr/grrXgrqPgr43grqPgrqngr40g4K6a4K6k4K6+4K6a4K6/4K614K6u4K+NCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0t a2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcK aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2Vy bmVsCg==