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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A3993C433FE for ; Fri, 7 Jan 2022 11:51:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347244AbiAGLu7 (ORCPT ); Fri, 7 Jan 2022 06:50:59 -0500 Received: from ams.source.kernel.org ([145.40.68.75]:35262 "EHLO ams.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347221AbiAGLu6 (ORCPT ); Fri, 7 Jan 2022 06:50:58 -0500 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 7A186B825E5; Fri, 7 Jan 2022 11:50:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id F2115C36AE5; Fri, 7 Jan 2022 11:50:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1641556256; bh=tlSofhkr2jzdAYuwsla28s0MjyMWwGKIHX80B/VQRrM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=XNWfyA+aLJEC6aM3jDiOTBffhJ0zbs0inYpMsvPonLfCnM947+z6kMNhixvYvA8t3 qLQxL9wWU7KuuR2m+D7Y3sZqME7ExvyezzgQ92Trad+bXjQLg55wIS5qMascwn+W51 tO2/fTSx2tgL9ILo4IOZmK6rEIdHTDQYpPTWSrK/OUvVCLGjVyPlUTphT5gTRGuRdN zWZklTXgjpqCy1KKz5DUW6kPrhJ+SHEJnyOTMOJI98haCuBwTbSMqPzHvthsY5LDuu 8yZW/ykqTzcx0wmM9vbCumnpYaENQRNh8+YHAgMMCxYTSFUswl76gJU5Et4yhNUUkl WKXg/8+TUyaMw== Received: by pali.im (Postfix) id 44ABDB22; Fri, 7 Jan 2022 12:50:53 +0100 (CET) Date: Fri, 7 Jan 2022 12:50:53 +0100 From: Pali =?utf-8?B?Um9ow6Fy?= To: Marc Zyngier Cc: Marek =?utf-8?B?QmVow7pu?= , Lorenzo Pieralisi , Bjorn Helgaas , Rob Herring , Thomas Petazzoni , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Russell King , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 10/11] PCI: mvebu: Implement support for legacy INTx interrupts Message-ID: <20220107115053.k5d2uv7yrftrpcez@pali> References: <20220105150239.9628-1-pali@kernel.org> <20220105150239.9628-11-pali@kernel.org> <87bl0ovq7f.wl-maz@kernel.org> <20220106154447.aie6taiuvav5wu6y@pali> <878rvsvoyo.wl-maz@kernel.org> <20220106162047.vqykmygs75eimfgy@pali> <877dbcvngf.wl-maz@kernel.org> <20220106182044.3ff0828c@thinkpad> <874k6gvkhz.wl-maz@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <874k6gvkhz.wl-maz@kernel.org> User-Agent: NeoMutt/20180716 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thursday 06 January 2022 17:31:36 Marc Zyngier wrote: > On Thu, 06 Jan 2022 17:20:44 +0000, > Marek BehĂșn wrote: > > > > On Thu, 06 Jan 2022 16:27:44 +0000 > > Marc Zyngier wrote: > > > You are completely missing my point. I'm talking about data > > > structures, you're talking about interrupts. You have this: > > > > > > struct mvebu_pcie_port { > > > // Tons of stuff > > > struct irq_chip intx_chip; > > > }; > > > > > > What I want you to do is: > > > > > > struct mvebu_pcie_port { > > > // Tons of stuff > > > }; > > > > > > static struct irq_chip intx_chip = { > > > .name = "INTx", > > > .irq_mask = mvebu_pcie_intx_irq_mask, > > > .irq_unmask = mvebu_pcie_intx_irq_unmask; > > > }; > > > > > > That's it. No more, no less. > > > > > > M. > > > > > > > Hmm, but struct irq_chip contains a dynamic member, > > struct device *parent_device; > > Isn't that used? Or are you planning to kill it? > > Indeed, and I am definitely planning to kill it. This is the wrong > place for this stuff, and I want it gone. There are thankfully very > few users of this misfeature. Ok, so what about this change? diff --git a/drivers/pci/controller/pci-mvebu.c b/drivers/pci/controller/pci-mvebu.c index 1e90ab888075..5c816338a569 100644 --- a/drivers/pci/controller/pci-mvebu.c +++ b/drivers/pci/controller/pci-mvebu.c @@ -54,9 +54,10 @@ PCIE_CONF_ADDR_EN) #define PCIE_CONF_DATA_OFF 0x18fc #define PCIE_INT_CAUSE_OFF 0x1900 +#define PCIE_INT_UNMASK_OFF 0x1910 +#define PCIE_INT_INTX(i) BIT(24+i) #define PCIE_INT_PM_PME BIT(28) -#define PCIE_MASK_OFF 0x1910 -#define PCIE_MASK_ENABLE_INTS 0x0f000000 +#define PCIE_INT_ALL_MASK GENMASK(31, 0) #define PCIE_CTRL_OFF 0x1a00 #define PCIE_CTRL_X1_MODE 0x0001 #define PCIE_CTRL_RC_MODE BIT(1) @@ -110,6 +111,9 @@ struct mvebu_pcie_port { struct mvebu_pcie_window iowin; u32 saved_pcie_stat; struct resource regs; + struct irq_domain *intx_irq_domain; + raw_spinlock_t irq_lock; + int intx_irq; }; static inline void mvebu_writel(struct mvebu_pcie_port *port, u32 val, u32 reg) @@ -235,7 +239,7 @@ static void mvebu_pcie_setup_wins(struct mvebu_pcie_port *port) static void mvebu_pcie_setup_hw(struct mvebu_pcie_port *port) { - u32 ctrl, lnkcap, cmd, dev_rev, mask; + u32 ctrl, lnkcap, cmd, dev_rev, unmask; /* Setup PCIe controller to Root Complex mode. */ ctrl = mvebu_readl(port, PCIE_CTRL_OFF); @@ -288,10 +292,30 @@ static void mvebu_pcie_setup_hw(struct mvebu_pcie_port *port) /* Point PCIe unit MBUS decode windows to DRAM space. */ mvebu_pcie_setup_wins(port); - /* Enable interrupt lines A-D. */ - mask = mvebu_readl(port, PCIE_MASK_OFF); - mask |= PCIE_MASK_ENABLE_INTS; - mvebu_writel(port, mask, PCIE_MASK_OFF); + /* Mask all interrupt sources. */ + mvebu_writel(port, ~PCIE_INT_ALL_MASK, PCIE_INT_UNMASK_OFF); + + /* Clear all interrupt causes. */ + mvebu_writel(port, ~PCIE_INT_ALL_MASK, PCIE_INT_CAUSE_OFF); + + if (port->intx_irq <= 0) { + /* + * When neither "summary" interrupt, nor "intx" interrupt was + * specified in DT then unmask all legacy INTx interrupts as in + * this case driver does not provide a way for masking and + * unmasking of individual legacy INTx interrupts. In this case + * all interrupts, including legacy INTx are reported via one + * shared GIC source and therefore kernel cannot distinguish + * which individual legacy INTx was triggered. These interrupts + * are shared, so it should not cause any issue. Just + * performance penalty as every PCIe interrupt handler needs to + * be called when some interrupt is triggered. + */ + unmask = mvebu_readl(port, PCIE_INT_UNMASK_OFF); + unmask |= PCIE_INT_INTX(0) | PCIE_INT_INTX(1) | + PCIE_INT_INTX(2) | PCIE_INT_INTX(3); + mvebu_writel(port, unmask, PCIE_INT_UNMASK_OFF); + } } static struct mvebu_pcie_port *mvebu_pcie_find_port(struct mvebu_pcie *pcie, @@ -924,6 +948,108 @@ static struct pci_ops mvebu_pcie_ops = { .write = mvebu_pcie_wr_conf, }; +static void mvebu_pcie_intx_irq_mask(struct irq_data *d) +{ + struct mvebu_pcie_port *port = d->domain->host_data; + irq_hw_number_t hwirq = irqd_to_hwirq(d); + unsigned long flags; + u32 unmask; + + raw_spin_lock_irqsave(&port->irq_lock, flags); + unmask = mvebu_readl(port, PCIE_INT_UNMASK_OFF); + unmask &= ~PCIE_INT_INTX(hwirq); + mvebu_writel(port, unmask, PCIE_INT_UNMASK_OFF); + raw_spin_unlock_irqrestore(&port->irq_lock, flags); +} + +static void mvebu_pcie_intx_irq_unmask(struct irq_data *d) +{ + struct mvebu_pcie_port *port = d->domain->host_data; + irq_hw_number_t hwirq = irqd_to_hwirq(d); + unsigned long flags; + u32 unmask; + + raw_spin_lock_irqsave(&port->irq_lock, flags); + unmask = mvebu_readl(port, PCIE_INT_UNMASK_OFF); + unmask |= PCIE_INT_INTX(hwirq); + mvebu_writel(port, unmask, PCIE_INT_UNMASK_OFF); + raw_spin_unlock_irqrestore(&port->irq_lock, flags); +} + +static struct irq_chip intx_irq_chip = { + .name = "mvebu-INTx", + .irq_mask = mvebu_pcie_intx_irq_mask, + .irq_unmask = mvebu_pcie_intx_irq_unmask, +}; + +static int mvebu_pcie_intx_irq_map(struct irq_domain *h, + unsigned int virq, irq_hw_number_t hwirq) +{ + struct mvebu_pcie_port *port = h->host_data; + + irq_set_status_flags(virq, IRQ_LEVEL); + irq_set_chip_and_handler(virq, &intx_irq_chip, handle_level_irq); + irq_set_chip_data(virq, port); + + return 0; +} + +static const struct irq_domain_ops mvebu_pcie_intx_irq_domain_ops = { + .map = mvebu_pcie_intx_irq_map, + .xlate = irq_domain_xlate_onecell, +}; + +static int mvebu_pcie_init_irq_domain(struct mvebu_pcie_port *port) +{ + struct device *dev = &port->pcie->pdev->dev; + struct device_node *pcie_intc_node; + + raw_spin_lock_init(&port->irq_lock); + + pcie_intc_node = of_get_next_child(port->dn, NULL); + if (!pcie_intc_node) { + dev_err(dev, "No PCIe Intc node found for %s\n", port->name); + return -ENODEV; + } + + port->intx_irq_domain = irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, + &mvebu_pcie_intx_irq_domain_ops, + port); + of_node_put(pcie_intc_node); + if (!port->intx_irq_domain) { + dev_err(dev, "Failed to get INTx IRQ domain for %s\n", port->name); + return -ENOMEM; + } + + return 0; +} + +static void mvebu_pcie_irq_handler(struct irq_desc *desc) +{ + struct mvebu_pcie_port *port = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + struct device *dev = &port->pcie->pdev->dev; + u32 cause, unmask, status; + int i; + + chained_irq_enter(chip, desc); + + cause = mvebu_readl(port, PCIE_INT_CAUSE_OFF); + unmask = mvebu_readl(port, PCIE_INT_UNMASK_OFF); + status = cause & unmask; + + /* Process legacy INTx interrupts */ + for (i = 0; i < PCI_NUM_INTX; i++) { + if (!(status & PCIE_INT_INTX(i))) + continue; + + if (generic_handle_domain_irq(port->intx_irq_domain, i) == -EINVAL) + dev_err_ratelimited(dev, "unexpected INT%c IRQ\n", (char)i+'A'); + } + + chained_irq_exit(chip, desc); +} + static int mvebu_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) { /* Interrupt support on mvebu emulated bridges is not implemented yet */ @@ -1121,6 +1247,21 @@ static int mvebu_pcie_parse_port(struct mvebu_pcie *pcie, port->io_attr = -1; } + /* + * Old DT bindings do not contain "intx" interrupt + * so do not fail probing driver when interrupt does not exist. + */ + port->intx_irq = of_irq_get_byname(child, "intx"); + if (port->intx_irq == -EPROBE_DEFER) { + ret = port->intx_irq; + goto err; + } + if (port->intx_irq <= 0) { + dev_warn(dev, "%s: legacy INTx interrupts cannot be masked individually, " + "%pOF does not contain intx interrupt\n", + port->name, child); + } + reset_gpio = of_get_named_gpio_flags(child, "reset-gpios", 0, &flags); if (reset_gpio == -EPROBE_DEFER) { ret = reset_gpio; @@ -1317,6 +1458,7 @@ static int mvebu_pcie_probe(struct platform_device *pdev) for (i = 0; i < pcie->nports; i++) { struct mvebu_pcie_port *port = &pcie->ports[i]; + int irq = port->intx_irq; child = port->dn; if (!child) @@ -1344,6 +1486,22 @@ static int mvebu_pcie_probe(struct platform_device *pdev) continue; } + if (irq > 0) { + ret = mvebu_pcie_init_irq_domain(port); + if (ret) { + dev_err(dev, "%s: cannot init irq domain\n", + port->name); + pci_bridge_emul_cleanup(&port->bridge); + devm_iounmap(dev, port->base); + port->base = NULL; + mvebu_pcie_powerdown(port); + continue; + } + irq_set_chained_handler_and_data(irq, + mvebu_pcie_irq_handler, + port); + } + /* * PCIe topology exported by mvebu hw is quite complicated. In * reality has something like N fully independent host bridges @@ -1448,6 +1606,7 @@ static int mvebu_pcie_remove(struct platform_device *pdev) for (i = 0; i < pcie->nports; i++) { struct mvebu_pcie_port *port = &pcie->ports[i]; + int irq = port->intx_irq; if (!port->base) continue; @@ -1458,7 +1617,17 @@ static int mvebu_pcie_remove(struct platform_device *pdev) mvebu_writel(port, cmd, PCIE_CMD_OFF); /* Mask all interrupt sources. */ - mvebu_writel(port, 0, PCIE_MASK_OFF); + mvebu_writel(port, ~PCIE_INT_ALL_MASK, PCIE_INT_UNMASK_OFF); + + /* Clear all interrupt causes. */ + mvebu_writel(port, ~PCIE_INT_ALL_MASK, PCIE_INT_CAUSE_OFF); + + /* Remove IRQ domains. */ + if (port->intx_irq_domain) + irq_domain_remove(port->intx_irq_domain); + + if (irq > 0) + irq_set_chained_handler_and_data(irq, NULL, NULL); /* Free config space for emulated root bridge. */ pci_bridge_emul_cleanup(&port->bridge); -- 2.20.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 83EAFC433F5 for ; Fri, 7 Jan 2022 11:52:29 +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=KqmU8/BYgRg+iV5HcaOWwCWsPsGSGH5MnC/0U8x/Nx8=; b=r/B4YBNZ1q4d6R vRxRLar/Yr18p8qQlvgSaH6k90Vel32fO3hNeQXUQbKSDoC8sTcPqxZ6h12FnJ2DCrqsRWT4WLpAi vYdD47PteovczD+FxBeqEJGvMeCrKoeF+6cfbtwPCoM7JPYiZD5bU5StiAJ3Os5OEVsdoJHeAArlV yC/bpQcs4XJQYefvirnoinn1b2kBCg1AQA84deyBwABc3bWDbdmIpEzyrMagswzG2xQB3FvtoKv7A /ikQZSX5heVhj5iSZatQ1joEaucBuqv4lyLIRs9VZr5sL3hml9Ui6ML0y9fECeCsWhpl03SfzJnGE SYy8Q5Rym1a/n033GF1w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n5nlt-003hJp-TG; Fri, 07 Jan 2022 11:51:02 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1n5nlp-003hI9-Bi for linux-arm-kernel@lists.infradead.org; Fri, 07 Jan 2022 11:50:59 +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 dfw.source.kernel.org (Postfix) with ESMTPS id D8B4A60A53; Fri, 7 Jan 2022 11:50:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id F2115C36AE5; Fri, 7 Jan 2022 11:50:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1641556256; bh=tlSofhkr2jzdAYuwsla28s0MjyMWwGKIHX80B/VQRrM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=XNWfyA+aLJEC6aM3jDiOTBffhJ0zbs0inYpMsvPonLfCnM947+z6kMNhixvYvA8t3 qLQxL9wWU7KuuR2m+D7Y3sZqME7ExvyezzgQ92Trad+bXjQLg55wIS5qMascwn+W51 tO2/fTSx2tgL9ILo4IOZmK6rEIdHTDQYpPTWSrK/OUvVCLGjVyPlUTphT5gTRGuRdN zWZklTXgjpqCy1KKz5DUW6kPrhJ+SHEJnyOTMOJI98haCuBwTbSMqPzHvthsY5LDuu 8yZW/ykqTzcx0wmM9vbCumnpYaENQRNh8+YHAgMMCxYTSFUswl76gJU5Et4yhNUUkl WKXg/8+TUyaMw== Received: by pali.im (Postfix) id 44ABDB22; Fri, 7 Jan 2022 12:50:53 +0100 (CET) Date: Fri, 7 Jan 2022 12:50:53 +0100 From: Pali =?utf-8?B?Um9ow6Fy?= To: Marc Zyngier Cc: Marek =?utf-8?B?QmVow7pu?= , Lorenzo Pieralisi , Bjorn Helgaas , Rob Herring , Thomas Petazzoni , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Russell King , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 10/11] PCI: mvebu: Implement support for legacy INTx interrupts Message-ID: <20220107115053.k5d2uv7yrftrpcez@pali> References: <20220105150239.9628-1-pali@kernel.org> <20220105150239.9628-11-pali@kernel.org> <87bl0ovq7f.wl-maz@kernel.org> <20220106154447.aie6taiuvav5wu6y@pali> <878rvsvoyo.wl-maz@kernel.org> <20220106162047.vqykmygs75eimfgy@pali> <877dbcvngf.wl-maz@kernel.org> <20220106182044.3ff0828c@thinkpad> <874k6gvkhz.wl-maz@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <874k6gvkhz.wl-maz@kernel.org> User-Agent: NeoMutt/20180716 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220107_035057_552323_0B2FA134 X-CRM114-Status: GOOD ( 34.66 ) 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 T24gVGh1cnNkYXkgMDYgSmFudWFyeSAyMDIyIDE3OjMxOjM2IE1hcmMgWnluZ2llciB3cm90ZToK PiBPbiBUaHUsIDA2IEphbiAyMDIyIDE3OjIwOjQ0ICswMDAwLAo+IE1hcmVrIEJlaMO6biA8a2Fi ZWxAa2VybmVsLm9yZz4gd3JvdGU6Cj4gPiAKPiA+IE9uIFRodSwgMDYgSmFuIDIwMjIgMTY6Mjc6 NDQgKzAwMDAKPiA+IE1hcmMgWnluZ2llciA8bWF6QGtlcm5lbC5vcmc+IHdyb3RlOgo+ID4gPiBZ b3UgYXJlIGNvbXBsZXRlbHkgbWlzc2luZyBteSBwb2ludC4gSSdtIHRhbGtpbmcgYWJvdXQgZGF0 YQo+ID4gPiBzdHJ1Y3R1cmVzLCB5b3UncmUgdGFsa2luZyBhYm91dCBpbnRlcnJ1cHRzLiBZb3Ug aGF2ZSB0aGlzOgo+ID4gPiAKPiA+ID4gc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCB7Cj4gPiA+ICAg ICAgICAvLyBUb25zIG9mIHN0dWZmCj4gPiA+ICAgICAgICBzdHJ1Y3QgaXJxX2NoaXAgaW50eF9j aGlwOwo+ID4gPiB9Owo+ID4gPiAKPiA+ID4gV2hhdCBJIHdhbnQgeW91IHRvIGRvIGlzOgo+ID4g PiAKPiA+ID4gc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCB7Cj4gPiA+ICAgICAgICAvLyBUb25zIG9m IHN0dWZmCj4gPiA+IH07Cj4gPiA+IAo+ID4gPiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGludHhf Y2hpcCA9IHsKPiA+ID4gCS5uYW1lCQk9ICJJTlR4IiwKPiA+ID4gCS5pcnFfbWFzawk9IG12ZWJ1 X3BjaWVfaW50eF9pcnFfbWFzaywKPiA+ID4gCS5pcnFfdW5tYXNrCT0gbXZlYnVfcGNpZV9pbnR4 X2lycV91bm1hc2s7Cj4gPiA+IH07Cj4gPiA+IAo+ID4gPiBUaGF0J3MgaXQuIE5vIG1vcmUsIG5v IGxlc3MuCj4gPiA+IAo+ID4gPiAJTS4KPiA+ID4gCj4gPiAKPiA+IEhtbSwgYnV0IHN0cnVjdCBp cnFfY2hpcCBjb250YWlucyBhIGR5bmFtaWMgbWVtYmVyLAo+ID4gICBzdHJ1Y3QgZGV2aWNlICpw YXJlbnRfZGV2aWNlOwo+ID4gSXNuJ3QgdGhhdCB1c2VkPyBPciBhcmUgeW91IHBsYW5uaW5nIHRv IGtpbGwgaXQ/Cj4gCj4gSW5kZWVkLCBhbmQgSSBhbSBkZWZpbml0ZWx5IHBsYW5uaW5nIHRvIGtp bGwgaXQuIFRoaXMgaXMgdGhlIHdyb25nCj4gcGxhY2UgZm9yIHRoaXMgc3R1ZmYsIGFuZCBJIHdh bnQgaXQgZ29uZS4gVGhlcmUgYXJlIHRoYW5rZnVsbHkgdmVyeQo+IGZldyB1c2VycyBvZiB0aGlz IG1pc2ZlYXR1cmUuCgpPaywgc28gd2hhdCBhYm91dCB0aGlzIGNoYW5nZT8KCmRpZmYgLS1naXQg YS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1tdmVidS5jIGIvZHJpdmVycy9wY2kvY29udHJv bGxlci9wY2ktbXZlYnUuYwppbmRleCAxZTkwYWI4ODgwNzUuLjVjODE2MzM4YTU2OSAxMDA2NDQK LS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktbXZlYnUuYworKysgYi9kcml2ZXJzL3Bj aS9jb250cm9sbGVyL3BjaS1tdmVidS5jCkBAIC01NCw5ICs1NCwxMCBAQAogCSBQQ0lFX0NPTkZf QUREUl9FTikKICNkZWZpbmUgUENJRV9DT05GX0RBVEFfT0ZGCTB4MThmYwogI2RlZmluZSBQQ0lF X0lOVF9DQVVTRV9PRkYJMHgxOTAwCisjZGVmaW5lIFBDSUVfSU5UX1VOTUFTS19PRkYJMHgxOTEw CisjZGVmaW5lICBQQ0lFX0lOVF9JTlRYKGkpCQlCSVQoMjQraSkKICNkZWZpbmUgIFBDSUVfSU5U X1BNX1BNRQkJQklUKDI4KQotI2RlZmluZSBQQ0lFX01BU0tfT0ZGCQkweDE5MTAKLSNkZWZpbmUg IFBDSUVfTUFTS19FTkFCTEVfSU5UUyAgICAgICAgICAweDBmMDAwMDAwCisjZGVmaW5lICBQQ0lF X0lOVF9BTExfTUFTSwkJR0VOTUFTSygzMSwgMCkKICNkZWZpbmUgUENJRV9DVFJMX09GRgkJMHgx YTAwCiAjZGVmaW5lICBQQ0lFX0NUUkxfWDFfTU9ERQkJMHgwMDAxCiAjZGVmaW5lICBQQ0lFX0NU UkxfUkNfTU9ERQkJQklUKDEpCkBAIC0xMTAsNiArMTExLDkgQEAgc3RydWN0IG12ZWJ1X3BjaWVf cG9ydCB7CiAJc3RydWN0IG12ZWJ1X3BjaWVfd2luZG93IGlvd2luOwogCXUzMiBzYXZlZF9wY2ll X3N0YXQ7CiAJc3RydWN0IHJlc291cmNlIHJlZ3M7CisJc3RydWN0IGlycV9kb21haW4gKmludHhf aXJxX2RvbWFpbjsKKwlyYXdfc3BpbmxvY2tfdCBpcnFfbG9jazsKKwlpbnQgaW50eF9pcnE7CiB9 OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXZlYnVfd3JpdGVsKHN0cnVjdCBtdmVidV9wY2llX3Bv cnQgKnBvcnQsIHUzMiB2YWwsIHUzMiByZWcpCkBAIC0yMzUsNyArMjM5LDcgQEAgc3RhdGljIHZv aWQgbXZlYnVfcGNpZV9zZXR1cF93aW5zKHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQpCiAK IHN0YXRpYyB2b2lkIG12ZWJ1X3BjaWVfc2V0dXBfaHcoc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAq cG9ydCkKIHsKLQl1MzIgY3RybCwgbG5rY2FwLCBjbWQsIGRldl9yZXYsIG1hc2s7CisJdTMyIGN0 cmwsIGxua2NhcCwgY21kLCBkZXZfcmV2LCB1bm1hc2s7CiAKIAkvKiBTZXR1cCBQQ0llIGNvbnRy b2xsZXIgdG8gUm9vdCBDb21wbGV4IG1vZGUuICovCiAJY3RybCA9IG12ZWJ1X3JlYWRsKHBvcnQs IFBDSUVfQ1RSTF9PRkYpOwpAQCAtMjg4LDEwICsyOTIsMzAgQEAgc3RhdGljIHZvaWQgbXZlYnVf cGNpZV9zZXR1cF9odyhzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0KQogCS8qIFBvaW50IFBD SWUgdW5pdCBNQlVTIGRlY29kZSB3aW5kb3dzIHRvIERSQU0gc3BhY2UuICovCiAJbXZlYnVfcGNp ZV9zZXR1cF93aW5zKHBvcnQpOwogCi0JLyogRW5hYmxlIGludGVycnVwdCBsaW5lcyBBLUQuICov Ci0JbWFzayA9IG12ZWJ1X3JlYWRsKHBvcnQsIFBDSUVfTUFTS19PRkYpOwotCW1hc2sgfD0gUENJ RV9NQVNLX0VOQUJMRV9JTlRTOwotCW12ZWJ1X3dyaXRlbChwb3J0LCBtYXNrLCBQQ0lFX01BU0tf T0ZGKTsKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHQgc291cmNlcy4gKi8KKwltdmVidV93cml0ZWwo cG9ydCwgflBDSUVfSU5UX0FMTF9NQVNLLCBQQ0lFX0lOVF9VTk1BU0tfT0ZGKTsKKworCS8qIENs ZWFyIGFsbCBpbnRlcnJ1cHQgY2F1c2VzLiAqLworCW12ZWJ1X3dyaXRlbChwb3J0LCB+UENJRV9J TlRfQUxMX01BU0ssIFBDSUVfSU5UX0NBVVNFX09GRik7CisKKwlpZiAocG9ydC0+aW50eF9pcnEg PD0gMCkgeworCQkvKgorCQkgKiBXaGVuIG5laXRoZXIgInN1bW1hcnkiIGludGVycnVwdCwgbm9y ICJpbnR4IiBpbnRlcnJ1cHQgd2FzCisJCSAqIHNwZWNpZmllZCBpbiBEVCB0aGVuIHVubWFzayBh bGwgbGVnYWN5IElOVHggaW50ZXJydXB0cyBhcyBpbgorCQkgKiB0aGlzIGNhc2UgZHJpdmVyIGRv ZXMgbm90IHByb3ZpZGUgYSB3YXkgZm9yIG1hc2tpbmcgYW5kCisJCSAqIHVubWFza2luZyBvZiBp bmRpdmlkdWFsIGxlZ2FjeSBJTlR4IGludGVycnVwdHMuIEluIHRoaXMgY2FzZQorCQkgKiBhbGwg aW50ZXJydXB0cywgaW5jbHVkaW5nIGxlZ2FjeSBJTlR4IGFyZSByZXBvcnRlZCB2aWEgb25lCisJ CSAqIHNoYXJlZCBHSUMgc291cmNlIGFuZCB0aGVyZWZvcmUga2VybmVsIGNhbm5vdCBkaXN0aW5n dWlzaAorCQkgKiB3aGljaCBpbmRpdmlkdWFsIGxlZ2FjeSBJTlR4IHdhcyB0cmlnZ2VyZWQuIFRo ZXNlIGludGVycnVwdHMKKwkJICogYXJlIHNoYXJlZCwgc28gaXQgc2hvdWxkIG5vdCBjYXVzZSBh bnkgaXNzdWUuIEp1c3QKKwkJICogcGVyZm9ybWFuY2UgcGVuYWx0eSBhcyBldmVyeSBQQ0llIGlu dGVycnVwdCBoYW5kbGVyIG5lZWRzIHRvCisJCSAqIGJlIGNhbGxlZCB3aGVuIHNvbWUgaW50ZXJy dXB0IGlzIHRyaWdnZXJlZC4KKwkJICovCisJCXVubWFzayA9IG12ZWJ1X3JlYWRsKHBvcnQsIFBD SUVfSU5UX1VOTUFTS19PRkYpOworCQl1bm1hc2sgfD0gUENJRV9JTlRfSU5UWCgwKSB8IFBDSUVf SU5UX0lOVFgoMSkgfAorCQkJICBQQ0lFX0lOVF9JTlRYKDIpIHwgUENJRV9JTlRfSU5UWCgzKTsK KwkJbXZlYnVfd3JpdGVsKHBvcnQsIHVubWFzaywgUENJRV9JTlRfVU5NQVNLX09GRik7CisJfQog fQogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqbXZlYnVfcGNpZV9maW5kX3BvcnQo c3RydWN0IG12ZWJ1X3BjaWUgKnBjaWUsCkBAIC05MjQsNiArOTQ4LDEwOCBAQCBzdGF0aWMgc3Ry dWN0IHBjaV9vcHMgbXZlYnVfcGNpZV9vcHMgPSB7CiAJLndyaXRlID0gbXZlYnVfcGNpZV93cl9j b25mLAogfTsKIAorc3RhdGljIHZvaWQgbXZlYnVfcGNpZV9pbnR4X2lycV9tYXNrKHN0cnVjdCBp cnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0ID0gZC0+ZG9tYWlu LT5ob3N0X2RhdGE7CisJaXJxX2h3X251bWJlcl90IGh3aXJxID0gaXJxZF90b19od2lycShkKTsK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB1bm1hc2s7CisKKwlyYXdfc3Bpbl9sb2NrX2ly cXNhdmUoJnBvcnQtPmlycV9sb2NrLCBmbGFncyk7CisJdW5tYXNrID0gbXZlYnVfcmVhZGwocG9y dCwgUENJRV9JTlRfVU5NQVNLX09GRik7CisJdW5tYXNrICY9IH5QQ0lFX0lOVF9JTlRYKGh3aXJx KTsKKwltdmVidV93cml0ZWwocG9ydCwgdW5tYXNrLCBQQ0lFX0lOVF9VTk1BU0tfT0ZGKTsKKwly YXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKwor c3RhdGljIHZvaWQgbXZlYnVfcGNpZV9pbnR4X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpk KQoreworCXN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQgPSBkLT5kb21haW4tPmhvc3RfZGF0 YTsKKwlpcnFfaHdfbnVtYmVyX3QgaHdpcnEgPSBpcnFkX3RvX2h3aXJxKGQpOworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisJdTMyIHVubWFzazsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG9y dC0+aXJxX2xvY2ssIGZsYWdzKTsKKwl1bm1hc2sgPSBtdmVidV9yZWFkbChwb3J0LCBQQ0lFX0lO VF9VTk1BU0tfT0ZGKTsKKwl1bm1hc2sgfD0gUENJRV9JTlRfSU5UWChod2lycSk7CisJbXZlYnVf d3JpdGVsKHBvcnQsIHVubWFzaywgUENJRV9JTlRfVU5NQVNLX09GRik7CisJcmF3X3NwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnBvcnQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1 Y3QgaXJxX2NoaXAgaW50eF9pcnFfY2hpcCA9IHsKKwkubmFtZSA9ICJtdmVidS1JTlR4IiwKKwku aXJxX21hc2sgPSBtdmVidV9wY2llX2ludHhfaXJxX21hc2ssCisJLmlycV91bm1hc2sgPSBtdmVi dV9wY2llX2ludHhfaXJxX3VubWFzaywKK307CisKK3N0YXRpYyBpbnQgbXZlYnVfcGNpZV9pbnR4 X2lycV9tYXAoc3RydWN0IGlycV9kb21haW4gKmgsCisJCQkJICAgdW5zaWduZWQgaW50IHZpcnEs IGlycV9od19udW1iZXJfdCBod2lycSkKK3sKKwlzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0 ID0gaC0+aG9zdF9kYXRhOworCisJaXJxX3NldF9zdGF0dXNfZmxhZ3ModmlycSwgSVJRX0xFVkVM KTsKKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmludHhfaXJxX2NoaXAsIGhhbmRs ZV9sZXZlbF9pcnEpOworCWlycV9zZXRfY2hpcF9kYXRhKHZpcnEsIHBvcnQpOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgbXZlYnVfcGNpZV9p bnR4X2lycV9kb21haW5fb3BzID0geworCS5tYXAgPSBtdmVidV9wY2llX2ludHhfaXJxX21hcCwK KwkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGwsCit9OworCitzdGF0aWMgaW50IG12 ZWJ1X3BjaWVfaW5pdF9pcnFfZG9tYWluKHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQpCit7 CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBvcnQtPnBjaWUtPnBkZXYtPmRldjsKKwlzdHJ1Y3Qg ZGV2aWNlX25vZGUgKnBjaWVfaW50Y19ub2RlOworCisJcmF3X3NwaW5fbG9ja19pbml0KCZwb3J0 LT5pcnFfbG9jayk7CisKKwlwY2llX2ludGNfbm9kZSA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQt PmRuLCBOVUxMKTsKKwlpZiAoIXBjaWVfaW50Y19ub2RlKSB7CisJCWRldl9lcnIoZGV2LCAiTm8g UENJZSBJbnRjIG5vZGUgZm91bmQgZm9yICVzXG4iLCBwb3J0LT5uYW1lKTsKKwkJcmV0dXJuIC1F Tk9ERVY7CisJfQorCisJcG9ydC0+aW50eF9pcnFfZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGlu ZWFyKHBjaWVfaW50Y19ub2RlLCBQQ0lfTlVNX0lOVFgsCisJCQkJCQkgICAgICAmbXZlYnVfcGNp ZV9pbnR4X2lycV9kb21haW5fb3BzLAorCQkJCQkJICAgICAgcG9ydCk7CisJb2Zfbm9kZV9wdXQo cGNpZV9pbnRjX25vZGUpOworCWlmICghcG9ydC0+aW50eF9pcnFfZG9tYWluKSB7CisJCWRldl9l cnIoZGV2LCAiRmFpbGVkIHRvIGdldCBJTlR4IElSUSBkb21haW4gZm9yICVzXG4iLCBwb3J0LT5u YW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2 b2lkIG12ZWJ1X3BjaWVfaXJxX2hhbmRsZXIoc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0 cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRl c2MpOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOwor CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwb3J0LT5wY2llLT5wZGV2LT5kZXY7CisJdTMyIGNhdXNl LCB1bm1hc2ssIHN0YXR1czsKKwlpbnQgaTsKKworCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRl c2MpOworCisJY2F1c2UgPSBtdmVidV9yZWFkbChwb3J0LCBQQ0lFX0lOVF9DQVVTRV9PRkYpOwor CXVubWFzayA9IG12ZWJ1X3JlYWRsKHBvcnQsIFBDSUVfSU5UX1VOTUFTS19PRkYpOworCXN0YXR1 cyA9IGNhdXNlICYgdW5tYXNrOworCisJLyogUHJvY2VzcyBsZWdhY3kgSU5UeCBpbnRlcnJ1cHRz ICovCisJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fSU5UWDsgaSsrKSB7CisJCWlmICghKHN0YXR1 cyAmIFBDSUVfSU5UX0lOVFgoaSkpKQorCQkJY29udGludWU7CisKKwkJaWYgKGdlbmVyaWNfaGFu ZGxlX2RvbWFpbl9pcnEocG9ydC0+aW50eF9pcnFfZG9tYWluLCBpKSA9PSAtRUlOVkFMKQorCQkJ ZGV2X2Vycl9yYXRlbGltaXRlZChkZXYsICJ1bmV4cGVjdGVkIElOVCVjIElSUVxuIiwgKGNoYXIp aSsnQScpOworCX0KKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKIHN0YXRp YyBpbnQgbXZlYnVfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNs b3QsIHU4IHBpbikKIHsKIAkvKiBJbnRlcnJ1cHQgc3VwcG9ydCBvbiBtdmVidSBlbXVsYXRlZCBi cmlkZ2VzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KQEAgLTExMjEsNiArMTI0NywyMSBAQCBz dGF0aWMgaW50IG12ZWJ1X3BjaWVfcGFyc2VfcG9ydChzdHJ1Y3QgbXZlYnVfcGNpZSAqcGNpZSwK IAkJcG9ydC0+aW9fYXR0ciA9IC0xOwogCX0KIAorCS8qCisJICogT2xkIERUIGJpbmRpbmdzIGRv IG5vdCBjb250YWluICJpbnR4IiBpbnRlcnJ1cHQKKwkgKiBzbyBkbyBub3QgZmFpbCBwcm9iaW5n IGRyaXZlciB3aGVuIGludGVycnVwdCBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlwb3J0LT5pbnR4 X2lycSA9IG9mX2lycV9nZXRfYnluYW1lKGNoaWxkLCAiaW50eCIpOworCWlmIChwb3J0LT5pbnR4 X2lycSA9PSAtRVBST0JFX0RFRkVSKSB7CisJCXJldCA9IHBvcnQtPmludHhfaXJxOworCQlnb3Rv IGVycjsKKwl9CisJaWYgKHBvcnQtPmludHhfaXJxIDw9IDApIHsKKwkJZGV2X3dhcm4oZGV2LCAi JXM6IGxlZ2FjeSBJTlR4IGludGVycnVwdHMgY2Fubm90IGJlIG1hc2tlZCBpbmRpdmlkdWFsbHks ICIKKwkJCSAgICAgICIlcE9GIGRvZXMgbm90IGNvbnRhaW4gaW50eCBpbnRlcnJ1cHRcbiIsCisJ CQkgcG9ydC0+bmFtZSwgY2hpbGQpOworCX0KKwogCXJlc2V0X2dwaW8gPSBvZl9nZXRfbmFtZWRf Z3Bpb19mbGFncyhjaGlsZCwgInJlc2V0LWdwaW9zIiwgMCwgJmZsYWdzKTsKIAlpZiAocmVzZXRf Z3BpbyA9PSAtRVBST0JFX0RFRkVSKSB7CiAJCXJldCA9IHJlc2V0X2dwaW87CkBAIC0xMzE3LDYg KzE0NTgsNyBAQCBzdGF0aWMgaW50IG12ZWJ1X3BjaWVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKIAogCWZvciAoaSA9IDA7IGkgPCBwY2llLT5ucG9ydHM7IGkrKykgewogCQlz dHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0ID0gJnBjaWUtPnBvcnRzW2ldOworCQlpbnQgaXJx ID0gcG9ydC0+aW50eF9pcnE7CiAKIAkJY2hpbGQgPSBwb3J0LT5kbjsKIAkJaWYgKCFjaGlsZCkK QEAgLTEzNDQsNiArMTQ4NiwyMiBAQCBzdGF0aWMgaW50IG12ZWJ1X3BjaWVfcHJvYmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJaWYgKGlycSA+ IDApIHsKKwkJCXJldCA9IG12ZWJ1X3BjaWVfaW5pdF9pcnFfZG9tYWluKHBvcnQpOworCQkJaWYg KHJldCkgeworCQkJCWRldl9lcnIoZGV2LCAiJXM6IGNhbm5vdCBpbml0IGlycSBkb21haW5cbiIs CisJCQkJCXBvcnQtPm5hbWUpOworCQkJCXBjaV9icmlkZ2VfZW11bF9jbGVhbnVwKCZwb3J0LT5i cmlkZ2UpOworCQkJCWRldm1faW91bm1hcChkZXYsIHBvcnQtPmJhc2UpOworCQkJCXBvcnQtPmJh c2UgPSBOVUxMOworCQkJCW12ZWJ1X3BjaWVfcG93ZXJkb3duKHBvcnQpOworCQkJCWNvbnRpbnVl OworCQkJfQorCQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXJfYW5kX2RhdGEoaXJxLAorCQkJCQkJ CSBtdmVidV9wY2llX2lycV9oYW5kbGVyLAorCQkJCQkJCSBwb3J0KTsKKwkJfQorCiAJCS8qCiAJ CSAqIFBDSWUgdG9wb2xvZ3kgZXhwb3J0ZWQgYnkgbXZlYnUgaHcgaXMgcXVpdGUgY29tcGxpY2F0 ZWQuIEluCiAJCSAqIHJlYWxpdHkgaGFzIHNvbWV0aGluZyBsaWtlIE4gZnVsbHkgaW5kZXBlbmRl bnQgaG9zdCBicmlkZ2VzCkBAIC0xNDQ4LDYgKzE2MDYsNyBAQCBzdGF0aWMgaW50IG12ZWJ1X3Bj aWVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAKIAlmb3IgKGkgPSAwOyBp IDwgcGNpZS0+bnBvcnRzOyBpKyspIHsKIAkJc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCA9 ICZwY2llLT5wb3J0c1tpXTsKKwkJaW50IGlycSA9IHBvcnQtPmludHhfaXJxOwogCiAJCWlmICgh cG9ydC0+YmFzZSkKIAkJCWNvbnRpbnVlOwpAQCAtMTQ1OCw3ICsxNjE3LDE3IEBAIHN0YXRpYyBp bnQgbXZlYnVfcGNpZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAkJbXZl YnVfd3JpdGVsKHBvcnQsIGNtZCwgUENJRV9DTURfT0ZGKTsKIAogCQkvKiBNYXNrIGFsbCBpbnRl cnJ1cHQgc291cmNlcy4gKi8KLQkJbXZlYnVfd3JpdGVsKHBvcnQsIDAsIFBDSUVfTUFTS19PRkYp OworCQltdmVidV93cml0ZWwocG9ydCwgflBDSUVfSU5UX0FMTF9NQVNLLCBQQ0lFX0lOVF9VTk1B U0tfT0ZGKTsKKworCQkvKiBDbGVhciBhbGwgaW50ZXJydXB0IGNhdXNlcy4gKi8KKwkJbXZlYnVf d3JpdGVsKHBvcnQsIH5QQ0lFX0lOVF9BTExfTUFTSywgUENJRV9JTlRfQ0FVU0VfT0ZGKTsKKwor CQkvKiBSZW1vdmUgSVJRIGRvbWFpbnMuICovCisJCWlmIChwb3J0LT5pbnR4X2lycV9kb21haW4p CisJCQlpcnFfZG9tYWluX3JlbW92ZShwb3J0LT5pbnR4X2lycV9kb21haW4pOworCisJCWlmIChp cnEgPiAwKQorCQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXJfYW5kX2RhdGEoaXJxLCBOVUxMLCBO VUxMKTsKIAogCQkvKiBGcmVlIGNvbmZpZyBzcGFjZSBmb3IgZW11bGF0ZWQgcm9vdCBicmlkZ2Uu ICovCiAJCXBjaV9icmlkZ2VfZW11bF9jbGVhbnVwKCZwb3J0LT5icmlkZ2UpOwotLSAKMi4yMC4x CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgt YXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQu b3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJt LWtlcm5lbAo=