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 EBF9FC4338F for ; Wed, 4 Aug 2021 15:13:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C730E60F94 for ; Wed, 4 Aug 2021 15:13:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238858AbhHDPN4 convert rfc822-to-8bit (ORCPT ); Wed, 4 Aug 2021 11:13:56 -0400 Received: from mail.kernel.org ([198.145.29.99]:42176 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237114AbhHDPNy (ORCPT ); Wed, 4 Aug 2021 11:13:54 -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 1257161004; Wed, 4 Aug 2021 15:13:42 +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 1mBIaS-002win-2M; Wed, 04 Aug 2021 16:13:40 +0100 Date: Wed, 04 Aug 2021 16:13:39 +0100 Message-ID: <87h7g5w8d8.wl-maz@kernel.org> From: Marc Zyngier To: Kishon Vijay Abraham I Cc: Bjorn Helgaas , Rob Herring , Lorenzo Pieralisi , Tom Joseph , , , , , , Lokesh Vutla Subject: Re: [PATCH v2 2/3] PCI: j721e: Add PCI legacy interrupt support for J721E In-Reply-To: <20210804132912.30685-3-kishon@ti.com> References: <20210804132912.30685-1-kishon@ti.com> <20210804132912.30685-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, bhelgaas@google.com, robh+dt@kernel.org, lorenzo.pieralisi@arm.com, tjoseph@cadence.com, linux-omap@vger.kernel.org, linux-pci@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, lokeshvutla@ti.com 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, 04 Aug 2021 14:29:11 +0100, Kishon Vijay Abraham I wrote: > > Add PCI legacy interrupt support for J721E. J721E 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 J721E has provided IRQ_EOI register. > > However due to Errata ID #i2094 ([1]), EOI feature is not enabled in HW > and only a single pulse interrupt will be generated for every > ASSERT_INTx/DEASSERT_INTx. So my earlier remark stands. If you get a single edge, how do you handle a level that is still high after having handled the interrupt on hardware that has this bug? > > [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 | 85 ++++++++++++++++++++++ > 1 file changed, 85 insertions(+) > > diff --git a/drivers/pci/controller/cadence/pci-j721e.c b/drivers/pci/controller/cadence/pci-j721e.c > index 2ec037c43bd5..c2e7a78dc31f 100644 > --- a/drivers/pci/controller/cadence/pci-j721e.c > +++ b/drivers/pci/controller/cadence/pci-j721e.c > @@ -29,6 +29,13 @@ > #define LINK_DOWN BIT(1) > #define J7200_LINK_DOWN BIT(10) > > +#define EOI_REG 0x10 > + > +#define ENABLE_REG_SYS_0 0x100 > +#define STATUS_REG_SYS_0 0x500 > +#define STATUS_CLR_REG_SYS_0 0x700 > +#define INTx_EN(num) (1 << (num)) > + > #define J721E_PCIE_USER_CMD_STATUS 0x4 > #define LINK_TRAINING_ENABLE BIT(0) > > @@ -59,6 +66,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 +129,79 @@ 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_v1_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); > + > + for (i = 0; i < PCI_NUM_INTX; i++) { > + reg = j721e_pcie_intd_readl(pcie, STATUS_REG_SYS_0); > + if (!(reg & INTx_EN(i))) > + continue; Why do you need to perform multiple reads? Surely reg contains all the bits you need, doesn't it? > + > + virq = irq_find_mapping(pcie->legacy_irq_domain, 3 - i); > + generic_handle_irq(virq); Please combine both lines into a single generic_handle_domain_irq() call. > + j721e_pcie_intd_writel(pcie, STATUS_CLR_REG_SYS_0, INTx_EN(i)); What is the purpose of this write? It feels like this should be a irq_eoi callback. > + } > + > + chained_irq_exit(chip, desc); > +} > + > +static int j721e_pcie_intx_map(struct irq_domain *domain, unsigned int irq, irq_hw_number_t hwirq) > +{ > + irq_set_chip_and_handler(irq, &dummy_irq_chip, handle_simple_irq); An INTx interrupt is a level interrupt. Please use the corresponding flow. > + irq_set_chip_data(irq, domain->host_data); > + > + 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, i; > + u32 reg; > + > + 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_v1_legacy_irq_handler, pcie); > + > + 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; > + > + for (i = 0; i < PCI_NUM_INTX; i++) { > + reg = j721e_pcie_intd_readl(pcie, ENABLE_REG_SYS_0); > + reg |= INTx_EN(i); > + j721e_pcie_intd_writel(pcie, ENABLE_REG_SYS_0, reg); > + } This should be moved to the irq_unmask() callback. 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 14B4AC4338F for ; Wed, 4 Aug 2021 15:15:26 +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 CCA5D60EC0 for ; Wed, 4 Aug 2021 15:15:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org CCA5D60EC0 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=YKhq+5pS22sq+4upyFN+Q1sedB4GZFcKFpD2y2IPiOg=; b=CSYmKQfbwLb4MZ AeFBlhsQmBOIgEXaWwgFI791TRs2Enji+FeJpMX6z0s+ES3+npz6fOryLPA8q8TTl7N4xi+EAj8E0 NWF90wuTRb0fp6pvFH94pPumwNSkrCf7Cl2uX6PgpbogzUHOgWjEYZIX+/La8lH9FAurygEMfhURD aw+Q3loOVJQvo1kJcC8vwoogcUVAt7j/7DqLxMUYwuGiVhNUs6jM7XniFPaMJH6L+/rD1bpBdes9X fMPq6wH2JxL+wrtXFHS1sb7NSls9T1SIsKty0kYj8mfaNplOd8pVGhnKNFksqWJ29GW4O0fUQUyFE gvnqiAgFk1K91LC9JPGA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mBIaZ-006Yt9-BX; Wed, 04 Aug 2021 15:13:47 +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 1mBIaV-006YrU-0V for linux-arm-kernel@lists.infradead.org; Wed, 04 Aug 2021 15:13:44 +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 1257161004; Wed, 4 Aug 2021 15:13:42 +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 1mBIaS-002win-2M; Wed, 04 Aug 2021 16:13:40 +0100 Date: Wed, 04 Aug 2021 16:13:39 +0100 Message-ID: <87h7g5w8d8.wl-maz@kernel.org> From: Marc Zyngier To: Kishon Vijay Abraham I Cc: Bjorn Helgaas , Rob Herring , Lorenzo Pieralisi , Tom Joseph , , , , , , Lokesh Vutla Subject: Re: [PATCH v2 2/3] PCI: j721e: Add PCI legacy interrupt support for J721E In-Reply-To: <20210804132912.30685-3-kishon@ti.com> References: <20210804132912.30685-1-kishon@ti.com> <20210804132912.30685-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, bhelgaas@google.com, robh+dt@kernel.org, lorenzo.pieralisi@arm.com, tjoseph@cadence.com, linux-omap@vger.kernel.org, linux-pci@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, lokeshvutla@ti.com 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-20210804_081343_159150_6AB6FBD0 X-CRM114-Status: GOOD ( 36.37 ) 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 T24gV2VkLCAwNCBBdWcgMjAyMSAxNDoyOToxMSArMDEwMCwKS2lzaG9uIFZpamF5IEFicmFoYW0g SSA8a2lzaG9uQHRpLmNvbT4gd3JvdGU6Cj4gCj4gQWRkIFBDSSBsZWdhY3kgaW50ZXJydXB0IHN1 cHBvcnQgZm9yIEo3MjFFLiBKNzIxRSBoYXMgYSBzaW5nbGUgSFcKPiBpbnRlcnJ1cHQgbGluZSBm b3IgYWxsIHRoZSBmb3VyIGxlZ2FjeSBpbnRlcnJ1cHRzIElOVEEvSU5UQi9JTlRDL0lOVEQuCj4g VGhlIEhXIGludGVycnVwdCBsaW5lIGNvbm5lY3RlZCB0byBHSUMgaXMgYSBwdWxzZSBpbnRlcnJ1 cHQgd2hlcmVhcwo+IHRoZSBsZWdhY3kgaW50ZXJydXB0cyBieSBkZWZpbml0aW9uIGlzIGxldmVs IGludGVycnVwdC4gSW4gb3JkZXIgdG8KPiBwcm92aWRlIGxldmVsIGludGVycnVwdCBmdW5jdGlv bmFsaXR5IHRvIGVkZ2UgaW50ZXJydXB0IGxpbmUsIFBDSWUKPiBpbiBKNzIxRSBoYXMgcHJvdmlk ZWQgSVJRX0VPSSByZWdpc3Rlci4KPiAKPiBIb3dldmVyIGR1ZSB0byBFcnJhdGEgSUQgI2kyMDk0 IChbMV0pLCBFT0kgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCBpbiBIVwo+IGFuZCBvbmx5IGEgc2lu Z2xlIHB1bHNlIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgZXZlcnkKPiBBU1NFUlRf SU5UeC9ERUFTU0VSVF9JTlR4LgoKU28gbXkgZWFybGllciByZW1hcmsgc3RhbmRzLiBJZiB5b3Ug Z2V0IGEgc2luZ2xlIGVkZ2UsIGhvdyBkbyB5b3UKaGFuZGxlIGEgbGV2ZWwgdGhhdCBpcyBzdGls bCBoaWdoIGFmdGVyIGhhdmluZyBoYW5kbGVkIHRoZSBpbnRlcnJ1cHQKb24gaGFyZHdhcmUgdGhh dCBoYXMgdGhpcyBidWc/Cgo+IAo+IFsxXSAtPiBKNzIxRSBEUkE4MjkvVERBNFZNIFByb2Nlc3Nv cnMgU2lsaWNvbiBSZXZpc2lvbiAxLjEvMS4wIFNQUlo0NTVBIOKAkwo+ICAgICAgICBERUNFTUJF UiAyMDIwIOKAkyBSRVZJU0VEIEFVR1VTVCAyMDIxCj4gICAgICAgIChodHRwczovL3d3dy50aS5j b20vbGl0L2VyL3Nwcno0NTVhL3Nwcno0NTVhLnBkZikKPiAKPiBTaWduZWQtb2ZmLWJ5OiBLaXNo b24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGkuY29tPgo+IC0tLQo+ICBkcml2ZXJzL3BjaS9j b250cm9sbGVyL2NhZGVuY2UvcGNpLWo3MjFlLmMgfCA4NSArKysrKysrKysrKysrKysrKysrKysr Cj4gIDEgZmlsZSBjaGFuZ2VkLCA4NSBpbnNlcnRpb25zKCspCj4gCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvcGNpL2NvbnRyb2xsZXIvY2FkZW5jZS9wY2ktajcyMWUuYyBiL2RyaXZlcnMvcGNpL2Nv bnRyb2xsZXIvY2FkZW5jZS9wY2ktajcyMWUuYwo+IGluZGV4IDJlYzAzN2M0M2JkNS4uYzJlN2E3 OGRjMzFmIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvY2FkZW5jZS9wY2kt ajcyMWUuYwo+ICsrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvY2FkZW5jZS9wY2ktajcyMWUu Ywo+IEBAIC0yOSw2ICsyOSwxMyBAQAo+ICAjZGVmaW5lIExJTktfRE9XTgkJQklUKDEpCj4gICNk ZWZpbmUgSjcyMDBfTElOS19ET1dOCQlCSVQoMTApCj4gIAo+ICsjZGVmaW5lIEVPSV9SRUcJCQkw eDEwCj4gKwo+ICsjZGVmaW5lIEVOQUJMRV9SRUdfU1lTXzAJMHgxMDAKPiArI2RlZmluZSBTVEFU VVNfUkVHX1NZU18wCTB4NTAwCj4gKyNkZWZpbmUgU1RBVFVTX0NMUl9SRUdfU1lTXzAJMHg3MDAK PiArI2RlZmluZSBJTlR4X0VOKG51bSkJCSgxIDw8IChudW0pKQo+ICsKPiAgI2RlZmluZSBKNzIx RV9QQ0lFX1VTRVJfQ01EX1NUQVRVUwkweDQKPiAgI2RlZmluZSBMSU5LX1RSQUlOSU5HX0VOQUJM RQkJQklUKDApCj4gIAo+IEBAIC01OSw2ICs2Niw3IEBAIHN0cnVjdCBqNzIxZV9wY2llIHsKPiAg CXZvaWQgX19pb21lbQkJKnVzZXJfY2ZnX2Jhc2U7Cj4gIAl2b2lkIF9faW9tZW0JCSppbnRkX2Nm Z19iYXNlOwo+ICAJdTMyCQkJbGlua2Rvd25faXJxX3JlZ2ZpZWxkOwo+ICsJc3RydWN0IGlycV9k b21haW4JKmxlZ2FjeV9pcnFfZG9tYWluOwo+ICB9Owo+ICAKPiAgZW51bSBqNzIxZV9wY2llX21v ZGUgewo+IEBAIC0xMjEsNiArMTI5LDc5IEBAIHN0YXRpYyB2b2lkIGo3MjFlX3BjaWVfY29uZmln X2xpbmtfaXJxKHN0cnVjdCBqNzIxZV9wY2llICpwY2llKQo+ICAJajcyMWVfcGNpZV9pbnRkX3dy aXRlbChwY2llLCBFTkFCTEVfUkVHX1NZU18yLCByZWcpOwo+ICB9Cj4gIAo+ICtzdGF0aWMgdm9p ZCBqNzIxZV9wY2llX3YxX2xlZ2FjeV9pcnFfaGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2Mp Cj4gK3sKPiArCXN0cnVjdCBqNzIxZV9wY2llICpwY2llID0gaXJxX2Rlc2NfZ2V0X2hhbmRsZXJf ZGF0YShkZXNjKTsKPiArCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlw KGRlc2MpOwo+ICsJaW50IGksIHZpcnE7Cj4gKwl1MzIgcmVnOwo+ICsKPiArCWNoYWluZWRfaXJx X2VudGVyKGNoaXAsIGRlc2MpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX0lOVFg7 IGkrKykgewo+ICsJCXJlZyA9IGo3MjFlX3BjaWVfaW50ZF9yZWFkbChwY2llLCBTVEFUVVNfUkVH X1NZU18wKTsKPiArCQlpZiAoIShyZWcgJiBJTlR4X0VOKGkpKSkKPiArCQkJY29udGludWU7CgpX aHkgZG8geW91IG5lZWQgdG8gcGVyZm9ybSBtdWx0aXBsZSByZWFkcz8gU3VyZWx5IHJlZyBjb250 YWlucyBhbGwgdGhlCmJpdHMgeW91IG5lZWQsIGRvZXNuJ3QgaXQ/Cgo+ICsKPiArCQl2aXJxID0g aXJxX2ZpbmRfbWFwcGluZyhwY2llLT5sZWdhY3lfaXJxX2RvbWFpbiwgMyAtIGkpOwo+ICsJCWdl bmVyaWNfaGFuZGxlX2lycSh2aXJxKTsKClBsZWFzZSBjb21iaW5lIGJvdGggbGluZXMgaW50byBh IHNpbmdsZSBnZW5lcmljX2hhbmRsZV9kb21haW5faXJxKCkKY2FsbC4KCj4gKwkJajcyMWVfcGNp ZV9pbnRkX3dyaXRlbChwY2llLCBTVEFUVVNfQ0xSX1JFR19TWVNfMCwgSU5UeF9FTihpKSk7CgpX aGF0IGlzIHRoZSBwdXJwb3NlIG9mIHRoaXMgd3JpdGU/IEl0IGZlZWxzIGxpa2UgdGhpcyBzaG91 bGQgYmUgYQppcnFfZW9pIGNhbGxiYWNrLgoKPiArCX0KPiArCj4gKwljaGFpbmVkX2lycV9leGl0 KGNoaXAsIGRlc2MpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGo3MjFlX3BjaWVfaW50eF9tYXAo c3RydWN0IGlycV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgaW50IGlycSwgaXJxX2h3X251bWJl cl90IGh3aXJxKQo+ICt7Cj4gKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmZHVtbXlf aXJxX2NoaXAsIGhhbmRsZV9zaW1wbGVfaXJxKTsKCkFuIElOVHggaW50ZXJydXB0IGlzIGEgbGV2 ZWwgaW50ZXJydXB0LiBQbGVhc2UgdXNlIHRoZSBjb3JyZXNwb25kaW5nIGZsb3cuCgo+ICsJaXJx X3NldF9jaGlwX2RhdGEoaXJxLCBkb21haW4tPmhvc3RfZGF0YSk7Cj4gKwo+ICsJcmV0dXJuIDA7 Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgajcyMWVfcGNp ZV9pbnR4X2RvbWFpbl9vcHMgPSB7Cj4gKwkubWFwID0gajcyMWVfcGNpZV9pbnR4X21hcCwKPiAr fTsKPiArCj4gK3N0YXRpYyBpbnQgajcyMWVfcGNpZV9jb25maWdfbGVnYWN5X2lycShzdHJ1Y3Qg ajcyMWVfcGNpZSAqcGNpZSkKPiArewo+ICsJc3RydWN0IGlycV9kb21haW4gKmxlZ2FjeV9pcnFf ZG9tYWluOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gcGNpZS0+ZGV2Owo+ICsJc3RydWN0IGRl dmljZV9ub2RlICpub2RlID0gZGV2LT5vZl9ub2RlOwo+ICsJc3RydWN0IGRldmljZV9ub2RlICpp bnRjX25vZGU7Cj4gKwlpbnQgaXJxLCBpOwo+ICsJdTMyIHJlZzsKPiArCj4gKwlpbnRjX25vZGUg PSBvZl9nZXRfY2hpbGRfYnlfbmFtZShub2RlLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiKTsKPiAr CWlmICghaW50Y19ub2RlKSB7Cj4gKwkJZGV2X2RiZyhkZXYsICJpbnRlcnJ1cHQtY29udHJvbGxl ciBub2RlIGlzIGFic2VudC4gTGVnYWN5IElOVFIgbm90IHN1cHBvcnRlZFxuIik7Cj4gKwkJcmV0 dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoaW50Y19ub2Rl LCAwKTsKPiArCWlmICghaXJxKSB7Cj4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcGFyc2Ug YW5kIG1hcCBsZWdhY3kgaXJxXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCWly cV9zZXRfY2hhaW5lZF9oYW5kbGVyX2FuZF9kYXRhKGlycSwgajcyMWVfcGNpZV92MV9sZWdhY3lf aXJxX2hhbmRsZXIsIHBjaWUpOwo+ICsKPiArCWxlZ2FjeV9pcnFfZG9tYWluID0gaXJxX2RvbWFp bl9hZGRfbGluZWFyKGludGNfbm9kZSwgUENJX05VTV9JTlRYLAo+ICsJCQkJCQkgICZqNzIxZV9w Y2llX2ludHhfZG9tYWluX29wcywgcGNpZSk7Cj4gKwlpZiAoIWxlZ2FjeV9pcnFfZG9tYWluKSB7 Cj4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWRkIGlycSBkb21haW4gZm9yIGxlZ2FjeSBp cnFzXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCXBjaWUtPmxlZ2FjeV9pcnFf ZG9tYWluID0gbGVnYWN5X2lycV9kb21haW47Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IFBDSV9O VU1fSU5UWDsgaSsrKSB7Cj4gKwkJcmVnID0gajcyMWVfcGNpZV9pbnRkX3JlYWRsKHBjaWUsIEVO QUJMRV9SRUdfU1lTXzApOwo+ICsJCXJlZyB8PSBJTlR4X0VOKGkpOwo+ICsJCWo3MjFlX3BjaWVf aW50ZF93cml0ZWwocGNpZSwgRU5BQkxFX1JFR19TWVNfMCwgcmVnKTsKPiArCX0KClRoaXMgc2hv dWxkIGJlIG1vdmVkIHRvIHRoZSBpcnFfdW5tYXNrKCkgY2FsbGJhY2suCgpUaGFua3MsCgoJTS4K Ci0tIApXaXRob3V0IGRldmlhdGlvbiBmcm9tIHRoZSBub3JtLCBwcm9ncmVzcyBpcyBub3QgcG9z c2libGUuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps aW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1hcm0ta2VybmVsCg==