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=unavailable 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 F1806C4320A for ; Mon, 9 Aug 2021 09:39:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D1BFB610FF for ; Mon, 9 Aug 2021 09:39:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234604AbhHIJj1 convert rfc822-to-8bit (ORCPT ); Mon, 9 Aug 2021 05:39:27 -0400 Received: from mail.kernel.org ([198.145.29.99]:46946 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234468AbhHIJj1 (ORCPT ); Mon, 9 Aug 2021 05:39:27 -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 994FE60F35; Mon, 9 Aug 2021 09:39:06 +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 1mD1kO-003mj9-6f; Mon, 09 Aug 2021 10:39:04 +0100 Date: Mon, 09 Aug 2021 10:39:03 +0100 Message-ID: <87o8a7arew.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: References: <20210804132912.30685-1-kishon@ti.com> <20210804132912.30685-3-kishon@ti.com> <87h7g5w8d8.wl-maz@kernel.org> 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 Mon, 09 Aug 2021 05:50:10 +0100, Kishon Vijay Abraham I wrote: > > Hi Marc, > > On 04/08/21 8:43 pm, Marc Zyngier wrote: > > 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? > > Right, this hardware (J721E) has a bug but was fixed in J7200 (Patch 3/3 > handles that). But how do you make it work with J721E? Is it even worth supporting if (as I expect) it is unreliable? > > > >> > >> [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? > > Right, will fix it up. > > > >> + > >> + 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. > > Okay. > > > >> + 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. > > It's an IRQ ACK, since in this platform the level to edge is not > implemented properly in HW. An Ack for an edge interrupt would need to happen before you handle the interrupt, or you'd wrongly acknowledge edges that fire between the handling of the interrupt and the Ack, and that would never be handled. If it really is an Ack, it needs to be moved *before* the handling, preferably in an irq_ack callback. Otherwise, it is an EOI, and it belongs to irq_eoi. > > > >> + } > >> + > >> + 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. > > Okay. > > > >> + 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. > > Should we also have a corresponding irq_mask()? Then would require us > implement reference counting since legacy interrupts are shared. The core code should already deal with this, I expect. It isn't like shared interrupts are something new. And yes, you should have both mask and unmask. 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 ACA0CC4338F for ; Mon, 9 Aug 2021 09:41:56 +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 69F5060F35 for ; Mon, 9 Aug 2021 09:41:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 69F5060F35 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=l8TK6fkli3XWftxThSMohG/n5Bl8gHsappvAQVO3lk4=; b=ms6ZGfyo6bOmg1 pt31udaNmP8jo6V6Qz3zUAkI6zMiECxURPnl4C3AAdANcsoSBaBe3WkX3de2c1UmJkQjnBUuVP28d FwjihcoIcRiLMLqYp+dKnop9YkcOmoSpGHf0xj2eu/STINAKJ8zIaKa7EfArSxlVzfqgsbegXDeRz m1KouRVV1aDmjTN8olscYsDAAa1soI4ACuO3kMMjnaUmxCgnY3zZJHQoHda24+MKUyHWpjisQ++R/ DGzn4O1VxndZH7DpOqxuQTZhLoiO1WeNPT4b7qmICx/7OSUGEwF/ZtvI1hY8a1+ml2M5W88Nzgi0C 36+hzfDej+rX/ej/WDew==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mD1kV-0002tJ-PC; Mon, 09 Aug 2021 09:39:11 +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 1mD1kR-0002sK-9n for linux-arm-kernel@lists.infradead.org; Mon, 09 Aug 2021 09:39:09 +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 994FE60F35; Mon, 9 Aug 2021 09:39:06 +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 1mD1kO-003mj9-6f; Mon, 09 Aug 2021 10:39:04 +0100 Date: Mon, 09 Aug 2021 10:39:03 +0100 Message-ID: <87o8a7arew.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: References: <20210804132912.30685-1-kishon@ti.com> <20210804132912.30685-3-kishon@ti.com> <87h7g5w8d8.wl-maz@kernel.org> 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-20210809_023907_436441_FABFAD5F X-CRM114-Status: GOOD ( 47.77 ) 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 T24gTW9uLCAwOSBBdWcgMjAyMSAwNTo1MDoxMCArMDEwMCwKS2lzaG9uIFZpamF5IEFicmFoYW0g SSA8a2lzaG9uQHRpLmNvbT4gd3JvdGU6Cj4gCj4gSGkgTWFyYywKPiAKPiBPbiAwNC8wOC8yMSA4 OjQzIHBtLCBNYXJjIFp5bmdpZXIgd3JvdGU6Cj4gPiBPbiBXZWQsIDA0IEF1ZyAyMDIxIDE0OjI5 OjExICswMTAwLAo+ID4gS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4gd3Jv dGU6Cj4gPj4KPiA+PiBBZGQgUENJIGxlZ2FjeSBpbnRlcnJ1cHQgc3VwcG9ydCBmb3IgSjcyMUUu IEo3MjFFIGhhcyBhIHNpbmdsZSBIVwo+ID4+IGludGVycnVwdCBsaW5lIGZvciBhbGwgdGhlIGZv dXIgbGVnYWN5IGludGVycnVwdHMgSU5UQS9JTlRCL0lOVEMvSU5URC4KPiA+PiBUaGUgSFcgaW50 ZXJydXB0IGxpbmUgY29ubmVjdGVkIHRvIEdJQyBpcyBhIHB1bHNlIGludGVycnVwdCB3aGVyZWFz Cj4gPj4gdGhlIGxlZ2FjeSBpbnRlcnJ1cHRzIGJ5IGRlZmluaXRpb24gaXMgbGV2ZWwgaW50ZXJy dXB0LiBJbiBvcmRlciB0bwo+ID4+IHByb3ZpZGUgbGV2ZWwgaW50ZXJydXB0IGZ1bmN0aW9uYWxp dHkgdG8gZWRnZSBpbnRlcnJ1cHQgbGluZSwgUENJZQo+ID4+IGluIEo3MjFFIGhhcyBwcm92aWRl ZCBJUlFfRU9JIHJlZ2lzdGVyLgo+ID4+Cj4gPj4gSG93ZXZlciBkdWUgdG8gRXJyYXRhIElEICNp MjA5NCAoWzFdKSwgRU9JIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQgaW4gSFcKPiA+PiBhbmQgb25s eSBhIHNpbmdsZSBwdWxzZSBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGV2ZXJ5Cj4g Pj4gQVNTRVJUX0lOVHgvREVBU1NFUlRfSU5UeC4KPiA+IAo+ID4gU28gbXkgZWFybGllciByZW1h cmsgc3RhbmRzLiBJZiB5b3UgZ2V0IGEgc2luZ2xlIGVkZ2UsIGhvdyBkbyB5b3UKPiA+IGhhbmRs ZSBhIGxldmVsIHRoYXQgaXMgc3RpbGwgaGlnaCBhZnRlciBoYXZpbmcgaGFuZGxlZCB0aGUgaW50 ZXJydXB0Cj4gPiBvbiBoYXJkd2FyZSB0aGF0IGhhcyB0aGlzIGJ1Zz8KPiAKPiBSaWdodCwgdGhp cyBoYXJkd2FyZSAoSjcyMUUpIGhhcyBhIGJ1ZyBidXQgd2FzIGZpeGVkIGluIEo3MjAwIChQYXRj aCAzLzMKPiBoYW5kbGVzIHRoYXQpLgoKQnV0IGhvdyBkbyB5b3UgbWFrZSBpdCB3b3JrIHdpdGgg SjcyMUU/IElzIGl0IGV2ZW4gd29ydGggc3VwcG9ydGluZyBpZgooYXMgSSBleHBlY3QpIGl0IGlz IHVucmVsaWFibGU/Cgo+ID4gCj4gPj4KPiA+PiBbMV0gLT4gSjcyMUUgRFJBODI5L1REQTRWTSBQ cm9jZXNzb3JzIFNpbGljb24gUmV2aXNpb24gMS4xLzEuMCBTUFJaNDU1QSDigJMKPiA+PiAgICAg ICAgREVDRU1CRVIgMjAyMCDigJMgUkVWSVNFRCBBVUdVU1QgMjAyMQo+ID4+ICAgICAgICAoaHR0 cHM6Ly93d3cudGkuY29tL2xpdC9lci9zcHJ6NDU1YS9zcHJ6NDU1YS5wZGYpCj4gPj4KPiA+PiBT aWduZWQtb2ZmLWJ5OiBLaXNob24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGkuY29tPgo+ID4+ IC0tLQo+ID4+ICBkcml2ZXJzL3BjaS9jb250cm9sbGVyL2NhZGVuY2UvcGNpLWo3MjFlLmMgfCA4 NSArKysrKysrKysrKysrKysrKysrKysrCj4gPj4gIDEgZmlsZSBjaGFuZ2VkLCA4NSBpbnNlcnRp b25zKCspCj4gPj4KPiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9jYWRl bmNlL3BjaS1qNzIxZS5jIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9jYWRlbmNlL3BjaS1qNzIx ZS5jCj4gPj4gaW5kZXggMmVjMDM3YzQzYmQ1Li5jMmU3YTc4ZGMzMWYgMTAwNjQ0Cj4gPj4gLS0t IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9jYWRlbmNlL3BjaS1qNzIxZS5jCj4gPj4gKysrIGIv ZHJpdmVycy9wY2kvY29udHJvbGxlci9jYWRlbmNlL3BjaS1qNzIxZS5jCj4gPj4gQEAgLTI5LDYg KzI5LDEzIEBACj4gPj4gICNkZWZpbmUgTElOS19ET1dOCQlCSVQoMSkKPiA+PiAgI2RlZmluZSBK NzIwMF9MSU5LX0RPV04JCUJJVCgxMCkKPiA+PiAgCj4gPj4gKyNkZWZpbmUgRU9JX1JFRwkJCTB4 MTAKPiA+PiArCj4gPj4gKyNkZWZpbmUgRU5BQkxFX1JFR19TWVNfMAkweDEwMAo+ID4+ICsjZGVm aW5lIFNUQVRVU19SRUdfU1lTXzAJMHg1MDAKPiA+PiArI2RlZmluZSBTVEFUVVNfQ0xSX1JFR19T WVNfMAkweDcwMAo+ID4+ICsjZGVmaW5lIElOVHhfRU4obnVtKQkJKDEgPDwgKG51bSkpCj4gPj4g Kwo+ID4+ICAjZGVmaW5lIEo3MjFFX1BDSUVfVVNFUl9DTURfU1RBVFVTCTB4NAo+ID4+ICAjZGVm aW5lIExJTktfVFJBSU5JTkdfRU5BQkxFCQlCSVQoMCkKPiA+PiAgCj4gPj4gQEAgLTU5LDYgKzY2 LDcgQEAgc3RydWN0IGo3MjFlX3BjaWUgewo+ID4+ICAJdm9pZCBfX2lvbWVtCQkqdXNlcl9jZmdf YmFzZTsKPiA+PiAgCXZvaWQgX19pb21lbQkJKmludGRfY2ZnX2Jhc2U7Cj4gPj4gIAl1MzIJCQls aW5rZG93bl9pcnFfcmVnZmllbGQ7Cj4gPj4gKwlzdHJ1Y3QgaXJxX2RvbWFpbgkqbGVnYWN5X2ly cV9kb21haW47Cj4gPj4gIH07Cj4gPj4gIAo+ID4+ICBlbnVtIGo3MjFlX3BjaWVfbW9kZSB7Cj4g Pj4gQEAgLTEyMSw2ICsxMjksNzkgQEAgc3RhdGljIHZvaWQgajcyMWVfcGNpZV9jb25maWdfbGlu a19pcnEoc3RydWN0IGo3MjFlX3BjaWUgKnBjaWUpCj4gPj4gIAlqNzIxZV9wY2llX2ludGRfd3Jp dGVsKHBjaWUsIEVOQUJMRV9SRUdfU1lTXzIsIHJlZyk7Cj4gPj4gIH0KPiA+PiAgCj4gPj4gK3N0 YXRpYyB2b2lkIGo3MjFlX3BjaWVfdjFfbGVnYWN5X2lycV9oYW5kbGVyKHN0cnVjdCBpcnFfZGVz YyAqZGVzYykKPiA+PiArewo+ID4+ICsJc3RydWN0IGo3MjFlX3BjaWUgKnBjaWUgPSBpcnFfZGVz Y19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOwo+ID4+ICsJc3RydWN0IGlycV9jaGlwICpjaGlwID0g aXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7Cj4gPj4gKwlpbnQgaSwgdmlycTsKPiA+PiArCXUzMiBy ZWc7Cj4gPj4gKwo+ID4+ICsJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7Cj4gPj4gKwo+ ID4+ICsJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fSU5UWDsgaSsrKSB7Cj4gPj4gKwkJcmVnID0g ajcyMWVfcGNpZV9pbnRkX3JlYWRsKHBjaWUsIFNUQVRVU19SRUdfU1lTXzApOwo+ID4+ICsJCWlm ICghKHJlZyAmIElOVHhfRU4oaSkpKQo+ID4+ICsJCQljb250aW51ZTsKPiA+IAo+ID4gV2h5IGRv IHlvdSBuZWVkIHRvIHBlcmZvcm0gbXVsdGlwbGUgcmVhZHM/IFN1cmVseSByZWcgY29udGFpbnMg YWxsIHRoZQo+ID4gYml0cyB5b3UgbmVlZCwgZG9lc24ndCBpdD8KPiAKPiBSaWdodCwgd2lsbCBm aXggaXQgdXAuCj4gPiAKPiA+PiArCj4gPj4gKwkJdmlycSA9IGlycV9maW5kX21hcHBpbmcocGNp ZS0+bGVnYWN5X2lycV9kb21haW4sIDMgLSBpKTsKPiA+PiArCQlnZW5lcmljX2hhbmRsZV9pcnEo dmlycSk7Cj4gPiAKPiA+IFBsZWFzZSBjb21iaW5lIGJvdGggbGluZXMgaW50byBhIHNpbmdsZSBn ZW5lcmljX2hhbmRsZV9kb21haW5faXJxKCkKPiA+IGNhbGwuCj4gCj4gT2theS4KPiA+IAo+ID4+ ICsJCWo3MjFlX3BjaWVfaW50ZF93cml0ZWwocGNpZSwgU1RBVFVTX0NMUl9SRUdfU1lTXzAsIElO VHhfRU4oaSkpOwo+ID4gCj4gPiBXaGF0IGlzIHRoZSBwdXJwb3NlIG9mIHRoaXMgd3JpdGU/IEl0 IGZlZWxzIGxpa2UgdGhpcyBzaG91bGQgYmUgYQo+ID4gaXJxX2VvaSBjYWxsYmFjay4KPiAKPiBJ dCdzIGFuIElSUSBBQ0ssIHNpbmNlIGluIHRoaXMgcGxhdGZvcm0gdGhlIGxldmVsIHRvIGVkZ2Ug aXMgbm90Cj4gaW1wbGVtZW50ZWQgcHJvcGVybHkgaW4gSFcuCgpBbiBBY2sgZm9yIGFuIGVkZ2Ug aW50ZXJydXB0IHdvdWxkIG5lZWQgdG8gaGFwcGVuIGJlZm9yZSB5b3UgaGFuZGxlCnRoZSBpbnRl cnJ1cHQsIG9yIHlvdSdkIHdyb25nbHkgYWNrbm93bGVkZ2UgZWRnZXMgdGhhdCBmaXJlIGJldHdl ZW4KdGhlIGhhbmRsaW5nIG9mIHRoZSBpbnRlcnJ1cHQgYW5kIHRoZSBBY2ssIGFuZCB0aGF0IHdv dWxkIG5ldmVyIGJlCmhhbmRsZWQuCgpJZiBpdCByZWFsbHkgaXMgYW4gQWNrLCBpdCBuZWVkcyB0 byBiZSBtb3ZlZCAqYmVmb3JlKiB0aGUgaGFuZGxpbmcsCnByZWZlcmFibHkgaW4gYW4gaXJxX2Fj ayBjYWxsYmFjay4gT3RoZXJ3aXNlLCBpdCBpcyBhbiBFT0ksIGFuZCBpdApiZWxvbmdzIHRvIGly cV9lb2kuCgo+ID4gCj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJY2hhaW5lZF9pcnFfZXhpdChjaGlw LCBkZXNjKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBqNzIxZV9wY2llX2ludHhf bWFwKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGludCBpcnEsIGlycV9od19u dW1iZXJfdCBod2lycSkKPiA+PiArewo+ID4+ICsJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGly cSwgJmR1bW15X2lycV9jaGlwLCBoYW5kbGVfc2ltcGxlX2lycSk7Cj4gPiAKPiA+IEFuIElOVHgg aW50ZXJydXB0IGlzIGEgbGV2ZWwgaW50ZXJydXB0LiBQbGVhc2UgdXNlIHRoZSBjb3JyZXNwb25k aW5nIGZsb3cuCj4gCj4gT2theS4KPiA+IAo+ID4+ICsJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBk b21haW4tPmhvc3RfZGF0YSk7Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiAr Cj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgajcyMWVfcGNpZV9pbnR4 X2RvbWFpbl9vcHMgPSB7Cj4gPj4gKwkubWFwID0gajcyMWVfcGNpZV9pbnR4X21hcCwKPiA+PiAr fTsKPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgajcyMWVfcGNpZV9jb25maWdfbGVnYWN5X2lycShz dHJ1Y3QgajcyMWVfcGNpZSAqcGNpZSkKPiA+PiArewo+ID4+ICsJc3RydWN0IGlycV9kb21haW4g KmxlZ2FjeV9pcnFfZG9tYWluOwo+ID4+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gcGNpZS0+ZGV2 Owo+ID4+ICsJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gZGV2LT5vZl9ub2RlOwo+ID4+ICsJ c3RydWN0IGRldmljZV9ub2RlICppbnRjX25vZGU7Cj4gPj4gKwlpbnQgaXJxLCBpOwo+ID4+ICsJ dTMyIHJlZzsKPiA+PiArCj4gPj4gKwlpbnRjX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShu b2RlLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiKTsKPiA+PiArCWlmICghaW50Y19ub2RlKSB7Cj4g Pj4gKwkJZGV2X2RiZyhkZXYsICJpbnRlcnJ1cHQtY29udHJvbGxlciBub2RlIGlzIGFic2VudC4g TGVnYWN5IElOVFIgbm90IHN1cHBvcnRlZFxuIik7Cj4gPj4gKwkJcmV0dXJuIDA7Cj4gPj4gKwl9 Cj4gPj4gKwo+ID4+ICsJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoaW50Y19ub2RlLCAwKTsK PiA+PiArCWlmICghaXJxKSB7Cj4gPj4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcGFyc2Ug YW5kIG1hcCBsZWdhY3kgaXJxXG4iKTsKPiA+PiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+PiArCX0K PiA+PiArCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyX2FuZF9kYXRhKGlycSwgajcyMWVfcGNpZV92 MV9sZWdhY3lfaXJxX2hhbmRsZXIsIHBjaWUpOwo+ID4+ICsKPiA+PiArCWxlZ2FjeV9pcnFfZG9t YWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKGludGNfbm9kZSwgUENJX05VTV9JTlRYLAo+ID4+ ICsJCQkJCQkgICZqNzIxZV9wY2llX2ludHhfZG9tYWluX29wcywgcGNpZSk7Cj4gPj4gKwlpZiAo IWxlZ2FjeV9pcnFfZG9tYWluKSB7Cj4gPj4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWRk IGlycSBkb21haW4gZm9yIGxlZ2FjeSBpcnFzXG4iKTsKPiA+PiArCQlyZXR1cm4gLUVJTlZBTDsK PiA+PiArCX0KPiA+PiArCXBjaWUtPmxlZ2FjeV9pcnFfZG9tYWluID0gbGVnYWN5X2lycV9kb21h aW47Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fSU5UWDsgaSsrKSB7Cj4g Pj4gKwkJcmVnID0gajcyMWVfcGNpZV9pbnRkX3JlYWRsKHBjaWUsIEVOQUJMRV9SRUdfU1lTXzAp Owo+ID4+ICsJCXJlZyB8PSBJTlR4X0VOKGkpOwo+ID4+ICsJCWo3MjFlX3BjaWVfaW50ZF93cml0 ZWwocGNpZSwgRU5BQkxFX1JFR19TWVNfMCwgcmVnKTsKPiA+PiArCX0KPiA+IAo+ID4gVGhpcyBz aG91bGQgYmUgbW92ZWQgdG8gdGhlIGlycV91bm1hc2soKSBjYWxsYmFjay4KPiAKPiBTaG91bGQg d2UgYWxzbyBoYXZlIGEgY29ycmVzcG9uZGluZyBpcnFfbWFzaygpPyBUaGVuIHdvdWxkIHJlcXVp cmUgdXMKPiBpbXBsZW1lbnQgcmVmZXJlbmNlIGNvdW50aW5nIHNpbmNlIGxlZ2FjeSBpbnRlcnJ1 cHRzIGFyZSBzaGFyZWQuCgpUaGUgY29yZSBjb2RlIHNob3VsZCBhbHJlYWR5IGRlYWwgd2l0aCB0 aGlzLCBJIGV4cGVjdC4gSXQgaXNuJ3QgbGlrZQpzaGFyZWQgaW50ZXJydXB0cyBhcmUgc29tZXRo aW5nIG5ldy4gQW5kIHllcywgeW91IHNob3VsZCBoYXZlIGJvdGgKbWFzayBhbmQgdW5tYXNrLgoK VGhhbmtzLAoKCU0uCgotLSAKV2l0aG91dCBkZXZpYXRpb24gZnJvbSB0aGUgbm9ybSwgcHJvZ3Jl c3MgaXMgbm90IHBvc3NpYmxlLgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5l bEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=