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 89D58A4E; Fri, 7 Oct 2022 09:15:40 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5D5C1C433C1; Fri, 7 Oct 2022 09:15:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1665134140; bh=qVJoQ6YlfJEzLvx32Gk1iCvr34KtLSNoE7vybUBEf/M=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=vFg7oKfCjVey3WEqhHGHWUeZ7O86HKFqJBQtjwGxKZmu2mmkWTEoTx6EAQnQLTOLF u32dMb288GLNFKRjsNZW2zu2JAAoPqDpgWV+Y1jmAGbJ2/ewuQGnvX1F2ZrjGgb8EY MWPIFuVTtznuxFEQu8D1n1aF/zKjWRqEMoM8ulyX/19JAqF4wdMn3r6948x9qyDPO6 pXpf0cAcmEVsQHn8dKwHBAoPveMDJWxczY5f4stbFrDj/OOCt51ETVUXS14rNPgag+ CAx6y5aeVLicCeqvCVbIA+bWW/oIFsy5jL8JCRXwPVZqyAkeqIt4ISOalzXH2mH1B+ aoLFmE8z+rxJw== Date: Fri, 7 Oct 2022 11:15:30 +0200 From: Lorenzo Pieralisi To: Frank Li Cc: maz@kernel.org, tglx@linutronix.de, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kw@linux.com, bhelgaas@google.com, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, peng.fan@nxp.com, aisheng.dong@nxp.com, jdmason@kudzu.us, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, kishon@ti.com, lorenzo.pieralisi@arm.com, ntb@lists.linux.dev, lznuaa@gmail.com, imx@lists.linux.dev, manivannan.sadhasivam@linaro.org Subject: Re: [PATCH v12 6/6] PCI: endpoint: Add vNTB MSI support Message-ID: References: <20220922161246.20586-1-Frank.Li@nxp.com> <20220922161246.20586-7-Frank.Li@nxp.com> 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: <20220922161246.20586-7-Frank.Li@nxp.com> On Thu, Sep 22, 2022 at 11:12:46AM -0500, Frank Li wrote: > ┌───────┐ ┌──────────┐ > │ │ │ │ > ┌─────────────┐ │ PCI │ │ PCI Host │ > │ MSI │◄┐ │ EP │ │ │ > │ Controller │ │ │ │ 3.MSI Write │ │ > └────────┬────┘ └─┼───────┼───────────────────┤ │ > ▲ │ │ │ ├─BAR_n │ > │ └────────┼───────┼──────────────────►│ │ > │ │ │ 2.Call Back │ │ > │ │ │ write_msi_msg() │ │ > │ │ │ │ │ > │ └───┬───┘ └──────────┘ > │ │ > └───────────────────┘ > 1.platform_msi_domain_alloc_irqs() > > There is no defined way of raising IRQs by PCI host to the PCI endpoint. > Only define MSI/MSI-X to let EP notified RC status change. This picture is misleading, especially (2). IIUC all this patch is doing is implementing an NTB DB in the EP, that's it, we should reword the commit log as such. We are in the merge window - it is very likely this patch should be postponed to v6.2, I didn't notice that the IRQchip changes went in - apologies. > The memory assigned for BAR region by the PCI host is mapped to the > message address of platform msi interrupt controller in PCI Endpoint. > Such that, whenever the PCI host writes to the BAR region, it will > trigger an IRQ in the Endpoint. > > Basic working follow as > 1. EP function driver call platform_msi_domain_alloc_irqs() alloc a > MSI irq from MSI controller with call back function write_msi_msg(); > 2. write_msg_msg will config BAR and map to address defined in msi_msg; > 3. Host side trigger an IRQ in Endpoint by write to BAR region. > > Add MSI support for pci-epf-vntb. Query if system has an MSI controller. > Set up doorbell address according to struct msi_msg. > > So PCI RC can write this doorbell address to trigger EP side's IRQ. > > If no MSI controller exists, fall back to software polling. > > Signed-off-by: Frank Li > --- > drivers/pci/endpoint/functions/pci-epf-vntb.c | 148 +++++++++++++++--- > 1 file changed, 127 insertions(+), 21 deletions(-) > > diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c > index acea753af29ed..8fdeac2201e29 100644 > --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c > +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c > @@ -44,6 +44,7 @@ > #include > #include > #include > +#include > > static struct workqueue_struct *kpcintb_workqueue; > > @@ -137,11 +138,14 @@ struct epf_ntb { > struct epf_ntb_ctrl *reg; > > u32 *epf_db; > + phys_addr_t epf_db_phys; > > phys_addr_t vpci_mw_phy[MAX_MW]; > void __iomem *vpci_mw_addr[MAX_MW]; > > struct delayed_work cmd_handler; > + > + int msi_virqbase; > }; > > #define to_epf_ntb(epf_group) container_of((epf_group), struct epf_ntb, group) > @@ -256,10 +260,13 @@ static void epf_ntb_cmd_handler(struct work_struct *work) > > ntb = container_of(work, struct epf_ntb, cmd_handler.work); > > - for (i = 1; i < ntb->db_count; i++) { > - if (ntb->epf_db[i]) { > - ntb_db_event(&ntb->ntb, i); > - ntb->epf_db[i] = 0; > + if (!ntb->epf_db_phys) { > + for (i = 1; i < ntb->db_count; i++) { > + if (ntb->epf_db[i]) { > + ntb->db |= 1 << (i - 1); > + ntb_db_event(&ntb->ntb, i); > + ntb->epf_db[i] = 0; > + } > } > } > > @@ -464,7 +471,7 @@ static int epf_ntb_config_spad_bar_alloc(struct epf_ntb *ntb) > > for (i = 0; i < ntb->db_count; i++) { > ntb->reg->db_data[i] = 1 + i; > - ntb->reg->db_offset[i] = 0; > + ntb->reg->db_offset[i] = sizeof(u32) * i; Why sizeof(u32) ? > } > > return 0; > @@ -517,6 +524,28 @@ static int epf_ntb_configure_interrupt(struct epf_ntb *ntb) > return 0; > } > > +static int epf_ntb_db_size(struct epf_ntb *ntb) > +{ > + const struct pci_epc_features *epc_features; > + size_t size = sizeof(u32) * ntb->db_count; Same question. > + u32 align; > + > + epc_features = pci_epc_get_features(ntb->epf->epc, > + ntb->epf->func_no, > + ntb->epf->vfunc_no); > + align = epc_features->align; > + > + if (size < 128) > + size = 128; > + > + if (align) > + size = ALIGN(size, align); > + else > + size = roundup_pow_of_two(size); > + > + return size; > +} > + > /** > * epf_ntb_db_bar_init() - Configure Doorbell window BARs > * @ntb: NTB device that facilitates communication between HOST and VHOST > @@ -540,27 +569,26 @@ static int epf_ntb_db_bar_init(struct epf_ntb *ntb) > ntb->epf->func_no, > ntb->epf->vfunc_no); > align = epc_features->align; > - > - if (size < 128) > - size = 128; > - > - if (align) > - size = ALIGN(size, align); > - else > - size = roundup_pow_of_two(size); > + size = epf_ntb_db_size(ntb); > > barno = ntb->epf_ntb_bar[BAR_DB]; > + epf_bar = &ntb->epf->bar[barno]; > > - mw_addr = pci_epf_alloc_space(ntb->epf, size, barno, align, 0); > - if (!mw_addr) { > - dev_err(dev, "Failed to allocate OB address\n"); > - return -ENOMEM; > + if (ntb->epf_db_phys) { > + mw_addr = NULL; > + epf_bar->phys_addr = ntb->epf_db_phys; > + epf_bar->barno = barno; > + epf_bar->size = size; > + } else { > + mw_addr = pci_epf_alloc_space(ntb->epf, size, barno, align, 0); > + if (!mw_addr) { > + dev_err(dev, "Failed to allocate doorbell address\n"); > + return -ENOMEM; > + } > } > > ntb->epf_db = mw_addr; > > - epf_bar = &ntb->epf->bar[barno]; > - > ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no, epf_bar); > if (ret) { > dev_err(dev, "Doorbell BAR set failed\n"); > @@ -719,6 +747,83 @@ static int epf_ntb_init_epc_bar(struct epf_ntb *ntb) > return 0; > } > > +#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN > +static void epf_ntb_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg) > +{ > + struct epf_ntb *ntb = dev_get_drvdata(desc->dev); > + struct epf_ntb_ctrl *reg = ntb->reg; > + int size = epf_ntb_db_size(ntb); > + u64 addr; > + > + addr = msg->address_hi; > + addr <<= 32; > + addr |= msg->address_lo; > + > + reg->db_data[desc->msi_index] = msg->data; > + > + if (!desc->msi_index) > + ntb->epf_db_phys = round_down(addr, size); > + > + reg->db_offset[desc->msi_index] = addr - ntb->epf_db_phys; > +} > +#endif Can we move this hunk down into the same #ifdef guard please ? > +static irqreturn_t epf_ntb_interrupt_handler(int irq, void *data) > +{ > + struct epf_ntb *ntb = data; > + int index; > + > + index = irq - ntb->msi_virqbase; > + ntb->db |= 1 << (index - 1); > + ntb_db_event(&ntb->ntb, index); > + > + return IRQ_HANDLED; > +} > + > +#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN > +static void epf_ntb_epc_msi_init(struct epf_ntb *ntb) > +{ > + struct device *dev = &ntb->epf->dev; > + struct irq_domain *domain; > + int virq; > + int ret; > + int i; > + > + domain = dev_get_msi_domain(ntb->epf->epc->dev.parent); > + if (!domain) > + return; > + > + dev_set_msi_domain(dev, domain); > + > + if (platform_msi_domain_alloc_irqs(&ntb->epf->dev, > + ntb->db_count, > + epf_ntb_write_msi_msg)) { > + dev_err(dev, "Can't allocate MSI, falling back to polling mode\n"); > + return; > + } > + dev_info(dev, "Using MSI as doorbell\n"); Is it really useful to print this in the kernel log ? dev_dbg seems more suitable to me. > + > + for (i = 0; i < ntb->db_count; i++) { > + virq = msi_get_virq(dev, i); > + ret = devm_request_irq(dev, virq, > + epf_ntb_interrupt_handler, 0, > + "pci_epf_vntb", ntb); > + > + if (ret) { > + dev_err(dev, "Failed to request doorbell IRQ! Falling back to polling mode"); > + ntb->epf_db_phys = 0; > + break; Doesn't this require a platform_msi_domain_free_irqs() ? Thanks, Lorenzo > + } > + > + if (!i) > + ntb->msi_virqbase = virq; /* msi start virq number */ > + } > +} > +#else > +static void epf_ntb_epc_msi_init(struct epf_ntb *ntb) > +{ > +} > +#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */ > /** > * epf_ntb_epc_init() - Initialize NTB interface > * @ntb: NTB device that facilitates communication between HOST and VHOST > @@ -1320,14 +1425,15 @@ static int epf_ntb_bind(struct pci_epf *epf) > goto err_bar_alloc; > } > > + epf_set_drvdata(epf, ntb); > + epf_ntb_epc_msi_init(ntb); > + > ret = epf_ntb_epc_init(ntb); > if (ret) { > dev_err(dev, "Failed to initialize EPC\n"); > goto err_bar_alloc; > } > > - epf_set_drvdata(epf, ntb); > - > pci_space[0] = (ntb->vntb_pid << 16) | ntb->vntb_vid; > pci_vntb_table[0].vendor = ntb->vntb_vid; > pci_vntb_table[0].device = ntb->vntb_pid; > -- > 2.35.1 > 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 216B2C433F5 for ; Fri, 7 Oct 2022 09:16:53 +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=yfr67krdJsxE+W0+dqUKBf3CyqtRiijS+KSCd9ETjjQ=; b=0lWruLA2OwIyU4 C7bnJzFm4tu3xnwzgrAfXmbFAMFHas5CPA3AZAPZ4iLylfNmqWU3y5OxVrkQIberxx7vjJh++JGfI kJkwQsr/XOqFEb05ci95UfhQf52MffPFjM+DVwonwjcZSVLuALC3nPQKnFi2pHza9TB+jUcH2NwXU fRfQfIwb3SC03c6JDCe2ReHzYik9CB4Arh8Dd/P5H5mmQ0O1QjmZOk4jo7ggy5UuMDI+JaAiBXQi4 sjd9ij3Igtp3HXPOtZaahyaYZWm2spce0HxpE7IevffiSX7yJraVChi40VyBh9y8ixPqIzkq37Fvx sn44TJwe+fPebt+7Kmgg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ogjSN-008FtN-7g; Fri, 07 Oct 2022 09:15:47 +0000 Received: from ams.source.kernel.org ([2604:1380:4601:e00::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ogjSJ-008FmQ-5g for linux-arm-kernel@lists.infradead.org; Fri, 07 Oct 2022 09:15:45 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 96FFEB8229B; Fri, 7 Oct 2022 09:15:41 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5D5C1C433C1; Fri, 7 Oct 2022 09:15:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1665134140; bh=qVJoQ6YlfJEzLvx32Gk1iCvr34KtLSNoE7vybUBEf/M=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=vFg7oKfCjVey3WEqhHGHWUeZ7O86HKFqJBQtjwGxKZmu2mmkWTEoTx6EAQnQLTOLF u32dMb288GLNFKRjsNZW2zu2JAAoPqDpgWV+Y1jmAGbJ2/ewuQGnvX1F2ZrjGgb8EY MWPIFuVTtznuxFEQu8D1n1aF/zKjWRqEMoM8ulyX/19JAqF4wdMn3r6948x9qyDPO6 pXpf0cAcmEVsQHn8dKwHBAoPveMDJWxczY5f4stbFrDj/OOCt51ETVUXS14rNPgag+ CAx6y5aeVLicCeqvCVbIA+bWW/oIFsy5jL8JCRXwPVZqyAkeqIt4ISOalzXH2mH1B+ aoLFmE8z+rxJw== Date: Fri, 7 Oct 2022 11:15:30 +0200 From: Lorenzo Pieralisi To: Frank Li Cc: maz@kernel.org, tglx@linutronix.de, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kw@linux.com, bhelgaas@google.com, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, peng.fan@nxp.com, aisheng.dong@nxp.com, jdmason@kudzu.us, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, kishon@ti.com, lorenzo.pieralisi@arm.com, ntb@lists.linux.dev, lznuaa@gmail.com, imx@lists.linux.dev, manivannan.sadhasivam@linaro.org Subject: Re: [PATCH v12 6/6] PCI: endpoint: Add vNTB MSI support Message-ID: References: <20220922161246.20586-1-Frank.Li@nxp.com> <20220922161246.20586-7-Frank.Li@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220922161246.20586-7-Frank.Li@nxp.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221007_021543_524432_D05BE766 X-CRM114-Status: GOOD ( 38.87 ) 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 T24gVGh1LCBTZXAgMjIsIDIwMjIgYXQgMTE6MTI6NDZBTSAtMDUwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gICAgICAgICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAg ICAgICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAKPiAgICAg ICAgICAgICAgICAgICAgICAg4pSCICAgICAgIOKUgiAgICAgICAgICAgICAgICAgICDilIIgICAg ICAgICAg4pSCCj4gICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUkCAgIOKUgiBQQ0kgICDilIIgICAgICAgICAgICAgICAgICAg4pSCIFBDSSBIb3N0IOKUggo+ ICAgICDilIIgTVNJICAgICAgICAg4pSC4peE4pSQIOKUgiBFUCAgICDilIIgICAgICAgICAgICAg ICAgICAg4pSCICAgICAgICAgIOKUggo+ICAgICDilIIgQ29udHJvbGxlciAg4pSCIOKUgiDilIIg ICAgICAg4pSCIDMuTVNJIFdyaXRlICAgICAgIOKUgiAgICAgICAgICDilIIKPiAgICAg4pSU4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSYIOKUlOKUgOKUvOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUpCAgICAgICAgICDilIIKPiAgICAgICDilrIgICAgICDilIIgICAg ICAgIOKUgiAgICAgICDilIIgICAgICAgICAgICAgICAgICAg4pSc4pSAQkFSX24gICAg4pSCCj4g ICAgICAg4pSCICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pa64pSCICAgICAgICAgIOKUggo+ICAgICAgIOKUgiAgICAgICAgICAgICAgIOKU giAgICAgICDilIIgMi5DYWxsIEJhY2sgICAgICAg4pSCICAgICAgICAgIOKUggo+ICAgICAgIOKU giAgICAgICAgICAgICAgIOKUgiAgICAgICDilIIgICB3cml0ZV9tc2lfbXNnKCkg4pSCICAgICAg ICAgIOKUggo+ICAgICAgIOKUgiAgICAgICAgICAgICAgIOKUgiAgICAgICDilIIgICAgICAgICAg ICAgICAgICAg4pSCICAgICAgICAgIOKUggo+ICAgICAgIOKUgiAgICAgICAgICAgICAgIOKUlOKU gOKUgOKUgOKUrOKUgOKUgOKUgOKUmCAgICAgICAgICAgICAgICAgICDilJTilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilJgKPiAgICAgICDilIIgICAgICAgICAgICAgICAgICAg4pSCCj4g ICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSYCj4gICAgICAgMS5wbGF0Zm9ybV9tc2lfZG9tYWluX2FsbG9jX2lycXMoKQo+ IAo+IFRoZXJlIGlzIG5vIGRlZmluZWQgd2F5IG9mIHJhaXNpbmcgSVJRcyBieSBQQ0kgaG9zdCB0 byB0aGUgUENJIGVuZHBvaW50Lgo+IE9ubHkgZGVmaW5lIE1TSS9NU0ktWCB0byBsZXQgRVAgbm90 aWZpZWQgUkMgc3RhdHVzIGNoYW5nZS4KClRoaXMgcGljdHVyZSBpcyBtaXNsZWFkaW5nLCBlc3Bl Y2lhbGx5ICgyKS4gSUlVQyBhbGwgdGhpcyBwYXRjaCBpcwpkb2luZyBpcyBpbXBsZW1lbnRpbmcg YW4gTlRCIERCIGluIHRoZSBFUCwgdGhhdCdzIGl0LCB3ZSBzaG91bGQKcmV3b3JkIHRoZSBjb21t aXQgbG9nIGFzIHN1Y2guCgpXZSBhcmUgaW4gdGhlIG1lcmdlIHdpbmRvdyAtIGl0IGlzIHZlcnkg bGlrZWx5IHRoaXMgcGF0Y2ggc2hvdWxkCmJlIHBvc3Rwb25lZCB0byB2Ni4yLCBJIGRpZG4ndCBu b3RpY2UgdGhhdCB0aGUgSVJRY2hpcCBjaGFuZ2VzCndlbnQgaW4gLSBhcG9sb2dpZXMuCgo+IFRo ZSBtZW1vcnkgYXNzaWduZWQgZm9yIEJBUiByZWdpb24gYnkgdGhlIFBDSSBob3N0IGlzIG1hcHBl ZCB0byB0aGUKPiBtZXNzYWdlIGFkZHJlc3Mgb2YgcGxhdGZvcm0gbXNpIGludGVycnVwdCBjb250 cm9sbGVyIGluIFBDSSBFbmRwb2ludC4KPiBTdWNoIHRoYXQsIHdoZW5ldmVyIHRoZSBQQ0kgaG9z dCB3cml0ZXMgdG8gdGhlIEJBUiByZWdpb24sIGl0IHdpbGwKPiB0cmlnZ2VyIGFuIElSUSBpbiB0 aGUgRW5kcG9pbnQuCj4gCj4gQmFzaWMgd29ya2luZyBmb2xsb3cgYXMKPiAxLiBFUCBmdW5jdGlv biBkcml2ZXIgY2FsbCBwbGF0Zm9ybV9tc2lfZG9tYWluX2FsbG9jX2lycXMoKSBhbGxvYyBhCj4g TVNJIGlycSBmcm9tIE1TSSBjb250cm9sbGVyIHdpdGggY2FsbCBiYWNrIGZ1bmN0aW9uIHdyaXRl X21zaV9tc2coKTsKPiAyLiB3cml0ZV9tc2dfbXNnIHdpbGwgY29uZmlnIEJBUiBhbmQgbWFwIHRv IGFkZHJlc3MgZGVmaW5lZCBpbiBtc2lfbXNnOwo+IDMuIEhvc3Qgc2lkZSB0cmlnZ2VyIGFuIElS USBpbiBFbmRwb2ludCBieSB3cml0ZSB0byBCQVIgcmVnaW9uLgo+IAo+IEFkZCBNU0kgc3VwcG9y dCBmb3IgcGNpLWVwZi12bnRiLiBRdWVyeSBpZiBzeXN0ZW0gaGFzIGFuIE1TSSBjb250cm9sbGVy Lgo+IFNldCB1cCBkb29yYmVsbCBhZGRyZXNzIGFjY29yZGluZyB0byBzdHJ1Y3QgbXNpX21zZy4K PiAKPiBTbyBQQ0kgUkMgY2FuIHdyaXRlIHRoaXMgZG9vcmJlbGwgYWRkcmVzcyB0byB0cmlnZ2Vy IEVQIHNpZGUncyBJUlEuCj4gCj4gSWYgbm8gTVNJIGNvbnRyb2xsZXIgZXhpc3RzLCBmYWxsIGJh Y2sgdG8gc29mdHdhcmUgcG9sbGluZy4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBGcmFuayBMaSA8RnJh bmsuTGlAbnhwLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9wY2kvZW5kcG9pbnQvZnVuY3Rpb25zL3Bj aS1lcGYtdm50Yi5jIHwgMTQ4ICsrKysrKysrKysrKysrKy0tLQo+ICAxIGZpbGUgY2hhbmdlZCwg MTI3IGluc2VydGlvbnMoKyksIDIxIGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL3BjaS9lbmRwb2ludC9mdW5jdGlvbnMvcGNpLWVwZi12bnRiLmMgYi9kcml2ZXJzL3BjaS9l bmRwb2ludC9mdW5jdGlvbnMvcGNpLWVwZi12bnRiLmMKPiBpbmRleCBhY2VhNzUzYWYyOWVkLi44 ZmRlYWMyMjAxZTI5IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcGNpL2VuZHBvaW50L2Z1bmN0aW9u cy9wY2ktZXBmLXZudGIuYwo+ICsrKyBiL2RyaXZlcnMvcGNpL2VuZHBvaW50L2Z1bmN0aW9ucy9w Y2ktZXBmLXZudGIuYwo+IEBAIC00NCw2ICs0NCw3IEBACj4gICNpbmNsdWRlIDxsaW51eC9wY2kt ZXBjLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9wY2ktZXBmLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9u dGIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21zaS5oPgo+ICAKPiAgc3RhdGljIHN0cnVjdCB3b3Jr cXVldWVfc3RydWN0ICprcGNpbnRiX3dvcmtxdWV1ZTsKPiAgCj4gQEAgLTEzNywxMSArMTM4LDE0 IEBAIHN0cnVjdCBlcGZfbnRiIHsKPiAgCXN0cnVjdCBlcGZfbnRiX2N0cmwgKnJlZzsKPiAgCj4g IAl1MzIgKmVwZl9kYjsKPiArCXBoeXNfYWRkcl90IGVwZl9kYl9waHlzOwo+ICAKPiAgCXBoeXNf YWRkcl90IHZwY2lfbXdfcGh5W01BWF9NV107Cj4gIAl2b2lkIF9faW9tZW0gKnZwY2lfbXdfYWRk cltNQVhfTVddOwo+ICAKPiAgCXN0cnVjdCBkZWxheWVkX3dvcmsgY21kX2hhbmRsZXI7Cj4gKwo+ ICsJaW50IG1zaV92aXJxYmFzZTsKPiAgfTsKPiAgCj4gICNkZWZpbmUgdG9fZXBmX250YihlcGZf Z3JvdXApIGNvbnRhaW5lcl9vZigoZXBmX2dyb3VwKSwgc3RydWN0IGVwZl9udGIsIGdyb3VwKQo+ IEBAIC0yNTYsMTAgKzI2MCwxMyBAQCBzdGF0aWMgdm9pZCBlcGZfbnRiX2NtZF9oYW5kbGVyKHN0 cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiAgCj4gIAludGIgPSBjb250YWluZXJfb2Yod29yaywg c3RydWN0IGVwZl9udGIsIGNtZF9oYW5kbGVyLndvcmspOwo+ICAKPiAtCWZvciAoaSA9IDE7IGkg PCBudGItPmRiX2NvdW50OyBpKyspIHsKPiAtCQlpZiAobnRiLT5lcGZfZGJbaV0pIHsKPiAtCQkJ bnRiX2RiX2V2ZW50KCZudGItPm50YiwgaSk7Cj4gLQkJCW50Yi0+ZXBmX2RiW2ldID0gMDsKPiAr CWlmICghbnRiLT5lcGZfZGJfcGh5cykgewo+ICsJCWZvciAoaSA9IDE7IGkgPCBudGItPmRiX2Nv dW50OyBpKyspIHsKPiArCQkJaWYgKG50Yi0+ZXBmX2RiW2ldKSB7Cj4gKwkJCQludGItPmRiIHw9 IDEgPDwgKGkgLSAxKTsKPiArCQkJCW50Yl9kYl9ldmVudCgmbnRiLT5udGIsIGkpOwo+ICsJCQkJ bnRiLT5lcGZfZGJbaV0gPSAwOwo+ICsJCQl9Cj4gIAkJfQo+ICAJfQo+ICAKPiBAQCAtNDY0LDcg KzQ3MSw3IEBAIHN0YXRpYyBpbnQgZXBmX250Yl9jb25maWdfc3BhZF9iYXJfYWxsb2Moc3RydWN0 IGVwZl9udGIgKm50YikKPiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgbnRiLT5kYl9jb3VudDsgaSsr KSB7Cj4gIAkJbnRiLT5yZWctPmRiX2RhdGFbaV0gPSAxICsgaTsKPiAtCQludGItPnJlZy0+ZGJf b2Zmc2V0W2ldID0gMDsKPiArCQludGItPnJlZy0+ZGJfb2Zmc2V0W2ldID0gc2l6ZW9mKHUzMikg KiBpOwoKV2h5IHNpemVvZih1MzIpID8KCj4gIAl9Cj4gIAo+ICAJcmV0dXJuIDA7Cj4gQEAgLTUx Nyw2ICs1MjQsMjggQEAgc3RhdGljIGludCBlcGZfbnRiX2NvbmZpZ3VyZV9pbnRlcnJ1cHQoc3Ry dWN0IGVwZl9udGIgKm50YikKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICtzdGF0aWMgaW50IGVw Zl9udGJfZGJfc2l6ZShzdHJ1Y3QgZXBmX250YiAqbnRiKQo+ICt7Cj4gKwljb25zdCBzdHJ1Y3Qg cGNpX2VwY19mZWF0dXJlcyAqZXBjX2ZlYXR1cmVzOwo+ICsJc2l6ZV90IHNpemUgPSBzaXplb2Yo dTMyKSAqIG50Yi0+ZGJfY291bnQ7CgpTYW1lIHF1ZXN0aW9uLgoKPiArCXUzMiBhbGlnbjsKPiAr Cj4gKwllcGNfZmVhdHVyZXMgPSBwY2lfZXBjX2dldF9mZWF0dXJlcyhudGItPmVwZi0+ZXBjLAo+ ICsJCQkJCSAgICBudGItPmVwZi0+ZnVuY19ubywKPiArCQkJCQkgICAgbnRiLT5lcGYtPnZmdW5j X25vKTsKPiArCWFsaWduID0gZXBjX2ZlYXR1cmVzLT5hbGlnbjsKPiArCj4gKwlpZiAoc2l6ZSA8 IDEyOCkKPiArCQlzaXplID0gMTI4Owo+ICsKPiArCWlmIChhbGlnbikKPiArCQlzaXplID0gQUxJ R04oc2l6ZSwgYWxpZ24pOwo+ICsJZWxzZQo+ICsJCXNpemUgPSByb3VuZHVwX3Bvd19vZl90d28o c2l6ZSk7Cj4gKwo+ICsJcmV0dXJuIHNpemU7Cj4gK30KPiArCj4gIC8qKgo+ICAgKiBlcGZfbnRi X2RiX2Jhcl9pbml0KCkgLSBDb25maWd1cmUgRG9vcmJlbGwgd2luZG93IEJBUnMKPiAgICogQG50 YjogTlRCIGRldmljZSB0aGF0IGZhY2lsaXRhdGVzIGNvbW11bmljYXRpb24gYmV0d2VlbiBIT1NU IGFuZCBWSE9TVAo+IEBAIC01NDAsMjcgKzU2OSwyNiBAQCBzdGF0aWMgaW50IGVwZl9udGJfZGJf YmFyX2luaXQoc3RydWN0IGVwZl9udGIgKm50YikKPiAgCQkJCQkgICAgbnRiLT5lcGYtPmZ1bmNf bm8sCj4gIAkJCQkJICAgIG50Yi0+ZXBmLT52ZnVuY19ubyk7Cj4gIAlhbGlnbiA9IGVwY19mZWF0 dXJlcy0+YWxpZ247Cj4gLQo+IC0JaWYgKHNpemUgPCAxMjgpCj4gLQkJc2l6ZSA9IDEyODsKPiAt Cj4gLQlpZiAoYWxpZ24pCj4gLQkJc2l6ZSA9IEFMSUdOKHNpemUsIGFsaWduKTsKPiAtCWVsc2UK PiAtCQlzaXplID0gcm91bmR1cF9wb3dfb2ZfdHdvKHNpemUpOwo+ICsJc2l6ZSA9IGVwZl9udGJf ZGJfc2l6ZShudGIpOwo+ICAKPiAgCWJhcm5vID0gbnRiLT5lcGZfbnRiX2JhcltCQVJfREJdOwo+ ICsJZXBmX2JhciA9ICZudGItPmVwZi0+YmFyW2Jhcm5vXTsKPiAgCj4gLQltd19hZGRyID0gcGNp X2VwZl9hbGxvY19zcGFjZShudGItPmVwZiwgc2l6ZSwgYmFybm8sIGFsaWduLCAwKTsKPiAtCWlm ICghbXdfYWRkcikgewo+IC0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIE9CIGFk ZHJlc3NcbiIpOwo+IC0JCXJldHVybiAtRU5PTUVNOwo+ICsJaWYgKG50Yi0+ZXBmX2RiX3BoeXMp IHsKPiArCQltd19hZGRyID0gTlVMTDsKPiArCQllcGZfYmFyLT5waHlzX2FkZHIgPSBudGItPmVw Zl9kYl9waHlzOwo+ICsJCWVwZl9iYXItPmJhcm5vID0gYmFybm87Cj4gKwkJZXBmX2Jhci0+c2l6 ZSA9IHNpemU7Cj4gKwl9IGVsc2Ugewo+ICsJCW13X2FkZHIgPSBwY2lfZXBmX2FsbG9jX3NwYWNl KG50Yi0+ZXBmLCBzaXplLCBiYXJubywgYWxpZ24sIDApOwo+ICsJCWlmICghbXdfYWRkcikgewo+ ICsJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkb29yYmVsbCBhZGRyZXNzXG4i KTsKPiArCQkJcmV0dXJuIC1FTk9NRU07Cj4gKwkJfQo+ICAJfQo+ICAKPiAgCW50Yi0+ZXBmX2Ri ID0gbXdfYWRkcjsKPiAgCj4gLQllcGZfYmFyID0gJm50Yi0+ZXBmLT5iYXJbYmFybm9dOwo+IC0K PiAgCXJldCA9IHBjaV9lcGNfc2V0X2JhcihudGItPmVwZi0+ZXBjLCBudGItPmVwZi0+ZnVuY19u bywgbnRiLT5lcGYtPnZmdW5jX25vLCBlcGZfYmFyKTsKPiAgCWlmIChyZXQpIHsKPiAgCQlkZXZf ZXJyKGRldiwgIkRvb3JiZWxsIEJBUiBzZXQgZmFpbGVkXG4iKTsKPiBAQCAtNzE5LDYgKzc0Nyw4 MyBAQCBzdGF0aWMgaW50IGVwZl9udGJfaW5pdF9lcGNfYmFyKHN0cnVjdCBlcGZfbnRiICpudGIp Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAKPiArI2lmZGVmIENPTkZJR19HRU5FUklDX01TSV9JUlFf RE9NQUlOCj4gK3N0YXRpYyB2b2lkIGVwZl9udGJfd3JpdGVfbXNpX21zZyhzdHJ1Y3QgbXNpX2Rl c2MgKmRlc2MsIHN0cnVjdCBtc2lfbXNnICptc2cpCj4gK3sKPiArCXN0cnVjdCBlcGZfbnRiICpu dGIgPSBkZXZfZ2V0X2RydmRhdGEoZGVzYy0+ZGV2KTsKPiArCXN0cnVjdCBlcGZfbnRiX2N0cmwg KnJlZyA9IG50Yi0+cmVnOwo+ICsJaW50IHNpemUgPSBlcGZfbnRiX2RiX3NpemUobnRiKTsKPiAr CXU2NCBhZGRyOwo+ICsKPiArCWFkZHIgPSBtc2ctPmFkZHJlc3NfaGk7Cj4gKwlhZGRyIDw8PSAz MjsKPiArCWFkZHIgfD0gbXNnLT5hZGRyZXNzX2xvOwo+ICsKPiArCXJlZy0+ZGJfZGF0YVtkZXNj LT5tc2lfaW5kZXhdID0gbXNnLT5kYXRhOwo+ICsKPiArCWlmICghZGVzYy0+bXNpX2luZGV4KQo+ ICsJCW50Yi0+ZXBmX2RiX3BoeXMgPSByb3VuZF9kb3duKGFkZHIsIHNpemUpOwo+ICsKPiArCXJl Zy0+ZGJfb2Zmc2V0W2Rlc2MtPm1zaV9pbmRleF0gPSBhZGRyIC0gbnRiLT5lcGZfZGJfcGh5czsK PiArfQo+ICsjZW5kaWYKCkNhbiB3ZSBtb3ZlIHRoaXMgaHVuayBkb3duIGludG8gdGhlIHNhbWUg I2lmZGVmIGd1YXJkIHBsZWFzZSA/Cgo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgZXBmX250Yl9pbnRl cnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ICt7Cj4gKwlzdHJ1Y3QgZXBmX250 YiAqbnRiID0gZGF0YTsKPiArCWludCBpbmRleDsKPiArCj4gKwlpbmRleCA9IGlycSAtIG50Yi0+ bXNpX3ZpcnFiYXNlOwo+ICsJbnRiLT5kYiB8PSAxIDw8IChpbmRleCAtIDEpOwo+ICsJbnRiX2Ri X2V2ZW50KCZudGItPm50YiwgaW5kZXgpOwo+ICsKPiArCXJldHVybiBJUlFfSEFORExFRDsKPiAr fQo+ICsKPiArI2lmZGVmIENPTkZJR19HRU5FUklDX01TSV9JUlFfRE9NQUlOCj4gK3N0YXRpYyB2 b2lkIGVwZl9udGJfZXBjX21zaV9pbml0KHN0cnVjdCBlcGZfbnRiICpudGIpCj4gK3sKPiArCXN0 cnVjdCBkZXZpY2UgKmRldiA9ICZudGItPmVwZi0+ZGV2Owo+ICsJc3RydWN0IGlycV9kb21haW4g KmRvbWFpbjsKPiArCWludCB2aXJxOwo+ICsJaW50IHJldDsKPiArCWludCBpOwo+ICsKPiArCWRv bWFpbiA9IGRldl9nZXRfbXNpX2RvbWFpbihudGItPmVwZi0+ZXBjLT5kZXYucGFyZW50KTsKPiAr CWlmICghZG9tYWluKQo+ICsJCXJldHVybjsKPiArCj4gKwlkZXZfc2V0X21zaV9kb21haW4oZGV2 LCBkb21haW4pOwo+ICsKPiArCWlmIChwbGF0Zm9ybV9tc2lfZG9tYWluX2FsbG9jX2lycXMoJm50 Yi0+ZXBmLT5kZXYsCj4gKwkJbnRiLT5kYl9jb3VudCwKPiArCQllcGZfbnRiX3dyaXRlX21zaV9t c2cpKSB7Cj4gKwkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBNU0ksIGZhbGxpbmcgYmFj ayB0byBwb2xsaW5nIG1vZGVcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCWRldl9pbmZvKGRl diwgIlVzaW5nIE1TSSBhcyBkb29yYmVsbFxuIik7CgpJcyBpdCByZWFsbHkgdXNlZnVsIHRvIHBy aW50IHRoaXMgaW4gdGhlIGtlcm5lbCBsb2cgPyBkZXZfZGJnIHNlZW1zIG1vcmUKc3VpdGFibGUg dG8gbWUuCgo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBudGItPmRiX2NvdW50OyBpKyspIHsKPiAr CQl2aXJxID0gbXNpX2dldF92aXJxKGRldiwgaSk7Cj4gKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X2ly cShkZXYsIHZpcnEsCj4gKwkJCSAgICAgICBlcGZfbnRiX2ludGVycnVwdF9oYW5kbGVyLCAwLAo+ ICsJCQkgICAgICAgInBjaV9lcGZfdm50YiIsIG50Yik7Cj4gKwo+ICsJCWlmIChyZXQpIHsKPiAr CQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBkb29yYmVsbCBJUlEhIEZhbGxpbmcg YmFjayB0byBwb2xsaW5nIG1vZGUiKTsKPiArCQkJbnRiLT5lcGZfZGJfcGh5cyA9IDA7Cj4gKwkJ CWJyZWFrOwoKRG9lc24ndCB0aGlzIHJlcXVpcmUgYSBwbGF0Zm9ybV9tc2lfZG9tYWluX2ZyZWVf aXJxcygpID8KClRoYW5rcywKTG9yZW56bwoKPiArCQl9Cj4gKwo+ICsJCWlmICghaSkKPiArCQkJ bnRiLT5tc2lfdmlycWJhc2UgPSB2aXJxOyAvKiBtc2kgc3RhcnQgdmlycSBudW1iZXIgKi8KPiAr CX0KPiArfQo+ICsjZWxzZQo+ICtzdGF0aWMgdm9pZCBlcGZfbnRiX2VwY19tc2lfaW5pdChzdHJ1 Y3QgZXBmX250YiAqbnRiKQo+ICt7Cj4gK30KPiArI2VuZGlmIC8qIENPTkZJR19HRU5FUklDX01T SV9JUlFfRE9NQUlOICovCj4gIC8qKgo+ICAgKiBlcGZfbnRiX2VwY19pbml0KCkgLSBJbml0aWFs aXplIE5UQiBpbnRlcmZhY2UKPiAgICogQG50YjogTlRCIGRldmljZSB0aGF0IGZhY2lsaXRhdGVz IGNvbW11bmljYXRpb24gYmV0d2VlbiBIT1NUIGFuZCBWSE9TVAo+IEBAIC0xMzIwLDE0ICsxNDI1 LDE1IEBAIHN0YXRpYyBpbnQgZXBmX250Yl9iaW5kKHN0cnVjdCBwY2lfZXBmICplcGYpCj4gIAkJ Z290byBlcnJfYmFyX2FsbG9jOwo+ICAJfQo+ICAKPiArCWVwZl9zZXRfZHJ2ZGF0YShlcGYsIG50 Yik7Cj4gKwllcGZfbnRiX2VwY19tc2lfaW5pdChudGIpOwo+ICsKPiAgCXJldCA9IGVwZl9udGJf ZXBjX2luaXQobnRiKTsKPiAgCWlmIChyZXQpIHsKPiAgCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0 byBpbml0aWFsaXplIEVQQ1xuIik7Cj4gIAkJZ290byBlcnJfYmFyX2FsbG9jOwo+ICAJfQo+ICAK PiAtCWVwZl9zZXRfZHJ2ZGF0YShlcGYsIG50Yik7Cj4gLQo+ICAJcGNpX3NwYWNlWzBdID0gKG50 Yi0+dm50Yl9waWQgPDwgMTYpIHwgbnRiLT52bnRiX3ZpZDsKPiAgCXBjaV92bnRiX3RhYmxlWzBd LnZlbmRvciA9IG50Yi0+dm50Yl92aWQ7Cj4gIAlwY2lfdm50Yl90YWJsZVswXS5kZXZpY2UgPSBu dGItPnZudGJfcGlkOwo+IC0tIAo+IDIuMzUuMQo+IAoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGlu dXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=