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 D941FC433EF for ; Fri, 11 Feb 2022 17:52:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352358AbiBKRwK (ORCPT ); Fri, 11 Feb 2022 12:52:10 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:43516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241935AbiBKRwI (ORCPT ); Fri, 11 Feb 2022 12:52:08 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D5A95CD5; Fri, 11 Feb 2022 09:52:06 -0800 (PST) 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 605F261B32; Fri, 11 Feb 2022 17:52:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 76A89C340E9; Fri, 11 Feb 2022 17:52:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1644601925; bh=MDjNpMVR2AwWur2zSVObJK4AXWlCJOvrM40G50Ed4x8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=TUR3RYoCgcketT/M6l+CFc4V4O0NTQjSUois1U11uStfRLAh8/aCEq4FUho29Ya8A exIusdg2YrIooVv55vf6CVGi2UStQzA3vMhwd73TDHXRNBz9dWe71uDpcYgYrYXu44 DVQVOnDCvHyAr9/ZxqL2Rfs83YAAUXVuSiyfDes6YsUZAqlV0BJt3TLLhmzkViVmOg GSo+qFldq7imKFJCMaEg4n8PPyeg/yDBLFXPjr1ESaqrRtRQCPsWKs1WixxlC+TlIu d1OaBwYoaprBm3wsOyRw4AXQAZy/b2KjzVen9GhaMeaZDwyCGyljXLQGb1zHg/LEU3 5YJtQXXonR6Gg== Received: by pali.im (Postfix) id 9D6C313A8; Fri, 11 Feb 2022 18:52:02 +0100 (CET) Date: Fri, 11 Feb 2022 18:52:02 +0100 From: Pali =?utf-8?B?Um9ow6Fy?= To: Lorenzo Pieralisi Cc: robh+dt@kernel.org, Bjorn Helgaas , Thomas Petazzoni , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Marek =?utf-8?B?QmVow7pu?= , Russell King , Marc Zyngier , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v2 10/11] PCI: mvebu: Implement support for legacy INTx interrupts Message-ID: <20220211175202.gku5pkwn5wmjo5al@pali> References: <20220105150239.9628-1-pali@kernel.org> <20220112151814.24361-1-pali@kernel.org> <20220112151814.24361-11-pali@kernel.org> <20220211171917.GA740@lpieralisi> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220211171917.GA740@lpieralisi> User-Agent: NeoMutt/20180716 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Friday 11 February 2022 17:19:17 Lorenzo Pieralisi wrote: > On Wed, Jan 12, 2022 at 04:18:13PM +0100, Pali Rohár wrote: > > This adds support for legacy INTx interrupts received from other PCIe > > devices and which are reported by a new INTx irq chip. > > > > With this change, kernel can distinguish between INTA, INTB, INTC and INTD > > interrupts. > > > > Note that for this support, device tree files has to be properly adjusted > > to provide "interrupts" or "interrupts-extended" property with intx > > interrupt source, "interrupt-names" property with "intx" string and also > > 'interrupt-controller' subnode must be defined. > > > > If device tree files do not provide these nodes then driver would work as > > before. > > Nit: this information is not useful. DT rules are written in DT > bindings, not in kernel commit logs. All I am saying is that firmware > developers should not have to read this log to write firmware. It was not intended for firmware developers, but for reviewers of this patch to understand, what is happening in code and that with old DT files this patch does not change driver behavior (= work as before). > > Signed-off-by: Pali Rohár > > --- > > drivers/pci/controller/pci-mvebu.c | 185 +++++++++++++++++++++++++++-- > > 1 file changed, 177 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/pci/controller/pci-mvebu.c b/drivers/pci/controller/pci-mvebu.c > > index 1e90ab888075..dbb6ecb4cb70 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 > > Nit: I understand it is tempting but here you are redefining or better > giving a proper label to a register. Separate patch please. Ok! > > +#define PCIE_INT_INTX(i) BIT(24+i) > > #define PCIE_INT_PM_PME BIT(28) > > -#define PCIE_MASK_OFF 0x1910 > > See above. > > > -#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. > > + */ > > This comment applies to current mainline right (ie it describes how > current mainline handles INTx) ? IMO you should split it out in a > separate patch. This above comment describe what happens in if-branch when intx_irq is not set (as written in comment "when intx interrupt was not specified in DT"). You are right that this is also the behavior in the current mainline. I'm not sure if this comment can be split out as support for "intx" interrupt is in this patch. > I understand it is hard but a patch is a logical _change_, this > comment is a change per se, it is a clarification on current > behaviour. Ok, I could try to split this comment into two patches, but part about if-branch comment needs to stay in "this" patch. > > + 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); > > Here you end up with a new warning on existing firmware. Is it > legitimate ? I would remove the dev_warn(). I added this warning in v2 because Marc wanted it. Should I (again) remove it in v3? > Rob certainly has more insightful advice on this. > > Thanks, > Lorenzo > > > + } > > + > > 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); > > + > > + if (irq > 0) > > + irq_set_chained_handler_and_data(irq, NULL, NULL); > > + > > + /* Remove IRQ domains. */ > > + if (port->intx_irq_domain) > > + irq_domain_remove(port->intx_irq_domain); > > > > /* 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 1B25BC433F5 for ; Fri, 11 Feb 2022 17:53:25 +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=CWvOt62y/Vbv9k9zWIO7wBZFfKROFqG0zjS0e5RhJKg=; b=tbYzJIZXf5MeDf n5uDULHOGO36qGzN5+skCPmuqPbg4Pa+zjXvWP6FG6kRoDV8Gq0xI7L4uqTRV1glD23bXiupFESX9 vHfK8qRfyPosnwtO3toKTLZ2hZwhRTWXKof4GyTlkFn+4y+4oo8aOsvdVipa1vpRF1/lBiR53gCW9 H6+tObj1FoeV/wlikiq6h989mWtFoXtx72QPSiYLvpkhL9ANlA+q2M8Siw6ZRP6SsbtovQLyGdx1R iZyZNIhKUORG5zwg6IMVFcxQyBHJlfaaRWt0P9lfF8DcL9uYC+0YMfpf6chw9NeNwGLETn4sYhasw CkLGTg+abkbXv3vW8r6w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nIa5g-008HLt-Lu; Fri, 11 Feb 2022 17:52:16 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nIa5X-008HJd-PM for linux-arm-kernel@lists.infradead.org; Fri, 11 Feb 2022 17:52:14 +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 6037561ACA; Fri, 11 Feb 2022 17:52:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 76A89C340E9; Fri, 11 Feb 2022 17:52:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1644601925; bh=MDjNpMVR2AwWur2zSVObJK4AXWlCJOvrM40G50Ed4x8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=TUR3RYoCgcketT/M6l+CFc4V4O0NTQjSUois1U11uStfRLAh8/aCEq4FUho29Ya8A exIusdg2YrIooVv55vf6CVGi2UStQzA3vMhwd73TDHXRNBz9dWe71uDpcYgYrYXu44 DVQVOnDCvHyAr9/ZxqL2Rfs83YAAUXVuSiyfDes6YsUZAqlV0BJt3TLLhmzkViVmOg GSo+qFldq7imKFJCMaEg4n8PPyeg/yDBLFXPjr1ESaqrRtRQCPsWKs1WixxlC+TlIu d1OaBwYoaprBm3wsOyRw4AXQAZy/b2KjzVen9GhaMeaZDwyCGyljXLQGb1zHg/LEU3 5YJtQXXonR6Gg== Received: by pali.im (Postfix) id 9D6C313A8; Fri, 11 Feb 2022 18:52:02 +0100 (CET) Date: Fri, 11 Feb 2022 18:52:02 +0100 From: Pali =?utf-8?B?Um9ow6Fy?= To: Lorenzo Pieralisi Cc: robh+dt@kernel.org, Bjorn Helgaas , Thomas Petazzoni , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Marek =?utf-8?B?QmVow7pu?= , Russell King , Marc Zyngier , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v2 10/11] PCI: mvebu: Implement support for legacy INTx interrupts Message-ID: <20220211175202.gku5pkwn5wmjo5al@pali> References: <20220105150239.9628-1-pali@kernel.org> <20220112151814.24361-1-pali@kernel.org> <20220112151814.24361-11-pali@kernel.org> <20220211171917.GA740@lpieralisi> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220211171917.GA740@lpieralisi> User-Agent: NeoMutt/20180716 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220211_095207_937291_1A13B42F X-CRM114-Status: GOOD ( 56.38 ) 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 T24gRnJpZGF5IDExIEZlYnJ1YXJ5IDIwMjIgMTc6MTk6MTcgTG9yZW56byBQaWVyYWxpc2kgd3Jv dGU6Cj4gT24gV2VkLCBKYW4gMTIsIDIwMjIgYXQgMDQ6MTg6MTNQTSArMDEwMCwgUGFsaSBSb2jD oXIgd3JvdGU6Cj4gPiBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgbGVnYWN5IElOVHggaW50ZXJydXB0 cyByZWNlaXZlZCBmcm9tIG90aGVyIFBDSWUKPiA+IGRldmljZXMgYW5kIHdoaWNoIGFyZSByZXBv cnRlZCBieSBhIG5ldyBJTlR4IGlycSBjaGlwLgo+ID4gCj4gPiBXaXRoIHRoaXMgY2hhbmdlLCBr ZXJuZWwgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gSU5UQSwgSU5UQiwgSU5UQyBhbmQgSU5URAo+ ID4gaW50ZXJydXB0cy4KPiA+IAo+ID4gTm90ZSB0aGF0IGZvciB0aGlzIHN1cHBvcnQsIGRldmlj ZSB0cmVlIGZpbGVzIGhhcyB0byBiZSBwcm9wZXJseSBhZGp1c3RlZAo+ID4gdG8gcHJvdmlkZSAi aW50ZXJydXB0cyIgb3IgImludGVycnVwdHMtZXh0ZW5kZWQiIHByb3BlcnR5IHdpdGggaW50eAo+ ID4gaW50ZXJydXB0IHNvdXJjZSwgImludGVycnVwdC1uYW1lcyIgcHJvcGVydHkgd2l0aCAiaW50 eCIgc3RyaW5nIGFuZCBhbHNvCj4gPiAnaW50ZXJydXB0LWNvbnRyb2xsZXInIHN1Ym5vZGUgbXVz dCBiZSBkZWZpbmVkLgo+ID4gCj4gPiBJZiBkZXZpY2UgdHJlZSBmaWxlcyBkbyBub3QgcHJvdmlk ZSB0aGVzZSBub2RlcyB0aGVuIGRyaXZlciB3b3VsZCB3b3JrIGFzCj4gPiBiZWZvcmUuCj4gCj4g Tml0OiB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCB1c2VmdWwuIERUIHJ1bGVzIGFyZSB3cml0dGVu IGluIERUCj4gYmluZGluZ3MsIG5vdCBpbiBrZXJuZWwgY29tbWl0IGxvZ3MuIEFsbCBJIGFtIHNh eWluZyBpcyB0aGF0IGZpcm13YXJlCj4gZGV2ZWxvcGVycyBzaG91bGQgbm90IGhhdmUgdG8gcmVh ZCB0aGlzIGxvZyB0byB3cml0ZSBmaXJtd2FyZS4KCkl0IHdhcyBub3QgaW50ZW5kZWQgZm9yIGZp cm13YXJlIGRldmVsb3BlcnMsIGJ1dCBmb3IgcmV2aWV3ZXJzIG9mIHRoaXMKcGF0Y2ggdG8gdW5k ZXJzdGFuZCwgd2hhdCBpcyBoYXBwZW5pbmcgaW4gY29kZSBhbmQgdGhhdCB3aXRoIG9sZCBEVApm aWxlcyB0aGlzIHBhdGNoIGRvZXMgbm90IGNoYW5nZSBkcml2ZXIgYmVoYXZpb3IgKD0gd29yayBh cyBiZWZvcmUpLgoKPiA+IFNpZ25lZC1vZmYtYnk6IFBhbGkgUm9ow6FyIDxwYWxpQGtlcm5lbC5v cmc+Cj4gPiAtLS0KPiA+ICBkcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1tdmVidS5jIHwgMTg1 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKy0tCj4gPiAgMSBmaWxlIGNoYW5nZWQsIDE3NyBp bnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9wY2kvY29udHJvbGxlci9wY2ktbXZlYnUuYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNp LW12ZWJ1LmMKPiA+IGluZGV4IDFlOTBhYjg4ODA3NS4uZGJiNmVjYjRjYjcwIDEwMDY0NAo+ID4g LS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktbXZlYnUuYwo+ID4gKysrIGIvZHJpdmVy cy9wY2kvY29udHJvbGxlci9wY2ktbXZlYnUuYwo+ID4gQEAgLTU0LDkgKzU0LDEwIEBACj4gPiAg CSBQQ0lFX0NPTkZfQUREUl9FTikKPiA+ICAjZGVmaW5lIFBDSUVfQ09ORl9EQVRBX09GRgkweDE4 ZmMKPiA+ICAjZGVmaW5lIFBDSUVfSU5UX0NBVVNFX09GRgkweDE5MDAKPiA+ICsjZGVmaW5lIFBD SUVfSU5UX1VOTUFTS19PRkYJMHgxOTEwCj4gCj4gTml0OiBJIHVuZGVyc3RhbmQgaXQgaXMgdGVt cHRpbmcgYnV0IGhlcmUgeW91IGFyZSByZWRlZmluaW5nIG9yIGJldHRlcgo+IGdpdmluZyBhIHBy b3BlciBsYWJlbCB0byBhIHJlZ2lzdGVyLiBTZXBhcmF0ZSBwYXRjaCBwbGVhc2UuCgpPayEKCj4g PiArI2RlZmluZSAgUENJRV9JTlRfSU5UWChpKQkJQklUKDI0K2kpCj4gPiAgI2RlZmluZSAgUENJ RV9JTlRfUE1fUE1FCQlCSVQoMjgpCj4gPiAtI2RlZmluZSBQQ0lFX01BU0tfT0ZGCQkweDE5MTAK PiAKPiBTZWUgYWJvdmUuCj4gCj4gPiAtI2RlZmluZSAgUENJRV9NQVNLX0VOQUJMRV9JTlRTICAg ICAgICAgIDB4MGYwMDAwMDAKPiA+ICsjZGVmaW5lICBQQ0lFX0lOVF9BTExfTUFTSwkJR0VOTUFT SygzMSwgMCkKPiA+ICAjZGVmaW5lIFBDSUVfQ1RSTF9PRkYJCTB4MWEwMAo+ID4gICNkZWZpbmUg IFBDSUVfQ1RSTF9YMV9NT0RFCQkweDAwMDEKPiA+ICAjZGVmaW5lICBQQ0lFX0NUUkxfUkNfTU9E RQkJQklUKDEpCj4gPiBAQCAtMTEwLDYgKzExMSw5IEBAIHN0cnVjdCBtdmVidV9wY2llX3BvcnQg ewo+ID4gIAlzdHJ1Y3QgbXZlYnVfcGNpZV93aW5kb3cgaW93aW47Cj4gPiAgCXUzMiBzYXZlZF9w Y2llX3N0YXQ7Cj4gPiAgCXN0cnVjdCByZXNvdXJjZSByZWdzOwo+ID4gKwlzdHJ1Y3QgaXJxX2Rv bWFpbiAqaW50eF9pcnFfZG9tYWluOwo+ID4gKwlyYXdfc3BpbmxvY2tfdCBpcnFfbG9jazsKPiA+ ICsJaW50IGludHhfaXJxOwo+ID4gIH07Cj4gPiAgCj4gPiAgc3RhdGljIGlubGluZSB2b2lkIG12 ZWJ1X3dyaXRlbChzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0LCB1MzIgdmFsLCB1MzIgcmVn KQo+ID4gQEAgLTIzNSw3ICsyMzksNyBAQCBzdGF0aWMgdm9pZCBtdmVidV9wY2llX3NldHVwX3dp bnMoc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCkKPiA+ICAKPiA+ICBzdGF0aWMgdm9pZCBt dmVidV9wY2llX3NldHVwX2h3KHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQpCj4gPiAgewo+ ID4gLQl1MzIgY3RybCwgbG5rY2FwLCBjbWQsIGRldl9yZXYsIG1hc2s7Cj4gPiArCXUzMiBjdHJs LCBsbmtjYXAsIGNtZCwgZGV2X3JldiwgdW5tYXNrOwo+ID4gIAo+ID4gIAkvKiBTZXR1cCBQQ0ll IGNvbnRyb2xsZXIgdG8gUm9vdCBDb21wbGV4IG1vZGUuICovCj4gPiAgCWN0cmwgPSBtdmVidV9y ZWFkbChwb3J0LCBQQ0lFX0NUUkxfT0ZGKTsKPiA+IEBAIC0yODgsMTAgKzI5MiwzMCBAQCBzdGF0 aWMgdm9pZCBtdmVidV9wY2llX3NldHVwX2h3KHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQp Cj4gPiAgCS8qIFBvaW50IFBDSWUgdW5pdCBNQlVTIGRlY29kZSB3aW5kb3dzIHRvIERSQU0gc3Bh Y2UuICovCj4gPiAgCW12ZWJ1X3BjaWVfc2V0dXBfd2lucyhwb3J0KTsKPiA+ICAKPiA+IC0JLyog RW5hYmxlIGludGVycnVwdCBsaW5lcyBBLUQuICovCj4gPiAtCW1hc2sgPSBtdmVidV9yZWFkbChw b3J0LCBQQ0lFX01BU0tfT0ZGKTsKPiA+IC0JbWFzayB8PSBQQ0lFX01BU0tfRU5BQkxFX0lOVFM7 Cj4gPiAtCW12ZWJ1X3dyaXRlbChwb3J0LCBtYXNrLCBQQ0lFX01BU0tfT0ZGKTsKPiA+ICsJLyog TWFzayBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICovCj4gPiArCW12ZWJ1X3dyaXRlbChwb3J0LCB+ UENJRV9JTlRfQUxMX01BU0ssIFBDSUVfSU5UX1VOTUFTS19PRkYpOwo+ID4gKwo+ID4gKwkvKiBD bGVhciBhbGwgaW50ZXJydXB0IGNhdXNlcy4gKi8KPiA+ICsJbXZlYnVfd3JpdGVsKHBvcnQsIH5Q Q0lFX0lOVF9BTExfTUFTSywgUENJRV9JTlRfQ0FVU0VfT0ZGKTsKPiA+ICsKPiA+ICsJaWYgKHBv cnQtPmludHhfaXJxIDw9IDApIHsKPiA+ICsJCS8qCj4gPiArCQkgKiBXaGVuIG5laXRoZXIgInN1 bW1hcnkiIGludGVycnVwdCwgbm9yICJpbnR4IiBpbnRlcnJ1cHQgd2FzCj4gPiArCQkgKiBzcGVj aWZpZWQgaW4gRFQgdGhlbiB1bm1hc2sgYWxsIGxlZ2FjeSBJTlR4IGludGVycnVwdHMgYXMgaW4K PiA+ICsJCSAqIHRoaXMgY2FzZSBkcml2ZXIgZG9lcyBub3QgcHJvdmlkZSBhIHdheSBmb3IgbWFz a2luZyBhbmQKPiA+ICsJCSAqIHVubWFza2luZyBvZiBpbmRpdmlkdWFsIGxlZ2FjeSBJTlR4IGlu dGVycnVwdHMuIEluIHRoaXMgY2FzZQo+ID4gKwkJICogYWxsIGludGVycnVwdHMsIGluY2x1ZGlu ZyBsZWdhY3kgSU5UeCBhcmUgcmVwb3J0ZWQgdmlhIG9uZQo+ID4gKwkJICogc2hhcmVkIEdJQyBz b3VyY2UgYW5kIHRoZXJlZm9yZSBrZXJuZWwgY2Fubm90IGRpc3Rpbmd1aXNoCj4gPiArCQkgKiB3 aGljaCBpbmRpdmlkdWFsIGxlZ2FjeSBJTlR4IHdhcyB0cmlnZ2VyZWQuIFRoZXNlIGludGVycnVw dHMKPiA+ICsJCSAqIGFyZSBzaGFyZWQsIHNvIGl0IHNob3VsZCBub3QgY2F1c2UgYW55IGlzc3Vl LiBKdXN0Cj4gPiArCQkgKiBwZXJmb3JtYW5jZSBwZW5hbHR5IGFzIGV2ZXJ5IFBDSWUgaW50ZXJy dXB0IGhhbmRsZXIgbmVlZHMgdG8KPiA+ICsJCSAqIGJlIGNhbGxlZCB3aGVuIHNvbWUgaW50ZXJy dXB0IGlzIHRyaWdnZXJlZC4KPiA+ICsJCSAqLwo+IAo+IFRoaXMgY29tbWVudCBhcHBsaWVzIHRv IGN1cnJlbnQgbWFpbmxpbmUgcmlnaHQgKGllIGl0IGRlc2NyaWJlcyBob3cKPiBjdXJyZW50IG1h aW5saW5lIGhhbmRsZXMgSU5UeCkgPyBJTU8geW91IHNob3VsZCBzcGxpdCBpdCBvdXQgaW4gYQo+ IHNlcGFyYXRlIHBhdGNoLgoKVGhpcyBhYm92ZSBjb21tZW50IGRlc2NyaWJlIHdoYXQgaGFwcGVu cyBpbiBpZi1icmFuY2ggd2hlbiBpbnR4X2lycSBpcwpub3Qgc2V0IChhcyB3cml0dGVuIGluIGNv bW1lbnQgIndoZW4gaW50eCBpbnRlcnJ1cHQgd2FzIG5vdCBzcGVjaWZpZWQgaW4KRFQiKS4gWW91 IGFyZSByaWdodCB0aGF0IHRoaXMgaXMgYWxzbyB0aGUgYmVoYXZpb3IgaW4gdGhlIGN1cnJlbnQK bWFpbmxpbmUuCgpJJ20gbm90IHN1cmUgaWYgdGhpcyBjb21tZW50IGNhbiBiZSBzcGxpdCBvdXQg YXMgc3VwcG9ydCBmb3IgImludHgiCmludGVycnVwdCBpcyBpbiB0aGlzIHBhdGNoLgoKPiBJIHVu ZGVyc3RhbmQgaXQgaXMgaGFyZCBidXQgYSBwYXRjaCBpcyBhIGxvZ2ljYWwgX2NoYW5nZV8sIHRo aXMKPiBjb21tZW50IGlzIGEgY2hhbmdlIHBlciBzZSwgaXQgaXMgYSBjbGFyaWZpY2F0aW9uIG9u IGN1cnJlbnQKPiBiZWhhdmlvdXIuCgpPaywgSSBjb3VsZCB0cnkgdG8gc3BsaXQgdGhpcyBjb21t ZW50IGludG8gdHdvIHBhdGNoZXMsIGJ1dCBwYXJ0IGFib3V0CmlmLWJyYW5jaCBjb21tZW50IG5l ZWRzIHRvIHN0YXkgaW4gInRoaXMiIHBhdGNoLgoKPiA+ICsJCXVubWFzayA9IG12ZWJ1X3JlYWRs KHBvcnQsIFBDSUVfSU5UX1VOTUFTS19PRkYpOwo+ID4gKwkJdW5tYXNrIHw9IFBDSUVfSU5UX0lO VFgoMCkgfCBQQ0lFX0lOVF9JTlRYKDEpIHwKPiA+ICsJCQkgIFBDSUVfSU5UX0lOVFgoMikgfCBQ Q0lFX0lOVF9JTlRYKDMpOwo+ID4gKwkJbXZlYnVfd3JpdGVsKHBvcnQsIHVubWFzaywgUENJRV9J TlRfVU5NQVNLX09GRik7Cj4gPiArCX0KPiA+ICB9Cj4gPiAgCj4gPiAgc3RhdGljIHN0cnVjdCBt dmVidV9wY2llX3BvcnQgKm12ZWJ1X3BjaWVfZmluZF9wb3J0KHN0cnVjdCBtdmVidV9wY2llICpw Y2llLAo+ID4gQEAgLTkyNCw2ICs5NDgsMTA4IEBAIHN0YXRpYyBzdHJ1Y3QgcGNpX29wcyBtdmVi dV9wY2llX29wcyA9IHsKPiA+ICAJLndyaXRlID0gbXZlYnVfcGNpZV93cl9jb25mLAo+ID4gIH07 Cj4gPiAgCj4gPiArc3RhdGljIHZvaWQgbXZlYnVfcGNpZV9pbnR4X2lycV9tYXNrKHN0cnVjdCBp cnFfZGF0YSAqZCkKPiA+ICt7Cj4gPiArCXN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQgPSBk LT5kb21haW4tPmhvc3RfZGF0YTsKPiA+ICsJaXJxX2h3X251bWJlcl90IGh3aXJxID0gaXJxZF90 b19od2lycShkKTsKPiA+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiA+ICsJdTMyIHVubWFzazsK PiA+ICsKPiA+ICsJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5pcnFfbG9jaywgZmxhZ3Mp Owo+ID4gKwl1bm1hc2sgPSBtdmVidV9yZWFkbChwb3J0LCBQQ0lFX0lOVF9VTk1BU0tfT0ZGKTsK PiA+ICsJdW5tYXNrICY9IH5QQ0lFX0lOVF9JTlRYKGh3aXJxKTsKPiA+ICsJbXZlYnVfd3JpdGVs KHBvcnQsIHVubWFzaywgUENJRV9JTlRfVU5NQVNLX09GRik7Cj4gPiArCXJhd19zcGluX3VubG9j a19pcnFyZXN0b3JlKCZwb3J0LT5pcnFfbG9jaywgZmxhZ3MpOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBtdmVidV9wY2llX2ludHhfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQp Cj4gPiArewo+ID4gKwlzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0ID0gZC0+ZG9tYWluLT5o b3N0X2RhdGE7Cj4gPiArCWlycV9od19udW1iZXJfdCBod2lycSA9IGlycWRfdG9faHdpcnEoZCk7 Cj4gPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gPiArCXUzMiB1bm1hc2s7Cj4gPiArCj4gPiAr CXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+aXJxX2xvY2ssIGZsYWdzKTsKPiA+ICsJdW5t YXNrID0gbXZlYnVfcmVhZGwocG9ydCwgUENJRV9JTlRfVU5NQVNLX09GRik7Cj4gPiArCXVubWFz ayB8PSBQQ0lFX0lOVF9JTlRYKGh3aXJxKTsKPiA+ICsJbXZlYnVfd3JpdGVsKHBvcnQsIHVubWFz aywgUENJRV9JTlRfVU5NQVNLX09GRik7Cj4gPiArCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3Jl KCZwb3J0LT5pcnFfbG9jaywgZmxhZ3MpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0 IGlycV9jaGlwIGludHhfaXJxX2NoaXAgPSB7Cj4gPiArCS5uYW1lID0gIm12ZWJ1LUlOVHgiLAo+ ID4gKwkuaXJxX21hc2sgPSBtdmVidV9wY2llX2ludHhfaXJxX21hc2ssCj4gPiArCS5pcnFfdW5t YXNrID0gbXZlYnVfcGNpZV9pbnR4X2lycV91bm1hc2ssCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0 aWMgaW50IG12ZWJ1X3BjaWVfaW50eF9pcnFfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpoLAo+ID4g KwkJCQkgICB1bnNpZ25lZCBpbnQgdmlycSwgaXJxX2h3X251bWJlcl90IGh3aXJxKQo+ID4gK3sK PiA+ICsJc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCA9IGgtPmhvc3RfZGF0YTsKPiA+ICsK PiA+ICsJaXJxX3NldF9zdGF0dXNfZmxhZ3ModmlycSwgSVJRX0xFVkVMKTsKPiA+ICsJaXJxX3Nl dF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZpbnR4X2lycV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJx KTsKPiA+ICsJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgcG9ydCk7Cj4gPiArCj4gPiArCXJldHVy biAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3Bz IG12ZWJ1X3BjaWVfaW50eF9pcnFfZG9tYWluX29wcyA9IHsKPiA+ICsJLm1hcCA9IG12ZWJ1X3Bj aWVfaW50eF9pcnFfbWFwLAo+ID4gKwkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGws Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaW50IG12ZWJ1X3BjaWVfaW5pdF9pcnFfZG9tYWlu KHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZGV2aWNl ICpkZXYgPSAmcG9ydC0+cGNpZS0+cGRldi0+ZGV2Owo+ID4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUg KnBjaWVfaW50Y19ub2RlOwo+ID4gKwo+ID4gKwlyYXdfc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmly cV9sb2NrKTsKPiA+ICsKPiA+ICsJcGNpZV9pbnRjX25vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChw b3J0LT5kbiwgTlVMTCk7Cj4gPiArCWlmICghcGNpZV9pbnRjX25vZGUpIHsKPiA+ICsJCWRldl9l cnIoZGV2LCAiTm8gUENJZSBJbnRjIG5vZGUgZm91bmQgZm9yICVzXG4iLCBwb3J0LT5uYW1lKTsK PiA+ICsJCXJldHVybiAtRU5PREVWOwo+ID4gKwl9Cj4gPiArCj4gPiArCXBvcnQtPmludHhfaXJx X2RvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihwY2llX2ludGNfbm9kZSwgUENJX05VTV9J TlRYLAo+ID4gKwkJCQkJCSAgICAgICZtdmVidV9wY2llX2ludHhfaXJxX2RvbWFpbl9vcHMsCj4g PiArCQkJCQkJICAgICAgcG9ydCk7Cj4gPiArCW9mX25vZGVfcHV0KHBjaWVfaW50Y19ub2RlKTsK PiA+ICsJaWYgKCFwb3J0LT5pbnR4X2lycV9kb21haW4pIHsKPiA+ICsJCWRldl9lcnIoZGV2LCAi RmFpbGVkIHRvIGdldCBJTlR4IElSUSBkb21haW4gZm9yICVzXG4iLCBwb3J0LT5uYW1lKTsKPiA+ ICsJCXJldHVybiAtRU5PTUVNOwo+ID4gKwl9Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gK30K PiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBtdmVidV9wY2llX2lycV9oYW5kbGVyKHN0cnVjdCBpcnFf ZGVzYyAqZGVzYykKPiA+ICt7Cj4gPiArCXN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQgPSBp cnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOwo+ID4gKwlzdHJ1Y3QgaXJxX2NoaXAgKmNo aXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKPiA+ICsJc3RydWN0IGRldmljZSAqZGV2ID0g JnBvcnQtPnBjaWUtPnBkZXYtPmRldjsKPiA+ICsJdTMyIGNhdXNlLCB1bm1hc2ssIHN0YXR1czsK PiA+ICsJaW50IGk7Cj4gPiArCj4gPiArCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOwo+ ID4gKwo+ID4gKwljYXVzZSA9IG12ZWJ1X3JlYWRsKHBvcnQsIFBDSUVfSU5UX0NBVVNFX09GRik7 Cj4gPiArCXVubWFzayA9IG12ZWJ1X3JlYWRsKHBvcnQsIFBDSUVfSU5UX1VOTUFTS19PRkYpOwo+ ID4gKwlzdGF0dXMgPSBjYXVzZSAmIHVubWFzazsKPiA+ICsKPiA+ICsJLyogUHJvY2VzcyBsZWdh Y3kgSU5UeCBpbnRlcnJ1cHRzICovCj4gPiArCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX0lOVFg7 IGkrKykgewo+ID4gKwkJaWYgKCEoc3RhdHVzICYgUENJRV9JTlRfSU5UWChpKSkpCj4gPiArCQkJ Y29udGludWU7Cj4gPiArCj4gPiArCQlpZiAoZ2VuZXJpY19oYW5kbGVfZG9tYWluX2lycShwb3J0 LT5pbnR4X2lycV9kb21haW4sIGkpID09IC1FSU5WQUwpCj4gPiArCQkJZGV2X2Vycl9yYXRlbGlt aXRlZChkZXYsICJ1bmV4cGVjdGVkIElOVCVjIElSUVxuIiwgKGNoYXIpaSsnQScpOwo+ID4gKwl9 Cj4gPiArCj4gPiArCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cj4gPiArfQo+ID4gKwo+ ID4gIHN0YXRpYyBpbnQgbXZlYnVfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpk ZXYsIHU4IHNsb3QsIHU4IHBpbikKPiA+ICB7Cj4gPiAgCS8qIEludGVycnVwdCBzdXBwb3J0IG9u IG12ZWJ1IGVtdWxhdGVkIGJyaWRnZXMgaXMgbm90IGltcGxlbWVudGVkIHlldCAqLwo+ID4gQEAg LTExMjEsNiArMTI0NywyMSBAQCBzdGF0aWMgaW50IG12ZWJ1X3BjaWVfcGFyc2VfcG9ydChzdHJ1 Y3QgbXZlYnVfcGNpZSAqcGNpZSwKPiA+ICAJCXBvcnQtPmlvX2F0dHIgPSAtMTsKPiA+ICAJfQo+ ID4gIAo+ID4gKwkvKgo+ID4gKwkgKiBPbGQgRFQgYmluZGluZ3MgZG8gbm90IGNvbnRhaW4gImlu dHgiIGludGVycnVwdAo+ID4gKwkgKiBzbyBkbyBub3QgZmFpbCBwcm9iaW5nIGRyaXZlciB3aGVu IGludGVycnVwdCBkb2VzIG5vdCBleGlzdC4KPiA+ICsJICovCj4gPiArCXBvcnQtPmludHhfaXJx ID0gb2ZfaXJxX2dldF9ieW5hbWUoY2hpbGQsICJpbnR4Iik7Cj4gPiArCWlmIChwb3J0LT5pbnR4 X2lycSA9PSAtRVBST0JFX0RFRkVSKSB7Cj4gPiArCQlyZXQgPSBwb3J0LT5pbnR4X2lycTsKPiA+ ICsJCWdvdG8gZXJyOwo+ID4gKwl9Cj4gPiArCWlmIChwb3J0LT5pbnR4X2lycSA8PSAwKSB7Cj4g PiArCQlkZXZfd2FybihkZXYsICIlczogbGVnYWN5IElOVHggaW50ZXJydXB0cyBjYW5ub3QgYmUg bWFza2VkIGluZGl2aWR1YWxseSwgIgo+ID4gKwkJCSAgICAgICIlcE9GIGRvZXMgbm90IGNvbnRh aW4gaW50eCBpbnRlcnJ1cHRcbiIsCj4gPiArCQkJIHBvcnQtPm5hbWUsIGNoaWxkKTsKPiAKPiBI ZXJlIHlvdSBlbmQgdXAgd2l0aCBhIG5ldyB3YXJuaW5nIG9uIGV4aXN0aW5nIGZpcm13YXJlLiBJ cyBpdAo+IGxlZ2l0aW1hdGUgPyBJIHdvdWxkIHJlbW92ZSB0aGUgZGV2X3dhcm4oKS4KCkkgYWRk ZWQgdGhpcyB3YXJuaW5nIGluIHYyIGJlY2F1c2UgTWFyYyB3YW50ZWQgaXQuCgpTaG91bGQgSSAo YWdhaW4pIHJlbW92ZSBpdCBpbiB2Mz8KCj4gUm9iIGNlcnRhaW5seSBoYXMgbW9yZSBpbnNpZ2h0 ZnVsIGFkdmljZSBvbiB0aGlzLgo+IAo+IFRoYW5rcywKPiBMb3JlbnpvCj4gCj4gPiArCX0KPiA+ ICsKPiA+ICAJcmVzZXRfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKGNoaWxkLCAicmVz ZXQtZ3Bpb3MiLCAwLCAmZmxhZ3MpOwo+ID4gIAlpZiAocmVzZXRfZ3BpbyA9PSAtRVBST0JFX0RF RkVSKSB7Cj4gPiAgCQlyZXQgPSByZXNldF9ncGlvOwo+ID4gQEAgLTEzMTcsNiArMTQ1OCw3IEBA IHN0YXRpYyBpbnQgbXZlYnVfcGNpZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQo+ID4gIAo+ID4gIAlmb3IgKGkgPSAwOyBpIDwgcGNpZS0+bnBvcnRzOyBpKyspIHsKPiA+ICAJ CXN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQgPSAmcGNpZS0+cG9ydHNbaV07Cj4gPiArCQlp bnQgaXJxID0gcG9ydC0+aW50eF9pcnE7Cj4gPiAgCj4gPiAgCQljaGlsZCA9IHBvcnQtPmRuOwo+ ID4gIAkJaWYgKCFjaGlsZCkKPiA+IEBAIC0xMzQ0LDYgKzE0ODYsMjIgQEAgc3RhdGljIGludCBt dmVidV9wY2llX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiAgCQkJY29u dGludWU7Cj4gPiAgCQl9Cj4gPiAgCj4gPiArCQlpZiAoaXJxID4gMCkgewo+ID4gKwkJCXJldCA9 IG12ZWJ1X3BjaWVfaW5pdF9pcnFfZG9tYWluKHBvcnQpOwo+ID4gKwkJCWlmIChyZXQpIHsKPiA+ ICsJCQkJZGV2X2VycihkZXYsICIlczogY2Fubm90IGluaXQgaXJxIGRvbWFpblxuIiwKPiA+ICsJ CQkJCXBvcnQtPm5hbWUpOwo+ID4gKwkJCQlwY2lfYnJpZGdlX2VtdWxfY2xlYW51cCgmcG9ydC0+ YnJpZGdlKTsKPiA+ICsJCQkJZGV2bV9pb3VubWFwKGRldiwgcG9ydC0+YmFzZSk7Cj4gPiArCQkJ CXBvcnQtPmJhc2UgPSBOVUxMOwo+ID4gKwkJCQltdmVidV9wY2llX3Bvd2VyZG93bihwb3J0KTsK PiA+ICsJCQkJY29udGludWU7Cj4gPiArCQkJfQo+ID4gKwkJCWlycV9zZXRfY2hhaW5lZF9oYW5k bGVyX2FuZF9kYXRhKGlycSwKPiA+ICsJCQkJCQkJIG12ZWJ1X3BjaWVfaXJxX2hhbmRsZXIsCj4g PiArCQkJCQkJCSBwb3J0KTsKPiA+ICsJCX0KPiA+ICsKPiA+ICAJCS8qCj4gPiAgCQkgKiBQQ0ll IHRvcG9sb2d5IGV4cG9ydGVkIGJ5IG12ZWJ1IGh3IGlzIHF1aXRlIGNvbXBsaWNhdGVkLiBJbgo+ ID4gIAkJICogcmVhbGl0eSBoYXMgc29tZXRoaW5nIGxpa2UgTiBmdWxseSBpbmRlcGVuZGVudCBo b3N0IGJyaWRnZXMKPiA+IEBAIC0xNDQ4LDYgKzE2MDYsNyBAQCBzdGF0aWMgaW50IG12ZWJ1X3Bj aWVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiAgCj4gPiAgCWZvciAo aSA9IDA7IGkgPCBwY2llLT5ucG9ydHM7IGkrKykgewo+ID4gIAkJc3RydWN0IG12ZWJ1X3BjaWVf cG9ydCAqcG9ydCA9ICZwY2llLT5wb3J0c1tpXTsKPiA+ICsJCWludCBpcnEgPSBwb3J0LT5pbnR4 X2lycTsKPiA+ICAKPiA+ICAJCWlmICghcG9ydC0+YmFzZSkKPiA+ICAJCQljb250aW51ZTsKPiA+ IEBAIC0xNDU4LDcgKzE2MTcsMTcgQEAgc3RhdGljIGludCBtdmVidV9wY2llX3JlbW92ZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4gIAkJbXZlYnVfd3JpdGVsKHBvcnQsIGNtZCwg UENJRV9DTURfT0ZGKTsKPiA+ICAKPiA+ICAJCS8qIE1hc2sgYWxsIGludGVycnVwdCBzb3VyY2Vz LiAqLwo+ID4gLQkJbXZlYnVfd3JpdGVsKHBvcnQsIDAsIFBDSUVfTUFTS19PRkYpOwo+ID4gKwkJ bXZlYnVfd3JpdGVsKHBvcnQsIH5QQ0lFX0lOVF9BTExfTUFTSywgUENJRV9JTlRfVU5NQVNLX09G Rik7Cj4gPiArCj4gPiArCQkvKiBDbGVhciBhbGwgaW50ZXJydXB0IGNhdXNlcy4gKi8KPiA+ICsJ CW12ZWJ1X3dyaXRlbChwb3J0LCB+UENJRV9JTlRfQUxMX01BU0ssIFBDSUVfSU5UX0NBVVNFX09G Rik7Cj4gPiArCj4gPiArCQlpZiAoaXJxID4gMCkKPiA+ICsJCQlpcnFfc2V0X2NoYWluZWRfaGFu ZGxlcl9hbmRfZGF0YShpcnEsIE5VTEwsIE5VTEwpOwo+ID4gKwo+ID4gKwkJLyogUmVtb3ZlIElS USBkb21haW5zLiAqLwo+ID4gKwkJaWYgKHBvcnQtPmludHhfaXJxX2RvbWFpbikKPiA+ICsJCQlp cnFfZG9tYWluX3JlbW92ZShwb3J0LT5pbnR4X2lycV9kb21haW4pOwo+ID4gIAo+ID4gIAkJLyog RnJlZSBjb25maWcgc3BhY2UgZm9yIGVtdWxhdGVkIHJvb3QgYnJpZGdlLiAqLwo+ID4gIAkJcGNp X2JyaWRnZV9lbXVsX2NsZWFudXAoJnBvcnQtPmJyaWRnZSk7Cj4gPiAtLSAKPiA+IDIuMjAuMQo+ ID4gCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51 eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVh ZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1h cm0ta2VybmVsCg==