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 F17E8C6FD1C for ; Tue, 14 Mar 2023 10:34:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230318AbjCNKeV (ORCPT ); Tue, 14 Mar 2023 06:34:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41884 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229934AbjCNKeI (ORCPT ); Tue, 14 Mar 2023 06:34:08 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6B0203C0A; Tue, 14 Mar 2023 03:33:40 -0700 (PDT) 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 53346616F7; Tue, 14 Mar 2023 10:27:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2E1DEC433D2; Tue, 14 Mar 2023 10:27:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678789673; bh=mktWL3pBA6fgZw5itPxAboV+gR9yVVLoCoTcs7Hg/Ek=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=LJWbHdIU9n1KmGpb0FJOLIdBjb7xhxPXlfqJyuSO+bO4M5UYR7TyHljtY5IoS2aC/ Wn8K5B4qHUbh4wjNKVN5GktwhaMRBL+Bghj/yU4j4n4tfkCru3VBpxHfObh/wYB6gt C9pF+/OWGsW5P3Uom6emnc/PpgDcQ4Y6aL1jhpMX6pd2NTU/oHR1vKmq2CTIwbYCOZ xkja03SD5OlHOdpMR7PW07sgBlnC3F8jiLVGg2N13eOmUNJKrq4xzcAd6OCDpqZaj5 JKfxCBStyFJqJMf0FFsCK/RVVewBLB8CF94ZSjie6+Ho2ooibqIBw90uBjKIfahw/W +jCj//rNmtgKg== Date: Tue, 14 Mar 2023 11:27:48 +0100 From: Lorenzo Pieralisi To: Hongxing Zhu Cc: Bjorn Helgaas , "l.stach@pengutronix.de" , "bhelgaas@google.com" , "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of RC in suspend and resume Message-ID: References: <20230313174929.GA1509198@bhelgaas> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Mar 14, 2023 at 03:24:28AM +0000, Hongxing Zhu wrote: > > -----Original Message----- > > From: Bjorn Helgaas > > Sent: 2023年3月14日 1:49 > > To: Hongxing Zhu > > Cc: Lorenzo Pieralisi ; l.stach@pengutronix.de; > > bhelgaas@google.com; linux-pci@vger.kernel.org; > > linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org; > > kernel@pengutronix.de; dl-linux-imx > > Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of RC in > > suspend and resume > > > > On Mon, Mar 13, 2023 at 02:50:31AM +0000, Hongxing Zhu wrote: > > > > -----Original Message----- > > > > From: Lorenzo Pieralisi > > > > Sent: 2023年3月11日 0:14 > > > > To: Hongxing Zhu > > > > Cc: l.stach@pengutronix.de; bhelgaas@google.com; > > > > linux-pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; > > > > linux-kernel@vger.kernel.org; kernel@pengutronix.de; dl-linux-imx > > > > > > > > Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of > > > > RC in suspend and resume > > > > > > > > On Mon, Jan 09, 2023 at 02:08:06AM +0000, Hongxing Zhu wrote: > > > > > > -----Original Message----- > > > > > > From: Lorenzo Pieralisi > > > > > > Sent: 2022年12月30日 23:06 > > > > > > To: Hongxing Zhu ; l.stach@pengutronix.de; > > > > > > bhelgaas@google.com > > > > > > Cc: linux-pci@vger.kernel.org; > > > > > > linux-arm-kernel@lists.infradead.org; > > > > > > linux-kernel@vger.kernel.org; kernel@pengutronix.de; > > > > > > dl-linux-imx > > > > > > Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control > > > > > > of RC in suspend and resume > > > > > > > > > > > > On Thu, Dec 08, 2022 at 02:05:34PM +0800, Richard Zhu wrote: > > > > > > > The MSI Enable bit controls delivery of MSI interrupts from > > > > > > > components below the Root Port. This bit might lost during the > > > > > > > suspend, should be re-stored during resume. > > > > > > > > > > > > > > Save the MSI control during suspend, and restore it in resume. > > > > > > > > > > > > I believe that what Lucas and Bjorn asked on v1 is still not answered. > > > > > > > > > > > > The root port is a PCI device, why do we need to save and > > > > > > restore the MSI cap on top of what PCI core already does ? The > > > > > > RP should be enumerated as a PCI device and therefore I expect > > > > > > the MSI cap to be saved/restored in the suspend/resume execution. > > > > > > > > > > > > I don't think there is anything iMX6 specific in this. > > > > > Hi Lorenzo: > > > > > Thanks for your comments. > > > > > Sorry to reply late, since I got a high fever in the past days. > > > > > > > > > > Based on i.MX6QP SABRESD board and XHCI PCIe2USB3.0 device, the > > > > > MSI cap save/restore of PCI core is not executed(dev->msi_enabled > > > > > is > > > > > zero) during my suspend/resume tests. > > > > > > > > I still do not understand. The register you are saving/restoring in > > > > the RC is not the root port Message control field in the root port > > > > MSI capability, it is a separate register that controls the root > > > > complex MSI forwarding, is that correct ? > > > > > > > > The root port MSI capability does not control the root complex > > > > forwarding of MSIs TLPs. > > > > > > > > So the bits you are saving and restoring IIUC should be MMIO space > > > > in the root complex, dressed as an MSI capability, that has nothing > > > > to do with the root port MSI capability. > > > > > > > > Is that correct ? > > > > > > It's not a separate register. > > > > > > The bit I manipulated is the MSI Enable bit of the Message Control > > > Register for MSI (Offset 02h) contained in the MSI-capability of Root > > > Complex. > > > > > > In addition, on i.MX6, the MSI Enable bit controls delivery of MSI > > > interrupts from components below the Root Port. > > > > > > So, set MSI Enable in imx6q-pcie to let the MSI from downstream > > > components works. > > > > My confusion is about this "MSI Capability" found by > > "dw_pcie_find_capability(pci, PCI_CAP_ID_MSI)" in your patch. > > > > The i.MX6 manual might refer to that as an "MSI Capability" but as far as I > > know, the PCIe base spec doesn't document a Root Complex MSI Capability. > > > > I don't think it's the same as the one documented in PCIe r6.0, sec 7.7.2. I > > think it's different because: > > > > (1) I *think* "pci" here refers to the RC, not to a Root Port. > > > > (2) The semantics are different. The MSI-X Enable bit in 7.7.2 only > > determines whether the Function itself is permitted to use MSI-X. > > It has nothing to do with devices *below* a Root Port can use MSI-X. > > It also has nothing to do with whether a Root Port can forward MSI > > transactions from those downstream devices. > > > > This part of my confusion could be easily resolved via a comment. > > > > I do have a follow-on question, though: the patch seems to enable > > MSI-related functionality using a register in the DesignWare IP, not something > > in the i.MX6-specific IP. If that's true, why don't other DesignWare-based > > drivers need something similar? > Hi Bjorn: > Thanks a lot for you reply. > This behavior is specific for i.MX PCIe. Which behaviour ? It can't be the root port MSI capability, that would be a HW bug (ie disabling root port MSIs would imply disabling MSIs for all downstream components). > i.MX PCIe designer use this MSI_EN bit to control the MSI trigger when > integrate Design Ware PCIe IP. Fair enough but that can't be the MSI Enable bit in the Root Port MSI capability "Message Control" field I am afraid. It is what Bjorn mentioned quite clearly, a root complex configuration register dressed as an MSI capability, the root complex is not a PCI device; either that or that's an HW bug. Lorenzo > So, the other DesignWare-base PCIe driver doesn't need this beahvior. > > Best Regards > Richard Zhu > > > > > > > It seems that some device might shutdown msi when do the suspend > > > > operations. > > > > > > > > > > > > Would you mind investigating it please ? > > > > > Sure, I did further investigation on i.MX6QP platform. > > > > > The MSI_EN bit of RC MSI capability would be cleared to zero, when > > > > > PCIE_RESET(BIT29 of IOMUXC_GPR1) is toggled (assertion 1b'1, > > > > > then de-assertion 1b'0). > > > > > > > > > > Verification steps: > > > > > MSI_EN of RC is set to 1b'1 when system is boot up. > > > > > ./memtool 1ffc050 1 > > > > > 0x01FFC050: 01017005 > > > > > > > > > > Toggle PCIe reset of i.MX6QP. > > > > > root@imx6qpdlsolox:~# ./memtool 20e0004=68691005 Writing 32-bit > > > > > value > > > > > 0x68691005 to address 0x020E0004 root@imx6qpdlsolox:~# ./memtool > > > > > 20e0004=48691005 Writing 32-bit value 0x48691005 to address > > > > 0x020E0004 > > > > > > > > > > The MSI_EN bit of RC had been cleared to 1b'0. > > > > > ./memtool 1ffc050 1 > > > > > 0x01FFC050: 01807005 > > > > > > > > > > This is why I used to reply to Bjorn the MSI_EN of RC is cleared > > > > > when RESETs are toggled during the imx6_pcie_host_init() in > > > > > imx6_pcie_resume_noirq() callback. > > > > > > > > > > Best Regards > > > > > Richard Zhu > > > > > > > > > > > > Lorenzo > > > > > > > > > > > > > Signed-off-by: Richard Zhu > > > > > > > --- > > > > > > > Changes v1-->v2: > > > > > > > New create one save/restore function, used save the setting in > > > > > > > suspend and restore the configuration in resume. > > > > > > > v1 > > > > > > > https://eur01.safelinks.protection.outlook.com/?url=https%3A%2 > > > > > > > F%2F > > > > > > > > > > > > > patc%2F&data=05%7C01%7Chongxing.zhu%40nxp.com%7C24971d8de9b54b > > > > 0b10 > > > > > > > > > > > > > ad08db2182774d%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C6 > > > > 38140 > > > > > > > > > > > > > 616456052078%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJ > > > > QIjoiV > > > > > > > > > > > > > 2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=vE > > > > tRxL > > > > > > > BVi5lYmpwTNZfafMms3263LZXodneLChjEaOM%3D&reserved=0 > > > > > > > > > > > > > > > > > > > hwork.kernel.org%2Fproject%2Flinux-pci%2Fpatch%2F1667289595-12440-1- > > > > > > g > > > > > > i > > > > > > > > > > > > > > > > > > > t-send-email-hongxing.zhu%40nxp.com%2F&data=05%7C01%7Chongxing.zhu > > > > > > %40n > > > > > > > > > > > > > > > > > > > xp.com%7C3aeb1d128f854dad1a5608daea77706d%7C686ea1d3bc2b4c6fa9 > > > > 2 > > > > > > cd99c5c > > > > > > > > > > > > > > > > > > > 301635%7C0%7C0%7C638080095954881374%7CUnknown%7CTWFpbGZsb3 > > > > > > d8eyJWIjoiMC > > > > > > > > > > > > > > > > > > > 4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000 > > > > % > > > > > > 7C%7C% > > > > > > > > > > > > > > > > > > > 7C&sdata=V8yVvvpTKGoR1UyQP5HD2IdlSjJdznBeD12bdI67dEI%3D&reserved > > > > = > > > > > > 0 > > > > > > > > > > > > > > --- > > > > > > > drivers/pci/controller/dwc/pci-imx6.c | 23 > > > > > > > +++++++++++++++++++++++ > > > > > > > 1 file changed, 23 insertions(+) > > > > > > > > > > > > > > diff --git a/drivers/pci/controller/dwc/pci-imx6.c > > > > > > > b/drivers/pci/controller/dwc/pci-imx6.c > > > > > > > index 1dde5c579edc..aa3096890c3b 100644 > > > > > > > --- a/drivers/pci/controller/dwc/pci-imx6.c > > > > > > > +++ b/drivers/pci/controller/dwc/pci-imx6.c > > > > > > > @@ -76,6 +76,7 @@ struct imx6_pcie { > > > > > > > struct clk *pcie; > > > > > > > struct clk *pcie_aux; > > > > > > > struct regmap *iomuxc_gpr; > > > > > > > + u16 msi_ctrl; > > > > > > > u32 controller_id; > > > > > > > struct reset_control *pciephy_reset; > > > > > > > struct reset_control *apps_reset; > > > > > > > @@ -1042,6 +1043,26 @@ static void imx6_pcie_pm_turnoff(struct > > > > > > imx6_pcie *imx6_pcie) > > > > > > > usleep_range(1000, 10000); > > > > > > > } > > > > > > > > > > > > > > +static void imx6_pcie_msi_save_restore(struct imx6_pcie > > > > > > > +*imx6_pcie, bool save) { > > > > > > > + u8 offset; > > > > > > > + u16 val; > > > > > > > + struct dw_pcie *pci = imx6_pcie->pci; > > > > > > > + > > > > > > > + if (pci_msi_enabled()) { > > > > > > > + offset = dw_pcie_find_capability(pci, PCI_CAP_ID_MSI); > > > > > > > + if (save) { > > > > > > > + val = dw_pcie_readw_dbi(pci, offset + > > PCI_MSI_FLAGS); > > > > > > > + imx6_pcie->msi_ctrl = val; > > > > > > > + } else { > > > > > > > + dw_pcie_dbi_ro_wr_en(pci); > > > > > > > + val = imx6_pcie->msi_ctrl; > > > > > > > + dw_pcie_writew_dbi(pci, offset + PCI_MSI_FLAGS, > > val); > > > > > > > + dw_pcie_dbi_ro_wr_dis(pci); > > > > > > > + } > > > > > > > + } > > > > > > > +} > > > > > > > + > > > > > > > static int imx6_pcie_suspend_noirq(struct device *dev) { > > > > > > > struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev); @@ > > > > > > > -1050,6 > > > > > > > +1071,7 @@ static int imx6_pcie_suspend_noirq(struct device > > > > > > > +*dev) > > > > > > > if (!(imx6_pcie->drvdata->flags & > > > > > > IMX6_PCIE_FLAG_SUPPORTS_SUSPEND)) > > > > > > > return 0; > > > > > > > > > > > > > > + imx6_pcie_msi_save_restore(imx6_pcie, true); > > > > > > > imx6_pcie_pm_turnoff(imx6_pcie); > > > > > > > imx6_pcie_stop_link(imx6_pcie->pci); > > > > > > > imx6_pcie_host_exit(pp); > > > > > > > @@ -1069,6 +1091,7 @@ static int imx6_pcie_resume_noirq(struct > > > > > > > device > > > > > > *dev) > > > > > > > ret = imx6_pcie_host_init(pp); > > > > > > > if (ret) > > > > > > > return ret; > > > > > > > + imx6_pcie_msi_save_restore(imx6_pcie, false); > > > > > > > dw_pcie_setup_rc(pp); > > > > > > > > > > > > > > if (imx6_pcie->link_is_up) > > > > > > > -- > > > > > > > 2.25.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 9B973C6FD1C for ; Tue, 14 Mar 2023 12:48:47 +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=ULjNWIfVbf3U9d8mK6YBgQ4U/JknuxfCI1BW2VBdf1s=; b=xPNc6eId/k5dcC 0613D3LDDwMNp44DxqDMmQwfW0+e7kd/ahg2Oug2vNro8xAUKhiJ2Mmbz6Ge4ugfaNu0SWVpQSfB5 kKHKTccRpqNgIzz4kNtdHIX3bXO2dlosQGGdcUQ0htSyE+2u7bO9pOjHMs3VW/5zGdGAdUhZ2gKB9 24rcgBNAmxjUH5yebxcy5ubOE3595ysGLp0jklJgEGqKpxKJj3k+HQNfq2yq1953+owoZkx0SB0My 4h/l2PtPnwRN8gqbQ3PMkr0gnOU4eBFu2XjMpKQbYQI2KZnFSoqttPLcbZymou7C/bvkGrjxfaBYk eWpOcv6/Fh+aRYQ9xmWA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1pc44G-00ACGc-0g; Tue, 14 Mar 2023 12:47:52 +0000 Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1pc44F-00ACFj-0c for linux-arm-kernel@bombadil.infradead.org; Tue, 14 Mar 2023 12:47:51 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=In-Reply-To:Content-Transfer-Encoding: Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date: Sender:Reply-To:Content-ID:Content-Description; bh=7QEs8RX+1NL4s5dUeAqlea1aZq42udsmxAF3vHcyhmE=; b=JNQZgPAhsYrzB4E+dtK7Ef7FxI 6kDmRMEsQVGVMBPU2UDopEziyK8Id3IpGJBbefxrxd+Jh/iBdhViJ0VaNdlGW7rY7u7+w5tJXKTFB EOR45QKiC14k12WfQNtNt540w5NpUqGa08Ix8Z7ho8lP5f2tHIuvuj5rGi+c72TEkgVRpVKkHx6Qn KHwhn8MYkCmvMlVJwS6kzP5Z+chdffFDp2ZvjyS45BfFjvgWiVLug98vX419/m1BuYllSSqBKSWRc fGUwN1XY1I24zG0pd5Y/TJur4XzfoCdQVI6CcL4bTA5wMVO9FnbF+UIO+uKf1d+AuP9MkXwIeBg72 ZJPzrK/g==; Received: from dfw.source.kernel.org ([139.178.84.217]) by desiato.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1pc1sr-001kP0-1r for linux-arm-kernel@lists.infradead.org; Tue, 14 Mar 2023 10:28:00 +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 4D413616E7; Tue, 14 Mar 2023 10:27:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2E1DEC433D2; Tue, 14 Mar 2023 10:27:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678789673; bh=mktWL3pBA6fgZw5itPxAboV+gR9yVVLoCoTcs7Hg/Ek=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=LJWbHdIU9n1KmGpb0FJOLIdBjb7xhxPXlfqJyuSO+bO4M5UYR7TyHljtY5IoS2aC/ Wn8K5B4qHUbh4wjNKVN5GktwhaMRBL+Bghj/yU4j4n4tfkCru3VBpxHfObh/wYB6gt C9pF+/OWGsW5P3Uom6emnc/PpgDcQ4Y6aL1jhpMX6pd2NTU/oHR1vKmq2CTIwbYCOZ xkja03SD5OlHOdpMR7PW07sgBlnC3F8jiLVGg2N13eOmUNJKrq4xzcAd6OCDpqZaj5 JKfxCBStyFJqJMf0FFsCK/RVVewBLB8CF94ZSjie6+Ho2ooibqIBw90uBjKIfahw/W +jCj//rNmtgKg== Date: Tue, 14 Mar 2023 11:27:48 +0100 From: Lorenzo Pieralisi To: Hongxing Zhu Cc: Bjorn Helgaas , "l.stach@pengutronix.de" , "bhelgaas@google.com" , "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of RC in suspend and resume Message-ID: References: <20230313174929.GA1509198@bhelgaas> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230314_102757_944490_9A56E4FA X-CRM114-Status: GOOD ( 64.44 ) 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 T24gVHVlLCBNYXIgMTQsIDIwMjMgYXQgMDM6MjQ6MjhBTSArMDAwMCwgSG9uZ3hpbmcgWmh1IHdy b3RlOgo+ID4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiA+IEZyb206IEJqb3JuIEhlbGdh YXMgPGhlbGdhYXNAa2VybmVsLm9yZz4KPiA+IFNlbnQ6IDIwMjPlubQz5pyIMTTml6UgMTo0OQo+ ID4gVG86IEhvbmd4aW5nIFpodSA8aG9uZ3hpbmcuemh1QG54cC5jb20+Cj4gPiBDYzogTG9yZW56 byBQaWVyYWxpc2kgPGxwaWVyYWxpc2lAa2VybmVsLm9yZz47IGwuc3RhY2hAcGVuZ3V0cm9uaXgu ZGU7Cj4gPiBiaGVsZ2Fhc0Bnb29nbGUuY29tOyBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnOwo+ ID4gbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOyBsaW51eC1rZXJuZWxAdmdl ci5rZXJuZWwub3JnOwo+ID4ga2VybmVsQHBlbmd1dHJvbml4LmRlOyBkbC1saW51eC1pbXggPGxp bnV4LWlteEBueHAuY29tPgo+ID4gU3ViamVjdDogUmU6IFtQQVRDSCB2Ml0gUENJOiBpbXg2OiBT YXZlIGFuZCByZXN0b3JlIE1TSSBjb250cm9sIG9mIFJDIGluCj4gPiBzdXNwZW5kIGFuZCByZXN1 bWUKPiA+IAo+ID4gT24gTW9uLCBNYXIgMTMsIDIwMjMgYXQgMDI6NTA6MzFBTSArMDAwMCwgSG9u Z3hpbmcgWmh1IHdyb3RlOgo+ID4gPiA+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tCj4gPiA+ ID4gRnJvbTogTG9yZW56byBQaWVyYWxpc2kgPGxwaWVyYWxpc2lAa2VybmVsLm9yZz4KPiA+ID4g PiBTZW50OiAyMDIz5bm0M+aciDEx5pelIDA6MTQKPiA+ID4gPiBUbzogSG9uZ3hpbmcgWmh1IDxo b25neGluZy56aHVAbnhwLmNvbT4KPiA+ID4gPiBDYzogbC5zdGFjaEBwZW5ndXRyb25peC5kZTsg YmhlbGdhYXNAZ29vZ2xlLmNvbTsKPiA+ID4gPiBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnOyBs aW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmc7Cj4gPiA+ID4gbGludXgta2VybmVs QHZnZXIua2VybmVsLm9yZzsga2VybmVsQHBlbmd1dHJvbml4LmRlOyBkbC1saW51eC1pbXgKPiA+ ID4gPiA8bGludXgtaW14QG54cC5jb20+Cj4gPiA+ID4gU3ViamVjdDogUmU6IFtQQVRDSCB2Ml0g UENJOiBpbXg2OiBTYXZlIGFuZCByZXN0b3JlIE1TSSBjb250cm9sIG9mCj4gPiA+ID4gUkMgaW4g c3VzcGVuZCBhbmQgcmVzdW1lCj4gPiA+ID4KPiA+ID4gPiBPbiBNb24sIEphbiAwOSwgMjAyMyBh dCAwMjowODowNkFNICswMDAwLCBIb25neGluZyBaaHUgd3JvdGU6Cj4gPiA+ID4gPiA+IC0tLS0t T3JpZ2luYWwgTWVzc2FnZS0tLS0tCj4gPiA+ID4gPiA+IEZyb206IExvcmVuem8gUGllcmFsaXNp IDxscGllcmFsaXNpQGtlcm5lbC5vcmc+Cj4gPiA+ID4gPiA+IFNlbnQ6IDIwMjLlubQxMuaciDMw 5pelIDIzOjA2Cj4gPiA+ID4gPiA+IFRvOiBIb25neGluZyBaaHUgPGhvbmd4aW5nLnpodUBueHAu Y29tPjsgbC5zdGFjaEBwZW5ndXRyb25peC5kZTsKPiA+ID4gPiA+ID4gYmhlbGdhYXNAZ29vZ2xl LmNvbQo+ID4gPiA+ID4gPiBDYzogbGludXgtcGNpQHZnZXIua2VybmVsLm9yZzsKPiA+ID4gPiA+ ID4gbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOwo+ID4gPiA+ID4gPiBsaW51 eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOyBrZXJuZWxAcGVuZ3V0cm9uaXguZGU7Cj4gPiA+ID4g PiA+IGRsLWxpbnV4LWlteCA8bGludXgtaW14QG54cC5jb20+Cj4gPiA+ID4gPiA+IFN1YmplY3Q6 IFJlOiBbUEFUQ0ggdjJdIFBDSTogaW14NjogU2F2ZSBhbmQgcmVzdG9yZSBNU0kgY29udHJvbAo+ ID4gPiA+ID4gPiBvZiBSQyBpbiBzdXNwZW5kIGFuZCByZXN1bWUKPiA+ID4gPiA+ID4KPiA+ID4g PiA+ID4gT24gVGh1LCBEZWMgMDgsIDIwMjIgYXQgMDI6MDU6MzRQTSArMDgwMCwgUmljaGFyZCBa aHUgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gVGhlIE1TSSBFbmFibGUgYml0IGNvbnRyb2xzIGRlbGl2 ZXJ5IG9mIE1TSSBpbnRlcnJ1cHRzIGZyb20KPiA+ID4gPiA+ID4gPiBjb21wb25lbnRzIGJlbG93 IHRoZSBSb290IFBvcnQuIFRoaXMgYml0IG1pZ2h0IGxvc3QgZHVyaW5nIHRoZQo+ID4gPiA+ID4g PiA+IHN1c3BlbmQsIHNob3VsZCBiZSByZS1zdG9yZWQgZHVyaW5nIHJlc3VtZS4KPiA+ID4gPiA+ ID4gPgo+ID4gPiA+ID4gPiA+IFNhdmUgdGhlIE1TSSBjb250cm9sIGR1cmluZyBzdXNwZW5kLCBh bmQgcmVzdG9yZSBpdCBpbiByZXN1bWUuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEkgYmVsaWV2 ZSB0aGF0IHdoYXQgTHVjYXMgYW5kIEJqb3JuIGFza2VkIG9uIHYxIGlzIHN0aWxsIG5vdCBhbnN3 ZXJlZC4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gVGhlIHJvb3QgcG9ydCBpcyBhIFBDSSBkZXZp Y2UsIHdoeSBkbyB3ZSBuZWVkIHRvIHNhdmUgYW5kCj4gPiA+ID4gPiA+IHJlc3RvcmUgdGhlIE1T SSBjYXAgb24gdG9wIG9mIHdoYXQgUENJIGNvcmUgYWxyZWFkeSBkb2VzID8gVGhlCj4gPiA+ID4g PiA+IFJQIHNob3VsZCBiZSBlbnVtZXJhdGVkIGFzIGEgUENJIGRldmljZSBhbmQgdGhlcmVmb3Jl IEkgZXhwZWN0Cj4gPiA+ID4gPiA+IHRoZSBNU0kgY2FwIHRvIGJlIHNhdmVkL3Jlc3RvcmVkIGlu IHRoZSBzdXNwZW5kL3Jlc3VtZSBleGVjdXRpb24uCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEkg ZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYW55dGhpbmcgaU1YNiBzcGVjaWZpYyBpbiB0aGlzLgo+ID4g PiA+ID4gSGkgTG9yZW56bzoKPiA+ID4gPiA+IFRoYW5rcyBmb3IgeW91ciBjb21tZW50cy4KPiA+ ID4gPiA+IFNvcnJ5IHRvIHJlcGx5IGxhdGUsIHNpbmNlIEkgZ290IGEgaGlnaCBmZXZlciBpbiB0 aGUgcGFzdCBkYXlzLgo+ID4gPiA+ID4KPiA+ID4gPiA+IEJhc2VkIG9uIGkuTVg2UVAgU0FCUkVT RCBib2FyZCBhbmQgWEhDSSBQQ0llMlVTQjMuMCBkZXZpY2UsIHRoZQo+ID4gPiA+ID4gTVNJIGNh cCAgc2F2ZS9yZXN0b3JlIG9mIFBDSSBjb3JlIGlzIG5vdCBleGVjdXRlZChkZXYtPm1zaV9lbmFi bGVkCj4gPiA+ID4gPiBpcwo+ID4gPiA+ID4gemVybykgIGR1cmluZyBteSBzdXNwZW5kL3Jlc3Vt ZSB0ZXN0cy4KPiA+ID4gPgo+ID4gPiA+IEkgc3RpbGwgZG8gbm90IHVuZGVyc3RhbmQuIFRoZSBy ZWdpc3RlciB5b3UgYXJlIHNhdmluZy9yZXN0b3JpbmcgaW4KPiA+ID4gPiB0aGUgUkMgaXMgbm90 IHRoZSByb290IHBvcnQgTWVzc2FnZSBjb250cm9sIGZpZWxkIGluIHRoZSByb290IHBvcnQKPiA+ ID4gPiBNU0kgY2FwYWJpbGl0eSwgaXQgaXMgYSBzZXBhcmF0ZSByZWdpc3RlciB0aGF0IGNvbnRy b2xzIHRoZSByb290Cj4gPiA+ID4gY29tcGxleCBNU0kgZm9yd2FyZGluZywgaXMgdGhhdCBjb3Jy ZWN0ID8KPiA+ID4gPgo+ID4gPiA+IFRoZSByb290IHBvcnQgTVNJIGNhcGFiaWxpdHkgZG9lcyBu b3QgY29udHJvbCB0aGUgcm9vdCBjb21wbGV4Cj4gPiA+ID4gZm9yd2FyZGluZyBvZiBNU0lzIFRM UHMuCj4gPiA+ID4KPiA+ID4gPiBTbyB0aGUgYml0cyB5b3UgYXJlIHNhdmluZyBhbmQgcmVzdG9y aW5nIElJVUMgc2hvdWxkIGJlIE1NSU8gc3BhY2UKPiA+ID4gPiBpbiB0aGUgcm9vdCBjb21wbGV4 LCBkcmVzc2VkIGFzIGFuIE1TSSBjYXBhYmlsaXR5LCB0aGF0IGhhcyBub3RoaW5nCj4gPiA+ID4g dG8gZG8gd2l0aCB0aGUgcm9vdCBwb3J0IE1TSSBjYXBhYmlsaXR5Lgo+ID4gPiA+Cj4gPiA+ID4g SXMgdGhhdCBjb3JyZWN0ID8KPiA+ID4KPiA+ID4gSXQncyBub3QgYSBzZXBhcmF0ZSByZWdpc3Rl ci4KPiA+ID4KPiA+ID4gVGhlIGJpdCBJIG1hbmlwdWxhdGVkIGlzIHRoZSBNU0kgRW5hYmxlIGJp dCBvZiB0aGUgTWVzc2FnZSBDb250cm9sCj4gPiA+IFJlZ2lzdGVyIGZvciBNU0kgKE9mZnNldCAw MmgpIGNvbnRhaW5lZCBpbiB0aGUgTVNJLWNhcGFiaWxpdHkgb2YgUm9vdAo+ID4gPiBDb21wbGV4 Lgo+ID4gPgo+ID4gPiBJbiBhZGRpdGlvbiwgb24gaS5NWDYsIHRoZSBNU0kgRW5hYmxlIGJpdCBj b250cm9scyBkZWxpdmVyeSBvZiBNU0kKPiA+ID4gaW50ZXJydXB0cyBmcm9tIGNvbXBvbmVudHMg YmVsb3cgdGhlIFJvb3QgUG9ydC4KPiA+ID4KPiA+ID4gU28sIHNldCBNU0kgRW5hYmxlIGluIGlt eDZxLXBjaWUgdG8gbGV0IHRoZSBNU0kgZnJvbSBkb3duc3RyZWFtCj4gPiA+IGNvbXBvbmVudHMg d29ya3MuCj4gPiAKPiA+IE15IGNvbmZ1c2lvbiBpcyBhYm91dCB0aGlzICJNU0kgQ2FwYWJpbGl0 eSIgZm91bmQgYnkKPiA+ICJkd19wY2llX2ZpbmRfY2FwYWJpbGl0eShwY2ksIFBDSV9DQVBfSURf TVNJKSIgaW4geW91ciBwYXRjaC4KPiA+IAo+ID4gVGhlIGkuTVg2IG1hbnVhbCBtaWdodCByZWZl ciB0byB0aGF0IGFzIGFuICJNU0kgQ2FwYWJpbGl0eSIgYnV0IGFzIGZhciBhcyBJCj4gPiBrbm93 LCB0aGUgUENJZSBiYXNlIHNwZWMgZG9lc24ndCBkb2N1bWVudCBhIFJvb3QgQ29tcGxleCBNU0kg Q2FwYWJpbGl0eS4KPiA+IAo+ID4gSSBkb24ndCB0aGluayBpdCdzIHRoZSBzYW1lIGFzIHRoZSBv bmUgZG9jdW1lbnRlZCBpbiBQQ0llIHI2LjAsIHNlYyA3LjcuMi4gIEkKPiA+IHRoaW5rIGl0J3Mg ZGlmZmVyZW50IGJlY2F1c2U6Cj4gPiAKPiA+ICAgKDEpIEkgKnRoaW5rKiAicGNpIiBoZXJlIHJl ZmVycyB0byB0aGUgUkMsIG5vdCB0byBhIFJvb3QgUG9ydC4KPiA+IAo+ID4gICAoMikgVGhlIHNl bWFudGljcyBhcmUgZGlmZmVyZW50LiAgVGhlIE1TSS1YIEVuYWJsZSBiaXQgaW4gNy43LjIgb25s eQo+ID4gICBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIEZ1bmN0aW9uIGl0c2VsZiBpcyBwZXJtaXR0 ZWQgdG8gdXNlIE1TSS1YLgo+ID4gICBJdCBoYXMgbm90aGluZyB0byBkbyB3aXRoIGRldmljZXMg KmJlbG93KiBhIFJvb3QgUG9ydCBjYW4gdXNlIE1TSS1YLgo+ID4gICBJdCBhbHNvIGhhcyBub3Ro aW5nIHRvIGRvIHdpdGggd2hldGhlciBhIFJvb3QgUG9ydCBjYW4gZm9yd2FyZCBNU0kKPiA+ICAg dHJhbnNhY3Rpb25zIGZyb20gdGhvc2UgZG93bnN0cmVhbSBkZXZpY2VzLgo+ID4gCj4gPiBUaGlz IHBhcnQgb2YgbXkgY29uZnVzaW9uIGNvdWxkIGJlIGVhc2lseSByZXNvbHZlZCB2aWEgYSBjb21t ZW50Lgo+ID4gCj4gPiBJIGRvIGhhdmUgYSBmb2xsb3ctb24gcXVlc3Rpb24sIHRob3VnaDogdGhl IHBhdGNoIHNlZW1zIHRvIGVuYWJsZQo+ID4gTVNJLXJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB1c2lu ZyBhIHJlZ2lzdGVyIGluIHRoZSBEZXNpZ25XYXJlIElQLCBub3Qgc29tZXRoaW5nCj4gPiBpbiB0 aGUgaS5NWDYtc3BlY2lmaWMgSVAuICBJZiB0aGF0J3MgdHJ1ZSwgd2h5IGRvbid0IG90aGVyIERl c2lnbldhcmUtYmFzZWQKPiA+IGRyaXZlcnMgbmVlZCBzb21ldGhpbmcgc2ltaWxhcj8KPiBIaSBC am9ybjoKPiBUaGFua3MgYSBsb3QgZm9yIHlvdSByZXBseS4KPiBUaGlzIGJlaGF2aW9yIGlzIHNw ZWNpZmljIGZvciBpLk1YIFBDSWUuCgpXaGljaCBiZWhhdmlvdXIgPyBJdCBjYW4ndCBiZSB0aGUg cm9vdCBwb3J0IE1TSSBjYXBhYmlsaXR5LCB0aGF0IHdvdWxkCmJlIGEgSFcgYnVnIChpZSBkaXNh Ymxpbmcgcm9vdCBwb3J0IE1TSXMgd291bGQgaW1wbHkgZGlzYWJsaW5nIE1TSXMgZm9yIGFsbApk b3duc3RyZWFtIGNvbXBvbmVudHMpLgoKPiBpLk1YIFBDSWUgZGVzaWduZXIgdXNlIHRoaXMgTVNJ X0VOIGJpdCB0byBjb250cm9sIHRoZSBNU0kgdHJpZ2dlciB3aGVuCj4gIGludGVncmF0ZSBEZXNp Z24gV2FyZSBQQ0llIElQLgoKRmFpciBlbm91Z2ggYnV0IHRoYXQgY2FuJ3QgYmUgdGhlIE1TSSBF bmFibGUgYml0IGluIHRoZSBSb290IFBvcnQgTVNJCmNhcGFiaWxpdHkgIk1lc3NhZ2UgQ29udHJv bCIgZmllbGQgSSBhbSBhZnJhaWQuCgpJdCBpcyB3aGF0IEJqb3JuIG1lbnRpb25lZCBxdWl0ZSBj bGVhcmx5LCBhIHJvb3QgY29tcGxleCBjb25maWd1cmF0aW9uCnJlZ2lzdGVyIGRyZXNzZWQgYXMg YW4gTVNJIGNhcGFiaWxpdHksIHRoZSByb290IGNvbXBsZXggaXMgbm90IGEgUENJCmRldmljZTsg ZWl0aGVyIHRoYXQgb3IgdGhhdCdzIGFuIEhXIGJ1Zy4KCkxvcmVuem8KCj4gU28sIHRoZSBvdGhl ciBEZXNpZ25XYXJlLWJhc2UgUENJZSBkcml2ZXIgZG9lc24ndCBuZWVkIHRoaXMgYmVhaHZpb3Iu Cj4gCj4gQmVzdCBSZWdhcmRzCj4gUmljaGFyZCBaaHUKPiA+IAo+ID4gPiA+ID4gSXQgc2VlbXMg dGhhdCBzb21lIGRldmljZSBtaWdodCBzaHV0ZG93biBtc2kgd2hlbiBkbyB0aGUgc3VzcGVuZAo+ ID4gPiA+IG9wZXJhdGlvbnMuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IFdvdWxkIHlvdSBtaW5k IGludmVzdGlnYXRpbmcgaXQgcGxlYXNlID8KPiA+ID4gPiA+IFN1cmUsIEkgZGlkIGZ1cnRoZXIg aW52ZXN0aWdhdGlvbiBvbiBpLk1YNlFQIHBsYXRmb3JtLgo+ID4gPiA+ID4gVGhlIE1TSV9FTiBi aXQgb2YgUkMgTVNJIGNhcGFiaWxpdHkgd291bGQgYmUgY2xlYXJlZCB0byB6ZXJvLCB3aGVuCj4g PiA+ID4gPiAgUENJRV9SRVNFVChCSVQyOSBvZiBJT01VWENfR1BSMSkgaXMgdG9nZ2xlZCAoYXNz ZXJ0aW9uIDFiJzEsCj4gPiA+ID4gPiB0aGVuIGRlLWFzc2VydGlvbiAxYicwKS4KPiA+ID4gPiA+ Cj4gPiA+ID4gPiBWZXJpZmljYXRpb24gc3RlcHM6Cj4gPiA+ID4gPiBNU0lfRU4gb2YgUkMgaXMg c2V0IHRvIDFiJzEgd2hlbiBzeXN0ZW0gaXMgYm9vdCB1cC4KPiA+ID4gPiA+ICAuL21lbXRvb2wg MWZmYzA1MCAxCj4gPiA+ID4gPiAweDAxRkZDMDUwOiAgMDEwMTcwMDUKPiA+ID4gPiA+Cj4gPiA+ ID4gPiBUb2dnbGUgUENJZSByZXNldCBvZiBpLk1YNlFQLgo+ID4gPiA+ID4gcm9vdEBpbXg2cXBk bHNvbG94On4jIC4vbWVtdG9vbCAyMGUwMDA0PTY4NjkxMDA1IFdyaXRpbmcgMzItYml0Cj4gPiA+ ID4gPiB2YWx1ZQo+ID4gPiA+ID4gMHg2ODY5MTAwNSB0byBhZGRyZXNzIDB4MDIwRTAwMDQgcm9v dEBpbXg2cXBkbHNvbG94On4jIC4vbWVtdG9vbAo+ID4gPiA+ID4gMjBlMDAwND00ODY5MTAwNSBX cml0aW5nIDMyLWJpdCB2YWx1ZSAweDQ4NjkxMDA1IHRvIGFkZHJlc3MKPiA+ID4gPiAweDAyMEUw MDA0Cj4gPiA+ID4gPgo+ID4gPiA+ID4gVGhlIE1TSV9FTiBiaXQgb2YgUkMgaGFkIGJlZW4gY2xl YXJlZCB0byAxYicwLgo+ID4gPiA+ID4gLi9tZW10b29sIDFmZmMwNTAgMQo+ID4gPiA+ID4gMHgw MUZGQzA1MDogIDAxODA3MDA1Cj4gPiA+ID4gPgo+ID4gPiA+ID4gVGhpcyBpcyB3aHkgSSB1c2Vk IHRvIHJlcGx5IHRvIEJqb3JuIHRoZSBNU0lfRU4gb2YgUkMgaXMgY2xlYXJlZAo+ID4gPiA+ID4g d2hlbiBSRVNFVHMgYXJlIHRvZ2dsZWQgZHVyaW5nIHRoZSBpbXg2X3BjaWVfaG9zdF9pbml0KCkg aW4KPiA+ID4gPiA+ICBpbXg2X3BjaWVfcmVzdW1lX25vaXJxKCkgY2FsbGJhY2suCj4gPiA+ID4g Pgo+ID4gPiA+ID4gQmVzdCBSZWdhcmRzCj4gPiA+ID4gPiBSaWNoYXJkIFpodQo+ID4gPiA+ID4g Pgo+ID4gPiA+ID4gPiBMb3JlbnpvCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gU2lnbmVkLW9m Zi1ieTogUmljaGFyZCBaaHUgPGhvbmd4aW5nLnpodUBueHAuY29tPgo+ID4gPiA+ID4gPiA+IC0t LQo+ID4gPiA+ID4gPiA+IENoYW5nZXMgdjEtLT52MjoKPiA+ID4gPiA+ID4gPiBOZXcgY3JlYXRl IG9uZSBzYXZlL3Jlc3RvcmUgZnVuY3Rpb24sIHVzZWQgc2F2ZSB0aGUgc2V0dGluZyBpbgo+ID4g PiA+ID4gPiA+IHN1c3BlbmQgYW5kIHJlc3RvcmUgdGhlIGNvbmZpZ3VyYXRpb24gaW4gcmVzdW1l Lgo+ID4gPiA+ID4gPiA+IHYxCj4gPiA+ID4gPiA+ID4gaHR0cHM6Ly9ldXIwMS5zYWZlbGlua3Mu cHJvdGVjdGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0dHBzJTNBJTIKPiA+ID4gPiA+ID4gPiBGJTJG Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPgo+ID4gcGF0YyUyRiZkYXRhPTA1JTdDMDElN0Nob25neGlu Zy56aHUlNDBueHAuY29tJTdDMjQ5NzFkOGRlOWI1NGIKPiA+ID4gPiAwYjEwCj4gPiA+ID4gPiA+ ID4KPiA+ID4gPgo+ID4gYWQwOGRiMjE4Mjc3NGQlN0M2ODZlYTFkM2JjMmI0YzZmYTkyY2Q5OWM1 YzMwMTYzNSU3QzAlN0MwJTdDNgo+ID4gPiA+IDM4MTQwCj4gPiA+ID4gPiA+ID4KPiA+ID4gPgo+ ID4gNjE2NDU2MDUyMDc4JTdDVW5rbm93biU3Q1RXRnBiR1pzYjNkOGV5SldJam9pTUM0d0xqQXdN REFpTENKCj4gPiA+ID4gUUlqb2lWCj4gPiA+ID4gPiA+ID4KPiA+ID4gPgo+ID4gMmx1TXpJaUxD SkJUaUk2SWsxaGFXd2lMQ0pYVkNJNk1uMCUzRCU3QzMwMDAlN0MlN0MlN0Mmc2RhdGE9dkUKPiA+ ID4gPiB0UnhMCj4gPiA+ID4gPiA+ID4gQlZpNWxZbXB3VE5aZmFmTW1zMzI2M0xaWG9kbmVMQ2hq RWFPTSUzRCZyZXNlcnZlZD0wCj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4KPiA+ID4gPgo+ID4g aHdvcmsua2VybmVsLm9yZyUyRnByb2plY3QlMkZsaW51eC1wY2klMkZwYXRjaCUyRjE2NjcyODk1 OTUtMTI0NDAtMS0KPiA+ID4gPiA+ID4gZwo+ID4gPiA+ID4gPiBpCj4gPiA+ID4gPiA+ID4KPiA+ ID4gPiA+ID4KPiA+ID4gPgo+ID4gdC1zZW5kLWVtYWlsLWhvbmd4aW5nLnpodSU0MG54cC5jb20l MkYmZGF0YT0wNSU3QzAxJTdDaG9uZ3hpbmcuemh1Cj4gPiA+ID4gPiA+ICU0MG4KPiA+ID4gPiA+ ID4gPgo+ID4gPiA+ID4gPgo+ID4gPiA+Cj4gPiB4cC5jb20lN0MzYWViMWQxMjhmODU0ZGFkMWE1 NjA4ZGFlYTc3NzA2ZCU3QzY4NmVhMWQzYmMyYjRjNmZhOQo+ID4gPiA+IDIKPiA+ID4gPiA+ID4g Y2Q5OWM1Ywo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+Cj4gPiA+ID4KPiA+IDMwMTYzNSU3QzAl N0MwJTdDNjM4MDgwMDk1OTU0ODgxMzc0JTdDVW5rbm93biU3Q1RXRnBiR1pzYjMKPiA+ID4gPiA+ ID4gZDhleUpXSWpvaU1DCj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4KPiA+ID4gPgo+ID4gNHdM akF3TURBaUxDSlFJam9pVjJsdU16SWlMQ0pCVGlJNklrMWhhV3dpTENKWFZDSTZNbjAlM0QlN0Mz MDAwCj4gPiA+ID4gJQo+ID4gPiA+ID4gPiA3QyU3QyUKPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4g Pgo+ID4gPiA+Cj4gPiA3QyZzZGF0YT1WOHlWdnZwVEtHb1IxVXlRUDVIRDJJZGxTakpkem5CZUQx MmJkSTY3ZEVJJTNEJnJlc2VydmVkCj4gPiA+ID4gPQo+ID4gPiA+ID4gPiAwCj4gPiA+ID4gPiA+ ID4KPiA+ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4gPiAgZHJpdmVycy9wY2kvY29udHJvbGxl ci9kd2MvcGNpLWlteDYuYyB8IDIzCj4gPiA+ID4gPiA+ID4gKysrKysrKysrKysrKysrKysrKysr KysKPiA+ID4gPiA+ID4gPiAgMSBmaWxlIGNoYW5nZWQsIDIzIGluc2VydGlvbnMoKykKPiA+ID4g PiA+ID4gPgo+ID4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVy L2R3Yy9wY2ktaW14Ni5jCj4gPiA+ID4gPiA+ID4gYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3 Yy9wY2ktaW14Ni5jCj4gPiA+ID4gPiA+ID4gaW5kZXggMWRkZTVjNTc5ZWRjLi5hYTMwOTY4OTBj M2IgMTAwNjQ0Cj4gPiA+ID4gPiA+ID4gLS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2Mv cGNpLWlteDYuYwo+ID4gPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdj L3BjaS1pbXg2LmMKPiA+ID4gPiA+ID4gPiBAQCAtNzYsNiArNzYsNyBAQCBzdHJ1Y3QgaW14Nl9w Y2llIHsKPiA+ID4gPiA+ID4gPiAgCXN0cnVjdCBjbGsJCSpwY2llOwo+ID4gPiA+ID4gPiA+ICAJ c3RydWN0IGNsawkJKnBjaWVfYXV4Owo+ID4gPiA+ID4gPiA+ICAJc3RydWN0IHJlZ21hcAkJKmlv bXV4Y19ncHI7Cj4gPiA+ID4gPiA+ID4gKwl1MTYJCQltc2lfY3RybDsKPiA+ID4gPiA+ID4gPiAg CXUzMgkJCWNvbnRyb2xsZXJfaWQ7Cj4gPiA+ID4gPiA+ID4gIAlzdHJ1Y3QgcmVzZXRfY29udHJv bAkqcGNpZXBoeV9yZXNldDsKPiA+ID4gPiA+ID4gPiAgCXN0cnVjdCByZXNldF9jb250cm9sCSph cHBzX3Jlc2V0Owo+ID4gPiA+ID4gPiA+IEBAIC0xMDQyLDYgKzEwNDMsMjYgQEAgc3RhdGljIHZv aWQgaW14Nl9wY2llX3BtX3R1cm5vZmYoc3RydWN0Cj4gPiA+ID4gPiA+IGlteDZfcGNpZSAqaW14 Nl9wY2llKQo+ID4gPiA+ID4gPiA+ICAJdXNsZWVwX3JhbmdlKDEwMDAsIDEwMDAwKTsKPiA+ID4g PiA+ID4gPiAgfQo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gK3N0YXRpYyB2b2lkIGlteDZf cGNpZV9tc2lfc2F2ZV9yZXN0b3JlKHN0cnVjdCBpbXg2X3BjaWUKPiA+ID4gPiA+ID4gPiArKmlt eDZfcGNpZSwgYm9vbCBzYXZlKSB7Cj4gPiA+ID4gPiA+ID4gKwl1OCBvZmZzZXQ7Cj4gPiA+ID4g PiA+ID4gKwl1MTYgdmFsOwo+ID4gPiA+ID4gPiA+ICsJc3RydWN0IGR3X3BjaWUgKnBjaSA9IGlt eDZfcGNpZS0+cGNpOwo+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiArCWlmIChwY2lfbXNp X2VuYWJsZWQoKSkgewo+ID4gPiA+ID4gPiA+ICsJCW9mZnNldCA9IGR3X3BjaWVfZmluZF9jYXBh YmlsaXR5KHBjaSwgUENJX0NBUF9JRF9NU0kpOwo+ID4gPiA+ID4gPiA+ICsJCWlmIChzYXZlKSB7 Cj4gPiA+ID4gPiA+ID4gKwkJCXZhbCA9IGR3X3BjaWVfcmVhZHdfZGJpKHBjaSwgb2Zmc2V0ICsK PiA+IFBDSV9NU0lfRkxBR1MpOwo+ID4gPiA+ID4gPiA+ICsJCQlpbXg2X3BjaWUtPm1zaV9jdHJs ID0gdmFsOwo+ID4gPiA+ID4gPiA+ICsJCX0gZWxzZSB7Cj4gPiA+ID4gPiA+ID4gKwkJCWR3X3Bj aWVfZGJpX3JvX3dyX2VuKHBjaSk7Cj4gPiA+ID4gPiA+ID4gKwkJCXZhbCA9IGlteDZfcGNpZS0+ bXNpX2N0cmw7Cj4gPiA+ID4gPiA+ID4gKwkJCWR3X3BjaWVfd3JpdGV3X2RiaShwY2ksIG9mZnNl dCArIFBDSV9NU0lfRkxBR1MsCj4gPiB2YWwpOwo+ID4gPiA+ID4gPiA+ICsJCQlkd19wY2llX2Ri aV9yb193cl9kaXMocGNpKTsKPiA+ID4gPiA+ID4gPiArCQl9Cj4gPiA+ID4gPiA+ID4gKwl9Cj4g PiA+ID4gPiA+ID4gK30KPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gIHN0YXRpYyBpbnQg aW14Nl9wY2llX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KSAgewo+ID4gPiA+ID4g PiA+ICAJc3RydWN0IGlteDZfcGNpZSAqaW14Nl9wY2llID0gZGV2X2dldF9kcnZkYXRhKGRldik7 IEBACj4gPiA+ID4gPiA+ID4gLTEwNTAsNgo+ID4gPiA+ID4gPiA+ICsxMDcxLDcgQEAgc3RhdGlj IGludCBpbXg2X3BjaWVfc3VzcGVuZF9ub2lycShzdHJ1Y3QgZGV2aWNlCj4gPiA+ID4gPiA+ID4g KypkZXYpCj4gPiA+ID4gPiA+ID4gIAlpZiAoIShpbXg2X3BjaWUtPmRydmRhdGEtPmZsYWdzICYK PiA+ID4gPiA+ID4gSU1YNl9QQ0lFX0ZMQUdfU1VQUE9SVFNfU1VTUEVORCkpCj4gPiA+ID4gPiA+ ID4gIAkJcmV0dXJuIDA7Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiArCWlteDZfcGNpZV9t c2lfc2F2ZV9yZXN0b3JlKGlteDZfcGNpZSwgdHJ1ZSk7Cj4gPiA+ID4gPiA+ID4gIAlpbXg2X3Bj aWVfcG1fdHVybm9mZihpbXg2X3BjaWUpOwo+ID4gPiA+ID4gPiA+ICAJaW14Nl9wY2llX3N0b3Bf bGluayhpbXg2X3BjaWUtPnBjaSk7Cj4gPiA+ID4gPiA+ID4gIAlpbXg2X3BjaWVfaG9zdF9leGl0 KHBwKTsKPiA+ID4gPiA+ID4gPiBAQCAtMTA2OSw2ICsxMDkxLDcgQEAgc3RhdGljIGludCBpbXg2 X3BjaWVfcmVzdW1lX25vaXJxKHN0cnVjdAo+ID4gPiA+ID4gPiA+IGRldmljZQo+ID4gPiA+ID4g PiAqZGV2KQo+ID4gPiA+ID4gPiA+ICAJcmV0ID0gaW14Nl9wY2llX2hvc3RfaW5pdChwcCk7Cj4g PiA+ID4gPiA+ID4gIAlpZiAocmV0KQo+ID4gPiA+ID4gPiA+ICAJCXJldHVybiByZXQ7Cj4gPiA+ ID4gPiA+ID4gKwlpbXg2X3BjaWVfbXNpX3NhdmVfcmVzdG9yZShpbXg2X3BjaWUsIGZhbHNlKTsK PiA+ID4gPiA+ID4gPiAgCWR3X3BjaWVfc2V0dXBfcmMocHApOwo+ID4gPiA+ID4gPiA+Cj4gPiA+ ID4gPiA+ID4gIAlpZiAoaW14Nl9wY2llLT5saW5rX2lzX3VwKQo+ID4gPiA+ID4gPiA+IC0tCj4g PiA+ID4gPiA+ID4gMi4yNS4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVs QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==