From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.0 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12586C4320A for ; Wed, 11 Aug 2021 14:58:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EC2DE60FC0 for ; Wed, 11 Aug 2021 14:58:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232597AbhHKO6w convert rfc822-to-8bit (ORCPT ); Wed, 11 Aug 2021 10:58:52 -0400 Received: from mail.kernel.org ([198.145.29.99]:43372 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232823AbhHKO6t (ORCPT ); Wed, 11 Aug 2021 10:58:49 -0400 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6C36460FA0; Wed, 11 Aug 2021 14:58:25 +0000 (UTC) Received: from sofa.misterjones.org ([185.219.108.64] helo=why.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1mDpgV-004MOX-FV; Wed, 11 Aug 2021 15:58:23 +0100 Date: Wed, 11 Aug 2021 15:58:23 +0100 Message-ID: <87k0ks9gfk.wl-maz@kernel.org> From: Marc Zyngier To: Kishon Vijay Abraham I Cc: Lorenzo Pieralisi , Rob Herring , Bjorn Helgaas , Lokesh Vutla , , , , Subject: Re: [PATCH 2/2] PCI: j721e: Add PCI legacy interrupt support for J7200 In-Reply-To: <20210811123846.31921-3-kishon@ti.com> References: <20210811123846.31921-1-kishon@ti.com> <20210811123846.31921-3-kishon@ti.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/27.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: kishon@ti.com, lorenzo.pieralisi@arm.com, robh@kernel.org, bhelgaas@google.com, lokeshvutla@ti.com, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org On Wed, 11 Aug 2021 13:38:46 +0100, Kishon Vijay Abraham I wrote: > > Add PCI legacy interrupt support for J7200. J7200 has a single HW > interrupt line for all the four legacy interrupts INTA/INTB/INTC/INTD. > The HW interrupt line connected to GIC is a pulse interrupt whereas > the legacy interrupts by definition is level interrupt. In order to > provide level interrupt functionality to edge interrupt line, PCIe > in J7200 has provided USER_EOI_REG register. When the SW writes to > USER_EOI_REG register after handling the interrupt, the IP checks the > state of legacy interrupt and re-triggers pulse interrupt invoking > the handler again. > > Due to Errata ID #i2094 ([1]), EOI feature is not enabled in J721E > and only a single pulse interrupt will be generated for every > ASSERT_INTx/DEASSERT_INTx. Hence legacy interrupt is not enabled in > J721E. How do you prevent this from being enabled on an affected platform? Just by virtue of not having the interrupt-controller property in DT? In which case, it may be useful to clarify this in the DT binding and say that it is only valid on J7200. > > [1] -> J721E DRA829/TDA4VM Processors Silicon Revision 1.1/1.0 SPRZ455A – > DECEMBER 2020 – REVISED AUGUST 2021 > (https://www.ti.com/lit/er/sprz455a/sprz455a.pdf) > > Signed-off-by: Kishon Vijay Abraham I > --- > drivers/pci/controller/cadence/pci-j721e.c | 119 +++++++++++++++++++++ > 1 file changed, 119 insertions(+) > > diff --git a/drivers/pci/controller/cadence/pci-j721e.c b/drivers/pci/controller/cadence/pci-j721e.c > index ffb176d288cd..4e786d6b89e0 100644 > --- a/drivers/pci/controller/cadence/pci-j721e.c > +++ b/drivers/pci/controller/cadence/pci-j721e.c > @@ -29,12 +29,24 @@ > #define LINK_DOWN BIT(1) > #define J7200_LINK_DOWN BIT(10) > > +#define ENABLE_REG_SYS_1 0x104 > +#define STATUS_REG_SYS_1 0x504 > +#define SYS1_INTx_EN(num) (1 << (22 + (num))) > + > #define J721E_PCIE_USER_CMD_STATUS 0x4 > #define LINK_TRAINING_ENABLE BIT(0) > > #define J721E_PCIE_USER_LINKSTATUS 0x14 > #define LINK_STATUS GENMASK(1, 0) > > +#define USER_EOI_REG 0xC8 > +enum eoi_reg { > + EOI_DOWNSTREAM_INTERRUPT, > + EOI_FLR_INTERRUPT, > + EOI_LEGACY_INTERRUPT, > + EOI_POWER_STATE_INTERRUPT, > +}; > + > enum link_status { > NO_RECEIVERS_DETECTED, > LINK_TRAINING_IN_PROGRESS, > @@ -59,6 +71,7 @@ struct j721e_pcie { > void __iomem *user_cfg_base; > void __iomem *intd_cfg_base; > u32 linkdown_irq_regfield; > + struct irq_domain *legacy_irq_domain; > }; > > enum j721e_pcie_mode { > @@ -121,6 +134,108 @@ static void j721e_pcie_config_link_irq(struct j721e_pcie *pcie) > j721e_pcie_intd_writel(pcie, ENABLE_REG_SYS_2, reg); > } > > +static void j721e_pcie_legacy_irq_handler(struct irq_desc *desc) > +{ > + struct j721e_pcie *pcie = irq_desc_get_handler_data(desc); > + struct irq_chip *chip = irq_desc_get_chip(desc); > + int i, virq; > + u32 reg; > + > + chained_irq_enter(chip, desc); > + > + reg = j721e_pcie_intd_readl(pcie, STATUS_REG_SYS_1); > + for (i = 0; i < PCI_NUM_INTX; i++) { > + if (!(reg & SYS1_INTx_EN(i))) > + continue; > + > + virq = irq_find_mapping(pcie->legacy_irq_domain, i); > + generic_handle_irq(virq); Please use generic_handle_domain_irq(). > + } > + > + chained_irq_exit(chip, desc); > +} > + > +static void j721e_pcie_irq_eoi(struct irq_data *data) > +{ > + struct j721e_pcie *pcie = irq_data_get_irq_chip_data(data); > + > + j721e_pcie_user_writel(pcie, USER_EOI_REG, EOI_LEGACY_INTERRUPT); > +} > + > +static void j721e_pcie_irq_enable(struct irq_data *data) > +{ > + struct j721e_pcie *pcie = irq_data_get_irq_chip_data(data); > + u32 reg; > + > + reg = j721e_pcie_intd_readl(pcie, ENABLE_REG_SYS_1); > + reg |= SYS1_INTx_EN(irqd_to_hwirq(data)); > + j721e_pcie_intd_writel(pcie, ENABLE_REG_SYS_1, reg); RMW of a register shared between interrupts without a lock. It will eventually end badly. > +} > + > +static void j721e_pcie_irq_disable(struct irq_data *data) > +{ > + struct j721e_pcie *pcie = irq_data_get_irq_chip_data(data); > + u32 reg; > + > + reg = j721e_pcie_intd_readl(pcie, ENABLE_REG_SYS_1); > + reg &= ~SYS1_INTx_EN(irqd_to_hwirq(data)); > + j721e_pcie_intd_writel(pcie, ENABLE_REG_SYS_1, reg); Same thing. > +} > + > +struct irq_chip j721e_pcie_irq_chip = { > + .name = "J721E-PCIE-INTX", > + .irq_eoi = j721e_pcie_irq_eoi, > + .irq_enable = j721e_pcie_irq_enable, > + .irq_disable = j721e_pcie_irq_disable, > +}; > + > +static int j721e_pcie_intx_map(struct irq_domain *domain, unsigned int irq, irq_hw_number_t hwirq) > +{ > + struct j721e_pcie *pcie = domain->host_data; > + > + irq_set_chip_and_handler(irq, &j721e_pcie_irq_chip, handle_fasteoi_irq); > + irq_set_chip_data(irq, pcie); > + > + return 0; > +} > + > +static const struct irq_domain_ops j721e_pcie_intx_domain_ops = { > + .map = j721e_pcie_intx_map, > +}; > + > +static int j721e_pcie_config_legacy_irq(struct j721e_pcie *pcie) > +{ > + struct irq_domain *legacy_irq_domain; > + struct device *dev = pcie->dev; > + struct device_node *node = dev->of_node; > + struct device_node *intc_node; > + int irq; > + > + intc_node = of_get_child_by_name(node, "interrupt-controller"); > + if (!intc_node) { > + dev_dbg(dev, "interrupt-controller node is absent. Legacy INTR not supported\n"); > + return 0; > + } > + > + irq = irq_of_parse_and_map(intc_node, 0); > + if (!irq) { > + dev_err(dev, "Failed to parse and map legacy irq\n"); > + return -EINVAL; > + } > + > + irq_set_chained_handler_and_data(irq, j721e_pcie_legacy_irq_handler, pcie); At this stage, you now have enabled the mux interrupt, and it can fire at will (who knows what state the enabled bits are, given that you don't initialise them?). However, you still haven't allocated the domain. What could possibly go wrong? Please initialise all the interrupts to their disabled state, and only register the handler once all the data structures have been populated. > + > + legacy_irq_domain = irq_domain_add_linear(intc_node, PCI_NUM_INTX, > + &j721e_pcie_intx_domain_ops, pcie); > + if (!legacy_irq_domain) { > + dev_err(dev, "Failed to add irq domain for legacy irqs\n"); > + return -EINVAL; > + } > + pcie->legacy_irq_domain = legacy_irq_domain; > + > + return 0; > +} > + > static int j721e_pcie_start_link(struct cdns_pcie *cdns_pcie) > { > struct j721e_pcie *pcie = dev_get_drvdata(cdns_pcie->dev); > @@ -433,6 +548,10 @@ static int j721e_pcie_probe(struct platform_device *pdev) > goto err_get_sync; > } > > + ret = j721e_pcie_config_legacy_irq(pcie); > + if (ret < 0) > + goto err_get_sync; > + > bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rc)); > if (!bridge) { > ret = -ENOMEM; Thanks, M. -- Without deviation from the norm, progress is not possible. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D66E8C4338F for ; Wed, 11 Aug 2021 15:00:46 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7A24F60FC0 for ; Wed, 11 Aug 2021 15:00:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 7A24F60FC0 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org 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:MIME-Version:References:In-Reply-To: Subject:Cc:To:From:Message-ID:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+sKcMM6+bIV26dbMKTdsYk5aW8c6FmNJgsDc3mZWBR4=; b=awg09fVzD8KlyO br3ov0Xv/pS8ICpxcCaSm3hurbAuLd8cUuUDreqTT3/Jp7bQI0l21wLdYtXxX66JzClTQn+xYW1uR b1z6N+F0oV66kZ/wMp2KVC76YrbyCSET06uIlwzpn64Wn3mzT5+z5tioiA4avV4FjZ6yPnaExe73R KDSS1zGCw9QnLmuzsSfKISaFW2yUbNaw8hVWwQrbcax/MLMN9PJ1Ir/iu9GyVMKmAE5lUwI5Xbj1z m4nzBTbOcaw8LZxBNolA1+obwBrbTZS7kpa0ENNETvB/gnW+TH3aeRg6X8sS7bFoNTFrY50I7z+5s Vu7hKe/M8Ua0rRXQf//Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mDpge-007Upk-K5; Wed, 11 Aug 2021 14:58:32 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mDpgY-007UoN-3w for linux-arm-kernel@lists.infradead.org; Wed, 11 Aug 2021 14:58:29 +0000 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6C36460FA0; Wed, 11 Aug 2021 14:58:25 +0000 (UTC) Received: from sofa.misterjones.org ([185.219.108.64] helo=why.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1mDpgV-004MOX-FV; Wed, 11 Aug 2021 15:58:23 +0100 Date: Wed, 11 Aug 2021 15:58:23 +0100 Message-ID: <87k0ks9gfk.wl-maz@kernel.org> From: Marc Zyngier To: Kishon Vijay Abraham I Cc: Lorenzo Pieralisi , Rob Herring , Bjorn Helgaas , Lokesh Vutla , , , , Subject: Re: [PATCH 2/2] PCI: j721e: Add PCI legacy interrupt support for J7200 In-Reply-To: <20210811123846.31921-3-kishon@ti.com> References: <20210811123846.31921-1-kishon@ti.com> <20210811123846.31921-3-kishon@ti.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/27.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: kishon@ti.com, lorenzo.pieralisi@arm.com, robh@kernel.org, bhelgaas@google.com, lokeshvutla@ti.com, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210811_075826_236513_E1BB8995 X-CRM114-Status: GOOD ( 35.68 ) 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 T24gV2VkLCAxMSBBdWcgMjAyMSAxMzozODo0NiArMDEwMCwKS2lzaG9uIFZpamF5IEFicmFoYW0g SSA8a2lzaG9uQHRpLmNvbT4gd3JvdGU6Cj4gCj4gQWRkIFBDSSBsZWdhY3kgaW50ZXJydXB0IHN1 cHBvcnQgZm9yIEo3MjAwLiBKNzIwMCBoYXMgYSBzaW5nbGUgSFcKPiBpbnRlcnJ1cHQgbGluZSBm b3IgYWxsIHRoZSBmb3VyIGxlZ2FjeSBpbnRlcnJ1cHRzIElOVEEvSU5UQi9JTlRDL0lOVEQuCj4g VGhlIEhXIGludGVycnVwdCBsaW5lIGNvbm5lY3RlZCB0byBHSUMgaXMgYSBwdWxzZSBpbnRlcnJ1 cHQgd2hlcmVhcwo+IHRoZSBsZWdhY3kgaW50ZXJydXB0cyBieSBkZWZpbml0aW9uIGlzIGxldmVs IGludGVycnVwdC4gSW4gb3JkZXIgdG8KPiBwcm92aWRlIGxldmVsIGludGVycnVwdCBmdW5jdGlv bmFsaXR5IHRvIGVkZ2UgaW50ZXJydXB0IGxpbmUsIFBDSWUKPiBpbiBKNzIwMCBoYXMgcHJvdmlk ZWQgVVNFUl9FT0lfUkVHIHJlZ2lzdGVyLiBXaGVuIHRoZSBTVyB3cml0ZXMgdG8KPiBVU0VSX0VP SV9SRUcgcmVnaXN0ZXIgYWZ0ZXIgaGFuZGxpbmcgdGhlIGludGVycnVwdCwgdGhlIElQIGNoZWNr cyB0aGUKPiBzdGF0ZSBvZiBsZWdhY3kgaW50ZXJydXB0IGFuZCByZS10cmlnZ2VycyBwdWxzZSBp bnRlcnJ1cHQgaW52b2tpbmcKPiB0aGUgaGFuZGxlciBhZ2Fpbi4KPiAKPiBEdWUgdG8gRXJyYXRh IElEICNpMjA5NCAoWzFdKSwgRU9JIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQgaW4gSjcyMUUKPiBh bmQgb25seSBhIHNpbmdsZSBwdWxzZSBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGV2 ZXJ5Cj4gQVNTRVJUX0lOVHgvREVBU1NFUlRfSU5UeC4gSGVuY2UgbGVnYWN5IGludGVycnVwdCBp cyBub3QgZW5hYmxlZCBpbgo+IEo3MjFFLgoKSG93IGRvIHlvdSBwcmV2ZW50IHRoaXMgZnJvbSBi ZWluZyBlbmFibGVkIG9uIGFuIGFmZmVjdGVkIHBsYXRmb3JtPwpKdXN0IGJ5IHZpcnR1ZSBvZiBu b3QgaGF2aW5nIHRoZSBpbnRlcnJ1cHQtY29udHJvbGxlciBwcm9wZXJ0eSBpbiBEVD8KSW4gd2hp Y2ggY2FzZSwgaXQgbWF5IGJlIHVzZWZ1bCB0byBjbGFyaWZ5IHRoaXMgaW4gdGhlIERUIGJpbmRp bmcgYW5kCnNheSB0aGF0IGl0IGlzIG9ubHkgdmFsaWQgb24gSjcyMDAuCgo+IAo+IFsxXSAtPiBK NzIxRSBEUkE4MjkvVERBNFZNIFByb2Nlc3NvcnMgU2lsaWNvbiBSZXZpc2lvbiAxLjEvMS4wIFNQ Ulo0NTVBIOKAkwo+ICAgICAgICBERUNFTUJFUiAyMDIwIOKAkyBSRVZJU0VEIEFVR1VTVCAyMDIx Cj4gICAgICAgIChodHRwczovL3d3dy50aS5jb20vbGl0L2VyL3Nwcno0NTVhL3Nwcno0NTVhLnBk ZikKPiAKPiBTaWduZWQtb2ZmLWJ5OiBLaXNob24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGku Y29tPgo+IC0tLQo+ICBkcml2ZXJzL3BjaS9jb250cm9sbGVyL2NhZGVuY2UvcGNpLWo3MjFlLmMg fCAxMTkgKysrKysrKysrKysrKysrKysrKysrCj4gIDEgZmlsZSBjaGFuZ2VkLCAxMTkgaW5zZXJ0 aW9ucygrKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2NhZGVuY2Uv cGNpLWo3MjFlLmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2NhZGVuY2UvcGNpLWo3MjFlLmMK PiBpbmRleCBmZmIxNzZkMjg4Y2QuLjRlNzg2ZDZiODllMCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L3BjaS9jb250cm9sbGVyL2NhZGVuY2UvcGNpLWo3MjFlLmMKPiArKysgYi9kcml2ZXJzL3BjaS9j b250cm9sbGVyL2NhZGVuY2UvcGNpLWo3MjFlLmMKPiBAQCAtMjksMTIgKzI5LDI0IEBACj4gICNk ZWZpbmUgTElOS19ET1dOCQlCSVQoMSkKPiAgI2RlZmluZSBKNzIwMF9MSU5LX0RPV04JCUJJVCgx MCkKPiAgCj4gKyNkZWZpbmUgRU5BQkxFX1JFR19TWVNfMQkweDEwNAo+ICsjZGVmaW5lIFNUQVRV U19SRUdfU1lTXzEJMHg1MDQKPiArI2RlZmluZSBTWVMxX0lOVHhfRU4obnVtKQkoMSA8PCAoMjIg KyAobnVtKSkpCj4gKwo+ICAjZGVmaW5lIEo3MjFFX1BDSUVfVVNFUl9DTURfU1RBVFVTCTB4NAo+ ICAjZGVmaW5lIExJTktfVFJBSU5JTkdfRU5BQkxFCQlCSVQoMCkKPiAgCj4gICNkZWZpbmUgSjcy MUVfUENJRV9VU0VSX0xJTktTVEFUVVMJMHgxNAo+ICAjZGVmaW5lIExJTktfU1RBVFVTCQkJR0VO TUFTSygxLCAwKQo+ICAKPiArI2RlZmluZSBVU0VSX0VPSV9SRUcJCTB4QzgKPiArZW51bSBlb2lf cmVnIHsKPiArCUVPSV9ET1dOU1RSRUFNX0lOVEVSUlVQVCwKPiArCUVPSV9GTFJfSU5URVJSVVBU LAo+ICsJRU9JX0xFR0FDWV9JTlRFUlJVUFQsCj4gKwlFT0lfUE9XRVJfU1RBVEVfSU5URVJSVVBU LAo+ICt9Owo+ICsKPiAgZW51bSBsaW5rX3N0YXR1cyB7Cj4gIAlOT19SRUNFSVZFUlNfREVURUNU RUQsCj4gIAlMSU5LX1RSQUlOSU5HX0lOX1BST0dSRVNTLAo+IEBAIC01OSw2ICs3MSw3IEBAIHN0 cnVjdCBqNzIxZV9wY2llIHsKPiAgCXZvaWQgX19pb21lbQkJKnVzZXJfY2ZnX2Jhc2U7Cj4gIAl2 b2lkIF9faW9tZW0JCSppbnRkX2NmZ19iYXNlOwo+ICAJdTMyCQkJbGlua2Rvd25faXJxX3JlZ2Zp ZWxkOwo+ICsJc3RydWN0IGlycV9kb21haW4JKmxlZ2FjeV9pcnFfZG9tYWluOwo+ICB9Owo+ICAK PiAgZW51bSBqNzIxZV9wY2llX21vZGUgewo+IEBAIC0xMjEsNiArMTM0LDEwOCBAQCBzdGF0aWMg dm9pZCBqNzIxZV9wY2llX2NvbmZpZ19saW5rX2lycShzdHJ1Y3QgajcyMWVfcGNpZSAqcGNpZSkK PiAgCWo3MjFlX3BjaWVfaW50ZF93cml0ZWwocGNpZSwgRU5BQkxFX1JFR19TWVNfMiwgcmVnKTsK PiAgfQo+ICAKPiArc3RhdGljIHZvaWQgajcyMWVfcGNpZV9sZWdhY3lfaXJxX2hhbmRsZXIoc3Ry dWN0IGlycV9kZXNjICpkZXNjKQo+ICt7Cj4gKwlzdHJ1Y3QgajcyMWVfcGNpZSAqcGNpZSA9IGly cV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7Cj4gKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAg PSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKPiArCWludCBpLCB2aXJxOwo+ICsJdTMyIHJlZzsK PiArCj4gKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKPiArCj4gKwlyZWcgPSBqNzIx ZV9wY2llX2ludGRfcmVhZGwocGNpZSwgU1RBVFVTX1JFR19TWVNfMSk7Cj4gKwlmb3IgKGkgPSAw OyBpIDwgUENJX05VTV9JTlRYOyBpKyspIHsKPiArCQlpZiAoIShyZWcgJiBTWVMxX0lOVHhfRU4o aSkpKQo+ICsJCQljb250aW51ZTsKPiArCj4gKwkJdmlycSA9IGlycV9maW5kX21hcHBpbmcocGNp ZS0+bGVnYWN5X2lycV9kb21haW4sIGkpOwo+ICsJCWdlbmVyaWNfaGFuZGxlX2lycSh2aXJxKTsK ClBsZWFzZSB1c2UgZ2VuZXJpY19oYW5kbGVfZG9tYWluX2lycSgpLgoKPiArCX0KPiArCj4gKwlj aGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBqNzIx ZV9wY2llX2lycV9lb2koc3RydWN0IGlycV9kYXRhICpkYXRhKQo+ICt7Cj4gKwlzdHJ1Y3Qgajcy MWVfcGNpZSAqcGNpZSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwo+ICsKPiAr CWo3MjFlX3BjaWVfdXNlcl93cml0ZWwocGNpZSwgVVNFUl9FT0lfUkVHLCBFT0lfTEVHQUNZX0lO VEVSUlVQVCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGo3MjFlX3BjaWVfaXJxX2VuYWJsZShz dHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCj4gK3sKPiArCXN0cnVjdCBqNzIxZV9wY2llICpwY2llID0g aXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Cj4gKwl1MzIgcmVnOwo+ICsKPiArCXJl ZyA9IGo3MjFlX3BjaWVfaW50ZF9yZWFkbChwY2llLCBFTkFCTEVfUkVHX1NZU18xKTsKPiArCXJl ZyB8PSBTWVMxX0lOVHhfRU4oaXJxZF90b19od2lycShkYXRhKSk7Cj4gKwlqNzIxZV9wY2llX2lu dGRfd3JpdGVsKHBjaWUsIEVOQUJMRV9SRUdfU1lTXzEsIHJlZyk7CgpSTVcgb2YgYSByZWdpc3Rl ciBzaGFyZWQgYmV0d2VlbiBpbnRlcnJ1cHRzIHdpdGhvdXQgYSBsb2NrLiBJdCB3aWxsCmV2ZW50 dWFsbHkgZW5kIGJhZGx5LgoKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgajcyMWVfcGNpZV9pcnFf ZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCj4gK3sKPiArCXN0cnVjdCBqNzIxZV9wY2ll ICpwY2llID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Cj4gKwl1MzIgcmVnOwo+ ICsKPiArCXJlZyA9IGo3MjFlX3BjaWVfaW50ZF9yZWFkbChwY2llLCBFTkFCTEVfUkVHX1NZU18x KTsKPiArCXJlZyAmPSB+U1lTMV9JTlR4X0VOKGlycWRfdG9faHdpcnEoZGF0YSkpOwo+ICsJajcy MWVfcGNpZV9pbnRkX3dyaXRlbChwY2llLCBFTkFCTEVfUkVHX1NZU18xLCByZWcpOwoKU2FtZSB0 aGluZy4KCj4gK30KPiArCj4gK3N0cnVjdCBpcnFfY2hpcCBqNzIxZV9wY2llX2lycV9jaGlwID0g ewo+ICsJLm5hbWUJCT0gIko3MjFFLVBDSUUtSU5UWCIsCj4gKwkuaXJxX2VvaQk9IGo3MjFlX3Bj aWVfaXJxX2VvaSwKPiArCS5pcnFfZW5hYmxlCT0gajcyMWVfcGNpZV9pcnFfZW5hYmxlLAo+ICsJ LmlycV9kaXNhYmxlCT0gajcyMWVfcGNpZV9pcnFfZGlzYWJsZSwKPiArfTsKPiArCj4gK3N0YXRp YyBpbnQgajcyMWVfcGNpZV9pbnR4X21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCB1bnNp Z25lZCBpbnQgaXJxLCBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCj4gK3sKPiArCXN0cnVjdCBqNzIx ZV9wY2llICpwY2llID0gZG9tYWluLT5ob3N0X2RhdGE7Cj4gKwo+ICsJaXJxX3NldF9jaGlwX2Fu ZF9oYW5kbGVyKGlycSwgJmo3MjFlX3BjaWVfaXJxX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7 Cj4gKwlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIHBjaWUpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIGo3MjFlX3BjaWVfaW50 eF9kb21haW5fb3BzID0gewo+ICsJLm1hcCA9IGo3MjFlX3BjaWVfaW50eF9tYXAsCj4gK307Cj4g Kwo+ICtzdGF0aWMgaW50IGo3MjFlX3BjaWVfY29uZmlnX2xlZ2FjeV9pcnEoc3RydWN0IGo3MjFl X3BjaWUgKnBjaWUpCj4gK3sKPiArCXN0cnVjdCBpcnFfZG9tYWluICpsZWdhY3lfaXJxX2RvbWFp bjsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjaWUtPmRldjsKPiArCXN0cnVjdCBkZXZpY2Vf bm9kZSAqbm9kZSA9IGRldi0+b2Zfbm9kZTsKPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50Y19u b2RlOwo+ICsJaW50IGlycTsKPiArCj4gKwlpbnRjX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFt ZShub2RlLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiKTsKPiArCWlmICghaW50Y19ub2RlKSB7Cj4g KwkJZGV2X2RiZyhkZXYsICJpbnRlcnJ1cHQtY29udHJvbGxlciBub2RlIGlzIGFic2VudC4gTGVn YWN5IElOVFIgbm90IHN1cHBvcnRlZFxuIik7Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJ aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoaW50Y19ub2RlLCAwKTsKPiArCWlmICghaXJxKSB7 Cj4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcGFyc2UgYW5kIG1hcCBsZWdhY3kgaXJxXG4i KTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlpcnFfc2V0X2NoYWluZWRfaGFu ZGxlcl9hbmRfZGF0YShpcnEsIGo3MjFlX3BjaWVfbGVnYWN5X2lycV9oYW5kbGVyLCBwY2llKTsK CkF0IHRoaXMgc3RhZ2UsIHlvdSBub3cgaGF2ZSBlbmFibGVkIHRoZSBtdXggaW50ZXJydXB0LCBh bmQgaXQgY2FuIGZpcmUKYXQgd2lsbCAod2hvIGtub3dzIHdoYXQgc3RhdGUgdGhlIGVuYWJsZWQg Yml0cyBhcmUsIGdpdmVuIHRoYXQgeW91CmRvbid0IGluaXRpYWxpc2UgdGhlbT8pLiBIb3dldmVy LCB5b3Ugc3RpbGwgaGF2ZW4ndCBhbGxvY2F0ZWQgdGhlCmRvbWFpbi4gV2hhdCBjb3VsZCBwb3Nz aWJseSBnbyB3cm9uZz8KClBsZWFzZSBpbml0aWFsaXNlIGFsbCB0aGUgaW50ZXJydXB0cyB0byB0 aGVpciBkaXNhYmxlZCBzdGF0ZSwgYW5kIG9ubHkKcmVnaXN0ZXIgdGhlIGhhbmRsZXIgb25jZSBh bGwgdGhlIGRhdGEgc3RydWN0dXJlcyBoYXZlIGJlZW4gcG9wdWxhdGVkLgoKPiArCj4gKwlsZWdh Y3lfaXJxX2RvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihpbnRjX25vZGUsIFBDSV9OVU1f SU5UWCwKPiArCQkJCQkJICAmajcyMWVfcGNpZV9pbnR4X2RvbWFpbl9vcHMsIHBjaWUpOwo+ICsJ aWYgKCFsZWdhY3lfaXJxX2RvbWFpbikgewo+ICsJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFk ZCBpcnEgZG9tYWluIGZvciBsZWdhY3kgaXJxc1xuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4g Kwl9Cj4gKwlwY2llLT5sZWdhY3lfaXJxX2RvbWFpbiA9IGxlZ2FjeV9pcnFfZG9tYWluOwo+ICsK PiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICBzdGF0aWMgaW50IGo3MjFlX3BjaWVfc3RhcnRfbGlu ayhzdHJ1Y3QgY2Ruc19wY2llICpjZG5zX3BjaWUpCj4gIHsKPiAgCXN0cnVjdCBqNzIxZV9wY2ll ICpwY2llID0gZGV2X2dldF9kcnZkYXRhKGNkbnNfcGNpZS0+ZGV2KTsKPiBAQCAtNDMzLDYgKzU0 OCwxMCBAQCBzdGF0aWMgaW50IGo3MjFlX3BjaWVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKPiAgCQkJZ290byBlcnJfZ2V0X3N5bmM7Cj4gIAkJfQo+ICAKPiArCQlyZXQgPSBq NzIxZV9wY2llX2NvbmZpZ19sZWdhY3lfaXJxKHBjaWUpOwo+ICsJCWlmIChyZXQgPCAwKQo+ICsJ CQlnb3RvIGVycl9nZXRfc3luYzsKPiArCj4gIAkJYnJpZGdlID0gZGV2bV9wY2lfYWxsb2NfaG9z dF9icmlkZ2UoZGV2LCBzaXplb2YoKnJjKSk7Cj4gIAkJaWYgKCFicmlkZ2UpIHsKPiAgCQkJcmV0 ID0gLUVOT01FTTsKClRoYW5rcywKCglNLgoKLS0gCldpdGhvdXQgZGV2aWF0aW9uIGZyb20gdGhl IG5vcm0sIHByb2dyZXNzIGlzIG5vdCBwb3NzaWJsZS4KCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0Cmxp bnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK