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 E70112032B; Fri, 20 Oct 2023 18:10:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bRDohqWW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 246B7C433C7; Fri, 20 Oct 2023 18:10:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1697825418; bh=huzjkmkK3JHtkojgquf10gotpxcSpKfROn6Vk0s6UKs=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=bRDohqWWICIqD+Z8T215e+YaaQO0mjoV0/uko24CyEIoiY3zbZU/OOJoyJ+KOjS84 pi5kDcXXVRt3EknjnnUqbj1nGrgUqgBPKXfcha7pvQAmMAmei6RI6pMNqK45u22imc HFUy/EG4LLNDNEVmHrOmp9V0eNPamwAKGTDx+6J1AIAhnrHVtZ0IYpZATlvFtbs0O4 VaS6wMo8qMF8giuRecyOp/UGQfuAwOWgZm4HJ1vSiD9oObvsoTkQigsC6UbsoRyRAl 90sozgQr4kv4ZCymqvTMB1wnmB1kIbcWSQv2ycEwU3zgyxsY/fPX6hrqLBUQneixBp VOF+6tdepMS4A== Date: Fri, 20 Oct 2023 23:40:08 +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: <20231020181008.GF46191@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> <20231020171215.GA46191@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 Fri, Oct 20, 2023 at 02:00:06PM -0400, Frank Li wrote: > On Fri, Oct 20, 2023 at 10:42:15PM +0530, Manivannan Sadhasivam wrote: > > 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 > > How about header file? > > int pci_epc_generic_alloc_doorbell(struct pci_epc *epc, u8 func_no, u8 vfunc_no, int num_msgs); > void pci_epc_generic_free_doorbell(struct pci_epc *epc, u8 func_no, u8 vfunc_no); > > Is it in include/linux/pci-epc.h, just 2 lines. > Sorry, I don't understand what you are suggesting. Can you elaborate? My suggestion was to place the function definitions in drivers/pci/endpoint/pci-ep-msi.c, create a separate header include/linux/pci-ep-msi.h and place the declarations there. The EPC drivers want to use generic MSI support should include this header. - Mani > Frank > > > > 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 6A81CC001DF for ; Fri, 20 Oct 2023 18:10:48 +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=EF7kLUp4xPDqQQGbm1+d4T6qHgWCi147fP4kBk11/hE=; b=E1bDQqOhnqpTXR UiKupblqqMIb9s9j/X7EaCPW1s8o9squQtRJW0R0S/TbldLIsKqJuWI8j0oM5a2UqGVDXdC04ijyP fNC8SK8b9LdAe4zbJB4rFYPx5mVtKWvCvDuVaRWBa7kvRId9mfHNcAH9ugIDIlqsPklXA4vxx/STV wZMwvNyshuSl2thj1EEW71apkGHk794AnyzkWBlenRYoUnJ6r8B59Ummd9wzjUgcDYMR0+DERraHi oEtcP7IpgOX42nMTiLKUyYroLGvvXVUBYQJAQWJd55q+jYCyYIXvRiYoBnY2ZZZhdisxj6T8E6bjt VHdA7JuQGd+sYSB5PS/w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qttx1-002poj-21; Fri, 20 Oct 2023 18:10:23 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qttwx-002po2-1Y for linux-arm-kernel@lists.infradead.org; Fri, 20 Oct 2023 18:10:22 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id C27D6622C7; Fri, 20 Oct 2023 18:10:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 246B7C433C7; Fri, 20 Oct 2023 18:10:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1697825418; bh=huzjkmkK3JHtkojgquf10gotpxcSpKfROn6Vk0s6UKs=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=bRDohqWWICIqD+Z8T215e+YaaQO0mjoV0/uko24CyEIoiY3zbZU/OOJoyJ+KOjS84 pi5kDcXXVRt3EknjnnUqbj1nGrgUqgBPKXfcha7pvQAmMAmei6RI6pMNqK45u22imc HFUy/EG4LLNDNEVmHrOmp9V0eNPamwAKGTDx+6J1AIAhnrHVtZ0IYpZATlvFtbs0O4 VaS6wMo8qMF8giuRecyOp/UGQfuAwOWgZm4HJ1vSiD9oObvsoTkQigsC6UbsoRyRAl 90sozgQr4kv4ZCymqvTMB1wnmB1kIbcWSQv2ycEwU3zgyxsY/fPX6hrqLBUQneixBp VOF+6tdepMS4A== Date: Fri, 20 Oct 2023 23:40:08 +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: <20231020181008.GF46191@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> <20231020171215.GA46191@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_111019_610138_21DB420D X-CRM114-Status: GOOD ( 64.12 ) 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 T24gRnJpLCBPY3QgMjAsIDIwMjMgYXQgMDI6MDA6MDZQTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gT24gRnJpLCBPY3QgMjAsIDIwMjMgYXQgMTA6NDI6MTVQTSArMDUzMCwgTWFuaXZhbm5hbiBT YWRoYXNpdmFtIHdyb3RlOgo+ID4gT24gVGh1LCBPY3QgMTksIDIwMjMgYXQgMDI6MTE6MjJQTSAt MDQwMCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiA+IE9uIFRodSwgT2N0IDE5LCAyMDIzIGF0IDEwOjUz OjQ3UE0gKzA1MzAsIE1hbml2YW5uYW4gU2FkaGFzaXZhbSB3cm90ZToKPiA+ID4gPiBPbiBUaHUs IE9jdCAxOSwgMjAyMyBhdCAxMjowMDoyMlBNIC0wNDAwLCBGcmFuayBMaSB3cm90ZToKPiA+ID4g PiA+IE9uIFRodSwgT2N0IDE5LCAyMDIzIGF0IDA4OjM0OjQxUE0gKzA1MzAsIE1hbml2YW5uYW4g U2FkaGFzaXZhbSB3cm90ZToKPiA+ID4gPiA+ID4gT24gVHVlLCBPY3QgMTcsIDIwMjMgYXQgMDI6 NTU6NTdQTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gT24gV2VkLCBPY3Qg MTgsIDIwMjMgYXQgMTI6MDc6MjJBTSArMDUzMCwgTWFuaXZhbm5hbiBTYWRoYXNpdmFtIHdyb3Rl Ogo+ID4gPiA+ID4gPiA+ID4gT24gTW9uLCBTZXAgMTEsIDIwMjMgYXQgMDY6MDk6MTZQTSAtMDQw MCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+IFRoaXMgY29tbWl0IGludHJvZHVj ZXMgYSBjb21tb24gbWV0aG9kIGZvciBzZW5kaW5nIG1lc3NhZ2VzIGZyb20gdGhlIFJvb3QKPiA+ ID4gPiA+ID4gPiA+ID4gQ29tcGxleCAoUkMpIHRvIHRoZSBFbmRwb2ludCAoRVApIGJ5IHV0aWxp emluZyB0aGUgcGxhdGZvcm0gTVNJIGludGVycnVwdAo+ID4gPiA+ID4gPiA+ID4gPiBjb250cm9s bGVyLCBzdWNoIGFzIEFSTSBHSUMsIGFzIGFuIEVQIGRvb3JiZWxsLiBNYXBzIHRoZSBtZW1vcnkg YXNzaWduZWQKPiA+ID4gPiA+ID4gPiA+ID4gZm9yIHRoZSBCQVIgcmVnaW9uIGJ5IHRoZSBQQ0kg aG9zdCB0byB0aGUgbWVzc2FnZSBhZGRyZXNzIG9mIHRoZSBwbGF0Zm9ybQo+ID4gPiA+ID4gPiA+ ID4gPiBNU0kgaW50ZXJydXB0IGNvbnRyb2xsZXIgaW4gdGhlIFBDSSBFUC4gQXMgYSByZXN1bHQs IHdoZW4gdGhlIFBDSSBSQyB3cml0ZXMKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4g IkRvb3JiZWxsIGZlYXR1cmUgaXMgaW1wbGVtZW50ZWQgYnkgbWFwcGluZyB0aGUgRVAncyBNU0kg aW50ZXJydXB0IGNvbnRyb2xsZXIKPiA+ID4gPiA+ID4gPiA+IG1lc3NhZ2UgYWRkcmVzcyB0byBh IGRlZGljYXRlZCBCQVIgaW4gdGhlIEVQQyBjb3JlLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkK PiA+ID4gPiA+ID4gPiA+IG9mIHRoZSBFUEYgZHJpdmVyIHRvIHBhc3MgdGhlIGFjdHVhbCBtZXNz YWdlIGRhdGEgdG8gYmUgd3JpdHRlbiBieSB0aGUgaG9zdCB0bwo+ID4gPiA+ID4gPiA+ID4gdGhl IGRvb3JiZWxsIEJBUiByZWdpb24gdGhyb3VnaCBpdHMgb3duIGxvZ2ljLiIKPiA+ID4gPiA+ID4g PiA+IAo+ID4gPiA+ID4gPiA+ID4gPiB0byB0aGUgQkFSIHJlZ2lvbiwgaXQgdHJpZ2dlcnMgYW4g SVJRIGF0IHRoZSBFUC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBzZXJ2ZXMKPiA+ID4gPiA+ID4gPiA+ ID4gYXMgYSBjb21tb24gbWV0aG9kIGZvciBhbGwgZW5kcG9pbnQgZnVuY3Rpb24gZHJpdmVycy4K PiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+IEhvd2V2ZXIsIGl0IGN1cnJlbnRs eSBzdXBwb3J0cyBvbmx5IG9uZSBFUCBwaHlzaWNhbCBmdW5jdGlvbiBkdWUgdG8KPiA+ID4gPiA+ ID4gPiA+ID4gbGltaXRhdGlvbnMgaW4gQVJNIE1TSS9JTVMgcmVhZGluZXNzLgo+ID4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gU2lnbmVkLW9mZi1ieTogRnJhbmsgTGkgPEZyYW5r LkxpQG54cC5jb20+Cj4gPiA+ID4gPiA+ID4gPiA+IC0tLQo+ID4gPiA+ID4gPiA+ID4gPiAgZHJp dmVycy9wY2kvZW5kcG9pbnQvcGNpLWVwYy1jb3JlLmMgfCAxOTIgKysrKysrKysrKysrKysrKysr KysrKysrKysrKwo+ID4gPiA+ID4gPiA+ID4gPiAgZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNpLWVw Zi1jb3JlLmMgfCAgNDQgKysrKysrKwo+ID4gPiA+ID4gPiA+ID4gPiAgaW5jbHVkZS9saW51eC9w Y2ktZXBjLmggICAgICAgICAgICAgfCAgIDYgKwo+ID4gPiA+ID4gPiA+ID4gPiAgaW5jbHVkZS9s aW51eC9wY2ktZXBmLmggICAgICAgICAgICAgfCAgIDcgKwo+ID4gPiA+ID4gPiA+ID4gPiAgNCBm aWxlcyBjaGFuZ2VkLCAyNDkgaW5zZXJ0aW9ucygrKQo+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4g PiA+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2VuZHBvaW50L3BjaS1lcGMtY29y ZS5jIGIvZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNpLWVwYy1jb3JlLmMKPiA+ID4gPiA+ID4gPiA+ ID4gaW5kZXggNWE0YThiMGJlNjI2Mi4uZDMzNmE5OWM2YTk0ZiAxMDA2NDQKPiA+ID4gPiA+ID4g PiA+ID4gLS0tIGEvZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNpLWVwYy1jb3JlLmMKPiA+ID4gPiA+ ID4gPiA+ID4gKysrIGIvZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNpLWVwYy1jb3JlLmMKPiA+ID4g PiA+ID4gPiA+ID4gQEAgLTEwLDYgKzEwLDcgQEAKPiA+ID4gPiA+ID4gPiA+ID4gICNpbmNsdWRl IDxsaW51eC9zbGFiLmg+Cj4gPiA+ID4gPiA+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+Cj4gPiA+ID4gPiA+ID4gPiA+ICAKPiA+ID4gPiA+ID4gPiA+ID4gKyNpbmNsdWRlIDxsaW51 eC9tc2kuaD4KPiA+ID4gPiA+ID4gPiA+ID4gICNpbmNsdWRlIDxsaW51eC9wY2ktZXBjLmg+Cj4g PiA+ID4gPiA+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvcGNpLWVwZi5oPgo+ID4gPiA+ID4gPiA+ ID4gPiAgI2luY2x1ZGUgPGxpbnV4L3BjaS1lcC1jZnMuaD4KPiA+ID4gPiA+ID4gPiA+ID4gQEAg LTc4Myw2ICs3ODQsMTk3IEBAIHZvaWQgcGNpX2VwY19ibWVfbm90aWZ5KHN0cnVjdCBwY2lfZXBj ICplcGMpCj4gPiA+ID4gPiA+ID4gPiA+ICB9Cj4gPiA+ID4gPiA+ID4gPiA+ICBFWFBPUlRfU1lN Qk9MX0dQTChwY2lfZXBjX2JtZV9ub3RpZnkpOwo+ID4gPiA+ID4gPiA+ID4gPiAgCj4gPiA+ID4g PiA+ID4gPiA+ICsvKioKPiA+ID4gPiA+ID4gPiA+ID4gKyAqIHBjaV9lcGNfYWxsb2NfZG9vcmJl bGwoKSAtIGFsbG9jIGFuIGFkZHJlc3Mgc3BhY2UgdG8gbGV0IFJDIHRyaWdnZXIgRVAgc2lkZSBJ UlEgYnkgd3JpdGUgZGF0YSB0bwo+ID4gPiA+ID4gPiA+ID4gPiArICoJCQkgICAgICB0aGUgc3Bh Y2UuCj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ICJBbGxvY2F0ZSBwbGF0Zm9ybSBz cGVjaWZpYyBkb29yYmVsbCBJUlFzIHRvIGJlIHVzZWQgYnkgdGhlIGhvc3QgdG8gdHJpZ2dlcgo+ ID4gPiA+ID4gPiA+ID4gZG9vcmJlbGxzIG9uIEVQLiIKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ ID4gPiA+ID4gPiArICoKPiA+ID4gPiA+ID4gPiA+ID4gKyAqIEBlcGM6IHRoZSBFUEMgZGV2aWNl IHRoYXQgbmVlZCBkb29yYmVsbCBhZGRyZXNzIGFuZCBkYXRhIGZyb20gUkMuCj4gPiA+ID4gPiA+ ID4gPiAKPiA+ID4gPiA+ID4gPiA+IEVQQyBkZXZpY2UgZm9yIHdoaWNoIHRoZSBkb29yYmVsbCBu ZWVkcyB0byBiZSBhbGxvY2F0ZWQKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiAr ICogQGZ1bmNfbm86IHRoZSBwaHlzaWNhbCBlbmRwb2ludCBmdW5jdGlvbiBudW1iZXIgaW4gdGhl IEVQQyBkZXZpY2UuCj4gPiA+ID4gPiA+ID4gPiA+ICsgKiBAdmZ1bmNfbm86IHRoZSB2aXJ0dWFs IGVuZHBvaW50IGZ1bmN0aW9uIG51bWJlciBpbiB0aGUgcGh5c2ljYWwgZnVuY3Rpb24uCj4gPiA+ ID4gPiA+ID4gPiA+ICsgKiBAbnVtX21zZ3M6IHRoZSB0b3RhbCBudW1iZXIgb2YgZG9vcmJlbGwg bWVzc2FnZXMKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gcy9udW1fbXNncy9udW1f ZGIKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiArICoKPiA+ID4gPiA+ID4gPiA+ ID4gKyAqIFJldHVybjogMCBzdWNjZXNzLCBvdGhlciBpcyBmYWlsdXJlCj4gPiA+ID4gPiA+ID4g PiA+ICsgKi8KPiA+ID4gPiA+ID4gPiA+ID4gK2ludCBwY2lfZXBjX2FsbG9jX2Rvb3JiZWxsKHN0 cnVjdCBwY2lfZXBjICplcGMsIHU4IGZ1bmNfbm8sIHU4IHZmdW5jX25vLCBpbnQgbnVtX21zZ3Mp Cj4gPiA+ID4gPiA+ID4gPiA+ICt7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJaW50IHJldDsKPiA+ID4g PiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiArCWlmIChJU19FUlJfT1JfTlVMTChlcGMp IHx8IGZ1bmNfbm8gPj0gZXBjLT5tYXhfZnVuY3Rpb25zKQo+ID4gPiA+ID4gPiA+ID4gPiArCQly ZXR1cm4gLUVJTlZBTDsKPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiArCWlm ICh2ZnVuY19ubyA+IDAgJiYgKCFlcGMtPm1heF92ZnMgfHwgdmZ1bmNfbm8gPiBlcGMtPm1heF92 ZnNbZnVuY19ub10pKQo+ID4gPiA+ID4gPiA+ID4gPiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+ID4g PiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiArCWlmICghZXBjLT5vcHMtPmFsbG9jX2Rv b3JiZWxsKQo+ID4gPiA+ID4gPiA+ID4gPiArCQlyZXR1cm4gMDsKPiA+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+ID4gWW91IG1lbnRpb25lZCAwIGlzIGEgc3VjY2Vzcy4gU28gaWYgdGhlcmUg aXMgbm8gY2FsbGJhY2ssIHlvdSB3YW50IHRvIHJldHVybgo+ID4gPiA+ID4gPiA+ID4gc3VjY2Vz cz8KPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ ICsJbXV0ZXhfbG9jaygmZXBjLT5sb2NrKTsKPiA+ID4gPiA+ID4gPiA+ID4gKwlyZXQgPSBlcGMt Pm9wcy0+YWxsb2NfZG9vcmJlbGwoZXBjLCBmdW5jX25vLCB2ZnVuY19ubywgbnVtX21zZ3MpOwo+ ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiBXaHkgY2FuJ3QgeW91IGp1c3QgY2FsbCB0 aGUgZ2VuZXJpYyBmdW5jdGlvbiBoZXJlIGFuZCBpbiBvdGhlciBwbGFjZXMgaW5zdGVhZCBvZgo+ ID4gPiA+ID4gPiA+ID4gaW1wbGVtZW50aW5nIGNhbGxiYWNrcz8gSSBkbyBub3Qgc2VlIGEgbmVj ZXNzaXR5IGZvciBFUEMgc3BlY2lmaWMgY2FsbGJhY2tzLiBJZgo+ID4gPiA+ID4gPiA+ID4gdGhl cmUgaXMgb25lLCBwbGVhc2Ugc3BlY2lmeS4KPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiAx LiBSZWZlciB2MSB5b3VyIGNvbW1lbnRzLgo+ID4gPiA+ID4gPiA+IGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2lteC8yMDIzMDkwNjE0NTIyNy5HQzU5MzBAdGhpbmtwYWQvCj4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiBJIGRvIG5vdCBmaW5kIHdoZXJlIEkgc3VnZ2VzdGVkIHRoZSBjYWxsYmFjayBh cHByb2FjaC4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gCT4gPiA+IElmIHRoYXQsIEVhY2ggRVBGIGRy aXZlciBuZWVkIGRvIGR1cGxpY2F0ZSB3b3JrLiAKPiA+ID4gPiA+IAk+ID4gPiAKPiA+ID4gPiA+ IAk+ID4gCj4gPiA+ID4gPiAJPiA+IFllcywgYW5kIHRoYXQncyBob3cgaXQgc2hvdWxkIGJlLiBF UEYgY29yZSBoYXMgbm8gam9iIGluIHN1cHBseWluZyB0aGUgb2Zfbm9kZS4KPiA+ID4gPiA+IAk+ ID4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBFUEYgZHJpdmVycyBhcyB0aGV5IGRl cGVuZCBvbiBPRiBmb3IgcGxhdGZvcm0KPiA+ID4gPiA+IAk+ID4gc3VwcG9ydC4KPiA+ID4gPiA+ IAk+IAo+ID4gPiA+ID4gCT4gRVBGIGRyaXZlciBzdGlsbCBub3QgZGVwZW5kIG9uIE9GLiBzdWNo IHBjaS1lcGYtdGVzdCwgd2hpY2ggd2FzIHByb2JlZCBieQo+ID4gPiA+ID4gCT4gY29uZmlnZnMu Cj4gPiA+ID4gPiAJPiAKPiA+ID4gPiA+IAo+ID4gPiA+ID4gCUhtbSwgeWVhaC4gVGhlbiBpdCBz aG91bGQgYmUgcGFydCBvZiB0aGUgRVBDIGRyaXZlci4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gCVNv cnJ5IGZvciB0aGUgY29uZnVzaW9uLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBIZXJlLCBhbGwgIkVQ RiIgc2hvdWxkIGJlICJFUEMiLiBUaGUga2V5IHByb2JsZW0gaXMgb2Zfbm9kZS4gRVBDIGNvcmUg aGF2ZQo+ID4gPiA+ID4gbm90IG9mX25vZGUsIEVQQyBjb3JlJ3MgcGFyZW50IGRyaXZlciAobGlr ZSBkd2MtZXAgZHJpdmVyKSBoYXZlIG9mX25vZGUuIAo+ID4gPiA+ID4gCj4gPiA+ID4gPiBwY2lf ZXBjX2dlbmVyaWNfYWxsb2NfZG9vcmJlbGwoZGV2KSwgZGV2IGlzIHByb2JlZCBieSBwbGF0Zm9y bSBkcml2ZXIsIHN1Y2gKPiA+ID4gPiA+IGFzIGR3Yy1lcCwgd2hpY2ggaGF2ZSBvZl9ub2RlLCAg RVBDIGNvcmUgd2lsbCBjcmVhdGUgY2hpbGQgZGV2aWNlLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBk d2MtZXAgZGV2aWNlCj4gPiA+ID4gPiAgfC0gZXBjIGNvcmUgZGV2aWNlCj4gPiA+ID4gPiAKPiA+ ID4gPiA+IHdlIGNhbiBkaXJlY3QgY2FsbCBwY2lfZXBjX2dlbmVyaWNfYWxsb2NfZG9vcmJlbGwo ZXBjLT5wYXJlbnQpIGhlcmUuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IEkgbWF5IG1pc3MgdW5kZXJz dGFuZCB3aGF0IHlvdXIgbWVhbnMuIEkgdGhpbmsgeW91IHdhbnQgdG8gZHdjLWVwCj4gPiA+ID4g PiAod2l0aCBvZl9ub2RlKSBoYW5kbGUgdGhlc2UgYWxsb2MgZnVuY3Rpb25zLiAKPiA+ID4gPiA+ IAo+ID4gPiA+IAo+ID4gPiA+IE15IGNvbW1lbnQgd2FzIHRvIGhhdmUganVzdCBvbmUgZnVuY3Rp b24gZGVmaW5pdGlvbi4gQnV0IGxvb2tpbmcgYXQgaXQgYWdhaW4sIEkKPiA+ID4gPiB0aGluayBp dCBpcyBiZXR0ZXIgdG8gbW92ZSBhbGwgdGhlIChhbGxvYywgZnJlZSwgd3JpdGVfbXNnKSBkZWZp bml0aW9ucyB0bwo+ID4gPiA+IGR3Yy1lcCwgc2luY2UgdGhlIGNvbnRlbnRzIG9mIHRob3NlIGZ1 bmN0aW9ucyBhcmUgbm90IEVQQyBjb3JlIHNwZWNpZmljLgo+ID4gPiAKPiA+ID4gVGhlcmUgYXJl IHN0aWxsIHByb2JsZW0uIChhbGxvYywgZnJlZSwgd3JpdGVfbXNnKSBpcyBxdWl0ZSBjb21tb24g Zm9yIGFsbAo+ID4gPiBjb250cm9sbGVyIGFuZCB0aGUgc3lzdGVtIHdpdGggTVNJLgo+ID4gPiAK PiA+ID4gSWYgbW92ZSB0aGVzZSBpbnRvIGR3Yy1lcCwgIGNkbnMgb3Igb3RoZXIgY29udHJvbGxl ciBoYXZlIHRvIGR1cGxpY2F0ZSAKPiA+ID4gdGhlc2UgY29kZXMuCj4gPiA+IAo+ID4gPiBJZiB5 b3UgdGhpbmsgaXQgaXMgbm90IEVQQyBjb3JlIHNwZWNpZmljLCBob3cgYWJvdXQgY3JlYXRlIG5l dyBoZWxwIGZpbGVzPwo+ID4gPiAKPiA+IAo+ID4gSG1tLCB0aGF0IHNvdW5kcyBnb29kIHRvIG1l LiBJIHRoaW5rIHRoZSBiZXN0IHBsYWNlIHdvdWxkIGJlOgo+ID4gZHJpdmVycy9wY2kvZW5kcG9p bnQvcGNpLWVwLW1zaS5jCj4gCj4gSG93IGFib3V0IGhlYWRlciBmaWxlPwo+IAo+IGludCBwY2lf ZXBjX2dlbmVyaWNfYWxsb2NfZG9vcmJlbGwoc3RydWN0IHBjaV9lcGMgKmVwYywgdTggZnVuY19u bywgdTggdmZ1bmNfbm8sIGludCBudW1fbXNncyk7ICAgICAKPiB2b2lkIHBjaV9lcGNfZ2VuZXJp Y19mcmVlX2Rvb3JiZWxsKHN0cnVjdCBwY2lfZXBjICplcGMsIHU4IGZ1bmNfbm8sIHU4IHZmdW5j X25vKTsKPiAKPiBJcyBpdCBpbiBpbmNsdWRlL2xpbnV4L3BjaS1lcGMuaCwganVzdCAyIGxpbmVz Lgo+IAoKU29ycnksIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IHlvdSBhcmUgc3VnZ2VzdGluZy4g Q2FuIHlvdSBlbGFib3JhdGU/CgpNeSBzdWdnZXN0aW9uIHdhcyB0byBwbGFjZSB0aGUgZnVuY3Rp b24gZGVmaW5pdGlvbnMgaW4KZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNpLWVwLW1zaS5jLCBjcmVh dGUgYSBzZXBhcmF0ZSBoZWFkZXIKaW5jbHVkZS9saW51eC9wY2ktZXAtbXNpLmggYW5kIHBsYWNl IHRoZSBkZWNsYXJhdGlvbnMgdGhlcmUuIFRoZSBFUEMgZHJpdmVycwp3YW50IHRvIHVzZSBnZW5l cmljIE1TSSBzdXBwb3J0IHNob3VsZCBpbmNsdWRlIHRoaXMgaGVhZGVyLgoKLSBNYW5pCgo+IEZy YW5rCj4gPiAKPiA+IFJlYXNvbiBpcywgd2UgY2Fubm90IGhhdmUgdGhpcyBnZW5lcmljIGNvZGUg dW5kZXIgZHJpdmVycy9wY2kvY29udHJvbGxlci8gYXMgaXQKPiA+IGlzIG5vdCBhIHN0YW5kYWxv bmUgUENJIGNvbnRyb2xsZXIgYnV0IGEgcGxhdGZvcm0gTVNJIGNvbnRyb2xsZXIuIFNvIGhhdmlu ZyBpdAo+ID4gdW5kZXIgcGNpL2VuZHBvaW50LyBtYWtlcyBtdWNoIHNlbnNlIHRvIG1lLgo+ID4g Cj4gPiBBbmQgdGhpcyBpcyBub3Qgc3BlY2lmaWMgdG8gRVBGIGRyaXZlcnMgYXMgd2VsbCwgc28g d2UgY2Fubm90IGhhdmUgaXQgdW5kZXIKPiA+IHBjaS9lbmRwb2ludC9mdW5jdGlvbnMvLgo+ID4g Cj4gPiAtIE1hbmkKPiA+IAo+ID4gPiBGcmFuawo+ID4gPiAKPiA+ID4gPiAKPiA+ID4gPiBJbiB0 aGUgRVBDIGNvcmUsIHlvdSBjYW4gc3RpbGwgaGF2ZSB0aGUgY2FsbGJhY2tzIHNwZWNpZmljIHRv IGVhY2ggRVBDLiBUaGlzCj4gPiA+ID4gYWxzbyBzb2x2ZXMgeW91ciBvZl9ub2RlIHByb2JsZW0u Cj4gPiA+ID4gCj4gPiA+ID4gLSBNYW5pCj4gPiA+ID4gCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4g PiA+IDIuIE1heWJlIHNvbWUgZXAgY29udHJvbGxlciBoYXZlIGJ1aWx0LWluIGRvb3JiZWxsIHN1 cHBvcnQuIFdyaXRlIHRvIHNvbWUKPiA+ID4gPiA+ID4gPiBhZGRyZXNzIHRvIHRyaWdnZXIgZG9v cmJlbGwgaXJxLgo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gV2Ugd2ls bCBoYW5kbGUgaXQgd2hlbmV2ZXIgc3VjaCBFUCBjb250cm9sbGVycyBhcnJpdmUuIFVudGlsIHRo ZW4sIGxldCdzIGtlZXAgaXQKPiA+ID4gPiA+ID4gc2ltcGxlLgo+ID4gPiA+ID4gPiAKPiA+ID4g PiA+ID4gLSBNYW5pCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IEZyYW5rCj4gPiA+ID4gPiA+ ID4gCj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gKwltdXRleF91bmxvY2soJmVw Yy0+bG9jayk7Cj4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gKwlyZXR1cm4g cmV0Owo+ID4gPiA+ID4gPiA+ID4gPiArfQo+ID4gPiA+ID4gPiA+ID4gPiArRVhQT1JUX1NZTUJP TF9HUEwocGNpX2VwY19hbGxvY19kb29yYmVsbCk7Cj4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4g PiA+ID4gPiA+ID4gKy8qKgo+ID4gPiA+ID4gPiA+ID4gPiArICogcGNpX2VwY19mcmVlX2Rvb3Ji ZWxsKCkgLSBmcmVlIHJlc291cmNlIGFsbG9jYXRlZCBieSBwY2lfZXBjX2FsbG9jX2Rvb3JiZWxs KCkKPiA+ID4gPiA+ID4gPiA+ID4gKyAqCj4gPiA+ID4gPiA+ID4gPiA+ICsgKiBAZXBjOiB0aGUg RVBDIGRldmljZSB0aGF0IG5lZWQgZG9vcmJlbGwgYWRkcmVzcyBhbmQgZGF0YSBmcm9tIFJDLgo+ ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiBTYW1lIGFzIGFib3ZlLgo+ID4gPiA+ID4g PiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ICsgKiBAZnVuY19ubzogdGhlIHBoeXNpY2FsIGVuZHBv aW50IGZ1bmN0aW9uIG51bWJlciBpbiB0aGUgRVBDIGRldmljZS4KPiA+ID4gPiA+ID4gPiA+ID4g KyAqIEB2ZnVuY19ubzogdGhlIHZpcnR1YWwgZW5kcG9pbnQgZnVuY3Rpb24gbnVtYmVyIGluIHRo ZSBwaHlzaWNhbCBmdW5jdGlvbi4KPiA+ID4gPiA+ID4gPiA+ID4gKyAqCj4gPiA+ID4gPiA+ID4g PiA+ICsgKiBSZXR1cm46IDAgc3VjY2Vzcywgb3RoZXIgaXMgZmFpbHVyZQo+ID4gPiA+ID4gPiA+ ID4gPiArICovCj4gPiA+ID4gPiA+ID4gPiA+ICt2b2lkIHBjaV9lcGNfZnJlZV9kb29yYmVsbChz dHJ1Y3QgcGNpX2VwYyAqZXBjLCB1OCBmdW5jX25vLCB1OCB2ZnVuY19ubykKPiA+ID4gPiA+ID4g PiA+ID4gK3sKPiA+ID4gPiA+ID4gPiA+ID4gKwlpZiAoSVNfRVJSX09SX05VTEwoZXBjKSB8fCBm dW5jX25vID49IGVwYy0+bWF4X2Z1bmN0aW9ucykKPiA+ID4gPiA+ID4gPiA+ID4gKwkJcmV0dXJu Owo+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ICsJaWYgKHZmdW5jX25vID4g MCAmJiAoIWVwYy0+bWF4X3ZmcyB8fCB2ZnVuY19ubyA+IGVwYy0+bWF4X3Zmc1tmdW5jX25vXSkp Cj4gPiA+ID4gPiA+ID4gPiA+ICsJCXJldHVybjsKPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ ID4gPiA+ID4gPiArCWlmICghZXBjLT5vcHMtPmZyZWVfZG9vcmJlbGwpCj4gPiA+ID4gPiA+ID4g PiA+ICsJCXJldHVybjsKPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiArCW11 dGV4X2xvY2soJmVwYy0+bG9jayk7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJZXBjLT5vcHMtPmZyZWVf ZG9vcmJlbGwoZXBjLCBmdW5jX25vLCB2ZnVuY19ubyk7Cj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4g PiA+ID4gPiA+IFNhbWUgYXMgc3VnZ2VzdGVkIGFib3ZlLgo+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ ID4gPiA+ID4gPiA+ICsJbXV0ZXhfdW5sb2NrKCZlcGMtPmxvY2spOwo+ID4gPiA+ID4gPiA+ID4g PiArfQo+ID4gPiA+ID4gPiA+ID4gPiArRVhQT1JUX1NZTUJPTF9HUEwocGNpX2VwY19mcmVlX2Rv b3JiZWxsKTsKPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiArc3RhdGljIGly cXJldHVybl90IHBjaV9lcGZfZ2VuZXJpY19kb29yYmVsbF9oYW5kbGVyKGludCBpcnEsIHZvaWQg KmRhdGEpCj4gPiA+ID4gPiA+ID4gPiA+ICt7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJc3RydWN0IHBj aV9lcGYgKmVwZiA9IGRhdGE7Cj4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4g KwlpZiAoZXBmLT5ldmVudF9vcHMgJiYgZXBmLT5ldmVudF9vcHMtPmRvb3JiZWxsKQo+ID4gPiA+ ID4gPiA+ID4gPiArCQllcGYtPmV2ZW50X29wcy0+ZG9vcmJlbGwoZXBmLCBpcnEgLSBlcGYtPnZp cnFfYmFzZSk7Cj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IFNhbWUgYXMgc3VnZ2Vz dGVkIGFib3ZlLgo+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ ID4gPiA+ID4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPiA+ID4gPiA+ID4gPiA+ICt9Cj4gPiA+ ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gK3N0YXRpYyB2b2lkIHBjaV9lcGNfZ2Vu ZXJpY193cml0ZV9tc2lfbXNnKHN0cnVjdCBtc2lfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9tc2cg Km1zZykKPiA+ID4gPiA+ID4gPiA+ID4gK3sKPiA+ID4gPiA+ID4gPiA+ID4gKwlzdHJ1Y3QgcGNp X2VwYyAqZXBjID0gTlVMTDsKPiA+ID4gPiA+ID4gPiA+ID4gKwlzdHJ1Y3QgY2xhc3NfZGV2X2l0 ZXIgaXRlcjsKPiA+ID4gPiA+ID4gPiA+ID4gKwlzdHJ1Y3QgcGNpX2VwZiAqZXBmOwo+ID4gPiA+ ID4gPiA+ID4gPiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4g PiA+ID4gPiA+ID4gPiArCWNsYXNzX2Rldl9pdGVyX2luaXQoJml0ZXIsIHBjaV9lcGNfY2xhc3Ms IE5VTEwsIE5VTEwpOwo+ID4gPiA+ID4gPiA+ID4gPiArCXdoaWxlICgoZGV2ID0gY2xhc3NfZGV2 X2l0ZXJfbmV4dCgmaXRlcikpKSB7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJCWlmIChkZXYtPnBhcmVu dCAhPSBkZXNjLT5kZXYpCj4gPiA+ID4gPiA+ID4gPiA+ICsJCQljb250aW51ZTsKPiA+ID4gPiA+ ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiArCQllcGMgPSB0b19wY2lfZXBjKGRldik7Cj4g PiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gKwkJY2xhc3NfZGV2X2l0ZXJfZXhp dCgmaXRlcik7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJCWJyZWFrOwo+ID4gPiA+ID4gPiA+ID4gPiAr CX0KPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiArCWlmICghZXBjKQo+ID4g PiA+ID4gPiA+ID4gPiArCQlyZXR1cm47Cj4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4g PiA+ID4gKwkvKiBPbmx5IHN1cHBvcnQgb25lIEVQRiBmb3IgZG9vcmJlbGwgKi8KPiA+ID4gPiA+ ID4gPiA+ID4gKwllcGYgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVwYy0+cGNpX2VwZiwg c3RydWN0IHBjaV9lcGYsIGxpc3QpOwo+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4g PiAKPiA+ID4gPiA+ID4gPiA+IE5vIG5lZWQgb2YgdGhpcyBuZXdsaW5lCj4gPiA+ID4gPiA+ID4g PiAKPiA+ID4gPiA+ID4gPiA+ID4gKwlpZiAoIWVwZikKPiA+ID4gPiA+ID4gPiA+ID4gKwkJcmV0 dXJuOwo+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ICsJaWYgKGVwZi0+bXNn ICYmIGRlc2MtPm1zaV9pbmRleCA8IGVwZi0+bnVtX21zZ3MpCj4gPiA+ID4gPiA+ID4gPiA+ICsJ CWVwZi0+bXNnW2Rlc2MtPm1zaV9pbmRleF0gPSAqbXNnOwo+ID4gPiA+ID4gPiA+ID4gPiArfQo+ ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+ID4gUmVtb3ZlIGV4dHJhIG5ld2xpbmUKPiA+ID4gPiA+ID4gPiA+IAo+ID4g PiA+ID4gPiA+ID4gPiArLyoqCj4gPiA+ID4gPiA+ID4gPiA+ICsgKiBwY2lfZXBjX2dlbmVyaWNf YWxsb2NfZG9vcmJlbGwoKSAtIENvbW1vbiBoZWxwIGZ1bmN0aW9uLiBBbGxvY2F0ZSBhZGRyZXNz IHNwYWNlIGZyb20gTVNJCj4gPiA+ID4gPiA+ID4gPiA+ICsgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIKPiA+ID4gPiA+ID4gPiA+ID4gKyAqCj4gPiA+ID4g PiA+ID4gPiA+ICsgKiBAZXBjOiB0aGUgRVBDIGRldmljZSB0aGF0IG5lZWQgZG9vcmJlbGwgYWRk cmVzcyBhbmQgZGF0YSBmcm9tIFJDLgo+ID4gPiA+ID4gPiA+ID4gPiArICogQGZ1bmNfbm86IHRo ZSBwaHlzaWNhbCBlbmRwb2ludCBmdW5jdGlvbiBudW1iZXIgaW4gdGhlIEVQQyBkZXZpY2UuCj4g PiA+ID4gPiA+ID4gPiA+ICsgKiBAdmZ1bmNfbm86IHRoZSB2aXJ0dWFsIGVuZHBvaW50IGZ1bmN0 aW9uIG51bWJlciBpbiB0aGUgcGh5c2ljYWwgZnVuY3Rpb24uCj4gPiA+ID4gPiA+ID4gPiA+ICsg KiBAbnVtX21zZ3M6IHRoZSB0b3RhbCBudW1iZXIgb2YgZG9vcmJlbGwgbWVzc2FnZXMKPiA+ID4g PiA+ID4gPiA+ID4gKyAqCj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IFNhbWUgY29t bWVudCBhcyBmb3IgcGNpX2VwY19hbGxvY19kb29yYmVsbCgpCj4gPiA+ID4gPiA+ID4gPiAKPiA+ ID4gPiA+ID4gPiA+ID4gKyAqIFJlbWFyazogdXNlIHRoaXMgZnVuY3Rpb24gb25seSBpZiBFUEMg ZHJpdmVyIGp1c3QgcmVnaXN0ZXIgb25lIEVQQyBkZXZpY2UuCj4gPiA+ID4gPiA+ID4gPiA+ICsg Kgo+ID4gPiA+ID4gPiA+ID4gPiArICogUmV0dXJuOiAwIHN1Y2Nlc3MsIG90aGVyIGlzIGZhaWx1 cmUKPiA+ID4gPiA+ID4gPiA+ID4gKyAqLwo+ID4gPiA+ID4gPiA+ID4gPiAraW50IHBjaV9lcGNf Z2VuZXJpY19hbGxvY19kb29yYmVsbChzdHJ1Y3QgcGNpX2VwYyAqZXBjLCB1OCBmdW5jX25vLCB1 OCB2ZnVuY19ubywgaW50IG51bV9tc2dzKQo+ID4gPiA+ID4gPiA+ID4gPiArewo+ID4gPiA+ID4g PiA+ID4gPiArCXN0cnVjdCBwY2lfZXBmICplcGY7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJc3RydWN0 IGRldmljZSAqZGV2Owo+ID4gPiA+ID4gPiA+ID4gPiArCWludCB2aXJxLCBsYXN0Owo+ID4gPiA+ ID4gPiA+ID4gPiArCWludCByZXQ7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJaW50IGk7Cj4gPiA+ID4g PiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gKwlpZiAoSVNfRVJSX09SX05VTEwoZXBjKSkK PiA+ID4gPiA+ID4gPiA+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiA+ID4gPiA+ICsK PiA+ID4gPiA+ID4gPiA+ID4gKwkvKiBDdXJyZW50bHkgb25seSBzdXBwb3J0IG9uZSBmdW5jIGFu ZCBvbmUgdmZ1bmMgZm9yIGRvb3JiZWxsICovCj4gPiA+ID4gPiA+ID4gPiA+ICsJaWYgKGZ1bmNf bm8gfHwgdmZ1bmNfbm8pCj4gPiA+ID4gPiA+ID4gPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4g PiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ICsJZXBmID0gbGlzdF9maXJzdF9lbnRy eV9vcl9udWxsKCZlcGMtPnBjaV9lcGYsIHN0cnVjdCBwY2lfZXBmLCBsaXN0KTsKPiA+ID4gPiA+ ID4gPiA+ID4gKwlpZiAoIWVwZikKPiA+ID4gPiA+ID4gPiA+ID4gKwkJcmV0dXJuIC1FSU5WQUw7 Cj4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gKwlkZXYgPSBlcGMtPmRldi5w YXJlbnQ7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJcmV0ID0gcGxhdGZvcm1fbXNpX2RvbWFpbl9hbGxv Y19pcnFzKGRldiwgbnVtX21zZ3MsIHBjaV9lcGNfZ2VuZXJpY193cml0ZV9tc2lfbXNnKTsKPiA+ ID4gPiA+ID4gPiA+ID4gKwlpZiAocmV0KSB7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJCWRldl9lcnIo ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIE1TSVxuIik7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJCXJl dHVybiAtRU5PTUVNOwo+ID4gPiA+ID4gPiA+ID4gPiArCX0KPiA+ID4gPiA+ID4gPiA+ID4gKwo+ ID4gPiA+ID4gPiA+ID4gPiArCWxhc3QgPSAtMTsKPiA+ID4gPiA+ID4gPiA+ID4gKwlmb3IgKGkg PSAwOyBpIDwgbnVtX21zZ3M7IGkrKykgewo+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4g PiBZb3Ugc2hvdWxkIGl0ZXJhdGUgb3ZlciBtc2lfZGVzYyBhcyBiZWxvdzoKPiA+ID4gPiA+ID4g PiA+IAo+ID4gPiA+ID4gPiA+ID4gICAgICAgICBtc2lfbG9ja19kZXNjcyhkZXYpOwo+ID4gPiA+ ID4gPiA+ID4gICAgICAgICBtc2lfZm9yX2VhY2hfZGVzYyhkZXNjLCBkZXYsIE1TSV9ERVNDX0FM TCkgewo+ID4gPiA+ID4gPiA+ID4gCQkuLi4KPiA+ID4gPiA+ID4gPiA+IAl9Cj4gPiA+ID4gPiA+ ID4gPiAJbXNpX3VubG9ja19kZXNjcyhkZXYpOwo+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ ID4gPiA+ICsJCXZpcnEgPSBtc2lfZ2V0X3ZpcnEoZGV2LCBpKTsKPiA+ID4gPiA+ID4gPiA+ID4g KwkJaWYgKGkgPT0gMCkKPiA+ID4gPiA+ID4gPiA+ID4gKwkJCWVwZi0+dmlycV9iYXNlID0gdmly cTsKPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiArCQlyZXQgPSByZXF1ZXN0 X2lycSh2aXJxLCBwY2lfZXBmX2dlbmVyaWNfZG9vcmJlbGxfaGFuZGxlciwgMCwKPiA+ID4gPiA+ ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gCXJlcXVlc3RfaXJxKGRlc2MtPmlycSwgLi4uKQo+ID4g PiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ICsJCQkJICBrYXNwcmludGYoR0ZQX0tFUk5F TCwgInBjaS1lcGMtZG9vcmJlbGwlZCIsIGkpLCBlcGYpOwo+ID4gPiA+ID4gPiA+ID4gPiArCj4g PiA+ID4gPiA+ID4gPiA+ICsJCWlmIChyZXQpIHsKPiA+ID4gPiA+ID4gPiA+ID4gKwkJCWRldl9l cnIoZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgZG9vcmJlbGxcbiIpOwo+ID4gPiA+ID4gPiA+ID4g PiArCQkJZ290byBlcnJfZnJlZV9pcnE7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJCX0KPiA+ID4gPiA+ ID4gPiA+ID4gKwkJbGFzdCA9IGk7Cj4gPiA+ID4gPiA+ID4gPiA+ICsJfQo+ID4gPiA+ID4gPiA+ ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ICsJcmV0dXJuIDA7Cj4gPiA+ID4gPiA+ID4gPiA+ICsK PiA+ID4gPiA+ID4gPiA+ID4gK2Vycl9mcmVlX2lycToKPiA+ID4gPiA+ID4gPiA+ID4gKwlmb3Ig KGkgPSAwOyBpIDwgbGFzdDsgaSsrKQo+ID4gPiA+ID4gPiA+ID4gPiArCQlrZnJlZShmcmVlX2ly cShlcGYtPnZpcnFfYmFzZSArIGksIGVwZikpOwo+ID4gPiA+ID4gPiA+ID4gPiArCXBsYXRmb3Jt X21zaV9kb21haW5fZnJlZV9pcnFzKGRldik7Cj4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ ID4gPiA+ID4gKwlyZXR1cm4gLUVJTlZBTDsKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ ID4gCXJldHVybiByZXQ7Cj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gK30KPiA+ ID4gPiA+ID4gPiA+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9lcGNfZ2VuZXJpY19hbGxvY19k b29yYmVsbCk7Cj4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4g PiA+ID4gWy4uLl0KPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0 IGEvaW5jbHVkZS9saW51eC9wY2ktZXBmLmggYi9pbmNsdWRlL2xpbnV4L3BjaS1lcGYuaAo+ID4g PiA+ID4gPiA+ID4gPiBpbmRleCAzZjQ0YjZhZWM0NzcwLi40ODVjMTQ2YTVlZmUyIDEwMDY0NAo+ ID4gPiA+ID4gPiA+ID4gPiAtLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS1lcGYuaAo+ID4gPiA+ID4g PiA+ID4gPiArKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1lcGYuaAo+ID4gPiA+ID4gPiA+ID4gPiBA QCAtNzksNiArNzksNyBAQCBzdHJ1Y3QgcGNpX2VwY19ldmVudF9vcHMgewo+ID4gPiA+ID4gPiA+ ID4gPiAgCWludCAoKmxpbmtfdXApKHN0cnVjdCBwY2lfZXBmICplcGYpOwo+ID4gPiA+ID4gPiA+ ID4gPiAgCWludCAoKmxpbmtfZG93bikoc3RydWN0IHBjaV9lcGYgKmVwZik7Cj4gPiA+ID4gPiA+ ID4gPiA+ICAJaW50ICgqYm1lKShzdHJ1Y3QgcGNpX2VwZiAqZXBmKTsKPiA+ID4gPiA+ID4gPiA+ ID4gKwlpbnQgKCpkb29yYmVsbCkoc3RydWN0IHBjaV9lcGYgKmVwZiwgaW50IGluZGV4KTsKPiA+ ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4ga2RvYyBtaXNzaW5nLgo+ID4gPiA+ID4gPiA+ ID4gCj4gPiA+ID4gPiA+ID4gPiA+ICB9Owo+ID4gPiA+ID4gPiA+ID4gPiAgCj4gPiA+ID4gPiA+ ID4gPiA+ICAvKioKPiA+ID4gPiA+ID4gPiA+ID4gQEAgLTE4MCw2ICsxODEsOSBAQCBzdHJ1Y3Qg cGNpX2VwZiB7Cj4gPiA+ID4gPiA+ID4gPiA+ICAJdW5zaWduZWQgbG9uZwkJdmZ1bmN0aW9uX251 bV9tYXA7Cj4gPiA+ID4gPiA+ID4gPiA+ICAJc3RydWN0IGxpc3RfaGVhZAlwY2lfdmVwZjsKPiA+ ID4gPiA+ID4gPiA+ID4gIAljb25zdCBzdHJ1Y3QgcGNpX2VwY19ldmVudF9vcHMgKmV2ZW50X29w czsKPiA+ID4gPiA+ID4gPiA+ID4gKwlzdHJ1Y3QgbXNpX21zZyAqbXNnOwo+ID4gPiA+ID4gPiA+ ID4gPiArCXUxNiBudW1fbXNnczsKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gbnVt X2RiCj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IFlvdSBhbHNvIG5lZWQgdG8gYWRk IGtkb2MgZm9yIGVhY2ggbmV3IG1lbWJlci4KPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ ID4gLSBNYW5pCj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IC0tIAo+ID4gPiA+ID4g PiA+ID4g4K6u4K6j4K6/4K614K6j4K+N4K6j4K6p4K+NIOCumuCupOCuvuCumuCuv+CuteCuruCv jQo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gLS0gCj4gPiA+ID4gPiA+IOCuruCuo+Cuv+CuteCu o+CvjeCuo+CuqeCvjSDgrprgrqTgrr7grprgrr/grrXgrq7gr40KPiA+ID4gPiAKPiA+ID4gPiAt LSAKPiA+ID4gPiDgrq7grqPgrr/grrXgrqPgr43grqPgrqngr40g4K6a4K6k4K6+4K6a4K6/4K61 4K6u4K+NCj4gPiAKPiA+IC0tIAo+ID4g4K6u4K6j4K6/4K614K6j4K+N4K6j4K6p4K+NIOCumuCu pOCuvuCumuCuv+CuteCuruCvjQoKLS0gCuCuruCuo+Cuv+CuteCuo+CvjeCuo+CuqeCvjSDgrprg rqTgrr7grprgrr/grrXgrq7gr40KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJu ZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK